Ticket #791: new_ui_mouse_support_2.diff

File new_ui_mouse_support_2.diff, 7.2 KB (added by mfgalizi@…, 14 years ago)

Support for held gestures

  • mythmainwindow.cpp

     
    2929
    3030//#include "screensaver.h"
    3131
     32#include "mythstroke.h"
     33#define GESTURE_TIMEOUT 1000
     34
    3235#ifdef USE_LIRC
    3336static void *SpawnLirc(void *param)
    3437{
     
    127130
    128131    bool AllowInput;
    129132
     133    MythStroke stroker;
     134    QTimer *strokeTimer;
     135
    130136    QRegion repaintRegion;
    131137};
    132138
     
    197203    d->escapekey = Key_Escape;
    198204    d->mainStack = NULL;
    199205
     206    installEventFilter(this);
     207
    200208#ifdef USE_LIRC
    201209    pthread_t lirc_tid;
    202210    pthread_attr_t attr;
     
    238246
    239247    setAutoBufferSwap(false);
    240248
     249    d->strokeTimer = new QTimer(this);
     250    connect(d->strokeTimer, SIGNAL(timeout()), this, SLOT(mouseTimeout()));
     251
    241252    d->drawTimer = new QTimer(this);
    242253    connect(d->drawTimer, SIGNAL(timeout()), this, SLOT(drawTimeout()));
    243254    d->drawTimer->start(1000 / 70);
     
    724735    d->AllowInput = allow;
    725736}
    726737
    727 void MythMainWindow::keyPressEvent(QKeyEvent *e)
     738void MythMainWindow::mouseTimeout()
    728739{
     740    MythGestureEvent *e;
     741
     742    /* complete the stroke if its our first timeout */
     743    if (d->stroker.recording())
     744    {
     745        d->stroker.stop();
     746    }
     747
     748    /* get the last gesture */
     749    e = d->stroker.gesture();
     750
     751    if (e->gesture() < MythGestureEvent::Click)
     752        QApplication::postEvent(this, e);
     753}
     754
     755bool MythMainWindow::eventFilter(QObject *o, QEvent *e)
     756{
     757
     758    MythGestureEvent *ge;
     759
     760    /* dont let anything through if input is disallowed. */
    729761    if (!d->AllowInput)
    730         return;
     762        return true;
    731763
    732     QValueVector<MythScreenStack *>::Iterator it;
    733     for (it = d->stackList.begin(); it != d->stackList.end(); ++it)
     764    /* filter mouse events */
     765    switch (e->type())
    734766    {
    735          MythScreenType *top = (*it)->GetTopScreen();
    736          if (top)
    737          {
    738              if (top->keyPressEvent(e))
    739                  break;
    740          }
     767    case QEvent::KeyPress:
     768
     769        QValueVector<MythScreenStack *>::Iterator it;
     770        for (it = d->stackList.begin(); it != d->stackList.end(); ++it)
     771        {
     772            MythScreenType *top = (*it)->GetTopScreen();
     773            if (top)
     774            {
     775                if (top->keyPressEvent(dynamic_cast<QKeyEvent*>(e)))
     776                    return true;
     777            }
     778        }
     779        break;
     780
     781    case QEvent::MouseButtonPress:
     782
     783        if (!d->stroker.recording())
     784        {
     785            d->stroker.start();
     786            d->stroker.record(dynamic_cast<QMouseEvent*>(e)->pos());
     787
     788            /* start a single shot timer */
     789            d->strokeTimer->start(GESTURE_TIMEOUT);
     790
     791            return true;
     792        }
     793
     794    case QEvent::MouseButtonRelease:
     795
     796        if (d->strokeTimer->isActive())
     797            d->strokeTimer->stop();
     798
     799        if (d->stroker.recording())
     800        {
     801            d->stroker.stop();
     802            ge = d->stroker.gesture();
     803
     804            /* handle clicks separately */
     805            if (ge->gesture() == MythGestureEvent::Click)
     806            {           
     807                MythUIType *clicked;
     808                QValueVector<MythScreenStack *>::iterator it;
     809                QPoint p = dynamic_cast<QMouseEvent*>(e)->pos();
     810
     811                delete ge;
     812
     813                for (it = d->stackList.begin(); it != d->stackList.end(); it++)
     814                {
     815                    MythScreenType *screen = (*it)->GetTopScreen();
     816                    if ((clicked = screen->GetChildAt(p)) != NULL)
     817                    {
     818                        cout << "UI Type: " << clicked->name() << endl;
     819                        break;
     820                    }
     821                }
     822            }
     823            else QApplication::postEvent(this, ge);
     824
     825            return true;
     826        }
     827
     828    case QEvent::MouseMove:
     829
     830        if (d->stroker.recording())
     831        {
     832            /* reset the timer */
     833            d->strokeTimer->stop();
     834            d->strokeTimer->start(GESTURE_TIMEOUT);
     835
     836            d->stroker.record(dynamic_cast<QMouseEvent*>(e)->pos());
     837            return true;
     838        }
     839
     840    default:
     841        break;       
    741842    }
     843
     844    return false;
    742845}
    743846
    744 void MythMainWindow::customEvent(QCustomEvent* /* ce */)
     847void MythMainWindow::customEvent(QCustomEvent* ce)
    745848{
     849
     850    if (ce->type() == MythGestureEventType)
     851    {
     852        MythGestureEvent *ge = dynamic_cast<MythGestureEvent*>(ce);
     853        if (ge != NULL)
     854        {
     855            cout << "Gesture: " << QString(*ge) << endl;
     856        }
     857    }
     858
     859
    746860#if 0
    747861    if (ce->type() == kExitToMainMenuEventType && d->exitingtomain)
    748862    {
  • mythuitype.cpp

     
    8282    return &m_ChildrenList;
    8383}
    8484
     85MythUIType *MythUIType::GetChildAt(const QPoint &p)
     86{
     87    if (GetArea().contains(p)) {
     88
     89        /* assumes no selectible ui type will contain another
     90         * selectible ui type. */
     91        if (CanTakeFocus() && IsVisible()) return this;
     92
     93        /* check all children */
     94        QValueVector<MythUIType*>::iterator it;
     95        for (it = m_ChildrenList.begin(); it != m_ChildrenList.end(); ++it)
     96        {
     97            MythUIType *child = (*it)->GetChildAt(p - GetArea().topLeft());
     98            if (child != NULL)
     99            {
     100                return child;
     101            }
     102        }
     103    }
     104    return NULL;
     105}
     106
    85107bool MythUIType::NeedsRedraw(void)
    86108{
    87109    return m_NeedsRedraw;
  • mythmainwindow.h

     
    8585 
    8686  public slots:
    8787    void drawTimeout();
     88    void mouseTimeout();
    8889
    8990  protected:
    9091    MythMainWindow();
    9192
    92     void keyPressEvent(QKeyEvent *e);
     93    bool eventFilter(QObject *o, QEvent *e);
    9394    void customEvent(QCustomEvent *ce);
    9495    void closeEvent(QCloseEvent *e);
    9596    void paintEvent(QPaintEvent *e);
  • libmythui.pro

     
    2828SOURCES += mythscreenstack.cpp mythscreentype.cpp
    2929SOURCES += mythuitype.cpp mythuiimage.cpp mythuitext.cpp
    3030SOURCES += mythuistatetype.cpp mythlistbutton.cpp mythfontproperties.cpp
    31 SOURCES += mythuibutton.cpp themedmenu.cpp dialogbox.cpp
     31SOURCES += mythuibutton.cpp themedmenu.cpp dialogbox.cpp mythstroke.cpp
    3232
    3333inc.path = $${PREFIX}/include/mythui/
    3434
     
    3636inc.files += mythpainter_ogl.h mythpainter_qt.h mythuistatetype.h
    3737inc.files += mythscreenstack.h mythscreentype.h mythuitype.h mythuiimage.h
    3838inc.files += mythuitext.h mythuibutton.h mythlistbutton.h
    39 inc.files += themedmenu.h dialogbox.h mythfontproperties.h
     39inc.files += themedmenu.h dialogbox.h mythfontproperties.h mythstroke.h
    4040
    4141INSTALLS += inc
    4242
  • mythuitype.h

     
    2525    void AddChild(MythUIType *child);
    2626    MythUIType *GetChild(const char *name, const char *inherits = 0);
    2727    QValueVector<MythUIType *> *GetAllChildren(void);
     28    MythUIType *GetChildAt(const QPoint &p);
    2829
    2930    // Check set dirty status
    3031    bool NeedsRedraw(void);