~ubuntu-branches/ubuntu/trusty/unity-control-center/trusty

« back to all changes in this revision

Viewing changes to panels/wacom/cc-wacom-nav-button.c

  • Committer: Package Import Robot
  • Author(s): Robert Ancell
  • Date: 2014-01-08 16:29:18 UTC
  • Revision ID: package-import@ubuntu.com-20140108162918-g29dd08tr913y2qh
Tags: upstream-14.04.0
ImportĀ upstreamĀ versionĀ 14.04.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright Ā© 2011 Red Hat, Inc.
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License as published by
 
6
 * the Free Software Foundation; either version 2 of the License, or
 
7
 * (at your option) any later version.
 
8
 *
 
9
 * This program 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
 
12
 * GNU General Public License for more details.
 
13
 *
 
14
 * You should have received a copy of the GNU General Public License
 
15
 * along with this program; if not, write to the Free Software
 
16
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
17
 *
 
18
 * Authors: Bastien Nocera <hadess@hadess.net>
 
19
 *
 
20
 */
 
21
 
 
22
#include <config.h>
 
23
 
 
24
#include <glib/gi18n.h>
 
25
#include <gtk/gtk.h>
 
26
 
 
27
#include "cc-wacom-nav-button.h"
 
28
 
 
29
G_DEFINE_TYPE (CcWacomNavButton, cc_wacom_nav_button, GTK_TYPE_BOX)
 
30
 
 
31
#define WACOM_NAV_BUTTON_PRIVATE(o) \
 
32
  (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_WACOM_NAV_BUTTON, CcWacomNavButtonPrivate))
 
33
 
 
34
struct _CcWacomNavButtonPrivate
 
35
{
 
36
        GtkNotebook *notebook;
 
37
        GtkWidget   *label;
 
38
        GtkWidget   *prev;
 
39
        GtkWidget   *next;
 
40
        guint        page_added_id;
 
41
        guint        page_removed_id;
 
42
        guint        page_switched_id;
 
43
        gboolean     ignore_first_page;
 
44
};
 
45
 
 
46
enum {
 
47
        PROP_0,
 
48
        PROP_NOTEBOOK,
 
49
        PROP_IGNORE_FIRST
 
50
};
 
51
 
 
52
static void
 
53
cc_wacom_nav_button_update (CcWacomNavButton *nav)
 
54
{
 
55
        CcWacomNavButtonPrivate *priv = nav->priv;
 
56
        int num_pages;
 
57
        int current_page;
 
58
        char *text;
 
59
 
 
60
        if (priv->notebook == NULL) {
 
61
                gtk_widget_hide (GTK_WIDGET (nav));
 
62
                return;
 
63
        }
 
64
 
 
65
        num_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (priv->notebook));
 
66
        if (num_pages == 0)
 
67
                return;
 
68
        if (priv->ignore_first_page && num_pages == 1)
 
69
                return;
 
70
 
 
71
        if (priv->ignore_first_page)
 
72
                num_pages--;
 
73
 
 
74
        g_assert (num_pages >= 1);
 
75
 
 
76
        if (num_pages == 1)
 
77
                gtk_widget_hide (GTK_WIDGET (nav));
 
78
        else
 
79
                gtk_widget_show (GTK_WIDGET (nav));
 
80
 
 
81
        current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->notebook));
 
82
        if (current_page < 0)
 
83
                return;
 
84
        if (priv->ignore_first_page)
 
85
                current_page--;
 
86
        gtk_widget_set_sensitive (priv->prev, current_page == 0 ? FALSE : TRUE);
 
87
        gtk_widget_set_sensitive (priv->next, current_page + 1 == num_pages ? FALSE : TRUE);
 
88
 
 
89
        text = g_strdup_printf (_("%d of %d"),
 
90
                                current_page + 1,
 
91
                                num_pages);
 
92
        gtk_label_set_text (GTK_LABEL (priv->label), text);
 
93
}
 
94
 
 
95
static void
 
96
pages_changed (GtkNotebook      *notebook,
 
97
               GtkWidget        *child,
 
98
               guint             page_num,
 
99
               CcWacomNavButton *nav)
 
100
{
 
101
        cc_wacom_nav_button_update (nav);
 
102
}
 
103
 
 
104
static void
 
105
page_switched (GtkNotebook      *notebook,
 
106
               GParamSpec       *pspec,
 
107
               CcWacomNavButton *nav)
 
108
{
 
109
        cc_wacom_nav_button_update (nav);
 
110
}
 
111
 
 
112
static void
 
113
next_clicked (GtkButton        *button,
 
114
              CcWacomNavButton *nav)
 
115
{
 
116
        int current_page;
 
117
 
 
118
        current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (nav->priv->notebook));
 
119
        current_page++;
 
120
        gtk_notebook_set_current_page (GTK_NOTEBOOK (nav->priv->notebook), current_page);
 
121
}
 
122
 
 
123
static void
 
124
prev_clicked (GtkButton        *button,
 
125
              CcWacomNavButton *nav)
 
126
{
 
127
        int current_page;
 
128
 
 
129
        current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (nav->priv->notebook));
 
130
        current_page--;
 
131
        gtk_notebook_set_current_page (GTK_NOTEBOOK (nav->priv->notebook), current_page--);
 
132
}
 
133
 
 
134
static void
 
135
cc_wacom_nav_button_set_property (GObject      *object,
 
136
                                  guint         property_id,
 
137
                                  const GValue *value,
 
138
                                  GParamSpec   *pspec)
 
139
{
 
140
        CcWacomNavButton *nav = CC_WACOM_NAV_BUTTON (object);
 
141
        CcWacomNavButtonPrivate *priv = nav->priv;
 
142
 
 
143
        switch (property_id) {
 
144
        case PROP_NOTEBOOK:
 
145
                if (priv->notebook) {
 
146
                        g_signal_handler_disconnect (priv->notebook, priv->page_added_id);
 
147
                        g_signal_handler_disconnect (priv->notebook, priv->page_removed_id);
 
148
                        g_signal_handler_disconnect (priv->notebook, priv->page_switched_id);
 
149
                        g_object_unref (priv->notebook);
 
150
                }
 
151
                priv->notebook = g_value_dup_object (value);
 
152
                priv->page_added_id = g_signal_connect (G_OBJECT (priv->notebook), "page-added",
 
153
                                                        G_CALLBACK (pages_changed), nav);
 
154
                priv->page_removed_id = g_signal_connect (G_OBJECT (priv->notebook), "page-removed",
 
155
                                                          G_CALLBACK (pages_changed), nav);
 
156
                priv->page_switched_id = g_signal_connect (G_OBJECT (priv->notebook), "notify::page",
 
157
                                                           G_CALLBACK (page_switched), nav);
 
158
                cc_wacom_nav_button_update (nav);
 
159
                break;
 
160
        case PROP_IGNORE_FIRST:
 
161
                priv->ignore_first_page = g_value_get_boolean (value);
 
162
                cc_wacom_nav_button_update (nav);
 
163
                break;
 
164
        default:
 
165
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 
166
        }
 
167
}
 
168
 
 
169
static void
 
170
cc_wacom_nav_button_dispose (GObject *object)
 
171
{
 
172
        CcWacomNavButtonPrivate *priv = CC_WACOM_NAV_BUTTON (object)->priv;
 
173
 
 
174
        if (priv->notebook) {
 
175
                g_signal_handler_disconnect (priv->notebook, priv->page_added_id);
 
176
                priv->page_added_id = 0;
 
177
                g_signal_handler_disconnect (priv->notebook, priv->page_removed_id);
 
178
                priv->page_removed_id = 0;
 
179
                g_signal_handler_disconnect (priv->notebook, priv->page_switched_id);
 
180
                priv->page_switched_id = 0;
 
181
                g_object_unref (priv->notebook);
 
182
                priv->notebook = NULL;
 
183
        }
 
184
 
 
185
        G_OBJECT_CLASS (cc_wacom_nav_button_parent_class)->dispose (object);
 
186
}
 
187
 
 
188
static void
 
189
cc_wacom_nav_button_class_init (CcWacomNavButtonClass *klass)
 
190
{
 
191
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
192
 
 
193
        g_type_class_add_private (klass, sizeof (CcWacomNavButtonPrivate));
 
194
 
 
195
        object_class->set_property = cc_wacom_nav_button_set_property;
 
196
        object_class->dispose = cc_wacom_nav_button_dispose;
 
197
 
 
198
        g_object_class_install_property (object_class, PROP_NOTEBOOK,
 
199
                                         g_param_spec_object ("notebook", "notebook", "notebook",
 
200
                                                              GTK_TYPE_NOTEBOOK,
 
201
                                                              G_PARAM_WRITABLE));
 
202
        g_object_class_install_property (object_class, PROP_IGNORE_FIRST,
 
203
                                         g_param_spec_boolean ("ignore-first", "ignore-first", "ignore-first",
 
204
                                                               FALSE,
 
205
                                                               G_PARAM_WRITABLE));
 
206
}
 
207
 
 
208
static void
 
209
cc_wacom_nav_button_init (CcWacomNavButton *self)
 
210
{
 
211
        CcWacomNavButtonPrivate *priv;
 
212
        GtkStyleContext *context;
 
213
        GtkWidget *image, *box;
 
214
 
 
215
        priv = self->priv = WACOM_NAV_BUTTON_PRIVATE (self);
 
216
 
 
217
        /* Label */
 
218
        priv->label = gtk_label_new (NULL);
 
219
        gtk_style_context_add_class (gtk_widget_get_style_context (priv->label), "dim-label");
 
220
        gtk_box_pack_start (GTK_BOX (self), priv->label,
 
221
                            FALSE, FALSE, 8);
 
222
 
 
223
        box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
224
        context = gtk_widget_get_style_context (GTK_WIDGET (box));
 
225
        gtk_style_context_add_class (context, GTK_STYLE_CLASS_LINKED);
 
226
        gtk_box_pack_start (GTK_BOX (self), box,
 
227
                            FALSE, FALSE, 0);
 
228
 
 
229
        /* Prev button */
 
230
        priv->prev = gtk_button_new ();
 
231
        image = gtk_image_new_from_icon_name ("go-previous-symbolic", GTK_ICON_SIZE_MENU);
 
232
        gtk_container_add (GTK_CONTAINER (priv->prev), image);
 
233
        g_signal_connect (G_OBJECT (priv->prev), "clicked",
 
234
                          G_CALLBACK (prev_clicked), self);
 
235
        gtk_widget_set_valign (priv->prev, GTK_ALIGN_CENTER);
 
236
 
 
237
        /* Next button */
 
238
        priv->next = gtk_button_new ();
 
239
        image = gtk_image_new_from_icon_name ("go-next-symbolic", GTK_ICON_SIZE_MENU);
 
240
        gtk_container_add (GTK_CONTAINER (priv->next), image);
 
241
        g_signal_connect (G_OBJECT (priv->next), "clicked",
 
242
                          G_CALLBACK (next_clicked), self);
 
243
        gtk_widget_set_valign (priv->next, GTK_ALIGN_CENTER);
 
244
 
 
245
        gtk_box_pack_start (GTK_BOX (box), priv->prev,
 
246
                            FALSE, FALSE, 0);
 
247
        gtk_box_pack_start (GTK_BOX (box), priv->next,
 
248
                            FALSE, FALSE, 0);
 
249
 
 
250
        gtk_widget_show (priv->label);
 
251
        gtk_widget_show_all (box);
 
252
}
 
253
 
 
254
GtkWidget *
 
255
cc_wacom_nav_button_new (void)
 
256
{
 
257
        return GTK_WIDGET (g_object_new (CC_TYPE_WACOM_NAV_BUTTON, NULL));
 
258
}