mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
better support for shortcuts
This commit is contained in:
parent
03f8885cad
commit
a3d0c20516
5 changed files with 60 additions and 19 deletions
|
@ -11,9 +11,13 @@
|
|||
|
||||
function setupMenus() {
|
||||
Menu.addTopMenu("Foo");
|
||||
Menu.addMenuItem("Foo","Foo item 1", { text: "F", isControl: true} );
|
||||
Menu.addMenuItem("Foo","Foo item 2");
|
||||
Menu.addMenuItem("Foo","Foo item 1", "SHIFT+CTRL+F" );
|
||||
Menu.addMenuItem("Foo","Foo item 2", "SHIFT+F" );
|
||||
Menu.addMenuItem("Foo","Foo item 3", "META+F" );
|
||||
Menu.addMenuItem("Foo","Foo item 4", "ALT+F" );
|
||||
Menu.addTopMenu("Bar");
|
||||
Menu.addMenuItemWithKeyEvent("Bar","Bar item 1", { text: "b" } );
|
||||
Menu.addMenuItemWithKeyEvent("Bar","Bar item 2", { text: "B", isControl: true } );
|
||||
}
|
||||
|
||||
function scriptEnding() {
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <QLineEdit>
|
||||
#include <QMainWindow>
|
||||
#include <QMenuBar>
|
||||
#include <QShortcut>
|
||||
#include <QSlider>
|
||||
#include <QStandardPaths>
|
||||
#include <QUuid>
|
||||
|
@ -1286,9 +1287,7 @@ QString Menu::replaceLastOccurrence(QChar search, QChar replace, QString string)
|
|||
}
|
||||
|
||||
void Menu::addTopMenu(const QString& menu) {
|
||||
QMenu* newMenu = addMenu(menu);
|
||||
//newMenu->setVisible(true);
|
||||
//addDisabledActionAndSeparator(newMenu, "testing");
|
||||
addMenu(menu);
|
||||
|
||||
QMenuBar::repaint();
|
||||
|
||||
|
@ -1313,16 +1312,27 @@ void Menu::addMenuItem(const QString& menu, const QString& menuitem) {
|
|||
}
|
||||
|
||||
void Menu::addMenuItem(const QString& menu, const QString& menuitem, const KeyEvent& shortcutKey) {
|
||||
const QKeySequence& shortcut = 0;
|
||||
|
||||
QKeySequence shortcut(shortcutKey);
|
||||
addMenuItem(menu, menuitem, shortcut);
|
||||
}
|
||||
|
||||
void Menu::addMenuItem(const QString& menu, const QString& menuitem, const QString& shortcutKey) {
|
||||
QKeySequence shortcut(shortcutKey);
|
||||
addMenuItem(menu, menuitem, shortcut);
|
||||
}
|
||||
|
||||
void Menu::addMenuItem(const QString& menu, const QString& menuitem, const QKeySequence& shortcutKey) {
|
||||
QList<QAction*> topLevelMenus = actions();
|
||||
foreach (QAction* topLevelMenuAction, topLevelMenus) {
|
||||
if (topLevelMenuAction->text() == menu) {
|
||||
// add the menu item here...
|
||||
QMenu* menuObj = topLevelMenuAction->menu();
|
||||
if (menuObj) {
|
||||
addActionToQMenuAndActionHash(menuObj, menuitem, shortcut,
|
||||
QShortcut* shortcut = new QShortcut(shortcutKey, this);
|
||||
QAction* menuItemAction = addActionToQMenuAndActionHash(menuObj, menuitem, shortcutKey,
|
||||
MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()));
|
||||
|
||||
connect(shortcut, SIGNAL(activated()), menuItemAction, SLOT(trigger()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1333,23 +1343,16 @@ void Menu::removeMenuItem(const QString& menu, const QString& menuitem) {
|
|||
};
|
||||
|
||||
|
||||
|
||||
MenuScriptingInterface* MenuScriptingInterface::_instance = NULL;
|
||||
QMutex MenuScriptingInterface::_instanceMutex;
|
||||
|
||||
|
||||
MenuScriptingInterface* MenuScriptingInterface::getInstance() {
|
||||
// lock the menu instance mutex to make sure we don't race and create two menus and crash
|
||||
_instanceMutex.lock();
|
||||
|
||||
if (!_instance) {
|
||||
qDebug("First call to MenuScriptingInterface::getInstance() - initing menu.");
|
||||
|
||||
_instance = new MenuScriptingInterface();
|
||||
}
|
||||
|
||||
_instanceMutex.unlock();
|
||||
|
||||
return _instance;
|
||||
}
|
||||
|
||||
|
@ -1365,8 +1368,6 @@ void MenuScriptingInterface::deleteLaterIfExists() {
|
|||
void MenuScriptingInterface::menuItemTriggered() {
|
||||
QAction* menuItemAction = dynamic_cast<QAction*>(sender());
|
||||
if (menuItemAction) {
|
||||
qDebug() << "menu selected:" << menuItemAction->text();
|
||||
|
||||
// emit the event
|
||||
emit menuItemEvent(menuItemAction->text());
|
||||
}
|
||||
|
@ -1382,13 +1383,20 @@ void MenuScriptingInterface::removeTopMenu(const QString& menu) {
|
|||
QMetaObject::invokeMethod(Menu::getInstance(), "removeTopMenu", Q_ARG(const QString&, menu));
|
||||
}
|
||||
|
||||
void MenuScriptingInterface::addMenuItem(const QString& menu, const QString& menuitem, const KeyEvent& shortcutKey) {
|
||||
void MenuScriptingInterface::addMenuItemWithKeyEvent(const QString& menu, const QString& menuitem, const KeyEvent& shortcutKey) {
|
||||
QMetaObject::invokeMethod(Menu::getInstance(), "addMenuItem",
|
||||
Q_ARG(const QString&, menu),
|
||||
Q_ARG(const QString&, menuitem),
|
||||
Q_ARG(const KeyEvent&, shortcutKey));
|
||||
}
|
||||
|
||||
void MenuScriptingInterface::addMenuItem(const QString& menu, const QString& menuitem, const QString& shortcutKey) {
|
||||
QMetaObject::invokeMethod(Menu::getInstance(), "addMenuItem",
|
||||
Q_ARG(const QString&, menu),
|
||||
Q_ARG(const QString&, menuitem),
|
||||
Q_ARG(const QString&, shortcutKey));
|
||||
}
|
||||
|
||||
void MenuScriptingInterface::addMenuItem(const QString& menu, const QString& menuitem) {
|
||||
QMetaObject::invokeMethod(Menu::getInstance(), "addMenuItem",
|
||||
Q_ARG(const QString&, menu),
|
||||
|
|
|
@ -117,6 +117,8 @@ public slots:
|
|||
void removeTopMenu(const QString& menu);
|
||||
void addMenuItem(const QString& menu, const QString& menuitem);
|
||||
void addMenuItem(const QString& menu, const QString& menuitem, const KeyEvent& shortcutKey);
|
||||
void addMenuItem(const QString& menu, const QString& menuitem, const QString& shortcutKey);
|
||||
void addMenuItem(const QString& topMenuName, const QString& menuitem, const QKeySequence& shortcutKey);
|
||||
void removeMenuItem(const QString& menu, const QString& menuitem);
|
||||
|
||||
|
||||
|
@ -329,7 +331,8 @@ public slots:
|
|||
//void addSubMenu(const QString& topMenuName, const QString& menuitem);
|
||||
//void removeSubMenu(const QString& topMenuName, const QString& menuitem);
|
||||
|
||||
void addMenuItem(const QString& topMenuName, const QString& menuitem, const KeyEvent& shortcutKey);
|
||||
void addMenuItemWithKeyEvent(const QString& topMenuName, const QString& menuitem, const KeyEvent& shortcutKey);
|
||||
void addMenuItem(const QString& topMenuName, const QString& menuitem, const QString& shortcutKey);
|
||||
void addMenuItem(const QString& topMenuName, const QString& menuitem);
|
||||
void removeMenuItem(const QString& topMenuName, const QString& menuitem);
|
||||
void menuItemTriggered();
|
||||
|
|
|
@ -126,6 +126,30 @@ bool KeyEvent::operator==(const KeyEvent& other) const {
|
|||
&& other.isKeypad == isKeypad;
|
||||
}
|
||||
|
||||
|
||||
KeyEvent::operator QKeySequence() const {
|
||||
int resultCode = 0;
|
||||
if (text >= "a" && text <= "z") {
|
||||
resultCode = text.toUpper().at(0).unicode();
|
||||
} else {
|
||||
resultCode = key;
|
||||
}
|
||||
|
||||
if (isMeta) {
|
||||
resultCode |= Qt::META;
|
||||
}
|
||||
if (isAlt) {
|
||||
resultCode |= Qt::ALT;
|
||||
}
|
||||
if (isControl) {
|
||||
resultCode |= Qt::CTRL;
|
||||
}
|
||||
if (isShifted) {
|
||||
resultCode |= Qt::SHIFT;
|
||||
}
|
||||
return QKeySequence(resultCode);
|
||||
}
|
||||
|
||||
QScriptValue keyEventToScriptValue(QScriptEngine* engine, const KeyEvent& event) {
|
||||
QScriptValue obj = engine->newObject();
|
||||
obj.setProperty("key", event.key);
|
||||
|
|
|
@ -24,6 +24,8 @@ public:
|
|||
KeyEvent();
|
||||
KeyEvent(const QKeyEvent& event);
|
||||
bool operator==(const KeyEvent& other) const;
|
||||
operator QKeySequence() const;
|
||||
|
||||
int key;
|
||||
QString text;
|
||||
bool isShifted;
|
||||
|
|
Loading…
Reference in a new issue