diff -r b34bd1557c6c -r 77254bd6dccb ui/qt/toolbar.cpp --- a/ui/qt/toolbar.cpp Sat Apr 05 17:57:04 2025 +0200 +++ b/ui/qt/toolbar.cpp Sun Jul 20 22:04:39 2025 +0200 @@ -32,3 +32,102 @@ #include "menu.h" #include "stock.h" +static void add_items(UiObject *obj, QToolBar *toolbar, CxList *defaults, CxMap *items); +static void create_item(UiObject *obj, QToolBar *toolbar, UiToolbarItemI *i); + +QToolBar* ui_create_toolbar(UiObject *obj) { + CxMap *items = uic_get_toolbar_items(); + 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); + + if(!items || cxMapSize(items) == 0) { + return nullptr; + } + + QToolBar *toolbar = new QToolBar(); + add_items(obj, toolbar, left_defaults, items); + add_items(obj, toolbar, center_defaults, items); + add_items(obj, toolbar, right_defaults, items); + + + return toolbar; +} + +static void add_items(UiObject *obj, QToolBar *toolbar, CxList *defaults, CxMap *items) { + CxIterator i = cxListIterator(defaults); + cx_foreach(char *, name, i) { + UiToolbarItemI *item = (UiToolbarItemI*)cxMapGet(items, name); + if(item) { + create_item(obj, toolbar, item); + } else { + fprintf(stderr, "UI Error: unknown toolbar item '%s'\n", name); + } + } +} + +static void create_item(UiObject *obj, QToolBar *toolbar, UiToolbarItemI *i) { + switch(i->type) { + case UI_TOOLBAR_ITEM: { + ui_toolbar_add_item(obj, toolbar, (UiToolbarItem*)i); + break; + } + case UI_TOOLBAR_TOGGLEITEM: { + ui_toolbar_add_toggleitem(obj, toolbar, (UiToolbarToggleItem*)i); + break; + } + case UI_TOOLBAR_MENU: { + ui_toolbar_add_menu(obj, toolbar, (UiToolbarMenuItem*)i); + break; + } + default: fprintf(stderr, "toolbar item type unimplemented: %d\n", (int)i->type); + } +} + +void ui_toolbar_add_item(UiObject *obj, QToolBar *toolbar, UiToolbarItem *item) { + QAction *action = new QAction(); + if(item->args.label) { + action->setText(item->args.label); + } + if(item->args.icon) { + action->setIcon(QIcon::fromTheme(item->args.icon)); + } + toolbar->addAction(action); + + UiEventWrapper *event = new UiEventWrapper(obj, item->args.onclick, item->args.onclickdata); + action->connect(action, SIGNAL(triggered()), event, SLOT(slot())); + action->connect(action, SIGNAL(destroyed()), event, SLOT(destroy())); +} + +static void toolbar_togglebutton_event(UiEvent *event, UiEventWrapper *wrapper) { + QAction *action = (QAction*)wrapper->customdata1; + event->intval = action->isChecked(); + if(wrapper->var) { + event->eventdata = wrapper->var->value; + event->eventdatatype = UI_EVENT_DATA_INTEGER_VALUE; + } +} + +void ui_toolbar_add_toggleitem(UiObject *obj, QToolBar *toolbar, UiToolbarToggleItem *item) { + QAction *action = new QAction(); + action->setCheckable(true); + if(item->args.label) { + action->setText(item->args.label); + } + if(item->args.icon) { + action->setIcon(QIcon::fromTheme(item->args.icon)); + } + toolbar->addAction(action); + + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, nullptr, item->args.varname, UI_VAR_INTEGER); + UiEventWrapper *event = new UiEventWrapper(obj, item->args.onchange, item->args.onchangedata); + event->var = var; + event->customdata1 = action; + event->prepare_event = toolbar_togglebutton_event; + action->connect(action, SIGNAL(triggered()), event, SLOT(slot())); + action->connect(action, SIGNAL(destroyed()), event, SLOT(destroy())); +} + +void ui_toolbar_add_menu(UiObject *obj, QToolBar *toolbar, UiToolbarMenuItem *item) { + +}