1 /*
2 * This file is part of brisk-menu.
3 *
4 * Copyright © 2016-2020 Brisk Menu Developers
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 */
11
12 #define _GNU_SOURCE
13
14 #include "util.h"
15
16 BRISK_BEGIN_PEDANTIC
17 #include "category-button.h"
18 #include "menu-private.h"
19 #include <glib/gi18n.h>
20 #include <gtk/gtk.h>
21 BRISK_END_PEDANTIC
22
23 struct _BriskDashCategoryButtonClass {
24 GtkRadioButtonClass parent_class;
25 };
26
27 /**
28 * BriskDashCategoryButton is the toplevel window type used within the applet.
29 */
30 struct _BriskDashCategoryButton {
31 GtkRadioButton parent;
32 BriskSection *section;
33 GtkWidget *label;
34 };
35
36 G_DEFINE_TYPE(BriskDashCategoryButton, brisk_dash_category_button, GTK_TYPE_RADIO_BUTTON)
37
38 enum { PROP_SECTION = 1, N_PROPS };
39
40 static GParamSpec *obj_properties[N_PROPS] = {
41 NULL,
42 };
43
brisk_dash_category_button_set_property(GObject * object,guint id,const GValue * value,GParamSpec * spec)44 static void brisk_dash_category_button_set_property(GObject *object, guint id, const GValue *value,
45 GParamSpec *spec)
46 {
47 BriskDashCategoryButton *self = BRISK_DASH_CATEGORY_BUTTON(object);
48
49 switch (id) {
50 case PROP_SECTION:
51 self->section = g_value_get_pointer(value);
52 break;
53 default:
54 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, id, spec);
55 break;
56 }
57 }
58
brisk_dash_category_button_get_property(GObject * object,guint id,GValue * value,GParamSpec * spec)59 static void brisk_dash_category_button_get_property(GObject *object, guint id, GValue *value,
60 GParamSpec *spec)
61 {
62 BriskDashCategoryButton *self = BRISK_DASH_CATEGORY_BUTTON(object);
63
64 switch (id) {
65 case PROP_SECTION:
66 g_value_set_pointer(value, self->section);
67 break;
68 default:
69 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, id, spec);
70 break;
71 }
72 }
73
74 /**
75 * brisk_dash_category_button_new:
76 *
77 * Construct a new BriskDashCategoryButton object
78 */
brisk_dash_category_button_new(BriskSection * section)79 GtkWidget *brisk_dash_category_button_new(BriskSection *section)
80 {
81 return g_object_new(BRISK_TYPE_DASH_CATEGORY_BUTTON, "section", section, NULL);
82 }
83
84 /**
85 * brisk_dash_category_button_dispose:
86 *
87 * Clean up a BriskDashCategoryButton instance
88 */
brisk_dash_category_button_dispose(GObject * obj)89 static void brisk_dash_category_button_dispose(GObject *obj)
90 {
91 BriskDashCategoryButton *self = BRISK_DASH_CATEGORY_BUTTON(obj);
92
93 g_clear_object(&self->section);
94
95 G_OBJECT_CLASS(brisk_dash_category_button_parent_class)->dispose(obj);
96 }
97
98 /**
99 * Handle constructor specifics for our button
100 */
brisk_dash_category_button_constructed(GObject * obj)101 static void brisk_dash_category_button_constructed(GObject *obj)
102 {
103 BriskDashCategoryButton *self = NULL;
104
105 self = BRISK_DASH_CATEGORY_BUTTON(obj);
106
107 /* If we have a section, use it, otherwise we're a special "All" button */
108 if (self->section) {
109 gtk_label_set_label(GTK_LABEL(self->label), brisk_section_get_name(self->section));
110 } else {
111 gtk_label_set_label(GTK_LABEL(self->label), _("All"));
112 }
113
114 G_OBJECT_CLASS(brisk_dash_category_button_parent_class)->constructed(obj);
115 }
116
117 /**
118 * brisk_dash_category_button_class_init:
119 *
120 * Handle class initialisation
121 */
brisk_dash_category_button_class_init(BriskDashCategoryButtonClass * klazz)122 static void brisk_dash_category_button_class_init(BriskDashCategoryButtonClass *klazz)
123 {
124 GObjectClass *obj_class = G_OBJECT_CLASS(klazz);
125
126 /* gobject vtable hookup */
127 obj_class->dispose = brisk_dash_category_button_dispose;
128 obj_class->set_property = brisk_dash_category_button_set_property;
129 obj_class->get_property = brisk_dash_category_button_get_property;
130 obj_class->constructed = brisk_dash_category_button_constructed;
131
132 obj_properties[PROP_SECTION] = g_param_spec_pointer("section",
133 "The BriskSection",
134 "Section that this category represents",
135 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
136 g_object_class_install_properties(obj_class, N_PROPS, obj_properties);
137 }
138
139 /**
140 * brisk_dash_category_button_init:
141 *
142 * Handle construction of the BriskDashCategoryButton
143 */
brisk_dash_category_button_init(BriskDashCategoryButton * self)144 static void brisk_dash_category_button_init(BriskDashCategoryButton *self)
145 {
146 GtkStyleContext *style = NULL;
147 GtkWidget *label = NULL;
148 GtkWidget *layout = NULL;
149
150 /* Main layout */
151 layout = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
152 gtk_container_add(GTK_CONTAINER(self), layout);
153
154 /* Display label */
155 label = gtk_label_new("");
156 self->label = label;
157 g_object_set(self->label, "halign", GTK_ALIGN_START, "valign", GTK_ALIGN_CENTER, NULL);
158 gtk_box_pack_start(GTK_BOX(layout), label, TRUE, TRUE, 0);
159
160 /* Look like a button */
161 g_object_set(G_OBJECT(self), "draw-indicator", FALSE, NULL);
162 gtk_widget_set_can_focus(GTK_WIDGET(self), TRUE);
163
164 /* Flatten the button */
165 style = gtk_widget_get_style_context(GTK_WIDGET(self));
166 gtk_style_context_add_class(style, GTK_STYLE_CLASS_FLAT);
167 gtk_style_context_add_class(style, "dash-category-button");
168 }
169
170 /*
171 * Editor modelines - https://www.wireshark.org/tools/modelines.html
172 *
173 * Local variables:
174 * c-basic-offset: 8
175 * tab-width: 8
176 * indent-tabs-mode: nil
177 * End:
178 *
179 * vi: set shiftwidth=8 tabstop=8 expandtab:
180 * :indentSize=8:tabSize=8:noTabs=true:
181 */
182