From d39cf39fd4ad8ffc58d3a6deb8909b0c3bae12eb Mon Sep 17 00:00:00 2001 From: Felipe Borges Date: Tue, 2 Jul 2019 12:36:42 +0000 Subject: [PATCH] search: Move row into its own object (CcSearchPanelRow) This decouples the user interface parts from the control logic, making it easy for designers to tweak the look & feel of the rows. Besides, it makes it easier to introduce Drag & Drop capabilities. --- panels/search/cc-search-panel-row.c | 87 ++++++++++++++++++++++++++++ panels/search/cc-search-panel-row.h | 38 ++++++++++++ panels/search/cc-search-panel-row.ui | 42 ++++++++++++++ panels/search/cc-search-panel.c | 60 +++++-------------- panels/search/meson.build | 3 +- panels/search/search.gresource.xml | 1 + 6 files changed, 184 insertions(+), 47 deletions(-) create mode 100644 panels/search/cc-search-panel-row.c create mode 100644 panels/search/cc-search-panel-row.h create mode 100644 panels/search/cc-search-panel-row.ui diff --git a/panels/search/cc-search-panel-row.c b/panels/search/cc-search-panel-row.c new file mode 100644 index 000000000..7a0446099 --- /dev/null +++ b/panels/search/cc-search-panel-row.c @@ -0,0 +1,87 @@ +/* + * Copyright © 2019 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Author: Felipe Borges + */ + +#include "cc-search-panel-row.h" + +struct _CcSearchPanelRow +{ + GtkListBoxRow parent_instance; + + GAppInfo *app_info; + + GtkImage *icon; + GtkLabel *app_name; + GtkSwitch *switcher; +}; + +G_DEFINE_TYPE (CcSearchPanelRow, cc_search_panel_row, GTK_TYPE_LIST_BOX_ROW) + +static void +cc_search_panel_row_class_init (CcSearchPanelRowClass *klass) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/search/cc-search-panel-row.ui"); + + gtk_widget_class_bind_template_child (widget_class, CcSearchPanelRow, icon); + gtk_widget_class_bind_template_child (widget_class, CcSearchPanelRow, app_name); + gtk_widget_class_bind_template_child (widget_class, CcSearchPanelRow, switcher); +} + +static void +cc_search_panel_row_init (CcSearchPanelRow *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +CcSearchPanelRow * +cc_search_panel_row_new (GAppInfo *app_info) +{ + CcSearchPanelRow *self; + g_autoptr(GIcon) gicon = NULL; + gint width, height; + + self = g_object_new (CC_TYPE_SEARCH_PANEL_ROW, NULL); + self->app_info = g_object_ref (app_info); + + gicon = g_app_info_get_icon (app_info); + if (gicon == NULL) + gicon = g_themed_icon_new ("application-x-executable"); + else + g_object_ref (gicon); + gtk_image_set_from_gicon (self->icon, gicon, GTK_ICON_SIZE_DND); + gtk_icon_size_lookup (GTK_ICON_SIZE_DND, &width, &height); + gtk_image_set_pixel_size (self->icon, MAX (width, height)); + + gtk_label_set_text (self->app_name, g_app_info_get_name (app_info)); + + return self; +} + +GAppInfo * +cc_search_panel_row_get_app_info (CcSearchPanelRow *self) +{ + return self->app_info; +} + +GtkWidget * +cc_search_panel_row_get_switch (CcSearchPanelRow *self) +{ + return GTK_WIDGET (self->switcher); +} diff --git a/panels/search/cc-search-panel-row.h b/panels/search/cc-search-panel-row.h new file mode 100644 index 000000000..97fe9f117 --- /dev/null +++ b/panels/search/cc-search-panel-row.h @@ -0,0 +1,38 @@ +/* + * Copyright © 2019 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Author: Felipe Borges + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define CC_TYPE_SEARCH_PANEL_ROW (cc_search_panel_row_get_type()) + +G_DECLARE_FINAL_TYPE (CcSearchPanelRow, cc_search_panel_row, CC, SEARCH_PANEL_ROW, GtkListBoxRow) + + +CcSearchPanelRow *cc_search_panel_row_new (GAppInfo *app_info); + +GAppInfo *cc_search_panel_row_get_app_info (CcSearchPanelRow *row); + +GtkWidget *cc_search_panel_row_get_switch (CcSearchPanelRow *row); + +G_END_DECLS diff --git a/panels/search/cc-search-panel-row.ui b/panels/search/cc-search-panel-row.ui new file mode 100644 index 000000000..2c82eeffd --- /dev/null +++ b/panels/search/cc-search-panel-row.ui @@ -0,0 +1,42 @@ + + + + + diff --git a/panels/search/cc-search-panel.c b/panels/search/cc-search-panel.c index 921864be5..dcc910e70 100644 --- a/panels/search/cc-search-panel.c +++ b/panels/search/cc-search-panel.c @@ -19,6 +19,7 @@ */ #include "cc-search-panel.h" +#include "cc-search-panel-row.h" #include "cc-search-locations-dialog.h" #include "cc-search-resources.h" #include "list-box-helper.h" @@ -59,8 +60,8 @@ list_sort_func (gconstpointer a, gint idx_a, idx_b; gpointer lookup; - app_a = g_object_get_data (G_OBJECT (a), "app-info"); - app_b = g_object_get_data (G_OBJECT (b), "app-info"); + app_a = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW ((gpointer*)a)); + app_b = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW ((gpointer*)b)); id_a = g_app_info_get_id (app_a); id_b = g_app_info_get_id (app_b); @@ -193,7 +194,7 @@ search_panel_move_selected (CcSearchPanel *self, GList *l, *other; row = gtk_list_box_get_selected_row (GTK_LIST_BOX (self->list_box)); - app_info = g_object_get_data (G_OBJECT (row), "app-info"); + app_info = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (row)); app_id = g_app_info_get_id (app_info); children = gtk_container_get_children (GTK_CONTAINER (self->list_box)); @@ -208,7 +209,7 @@ search_panel_move_selected (CcSearchPanel *self, g_assert (other != NULL); other_row = other->data; - other_app_info = g_object_get_data (G_OBJECT (other_row), "app-info"); + other_app_info = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (other_row)); other_app_id = g_app_info_get_id (other_app_info); g_assert (other_app_id != NULL); @@ -234,7 +235,7 @@ search_panel_move_selected (CcSearchPanel *self, break; } - tmp = g_object_get_data (G_OBJECT (l->data), "app-info"); + tmp = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (l->data)); tmp_id = g_app_info_get_id (tmp); last_good_app = tmp_id; @@ -267,7 +268,7 @@ search_panel_move_selected (CcSearchPanel *self, GAppInfo *tmp; const char *tmp_id; - tmp = g_object_get_data (G_OBJECT (l->data), "app-info"); + tmp = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (l->data)); tmp_id = g_app_info_get_id (tmp); g_hash_table_replace (self->sort_order, g_strdup (tmp_id), GINT_TO_POINTER (idx)); @@ -323,7 +324,7 @@ switch_settings_mapping_set_generic (const GValue *value, gboolean default_enabled) { CcSearchPanel *self = g_object_get_data (G_OBJECT (row), "self"); - GAppInfo *app_info = g_object_get_data (G_OBJECT (row), "app-info"); + GAppInfo *app_info = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (row)); g_auto(GStrv) apps = NULL; g_autoptr(GPtrArray) new_apps = NULL; gint idx; @@ -380,7 +381,7 @@ switch_settings_mapping_get_generic (GValue *value, GtkWidget *row, gboolean default_enabled) { - GAppInfo *app_info = g_object_get_data (G_OBJECT (row), "app-info"); + GAppInfo *app_info = cc_search_panel_row_get_app_info (CC_SEARCH_PANEL_ROW (row)); g_autofree const gchar **apps = NULL; gint idx; gboolean found; @@ -425,9 +426,8 @@ search_panel_add_one_app_info (CcSearchPanel *self, GAppInfo *app_info, gboolean default_enabled) { - GtkWidget *row, *box, *w; + CcSearchPanelRow *row; g_autoptr(GIcon) icon = NULL; - gint width, height; /* gnome-control-center is special cased in the shell, and is not configurable */ @@ -438,46 +438,14 @@ search_panel_add_one_app_info (CcSearchPanel *self, /* reset valignment of the list box */ gtk_widget_set_valign (self->list_box, GTK_ALIGN_FILL); - row = gtk_list_box_row_new (); - gtk_widget_show (row); - box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10); - gtk_widget_show (box); - gtk_container_add (GTK_CONTAINER (row), box); - gtk_widget_set_hexpand (box, TRUE); - gtk_container_set_border_width (GTK_CONTAINER (box), 10); - g_object_set_data_full (G_OBJECT (row), "app-info", - g_object_ref (app_info), g_object_unref); + row = cc_search_panel_row_new (app_info); g_object_set_data (G_OBJECT (row), "self", self); - gtk_container_add (GTK_CONTAINER (self->list_box), row); - - icon = g_app_info_get_icon (app_info); - if (icon == NULL) - icon = g_themed_icon_new ("application-x-executable"); - else - g_object_ref (icon); - - w = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_DND); - gtk_style_context_add_class (gtk_widget_get_style_context (w), "lowres-icon"); - gtk_widget_show (w); - gtk_icon_size_lookup (GTK_ICON_SIZE_DND, &width, &height); - gtk_image_set_pixel_size (GTK_IMAGE (w), MAX (width, height)); - gtk_container_add (GTK_CONTAINER (box), w); - - w = gtk_label_new (g_app_info_get_name (app_info)); - gtk_widget_show (w); - gtk_label_set_ellipsize (GTK_LABEL (w), PANGO_ELLIPSIZE_END); - gtk_label_set_xalign (GTK_LABEL (w), 0.0f); - gtk_container_add (GTK_CONTAINER (box), w); - - w = gtk_switch_new (); - gtk_widget_show (w); - gtk_widget_set_valign (w, GTK_ALIGN_CENTER); - gtk_box_pack_end (GTK_BOX (box), w, FALSE, FALSE, 0); + gtk_container_add (GTK_CONTAINER (self->list_box), GTK_WIDGET (row)); if (default_enabled) { g_settings_bind_with_mapping (self->search_settings, "disabled", - w, "active", + cc_search_panel_row_get_switch (row), "active", G_SETTINGS_BIND_DEFAULT, switch_settings_mapping_get_default_enabled, switch_settings_mapping_set_default_enabled, @@ -486,7 +454,7 @@ search_panel_add_one_app_info (CcSearchPanel *self, else { g_settings_bind_with_mapping (self->search_settings, "enabled", - w, "active", + cc_search_panel_row_get_switch (row), "active", G_SETTINGS_BIND_DEFAULT, switch_settings_mapping_get_default_disabled, switch_settings_mapping_set_default_disabled, diff --git a/panels/search/meson.build b/panels/search/meson.build index 88ec4a1e3..f3731b581 100644 --- a/panels/search/meson.build +++ b/panels/search/meson.build @@ -19,7 +19,8 @@ i18n.merge_file( sources = files( 'cc-search-panel.c', - 'cc-search-locations-dialog.c' + 'cc-search-locations-dialog.c', + 'cc-search-panel-row.c' ) resource_data = files( diff --git a/panels/search/search.gresource.xml b/panels/search/search.gresource.xml index 6b89ef510..3425a89b1 100644 --- a/panels/search/search.gresource.xml +++ b/panels/search/search.gresource.xml @@ -2,6 +2,7 @@ cc-search-panel.ui + cc-search-panel-row.ui search-locations-dialog.ui