diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2024-07-24 19:47:52 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2024-07-24 19:47:52 +0200 |
| commit | eec83198b5dfdfe9a0db71b410383697eb58930c (patch) | |
| tree | e2a1d890431c4c23f754236f33a909b521932afb | |
| parent | 7546a80eccb64b6ac38b3f22ae83fa1c6af1f1c5 (diff) | |
| download | turns-eec83198b5dfdfe9a0db71b410383697eb58930c.tar.xz turns-eec83198b5dfdfe9a0db71b410383697eb58930c.zip | |
app: add progress bar for turn order
| -rw-r--r-- | core/include/turns/core/turn_order.hpp | 3 | ||||
| -rw-r--r-- | core/src/turn_order.cpp | 13 | ||||
| -rw-r--r-- | ui/include/turns/ui/widgets/turn_order_view.hpp | 9 | ||||
| -rw-r--r-- | ui/res/ui.cmb | 41 | ||||
| -rw-r--r-- | ui/src/widgets/turn_order_view.cpp | 14 |
5 files changed, 57 insertions, 23 deletions
diff --git a/core/include/turns/core/turn_order.hpp b/core/include/turns/core/turn_order.hpp index 59cab84..59556bb 100644 --- a/core/include/turns/core/turn_order.hpp +++ b/core/include/turns/core/turn_order.hpp @@ -30,6 +30,7 @@ namespace turns::core using has_next_type = bool; using has_previous_type = bool; using is_running_type = bool; + using progress_type = double; using round_number_type = unsigned int; auto static constexpr invalid_participant_index = std::numeric_limits<active_participant_type>::max(); @@ -45,6 +46,7 @@ namespace turns::core auto has_next() const -> Glib::PropertyProxy_ReadOnly<has_next_type>; auto has_previous() const -> Glib::PropertyProxy_ReadOnly<has_previous_type>; auto is_running() const -> Glib::PropertyProxy_ReadOnly<is_running_type>; + auto progress() const -> Glib::PropertyProxy_ReadOnly<progress_type>; auto round_number() const -> Glib::PropertyProxy_ReadOnly<round_number_type>; /** Element Modifications */ @@ -77,6 +79,7 @@ namespace turns::core Glib::Property<has_previous_type> m_has_previous{*this, "has-previous", false}; Glib::Property<is_empty_type> m_is_empty{*this, "is-empty", true}; Glib::Property<is_running_type> m_is_running{*this, "is-running", false}; + Glib::Property<progress_type> m_progress{*this, "progress", 0.0}; Glib::Property<round_number_type> m_round_number{*this, "round-number", invalid_round_number}; }; diff --git a/core/src/turn_order.cpp b/core/src/turn_order.cpp index 234f394..835baab 100644 --- a/core/src/turn_order.cpp +++ b/core/src/turn_order.cpp @@ -56,6 +56,11 @@ namespace turns::core return m_is_running.get_proxy(); } + auto turn_order::progress() const -> Glib::PropertyProxy_ReadOnly<progress_type> + { + return m_progress.get_proxy(); + } + auto turn_order::round_number() const -> Glib::PropertyProxy_ReadOnly<round_number_type> { return m_round_number.get_proxy(); @@ -85,6 +90,7 @@ namespace turns::core m_has_previous = false; m_active.reset(); m_round_number = invalid_round_number; + m_progress = 0; auto old_size = get_n_items(); m_data.clear(); @@ -100,6 +106,8 @@ namespace turns::core m_data[old_active]->is_active() = false; m_data[*m_active]->is_active() = true; + m_progress = (static_cast<float>(*m_active) + 1) / get_n_items(); + if (m_active == 0) { m_round_number = m_round_number + 1; @@ -120,6 +128,8 @@ namespace turns::core m_data[old_active]->is_active() = false; m_data[*m_active]->is_active() = true; + m_progress = (static_cast<float>(*m_active) + 1) / get_n_items(); + if (m_active == 0 && m_round_number > 0) { m_round_number = m_round_number - 1; @@ -156,11 +166,14 @@ namespace turns::core m_round_number = 0; } m_is_running = true; + + m_progress = (static_cast<float>(*m_active) + 1) / get_n_items(); } auto turn_order::stop() -> void { m_is_running = false; + m_progress = 0; } /** ListModel implementation */ diff --git a/ui/include/turns/ui/widgets/turn_order_view.hpp b/ui/include/turns/ui/widgets/turn_order_view.hpp index b174ce7..c14d239 100644 --- a/ui/include/turns/ui/widgets/turn_order_view.hpp +++ b/ui/include/turns/ui/widgets/turn_order_view.hpp @@ -1,25 +1,27 @@ #ifndef TURNS_APP_WIDGETS_TURN_ORDER_VIEW_HPP #define TURNS_APP_WIDGETS_TURN_ORDER_VIEW_HPP -#include "turns/ui/widgets/template_widget.hpp" #include "turns/core/fwd.hpp" +#include "turns/ui/widgets/template_widget.hpp" #include <glibmm/object.h> #include <glibmm/refptr.h> +#include <gtkmm/box.h> #include <gtkmm/listbox.h> -#include <gtkmm/scrolledwindow.h> +#include <gtkmm/progressbar.h> #include <gtkmm/widget.h> #include <array> namespace turns::app::widgets { - struct turn_order_view : template_widget<turn_order_view, Gtk::ScrolledWindow> + struct turn_order_view : template_widget<turn_order_view, Gtk::Box> { using model_type = core::turn_order; auto constexpr inline static children = std::array{ + "progress", "view", }; @@ -29,6 +31,7 @@ namespace turns::app::widgets auto handle_create_row(Glib::RefPtr<Glib::Object> const item) -> Gtk::Widget *; Glib::RefPtr<model_type> m_model; + Gtk::ProgressBar * m_progress; Gtk::ListBox * m_view; }; } // namespace turns::app::widgets diff --git a/ui/res/ui.cmb b/ui/res/ui.cmb index f3cc8e8..acf1687 100644 --- a/ui/res/ui.cmb +++ b/ui/res/ui.cmb @@ -12,7 +12,9 @@ (1,"libadwaita","1.5",None), (2,"gtk","4.14",None), (2,"libadwaita","1.5",None), - (3,"gtk","4.14",None) + (3,"gtk","4.14",None), + (4,"gtk","4.14",None), + (4,"libadwaita","1.5",None) </ui_library> <object> (1,1,"AdwApplicationWindow","tracker",None,None,None,None,-1,None,None), @@ -54,9 +56,11 @@ (3,8,"GtkLabel","subtitle",4,None,None,None,-1,None,None), (3,9,"GtkButton","delete",5,None,None,None,-1,None,None), (3,10,"GtkButton","edit",5,None,None,None,-1,None,None), - (4,1,"GtkScrolledWindow","gtkmm__CustomObject_turn_order_view",None,None,None,None,-1,None,None), - (4,2,"AdwClamp",None,1,None,None,None,-1,None,None), - (4,3,"GtkListBox","view",2,None,None,None,-1,None,None) + (4,1,"GtkBox","gtkmm__CustomObject_turn_order_view",None,None,None,None,-1,None,None), + (4,2,"GtkProgressBar","progress",1,None,None,None,None,None,None), + (4,3,"GtkScrolledWindow",None,1,None,None,None,1,None,None), + (4,4,"AdwClamp",None,3,None,None,None,-1,None,None), + (4,5,"GtkListBox","view",4,None,None,None,-1,None,None) </object> <object_property> (1,1,"AdwApplicationWindow","content",None,None,None,None,None,2,None,None,None,None), @@ -142,13 +146,15 @@ (3,9,"GtkWidget","tooltip-text","Delete participant",1,None,None,None,None,None,None,None,None), (3,10,"GtkButton","icon-name","document-edit-symbolic",None,None,None,None,None,None,None,None,None), (3,10,"GtkWidget","tooltip-text","Edit participant",1,None,None,None,None,None,None,None,None), - (4,1,"GtkScrolledWindow","child",None,None,None,None,None,2,None,None,None,None), - (4,2,"AdwClamp","child",None,None,None,None,None,3,None,None,None,None), - (4,2,"GtkWidget","margin-bottom","18",None,None,None,None,None,None,None,None,None), - (4,2,"GtkWidget","margin-end","12",None,None,None,None,None,None,None,None,None), - (4,2,"GtkWidget","margin-start","12",None,None,None,None,None,None,None,None,None), - (4,2,"GtkWidget","margin-top","12",None,None,None,None,None,None,None,None,None), - (4,3,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None) + (4,1,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None), + (4,3,"GtkScrolledWindow","child",None,None,None,None,None,4,None,None,None,None), + (4,3,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None), + (4,4,"AdwClamp","child",None,None,None,None,None,5,None,None,None,None), + (4,4,"GtkWidget","margin-bottom","18",None,None,None,None,None,None,None,None,None), + (4,4,"GtkWidget","margin-end","12",None,None,None,None,None,None,None,None,None), + (4,4,"GtkWidget","margin-start","12",None,None,None,None,None,None,None,None,None), + (4,4,"GtkWidget","margin-top","12",None,None,None,None,None,None,None,None,None), + (4,5,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None) </object_property> <object_data> (1,1,"GtkWidget",2,2,None,1,None,None,None,None), @@ -180,8 +186,6 @@ (3,5,"GtkWidget",2,2,None,1,None,None,None,None), (3,3,"GtkWidget",1,1,None,None,None,None,None,None), (3,3,"GtkWidget",2,2,None,1,None,None,None,None), - (4,3,"GtkWidget",1,1,None,None,None,None,None,None), - (4,3,"GtkWidget",2,2,None,1,None,None,None,None), (1,22,"GtkWidget",1,1,None,None,None,None,None,None), (1,22,"GtkWidget",2,2,None,1,None,None,None,None), (1,22,"GtkWidget",2,3,None,1,None,None,None,None), @@ -192,7 +196,11 @@ (1,24,"GtkWidget",2,2,None,1,None,None,None,None), (1,24,"GtkWidget",2,3,None,1,None,None,None,None), (1,21,"GtkWidget",1,1,None,None,None,None,None,None), - (1,21,"GtkWidget",2,2,None,1,None,None,None,None) + (1,21,"GtkWidget",2,2,None,1,None,None,None,None), + (4,2,"GtkWidget",1,1,None,None,None,None,None,None), + (4,2,"GtkWidget",2,2,None,1,None,None,None,None), + (4,5,"GtkWidget",1,1,None,None,None,None,None,None), + (4,5,"GtkWidget",2,2,None,1,None,None,None,None) </object_data> <object_data_arg> (1,1,"GtkWidget",2,2,"name","background"), @@ -211,13 +219,14 @@ (3,10,"GtkWidget",2,3,"name","suggested-action"), (3,5,"GtkWidget",2,2,"name","suffixes"), (3,3,"GtkWidget",2,2,"name","prefixes"), - (4,3,"GtkWidget",2,2,"name","boxed-list"), (1,22,"GtkWidget",2,2,"name","pill"), (1,22,"GtkWidget",2,3,"name","suggested-action"), (1,23,"GtkWidget",2,2,"name","pill"), (1,23,"GtkWidget",2,3,"name","destructive-action"), (1,24,"GtkWidget",2,2,"name","pill"), (1,24,"GtkWidget",2,3,"name","suggested-action"), - (1,21,"GtkWidget",2,2,"name","toolbar") + (1,21,"GtkWidget",2,2,"name","toolbar"), + (4,2,"GtkWidget",2,2,"name","osd"), + (4,5,"GtkWidget",2,2,"name","boxed-list") </object_data_arg> </cambalache-project> diff --git a/ui/src/widgets/turn_order_view.cpp b/ui/src/widgets/turn_order_view.cpp index 9456cbe..78d7c43 100644 --- a/ui/src/widgets/turn_order_view.cpp +++ b/ui/src/widgets/turn_order_view.cpp @@ -1,8 +1,8 @@ #include "turns/ui/widgets/turn_order_view.hpp" -#include "turns/ui/widgets/participant_row.hpp" #include "turns/core/participant.hpp" #include "turns/core/turn_order.hpp" +#include "turns/ui/widgets/participant_row.hpp" #include <sigc++/functors/mem_fun.h> @@ -20,14 +20,20 @@ namespace turns::app::widgets turn_order_view::turn_order_view(Glib::RefPtr<model_type> model) : Glib::ObjectBase(TYPE_NAME) - , template_widget<turn_order_view, Gtk::ScrolledWindow>{TEMPLATE} + , template_widget{TEMPLATE} , m_model{model} + , m_progress{get_widget<Gtk::ProgressBar>("progress")} , m_view{get_widget<Gtk::ListBox>("view")} { - if (model) + if (!model) { - m_view->bind_model(m_model, sigc::mem_fun(*this, &turn_order_view::handle_create_row)); + return; } + + set_orientation(Gtk::Orientation::VERTICAL); + + m_view->bind_model(m_model, sigc::mem_fun(*this, &turn_order_view::handle_create_row)); + Glib::Binding::bind_property(m_model->progress(), m_progress->property_fraction(), Glib::Binding::Flags::SYNC_CREATE); } auto turn_order_view::handle_create_row(Glib::RefPtr<Glib::Object> const item) -> Gtk::Widget * |
