[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdegames/kmines
From:       Dmitry Suzdalev <dimsuz () gmail ! com>
Date:       2009-05-26 21:07:13
Message-ID: 1243372033.978783.26184.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 973337 by dimsuz:

Properly do emulating mid mouse button with left+right buttons
Involves some logic changes, I'd be grateful for any testing :)

BUG: 190271


 M  +99 -61    minefielditem.cpp  
 M  +1 -0      minefielditem.h  


--- trunk/KDE/kdegames/kmines/minefielditem.cpp #973336:973337
@@ -26,7 +26,8 @@
 #include "renderer.h"
 
 MineFieldItem::MineFieldItem()
-    : m_leftButtonPos(-1,-1), m_midButtonPos(-1,-1), m_gameOver(false)
+    : m_leftButtonPos(-1,-1), m_midButtonPos(-1,-1), m_gameOver(false),
+      m_emulatingMidButton(false)
 {
 }
 
@@ -311,29 +312,17 @@
     if( row <0 || row >= m_numRows || col < 0 || col >= m_numCols )
         return;
 
-    if(ev->button() == Qt::LeftButton)
+    CellItem* itemUnderMouse = itemAt(row,col);
+    if(!itemUnderMouse)
     {
-        itemAt(row,col)->press();
-        m_leftButtonPos = qMakePair(row,col);
+        kDebug() << "unexpected - no item under mouse";
+        return;
     }
-    else if(ev->button() == Qt::RightButton)
-    {
-        CellItem* itemUnderMouse = itemAt(row,col);
-        bool wasFlagged = itemUnderMouse->isFlagged();
 
-        itemUnderMouse->mark();
+    m_emulatingMidButton = ( (ev->buttons() & Qt::LeftButton) && (ev->buttons() & \
Qt::RightButton) ); +    bool midButtonPressed = (ev->button() == Qt::MidButton || \
m_emulatingMidButton );  
-        bool flagStateChanged = (itemUnderMouse->isFlagged() != wasFlagged);
-        if(flagStateChanged)
-        {
-            if(itemUnderMouse->isFlagged())
-                m_flaggedMinesCount++;
-            else
-                m_flaggedMinesCount--;
-            emit flaggedMinesCountChanged(m_flaggedMinesCount);
-        }
-    }
-    else if(ev->button() == Qt::MidButton || ( ev->buttons() & ( Qt::LeftButton | \
Qt::RightButton) ) ) +    if(midButtonPressed)
     {
         QList<CellItem*> neighbours = adjasentItemsFor(row,col);
         foreach(CellItem* item, neighbours)
@@ -341,8 +330,15 @@
             if(!item->isFlagged() && !item->isQuestioned() && !item->isRevealed())
                 item->press();
             m_midButtonPos = qMakePair(row,col);
+
+            m_leftButtonPos = qMakePair(-1,-1); // reset it
         }
     }
+    else if(ev->button() == Qt::LeftButton)
+    {
+        itemUnderMouse->press();
+        m_leftButtonPos = qMakePair(row,col);
+    }
 }
 
 void MineFieldItem::mouseReleaseEvent( QGraphicsSceneMouseEvent * ev)
@@ -367,6 +363,7 @@
             foreach(CellItem *item, neighbours)
                 item->undoPress();
             m_midButtonPos = qMakePair(-1,-1);
+            m_emulatingMidButton = false;
         }
         // same with left button
         if(m_leftButtonPos.first != -1)
@@ -379,38 +376,17 @@
 
     CellItem* itemUnderMouse = itemAt(row,col);
 
-    if(ev->button() == Qt::LeftButton)
-    {
-        if(m_midButtonPos.first != -1) // mid-button is already pressed
-        {
-            itemUnderMouse->undoPress();
-            return;
-        }
+    // NOTE: as left+right buttons can emulate midbutton, releasing any of them \
means dropping midbutton pressed state. +    // Though in this case midbutton we need \
to be careful to not count separate releases of left or right buttons, +    // while \
other is still being pressed - we reset m_midButtonPos only when last of them has \
been released. +    // When no emulation takes place, we reset it immediately.
+    
+    bool midButtonReleased = (ev->button() == Qt::MidButton || \
m_emulatingMidButton);  
-        // this can happen like this:
-        // mid-button pressed, left-button pressed, mid-button released, left-button \
                released
-        // m_leftButtonPos never gets set in this scenario, so we must protect \
                ourselves :)
-        if(m_leftButtonPos.first == -1)
-            return;
-
-        if(!itemUnderMouse->isRevealed()) // revealing only unrevealed ones
-        {
-            if(m_firstClick)
-            {
-                m_firstClick = false;
-                generateField( row*m_numCols + col );
-                emit firstClickDone();
-            }
-
-            itemUnderMouse->release();
-            if(itemUnderMouse->isRevealed())
-                onItemRevealed(row,col);
-        }
-        m_leftButtonPos = qMakePair(-1,-1);//reset
-    }
-    else if( ev->button() == Qt::MidButton )
+    if( midButtonReleased )
     {
-        m_midButtonPos = qMakePair(-1,-1);
+        if(!m_emulatingMidButton)
+            m_midButtonPos = qMakePair(-1,-1); // see note above
 
         QList<CellItem*> neighbours = adjasentItemsFor(row,col);
         if(!itemUnderMouse->isRevealed())
@@ -448,6 +424,65 @@
                 item->undoPress();
         }
     }
+    else if(ev->button() == Qt::LeftButton && (ev->buttons() & Qt::RightButton) == \
false) +    {
+        if(m_midButtonPos.first != -1) // mid-button is already pressed
+        {
+            itemUnderMouse->undoPress();
+            return;
+        }
+
+        if(m_emulatingMidButton)
+        {
+            m_midButtonPos = qMakePair(-1,-1); // see note above
+            m_emulatingMidButton = false;
+            return;
+        }
+
+        // this can happen like this:
+        // mid-button pressed, left-button pressed, mid-button released, left-button \
released +        // m_leftButtonPos never gets set in this scenario, so we must \
protect ourselves :) +        if(m_leftButtonPos.first == -1)
+            return;
+
+        if(!itemUnderMouse->isRevealed()) // revealing only unrevealed ones
+        {
+            if(m_firstClick)
+            {
+                m_firstClick = false;
+                generateField( row*m_numCols + col );
+                emit firstClickDone();
+            }
+
+            itemUnderMouse->release();
+            if(itemUnderMouse->isRevealed())
+                onItemRevealed(row,col);
+        }
+        m_leftButtonPos = qMakePair(-1,-1);//reset
+    }
+    else if(ev->button() == Qt::RightButton && (ev->buttons() & Qt::RightButton) == \
false) +    {
+        if(m_emulatingMidButton)
+        {
+            m_midButtonPos = qMakePair(-1,-1); // see note above
+            m_emulatingMidButton = false;
+            return;
+        }
+
+        bool wasFlagged = itemUnderMouse->isFlagged();
+
+        itemUnderMouse->mark();
+
+        bool flagStateChanged = (itemUnderMouse->isFlagged() != wasFlagged);
+        if(flagStateChanged)
+        {
+            if(itemUnderMouse->isFlagged())
+                m_flaggedMinesCount++;
+            else
+                m_flaggedMinesCount--;
+            emit flaggedMinesCountChanged(m_flaggedMinesCount);
+        }
+    }
 }
 
 void MineFieldItem::mouseMoveEvent( QGraphicsSceneMouseEvent *ev )
@@ -463,18 +498,11 @@
     if( row < 0 || row >= m_numRows || col < 0 || col >= m_numCols )
         return;
 
-    if(ev->buttons() & Qt::LeftButton)
+    bool midButtonPressed = ((ev->buttons() & Qt::MidButton) ||
+                            ( (ev->buttons() & Qt::LeftButton) && (ev->buttons() & \
Qt::RightButton) ) ); +
+    if(midButtonPressed)
     {
-        if((m_leftButtonPos.first != -1 && m_leftButtonPos.second != -1) &&
-           (m_leftButtonPos.first != row || m_leftButtonPos.second != col))
-        {
-            itemAt(m_leftButtonPos)->undoPress();
-            itemAt(row,col)->press();
-            m_leftButtonPos = qMakePair(row,col);
-        }
-    }
-    if(ev->buttons() & Qt::MidButton)
-    {
         if((m_midButtonPos.first != -1 && m_midButtonPos.second != -1) &&
            (m_midButtonPos.first != row || m_midButtonPos.second != col))
         {
@@ -492,6 +520,16 @@
             m_midButtonPos = qMakePair(row,col);
         }
     }
+    else if(ev->buttons() & Qt::LeftButton)
+    {
+        if((m_leftButtonPos.first != -1 && m_leftButtonPos.second != -1) &&
+           (m_leftButtonPos.first != row || m_leftButtonPos.second != col))
+        {
+            itemAt(m_leftButtonPos)->undoPress();
+            itemAt(row,col)->press();
+            m_leftButtonPos = qMakePair(row,col);
+        }
+    }
 }
 
 void MineFieldItem::revealAllMines()
--- trunk/KDE/kdegames/kmines/minefielditem.h #973336:973337
@@ -195,6 +195,7 @@
     FieldPos m_midButtonPos;
     bool m_firstClick;
     bool m_gameOver;
+    bool m_emulatingMidButton;
     int m_numUnrevealed;
 };
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic