From kde-commits Wed Nov 30 23:57:25 2011 From: Aleix Pol Date: Wed, 30 Nov 2011 23:57:25 +0000 To: kde-commits Subject: [pairs/new_qml2] src: Refactor the players model. Message-Id: <20111130235725.10363A60C6 () git ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=132269753803219 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