diff options
Diffstat (limited to 'ui/src/windows/participant_editor.cpp')
| -rw-r--r-- | ui/src/windows/participant_editor.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/ui/src/windows/participant_editor.cpp b/ui/src/windows/participant_editor.cpp new file mode 100644 index 0000000..ec31c68 --- /dev/null +++ b/ui/src/windows/participant_editor.cpp @@ -0,0 +1,91 @@ +#include "turns/ui/windows/participant_editor.hpp" + +#include "turns/core/disposition.hpp" +#include "turns/core/participant.hpp" +#include "turns/lang/messages.hpp" + +#include <glibmm/i18n.h> + +#include <gtkmm/editable.h> +#include <gtkmm/label.h> +#include <gtkmm/listboxrow.h> +#include <gtkmm/stringobject.h> + +#include <ranges> + +namespace turns::app::windows +{ + + participant_editor::participant_editor(BaseObjectType * base, Glib::RefPtr<Gtk::Builder> const builder, Glib::RefPtr<core::participant> obj) + : Gtk::Widget{base} + , m_adw{ADW_DIALOG(gobj())} + , m_disposition{ADW_COMBO_ROW(builder->get_widget<Gtk::ListBoxRow>("disposition")->gobj())} + , m_finish{builder->get_widget<Gtk::Button>("finish")} + , m_name{ADW_ENTRY_ROW(builder->get_widget<Gtk::ListBoxRow>("name")->gobj())} + , m_priority{ADW_SPIN_ROW(builder->get_widget<Gtk::ListBoxRow>("priority")->gobj())} + , m_disposition_factory{Gtk::SignalListItemFactory::create()} + , m_disposition_model{Gtk::StringList::create()} + , m_participant{obj} + + { + adw_dialog_set_title(m_adw, _(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(m_disposition_factory->gobj())); + adw_combo_row_set_model(m_disposition, G_LIST_MODEL(m_disposition_model->gobj())); + + if (m_participant) + { + gtk_editable_set_text(GTK_EDITABLE(m_name), m_participant->name().get_value().c_str()); + adw_spin_row_set_value(m_priority, m_participant->priority()); + adw_combo_row_set_selected(m_disposition, static_cast<unsigned>(m_participant->disposition().get_value())); + } + } + + auto participant_editor::present(Gtk::Widget * parent) -> void + { + adw_dialog_present(m_adw, parent->gobj()); + } + + 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->name() = name; + m_participant->priority() = priority; + m_participant->disposition() = disposition; + } + + m_signal_finished.emit(name, priority, disposition); + adw_dialog_close(m_adw); + } + + 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::app::windows
\ No newline at end of file |
