[gnome-software/mwleeds/fix-addons-selectability] Adjust activatability of add-on rows




commit 3b1ec08d80aee1394323caa76d71839838560131
Author: Phaedrus Leeds <mwleeds endlessos org>
Date:   Thu Feb 18 17:25:12 2021 -0800

    Adjust activatability of add-on rows
    
    Currently if you hover your cursor over a GsAppAddonRow, it dims, since a
    GtkListBoxRow is activatable by default. But clicking it does nothing, so
    dimming is the wrong behavior. Make it so that clicking an add-on row that is
    not installed is equivalent to checking the checkbox to install it (and
    clicking an add-on row in the "queued for install" state un-checks the
    checkbox). When the add-on is installed and has a "Remove" button, make the row
    unactivatable; the user should have to explicitly click the button in that
    case.
    
    Relatedly, make the row unselectable and make the list box unfocusable, which
    are in line with how the version history list box works.
    
    https://gitlab.gnome.org/GNOME/gnome-software/-/merge_requests/633

 src/gs-app-addon-row.c  |  8 +++++++-
 src/gs-app-addon-row.ui |  1 +
 src/gs-details-page.c   | 17 +++++++++++++++++
 src/gs-details-page.ui  |  1 -
 4 files changed, 25 insertions(+), 2 deletions(-)
---
diff --git a/src/gs-app-addon-row.c b/src/gs-app-addon-row.c
index a546b6caf..b27077cda 100644
--- a/src/gs-app-addon-row.c
+++ b/src/gs-app-addon-row.c
@@ -115,13 +115,14 @@ gs_app_addon_row_refresh (GsAppAddonRow *row)
                break;
        }
 
-       /* update the checkbox and remove button */
+       /* update the checkbox, remove button, and activatable state */
        g_signal_handlers_block_by_func (row->checkbox, checkbox_toggled, row);
        g_signal_handlers_block_by_func (row->checkbox, app_addon_remove_button_cb, row);
        switch (gs_app_get_state (row->app)) {
        case GS_APP_STATE_QUEUED_FOR_INSTALL:
                gtk_widget_set_sensitive (row->checkbox, TRUE);
                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (row->checkbox), TRUE);
+               gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
                break;
        case GS_APP_STATE_AVAILABLE:
        case GS_APP_STATE_AVAILABLE_LOCAL:
@@ -129,25 +130,30 @@ gs_app_addon_row_refresh (GsAppAddonRow *row)
                gtk_widget_set_sensitive (row->checkbox, TRUE);
                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (row->checkbox), FALSE);
                gtk_widget_set_visible (row->button_remove, FALSE);
+               gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
                break;
        case GS_APP_STATE_UPDATABLE:
        case GS_APP_STATE_INSTALLED:
                gtk_widget_set_visible (row->checkbox, FALSE);
                gtk_widget_set_visible (row->button_remove, TRUE);
                gtk_widget_set_sensitive (row->button_remove, TRUE);
+               gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
                break;
        case GS_APP_STATE_INSTALLING:
                gtk_widget_set_sensitive (row->checkbox, FALSE);
                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (row->checkbox), TRUE);
+               gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
                break;
        case GS_APP_STATE_REMOVING:
                gtk_widget_set_visible (row->checkbox, FALSE);
                gtk_widget_set_visible (row->button_remove, TRUE);
                gtk_widget_set_sensitive (row->button_remove, FALSE);
+               gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
                break;
        default:
                gtk_widget_set_sensitive (row->checkbox, FALSE);
                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (row->checkbox), FALSE);
+               gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), FALSE);
                break;
        }
        g_signal_handlers_unblock_by_func (row->checkbox, checkbox_toggled, row);
diff --git a/src/gs-app-addon-row.ui b/src/gs-app-addon-row.ui
index 1649ba5a6..de0373e31 100644
--- a/src/gs-app-addon-row.ui
+++ b/src/gs-app-addon-row.ui
@@ -3,6 +3,7 @@
   <!-- interface-requires gtk+ 3.10 -->
   <template class="GsAppAddonRow" parent="GtkListBoxRow">
     <property name="visible">True</property>
+    <property name="selectable">False</property>
     <child>
       <object class="GtkBox" id="box">
         <property name="visible">True</property>
diff --git a/src/gs-details-page.c b/src/gs-details-page.c
index 901bcee0e..e6542ee26 100644
--- a/src/gs-details-page.c
+++ b/src/gs-details-page.c
@@ -1445,6 +1445,20 @@ list_sort_func (GtkListBoxRow *a,
                                     gs_app_get_name (a2));
 }
 
+static void
+addons_list_row_activated_cb (GtkListBox *list_box,
+                             GtkListBoxRow *row,
+                             GsDetailsPage *self)
+{
+       gboolean selected;
+
+       g_return_if_fail (GS_IS_APP_ADDON_ROW (row));
+
+       /* This would be racy if multithreaded but we're in the main thread */
+       selected = gs_app_addon_row_get_selected (GS_APP_ADDON_ROW (row));
+       gs_app_addon_row_set_selected (GS_APP_ADDON_ROW (row), !selected);
+}
+
 static void
 version_history_list_row_activated_cb (GtkListBox *list_box,
                                       GtkListBoxRow *row,
@@ -2942,6 +2956,9 @@ gs_details_page_init (GsDetailsPage *self)
                                    list_sort_func,
                                    self, NULL);
 
+       g_signal_connect (self->list_box_addons, "row-activated",
+                         G_CALLBACK (addons_list_row_activated_cb), self);
+
        g_signal_connect (self->list_box_version_history, "row-activated",
                          G_CALLBACK (version_history_list_row_activated_cb), self);
 
diff --git a/src/gs-details-page.ui b/src/gs-details-page.ui
index 10687f236..2445c33af 100644
--- a/src/gs-details-page.ui
+++ b/src/gs-details-page.ui
@@ -433,7 +433,6 @@
                                 <child>
                                   <object class="GtkListBox" id="list_box_addons">
                                     <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
                                     <property name="selection_mode">none</property>
                                     <style>
                                       <class name="content"/>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]