diff options
author | Tim E. Real <termtech@rogers.com> | 2011-05-20 03:59:53 +0000 |
---|---|---|
committer | Tim E. Real <termtech@rogers.com> | 2011-05-20 03:59:53 +0000 |
commit | b5bdb59699abd38a3aa90dfb4d9882b2be7f5be0 (patch) | |
tree | 96428ab12d620d9ecc4293538626f215e46b28e1 | |
parent | 921d1536f9fd2db8e0995a26929141cd38a5cc6d (diff) |
Popup menus: If stay-open mode, space triggers item and double-click simulates return (closing).
-rw-r--r-- | muse2/ChangeLog | 2 | ||||
-rw-r--r-- | muse2/muse/audioconvert.cpp | 3 | ||||
-rw-r--r-- | muse2/muse/audioconvert.h | 3 | ||||
-rw-r--r-- | muse2/muse/liste/editevent.cpp | 5 | ||||
-rw-r--r-- | muse2/muse/widgets/popupmenu.cpp | 166 | ||||
-rw-r--r-- | muse2/muse/widgets/popupmenu.h | 5 |
6 files changed, 105 insertions, 79 deletions
diff --git a/muse2/ChangeLog b/muse2/ChangeLog index 956b0c3f..01e6645d 100644 --- a/muse2/ChangeLog +++ b/muse2/ChangeLog @@ -1,3 +1,5 @@ +20.05.2011: + - Popup menus: If stay-open mode, space triggers item and double-click simulates return (closing). (Tim) 19.05.2011: * Feature: Popup menus now auto-scroll if too large to fit on desktop. (p4.0.25 Tim) Added auto-scroll to my class PopupMenu. Added selectable stay-open. TODO: Use it more, where needed. diff --git a/muse2/muse/audioconvert.cpp b/muse2/muse/audioconvert.cpp index 552b5e95..ced8e703 100644 --- a/muse2/muse/audioconvert.cpp +++ b/muse2/muse/audioconvert.cpp @@ -5,7 +5,8 @@ // // (C) Copyright 1999-2009 Werner Schweer (ws@seh.de) // -// Audio converter module created by Tim terminator356 +// Audio converter module created by Tim +// (C) Copyright 2009-2011 Tim E. Real (terminator356 A T sourceforge D O T net) //========================================================= #include <math.h> diff --git a/muse2/muse/audioconvert.h b/muse2/muse/audioconvert.h index 039af912..0933de60 100644 --- a/muse2/muse/audioconvert.h +++ b/muse2/muse/audioconvert.h @@ -5,7 +5,8 @@ // // (C) Copyright 1999-2009 Werner Schweer (ws@seh.de) // -// Audio converter module created by Tim terminator356 +// Audio converter module created by Tim +// (C) Copyright 2009-2011 Tim E. Real (terminator356 A T sourceforge D O T net) //========================================================= #ifndef __AUDIOCONVERT_H__ diff --git a/muse2/muse/liste/editevent.cpp b/muse2/muse/liste/editevent.cpp index 0643c34d..fd74d5d3 100644 --- a/muse2/muse/liste/editevent.cpp +++ b/muse2/muse/liste/editevent.cpp @@ -12,7 +12,7 @@ #include <QGridLayout> #include <QLabel> #include <QListWidget> -#include <QMenu> +//#include <QMenu> #include <QMessageBox> #include <QPushButton> #include <QRadioButton> @@ -680,7 +680,8 @@ EditCtrlDialog::EditCtrlDialog(int tick, const Event& event, void EditCtrlDialog::newController() { - QMenu* pup = new QMenu(this); + //QMenu* pup = new QMenu(this); + PopupMenu* pup = new PopupMenu(this); //pup->setCheckable(this);//not necessary in Qt4 // // populate popup with all controllers available for diff --git a/muse2/muse/widgets/popupmenu.cpp b/muse2/muse/widgets/popupmenu.cpp index b59e8d43..263c8475 100644 --- a/muse2/muse/widgets/popupmenu.cpp +++ b/muse2/muse/widgets/popupmenu.cpp @@ -6,6 +6,7 @@ // (C) Copyright 1999-2010 Werner Schweer (ws@seh.de) // // PopupMenu sub-class of QMenu created by Tim. +// (C) Copyright 2010-2011 Tim E. Real (terminator356 A T sourceforge D O T net) //========================================================= //#include <stdio.h> @@ -96,7 +97,7 @@ void PopupMenu::clear() #endif // POPUP_MENU_DISABLE_AUTO_SCROLL } -QAction* PopupMenu::findActionFromData(QVariant v) +QAction* PopupMenu::findActionFromData(QVariant v) const { QList<QAction*> list = actions(); for(int i = 0; i < list.size(); ++i) @@ -118,86 +119,105 @@ bool PopupMenu::event(QEvent* event) { //printf("PopupMenu::event type:%d\n", event->type()); // REMOVE Tim. - #ifndef POPUP_MENU_DISABLE_AUTO_SCROLL - if(event->type() == QEvent::MouseMove) + switch(event->type()) { - QMouseEvent* e = static_cast<QMouseEvent*>(event); - QPoint globPos = e->globalPos(); - //QPoint pos = e->pos(); - int dw = QApplication::desktop()->width(); // We want the whole thing if multiple monitors. - - //printf("PopupMenu::event MouseMove: pos x:%d y:%d globPos x:%d y:%d\n", - // pos.x(), pos.y(), globPos.x(), globPos.y()); // REMOVE Tim. - - /* - //QAction* action = actionAt(globPos); - QAction* action = actionAt(pos); - if(action) - { - QRect r = actionGeometry(action); - //printf(" act x:%d y:%d w:%d h:%d popup px:%d py:%d pw:%d ph:%d\n", - // r.x(), r.y(), r.width(), r.height(), x(), y(), width(), height()); // REMOVE Tim. - - //action->hover(); - } - */ - - if(x() < 0 && globPos.x() <= 0) // If on the very first pixel (or beyond) - { - moveDelta = 32; - if(!timer->isActive()) - timer->start(); - event->accept(); - return true; + #ifndef POPUP_MENU_DISABLE_STAY_OPEN + case QEvent::MouseButtonDblClick: + { + if(_stayOpen) + { + QMouseEvent* e = static_cast<QMouseEvent*>(event); + if(e->modifiers() == Qt::NoModifier) + { + event->accept(); + // Convert into a return press, which selects the item and closes the menu. + // Note that with double click, it's a press followed by release followed by double click. + // That would toggle our item twice eg on->off->on, which is hopefully OK. + QKeyEvent ke(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier); + //ke.ignore(); // Pass it on + return QMenu::event(&ke); + } + } } - else - if(x() + width() >= dw && globPos.x() >= (dw -1)) // If on the very last pixel (or beyond) + break; + case QEvent::KeyPress: { - moveDelta = -32; - if(!timer->isActive()) - timer->start(); - event->accept(); - return true; + if(_stayOpen) + { + QKeyEvent* e = static_cast<QKeyEvent*>(event); + if(e->modifiers() == Qt::NoModifier && e->key() == Qt::Key_Space) + { + QAction* act = activeAction(); + if(act) + { + act->trigger(); + event->accept(); + return true; // We handled it. + } + } + } } - - if(timer->isActive()) - timer->stop(); + break; + #endif // POPUP_MENU_DISABLE_STAY_OPEN - //event->accept(); - //return true; - - event->ignore(); // Pass it on - //return QMenu::event(event); - } - #endif // POPUP_MENU_DISABLE_AUTO_SCROLL - /* - else - if(event->type() == QEvent::HoverEnter) - { - // Nope! Hovering over menu items did not invoke this. - printf("PopupMenu::event hover\n"); // REMOVE Tim. - QHoverEvent* he = static_cast<QHoverEvent*>(event); - QPoint oldPos = he->oldPos(); - QPoint pos = he->pos(); - - QAction* action = actionAt(pos); - - if(action) + #ifndef POPUP_MENU_DISABLE_AUTO_SCROLL + case QEvent::MouseMove: { - QRect r = actionGeometry(action); - printf("PopupMenu::event hover: act x:%d y:%d w:%d h:%d popup px:%d py:%d pw:%d ph:%d\n", - r.x(), r.y(), r.width(), r.height(), x(), y(), width(), height()); // REMOVE Tim. - printf(" pos x:%d y:%d oldPos px:%d py:%d\n", - pos.x(), pos.y(), oldPos.x(), oldPos.y()); // REMOVE Tim. - - - } - + QMouseEvent* e = static_cast<QMouseEvent*>(event); + QPoint globPos = e->globalPos(); + //QPoint pos = e->pos(); + int dw = QApplication::desktop()->width(); // We want the whole thing if multiple monitors. + + //printf("PopupMenu::event MouseMove: pos x:%d y:%d globPos x:%d y:%d\n", + // pos.x(), pos.y(), globPos.x(), globPos.y()); // REMOVE Tim. + + /* + //QAction* action = actionAt(globPos); + QAction* action = actionAt(pos); + if(action) + { + QRect r = actionGeometry(action); + //printf(" act x:%d y:%d w:%d h:%d popup px:%d py:%d pw:%d ph:%d\n", + // r.x(), r.y(), r.width(), r.height(), x(), y(), width(), height()); // REMOVE Tim. + + //action->hover(); + } + */ + + if(x() < 0 && globPos.x() <= 0) // If on the very first pixel (or beyond) + { + moveDelta = 32; + if(!timer->isActive()) + timer->start(); + event->accept(); + return true; + } + else + if(x() + width() >= dw && globPos.x() >= (dw -1)) // If on the very last pixel (or beyond) + { + moveDelta = -32; + if(!timer->isActive()) + timer->start(); + event->accept(); + return true; + } + + if(timer->isActive()) + timer->stop(); + + //event->accept(); + //return true; + + event->ignore(); // Pass it on + //return QMenu::event(event); + } + break; + #endif // POPUP_MENU_DISABLE_AUTO_SCROLL - //return true; + default: + break; } - */ - + return QMenu::event(event); } diff --git a/muse2/muse/widgets/popupmenu.h b/muse2/muse/widgets/popupmenu.h index 4982d199..47be57ae 100644 --- a/muse2/muse/widgets/popupmenu.h +++ b/muse2/muse/widgets/popupmenu.h @@ -6,6 +6,7 @@ // (C) Copyright 1999-2010 Werner Schweer (ws@seh.de) // // PopupMenu sub-class of QMenu created by Tim. +// (C) Copyright 2010-2011 Tim E. Real (terminator356 A T sourceforge D O T net) //========================================================= #ifndef __POPUPMENU_H__ @@ -59,8 +60,8 @@ class PopupMenu : public QMenu PopupMenu(const QString& title, QWidget* parent = 0, bool stayOpen = false); ~PopupMenu(); void clear(); - QAction* findActionFromData(QVariant); - bool stayOpen() { return _stayOpen; } + QAction* findActionFromData(QVariant) const; + bool stayOpen() const { return _stayOpen; } }; |