1 /* gbp-glade-properties.c
2  *
3  * Copyright 2018-2019 Christian Hergert <chergert@redhat.com>
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  * SPDX-License-Identifier: GPL-3.0-or-later
19  */
20 
21 #define G_LOG_DOMAIN "gbp-glade-properties"
22 
23 #include "config.h"
24 
25 #include <glib/gi18n.h>
26 
27 #include "gbp-glade-properties.h"
28 
29 struct _GbpGladeProperties
30 {
31   DzlDockWidget     parent_instance;
32   GtkStackSwitcher *stack_switcher;
33   GtkStack         *stack;
34   DzlDockWidget    *a11y_dock;
35   DzlDockWidget    *common_dock;
36   DzlDockWidget    *general_dock;
37   DzlDockWidget    *packing_dock;
38 };
39 
G_DEFINE_FINAL_TYPE(GbpGladeProperties,gbp_glade_properties,DZL_TYPE_DOCK_WIDGET)40 G_DEFINE_FINAL_TYPE (GbpGladeProperties, gbp_glade_properties, DZL_TYPE_DOCK_WIDGET)
41 
42 static void
43 adjust_radio_hexpand (GtkWidget *widget,
44                       gpointer   user_data)
45 {
46   gtk_widget_set_hexpand (widget, TRUE);
47 }
48 
49 static void
gbp_glade_properties_class_init(GbpGladePropertiesClass * klass)50 gbp_glade_properties_class_init (GbpGladePropertiesClass *klass)
51 {
52   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
53 
54   gtk_widget_class_set_template_from_resource (widget_class, "/plugins/glade/gbp-glade-properties.ui");
55   gtk_widget_class_set_css_name (widget_class, "gbpgladeproperties");
56   gtk_widget_class_bind_template_child (widget_class, GbpGladeProperties, stack);
57   gtk_widget_class_bind_template_child (widget_class, GbpGladeProperties, stack_switcher);
58   gtk_widget_class_bind_template_child (widget_class, GbpGladeProperties, a11y_dock);
59   gtk_widget_class_bind_template_child (widget_class, GbpGladeProperties, common_dock);
60   gtk_widget_class_bind_template_child (widget_class, GbpGladeProperties, general_dock);
61   gtk_widget_class_bind_template_child (widget_class, GbpGladeProperties, packing_dock);
62 }
63 
64 static void
gbp_glade_properties_init(GbpGladeProperties * self)65 gbp_glade_properties_init (GbpGladeProperties *self)
66 {
67   gtk_widget_init_template (GTK_WIDGET (self));
68 
69   dzl_dock_widget_set_title (DZL_DOCK_WIDGET (self), _("Unnamed Glade Project"));
70   dzl_dock_widget_set_icon_name (DZL_DOCK_WIDGET (self), "org.gnome.Glade-symbolic");
71 
72   gtk_container_foreach (GTK_CONTAINER (self->stack_switcher), adjust_radio_hexpand, NULL);
73 }
74 
75 void
gbp_glade_properties_set_widget(GbpGladeProperties * self,GladeWidget * widget)76 gbp_glade_properties_set_widget (GbpGladeProperties *self,
77                                  GladeWidget        *widget)
78 {
79   GladeWidgetAdaptor *adapter;
80   GladeEditable *editable;
81   GladeWidget *parent;
82 
83   g_return_if_fail (GBP_IS_GLADE_PROPERTIES (self));
84   g_return_if_fail (!widget || GLADE_IS_WIDGET (widget));
85 
86   gtk_container_foreach (GTK_CONTAINER (self->a11y_dock), (GtkCallback)gtk_widget_destroy, NULL);
87   gtk_container_foreach (GTK_CONTAINER (self->general_dock), (GtkCallback)gtk_widget_destroy, NULL);
88   gtk_container_foreach (GTK_CONTAINER (self->common_dock), (GtkCallback)gtk_widget_destroy, NULL);
89   gtk_container_foreach (GTK_CONTAINER (self->packing_dock), (GtkCallback)gtk_widget_destroy, NULL);
90 
91   if (widget == NULL)
92     return;
93 
94   adapter = glade_widget_get_adaptor (widget);
95 
96   /* General page */
97   editable = glade_widget_adaptor_create_editable (adapter, GLADE_PAGE_GENERAL);
98   gtk_container_add (GTK_CONTAINER (self->general_dock), GTK_WIDGET (editable));
99   glade_editable_load (editable, widget);
100   gtk_widget_show (GTK_WIDGET (editable));
101 
102   /* Packing page */
103   if ((parent = glade_widget_get_parent (widget)))
104     {
105       GladeWidgetAdaptor *parent_adapter;
106 
107       parent_adapter = glade_widget_get_adaptor (parent);
108       editable = glade_widget_adaptor_create_editable (parent_adapter, GLADE_PAGE_PACKING);
109       gtk_container_add (GTK_CONTAINER (self->packing_dock), GTK_WIDGET (editable));
110       glade_editable_load (editable, widget);
111       gtk_widget_show (GTK_WIDGET (editable));
112     }
113 
114   /* Common page */
115   editable = glade_widget_adaptor_create_editable (adapter, GLADE_PAGE_COMMON);
116   gtk_container_add (GTK_CONTAINER (self->common_dock), GTK_WIDGET (editable));
117   glade_editable_load (editable, widget);
118   gtk_widget_show (GTK_WIDGET (editable));
119 
120   /* A11y page */
121   editable = glade_widget_adaptor_create_editable (adapter, GLADE_PAGE_ATK);
122   gtk_container_add (GTK_CONTAINER (self->a11y_dock), GTK_WIDGET (editable));
123   glade_editable_load (editable, widget);
124   gtk_widget_show (GTK_WIDGET (editable));
125 }
126