diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2024-07-14 21:30:56 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2024-07-14 21:33:04 +0200 |
| commit | 05da3897f944f5775d25de2136ea985d4b0078eb (patch) | |
| tree | fd817901681a745f75234979168f391310141797 | |
| parent | d462e0e4d25d595175160c407e02a84155441983 (diff) | |
| download | turns-05da3897f944f5775d25de2136ea985d4b0078eb.tar.xz turns-05da3897f944f5775d25de2136ea985d4b0078eb.zip | |
app/ui: show status view when turn order is empty
| -rw-r--r-- | .vscode/settings.json | 3 | ||||
| -rw-r--r-- | app/include/turns/app/windows/main.hpp | 9 | ||||
| -rw-r--r-- | app/src/windows/main.cpp | 23 | ||||
| -rw-r--r-- | domain/include/turns/domain/turn_order.hpp | 1 | ||||
| -rw-r--r-- | domain/src/turn_order.cpp | 8 | ||||
| -rw-r--r-- | res/windows/main.ui | 50 | ||||
| -rw-r--r-- | res/windows/windows.cmb | 51 |
7 files changed, 102 insertions, 43 deletions
diff --git a/.vscode/settings.json b/.vscode/settings.json index ebe447b..16e5da3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,8 @@ "arknet", "gobj", "refptr", - "sigc" + "sigc", + "ustring" ], "editor.tabSize": 2, diff --git a/app/include/turns/app/windows/main.hpp b/app/include/turns/app/windows/main.hpp index d98e1a8..00844ac 100644 --- a/app/include/turns/app/windows/main.hpp +++ b/app/include/turns/app/windows/main.hpp @@ -13,6 +13,8 @@ #include <gtkmm/listbox.h> #include <gtkmm/menubutton.h> #include <gtkmm/widget.h> +#include <gtkmm/stack.h> +#include <gtkmm/scrolledwindow.h> namespace turns::app::windows { @@ -23,13 +25,14 @@ namespace turns::app::windows private: auto handle_create_list_row(Glib::RefPtr<Glib::Object> const item) -> Gtk::Widget *; - auto handle_create_participant() -> void; + auto handle_add_participant() -> void; - Gtk::Button * m_add_participant; AdwApplicationWindow * m_adw; - Gtk::MenuButton * m_open_main_menu; + Gtk::Widget * m_empty; Gtk::ListBox * m_participant_list; + Gtk::Stack * m_stack; AdwWindowTitle * m_title; + Gtk::ScrolledWindow * m_turn_order; Glib::RefPtr<domain::turn_order> m_participants; }; diff --git a/app/src/windows/main.cpp b/app/src/windows/main.cpp index f378fc7..314b8cc 100644 --- a/app/src/windows/main.cpp +++ b/app/src/windows/main.cpp @@ -16,19 +16,30 @@ namespace turns::app::windows main::main(BaseObjectType * base, Glib::RefPtr<Gtk::Builder> const builder) : Gtk::ApplicationWindow{base} - , m_add_participant{builder->get_widget<Gtk::Button>("add_participant")} , m_adw{ADW_APPLICATION_WINDOW(gobj())} - , m_open_main_menu{builder->get_widget<Gtk::MenuButton>("open_main_menu")} + , m_empty(builder->get_widget<Gtk::Widget>("empty")) , m_participant_list{builder->get_widget<Gtk::ListBox>("participant_list")} + , m_stack{builder->get_widget<Gtk::Stack>("stack")} , m_title(ADW_WINDOW_TITLE(builder->get_widget<Gtk::Widget>("title")->gobj())) + , m_turn_order{builder->get_widget<Gtk::ScrolledWindow>("turn_order")} , m_participants{domain::turn_order::create()} { - m_add_participant->set_tooltip_text(_(lang::add_participant)); - m_open_main_menu->set_tooltip_text(_(lang::main_menu)); adw_window_title_set_subtitle(m_title, _(lang::no_active_turn_order)); - m_add_participant->signal_clicked().connect(sigc::mem_fun(*this, &main::handle_create_participant)); + m_stack->set_visible_child(*m_empty); + m_participants->property_n_items().signal_changed().connect([this] { + if (m_participants->get_n_items()) + { + m_stack->set_visible_child(*m_turn_order); + } + else + { + m_stack->set_visible_child(*m_empty); + } + }); m_participant_list->bind_model(m_participants, sigc::mem_fun(*this, &main::handle_create_list_row)); + + add_action("add_participant", sigc::mem_fun(*this, &main::handle_add_participant)); } auto main::handle_create_list_row(Glib::RefPtr<Glib::Object> const item) -> Gtk::Widget * @@ -39,7 +50,7 @@ namespace turns::app::windows return widget; } - auto main::handle_create_participant() -> void + auto main::handle_add_participant() -> void { auto builder = Gtk::Builder::create_from_resource("/ch/arknet/Turns/windows/create_participant.ui"); auto dialog = Gtk::Builder::get_widget_derived<windows::create_participant>(builder, "create_participant_dialog"); diff --git a/domain/include/turns/domain/turn_order.hpp b/domain/include/turns/domain/turn_order.hpp index a82e331..de7ac8a 100644 --- a/domain/include/turns/domain/turn_order.hpp +++ b/domain/include/turns/domain/turn_order.hpp @@ -18,6 +18,7 @@ namespace turns::domain auto static create() -> Glib::RefPtr<turn_order>; auto append(Glib::ustring const & name, float order_value) -> void; + auto remove(Glib::RefPtr<participant> item) -> void; auto sort() -> void; }; diff --git a/domain/src/turn_order.cpp b/domain/src/turn_order.cpp index 81b7fe7..677e993 100644 --- a/domain/src/turn_order.cpp +++ b/domain/src/turn_order.cpp @@ -31,6 +31,14 @@ namespace turns::domain insert_sorted(participant, comparator); } + auto turn_order::remove(Glib::RefPtr<participant> item) -> void + { + if (auto [was_found, index] = find(item); was_found) + { + super::remove(index); + } + } + auto turn_order::sort() -> void { super::sort(comparator); diff --git a/res/windows/main.ui b/res/windows/main.ui index 56ffc40..4732022 100644 --- a/res/windows/main.ui +++ b/res/windows/main.ui @@ -9,26 +9,45 @@ <property name="content"> <object class="AdwToolbarView"> <property name="content"> - <object class="GtkScrolledWindow"> - <property name="child"> - <object class="AdwClamp"> + <object class="GtkStack" id="stack"> + <property name="transition-type">crossfade</property> + <child> + <object class="AdwStatusPage" id="empty"> <property name="child"> - <object class="GtkListBox" id="participant_list"> - <property name="selection-mode">none</property> + <object class="GtkButton"> + <property name="action-name">win.add_participant</property> + <property name="halign">center</property> + <property name="label" translatable="yes">Add participant</property> <style> - <class name="boxed-list"/> + <class name="pill"/> + <class name="suggested-action"/> </style> </object> </property> - <property name="margin-bottom">18</property> - <property name="margin-end">12</property> - <property name="margin-start">12</property> - <property name="margin-top">18</property> - <property name="valign">start</property> - <style/> + <property name="icon-name">contact-new-symbolic</property> </object> - </property> - <property name="vexpand">True</property> + </child> + <child> + <object class="GtkScrolledWindow" id="turn_order"> + <property name="child"> + <object class="AdwClamp"> + <property name="child"> + <object class="GtkListBox" id="participant_list"> + <property name="selection-mode">none</property> + <style> + <class name="boxed-list"/> + </style> + </object> + </property> + <property name="margin-bottom">18</property> + <property name="margin-end">12</property> + <property name="margin-start">12</property> + <property name="margin-top">18</property> + <property name="valign">start</property> + </object> + </property> + </object> + </child> </object> </property> <child type="top"> @@ -42,11 +61,14 @@ <object class="GtkMenuButton" id="open_main_menu"> <property name="icon-name">open-menu</property> <property name="menu-model">main_menu</property> + <property name="tooltip-text" translatable="yes">Main Menu</property> </object> </child> <child type="start"> <object class="GtkButton" id="add_participant"> + <property name="action-name">win.add_participant</property> <property name="icon-name">contact-new</property> + <property name="tooltip-text" translatable="yes">Add participant</property> </object> </child> <style/> diff --git a/res/windows/windows.cmb b/res/windows/windows.cmb index c1ee945..d3ac071 100644 --- a/res/windows/windows.cmb +++ b/res/windows/windows.cmb @@ -15,14 +15,17 @@ (1,1,"AdwApplicationWindow","main",None,None,None,None,-1,None,None), (1,2,"AdwToolbarView",None,1,None,None,None,-1,None,None), (1,3,"AdwHeaderBar","header",2,None,"top",None,-1,None,None), - (1,4,"GtkScrolledWindow",None,2,None,None,None,-1,None,None), (1,6,"AdwWindowTitle","title",3,None,None,None,-1,None,None), (1,7,"GtkMenuButton","open_main_menu",3,None,"end",None,None,None,None), (1,8,"GtkButton","add_participant",3,None,"start",None,None,None,None), (1,9,"(menu)","main_menu",None,None,None,None,-1,None,None), (1,10,"(item)",None,9,None,None,None,-1,None,None), - (1,11,"AdwClamp",None,4,None,None,None,-1,None,None), - (1,12,"GtkListBox","participant_list",11,None,None,None,-1,None,None), + (1,11,"GtkStack","stack",2,None,None,None,-1,None,None), + (1,13,"GtkScrolledWindow","turn_order",11,None,None,None,1,None,None), + (1,14,"AdwClamp",None,13,None,None,None,None,None,None), + (1,15,"GtkListBox","participant_list",14,None,None,None,None,None,None), + (1,16,"AdwStatusPage","empty",11,None,None,None,-1,None,None), + (1,17,"GtkButton",None,16,None,None,None,-1,None,None), (2,1,"AdwDialog","create_participant_dialog",None,None,None,None,-1,None,None), (2,2,"AdwToolbarView",None,1,None,None,None,-1,None,None), (2,3,"AdwHeaderBar",None,2,None,"top",None,-1,None,None), @@ -41,23 +44,31 @@ (1,1,"GtkWidget","width-request","360",None,None,None,None,None,None,None,None,None), (1,1,"GtkWindow","default-height","720",None,None,None,None,None,None,None,None,None), (1,1,"GtkWindow","default-width","360",None,None,None,None,None,None,None,None,None), - (1,2,"AdwToolbarView","content",None,None,None,None,None,4,None,None,None,None), + (1,2,"AdwToolbarView","content",None,None,None,None,None,11,None,None,None,None), (1,3,"AdwHeaderBar","title-widget",None,None,None,None,None,6,None,None,None,None), - (1,4,"GtkScrolledWindow","child",None,None,None,None,None,11,None,None,None,None), - (1,4,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None), (1,6,"AdwWindowTitle","title","Turns",1,None,None,None,None,None,None,None,None), (1,7,"GtkMenuButton","icon-name","open-menu",None,None,None,None,None,None,None,None,None), (1,7,"GtkMenuButton","menu-model","9",None,None,None,None,None,None,None,None,None), + (1,7,"GtkWidget","tooltip-text","Main Menu",1,None,None,None,None,None,None,None,None), + (1,8,"GtkActionable","action-name","win.add_participant",None,None,None,None,None,None,None,None,None), (1,8,"GtkButton","icon-name","contact-new",None,None,None,None,None,None,None,None,None), + (1,8,"GtkWidget","tooltip-text","Add participant",1,None,None,None,None,None,None,None,None), (1,10,"(item)","action","app.quit",None,None,None,None,None,None,None,None,None), (1,10,"(item)","label","_Quit",1,None,None,None,None,None,None,None,None), - (1,11,"AdwClamp","child",None,None,None,None,None,12,None,None,None,None), - (1,11,"GtkWidget","margin-bottom","18",None,None,None,None,None,None,None,None,None), - (1,11,"GtkWidget","margin-end","12",None,None,None,None,None,None,None,None,None), - (1,11,"GtkWidget","margin-start","12",None,None,None,None,None,None,None,None,None), - (1,11,"GtkWidget","margin-top","18",None,None,None,None,None,None,None,None,None), - (1,11,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None), - (1,12,"GtkListBox","selection-mode","none",None,None,None,None,None,None,None,None,None), + (1,11,"GtkStack","transition-type","crossfade",None,None,None,None,None,None,None,None,None), + (1,13,"GtkScrolledWindow","child",None,None,None,None,None,14,None,None,None,None), + (1,14,"AdwClamp","child",None,None,None,None,None,15,None,None,None,None), + (1,14,"GtkWidget","margin-bottom","18",None,None,None,None,None,None,None,None,None), + (1,14,"GtkWidget","margin-end","12",None,None,None,None,None,None,None,None,None), + (1,14,"GtkWidget","margin-start","12",None,None,None,None,None,None,None,None,None), + (1,14,"GtkWidget","margin-top","18",None,None,None,None,None,None,None,None,None), + (1,14,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None), + (1,15,"GtkListBox","selection-mode","none",None,None,None,None,None,None,None,None,None), + (1,16,"AdwStatusPage","child",None,None,None,None,None,17,None,None,None,None), + (1,16,"AdwStatusPage","icon-name","contact-new-symbolic",None,None,None,None,None,None,None,None,None), + (1,17,"GtkActionable","action-name","win.add_participant",None,None,None,None,None,None,None,None,None), + (1,17,"GtkButton","label","Add participant",1,None,None,None,None,None,None,None,None), + (1,17,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None), (2,1,"AdwDialog","child",None,None,None,None,None,2,None,None,None,None), (2,1,"AdwDialog","default-widget",None,None,None,None,None,None,None,None,None,None), (2,1,"AdwDialog","title","Add participant",1,None,None,None,None,None,None,None,None), @@ -86,7 +97,6 @@ </object_property> <object_data> (1,1,"GtkWidget",2,2,None,1,None,None,None,None), - (1,4,"GtkWidget",2,2,None,1,None,None,None,None), (1,3,"GtkWidget",1,1,None,None,None,None,None,None), (1,2,"GtkWidget",1,1,None,None,None,None,None,None), (2,6,"GtkWidget",1,1,None,None,None,None,None,None), @@ -94,16 +104,19 @@ (2,9,"GtkWidget",1,1,None,None,None,None,None,None), (2,9,"GtkWidget",2,2,None,1,None,None,None,None), (2,9,"GtkWidget",2,3,None,1,None,None,None,None), - (1,11,"GtkWidget",1,1,None,None,None,None,None,None), - (1,12,"GtkWidget",1,1,None,None,None,None,None,None), - (1,12,"GtkWidget",2,2,None,1,None,None,None,None) + (1,15,"GtkWidget",1,1,None,None,None,None,None,None), + (1,15,"GtkWidget",2,2,None,1,None,None,None,None), + (1,17,"GtkWidget",1,1,None,None,None,None,None,None), + (1,17,"GtkWidget",2,2,None,1,None,None,None,None), + (1,17,"GtkWidget",2,3,None,1,None,None,None,None) </object_data> <object_data_arg> (1,1,"GtkWidget",2,2,"name","background"), - (1,4,"GtkWidget",2,2,"name","boxed-list"), (2,6,"GtkWidget",2,2,"name","boxed-list"), (2,9,"GtkWidget",2,2,"name","pill"), (2,9,"GtkWidget",2,3,"name","suggested-action"), - (1,12,"GtkWidget",2,2,"name","boxed-list") + (1,15,"GtkWidget",2,2,"name","boxed-list"), + (1,17,"GtkWidget",2,2,"name","pill"), + (1,17,"GtkWidget",2,3,"name","suggested-action") </object_data_arg> </cambalache-project> |
