summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2024-07-14 21:30:56 +0200
committerFelix Morgner <felix.morgner@gmail.com>2024-07-14 21:33:04 +0200
commit05da3897f944f5775d25de2136ea985d4b0078eb (patch)
treefd817901681a745f75234979168f391310141797
parentd462e0e4d25d595175160c407e02a84155441983 (diff)
downloadturns-05da3897f944f5775d25de2136ea985d4b0078eb.tar.xz
turns-05da3897f944f5775d25de2136ea985d4b0078eb.zip
app/ui: show status view when turn order is empty
-rw-r--r--.vscode/settings.json3
-rw-r--r--app/include/turns/app/windows/main.hpp9
-rw-r--r--app/src/windows/main.cpp23
-rw-r--r--domain/include/turns/domain/turn_order.hpp1
-rw-r--r--domain/src/turn_order.cpp8
-rw-r--r--res/windows/main.ui50
-rw-r--r--res/windows/windows.cmb51
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>