Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions modules/qt/dmzJsModuleUiV8QtBasic.cpp
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <QtGui/QDockWidget>
#include <QtGui/QKeyEvent>
#include <QtGui/QLineEdit>
#include <QtGui/QMenu>
#include <QtGui/QMainWindow>
#include <QtUiTools/QUiLoader>

Expand Down Expand Up @@ -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<QAction *> actionList (menu->actions ());

for (QList<QAction *>::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) {

Expand Down
7 changes: 7 additions & 0 deletions modules/qt/dmzJsModuleUiV8QtBasic.h
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down
214 changes: 191 additions & 23 deletions modules/qt/dmzJsModuleUiV8QtBasicMainWindow.cpp
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -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 ();
Expand Down Expand Up @@ -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 ();
Expand Down Expand Up @@ -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 ();
Expand Down Expand Up @@ -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 ();

Expand Down Expand Up @@ -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 ()) {
Expand All @@ -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));
}
}

Expand All @@ -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) {

Expand All @@ -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); }
Expand All @@ -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 ();
Expand All @@ -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) {

Expand Down Expand Up @@ -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",
Expand Down