ui/qt/menu.cpp

Mon, 29 Sep 2025 21:14:46 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 29 Sep 2025 21:14:46 +0200
changeset 779
b84cbe57e0bd
parent 659
d6baaa93f7be
child 966
e411ed7c5f10
permissions
-rw-r--r--

change UiCellValue from struct to union and pass it as pointer to the onsave function, for better compatibility with other languages

54
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2014 Olaf Wintermann. All rights reserved.
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
97bafeca1c7c added Qt window and menu implementation
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
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include <stdio.h>
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include <stdlib.h>
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include <inttypes.h>
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include <QMenuBar>
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include <QAction>
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 #include "menu.h"
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 #include "toolkit.h"
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 #include "../common/context.h"
535
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
38 #include "../common/menu.h"
54
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 #include "../ui/properties.h"
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 #include "../ui/window.h"
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 #include "stock.h"
73
473acef47ddd added context menus (Qt)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 71
diff changeset
42 #include "container.h"
54
97bafeca1c7c added Qt window and menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43
535
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
44
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
45 static ui_menu_add_f createMenuItem[] = {
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
46 /* UI_MENU */ add_menu_widget,
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
47 /* UI_MENU_ITEM */ add_menuitem_widget,
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
48 /* UI_MENU_CHECK_ITEM */ add_checkitem_widget,
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
49 /* UI_MENU_RADIO_ITEM */ add_radioitem_widget,
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
50 /* UI_MENU_ITEM_LIST */ add_menuitem_list_widget,
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
51 /* UI_MENU_CHECKITEM_LIST */ add_menuitem_list_widget,
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
52 /* UI_MENU_RADIOITEM_LIST */ add_menuitem_list_widget,
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
53 /* UI_MENU_SEPARATOR */ add_menuseparator_widget
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
54 };
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
55
536
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
56 /*
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
57 * create all menu child items
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
58 */
535
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
59 static void add_menu_items(QMenu *parent, int i, UiMenu *menu, UiObject *obj) {
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
60 UiMenuItemI *it = menu->items_begin;
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
61 int index = 0;
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
62 while(it) {
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
63 createMenuItem[it->type](parent, index, it, obj);
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
64 it = it->next;
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
65 index++;
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
66 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
67 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
68
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
69 void add_menu_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) {
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
70 UiMenu *m = (UiMenu*)item;
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
71 QMenu *menu = parent->addMenu(m->label);
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
72 add_menu_items(menu, i, m, obj);
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
73 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
74
536
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
75 static UiAction* create_action(
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
76 UiObject *obj,
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
77 const char *icon,
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
78 const char *label,
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
79 ui_callback callback,
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
80 void *userdata,
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
81 int *states)
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
82 {
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
83 QString str = QString::fromUtf8(label);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
84 UiAction *action = new UiAction(obj, str, callback, userdata);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
85 if(icon) {
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
86 action->setIcon(QIcon::fromTheme(icon));
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
87 action->setIconVisibleInMenu(true);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
88 }
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
89
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
90 if(states) {
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
91 size_t nstates = uic_group_array_size(states);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
92 uic_add_group_widget_i(obj->ctx, action, (ui_enablefunc)ui_action_enable, states, nstates);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
93 action->setEnabled(false);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
94 }
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
95
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
96 return action;
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
97 }
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
98
535
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
99 void add_menuitem_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) {
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
100 UiMenuItem *it = (UiMenuItem*)item;
536
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
101 UiAction *action = create_action(obj, it->icon, it->label, it->callback, it->userdata, it->groups);
535
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
102 parent->addAction(action);
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
103 QObject::connect(action, SIGNAL(triggered()), action, SLOT(trigger()));
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
104 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
105
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
106 void add_menuseparator_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) {
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
107 parent->addSeparator();
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
108 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
109
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
110 void add_checkitem_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) {
536
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
111 UiMenuCheckItem *it = (UiMenuCheckItem*)item;
535
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
112
536
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
113 UiAction *action = create_action(obj, it->icon, it->label, it->callback, it->userdata, it->groups);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
114 parent->addAction(action);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
115 action->setCheckable(true);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
116 action->prepare_event = ui_checkableaction_prepare_event;
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
117
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
118 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, NULL, it->varname, UI_VAR_INTEGER);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
119 if(var) {
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
120 UiInteger *value = (UiInteger*)var->value;
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
121 value->obj = action;
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
122 value->get = ui_checkableaction_get;
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
123 value->set = ui_checkableaction_set;
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
124
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
125 action->setChecked((bool)value->value);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
126 }
537
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
127 action->var = var;
535
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
128 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
129
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
130 void add_radioitem_widget(QMenu *parent, int index, UiMenuItemI *item, UiObject *obj) {
537
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
131 UiMenuRadioItem *it = (UiMenuRadioItem*)item;
535
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
132
537
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
133 UiAction *action = create_action(obj, it->icon, it->label, it->callback, it->userdata, it->groups);
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
134 parent->addAction(action);
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
135 action->setCheckable(true);
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
136 action->prepare_event = ui_actiongroup_prepare_event;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
137
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
138 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, NULL, it->varname, UI_VAR_INTEGER);
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
139 if(var) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
140 UiInteger *value = (UiInteger*)var->value;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
141 QActionGroup *group = (QActionGroup*)value->obj;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
142 if(!group) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
143 group = new QActionGroup(parent);
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
144 value->obj = group;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
145 }
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
146 group->addAction(action);
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
147 value->get = ui_actiongroup_get;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
148 value->set = ui_actiongroup_set;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
149 if(value->value != 0) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
150 ui_actiongroup_set(value, value->value);
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
151 }
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
152 }
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
153 action->var;
535
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
154 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
155
537
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
156 void ui_actiongroup_prepare_event(UiEvent *event, UiAction *action) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
157 if(action->var) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
158 UiInteger *value = (UiInteger*)action->var->value;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
159 event->eventdata = value;
659
d6baaa93f7be add UiEvent eventdatatype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 537
diff changeset
160 event->eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
537
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
161 event->intval = value->get(value);
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
162 }
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
163 }
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
164
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
165 int64_t ui_actiongroup_get(UiInteger *value) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
166 QActionGroup *group = (QActionGroup*)value->obj;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
167 auto actions = group->actions();
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
168 int i = 1;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
169 foreach(const QAction *action, actions) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
170 if(action->isChecked()) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
171 value->value = i;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
172 break;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
173 }
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
174 i++;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
175 }
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
176 return value->value;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
177 }
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
178
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
179 void ui_actiongroup_set(UiInteger *value, int64_t i) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
180 QActionGroup *group = (QActionGroup*)value->obj;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
181 auto actions = group->actions();
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
182 if(i > 0) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
183 if(i-1 < actions.size()) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
184 actions[i]->setEnabled(true);
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
185 }
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
186 value->value = i;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
187 } else {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
188 foreach(QAction *action, actions) {
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
189 action->setEnabled(false);
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
190 }
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
191 value->value = 0;
81e46644f1aa implement menu radiobutton (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 536
diff changeset
192 }
535
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
193 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
194
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
195 void add_menuitem_list_widget(QMenu *parent, int i, UiMenuItemI *item, UiObject *obj) {
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
196
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
197 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
198
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
199
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
200 void ui_add_menus(UiObject *obj, QMainWindow *window) {
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
201 UiMenu *menus_begin = uic_get_menu_list();
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
202 if(menus_begin == NULL) {
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
203 return;
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
204 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
205
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
206 QMenuBar *mb = window->menuBar();
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
207
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
208 UiMenu *ls = menus_begin;
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
209 while(ls) {
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
210 if(ls->item.type == UI_MENU) {
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
211 QMenu *menu = mb->addMenu(ls->label);
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
212 add_menu_items(menu, 0, ls, obj);
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
213 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
214 ls = (UiMenu*)ls->item.next;
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
215 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
216 }
ede57f5b6178 add QT implementation for menubars, sub-menus and simple menu items
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 516
diff changeset
217
536
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
218 void ui_checkableaction_prepare_event(UiEvent *event, UiAction *action) {
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
219 if(action->var) {
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
220 event->eventdata = action->var->value;
659
d6baaa93f7be add UiEvent eventdatatype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 537
diff changeset
221 event->eventdatatype = UI_EVENT_DATA_INTEGER_VALUE;
536
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
222 }
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
223 event->intval = action->isChecked();
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
224 }
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
225
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
226 int64_t ui_checkableaction_get(UiInteger *value) {
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
227 UiAction *action= (UiAction*)value->obj;
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
228 value->value = action->isChecked();
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
229 return value->value;
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
230 }
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
231
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
232 void ui_checkableaction_set(UiInteger *value, int64_t i) {
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
233 UiAction *action = (UiAction*)value->obj;
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
234 value->value = i;
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
235 if(i != 0) {
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
236 action->setChecked((bool)i);
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
237 }
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
238 }
4a1c2eae4bcd implement menu toggleitem (QT)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 535
diff changeset
239

mercurial