[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