From eadf9f9ff1bc420611daedb8e43328c772d9689f Mon Sep 17 00:00:00 2001 From: Alexander Vanhee <160625516+AlexanderVanhee@users.noreply.github.com> Date: Fri, 27 Feb 2026 20:04:31 +0100 Subject: [PATCH 1/2] Add mobile only preference toggle. This toggle is only visible when at mobile resolutions (or when its already enabled) to reduce clutter in the preferences menu. --- data/io.github.kolunmi.Bazaar.gschema.xml | 5 ++ src/bz-application.c | 13 ++++ src/bz-apps-page.blp | 1 + src/bz-entry-group.c | 33 +++++++++- src/bz-entry-group.h | 3 + src/bz-preferences-dialog.blp | 9 ++- src/bz-preferences-dialog.c | 76 +++++++++++++++-------- src/bz-state-info.txt | 1 + 8 files changed, 113 insertions(+), 28 deletions(-) diff --git a/data/io.github.kolunmi.Bazaar.gschema.xml b/data/io.github.kolunmi.Bazaar.gschema.xml index c1d58796..5ed4a108 100644 --- a/data/io.github.kolunmi.Bazaar.gschema.xml +++ b/data/io.github.kolunmi.Bazaar.gschema.xml @@ -21,6 +21,11 @@ Show Only Verified Content Hide applications which are not verified on Flathub + + false + Show Only Mobile apps + Hide applications which do not work well on mobile + true Debounce Search Inputs diff --git a/src/bz-application.c b/src/bz-application.c index 34fab309..8e08bf77 100644 --- a/src/bz-application.c +++ b/src/bz-application.c @@ -2134,6 +2134,7 @@ show_hide_app_setting_changed (BzApplication *self, bz_state_info_set_show_only_foss (self->state, g_settings_get_boolean (self->settings, "show-only-foss")); bz_state_info_set_show_only_flathub (self->state, g_settings_get_boolean (self->settings, "show-only-flathub")); bz_state_info_set_show_only_verified (self->state, g_settings_get_boolean (self->settings, "show-only-verified")); + bz_state_info_set_show_only_mobile (self->state, g_settings_get_boolean (self->settings, "show-only-mobile")); gtk_filter_changed (GTK_FILTER (self->group_filter), GTK_FILTER_CHANGE_DIFFERENT); gtk_filter_changed (GTK_FILTER (self->appid_filter), GTK_FILTER_CHANGE_DIFFERENT); @@ -2742,6 +2743,15 @@ init_service_struct (BzApplication *self, G_CALLBACK (show_hide_app_setting_changed), self); + bz_state_info_set_show_only_mobile ( + self->state, + g_settings_get_boolean (self->settings, "show-only-mobile")); + g_signal_connect_swapped ( + self->settings, + "changed::show-only-mobile", + G_CALLBACK (show_hide_app_setting_changed), + self); + self->blocklist_regexes = g_ptr_array_new_with_free_func ( (GDestroyNotify) g_ptr_array_unref); self->blocklists_provider = bz_content_provider_new (); @@ -3095,6 +3105,9 @@ validate_group_for_ui (BzApplication *self, if (bz_state_info_get_show_only_verified (self->state) && !bz_entry_group_get_is_verified (group)) return FALSE; + if (bz_state_info_get_show_only_mobile (self->state) && + !bz_entry_group_get_is_mobile_friendly (group)) + return FALSE; if (bz_state_info_get_disable_blocklists (self->state)) return TRUE; diff --git a/src/bz-apps-page.blp b/src/bz-apps-page.blp index a191c15b..a1e75094 100644 --- a/src/bz-apps-page.blp +++ b/src/bz-apps-page.blp @@ -76,6 +76,7 @@ template $BzAppsPage: Adw.NavigationPage { Box content_box { orientation: vertical; + valign: start; spacing: 10; margin-start: 30; margin-end: 30; diff --git a/src/bz-entry-group.c b/src/bz-entry-group.c index 30242590..c66ac140 100644 --- a/src/bz-entry-group.c +++ b/src/bz-entry-group.c @@ -47,6 +47,7 @@ struct _BzEntryGroup char *dark_accent_color; gboolean is_flathub; gboolean is_verified; + gboolean is_mobile_friendly; char *search_tokens; char *remote_repos_string; char *eol; @@ -95,6 +96,7 @@ enum PROP_DARK_ACCENT_COLOR, PROP_IS_FLATHUB, PROP_IS_VERIFIED, + PROP_IS_MOBILE_FRIENDLY, PROP_SEARCH_TOKENS, PROP_UI_ENTRY, PROP_REMOTE_REPOS_STRING, @@ -215,6 +217,9 @@ bz_entry_group_get_property (GObject *object, case PROP_IS_VERIFIED: g_value_set_boolean (value, bz_entry_group_get_is_verified (self)); break; + case PROP_IS_MOBILE_FRIENDLY: + g_value_set_boolean (value, bz_entry_group_get_is_mobile_friendly (self)); + break; case PROP_SEARCH_TOKENS: g_value_set_boxed (value, bz_entry_group_get_search_tokens (self)); break; @@ -287,6 +292,7 @@ bz_entry_group_set_property (GObject *object, case PROP_DARK_ACCENT_COLOR: case PROP_IS_FLATHUB: case PROP_IS_VERIFIED: + case PROP_IS_MOBILE_FRIENDLY: case PROP_SEARCH_TOKENS: case PROP_EOL: case PROP_UI_ENTRY: @@ -395,6 +401,12 @@ bz_entry_group_class_init (BzEntryGroupClass *klass) NULL, NULL, FALSE, G_PARAM_READABLE); + props[PROP_IS_MOBILE_FRIENDLY] = + g_param_spec_boolean ( + "is-mobile-friendly", + NULL, NULL, FALSE, + G_PARAM_READABLE); + props[PROP_SEARCH_TOKENS] = g_param_spec_string ( "search-tokens", @@ -540,6 +552,7 @@ bz_entry_group_new_for_single_entry (BzEntry *entry) const char *dark_accent_color = NULL; gboolean is_flathub = FALSE; gboolean is_verified = FALSE; + gboolean is_mobile_friendly = FALSE; const char *eol = NULL; guint64 installed_size = 0; const char *donation_url = NULL; @@ -563,6 +576,7 @@ bz_entry_group_new_for_single_entry (BzEntry *entry) dark_accent_color = bz_entry_get_dark_accent_color (entry); is_flathub = bz_entry_get_is_flathub (entry); is_verified = bz_entry_is_verified (entry); + is_mobile_friendly = bz_entry_get_is_mobile_friendly (entry); eol = bz_entry_get_eol (entry); installed_size = bz_entry_get_installed_size (entry); donation_url = bz_entry_get_donation_url (entry); @@ -587,8 +601,9 @@ bz_entry_group_new_for_single_entry (BzEntry *entry) group->light_accent_color = g_strdup (light_accent_color); if (dark_accent_color != NULL) group->dark_accent_color = g_strdup (dark_accent_color); - group->is_flathub = is_flathub; - group->is_verified = is_verified; + group->is_flathub = is_flathub; + group->is_verified = is_verified; + group->is_mobile_friendly = is_mobile_friendly; if (eol != NULL) group->eol = g_strdup (eol); group->installed_size = installed_size; @@ -705,6 +720,13 @@ bz_entry_group_get_is_verified (BzEntryGroup *self) return self->is_verified; } +gboolean +bz_entry_group_get_is_mobile_friendly (BzEntryGroup *self) +{ + g_return_val_if_fail (BZ_IS_ENTRY_GROUP (self), FALSE); + return self->is_mobile_friendly; +} + const char * bz_entry_group_get_search_tokens (BzEntryGroup *self) { @@ -877,6 +899,7 @@ bz_entry_group_add (BzEntryGroup *self, const char *dark_accent_color = NULL; gboolean is_flathub = FALSE; gboolean is_verified = FALSE; + gboolean is_mobile_friendly = FALSE; guint64 installed_size = 0; GListModel *addons = NULL; int n_addons = 0; @@ -926,6 +949,7 @@ bz_entry_group_add (BzEntryGroup *self, dark_accent_color = bz_entry_get_dark_accent_color (entry); is_flathub = bz_entry_get_is_flathub (entry); is_verified = bz_entry_is_verified (entry); + is_mobile_friendly = bz_entry_get_is_mobile_friendly (entry); installed_size = bz_entry_get_installed_size (entry); donation_url = bz_entry_get_donation_url (entry); entry_categories = bz_entry_get_categories (entry); @@ -1011,6 +1035,11 @@ bz_entry_group_add (BzEntryGroup *self, self->is_verified = is_verified; g_object_notify_by_pspec (G_OBJECT (self), props[PROP_IS_VERIFIED]); } + if (!!is_mobile_friendly != !!self->is_mobile_friendly) + { + self->is_mobile_friendly = is_mobile_friendly; + g_object_notify_by_pspec (G_OBJECT (self), props[PROP_IS_MOBILE_FRIENDLY]); + } if (installed_size != self->installed_size) { self->installed_size = installed_size; diff --git a/src/bz-entry-group.h b/src/bz-entry-group.h index fc4a711a..f9ee4677 100644 --- a/src/bz-entry-group.h +++ b/src/bz-entry-group.h @@ -79,6 +79,9 @@ bz_entry_group_get_is_flathub (BzEntryGroup *self); gboolean bz_entry_group_get_is_verified (BzEntryGroup *self); +gboolean +bz_entry_group_get_is_mobile_friendly (BzEntryGroup *self); + const char * bz_entry_group_get_search_tokens (BzEntryGroup *self); diff --git a/src/bz-preferences-dialog.blp b/src/bz-preferences-dialog.blp index d24c1a63..d13bbfa3 100644 --- a/src/bz-preferences-dialog.blp +++ b/src/bz-preferences-dialog.blp @@ -12,6 +12,7 @@ template $BzPreferencesDialog: Adw.PreferencesDialog { setters { flag_buttons_box.max-children-per-line: 6; + template.compact: true; } } @@ -45,6 +46,12 @@ template $BzPreferencesDialog: Adw.PreferencesDialog { subtitle: _("Hide results that are not verified on Flathub"); } + Adw.SwitchRow only_mobile_switch { + visible: bind $logical_or(template.compact, only_mobile_switch.active) as ; + title: _("Mobile Friendly Only"); + subtitle: _("Hide applications that are not optimized for mobile devices"); + } + Adw.SwitchRow hide_eol_switch { title: _("Hide EOL Apps"); subtitle: _("Hide apps which are no longer supported by their developers"); @@ -92,4 +99,4 @@ template $BzPreferencesDialog: Adw.PreferencesDialog { } } } -} +} \ No newline at end of file diff --git a/src/bz-preferences-dialog.c b/src/bz-preferences-dialog.c index 6c985790..6e6bb407 100644 --- a/src/bz-preferences-dialog.c +++ b/src/bz-preferences-dialog.c @@ -19,6 +19,7 @@ */ #include "bz-preferences-dialog.h" +#include "bz-template-callbacks.h" #include typedef struct @@ -29,28 +30,28 @@ typedef struct } BarTheme; static const BarTheme bar_themes[] = { - { "accent-color", "accent-color-theme", N_ ("Accent Color") }, - { "pride-rainbow-flag", "pride-rainbow-flag-theme", N_ ("Pride Colors") }, - { "lesbian-pride-flag", "lesbian-pride-flag-theme", N_ ("Lesbian Pride Colors") }, - { "gay-pride-flag", "gay-pride-flag-theme", N_ ("Male Homosexual Pride Colors") }, - { "transgender-flag", "transgender-flag-theme", N_ ("Transgender Pride Colors") }, - { "nonbinary-flag", "nonbinary-flag-theme", N_ ("Nonbinary Pride Colors") }, - { "bisexual-flag", "bisexual-flag-theme", N_ ("Bisexual Pride Colors") }, - { "asexual-flag", "asexual-flag-theme", N_ ("Asexual Pride Colors") }, - { "pansexual-flag", "pansexual-flag-theme", N_ ("Pansexual Pride Colors") }, - { "aromantic-flag", "aromantic-flag-theme", N_ ("Aromantic Pride Colors") }, - { "genderfluid-flag", "genderfluid-flag-theme", N_ ("Genderfluid Pride Colors") }, - { "polysexual-flag", "polysexual-flag-theme", N_ ("Polysexual Pride Colors") }, - { "omnisexual-flag", "omnisexual-flag-theme", N_ ("Omnisexual Pride Colors") }, - { "aroace-flag", "aroace-flag-theme", N_ ("Aroace Pride Colors") }, - { "agender-flag", "agender-flag-theme", N_ ("Agender Pride Colors") }, - { "genderqueer-flag", "genderqueer-flag-theme", N_ ("Genderqueer Pride Colors") }, - { "intersex-flag", "intersex-flag-theme", N_ ("Intersex Pride Colors") }, - { "demigender-flag", "demigender-flag-theme", N_ ("Demigender Pride Colors") }, - { "biromantic-flag", "biromantic-flag-theme", N_ ("Biromantic Pride Colors") }, - { "disability-flag", "disability-flag-theme", N_ ("Disability Pride Colors") }, - { "femboy-flag", "femboy-flag-theme", N_ ("Femboy Pride Colors") }, - { "neutrois-flag", "neutrois-flag-theme", N_ ("Neutrois Pride Colors") }, + { "accent-color", "accent-color-theme", N_ ("Accent Color") }, + { "pride-rainbow-flag", "pride-rainbow-flag-theme", N_ ("Pride Colors") }, + { "lesbian-pride-flag", "lesbian-pride-flag-theme", N_ ("Lesbian Pride Colors") }, + { "gay-pride-flag", "gay-pride-flag-theme", N_ ("Male Homosexual Pride Colors") }, + { "transgender-flag", "transgender-flag-theme", N_ ("Transgender Pride Colors") }, + { "nonbinary-flag", "nonbinary-flag-theme", N_ ("Nonbinary Pride Colors") }, + { "bisexual-flag", "bisexual-flag-theme", N_ ("Bisexual Pride Colors") }, + { "asexual-flag", "asexual-flag-theme", N_ ("Asexual Pride Colors") }, + { "pansexual-flag", "pansexual-flag-theme", N_ ("Pansexual Pride Colors") }, + { "aromantic-flag", "aromantic-flag-theme", N_ ("Aromantic Pride Colors") }, + { "genderfluid-flag", "genderfluid-flag-theme", N_ ("Genderfluid Pride Colors") }, + { "polysexual-flag", "polysexual-flag-theme", N_ ("Polysexual Pride Colors") }, + { "omnisexual-flag", "omnisexual-flag-theme", N_ ("Omnisexual Pride Colors") }, + { "aroace-flag", "aroace-flag-theme", N_ ("Aroace Pride Colors") }, + { "agender-flag", "agender-flag-theme", N_ ("Agender Pride Colors") }, + { "genderqueer-flag", "genderqueer-flag-theme", N_ ("Genderqueer Pride Colors") }, + { "intersex-flag", "intersex-flag-theme", N_ ("Intersex Pride Colors") }, + { "demigender-flag", "demigender-flag-theme", N_ ("Demigender Pride Colors") }, + { "biromantic-flag", "biromantic-flag-theme", N_ ("Biromantic Pride Colors") }, + { "disability-flag", "disability-flag-theme", N_ ("Disability Pride Colors") }, + { "femboy-flag", "femboy-flag-theme", N_ ("Femboy Pride Colors") }, + { "neutrois-flag", "neutrois-flag-theme", N_ ("Neutrois Pride Colors") }, }; struct _BzPreferencesDialog @@ -58,12 +59,14 @@ struct _BzPreferencesDialog AdwPreferencesDialog parent_instance; BzStateInfo *state; + gboolean compact; GSettings *settings; /* Template widgets */ AdwSwitchRow *only_foss_switch; AdwSwitchRow *only_flathub_switch; AdwSwitchRow *only_verified_switch; + AdwSwitchRow *only_mobile_switch; AdwSwitchRow *search_debounce_switch; GtkFlowBox *flag_buttons_box; AdwSwitchRow *hide_eol_switch; @@ -79,6 +82,7 @@ enum PROP_0, PROP_STATE, + PROP_COMPACT, LAST_PROP }; @@ -139,7 +143,7 @@ on_rotate_switch_changed (AdwSwitchRow *row, BzPreferencesDialog *self) { gboolean active = FALSE; - active = adw_switch_row_get_active (row); + active = adw_switch_row_get_active (row); for (guint i = 0; i < G_N_ELEMENTS (bar_themes); i++) { if (active) @@ -205,6 +209,10 @@ bind_settings (BzPreferencesDialog *self) self->only_verified_switch, "active", G_SETTINGS_BIND_DEFAULT); + g_settings_bind (self->settings, "show-only-mobile", + self->only_mobile_switch, "active", + G_SETTINGS_BIND_DEFAULT); + g_settings_bind (self->settings, "search-debounce", self->search_debounce_switch, "active", G_SETTINGS_BIND_DEFAULT); @@ -214,8 +222,8 @@ bind_settings (BzPreferencesDialog *self) G_SETTINGS_BIND_DEFAULT); g_settings_bind (self->settings, "rotate-flag", - self->rotate_switch, "active", - G_SETTINGS_BIND_DEFAULT); + self->rotate_switch, "active", + G_SETTINGS_BIND_DEFAULT); if (adw_switch_row_get_active (self->rotate_switch)) { @@ -246,6 +254,9 @@ bz_preferences_dialog_get_property (GObject *object, case PROP_STATE: g_value_set_object (value, self->state); break; + case PROP_COMPACT: + g_value_set_boolean (value, self->compact); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -257,8 +268,14 @@ bz_preferences_dialog_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { + BzPreferencesDialog *self = BZ_PREFERENCES_DIALOG (object); + switch (prop_id) { + case PROP_COMPACT: + self->compact = g_value_get_boolean (value); + g_object_notify_by_pspec (object, props[PROP_COMPACT]); + break; case PROP_STATE: default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -289,13 +306,22 @@ bz_preferences_dialog_class_init (BzPreferencesDialogClass *klass) BZ_TYPE_STATE_INFO, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + props[PROP_COMPACT] = + g_param_spec_boolean ( + "compact", + NULL, NULL, FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + g_object_class_install_properties (object_class, LAST_PROP, props); gtk_widget_class_set_template_from_resource (widget_class, "/io/github/kolunmi/Bazaar/bz-preferences-dialog.ui"); + bz_widget_class_bind_all_util_callbacks (widget_class); + gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, only_foss_switch); gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, only_flathub_switch); gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, only_verified_switch); + gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, only_mobile_switch); gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, search_debounce_switch); gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, flag_buttons_box); gtk_widget_class_bind_template_child (widget_class, BzPreferencesDialog, hide_eol_switch); diff --git a/src/bz-state-info.txt b/src/bz-state-info.txt index 1db3970c..6d99816d 100644 --- a/src/bz-state-info.txt +++ b/src/bz-state-info.txt @@ -52,6 +52,7 @@ property=settings GSettings G_TYPE_SETTINGS object property=show_only_flathub gboolean G_TYPE_BOOLEAN boolean property=show_only_foss gboolean G_TYPE_BOOLEAN boolean property=show_only_verified gboolean G_TYPE_BOOLEAN boolean +property=show_only_mobile gboolean G_TYPE_BOOLEAN boolean property=syncing gboolean G_TYPE_BOOLEAN boolean property=system_icon_theme GtkIconTheme GTK_TYPE_ICON_THEME object property=transaction_manager BzTransactionManager BZ_TYPE_TRANSACTION_MANAGER object From 8692bde983f42a95d2e2b355c7c5b147c216ef64 Mon Sep 17 00:00:00 2001 From: Alexander Vanhee <160625516+AlexanderVanhee@users.noreply.github.com> Date: Mon, 2 Mar 2026 15:03:28 +0100 Subject: [PATCH 2/2] Make preference visible non conditionally --- src/bz-preferences-dialog.blp | 2 -- src/bz-preferences-dialog.c | 17 ----------------- 2 files changed, 19 deletions(-) diff --git a/src/bz-preferences-dialog.blp b/src/bz-preferences-dialog.blp index d13bbfa3..2a16d0f7 100644 --- a/src/bz-preferences-dialog.blp +++ b/src/bz-preferences-dialog.blp @@ -12,7 +12,6 @@ template $BzPreferencesDialog: Adw.PreferencesDialog { setters { flag_buttons_box.max-children-per-line: 6; - template.compact: true; } } @@ -47,7 +46,6 @@ template $BzPreferencesDialog: Adw.PreferencesDialog { } Adw.SwitchRow only_mobile_switch { - visible: bind $logical_or(template.compact, only_mobile_switch.active) as ; title: _("Mobile Friendly Only"); subtitle: _("Hide applications that are not optimized for mobile devices"); } diff --git a/src/bz-preferences-dialog.c b/src/bz-preferences-dialog.c index 6e6bb407..63cf9ad8 100644 --- a/src/bz-preferences-dialog.c +++ b/src/bz-preferences-dialog.c @@ -59,7 +59,6 @@ struct _BzPreferencesDialog AdwPreferencesDialog parent_instance; BzStateInfo *state; - gboolean compact; GSettings *settings; /* Template widgets */ @@ -82,7 +81,6 @@ enum PROP_0, PROP_STATE, - PROP_COMPACT, LAST_PROP }; @@ -254,9 +252,6 @@ bz_preferences_dialog_get_property (GObject *object, case PROP_STATE: g_value_set_object (value, self->state); break; - case PROP_COMPACT: - g_value_set_boolean (value, self->compact); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -268,14 +263,8 @@ bz_preferences_dialog_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { - BzPreferencesDialog *self = BZ_PREFERENCES_DIALOG (object); - switch (prop_id) { - case PROP_COMPACT: - self->compact = g_value_get_boolean (value); - g_object_notify_by_pspec (object, props[PROP_COMPACT]); - break; case PROP_STATE: default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -306,12 +295,6 @@ bz_preferences_dialog_class_init (BzPreferencesDialogClass *klass) BZ_TYPE_STATE_INFO, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - props[PROP_COMPACT] = - g_param_spec_boolean ( - "compact", - NULL, NULL, FALSE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); - g_object_class_install_properties (object_class, LAST_PROP, props); gtk_widget_class_set_template_from_resource (widget_class, "/io/github/kolunmi/Bazaar/bz-preferences-dialog.ui");