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

List:       kde-commits
Subject:    [pairs/new_qml2] src: Refactor the players model.
From:       Aleix Pol <aleixpol () kde ! org>
Date:       2011-11-30 23:57:25
Message-ID: 20111130235725.10363A60C6 () git ! kde ! org
[Download RAW message or body]

Git commit 160a9ca85d18255324a3690200405e9c0f0c2a65 by Aleix Pol.
Committed on 01/12/2011 at 00:53.
Pushed by apol into branch 'new_qml2'.

Refactor the players model.
Don't destroy players when starting a new game. Instead just hide them.

M  +7    -0    src/pairsplayer.cpp
M  +1    -3    src/pairsplayer.h
M  +5    -1    src/pairsview.cpp
M  +9    -44   src/playersmodel.cpp
M  +4    -5    src/playersmodel.h
M  +38   -5    src/qml/Button.qml
M  +20   -61   src/qml/Main.qml
M  +0    -1    src/qml/OptionsPage.qml
A  +34   -0    src/qml/TogglableButton.qml     [License: UNKNOWN]  *
M  +1    -0    src/resources.qrc

The files marked with a * at the end have a non valid license. Please read: \
http://techbase.kde.org/Policies/Licensing_Policy and use the headers which are \
listed at that page.


http://commits.kde.org/pairs/160a9ca85d18255324a3690200405e9c0f0c2a65

diff --git a/src/pairsplayer.cpp b/src/pairsplayer.cpp
index 86a3717..fafc0cb 100644
--- a/src/pairsplayer.cpp
+++ b/src/pairsplayer.cpp
@@ -33,6 +33,7 @@ PairsPlayer::PairsPlayer(const QString &name, const QString &icon)
     setData(m_found, PlayersModel::Found);
     setData(m_seconds, PlayersModel::Time);
     setData(m_icon, Qt::DecorationRole);
+    setSelected(true);
 }
 
 void PairsPlayer::reset()
@@ -60,3 +61,9 @@ void PairsPlayer::incSeconds()
     m_seconds++;
     setData(m_seconds, PlayersModel::Time);
 }
+
+void PairsPlayer::setSelected(bool s)
+{
+    m_selected = s;
+    setData(m_selected, PlayersModel::Selected);
+}
diff --git a/src/pairsplayer.h b/src/pairsplayer.h
index 27ef0bc..249c258 100644
--- a/src/pairsplayer.h
+++ b/src/pairsplayer.h
@@ -26,7 +26,6 @@
 
 class PairsPlayer : public QStandardItem
 {
-
 public:
     PairsPlayer(const QString &name, const QString &icon);
     ~PairsPlayer(){}
@@ -39,7 +38,7 @@ public:
     int seconds() const {return m_seconds; }
     QString name() const {return m_name; }
     QString icon() const {return m_icon; }
-    void setSelected() { m_selected = !m_selected; }
+    void setSelected(bool s);
     bool isSelected() { return m_selected; }
 
 private:
@@ -49,7 +48,6 @@ private:
     int m_found;
     int m_seconds;
     bool m_selected;
-
 };
 
 #endif
diff --git a/src/pairsview.cpp b/src/pairsview.cpp
index 14ecc00..6d006f2 100644
--- a/src/pairsview.cpp
+++ b/src/pairsview.cpp
@@ -119,7 +119,11 @@ void PairsView::cardSelected(CardItem* card)
             QTimer::singleShot(500, m_last, SLOT(turn()));
             emit pair_missed();
             m_players->player(m_currentPlayer)->incMissed();
-            ++m_currentPlayer %= m_players->rowCount();
+            
+            //next player
+            do {
+                ++m_currentPlayer %= m_players->rowCount();
+            } while(!m_players->player(m_currentPlayer)->isSelected());
         }
         m_last=0;
     }
diff --git a/src/playersmodel.cpp b/src/playersmodel.cpp
index f0ed578..3e6322f 100644
--- a/src/playersmodel.cpp
+++ b/src/playersmodel.cpp
@@ -34,6 +34,7 @@ PlayersModel::PlayersModel(QObject* parent)
     names.insert(Missed, "missed");
     names.insert(Found, "found");
     names.insert(Time, "time");
+    names.insert(Selected, "selected");
     setRoleNames(names);
     m_playerIcons = KGlobal::dirs()->findAllResources("appdata", QLatin1String( \
"players/*.png"));  
@@ -66,11 +67,9 @@ void PlayersModel::refresh()
     int i=0;
     foreach(const QString& name, players) {
         QString icon = icons[i];
-        bool exists = (m_playerIcons.count(icon) > 0);
-        if(!exists)
-        {
+        if(!m_playerIcons.contains(icon))
             icon = randomIcon();
-        }
+        
         addPlayer(name, icon);
         i++;
     }
@@ -84,7 +83,7 @@ PairsPlayer* PlayersModel::player(int row)
 QString PlayersModel::randomIcon()
 {
     int row = qrand() % m_playerIcons.count();
-    QString result = "file://" + m_playerIcons[row];                           
+    QString result = "file://" + m_playerIcons[row];
     return result;
 }
 
@@ -99,34 +98,10 @@ void PlayersModel::addPlayer(const QString& name, const QString& \
decoration)  appendRow(new PairsPlayer(name, decoration));
 }
 
-void PlayersModel::setSelected(int row)
+void PlayersModel::toggleSelection(int row)
 {
-//      qDebug() << row << player(row);
-     player(row)->setSelected();
-}
-
-void PlayersModel::gameStarted()
-{
-     emit layoutAboutToBeChanged();
-     int i = 0;
-     while (i < rowCount())
-     {
-         if(!player(i)->isSelected())
-             removeRows(i, 1);
-         else
-             i++;             
-     }
-     changePersistentIndex(index(0,0), index(rowCount(),columnCount()));
-     emit layoutChanged();
-}                        
-
-void PlayersModel::newGame()
-{
-     emit layoutAboutToBeChanged();
-     removeRows(0, rowCount());
-     refresh();
-     changePersistentIndex(index(0,0), index(rowCount(),columnCount()));
-     emit layoutChanged();
+     PairsPlayer* p=player(row);
+     p->setSelected(!p->isSelected());
 }
 
 void PlayersModel::resetPlayers()
@@ -136,19 +111,9 @@ void PlayersModel::resetPlayers()
     }
 }
 
-void PlayersModel::removePlayers()
+void PlayersModel::removePlayer(int p)
 {
-     emit layoutAboutToBeChanged();
-     int i = 0;
-     while (i < rowCount())
-     {
-         if(player(i)->isSelected())
-             removeRows(i, 1);
-         else
-             i++;             
-     }
-     changePersistentIndex(index(0,0), index(rowCount(),columnCount()));
-     emit layoutChanged();
+    invisibleRootItem()->removeRow(p);
 }
 
 QString PlayersModel::iconsDir(const QString& path)
diff --git a/src/playersmodel.h b/src/playersmodel.h
index 3bef453..e7f85df 100644
--- a/src/playersmodel.h
+++ b/src/playersmodel.h
@@ -30,7 +30,8 @@ class PlayersModel : public QStandardItemModel
         enum PlayerRoles {
             Missed = Qt::UserRole + 1,
             Found,
-            Time
+            Time,
+            Selected
         };
         
         explicit PlayersModel(QObject* parent);
@@ -38,15 +39,13 @@ class PlayersModel : public QStandardItemModel
         
         PairsPlayer* player(int row);
         Q_SCRIPTABLE void addPlayer(const QString& player, const QString& \
                decoration);
-        Q_SCRIPTABLE void removePlayers();
+        Q_SCRIPTABLE void removePlayer(int index);
         void resetPlayers();
         
     public slots:
         QVariant info(int row, const QByteArray& role);
-        void setSelected(int row);
+        void toggleSelection(int row);
         QString randomIcon();
-        void gameStarted();
-        void newGame();
         QString iconsDir(const QString& path);
 
     
diff --git a/src/qml/Button.qml b/src/qml/Button.qml
index dec9421..31ce7b5 100644
--- a/src/qml/Button.qml
+++ b/src/qml/Button.qml
@@ -3,18 +3,25 @@ import QtQuick 1.1
 Rectangle{
     id: button
     width: 100
-    height: 200
+    height: 100
     color: "transparent"
     signal clicked;
+    signal overlayClicked;
+    
     property alias text: caption.text
     property alias source: icon.source
+    property alias overlaySource: ovelay.source
+    property alias hoverEnabled: mouse.hoverEnabled
     Image {
+        id: icon
         anchors.top: parent.top
         anchors.horizontalCenter: button.horizontalCenter
-        id: icon
-        width: 100
-        height: 100
+        fillMode: Image.PreserveAspectFit
+        
+        width: parent.width*2/3
+        height: parent.height*2/3
     }
+    
     Text {
        id: caption
        width: 100
@@ -24,13 +31,31 @@ Rectangle{
        wrapMode: Text.WordWrap
        font.pointSize: 18
     }
+    
     MouseArea {
+        id: mouse
         anchors.fill: parent
         hoverEnabled: true
-        onClicked: button.clicked();
+        onClicked: { button.clicked(); button.state="clicked"; }
         onEntered: button.state="hovered"
         onExited: button.state="default"
     }
+    
+    Image { 
+        id: ovelay
+        
+        visible: mouse.containsMouse
+        width: parent.width/3
+        height: parent.height/3
+        anchors.top: parent.top
+        anchors.right: parent.right
+        
+        MouseArea {
+            anchors.fill: parent
+            onClicked: { button.overlayClicked(); button.state="ovcli"; }
+        }
+    }
+    
     states: [
         State {
             name: "default"
@@ -39,6 +64,14 @@ Rectangle{
         State {
             name: "hovered"
             PropertyChanges { target: caption; color: "red" }
+        },
+        State {
+            name: "clicked"
+            PropertyChanges { target: caption; color: "green" }
+        },
+        State {
+            name: "ovcli"
+            PropertyChanges { target: caption; color: "white" }
         }
     ]
 }
diff --git a/src/qml/Main.qml b/src/qml/Main.qml
index d41852b..82e2cee 100644
--- a/src/qml/Main.qml
+++ b/src/qml/Main.qml
@@ -78,6 +78,7 @@ Rectangle
         anchors.left: parent.left
         
         Row{
+            id: tools
             Button {
                 source: playersModel.iconsDir("gameicons/get-hot-new-stuff.png")
                 text: "Download Themes"
@@ -87,10 +88,7 @@ Rectangle
                 source: playersModel.iconsDir("gameicons/newgame.png")
                 text: "New Game"
                 visible: game.state=="playing"
-                onClicked: {
-                    playersModel.newGame()
-                    game.state="newgame"
-                }
+                onClicked: game.state="newgame"
             }
             Button {
                 source: playersModel.iconsDir("gameicons/quit.png")
@@ -101,70 +99,36 @@ Rectangle
             }
         }
         
-        Component {
-            id: togglebutton
-            Rectangle {
-                id: container; 
-                width: 100; 
-                height: 120
-                function toggle() {
-                    playersModel.setSelected(index)
-                    state = state=="on" ? "off" : "on"
-                }
-                property bool on: false // variable for outside world
-                state: "on"
-                states: [
-                    State {
-                        name: "on";
-                        PropertyChanges{ target: container; color: "blue" }
-                    },
-                    State {
-                        name: "off";
-                        PropertyChanges{ target: container; color: "lightblue" }
-                    }
-                ]
-                MouseArea { 
-                    id: region; 
-                    anchors.fill: parent; 
-                    onClicked: {  
-                        container.toggle() 
-                    }
-                }
-                // some fanciness
-                //color: Behavior { ColorAnimation { duration: 500 } }
-                    
-                Image {
-                    id: image
-                    width: 95
-                    height: 95
-                    anchors.top: parent.top
-                    //anchors.centerIn: parent
-                    source: decoration
-                }
-                Text {
-                    id: text
-                    anchors.top: image.bottom
-                    horizontalAlignment: Text.AlignHCenter
-                    font.pointSize: 12
-                    text: display+" "+missed+" "+found+" "+time
-                }
-            }
-        }
         ListView {
             id: players
-            height: 200
             width: parent.width
             anchors.horizontalCenter: parent.horizontalCenter
+            anchors.top: tools.bottom
+            anchors.bottom: controls.top
+            
+            clip: true
+            
             Grid {
-                columns : 3            
+                columns: 3
+                spacing: 10
+                
                 Repeater {
                     model: playersModel
-                    delegate: togglebutton  
+                    delegate: TogglableButton {
+                        text: display+" "+missed+" "+found+" "+time
+                        source: decoration
+                        overlaySource: \
playersModel.iconsDir("gameicons/list-remove-user.png") +                        \
visible: game.state=="newgame" || selected +                        
+                        enabled: selected
+                        onClicked: playersModel.toggleSelection(index)
+                    }
                 }
             }
         }
         
         Row {
+            id: controls
             visible: game.state=='newgame'
             anchors.bottom: parent.bottom
             Column {
@@ -191,11 +155,6 @@ Rectangle
                 source: playersModel.iconsDir("gameicons/list-add-user.png")
                 onClicked: playersModel.addPlayer(playerName.text, \
newUserPicture.source)   }
-            Button { 
-                text: "Delete Selected"; 
-                source: playersModel.iconsDir("gameicons/list-remove-user.png")
-                onClicked: playersModel.removePlayers() 
-            }
         }
     }
     
diff --git a/src/qml/OptionsPage.qml b/src/qml/OptionsPage.qml
index 52a8dc9..a134618 100644
--- a/src/qml/OptionsPage.qml
+++ b/src/qml/OptionsPage.qml
@@ -62,7 +62,6 @@ Rectangle {
                         var idx=themesView.indexAt(mouse.x, mouse.y)
                         gameStarted()
                         fgame.newGame(idx, gameLanguage, gameType)
-                        playersModel.gameStarted();
                     }
                 }
                 
diff --git a/src/qml/TogglableButton.qml b/src/qml/TogglableButton.qml
new file mode 100644
index 0000000..a493155
--- /dev/null
+++ b/src/qml/TogglableButton.qml
@@ -0,0 +1,34 @@
+import QtQuick 1.0
+
+Rectangle
+{
+    id: container
+    width: 100; 
+    height: 120
+    
+    property bool enabled: true
+    property alias text: button.text
+    property alias source: button.source
+    property alias overlaySource: button.overlaySource
+    signal overlayClicked
+    signal clicked
+    
+    state: enabled ? "off" : "on"
+    states: [
+        State {
+            name: "on";
+            PropertyChanges{ target: container; color: "blue" }
+        },
+        State {
+            name: "off";
+            PropertyChanges{ target: container; color: "lightblue" }
+        }
+    ]
+    
+    Button {
+        id: button
+        
+        onClicked: container.clicked()
+        onOverlayClicked: container.overlayClicked()
+    }
+}
\ No newline at end of file
diff --git a/src/resources.qrc b/src/resources.qrc
index 53e49cd..83d3db2 100644
--- a/src/resources.qrc
+++ b/src/resources.qrc
@@ -4,6 +4,7 @@
     <file>qml/Board.qml</file>
     <file>qml/Button.qml</file>
     <file>qml/OptionsPage.qml</file>
+    <file>qml/TogglableButton.qml</file>
     <file>qml/SelectableListView.qml</file>
  </qresource>
 </RCC>


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

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