summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-02-13 18:27:25 -0500
committerMatthias Clasen <mclasen@redhat.com>2019-02-13 18:27:25 -0500
commitfb444919267892e34903b2c304e8c2b2b46bb154 (patch)
tree1c6bd8b4c3a2eb9da9ea05848fa5684b8647ae8b
parentae9a29f8ce122a6263404eb60043aa968c26d90a (diff)
downloadgtk+-fb444919267892e34903b2c304e8c2b2b46bb154.tar.gz
assistant: Add a pages property
This is mainly useful to make the page objects accessible in the inspector.
-rw-r--r--gtk/gtkassistant.c113
-rw-r--r--gtk/gtkassistant.h2
2 files changed, 114 insertions, 1 deletions
diff --git a/gtk/gtkassistant.c b/gtk/gtkassistant.c
index f20bbe0428..3dbdf0c323 100644
--- a/gtk/gtkassistant.c
+++ b/gtk/gtkassistant.c
@@ -80,6 +80,8 @@
#include "gtksizegroup.h"
#include "gtksizerequest.h"
#include "gtktypebuiltins.h"
+#include "gtklistlistmodelprivate.h"
+#include "gtkmaplistmodel.h"
#include "a11y/gtkwindowaccessible.h"
@@ -132,6 +134,8 @@ struct _GtkAssistantPrivate
gpointer forward_function_data;
GDestroyNotify forward_data_destroy;
+ GListModel *model;
+
gint extra_buttons;
guint committed : 1;
@@ -305,7 +309,8 @@ enum
enum {
PROP_0,
- PROP_USE_HEADER_BAR
+ PROP_USE_HEADER_BAR,
+ PROP_PAGES
};
static guint signals [LAST_SIGNAL] = { 0 };
@@ -362,6 +367,10 @@ gtk_assistant_get_property (GObject *object,
g_value_set_int (value, priv->use_header_bar);
break;
+ case PROP_PAGES:
+ g_value_set_object (value, gtk_assistant_get_pages (assistant));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -606,6 +615,13 @@ gtk_assistant_class_init (GtkAssistantClass *class)
-1, 1, -1,
GTK_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (gobject_class,
+ PROP_PAGES,
+ g_param_spec_object ("pages",
+ P_("Pages"),
+ P_("The pages of the assitant."),
+ G_TYPE_LIST_MODEL,
+ GTK_PARAM_READABLE));
/* Bind class to template
*/
@@ -1322,6 +1338,9 @@ gtk_assistant_destroy (GtkWidget *widget)
GtkAssistant *assistant = GTK_ASSISTANT (widget);
GtkAssistantPrivate *priv = assistant->priv;
+ if (priv->model)
+ g_list_model_items_changed (G_LIST_MODEL (priv->model), 0, g_list_length (priv->pages), 0);
+
/* We set current to NULL so that the remove code doesn't try
* to do anything funny
*/
@@ -1848,6 +1867,9 @@ gtk_assistant_add_page (GtkAssistant *assistant,
update_actions_size (assistant);
}
+ if (priv->model)
+ g_list_model_items_changed (priv->model, position, 0, 1);
+
return position;
}
@@ -1871,6 +1893,9 @@ gtk_assistant_remove_page (GtkAssistant *assistant,
if (page)
gtk_container_remove (GTK_CONTAINER (assistant), page);
+
+ if (assistant->priv->model)
+ g_list_model_items_changed (assistant->priv->model, page_num, 1, 0);
}
/**
@@ -2449,4 +2474,90 @@ gtk_assistant_page_get_child (GtkAssistantPage *page)
return page->page;
}
+#define GTK_TYPE_ASSISTANT_PAGES (gtk_assistant_pages_get_type ())
+G_DECLARE_FINAL_TYPE (GtkAssistantPages, gtk_assistant_pages, GTK, ASSISTANT_PAGES, GObject)
+
+struct _GtkAssistantPages
+{
+ GObject parent_instance;
+ GtkAssistant *assistant;
+};
+
+struct _GtkAssistantPagesClass
+{
+ GObjectClass parent_class;
+};
+
+static GType
+gtk_assistant_pages_get_item_type (GListModel *model)
+{
+ return GTK_TYPE_ASSISTANT_PAGE;
+}
+
+static guint
+gtk_assistant_pages_get_n_items (GListModel *model)
+{
+ GtkAssistantPages *pages = GTK_ASSISTANT_PAGES (model);
+
+ return g_list_length (pages->assistant->priv->pages);
+}
+
+static gpointer
+gtk_assistant_pages_get_item (GListModel *model,
+ guint position)
+{
+ GtkAssistantPages *pages = GTK_ASSISTANT_PAGES (model);
+ GtkAssistantPage *page;
+
+ page = g_list_nth_data (pages->assistant->priv->pages, position);
+
+ return g_object_ref (page);
+}
+
+static void
+gtk_assistant_pages_list_model_init (GListModelInterface *iface)
+{
+ iface->get_item_type = gtk_assistant_pages_get_item_type;
+ iface->get_n_items = gtk_assistant_pages_get_n_items;
+ iface->get_item = gtk_assistant_pages_get_item;
+}
+G_DEFINE_TYPE_WITH_CODE (GtkAssistantPages, gtk_assistant_pages, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, gtk_assistant_pages_list_model_init))
+
+static void
+gtk_assistant_pages_init (GtkAssistantPages *pages)
+{
+}
+
+static void
+gtk_assistant_pages_class_init (GtkAssistantPagesClass *class)
+{
+}
+static GtkAssistantPages *
+gtk_assistant_pages_new (GtkAssistant *assistant)
+{
+ GtkAssistantPages *pages;
+
+ pages = g_object_new (GTK_TYPE_ASSISTANT_PAGES, NULL);
+ pages->assistant = assistant;
+
+ return pages;
+}
+
+GListModel *
+gtk_assistant_get_pages (GtkAssistant *assistant)
+{
+ GtkAssistantPrivate *priv = assistant->priv;
+
+ g_return_val_if_fail (GTK_IS_ASSISTANT (assistant), NULL);
+
+ if (priv->model)
+ return g_object_ref (priv->model);
+
+ priv->model = G_LIST_MODEL (gtk_assistant_pages_new (assistant));
+
+ g_object_add_weak_pointer (G_OBJECT (priv->model), (gpointer *)&priv->model);
+
+ return priv->model;
+}
diff --git a/gtk/gtkassistant.h b/gtk/gtkassistant.h
index 0a09b3162b..164add62c8 100644
--- a/gtk/gtkassistant.h
+++ b/gtk/gtkassistant.h
@@ -227,6 +227,8 @@ GtkAssistantPage * gtk_assistant_get_page (GtkAssistant *assistant,
GDK_AVAILABLE_IN_ALL
GtkWidget * gtk_assistant_page_get_child (GtkAssistantPage *page);
+GDK_AVAILABLE_IN_ALL
+GListModel * gtk_assistant_get_pages (GtkAssistant *assistant);
G_END_DECLS