#include "headerbar.h"
#include "button.h"
#include "menu.h"
#include "../ui/properties.h"
#if GTK_CHECK_VERSION(
3,
10,
0)
void ui_fill_headerbar(UiObject *obj, GtkWidget *sidebar_headerbar, GtkWidget *main_headerbar, GtkWidget *right_headerbar) {
CxList *sidebar_left_defaults = uic_get_toolbar_defaults(
UI_TOOLBAR_SIDEBAR_LEFT);
CxList *sidebar_right_defaults = uic_get_toolbar_defaults(
UI_TOOLBAR_SIDEBAR_RIGHT);
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);
CxList *rightpanel_left_defaults = uic_get_toolbar_defaults(
UI_TOOLBAR_RIGHTPANEL_LEFT);
CxList *rightpanel_center_defaults = uic_get_toolbar_defaults(
UI_TOOLBAR_RIGHTPANEL_CENTER);
CxList *rightpanel_right_defaults = uic_get_toolbar_defaults(
UI_TOOLBAR_RIGHTPANEL_RIGHT);
UiToolbarMenuItem *appmenu = uic_get_appmenu();
const char *appmenu_pos_str = ui_get_property(
"ui.gtk.window.appmenu.position");
int appmenu_pos =
UI_TOOLBAR_RIGHT;
if(sidebar_headerbar) {
appmenu_pos =
UI_TOOLBAR_SIDEBAR_RIGHT;
}
else if(right_headerbar) {
appmenu_pos =
UI_TOOLBAR_RIGHTPANEL_RIGHT;
}
if(appmenu_pos_str) {
if(!strcmp(appmenu_pos_str,
"sidebar") && sidebar_headerbar) {
appmenu_pos =
UI_TOOLBAR_SIDEBAR_RIGHT;
}
else if(!strcmp(appmenu_pos_str,
"main")) {
appmenu_pos =
UI_TOOLBAR_RIGHT;
}
else if(!strcmp(appmenu_pos_str,
"rightpanel") && right_headerbar) {
appmenu_pos =
UI_TOOLBAR_RIGHTPANEL_RIGHT;
}
}
ui_headerbar_add_items(obj, main_headerbar, left_defaults,
UI_TOOLBAR_LEFT);
ui_headerbar_add_items(obj, main_headerbar, center_defaults,
UI_TOOLBAR_CENTER);
if(appmenu && appmenu_pos ==
UI_TOOLBAR_RIGHT) {
ui_add_headerbar_menu(main_headerbar,
NULL, appmenu, obj,
UI_TOOLBAR_RIGHT);
}
ui_headerbar_add_items(obj, main_headerbar, right_defaults,
UI_TOOLBAR_RIGHT);
if(sidebar_headerbar) {
ui_headerbar_add_items(obj, sidebar_headerbar, sidebar_left_defaults,
UI_TOOLBAR_LEFT);
if(appmenu && appmenu_pos ==
UI_TOOLBAR_SIDEBAR_RIGHT) {
ui_add_headerbar_menu(sidebar_headerbar,
NULL, appmenu, obj,
UI_TOOLBAR_RIGHT);
}
ui_headerbar_add_items(obj, sidebar_headerbar, sidebar_right_defaults,
UI_TOOLBAR_RIGHT);
}
if(right_headerbar) {
ui_headerbar_add_items(obj, right_headerbar, rightpanel_left_defaults,
UI_TOOLBAR_LEFT);
ui_headerbar_add_items(obj, right_headerbar, rightpanel_center_defaults,
UI_TOOLBAR_CENTER);
if(appmenu && appmenu_pos ==
UI_TOOLBAR_RIGHTPANEL_RIGHT) {
ui_add_headerbar_menu(right_headerbar,
NULL, appmenu, obj,
UI_TOOLBAR_RIGHT);
}
ui_headerbar_add_items(obj, right_headerbar, rightpanel_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.tooltip, item->args.onclick, item->args.onclickdata,
0,
FALSE);
ui_set_widget_states(obj->ctx, button, item->args.states);
ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states);
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_states(obj->ctx, button, item->args.states);
ui_set_widget_visibility_states(obj->ctx, button, item->args.visibility_states);
WIDGET_ADD_CSS_CLASS(button,
"flat");
ui_setup_togglebutton(obj, button, item->args.label, item->args.icon, item->args.tooltip, 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();
ui_set_widget_visibility_states(obj->ctx, menubutton, item->args.visibility_states);
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();
GtkWidget *menu = gtk_menu_new();
ui_add_menu_items(menu,
0, &item->menu, obj);
gtk_widget_show_all(menu);
gtk_menu_button_set_popup(
GTK_MENU_BUTTON(menubutton), menu);
#endif
headerbar_add(headerbar, box, menubutton, pos);
}
#endif