#include "headerbar.h"
#include "button.h"
#include "menu.h"
#if GTK_CHECK_VERSION(
3,
10,
0)
void ui_fill_headerbar(UiObject *obj, GtkWidget *headerbar) {
CxList *left_defaults = uic_get_toolbar_defaults(
UI_TOOLBAR_LEFT);
CxList *center_defaults = uic_get_toolbar_defaults(
UI_TOOLBAR_CENTER);
CxList *right_defaults = uic_get_toolbar_defaults(
UI_TOOLBAR_RIGHT);
ui_headerbar_add_items(obj, headerbar, left_defaults,
UI_TOOLBAR_LEFT);
ui_headerbar_add_items(obj, headerbar, center_defaults,
UI_TOOLBAR_CENTER);
UiToolbarMenuItem *appmenu = uic_get_appmenu();
if(appmenu) {
ui_add_headerbar_menu(headerbar,
NULL, appmenu, obj,
UI_TOOLBAR_RIGHT);
}
ui_headerbar_add_items(obj, headerbar, right_defaults,
UI_TOOLBAR_RIGHT);
}
static void create_item(UiObject *obj, GtkWidget *headerbar, GtkWidget *box, UiToolbarItemI *i,
enum UiToolbarPos pos) {
switch(i->type) {
case UI_TOOLBAR_ITEM: {
ui_add_headerbar_item(headerbar, box, (UiToolbarItem*)i, obj, pos);
break;
}
case UI_TOOLBAR_TOGGLEITEM: {
ui_add_headerbar_toggleitem(headerbar, box, (UiToolbarToggleItem*)i, obj, pos);
break;
}
case UI_TOOLBAR_MENU: {
ui_add_headerbar_menu(headerbar, box, (UiToolbarMenuItem*)i, obj, pos);
break;
}
default: fprintf(stderr,
"toolbar item type unimplemented: %d\n", (
int)i->type);
}
}
static void headerbar_add(GtkWidget *headerbar, GtkWidget *box, GtkWidget *item,
enum UiToolbarPos pos) {
switch(pos) {
case UI_TOOLBAR_LEFT: {
UI_HEADERBAR_PACK_START(headerbar, item);
break;
}
case UI_TOOLBAR_CENTER: {
#if GTK_MAJOR_VERSION >=
4
gtk_box_append(
GTK_BOX(box), item);
#else
gtk_box_pack_start(
GTK_BOX(box), item,
0,
0,
0);
#endif
break;
}
case UI_TOOLBAR_RIGHT: {
UI_HEADERBAR_PACK_END(headerbar, item);
break;
}
}
}
void ui_headerbar_add_items(UiObject *obj, GtkWidget *headerbar, CxList *items,
enum UiToolbarPos pos) {
GtkWidget *box =
NULL;
if(pos ==
UI_TOOLBAR_CENTER && cxListSize(items) >
0) {
box = gtk_box_new(
GTK_ORIENTATION_HORIZONTAL,
6);
UI_HEADERBAR_SET_TITLE_WIDGET(headerbar, box);
}
CxIterator i = pos ==
UI_TOOLBAR_RIGHT ? cxListBackwardsIterator(items) : cxListIterator(items);
cx_foreach(
char*, def, i) {
UiToolbarItemI* item = uic_toolbar_get_item(def);
if (!item) {
fprintf(stderr,
"unknown toolbar item: %s\n", def);
continue;
}
create_item(obj, headerbar, box, item, pos);
}
}
void ui_add_headerbar_item(
GtkWidget *headerbar,
GtkWidget *box,
UiToolbarItem *item,
UiObject *obj,
enum UiToolbarPos pos)
{
GtkWidget *button = ui_create_button(obj, item->args.label, item->args.icon, item->args.onclick, item->args.onclickdata,
0,
FALSE);
ui_set_widget_groups(obj->ctx, button, item->args.groups);
WIDGET_ADD_CSS_CLASS(button,
"flat");
headerbar_add(headerbar, box, button, pos);
}
void ui_add_headerbar_toggleitem(
GtkWidget *headerbar,
GtkWidget *box,
UiToolbarToggleItem *item,
UiObject *obj,
enum UiToolbarPos pos)
{
GtkWidget *button = gtk_toggle_button_new();
ui_set_widget_groups(obj->ctx, button, item->args.groups);
WIDGET_ADD_CSS_CLASS(button,
"flat");
ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, item->args.varname,
NULL, item->args.onchange, item->args.onchangedata,
0);
headerbar_add(headerbar, box, button, pos);
}
void ui_add_headerbar_menu(
GtkWidget *headerbar,
GtkWidget *box,
UiToolbarMenuItem *item,
UiObject *obj,
enum UiToolbarPos pos)
{
#if GTK_MAJOR_VERSION >=
4
GtkWidget *menubutton = gtk_menu_button_new();
if(item->args.label) {
gtk_menu_button_set_label(
GTK_MENU_BUTTON(menubutton), item->args.label);
}
if(item->args.icon) {
gtk_menu_button_set_icon_name(
GTK_MENU_BUTTON(menubutton), item->args.icon);
}
if(!item->args.label && !item->args.icon) {
gtk_menu_button_set_icon_name(
GTK_MENU_BUTTON(menubutton),
"open-menu-symbolic");
}
GMenu *menu = g_menu_new();
ui_gmenu_add_menu_items(menu,
0, &item->menu, obj);
gtk_menu_button_set_menu_model(
GTK_MENU_BUTTON(menubutton),
G_MENU_MODEL(menu));
#else
GtkWidget *menubutton = gtk_menu_button_new();
#endif
headerbar_add(headerbar, box, menubutton, pos);
}
#endif