summaryrefslogtreecommitdiff
path: root/muse2
diff options
context:
space:
mode:
authorTim E. Real <termtech@rogers.com>2011-05-20 03:59:53 +0000
committerTim E. Real <termtech@rogers.com>2011-05-20 03:59:53 +0000
commitb5bdb59699abd38a3aa90dfb4d9882b2be7f5be0 (patch)
tree96428ab12d620d9ecc4293538626f215e46b28e1 /muse2
parent921d1536f9fd2db8e0995a26929141cd38a5cc6d (diff)
Popup menus: If stay-open mode, space triggers item and double-click simulates return (closing).
Diffstat (limited to 'muse2')
-rw-r--r--muse2/ChangeLog2
-rw-r--r--muse2/muse/audioconvert.cpp3
-rw-r--r--muse2/muse/audioconvert.h3
-rw-r--r--muse2/muse/liste/editevent.cpp5
-rw-r--r--muse2/muse/widgets/popupmenu.cpp166
-rw-r--r--muse2/muse/widgets/popupmenu.h5
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; }
};