diff options
Diffstat (limited to 'muse2')
| -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; }  };  | 
