ui/gtk/headerbar.c

changeset 1194
91696f7fa475
parent 1112
9250601f9d9a
equal deleted inserted replaced
1193:28c603de3f21 1194:91696f7fa475
28 28
29 #include "headerbar.h" 29 #include "headerbar.h"
30 30
31 #include "button.h" 31 #include "button.h"
32 #include "menu.h" 32 #include "menu.h"
33 #include "../ui/widget.h"
34
35 #include <cx/array_list.h>
33 36
34 #include "../ui/properties.h" 37 #include "../ui/properties.h"
35 38
36 #if GTK_CHECK_VERSION(3, 10, 0) 39 #if GTK_CHECK_VERSION(3, 10, 0)
37 40
64 appmenu_pos = UI_TOOLBAR_RIGHTPANEL_RIGHT; 67 appmenu_pos = UI_TOOLBAR_RIGHTPANEL_RIGHT;
65 } 68 }
66 } 69 }
67 70
68 // main toolbar 71 // main toolbar
69 ui_headerbar_add_items(obj, main_headerbar, left_defaults, UI_TOOLBAR_LEFT); 72 ui_headerbar_add_items(obj, main_headerbar, left_defaults, UI_TOOLBAR_LEFT, NULL);
70 ui_headerbar_add_items(obj, main_headerbar, center_defaults, UI_TOOLBAR_CENTER); 73 ui_headerbar_add_items(obj, main_headerbar, center_defaults, UI_TOOLBAR_CENTER, NULL);
71 74
72 if(appmenu && appmenu_pos == UI_TOOLBAR_RIGHT) { 75 if(appmenu && appmenu_pos == UI_TOOLBAR_RIGHT) {
73 ui_add_headerbar_menu(main_headerbar, NULL, appmenu, obj, UI_TOOLBAR_RIGHT); 76 ui_add_headerbar_menu(main_headerbar, NULL, appmenu, obj, UI_TOOLBAR_RIGHT);
74 } 77 }
75 ui_headerbar_add_items(obj, main_headerbar, right_defaults, UI_TOOLBAR_RIGHT); 78 ui_headerbar_add_items(obj, main_headerbar, right_defaults, UI_TOOLBAR_RIGHT, NULL);
76 79
77 // sidebar 80 // sidebar
78 if(sidebar_headerbar) { 81 if(sidebar_headerbar) {
79 // ui_headerbar_add_items pos parameter uses only UI_TOOLBAR_LEFT, UI_TOOLBAR_CENTER, UI_TOOLBAR_RIGHT 82 // ui_headerbar_add_items pos parameter uses only UI_TOOLBAR_LEFT, UI_TOOLBAR_CENTER, UI_TOOLBAR_RIGHT
80 ui_headerbar_add_items(obj, sidebar_headerbar, sidebar_left_defaults, UI_TOOLBAR_LEFT); 83 ui_headerbar_add_items(obj, sidebar_headerbar, sidebar_left_defaults, UI_TOOLBAR_LEFT, NULL);
81 84
82 if(appmenu && appmenu_pos == UI_TOOLBAR_SIDEBAR_RIGHT) { 85 if(appmenu && appmenu_pos == UI_TOOLBAR_SIDEBAR_RIGHT) {
83 ui_add_headerbar_menu(sidebar_headerbar, NULL, appmenu, obj, UI_TOOLBAR_RIGHT); 86 ui_add_headerbar_menu(sidebar_headerbar, NULL, appmenu, obj, UI_TOOLBAR_RIGHT);
84 } 87 }
85 ui_headerbar_add_items(obj, sidebar_headerbar, sidebar_right_defaults, UI_TOOLBAR_RIGHT); 88 ui_headerbar_add_items(obj, sidebar_headerbar, sidebar_right_defaults, UI_TOOLBAR_RIGHT, NULL);
86 } 89 }
87 90
88 // right panel 91 // right panel
89 if(right_headerbar) { 92 if(right_headerbar) {
90 ui_headerbar_add_items(obj, right_headerbar, rightpanel_left_defaults, UI_TOOLBAR_LEFT); 93 // also add central toolbar items, in case the central pane is hidden
91 ui_headerbar_add_items(obj, right_headerbar, rightpanel_center_defaults, UI_TOOLBAR_CENTER); 94 CxList *backup_toolbar_widgets = cxArrayListCreate(obj->ctx->allocator, CX_STORE_POINTERS, 16);
95 ui_headerbar_add_items(obj, right_headerbar, left_defaults, UI_TOOLBAR_LEFT, backup_toolbar_widgets);
96 ui_headerbar_add_items(obj, right_headerbar, center_defaults, UI_TOOLBAR_LEFT, backup_toolbar_widgets);
97 ui_headerbar_add_items(obj, right_headerbar, right_defaults, UI_TOOLBAR_LEFT, backup_toolbar_widgets);
98 CxIterator i = cxListIterator(backup_toolbar_widgets);
99 cx_foreach(GtkWidget *, w, i) {
100 ui_set_visible(w, FALSE);
101 }
102 g_object_set_data(G_OBJECT(obj->widget), "ui_toolbar_center_backup", backup_toolbar_widgets);
103
104 // main items for the right panel
105 ui_headerbar_add_items(obj, right_headerbar, rightpanel_left_defaults, UI_TOOLBAR_LEFT, NULL);
106 ui_headerbar_add_items(obj, right_headerbar, rightpanel_center_defaults, UI_TOOLBAR_CENTER, NULL);
92 107
93 if(appmenu && appmenu_pos == UI_TOOLBAR_RIGHTPANEL_RIGHT) { 108 if(appmenu && appmenu_pos == UI_TOOLBAR_RIGHTPANEL_RIGHT) {
94 ui_add_headerbar_menu(right_headerbar, NULL, appmenu, obj, UI_TOOLBAR_RIGHT); 109 ui_add_headerbar_menu(right_headerbar, NULL, appmenu, obj, UI_TOOLBAR_RIGHT);
95 } 110 }
96 ui_headerbar_add_items(obj, right_headerbar, rightpanel_right_defaults, UI_TOOLBAR_RIGHT); 111 ui_headerbar_add_items(obj, right_headerbar, rightpanel_right_defaults, UI_TOOLBAR_RIGHT, NULL);
97 } 112 }
98 } 113 }
99 114
100 static void create_item(UiObject *obj, GtkWidget *headerbar, GtkWidget *box, UiToolbarItemI *i, enum UiToolbarPos pos) { 115 static GtkWidget* create_item(UiObject *obj, GtkWidget *headerbar, GtkWidget *box, UiToolbarItemI *i, enum UiToolbarPos pos) {
101 switch(i->type) { 116 switch(i->type) {
102 case UI_TOOLBAR_ITEM: { 117 case UI_TOOLBAR_ITEM: {
103 ui_add_headerbar_item(headerbar, box, (UiToolbarItem*)i, obj, pos); 118 return ui_add_headerbar_item(headerbar, box, (UiToolbarItem*)i, obj, pos);
104 break;
105 } 119 }
106 case UI_TOOLBAR_TOGGLEITEM: { 120 case UI_TOOLBAR_TOGGLEITEM: {
107 ui_add_headerbar_toggleitem(headerbar, box, (UiToolbarToggleItem*)i, obj, pos); 121 return ui_add_headerbar_toggleitem(headerbar, box, (UiToolbarToggleItem*)i, obj, pos);
108 break;
109 } 122 }
110 case UI_TOOLBAR_MENU: { 123 case UI_TOOLBAR_MENU: {
111 ui_add_headerbar_menu(headerbar, box, (UiToolbarMenuItem*)i, obj, pos); 124 return ui_add_headerbar_menu(headerbar, box, (UiToolbarMenuItem*)i, obj, pos);
112 break;
113 } 125 }
114 default: fprintf(stderr, "toolbar item type unimplemented: %d\n", (int)i->type); 126 default: fprintf(stderr, "toolbar item type unimplemented: %d\n", (int)i->type);
115 } 127 }
128 return NULL;
116 } 129 }
117 130
118 static void headerbar_add(GtkWidget *headerbar, GtkWidget *box, GtkWidget *item, enum UiToolbarPos pos) { 131 static void headerbar_add(GtkWidget *headerbar, GtkWidget *box, GtkWidget *item, enum UiToolbarPos pos) {
119 switch(pos) { 132 switch(pos) {
120 case UI_TOOLBAR_LEFT: { 133 case UI_TOOLBAR_LEFT: {
135 break; 148 break;
136 } 149 }
137 } 150 }
138 } 151 }
139 152
140 void ui_headerbar_add_items(UiObject *obj, GtkWidget *headerbar, CxList *items, enum UiToolbarPos pos) { 153 void ui_headerbar_add_items(UiObject *obj, GtkWidget *headerbar, CxList *items, enum UiToolbarPos pos, CxList *out_items) {
141 GtkWidget *box = NULL; 154 GtkWidget *box = NULL;
142 155
143 if(pos == UI_TOOLBAR_CENTER && cxListSize(items) > 0) { 156 if(pos == UI_TOOLBAR_CENTER && cxListSize(items) > 0) {
144 box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); 157 box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
145 UI_HEADERBAR_SET_TITLE_WIDGET(headerbar, box); 158 UI_HEADERBAR_SET_TITLE_WIDGET(headerbar, box);
159 if(out_items) {
160 cxListAdd(out_items, box);
161 }
146 } 162 }
147 163
148 CxIterator i = pos == UI_TOOLBAR_RIGHT ? cxListBackwardsIterator(items) : cxListIterator(items); 164 CxIterator i = pos == UI_TOOLBAR_RIGHT ? cxListBackwardsIterator(items) : cxListIterator(items);
149 cx_foreach(char*, def, i) { 165 cx_foreach(char*, def, i) {
150 UiToolbarItemI* item = uic_toolbar_get_item(def); 166 UiToolbarItemI* item = uic_toolbar_get_item(def);
151 if (!item) { 167 if (!item) {
152 fprintf(stderr, "unknown toolbar item: %s\n", def); 168 fprintf(stderr, "unknown toolbar item: %s\n", def);
153 continue; 169 continue;
154 } 170 }
155 create_item(obj, headerbar, box, item, pos); 171 GtkWidget *item_widget = create_item(obj, headerbar, box, item, pos);
156 } 172 if(out_items && !box) {
157 } 173 cxListAdd(out_items, item_widget);
158 174 }
159 void ui_add_headerbar_item( 175 }
176 }
177
178 GtkWidget* ui_add_headerbar_item(
160 GtkWidget *headerbar, 179 GtkWidget *headerbar,
161 GtkWidget *box, 180 GtkWidget *box,
162 UiToolbarItem *item, 181 UiToolbarItem *item,
163 UiObject *obj, 182 UiObject *obj,
164 enum UiToolbarPos pos) 183 enum UiToolbarPos pos)
166 GtkWidget *button = ui_create_button(obj, item->args.label, item->args.icon, item->args.tooltip, item->args.onclick, item->args.onclickdata, item->args.action, 0, FALSE); 185 GtkWidget *button = ui_create_button(obj, item->args.label, item->args.icon, item->args.tooltip, item->args.onclick, item->args.onclickdata, item->args.action, 0, FALSE);
167 ui_set_widget_states(obj->ctx, button, item->args.states); 186 ui_set_widget_states(obj->ctx, button, item->args.states);
168 ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states); 187 ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states);
169 WIDGET_ADD_CSS_CLASS(button, "flat"); 188 WIDGET_ADD_CSS_CLASS(button, "flat");
170 headerbar_add(headerbar, box, button, pos); 189 headerbar_add(headerbar, box, button, pos);
171 } 190 return button;
172 191 }
173 void ui_add_headerbar_toggleitem( 192
193 GtkWidget* ui_add_headerbar_toggleitem(
174 GtkWidget *headerbar, 194 GtkWidget *headerbar,
175 GtkWidget *box, 195 GtkWidget *box,
176 UiToolbarToggleItem *item, 196 UiToolbarToggleItem *item,
177 UiObject *obj, 197 UiObject *obj,
178 enum UiToolbarPos pos) 198 enum UiToolbarPos pos)
181 ui_set_widget_states(obj->ctx, button, item->args.states); 201 ui_set_widget_states(obj->ctx, button, item->args.states);
182 ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states); 202 ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states);
183 WIDGET_ADD_CSS_CLASS(button, "flat"); 203 WIDGET_ADD_CSS_CLASS(button, "flat");
184 ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, item->args.tooltip, item->args.varname, NULL, item->args.onchange, item->args.onchangedata, item->args.action, 0); 204 ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, item->args.tooltip, item->args.varname, NULL, item->args.onchange, item->args.onchangedata, item->args.action, 0);
185 headerbar_add(headerbar, box, button, pos); 205 headerbar_add(headerbar, box, button, pos);
186 } 206 return button;
187 207 }
188 void ui_add_headerbar_menu( 208
209 GtkWidget* ui_add_headerbar_menu(
189 GtkWidget *headerbar, 210 GtkWidget *headerbar,
190 GtkWidget *box, 211 GtkWidget *box,
191 UiToolbarMenuItem *item, 212 UiToolbarMenuItem *item,
192 UiObject *obj, 213 UiObject *obj,
193 enum UiToolbarPos pos) 214 enum UiToolbarPos pos)
220 gtk_menu_button_set_popup(GTK_MENU_BUTTON(menubutton), menu); 241 gtk_menu_button_set_popup(GTK_MENU_BUTTON(menubutton), menu);
221 242
222 #endif 243 #endif
223 244
224 headerbar_add(headerbar, box, menubutton, pos); 245 headerbar_add(headerbar, box, menubutton, pos);
246
247 return menubutton;
225 } 248 }
226 249
227 #endif // GTK_CHECK_VERSION(3, 10, 0) 250 #endif // GTK_CHECK_VERSION(3, 10, 0)

mercurial