Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-3.0-or-later
2 : : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
3 : :
4 : : #define G_LOG_DOMAIN "valent-menu-stack"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <gtk/gtk.h>
9 : :
10 : : #include "valent-menu-list.h"
11 : : #include "valent-menu-stack.h"
12 : :
13 : :
14 : : struct _ValentMenuStack
15 : : {
16 : : GtkWidget parent_instance;
17 : :
18 : : GtkWidget *stack;
19 : : ValentMenuList *main;
20 : : };
21 : :
22 [ + + + - ]: 41 : G_DEFINE_FINAL_TYPE (ValentMenuStack, valent_menu_stack, GTK_TYPE_WIDGET)
23 : :
24 : : enum {
25 : : PROP_0,
26 : : PROP_MENU_MODEL,
27 : : N_PROPERTIES
28 : : };
29 : :
30 : : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
31 : :
32 : :
33 : : /*
34 : : * GObject
35 : : */
36 : : static void
37 : 3 : valent_menu_stack_dispose (GObject *object)
38 : : {
39 : 3 : ValentMenuStack *self = VALENT_MENU_STACK (object);
40 : :
41 [ + - ]: 3 : g_clear_pointer (&self->stack, gtk_widget_unparent);
42 : :
43 : 3 : G_OBJECT_CLASS (valent_menu_stack_parent_class)->dispose (object);
44 : 3 : }
45 : :
46 : : static void
47 : 0 : valent_menu_stack_get_property (GObject *object,
48 : : guint prop_id,
49 : : GValue *value,
50 : : GParamSpec *pspec)
51 : : {
52 : 0 : ValentMenuStack *self = VALENT_MENU_STACK (object);
53 : :
54 [ # # ]: 0 : switch (prop_id)
55 : : {
56 : 0 : case PROP_MENU_MODEL:
57 : 0 : g_value_set_object (value, valent_menu_stack_get_menu_model (self));
58 : 0 : break;
59 : :
60 : 0 : default:
61 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
62 : : }
63 : 0 : }
64 : :
65 : : static void
66 : 0 : valent_menu_stack_set_property (GObject *object,
67 : : guint prop_id,
68 : : const GValue *value,
69 : : GParamSpec *pspec)
70 : : {
71 : 0 : ValentMenuStack *self = VALENT_MENU_STACK (object);
72 : :
73 [ # # ]: 0 : switch (prop_id)
74 : : {
75 : 0 : case PROP_MENU_MODEL:
76 : 0 : valent_menu_stack_set_menu_model (self, g_value_get_object (value));
77 : 0 : break;
78 : :
79 : 0 : default:
80 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
81 : : }
82 : 0 : }
83 : :
84 : : static void
85 : 2 : valent_menu_stack_class_init (ValentMenuStackClass *klass)
86 : : {
87 : 2 : GObjectClass *object_class = G_OBJECT_CLASS (klass);
88 : 2 : GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
89 : :
90 : 2 : object_class->dispose = valent_menu_stack_dispose;
91 : 2 : object_class->get_property = valent_menu_stack_get_property;
92 : 2 : object_class->set_property = valent_menu_stack_set_property;
93 : :
94 : 2 : gtk_widget_class_set_css_name (widget_class, "valent-menu-stack");
95 : 2 : gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
96 : :
97 : : /**
98 : : * ValentMenuStack:model:
99 : : *
100 : : * The `GMenuModel` for this `ValentMenuStack`.
101 : : */
102 : 4 : properties [PROP_MENU_MODEL] =
103 : 2 : g_param_spec_object ("menu-model", NULL, NULL,
104 : : G_TYPE_MENU_MODEL,
105 : : (G_PARAM_READWRITE |
106 : : G_PARAM_EXPLICIT_NOTIFY |
107 : : G_PARAM_STATIC_STRINGS));
108 : :
109 : 2 : g_object_class_install_properties (object_class, N_PROPERTIES, properties);
110 : 2 : }
111 : :
112 : : static void
113 : 3 : valent_menu_stack_init (ValentMenuStack *self)
114 : : {
115 : 3 : self->stack = g_object_new (GTK_TYPE_STACK,
116 : : "interpolate-size", TRUE,
117 : : "transition-type", GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT,
118 : : "vhomogeneous", FALSE,
119 : : NULL);
120 : 3 : gtk_widget_insert_before (self->stack, GTK_WIDGET (self), NULL);
121 : 3 : }
122 : :
123 : : /**
124 : : * valent_menu_stack_new:
125 : : * @menu_model: (nullable): a `GMenuModel`
126 : : *
127 : : * Create a new `ValentMenuStack`.
128 : : *
129 : : * Returns: a `GtkWidget`
130 : : */
131 : : GtkWidget *
132 : 0 : valent_menu_stack_new (GMenuModel *menu_model)
133 : : {
134 : 0 : return g_object_new (VALENT_TYPE_MENU_STACK,
135 : : "menu-model", menu_model,
136 : : NULL);
137 : : }
138 : :
139 : : /**
140 : : * valent_menu_stack_get_model:
141 : : * @stack: a `ValentMenuStack`
142 : : *
143 : : * Get the `GMenuModel` for @stack.
144 : : *
145 : : * Returns: (transfer none) (nullable): a `GMenuModel`
146 : : */
147 : : GMenuModel *
148 : 0 : valent_menu_stack_get_menu_model (ValentMenuStack *stack)
149 : : {
150 [ # # ]: 0 : g_return_val_if_fail (VALENT_IS_MENU_STACK (stack), NULL);
151 : :
152 [ # # ]: 0 : if (stack->main == NULL)
153 : : return NULL;
154 : :
155 : 0 : return valent_menu_list_get_menu_model (stack->main);
156 : : }
157 : :
158 : : /**
159 : : * valent_menu_stack_set_model:
160 : : * @stack: a `ValentMenuStack`
161 : : * @menu_model: (nullable): a `GMenuModel`
162 : : *
163 : : * Set the `GMenuModel` for @stack to @menu_model.
164 : : */
165 : : void
166 : 3 : valent_menu_stack_set_menu_model (ValentMenuStack *stack,
167 : : GMenuModel *menu_model)
168 : : {
169 [ + - ]: 3 : g_return_if_fail (VALENT_IS_MENU_STACK (stack));
170 [ + - + - : 3 : g_return_if_fail (menu_model == NULL || G_IS_MENU_MODEL (menu_model));
+ - - + ]
171 : :
172 : : /* Destroy any existing menu lists */
173 [ - + ]: 3 : if (stack->main != NULL)
174 : : {
175 : 0 : gtk_stack_remove (GTK_STACK (stack->stack), GTK_WIDGET (stack->main));
176 : 0 : stack->main = NULL;
177 : : }
178 : :
179 [ + - ]: 3 : if (menu_model != NULL)
180 : : {
181 : 3 : stack->main = valent_menu_list_new (NULL);
182 : 3 : gtk_stack_add_named (GTK_STACK (stack->stack),
183 : : GTK_WIDGET (stack->main),
184 : : "main");
185 : 3 : valent_menu_list_set_menu_model (stack->main, menu_model);
186 : : }
187 : : }
188 : :
|