aboutsummaryrefslogtreecommitdiff
path: root/ui/src/windows/participant_editor.cpp
blob: ddae0b298f4cf24e5574345648c9f80264c5d2cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "turns/ui/windows/participant_editor.hpp"

#include "turns/adw/dialog.hpp"
#include "turns/core/disposition.hpp"
#include "turns/core/participant.hpp"
#include "turns/lang/messages.hpp"

#include <sigc++/functors/mem_fun.h>

#include <glibmm/i18n.h>
#include <glibmm/refptr.h>
#include <glibmm/wrap.h>

#include <gtkmm/builder.h>
#include <gtkmm/button.h>
#include <gtkmm/editable.h>
#include <gtkmm/label.h>
#include <gtkmm/listboxrow.h>
#include <gtkmm/listitem.h>
#include <gtkmm/object.h>
#include <gtkmm/signallistitemfactory.h>
#include <gtkmm/stringlist.h>
#include <gtkmm/stringobject.h>
#include <gtkmm/widget.h>

#include <adwaita.h>
#include <gio/gio.h>
#include <gtk/gtk.h>

#include <cstdint>
#include <memory>
#include <ranges>

namespace turns::ui::windows
{

  participant_editor::participant_editor(BaseObjectType * base, Glib::RefPtr<Gtk::Builder> const builder, Glib::RefPtr<core::participant> obj)
      : adw::Dialog{base}
      , m_disposition{ADW_COMBO_ROW(Glib::unwrap(builder->get_widget<Gtk::ListBoxRow>("disposition")))}
      , m_finish{builder->get_widget<Gtk::Button>("finish")}
      , m_name{ADW_ENTRY_ROW(Glib::unwrap(builder->get_widget<Gtk::ListBoxRow>("name")))}
      , m_priority{ADW_SPIN_ROW(Glib::unwrap(builder->get_widget<Gtk::ListBoxRow>("priority")))}
      , m_disposition_factory{Gtk::SignalListItemFactory::create()}
      , m_disposition_model{Gtk::StringList::create()}
      , m_participant{obj}

  {
    set_title(_(obj ? lang::edit_participant : lang::add_participant));
    m_finish->signal_clicked().connect(sigc::mem_fun(*this, &participant_editor::handle_finish_clicked));

    for (auto n : std::views::iota(std::uint8_t{}, static_cast<std::uint8_t>(core::disposition::END)))
    {
      m_disposition_model->append(presentation_name_for(core::disposition{n}));
    }

    m_disposition_factory->signal_bind().connect(sigc::mem_fun(*this, &participant_editor::handle_item_bind));
    m_disposition_factory->signal_setup().connect(sigc::mem_fun(*this, &participant_editor::handle_item_setup));

    adw_combo_row_set_factory(m_disposition, GTK_LIST_ITEM_FACTORY(Glib::unwrap(m_disposition_factory)));
    adw_combo_row_set_model(m_disposition, G_LIST_MODEL(Glib::unwrap(m_disposition_model)));

    if (m_participant)
    {
      gtk_editable_set_text(GTK_EDITABLE(m_name), m_participant->property_name().get_value().c_str());
      adw_spin_row_set_value(m_priority, m_participant->property_priority());
      adw_combo_row_set_selected(m_disposition, static_cast<unsigned>(m_participant->property_disposition().get_value()));
    }
  }

  auto participant_editor::signal_finished() -> signal_finished_type
  {
    return m_signal_finished;
  }

  auto participant_editor::handle_finish_clicked() -> void
  {
    auto name = gtk_editable_get_text(GTK_EDITABLE(m_name));
    auto priority = adw_spin_row_get_value(m_priority);
    auto disposition = static_cast<core::disposition>(adw_combo_row_get_selected(m_disposition));

    if (m_participant)
    {
      m_participant->property_name() = name;
      m_participant->property_priority() = priority;
      m_participant->property_disposition() = disposition;
    }

    m_signal_finished.emit(name, priority, disposition);
    close();
  }

  auto participant_editor::handle_item_bind(Glib::RefPtr<Gtk::ListItem> item) -> void
  {
    auto value = std::dynamic_pointer_cast<Gtk::StringObject>(item->get_item())->get_string();
    dynamic_cast<Gtk::Label *>(item->get_child())->set_label(value);
  }

  auto participant_editor::handle_item_setup(Glib::RefPtr<Gtk::ListItem> item) -> void
  {
    item->set_child(*Gtk::make_managed<Gtk::Label>());
  }

}  // namespace turns::ui::windows