diff --git a/data/gtk/window.blp b/data/gtk/window.blp index 8f7a6b1a3a782295e27e53f715100acb282fb44f..e37c2ad161f0ce298a0c456b009bd8ed5830ab60 100644 --- a/data/gtk/window.blp +++ b/data/gtk/window.blp @@ -23,6 +23,13 @@ template RugbyAppWindow : Adw.ApplicationWindow { tooltip-text: "Score"; } + ToggleButton filter_toggle { + icon-name: "funnel"; + tooltip-text: "Show Try Filter"; + + toggled => filter_toggle_toggled_cb(); + } + [end] MenuButton { direction: none; @@ -35,32 +42,58 @@ template RugbyAppWindow : Adw.ApplicationWindow { Adw.Clamp { maximum-size: 600; - Stack stack { - StackPage { - child: Adw.StatusPage empty_page { - title: "No possibilities"; - }; + Box { + orientation: vertical; + + Revealer { + halign: center; + margin-top: 6; + reveal-child: bind filter_toggle.active; + transition-type: swing_down; + + SpinButton tryspin { + adjustment: Adjustment { + step-increment: 1; + lower: 0; + upper: 40; + }; + focusable: true; + tooltip-text: "Tries"; + + value-changed => try_spin_value_changed_cb(); + } } - StackPage { - child: ScrolledWindow list_page { - vexpand: true; + Stack stack { + StackPage { + child: Adw.StatusPage empty_page { + title: "No possibilities"; + }; + } - ListView listview { - styles ["rich-list"] + StackPage { + child: ScrolledWindow list_page { + vexpand: true; - model: NoSelection { - model: .RugbyListStore { - score: bind scorespin.value; + ListView listview { + styles ["rich-list"] + + factory: BuilderListItemFactory { + resource: "/uk/me/bcowan/Rugby/gtk/score-item.ui"; + }; + model: NoSelection { + model: FilterListModel { + filter: CustomFilter try_filter {}; + model: .RugbyListStore list_store { + score: bind scorespin.value; + }; - items-changed => list_store_items_changed_cb(); + items-changed => list_store_items_changed_cb(); + }; }; - }; - factory: BuilderListItemFactory { - resource: "/uk/me/bcowan/Rugby/gtk/score-item.ui"; - }; - } - }; + } + }; + } } } } diff --git a/data/icons/scalable/actions/funnel-symbolic.svg b/data/icons/scalable/actions/funnel-symbolic.svg new file mode 100644 index 0000000000000000000000000000000000000000..6e010018214f1104db508286559bee278ed23bd4 --- /dev/null +++ b/data/icons/scalable/actions/funnel-symbolic.svg @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 0 1.007812 h 15 l -6 7 v 6 l -3 2 v -8 z m 0 0" fill="#222222"/></svg> diff --git a/data/rugby.gresource.xml b/data/rugby.gresource.xml index bc7b194fd1e2e7d2ae535d5a568e46777612cee2..9be1522b85aaac8e3996dbeae8984c4553ee98ef 100644 --- a/data/rugby.gresource.xml +++ b/data/rugby.gresource.xml @@ -10,5 +10,6 @@ <file preprocess="xml-stripblanks" compressed="true">gtk/prefs.ui</file> <file preprocess="xml-stripblanks" compressed="true">gtk/score-item.ui</file> <file preprocess="xml-stripblanks" compressed="true">gtk/window.ui</file> + <file preprocess="xml-stripblanks" compressed="true">icons/scalable/actions/funnel-symbolic.svg</file> </gresource> </gresources> diff --git a/src/rugby-app-window.c b/src/rugby-app-window.c index eb422ffaf0b87fe46263063069d4b7066eb771de..4c5a69246112b8ffff0cbe85ed0eda1f1dc37db1 100644 --- a/src/rugby-app-window.c +++ b/src/rugby-app-window.c @@ -18,9 +18,12 @@ struct _RugbyAppWindow AdwApplicationWindow parent; GtkWidget *scorespin; + GtkWidget *tryspin; GtkWidget *stack; GtkWidget *empty_page; GtkWidget *list_page; + + GtkCustomFilter *try_filter; }; G_DEFINE_TYPE (RugbyAppWindow, rugby_app_window, ADW_TYPE_APPLICATION_WINDOW) @@ -108,6 +111,14 @@ activate_score_changed (G_GNUC_UNUSED GSimpleAction *action, g_assert_not_reached (); } +static void +try_spin_value_changed_cb (G_GNUC_UNUSED GtkSpinButton *btn, + gpointer user_data) +{ + RugbyAppWindow *self = RUGBY_APP_WINDOW (user_data); + gtk_filter_changed (GTK_FILTER (self->try_filter), GTK_FILTER_CHANGE_DIFFERENT); +} + static void rugby_app_window_dispose (GObject *object) { @@ -116,6 +127,43 @@ rugby_app_window_dispose (GObject *object) G_OBJECT_CLASS (rugby_app_window_parent_class)->dispose (object); } +static gboolean +try_filter_func (gpointer item, + gpointer user_data) +{ + RugbyPossibility *possibility = RUGBY_POSSIBILITY (item); + RugbyAppWindow *self = RUGBY_APP_WINDOW (user_data); + + int tries, utries; + + g_object_get (possibility, + "tries", &tries, + "utries", &utries, + NULL); + + if ((tries + utries) == gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (self->tryspin))) + return TRUE; + + return FALSE; +} + +static void +filter_toggle_toggled_cb (GtkToggleButton *btn, + gpointer user_data) +{ + RugbyAppWindow *self = RUGBY_APP_WINDOW (user_data); + + if (gtk_toggle_button_get_active (btn)) + { + gtk_custom_filter_set_filter_func (self->try_filter, try_filter_func, self, NULL); + gtk_filter_changed (GTK_FILTER (self->try_filter), GTK_FILTER_CHANGE_DIFFERENT); + } + else + { + gtk_custom_filter_set_filter_func (self->try_filter, NULL, NULL, NULL); + } +} + static void rugby_app_window_init (RugbyAppWindow *self) { @@ -146,10 +194,15 @@ rugby_app_window_class_init (RugbyAppWindowClass *klass) "/uk/me/bcowan/Rugby/gtk/window.ui"); gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, scorespin); + gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, tryspin); gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, stack); gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, empty_page); gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, list_page); + gtk_widget_class_bind_template_child (widget_class, RugbyAppWindow, try_filter); + + gtk_widget_class_bind_template_callback (widget_class, filter_toggle_toggled_cb); + gtk_widget_class_bind_template_callback (widget_class, try_spin_value_changed_cb); gtk_widget_class_bind_template_callback (widget_class, item_tooltip_cb); gtk_widget_class_bind_template_callback (widget_class, list_store_items_changed_cb); } diff --git a/src/rugby-list-store.c b/src/rugby-list-store.c index 4e296bef3ea44940763a5630da848585ce426ee3..f9c5299297e5789c836cef7553b3e38e237e10e0 100644 --- a/src/rugby-list-store.c +++ b/src/rugby-list-store.c @@ -165,7 +165,7 @@ rugby_list_store_get_property (GObject *object, switch (prop_id) { case PROP_SCORE: - g_value_set_int (value, rugby_list_store_get_score (self)); + g_value_set_int (value, self->score); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -182,8 +182,15 @@ rugby_list_store_set_property (GObject *object, switch (prop_id) { + int score; case PROP_SCORE: - rugby_list_store_set_score (self, g_value_get_int (value)); + score = g_value_get_int (value); + if (score != self->score) + { + self->score = score; + process_data (self); + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SCORE]); + } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -224,26 +231,3 @@ rugby_list_store_init (RugbyListStore *self) self->items = g_list_store_new (RUGBY_TYPE_POSSIBILITY); } -// Public functions - -int -rugby_list_store_get_score (RugbyListStore *self) -{ - g_assert (RUGBY_IS_LIST_STORE (self)); - - return self->score; -} - -void -rugby_list_store_set_score (RugbyListStore *self, - int score) -{ - g_assert (RUGBY_IS_LIST_STORE (self)); - - if (score != self->score) - { - self->score = score; - process_data (self); - g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SCORE]); - } -} diff --git a/src/rugby-list-store.h b/src/rugby-list-store.h index e4b6c5eac30accd313d60f536c4796480995c005..affb54cf7bbec06cedd964dba05e3feb22dea94c 100644 --- a/src/rugby-list-store.h +++ b/src/rugby-list-store.h @@ -14,8 +14,4 @@ G_BEGIN_DECLS G_DECLARE_FINAL_TYPE (RugbyListStore, rugby_list_store, RUGBY, LIST_STORE, GObject) -int rugby_list_store_get_score (RugbyListStore *self); -void rugby_list_store_set_score (RugbyListStore *self, - int score); - G_END_DECLS