summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorentin Noël <corentin@elementary.io>2019-10-04 14:02:26 +0000
committerAlberto Fanjul <albertofanjul@gmail.com>2019-10-04 14:02:26 +0000
commit242364f80dbd7a092b1ab1c53ba6273ba4b95c57 (patch)
tree78ee6da2efae33602e0c5ad863677a1280cab448
parent3512d2eb8522a7fa323086462883593a0ae2cce7 (diff)
downloadglade-242364f80dbd7a092b1ab1c53ba6273ba4b95c57.tar.gz
Allow to specify placeholder to GtkListBox
-rw-r--r--plugins/gtk+/glade-gtk-list-box.c194
-rw-r--r--plugins/gtk+/gtk+.xml13
2 files changed, 174 insertions, 33 deletions
diff --git a/plugins/gtk+/glade-gtk-list-box.c b/plugins/gtk+/glade-gtk-list-box.c
index 9e054ad6..b91828ad 100644
--- a/plugins/gtk+/glade-gtk-list-box.c
+++ b/plugins/gtk+/glade-gtk-list-box.c
@@ -93,11 +93,16 @@ glade_gtk_listbox_get_child_property (GladeWidgetAdaptor *adaptor,
GValue *value)
{
g_return_if_fail (GTK_IS_LIST_BOX (container));
- g_return_if_fail (GTK_IS_LIST_BOX_ROW (child));
+ g_return_if_fail (GTK_IS_WIDGET (child));
if (strcmp (property_name, "position") == 0)
{
- gint position = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (child));
+ gint position = 0;
+
+ if (GTK_IS_LIST_BOX_ROW (child)) {
+ position = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (child));
+ }
+
g_value_set_int (value, position);
}
else
@@ -119,18 +124,19 @@ glade_gtk_listbox_set_child_property (GladeWidgetAdaptor *adaptor,
GValue *value)
{
g_return_if_fail (GTK_IS_LIST_BOX (container));
- g_return_if_fail (GTK_IS_LIST_BOX_ROW (child));
+ g_return_if_fail (GTK_IS_WIDGET (child));
g_return_if_fail (property_name != NULL || value != NULL);
if (strcmp (property_name, "position") == 0)
{
- gint position;
+ gint position = g_value_get_int (value);
- position = g_value_get_int (value);
- glade_gtk_listbox_reorder (GTK_LIST_BOX (container),
- GTK_LIST_BOX_ROW (child),
- position);
+ if (GTK_IS_LIST_BOX_ROW (child)) {
+ glade_gtk_listbox_reorder (GTK_LIST_BOX (container),
+ GTK_LIST_BOX_ROW (child),
+ position);
+ }
}
else
{
@@ -143,30 +149,102 @@ glade_gtk_listbox_set_child_property (GladeWidgetAdaptor *adaptor,
}
}
-gboolean
-glade_gtk_listbox_add_verify (GladeWidgetAdaptor *adaptor,
- GtkWidget *container,
- GtkWidget *child,
- gboolean user_feedback)
+static void
+glade_listbox_search_placeholder_forall (GtkWidget *widget,
+ gpointer data)
+{
+ GtkWidget **placeholder = (GtkWidget **)data;
+ /* A simple child should be a GtkListBoxRow, otherwise it's a placeholder */
+ if (!GTK_IS_LIST_BOX_ROW (widget) && GTK_IS_WIDGET (widget)) {
+ *placeholder = GTK_WIDGET (widget);
+ }
+}
+
+static GtkWidget*
+glade_listbox_get_placeholder (GtkListBox *list_box) {
+ GtkWidget *placeholder = NULL;
+
+ gtk_container_forall (GTK_CONTAINER (list_box), glade_listbox_search_placeholder_forall, &placeholder);
+
+ return placeholder;
+}
+
+static void
+glade_gtk_listbox_parse_finished (GladeProject *project, GladeWidget *gbox)
+{
+ GObject *box = glade_widget_get_object (gbox);
+ glade_widget_property_set (gbox, "use-placeholder", glade_listbox_get_placeholder (GTK_LIST_BOX (box)) != NULL);
+}
+
+void
+glade_gtk_listbox_post_create (GladeWidgetAdaptor *adaptor,
+ GObject *container,
+ GladeCreateReason reason)
{
- if (!GTK_IS_LIST_BOX_ROW (child))
+ GladeWidget *gwidget = glade_widget_get_from_gobject (container);
+ GladeProject *project = glade_widget_get_project (gwidget);
+
+ if (reason == GLADE_CREATE_LOAD)
{
- if (user_feedback)
- {
- GladeWidgetAdaptor *tool_item_adaptor =
- glade_widget_adaptor_get_by_type (GTK_TYPE_LIST_BOX_ROW);
-
- glade_util_ui_message (glade_app_get_window (),
- GLADE_UI_INFO, NULL,
- ONLY_THIS_GOES_IN_THAT_MSG,
- glade_widget_adaptor_get_title (tool_item_adaptor),
- glade_widget_adaptor_get_title (adaptor));
- }
+ g_signal_connect_object (project, "parse-finished",
+ G_CALLBACK (glade_gtk_listbox_parse_finished),
+ gwidget, 0);
+ }
+}
- return FALSE;
+void
+glade_gtk_listbox_get_property (GladeWidgetAdaptor *adaptor,
+ GObject *object,
+ const gchar *id,
+ GValue *value)
+{
+ if (!strcmp (id, "use-placeholder"))
+ {
+ g_value_set_boolean (value, glade_listbox_get_placeholder (GTK_LIST_BOX (object)) != NULL);
}
+ else
+ GWA_GET_CLASS (GTK_TYPE_CONTAINER)->get_property (adaptor, object, id,
+ value);
+}
+
+void
+glade_gtk_listbox_set_property (GladeWidgetAdaptor *adaptor,
+ GObject *object,
+ const gchar *id,
+ const GValue *value)
+{
+ if (!strcmp (id, "use-placeholder"))
+ {
+ GtkWidget *child;
- return TRUE;
+ if (g_value_get_boolean (value))
+ {
+ child = glade_listbox_get_placeholder (GTK_LIST_BOX (object));
+ if (!child)
+ child = glade_placeholder_new ();
+ g_object_set_data (G_OBJECT (child), "special-child-type", "placeholder");
+ }
+ else
+ {
+ child = glade_listbox_get_placeholder (GTK_LIST_BOX (object));
+ if (child)
+ {
+ GladeProject *project = glade_widget_get_project (glade_widget_get_from_gobject (object));
+ /* Assign selection first */
+ if (glade_project_is_selected
+ (project, child) == FALSE)
+ glade_project_selection_set (project, child, FALSE);
+
+ glade_project_command_delete (project);
+ glade_project_selection_set (project, object, TRUE);
+ }
+ child = NULL;
+ }
+ gtk_list_box_set_placeholder (GTK_LIST_BOX (object), child);
+ }
+ else
+ GWA_GET_CLASS (GTK_TYPE_CONTAINER)->set_property (adaptor, object, id,
+ value);
}
void
@@ -174,7 +252,18 @@ glade_gtk_listbox_add_child (GladeWidgetAdaptor *adaptor,
GObject *object,
GObject *child)
{
+ gchar *special_child_type;
+
g_return_if_fail (GTK_IS_LIST_BOX (object));
+ g_return_if_fail (GTK_IS_WIDGET (child));
+
+ special_child_type = g_object_get_data (child, "special-child-type");
+ if (!g_strcmp0 (special_child_type, "placeholder"))
+ {
+ gtk_list_box_set_placeholder (GTK_LIST_BOX (object), GTK_WIDGET (child));
+ return;
+ }
+
g_return_if_fail (GTK_IS_LIST_BOX_ROW (child));
/* Insert to the end of the list */
@@ -184,10 +273,47 @@ glade_gtk_listbox_add_child (GladeWidgetAdaptor *adaptor,
}
void
+glade_gtk_listbox_replace_child (GladeWidgetAdaptor *adaptor,
+ GObject *container,
+ GObject *current,
+ GObject *new_widget)
+{
+ gchar *special_child_type =
+ g_object_get_data (G_OBJECT (current), "special-child-type");
+
+ if (!g_strcmp0 (special_child_type, "placeholder"))
+ {
+ g_object_set_data (G_OBJECT (new_widget), "special-child-type", "placeholder");
+ gtk_list_box_set_placeholder (GTK_LIST_BOX (container), GTK_WIDGET (new_widget));
+ return;
+ }
+
+ GWA_GET_CLASS (GTK_TYPE_CONTAINER)->replace_child (adaptor,
+ container,
+ current, new_widget);
+}
+
+void
glade_gtk_listbox_remove_child (GladeWidgetAdaptor *adaptor,
GObject *object,
GObject *child)
{
+ gchar *special_child_type;
+
+ g_return_if_fail (GTK_IS_LIST_BOX (object));
+ g_return_if_fail (GTK_IS_WIDGET (child));
+
+ special_child_type = g_object_get_data (child, "special-child-type");
+ if (!g_strcmp0 (special_child_type, "placeholder"))
+ {
+ GtkWidget *w;
+
+ w = glade_placeholder_new ();
+ g_object_set_data (G_OBJECT (w), "special-child-type", "placeholder");
+ gtk_list_box_set_placeholder (GTK_LIST_BOX (object), w);
+ return;
+ }
+
gtk_container_remove (GTK_CONTAINER (object), GTK_WIDGET (child));
sync_row_positions (GTK_LIST_BOX (object));
@@ -201,14 +327,20 @@ glade_gtk_listbox_child_insert_action (GladeWidgetAdaptor *adaptor,
{
GladeWidget *parent;
GladeWidget *gchild;
- gint position;
+ gint position = 0;
parent = glade_widget_get_from_gobject (container);
glade_command_push_group (_("Insert Row on %s"), glade_widget_get_name (parent));
- position = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (object));
- if (after)
- position++;
+ /* We can right click on the placeholder too */
+ if (GTK_IS_LIST_BOX_ROW (object)) {
+ position = gtk_list_box_row_get_index (GTK_LIST_BOX_ROW (object));
+ if (after)
+ position++;
+ } else {
+ if (after)
+ position = -1;
+ }
gchild = glade_command_create (glade_widget_adaptor_get_by_type (GTK_TYPE_LIST_BOX_ROW),
parent,
diff --git a/plugins/gtk+/gtk+.xml b/plugins/gtk+/gtk+.xml
index b4760273..baee064b 100644
--- a/plugins/gtk+/gtk+.xml
+++ b/plugins/gtk+/gtk+.xml
@@ -2715,13 +2715,16 @@
<action-activate-function>glade_gtk_listbox_action_activate</action-activate-function>
<child-action-activate-function>glade_gtk_listbox_child_action_activate</child-action-activate-function>
<create-widget-function>glade_gtk_create_fixed_widget</create-widget-function>
+ <set-property-function>glade_gtk_listbox_set_property</set-property-function>
+ <get-property-function>glade_gtk_listbox_get_property</get-property-function>
<!-- We do not want glade_gtk_container_post_create be executed -->
- <post-create-function>empty</post-create-function>
- <add-child-verify-function>glade_gtk_listbox_add_verify</add-child-verify-function>
+ <post-create-function>glade_gtk_listbox_post_create</post-create-function>
<add-child-function>glade_gtk_listbox_add_child</add-child-function>
+ <replace-child-function>glade_gtk_listbox_replace_child</replace-child-function>
<remove-child-function>glade_gtk_listbox_remove_child</remove-child-function>
<child-set-property-function>glade_gtk_listbox_set_child_property</child-set-property-function>
<child-get-property-function>glade_gtk_listbox_get_child_property</child-get-property-function>
+ <special-child-type>type</special-child-type>
<actions>
<action id="add_row" name="Add Row" stock="list-add" important="True"/>
@@ -2746,6 +2749,12 @@
<value id="GTK_SELECTION_MULTIPLE" name="Multiple"/>
</displayable-values>
</property>
+ <property save="False" id="use-placeholder" since="3.10" default="False" name="Placeholder">
+ <parameter-spec>
+ <type>GParamBoolean</type>
+ </parameter-spec>
+ <tooltip>Whether this listbox should have a placeholder widget that is shown in the list when it doesn't display any visible children</tooltip>
+ </property>
</properties>
<packing-properties>