1 | /* |
2 | * Copyright (c) 2014 Red Hat, Inc. |
3 | * |
4 | * This library is free software; you can redistribute it and/or |
5 | * modify it under the terms of the GNU Lesser General Public |
6 | * License as published by the Free Software Foundation; either |
7 | * version 2 of the License, or (at your option) any later version. |
8 | * |
9 | * This library is distributed in the hope that it will be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | * Lesser General Public License for more details. |
13 | * |
14 | * You should have received a copy of the GNU Lesser General Public |
15 | * License along with this library. If not, see <http://www.gnu.org/licenses/>. |
16 | */ |
17 | |
18 | #include "config.h" |
19 | #include <glib/gi18n-lib.h> |
20 | |
21 | #include "magnifier.h" |
22 | |
23 | #include "gtkmagnifierprivate.h" |
24 | |
25 | #include "gtklabel.h" |
26 | #include "gtkadjustment.h" |
27 | #include "gtkstack.h" |
28 | |
29 | enum |
30 | { |
31 | PROP_0, |
32 | PROP_ADJUSTMENT |
33 | }; |
34 | |
35 | struct _GtkInspectorMagnifierPrivate |
36 | { |
37 | GtkWidget *object; |
38 | GtkWidget *magnifier; |
39 | GtkAdjustment *adjustment; |
40 | }; |
41 | |
42 | G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorMagnifier, gtk_inspector_magnifier, GTK_TYPE_BOX) |
43 | |
44 | static void |
45 | gtk_inspector_magnifier_init (GtkInspectorMagnifier *sl) |
46 | { |
47 | sl->priv = gtk_inspector_magnifier_get_instance_private (self: sl); |
48 | gtk_widget_init_template (GTK_WIDGET (sl)); |
49 | } |
50 | |
51 | void |
52 | gtk_inspector_magnifier_set_object (GtkInspectorMagnifier *sl, |
53 | GObject *object) |
54 | { |
55 | GtkWidget *stack; |
56 | GtkStackPage *page; |
57 | |
58 | stack = gtk_widget_get_parent (GTK_WIDGET (sl)); |
59 | page = gtk_stack_get_page (GTK_STACK (stack), GTK_WIDGET (sl)); |
60 | |
61 | sl->priv->object = NULL; |
62 | |
63 | if (!GTK_IS_WIDGET (object) || !gtk_widget_is_visible (GTK_WIDGET (object))) |
64 | { |
65 | g_object_set (object: page, first_property_name: "visible" , FALSE, NULL); |
66 | _gtk_magnifier_set_inspected (GTK_MAGNIFIER (sl->priv->magnifier), NULL); |
67 | return; |
68 | } |
69 | |
70 | g_object_set (object: page, first_property_name: "visible" , TRUE, NULL); |
71 | |
72 | sl->priv->object = GTK_WIDGET (object); |
73 | |
74 | _gtk_magnifier_set_inspected (GTK_MAGNIFIER (sl->priv->magnifier), GTK_WIDGET (object)); |
75 | _gtk_magnifier_set_coords (GTK_MAGNIFIER (sl->priv->magnifier), x: 0, y: 0); |
76 | } |
77 | |
78 | static void |
79 | get_property (GObject *object, |
80 | guint param_id, |
81 | GValue *value, |
82 | GParamSpec *pspec) |
83 | { |
84 | GtkInspectorMagnifier *sl = GTK_INSPECTOR_MAGNIFIER (object); |
85 | |
86 | switch (param_id) |
87 | { |
88 | case PROP_ADJUSTMENT: |
89 | g_value_take_object (value, v_object: sl->priv->adjustment); |
90 | break; |
91 | |
92 | default: |
93 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); |
94 | break; |
95 | } |
96 | } |
97 | |
98 | static void |
99 | set_property (GObject *object, |
100 | guint param_id, |
101 | const GValue *value, |
102 | GParamSpec *pspec) |
103 | { |
104 | GtkInspectorMagnifier *sl = GTK_INSPECTOR_MAGNIFIER (object); |
105 | |
106 | switch (param_id) |
107 | { |
108 | case PROP_ADJUSTMENT: |
109 | sl->priv->adjustment = g_value_get_object (value); |
110 | break; |
111 | |
112 | default: |
113 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); |
114 | break; |
115 | } |
116 | } |
117 | |
118 | static void |
119 | constructed (GObject *object) |
120 | { |
121 | GtkInspectorMagnifier *sl = GTK_INSPECTOR_MAGNIFIER (object); |
122 | |
123 | g_object_bind_property (source: sl->priv->adjustment, source_property: "value" , |
124 | target: sl->priv->magnifier, target_property: "magnification" , |
125 | flags: G_BINDING_SYNC_CREATE); |
126 | } |
127 | |
128 | static void |
129 | gtk_inspector_magnifier_class_init (GtkInspectorMagnifierClass *klass) |
130 | { |
131 | GObjectClass *object_class = G_OBJECT_CLASS (klass); |
132 | GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); |
133 | |
134 | object_class->get_property = get_property; |
135 | object_class->set_property = set_property; |
136 | object_class->constructed = constructed; |
137 | |
138 | g_object_class_install_property (oclass: object_class, property_id: PROP_ADJUSTMENT, |
139 | pspec: g_param_spec_object (name: "adjustment" , NULL, NULL, |
140 | GTK_TYPE_ADJUSTMENT, flags: G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); |
141 | |
142 | gtk_widget_class_set_template_from_resource (widget_class, resource_name: "/org/gtk/libgtk/inspector/magnifier.ui" ); |
143 | gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMagnifier, magnifier); |
144 | } |
145 | |
146 | // vim: set et sw=2 ts=2: |
147 | |