summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2025-04-29 16:49:24 +0200
committerFelix Morgner <felix.morgner@gmail.com>2025-04-29 16:49:24 +0200
commit9233c81e68555be6e451e371eccc2914269dd08a (patch)
tree42ec324f0d7da75931142fc8a8b1bc9a4f7c0194
parent3ff5bd46952144926d9bd9beedf50023a51913ee (diff)
downloadturns-9233c81e68555be6e451e371eccc2914269dd08a.tar.xz
turns-9233c81e68555be6e451e371eccc2914269dd08a.zip
ui: convert object to property for ParticipantEditor
-rw-r--r--ui/include/turns/ui/participant_editor.hpp14
-rw-r--r--ui/src/participant_editor.cpp51
-rw-r--r--ui/src/tracker/actions.cpp7
3 files changed, 51 insertions, 21 deletions
diff --git a/ui/include/turns/ui/participant_editor.hpp b/ui/include/turns/ui/participant_editor.hpp
index e2017fd..0b1e0f1 100644
--- a/ui/include/turns/ui/participant_editor.hpp
+++ b/ui/include/turns/ui/participant_editor.hpp
@@ -3,10 +3,13 @@
#include "turns/core/disposition.hpp"
#include "turns/core/fwd.hpp"
+#include "turns/core/participant.hpp"
#include "turns/ui/template_widget.hpp"
#include <sigc++/signal.h>
+#include <glibmm/property.h>
+#include <glibmm/propertyproxy.h>
#include <glibmm/refptr.h>
#include <glibmm/ustring.h>
@@ -38,16 +41,21 @@ namespace turns::ui
"priority",
};
- ParticipantEditor(Glib::RefPtr<core::participant> participant);
+ explicit ParticipantEditor(Glib::RefPtr<core::participant> participant);
[[nodiscard]] auto get_disposition() const -> core::disposition;
[[nodiscard]] auto get_name() const -> Glib::ustring;
+ [[nodiscard]] auto get_participant() const -> Glib::RefPtr<core::participant>;
[[nodiscard]] auto get_priority() const -> double;
auto set_disposition(core::disposition value) -> void;
auto set_name(Glib::ustring const & value) -> void;
+ auto set_participant(Glib::RefPtr<core::participant> const & value) -> void;
auto set_priority(double value) -> void;
+ [[nodiscard]] auto property_participant() -> Glib::PropertyProxy<Glib::RefPtr<core::participant>>;
+ [[nodiscard]] auto property_participant() const -> Glib::PropertyProxy_ReadOnly<Glib::RefPtr<core::participant>>;
+
auto signal_finished() -> SignalFinishedType;
private:
@@ -63,11 +71,11 @@ namespace turns::ui
Glib::RefPtr<Gtk::SignalListItemFactory> m_disposition_factory;
Glib::RefPtr<Gtk::StringList> m_disposition_model;
- Glib::RefPtr<core::participant> m_participant;
+ Glib::Property<Glib::RefPtr<core::participant>> m_participant;
SignalFinishedType m_signal_finished{};
};
-} // namespace turns::ui::widgets
+} // namespace turns::ui
#endif \ No newline at end of file
diff --git a/ui/src/participant_editor.cpp b/ui/src/participant_editor.cpp
index 8598139..0016c02 100644
--- a/ui/src/participant_editor.cpp
+++ b/ui/src/participant_editor.cpp
@@ -9,6 +9,7 @@
#include <glibmm/i18n.h>
#include <glibmm/objectbase.h>
+#include <glibmm/propertyproxy.h>
#include <glibmm/refptr.h>
#include <glibmm/ustring.h>
@@ -48,10 +49,8 @@ namespace turns::ui
, m_priority{get_widget<Adwaita::SpinRow>("priority")}
, m_disposition_factory{Gtk::SignalListItemFactory::create()}
, m_disposition_model{Gtk::StringList::create()}
- , m_participant{participant}
+ , m_participant{*this, "participant", nullptr}
{
- set_title(_(m_participant ? lang::edit_participant : lang::add_participant));
-
m_finish->signal_clicked().connect(sigc::mem_fun(*this, &ParticipantEditor::handle_finish_clicked));
for (auto n : std::views::iota(std::uint8_t{}, static_cast<std::uint8_t>(core::disposition::END)))
@@ -65,12 +64,18 @@ namespace turns::ui
m_disposition->set_factory(m_disposition_factory);
m_disposition->set_model(m_disposition_model);
- if (m_participant)
- {
- set_name(m_participant->property_name().get_value());
- set_priority(m_participant->property_priority());
- set_disposition(m_participant->property_disposition().get_value());
- }
+ property_participant().signal_changed().connect([this] {
+ auto participant = property_participant().get_value();
+ set_title(_(participant ? lang::edit_participant : lang::add_participant));
+ if (participant)
+ {
+ set_name(participant->property_name().get_value());
+ set_priority(participant->property_priority());
+ set_disposition(participant->property_disposition().get_value());
+ }
+ });
+
+ set_participant(participant);
}
auto ParticipantEditor::get_disposition() const -> core::disposition
@@ -83,6 +88,11 @@ namespace turns::ui
return m_name->get_text();
}
+ auto ParticipantEditor::get_participant() const -> Glib::RefPtr<core::participant>
+ {
+ return m_participant.get_value();
+ }
+
auto ParticipantEditor::get_priority() const -> double
{
return m_priority->get_value();
@@ -98,11 +108,26 @@ namespace turns::ui
m_name->set_text(value);
}
+ auto ParticipantEditor::set_participant(Glib::RefPtr<core::participant> const & value) -> void
+ {
+ m_participant.set_value(value);
+ }
+
auto ParticipantEditor::set_priority(double value) -> void
{
m_priority->set_value(value);
}
+ auto ParticipantEditor::property_participant() -> Glib::PropertyProxy<Glib::RefPtr<core::participant>>
+ {
+ return m_participant.get_proxy();
+ }
+
+ auto ParticipantEditor::property_participant() const -> Glib::PropertyProxy_ReadOnly<Glib::RefPtr<core::participant>>
+ {
+ return m_participant.get_proxy();
+ }
+
auto ParticipantEditor::signal_finished() -> SignalFinishedType
{
return m_signal_finished;
@@ -113,14 +138,6 @@ namespace turns::ui
auto name = m_name->get_text();
auto priority = m_priority->get_value();
auto disposition = static_cast<core::disposition>(m_disposition->get_selected());
-
- 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();
}
diff --git a/ui/src/tracker/actions.cpp b/ui/src/tracker/actions.cpp
index 51642f8..5f1d2e0 100644
--- a/ui/src/tracker/actions.cpp
+++ b/ui/src/tracker/actions.cpp
@@ -49,8 +49,8 @@ namespace turns::ui
auto tracker::add_participant() -> void
{
auto dialog = Gtk::make_managed<ParticipantEditor>(nullptr);
- dialog->present(this);
dialog->signal_finished().connect([this](auto n, auto p, auto d) { m_turn_order->add(n, p, d); });
+ dialog->present(this);
}
auto tracker::delete_participant(Glib::VariantBase param) -> void
@@ -64,6 +64,11 @@ namespace turns::ui
auto index = Glib::VariantBase::cast_dynamic<Glib::Variant<int>>(param);
auto participant = m_turn_order->get_typed_object<core::participant>(index.get());
auto dialog = Gtk::make_managed<ParticipantEditor>(participant);
+ dialog->signal_finished().connect([participant](auto n, auto p, auto d) {
+ participant->property_name() = n;
+ participant->property_priority() = p;
+ participant->property_disposition() = d;
+ });
dialog->present(this);
}