ui/qt/toolbar.cpp

Wed, 25 Jun 2025 22:14:25 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 25 Jun 2025 22:14:25 +0200
changeset 634
14016ce0a434
parent 576
dd38b170f9a8
child 659
d6baaa93f7be
permissions
-rw-r--r--

implement ui_getvaluefunc2 (QT)

55
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2014 Olaf Wintermann. All rights reserved.
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include <inttypes.h>
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include "toolbar.h"
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include "menu.h"
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include "stock.h"
9076eb40454d added toolbar (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
574
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
35 static void add_items(UiObject *obj, QToolBar *toolbar, CxList *defaults, CxMap *items);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
36 static void create_item(UiObject *obj, QToolBar *toolbar, UiToolbarItemI *i);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
37
573
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
38 QToolBar* ui_create_toolbar(UiObject *obj) {
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
39 CxMap *items = uic_get_toolbar_items();
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
40 CxList *left_defaults = uic_get_toolbar_defaults(UI_TOOLBAR_LEFT);
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
41 CxList *center_defaults = uic_get_toolbar_defaults(UI_TOOLBAR_CENTER);
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
42 CxList *right_defaults = uic_get_toolbar_defaults(UI_TOOLBAR_RIGHT);
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
43
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
44 if(!items || cxMapSize(items) == 0) {
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
45 return nullptr;
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
46 }
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
47
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
48 QToolBar *toolbar = new QToolBar();
574
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
49 add_items(obj, toolbar, left_defaults, items);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
50 add_items(obj, toolbar, center_defaults, items);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
51 add_items(obj, toolbar, right_defaults, items);
573
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
52
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
53
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
54 return toolbar;
2360c1696a34 update uwproj
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
55 }
574
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
56
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
57 static void add_items(UiObject *obj, QToolBar *toolbar, CxList *defaults, CxMap *items) {
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
58 CxIterator i = cxListIterator(defaults);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
59 cx_foreach(char *, name, i) {
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
60 UiToolbarItemI *item = (UiToolbarItemI*)cxMapGet(items, name);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
61 if(item) {
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
62 create_item(obj, toolbar, item);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
63 } else {
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
64 fprintf(stderr, "UI Error: unknown toolbar item '%s'\n", name);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
65 }
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
66 }
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
67 }
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
68
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
69 static void create_item(UiObject *obj, QToolBar *toolbar, UiToolbarItemI *i) {
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
70 switch(i->type) {
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
71 case UI_TOOLBAR_ITEM: {
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
72 ui_toolbar_add_item(obj, toolbar, (UiToolbarItem*)i);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
73 break;
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
74 }
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
75 case UI_TOOLBAR_TOGGLEITEM: {
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
76 ui_toolbar_add_toggleitem(obj, toolbar, (UiToolbarToggleItem*)i);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
77 break;
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
78 }
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
79 case UI_TOOLBAR_MENU: {
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
80 ui_toolbar_add_menu(obj, toolbar, (UiToolbarMenuItem*)i);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
81 break;
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
82 }
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
83 default: fprintf(stderr, "toolbar item type unimplemented: %d\n", (int)i->type);
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
84 }
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
85 }
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
86
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
87 void ui_toolbar_add_item(UiObject *obj, QToolBar *toolbar, UiToolbarItem *item) {
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
88 QAction *action = new QAction();
575
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
89 if(item->args.label) {
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
90 action->setText(item->args.label);
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
91 }
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
92 if(item->args.icon) {
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
93 action->setIcon(QIcon::fromTheme(item->args.icon));
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
94 }
574
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
95 toolbar->addAction(action);
575
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
96
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
97 UiEventWrapper *event = new UiEventWrapper(obj, item->args.onclick, item->args.onclickdata);
576
dd38b170f9a8 fix toolbar item signal
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 575
diff changeset
98 action->connect(action, SIGNAL(triggered()), event, SLOT(slot()));
575
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
99 action->connect(action, SIGNAL(destroyed()), event, SLOT(destroy()));
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
100 }
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
101
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
102 static void toolbar_togglebutton_event(UiEvent *event, UiEventWrapper *wrapper) {
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
103 QAction *action = (QAction*)wrapper->customdata1;
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
104 event->intval = action->isChecked();
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
105 if(wrapper->var) {
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
106 event->eventdata = wrapper->var->value;
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
107 }
574
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
108 }
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
109
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
110 void ui_toolbar_add_toggleitem(UiObject *obj, QToolBar *toolbar, UiToolbarToggleItem *item) {
575
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
111 QAction *action = new QAction();
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
112 action->setCheckable(true);
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
113 if(item->args.label) {
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
114 action->setText(item->args.label);
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
115 }
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
116 if(item->args.icon) {
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
117 action->setIcon(QIcon::fromTheme(item->args.icon));
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
118 }
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
119 toolbar->addAction(action);
574
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
120
575
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
121 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, nullptr, item->args.varname, UI_VAR_INTEGER);
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
122 UiEventWrapper *event = new UiEventWrapper(obj, item->args.onchange, item->args.onchangedata);
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
123 event->var = var;
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
124 event->customdata1 = action;
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
125 event->prepare_event = toolbar_togglebutton_event;
576
dd38b170f9a8 fix toolbar item signal
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 575
diff changeset
126 action->connect(action, SIGNAL(triggered()), event, SLOT(slot()));
575
50da9696a865 implement toolbar icons and events (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 574
diff changeset
127 action->connect(action, SIGNAL(destroyed()), event, SLOT(destroy()));
574
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
128 }
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
129
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
130 void ui_toolbar_add_menu(UiObject *obj, QToolBar *toolbar, UiToolbarMenuItem *item) {
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
131
19de5292f08f add toolbar (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 573
diff changeset
132 }

mercurial