diff --git a/modules/qt/dmzJsModuleUiV8QtBasic.cpp b/modules/qt/dmzJsModuleUiV8QtBasic.cpp old mode 100644 new mode 100755 index 7acb426..8edb3ef --- a/modules/qt/dmzJsModuleUiV8QtBasic.cpp +++ b/modules/qt/dmzJsModuleUiV8QtBasic.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -1434,6 +1435,47 @@ dmz::JsModuleUiV8QtBasic::_find_ui_file (const String &Name) { } +dmz::Boolean +dmz::JsModuleUiV8QtBasic::_find_main_window_action ( + const QString &Menu, + const QString &Action) { + + Boolean result (dmz::False); + + const QString Key (Menu + Action); + + if (_menuActionMap.contains (Key)) { + + result = dmz::True; + } + else if (_state.mainWindowModule) { + + QMenu *menu (_state.mainWindowModule->lookup_menu (qPrintable (Menu))); + + if (menu) { + + QList actionList (menu->actions ()); + + for (QList::iterator it (actionList.begin ()); + it != actionList.end () && !result; + it++) { + + if ((*it)->text () == Action) { + + const QString Key (Menu + (*it)->text ()); + + _menuActionMap[Key] = (*it); + + result = dmz::True; + } + } + } + } + + return result; +} + + void dmz::JsModuleUiV8QtBasic::_init (Config &local) { diff --git a/modules/qt/dmzJsModuleUiV8QtBasic.h b/modules/qt/dmzJsModuleUiV8QtBasic.h old mode 100644 new mode 100755 index 62a0c0f..6f2e05d --- a/modules/qt/dmzJsModuleUiV8QtBasic.h +++ b/modules/qt/dmzJsModuleUiV8QtBasic.h @@ -350,6 +350,8 @@ namespace dmz { static V8Value _main_window_remove_dock_widget (const v8::Arguments &Args); static V8Value _main_window_add_menu (const v8::Arguments &Args); static V8Value _main_window_add_separator (const v8::Arguments &Args); + static V8Value _main_window_insert_menu (const v8::Arguments &Args); + static V8Value _main_window_insert_separator (const v8::Arguments &Args); static V8Value _main_window_window (const v8::Arguments &Args); // QDockWidget bindings implemented in JsModuleUiV8QtBasicDockWidget.cpp @@ -880,6 +882,11 @@ namespace dmz { void _init_form_layout (); String _find_ui_file (const String &Name); + + Boolean _find_main_window_action ( + const QString &Menu, + const QString &Action); + void _init (Config &local); Log _log; diff --git a/modules/qt/dmzJsModuleUiV8QtBasicMainWindow.cpp b/modules/qt/dmzJsModuleUiV8QtBasicMainWindow.cpp old mode 100644 new mode 100755 index 6dde49b..4714b43 --- a/modules/qt/dmzJsModuleUiV8QtBasicMainWindow.cpp +++ b/modules/qt/dmzJsModuleUiV8QtBasicMainWindow.cpp @@ -17,7 +17,8 @@ namespace { dmz::V8Value -dmz::JsModuleUiV8QtBasic::_main_window_central_widget (const v8::Arguments &Args) { +dmz::JsModuleUiV8QtBasic::_main_window_central_widget ( + const v8::Arguments &Args) { v8::HandleScope scope; V8Value result = v8::Undefined (); @@ -81,7 +82,8 @@ dmz::JsModuleUiV8QtBasic::_main_window_close (const v8::Arguments &Args) { dmz::V8Value -dmz::JsModuleUiV8QtBasic::_main_window_create_dock_widget (const v8::Arguments &Args) { +dmz::JsModuleUiV8QtBasic::_main_window_create_dock_widget ( + const v8::Arguments &Args) { v8::HandleScope scope; V8Value result = v8::Undefined (); @@ -196,7 +198,8 @@ dmz::JsModuleUiV8QtBasic::_main_window_create_dock_widget (const v8::Arguments & dmz::V8Value -dmz::JsModuleUiV8QtBasic::_main_window_remove_dock_widget (const v8::Arguments &Args) { +dmz::JsModuleUiV8QtBasic::_main_window_remove_dock_widget ( + const v8::Arguments &Args) { v8::HandleScope scope; V8Value result = v8::Undefined (); @@ -224,17 +227,6 @@ dmz::JsModuleUiV8QtBasic::_main_window_remove_dock_widget (const v8::Arguments & dmz::V8Value dmz::JsModuleUiV8QtBasic::_main_window_add_menu (const v8::Arguments &Args) { -#if 0 - mainWindow.addMenu (self, "File", "Open", "shortcut", function () {...}); - mainWindow.addMenu (self, "File", "New", "new.png", "shortcut", function () {...}); - mainWindow.addMenu ( - self, - "File", - {text:"New", icon:"new.png", shortcut: "Ctrl+X"}, - function () {...}); - -#endif - v8::HandleScope scope; V8Value result = v8::Undefined (); @@ -262,21 +254,27 @@ dmz::JsModuleUiV8QtBasic::_main_window_add_menu (const v8::Arguments &Args) { if (!src.IsEmpty () && !func.IsEmpty ()) { - QAction *action = 0; - const QString Key = Menu + Text; + QAction *action (0); + + const QString Key (Menu + Text); if (self->_menuActionMap.contains (Key)) { action = self->_menuActionMap[Key]; } - if (!action) { action = new QAction (Text, module->get_qt_main_window ()); } + if (!action) { + + action = new QAction (Text, module->get_qt_main_window ()); + } if (!params.IsEmpty ()) { if (params->Has (self->_iconStr)) { - const QString File = v8_to_qstring (params->Get (self->_iconStr)); + const QString File ( + v8_to_qstring (params->Get (self->_iconStr))) +; QFileInfo fi (File); if (fi.exists ()) { @@ -288,7 +286,8 @@ dmz::JsModuleUiV8QtBasic::_main_window_add_menu (const v8::Arguments &Args) { if (params->Has (self->_shortcutStr)) { - shortcut = v8_to_qkeysequence (params->Get (self->_shortcutStr)); + shortcut = + v8_to_qkeysequence (params->Get (self->_shortcutStr)); } } @@ -298,8 +297,9 @@ dmz::JsModuleUiV8QtBasic::_main_window_add_menu (const v8::Arguments &Args) { V8QtObject *jsObject = self->_to_v8_qt_object (result); - const Handle Obs = - self->_state.core ? self->_state.core->get_instance_handle (src) : 0; + const Handle Obs ( + self->_state.core ? + self->_state.core->get_instance_handle (src) : 0); if (Obs && jsObject) { @@ -309,7 +309,11 @@ dmz::JsModuleUiV8QtBasic::_main_window_add_menu (const v8::Arguments &Args) { if (!os) { os = new ObsStruct (Obs); - if (!self->_obsTable.store (Obs, os)) { delete os; os = 0; } + + if (!self->_obsTable.store (Obs, os)) { + + delete os; os = 0; + } } if (os) { os->list.append (jsObject); } @@ -330,7 +334,8 @@ dmz::JsModuleUiV8QtBasic::_main_window_add_menu (const v8::Arguments &Args) { dmz::V8Value -dmz::JsModuleUiV8QtBasic::_main_window_add_separator (const v8::Arguments &Args) { +dmz::JsModuleUiV8QtBasic::_main_window_add_separator ( + const v8::Arguments &Args) { v8::HandleScope scope; V8Value result = v8::Undefined (); @@ -350,6 +355,166 @@ dmz::JsModuleUiV8QtBasic::_main_window_add_separator (const v8::Arguments &Args) } +dmz::V8Value +dmz::JsModuleUiV8QtBasic::_main_window_insert_menu ( + const v8::Arguments &Args) { + + v8::HandleScope scope; + V8Value result = v8::Undefined (); + + JsModuleUiV8QtBasic *self = _to_self (Args); + if (self) { + + QtModuleMainWindow *module (self->_state.mainWindowModule); + if (module) { + + V8Object src = v8_to_object (Args[0]); + const QString Menu = v8_to_qstring (Args[1]); + const QString Before = v8_to_qstring (Args[2]); + const QString Text = v8_to_qstring (Args[3]); + QKeySequence shortcut; + + V8Object params; + + if (Args.Length () > 5) { + + params = v8_to_object (Args[4]); + + if (v8_is_object (Args[4])) { params = v8_to_object (Args[4]); } + else { shortcut = v8_to_qkeysequence (Args[4]); } + } + + V8Function func = v8_to_function (Args[Args.Length () - 1]); + + if (!src.IsEmpty () && !func.IsEmpty ()) { + + QAction *parentAction (0); + QAction *action (0); + + const QString Key (Menu + Text); + + if (self->_find_main_window_action (Menu, Before)) { + + parentAction = self->_menuActionMap[Menu + Before]; + } + + if (self->_menuActionMap.contains (Key)) { + + action = self->_menuActionMap[Key]; + } + + if (!action) { + + action = new QAction (Text, module->get_qt_main_window ()); + } + + if (!params.IsEmpty ()) { + + if (params->Has (self->_iconStr)) { + + const QString File ( + v8_to_qstring (params->Get (self->_iconStr))); + + QFileInfo fi (File); + + if (fi.exists ()) { + + QIcon icon (fi.filePath ()); + action->setIcon (icon); + } + } + + if (params->Has (self->_shortcutStr)) { + + shortcut = + v8_to_qkeysequence (params->Get (self->_shortcutStr)); + } + } + + if (!shortcut.isEmpty ()) { action->setShortcut (shortcut); } + + result = self->create_v8_qobject (action); + + V8QtObject *jsObject = self->_to_v8_qt_object (result); + + const Handle Obs ( + self->_state.core ? + self->_state.core->get_instance_handle (src) : 0); + + if (Obs && jsObject) { + + if (jsObject->bind (LocalSignalTriggered, src, func)) { + + ObsStruct *os = self->_obsTable.lookup (Obs); + if (!os) { + + os = new ObsStruct (Obs); + if (!self->_obsTable.store (Obs, os)) { + + delete os; os = 0; + } + } + + if (os) { os->list.append (jsObject); } + + if (!self->_menuActionMap.contains (Key)) { + + if (parentAction) { + + module->insert_menu_action ( + qPrintable (Menu), parentAction, action); + } + else { + + module->add_menu_action ( + qPrintable (Menu), action); + } + + self->_menuActionMap[Key] = action; + } + } + } + } + } + } + + return scope.Close (result); +} + + +dmz::V8Value +dmz::JsModuleUiV8QtBasic::_main_window_insert_separator ( + const v8::Arguments &Args) { + + v8::HandleScope scope; + V8Value result = v8::Undefined (); + + JsModuleUiV8QtBasic *self = _to_self (Args); + if (self) { + + QtModuleMainWindow *module (self->_state.mainWindowModule); + if (module && Args.Length ()) { + + const QString Menu (v8_to_qstring (Args[0])); + const QString Action (v8_to_qstring (Args[1])); + + QAction *action (0); + + if (self->_find_main_window_action (Menu, Action)) { + + const QString Key (Menu + Action); + + action = self->_menuActionMap[Key]; + } + + module->insert_menu_separator (qPrintable (Menu), action); + } + } + + return scope.Close (result); +} + + dmz::V8Value dmz::JsModuleUiV8QtBasic::_main_window_window (const v8::Arguments &Args) { @@ -398,6 +563,9 @@ dmz::JsModuleUiV8QtBasic::_init_main_window () { _mainWindowApi.add_function ("addMenu", _main_window_add_menu, _self); _mainWindowApi.add_function ("addSeparator", _main_window_add_separator, _self); + + _mainWindowApi.add_function ("insertMenu", _main_window_insert_menu, _self); + _mainWindowApi.add_function ("insertSeparator", _main_window_insert_separator, _self); // _mainWindowApi.add_function ("lookupMenu", _main_window_lookup_menu, _self); // _mainWindowApi.add_function ( // "addMenuAction",