better support for shortcuts

This commit is contained in:
ZappoMan 2014-02-24 20:49:06 -08:00
parent 03f8885cad
commit a3d0c20516
5 changed files with 60 additions and 19 deletions

View file

@ -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() {

View file

@ -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),

View file

@ -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();

View file

@ -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);

View file

@ -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;