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 whic=
h 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 QStri=
ng &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 =3D 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 =3D !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 %=3D m_players->rowCount();
+ =
+ //next player
+ do {
+ ++m_currentPlayer %=3D m_players->rowCount();
+ } while(!m_players->player(m_currentPlayer)->isSelected());
}
m_last=3D0;
}
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 =3D KGlobal::dirs()->findAllResources("appdata", QLatin1=
String( "players/*.png"));
=
@@ -66,11 +67,9 @@ void PlayersModel::refresh()
int i=3D0;
foreach(const QString& name, players) {
QString icon =3D icons[i];
- bool exists =3D (m_playerIcons.count(icon) > 0);
- if(!exists)
- {
+ if(!m_playerIcons.contains(icon))
icon =3D randomIcon();
- }
+ =
addPlayer(name, icon);
i++;
}
@@ -84,7 +83,7 @@ PairsPlayer* PlayersModel::player(int row)
QString PlayersModel::randomIcon()
{
int row =3D qrand() % m_playerIcons.count();
- QString result =3D "file://" + m_playerIcons[row]; =
=
+ QString result =3D "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 =3D 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=3Dplayer(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 =3D 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 =3D 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=3D"clicked"; }
onEntered: button.state=3D"hovered"
onExited: button.state=3D"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=3D"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=3D=3D"playing"
- onClicked: {
- playersModel.newGame()
- game.state=3D"newgame"
- }
+ onClicked: game.state=3D"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 =3D state=3D=3D"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: "lightb=
lue" }
- }
- ]
- 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/li=
st-remove-user.png")
+ visible: game.state=3D=3D"newgame" || selected
+ =
+ enabled: selected
+ onClicked: playersModel.toggleSelection(index)
+ }
}
}
}
=
Row {
+ id: controls
visible: game.state=3D=3D'newgame'
anchors.bottom: parent.bottom
Column {
@@ -191,11 +155,6 @@ Rectangle
source: playersModel.iconsDir("gameicons/list-add-user.png=
")
onClicked: playersModel.addPlayer(playerName.text, newUser=
Picture.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=3DthemesView.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 @@
qml/Board.qml
qml/Button.qml
qml/OptionsPage.qml
+ qml/TogglableButton.qml
qml/SelectableListView.qml