OSDN Git Service

29a875a6b0f754a32d8068274d2197786633b484
[eb123/eb123.git] / src / builder.c
1
2 #include "defs.h"
3
4 #include "builder.h"
5
6 G_DEFINE_TYPE(Builder, builder, GTK_TYPE_BUILDER);
7
8 Builder *_builder = NULL;
9
10 static void builder_class_init(BuilderClass *klass)
11 {
12 }
13
14 static void builder_init(Builder *self)
15 {
16     //self->b = gtk_builder_new();
17     builder_load(self);
18     _builder = self;
19 }
20
21 static int builder_load_glade_xml(Builder *self, gchar *dir)
22 {
23     gchar *fname = g_build_filename(dir, "eb123.glade", NULL);
24     int res = gtk_builder_add_from_file(GTK_BUILDER(self), fname, NULL);
25     g_free(fname);
26     return res;
27 }
28
29 void builder_load(Builder *self)
30 {
31     int res = builder_load_glade_xml(self, "");
32     if(!res)
33     {
34 #ifdef EB123_DATADIR
35         res = builder_load_glade_xml(self, EB123_DATADIR);
36 #endif
37     }
38     if(!res)
39     {
40         g_printf("failed to load glade ui\n");
41         gtk_main_quit();
42     }
43 }
44
45 void builder_grab_focus(Builder *self, gchar *name)
46 {
47     GtkWidget *w = GTK_WIDGET(gtk_builder_get_object(GTK_BUILDER(self), name));
48     if(w)
49     {
50         gtk_widget_grab_focus(w);
51     }
52 }
53
54 void builder_set_visible(Builder *self, gchar *name, gboolean visible)
55 {
56     GtkWidget *w = GTK_WIDGET(gtk_builder_get_object(GTK_BUILDER(self), name));
57     if(w)
58     {
59         gtk_widget_set_visible(w, visible);
60     }
61 }
62
63 gint builder_get_int(Builder *self, const gchar *name)
64 {
65     gint ret = 0;
66     GtkWidget *w = GTK_WIDGET(gtk_builder_get_object(GTK_BUILDER(self), name));
67     if(GTK_IS_SPIN_BUTTON(w))
68     {
69         ret = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(w));
70     }
71     if(GTK_IS_COMBO_BOX(w))
72     {
73         ret = gtk_combo_box_get_active(GTK_COMBO_BOX(w));
74     }
75     if(GTK_IS_TOGGLE_BUTTON(w))
76     {
77         ret = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w));
78     }
79     return ret;
80 }
81
82 void builder_set_int(Builder *self, const gchar *name, gint value)
83 {
84     GtkWidget *w = GTK_WIDGET(gtk_builder_get_object(GTK_BUILDER(self), name));
85     if(GTK_IS_SPIN_BUTTON(w))
86     {
87         gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), value);
88     }
89     if(GTK_IS_COMBO_BOX(w))
90     {
91         gtk_combo_box_set_active(GTK_COMBO_BOX(w), value);
92     }
93     if(GTK_IS_TOGGLE_BUTTON(w))
94     {
95         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), value);
96     }
97     if(GTK_IS_ENTRY(w))
98     {
99         gchar buf[16];
100         sprintf(buf, "%d", value);
101         return gtk_entry_set_text(GTK_ENTRY(w), (value >= 0) ? buf : "");
102     }
103 }
104
105 const gchar* builder_get_str(Builder *self, const gchar *name)
106 {
107     GtkWidget *w = GTK_WIDGET(gtk_builder_get_object(GTK_BUILDER(self), name));
108     if(GTK_IS_ENTRY(w))
109     {
110         return gtk_entry_get_text(GTK_ENTRY(w));
111     }
112     if(GTK_IS_COMBO_BOX(w))
113     {
114         GtkComboBox *combo = GTK_COMBO_BOX(w);
115         if(gtk_combo_box_get_has_entry(combo))
116         {
117             return gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(combo))));
118         }
119         if(GTK_IS_COMBO_BOX_TEXT(w))
120         {
121             return gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(w));
122         }
123         gint n = gtk_combo_box_get_active(GTK_COMBO_BOX(w));
124         if(n >= 0)
125         {
126             GtkTreeModel *m = gtk_combo_box_get_model(GTK_COMBO_BOX(w));
127             if(GTK_IS_LIST_STORE(m))
128             {
129                 GtkTreeIter iter;
130                 if(gtk_tree_model_iter_nth_child(m, &iter, NULL, n))
131                 {
132                     gchar *str;
133                     gtk_tree_model_get(m, &iter, 0, &str, -1);
134                     return str;
135                 }
136             }
137         }
138     }
139     if(GTK_IS_COLOR_BUTTON(w))
140     {
141         GdkColor color;
142         gtk_color_button_get_color(GTK_COLOR_BUTTON(w), &color);
143         return gtk_color_selection_palette_to_string(&color, 1);
144     }
145     if(GTK_IS_FONT_BUTTON(w))
146     {
147         return gtk_font_button_get_font_name(GTK_FONT_BUTTON(w));
148     }
149     if(GTK_IS_LABEL(w))
150     {
151         return gtk_label_get_text(GTK_LABEL(w));
152     }
153     return NULL;
154 }
155
156 void builder_set_str(Builder *self, const gchar *name, const gchar *value)
157 {
158     GtkWidget *w = GTK_WIDGET(gtk_builder_get_object(GTK_BUILDER(self), name));
159     if(GTK_IS_ENTRY(w))
160     {
161         gtk_entry_set_text(GTK_ENTRY(w), value);
162     }
163     if(GTK_IS_COLOR_BUTTON(w))
164     {
165         GdkColor color;
166         gdk_color_parse(value, &color);
167         gtk_color_button_set_color(GTK_COLOR_BUTTON(w), &color);
168     }
169     if(GTK_IS_LABEL(w))
170     {
171         gtk_label_set_text(GTK_LABEL(w), value);
172     }
173     if(GTK_IS_FONT_BUTTON(w))
174     {
175         gtk_font_button_set_font_name(GTK_FONT_BUTTON(w), value);
176     }
177     if(GTK_IS_COMBO_BOX(w))
178     {
179         if(gtk_combo_box_get_has_entry(GTK_COMBO_BOX(w)))
180         {
181             GtkEntry *entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(w)));
182             gtk_entry_set_text(entry, value);
183         }
184     }
185 }
186
187 void builder_install_text_cellrenderer(Builder *self, gchar *box)
188 {
189     GtkWidget *w = GTK_WIDGET(gtk_builder_get_object(GTK_BUILDER(self), box));
190     if((GTK_IS_COMBO_BOX(w) || GTK_IS_TREE_VIEW(w)) && !GTK_IS_COMBO_BOX_TEXT(w))
191     {
192         GtkCellRenderer *cell = gtk_cell_renderer_text_new();
193         gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(w), cell, TRUE);
194         gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(w), cell, "text", 0, NULL);
195     }
196 }
197