summaryrefslogtreecommitdiff
path: root/gui/include/participant_editor.hpp
blob: 61f82693b900c2853811c547ab46f2def3aa18c9 (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
/*
 * SPDX-FileCopyrightText: 2025 Felix Morgner <felix.morgner@gmail.com>
 * SPDX-License-Identifier: LGPL-2.1-only
 */

#ifndef TURNS_GUI_PARTICIPANT_EDITOR_HPP
#define TURNS_GUI_PARTICIPANT_EDITOR_HPP

#include "template_widget.hpp"

#include <turnsmm/participant.hpp>

#include <sigc++/signal.h>

#include <adwaitamm/comborow.hpp>
#include <adwaitamm/dialog.hpp>
#include <adwaitamm/entryrow.hpp>
#include <adwaitamm/spinrow.hpp>
#include <glibmm/property.h>
#include <glibmm/propertyproxy.h>
#include <glibmm/refptr.h>
#include <glibmm/ustring.h>
#include <gtkmm/builder.h>
#include <gtkmm/button.h>
#include <gtkmm/listitem.h>
#include <gtkmm/signallistitemfactory.h>
#include <gtkmm/stringlist.h>
#include <gtkmm/widget.h>

#include <array>

namespace Turns::gui
{

  struct ParticipantEditor : template_widget<ParticipantEditor, Adwaita::Dialog>
  {
    using SignalFinishedType = sigc::signal<void(Glib::ustring, float, Participant::Disposition)>;

    auto constexpr inline static children = std::array{
        "disposition",
        "finish",
        "name",
        "priority",
    };

    explicit ParticipantEditor(Glib::RefPtr<Participant> participant);

    [[nodiscard]] auto get_disposition() const -> Participant::Disposition;
    [[nodiscard]] auto get_name() const -> Glib::ustring;
    [[nodiscard]] auto get_participant() const -> Glib::RefPtr<Participant>;
    [[nodiscard]] auto get_priority() const -> double;

    auto set_disposition(Participant::Disposition value) -> void;
    auto set_name(Glib::ustring const & value) -> void;
    auto set_participant(Glib::RefPtr<Participant> const & value) -> void;
    auto set_priority(double value) -> void;

    [[nodiscard]] auto property_participant() -> Glib::PropertyProxy<Glib::RefPtr<Participant>>;
    [[nodiscard]] auto property_participant() const -> Glib::PropertyProxy_ReadOnly<Glib::RefPtr<Participant>>;

    auto signal_finished() -> SignalFinishedType;

  private:
    auto handle_finish_clicked() -> void;
    auto handle_item_bind(Glib::RefPtr<Gtk::ListItem> item) -> void;
    auto handle_item_setup(Glib::RefPtr<Gtk::ListItem> item) -> void;
    auto handle_participant_changed() -> void;

    Adwaita::ComboRow * m_disposition;
    Gtk::Button * m_finish;
    Adwaita::EntryRow * m_name;
    Adwaita::SpinRow * m_priority;

    Glib::RefPtr<Gtk::SignalListItemFactory> m_disposition_factory;
    Glib::RefPtr<Gtk::StringList> m_disposition_model;

    Glib::Property<Glib::RefPtr<Participant>> m_participant;

    SignalFinishedType m_signal_finished{};
  };

}  // namespace Turns::gui

#endif