added store view implementation

This commit is contained in:
Andrei Yankovich 2021-08-13 22:07:19 +03:00
parent d5cd452ee2
commit dd206439d6
21 changed files with 365 additions and 28 deletions

View File

@ -37,6 +37,17 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::Snake</name>
<message>
<source>JungleSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>JungleSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::World</name>
<message>
@ -100,4 +111,15 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TestLvl::TestSnake</name>
<message>
<source>TestSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TestSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -37,6 +37,17 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::Snake</name>
<message>
<source>JungleSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>JungleSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::World</name>
<message>
@ -100,4 +111,15 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TestLvl::TestSnake</name>
<message>
<source>TestSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TestSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -37,6 +37,17 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::Snake</name>
<message>
<source>JungleSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>JungleSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::World</name>
<message>
@ -100,4 +111,15 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TestLvl::TestSnake</name>
<message>
<source>TestSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TestSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -37,6 +37,17 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::Snake</name>
<message>
<source>JungleSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>JungleSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::World</name>
<message>
@ -100,4 +111,15 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TestLvl::TestSnake</name>
<message>
<source>TestSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TestSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -37,6 +37,17 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::Snake</name>
<message>
<source>JungleSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>JungleSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::World</name>
<message>
@ -100,4 +111,15 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TestLvl::TestSnake</name>
<message>
<source>TestSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TestSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -37,6 +37,17 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::Snake</name>
<message>
<source>JungleSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>JungleSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::World</name>
<message>
@ -100,4 +111,15 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TestLvl::TestSnake</name>
<message>
<source>TestSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TestSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -37,6 +37,17 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::Snake</name>
<message>
<source>JungleSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>JungleSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::World</name>
<message>
@ -100,4 +111,15 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TestLvl::TestSnake</name>
<message>
<source>TestSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TestSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -37,6 +37,17 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::Snake</name>
<message>
<source>JungleSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>JungleSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::World</name>
<message>
@ -100,4 +111,15 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TestLvl::TestSnake</name>
<message>
<source>TestSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TestSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -37,6 +37,17 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::Snake</name>
<message>
<source>JungleSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>JungleSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::World</name>
<message>
@ -100,4 +111,15 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TestLvl::TestSnake</name>
<message>
<source>TestSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TestSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -37,6 +37,17 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::Snake</name>
<message>
<source>JungleSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>JungleSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>JungleLvl::World</name>
<message>
@ -100,4 +111,15 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TestLvl::TestSnake</name>
<message>
<source>TestSnake</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>TestSnake Snake</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -25,5 +25,6 @@
<file>CrawlModule/particles/Fire.qml</file>
<file>CrawlModule/particles/Wint.qml</file>
<file>CrawlModule/PreviewControl.qml</file>
<file>CrawlModule/StoreView.qml</file>
</qresource>
</RCC>

View File

@ -67,14 +67,11 @@ ClientApp::~ClientApp() {
_availableLvls.clear();
}
void ClientApp::initStore(Store *store) {
QMultiHash<int, const IItem *> storeItems;
void ClientApp::initStore(QMultiHash<int, const IItem *> & result) {
for (const auto &data : qAsConst(_availableLvls)) {
if (data.model && data.model->world())
storeItems.unite(data.model->world()->childItemsRecursive());
result.unite(data.model->world()->childItemsRecursive());
}
store->init(storeItems);
}
void ClientApp::changeLevel(int lvl) {
@ -133,9 +130,11 @@ bool ClientApp::init(QQmlApplicationEngine *engine) {
if (engine->rootObjects().isEmpty())
return false;
QMultiHash<int, const IItem *> availabelItems;
initStore(availabelItems);
_engine->initStore(availabelItems);
_engine->setLevel(getLastLevel());
_engine->setQmlEngine(engine);
initStore(_engine->store());
return true;
}

View File

@ -69,7 +69,12 @@ private:
QByteArray initTheme();
ILevel *getLastLevel();
void initStore(Store* store);
/**
* @brief initStore This method push to @a result map all available store items.
* @param result This is result value. Hash map of the available items.
*/
void initStore(QMultiHash<int, const IItem *> &result);
/**
* @brief addLvl This method should be add level to game.
* @param levelWordl This is world instance

View File

@ -34,6 +34,11 @@ ApplicationWindow {
anchors.fill: parent;
}
StoreView {
model: (mainWindow.model)? mainWindow.model.storeView: null
anchors.fill: parent;
}
MainMenu {
model: (mainmenu)? mainmenu: null;

View File

@ -0,0 +1,65 @@
import QtQuick
import ViewSolutionsModule
import QtQuick.Controls
import QtQuick.Controls.Material
import QtQuick.Layouts
Page {
id: store
property var model: null;
visible: model && model.visible
ColumnLayout {
anchors.fill: parent
ListView {
id: listView
Layout.fillHeight: true
Layout.fillWidth: true
model: store.model
delegate: delegateRow
Component {
id: delegateRow
RowLayout {
width: listView.width
height: 100
Image {
id: img
fillMode: Image.PreserveAspectCrop
source: itemImage
Layout.fillHeight: true
Layout.preferredWidth: height * 2
}
Label {
text: itemName
Layout.fillHeight: true
}
Label {
text: itemDescription
Layout.fillWidth: true
Layout.fillHeight: true
}
CheckBox {
id: buyStatus
tristate: false
checkState: (itemWasBuy)? Qt.Checked: Qt.Unchecked
enabled: false
}
Button {
text: qsTr("Buy");
visible: !itemWasBuy
onClicked: () => {
if (store.model)
store.model.buy(itemId);
}
}
}
}
}
}
}

View File

@ -24,6 +24,7 @@ namespace CRAWL {
Engine::Engine(QObject *parent): QObject(parent) {
_store = new Store();
_storeView = new StoreViewModel;
_currentUser = new User();
}
@ -36,14 +37,9 @@ QObject *Engine::scane() {
return _scane;
}
void Engine::setQmlEngine(QQmlEngine *newEngine) {
if (_engine == newEngine)
return;
_engine = newEngine;
}
void Engine::setLevel(ILevel *world) {
_storeView->setVisible(!world);
if (_currentLevel == world)
return ;

View File

@ -45,12 +45,6 @@ public:
*/
Q_INVOKABLE QObject* scane();
/**
* @brief setQmlEngine This method sets qml engine
* @param newEngine This is pointer to the qml engine.
*/
void setQmlEngine(QQmlEngine *newEngine);
/**
* @brief setLevel This method set new world level for game.
* @param world This is pointer to new world level.
@ -157,7 +151,6 @@ private:
void renderLoop();
QObject *_scane = nullptr;
QQmlEngine *_engine = nullptr;
ILevel* _currentLevel = nullptr;
quint64 _oldTimeRender = 0;

View File

@ -60,7 +60,7 @@ QHash<int, QByteArray> StoreViewModel::roleNames() const {
return roles;
}
void StoreViewModel::init(const Store * store, const User* user) {
void StoreViewModel::init(Store *store, User *user) {
setUser(user);
int diff = store->size() - _keys.size();
@ -86,8 +86,25 @@ void StoreViewModel::init(const Store * store, const User* user) {
}
}
void StoreViewModel::setUser(const User *user) {
void StoreViewModel::setUser(User *user) {
_currentUser = user;
emit dataChanged(index(0,0), index(rowCount() - 1, columnCount() - 1), {ItemWasBuy});
}
bool StoreViewModel::visible() const {
return _visible;
}
void StoreViewModel::setVisible(bool newVisible) {
if (_visible == newVisible)
return;
_visible = newVisible;
emit visibleChanged();
}
void StoreViewModel::buy(int item) {
if (_store && _currentUser) {
_store->buy(*_currentUser, item);
}
}
}

View File

@ -21,6 +21,11 @@ class User;
class StoreViewModel: public QAbstractListModel
{
Q_OBJECT
/**
* @brief visible If you sets thsis proprtye to false then store view qml view will be hide.
*/
Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
public:
StoreViewModel();
@ -36,13 +41,35 @@ public:
* @param user This is new pointer to current user.
* @see StoreViewModel::setUser
*/
void init(const Store * store, const User* user);
void init(Store * store, User* user);
/**
* @brief setUser This method update user pointer
* @param user This is new pointer to current user.
*/
void setUser(const User* user);
void setUser(User* user);
/**
* @brief visible This method return true if the store view is visible.
* @return true if the store view is visible.
*/
bool visible() const;
/**
* @brief setVisible This method chnge the visible state of the qml view of store.
* @param newVisible This is new value of the qml-store visible
*/
void setVisible(bool newVisible);
/**
* @brief buy This is qml method for receive signal from view about buying item.
* @param item This is item id that user want to buy.
*/
Q_INVOKABLE void buy(int item);
signals:
void visibleChanged();
private:
enum StoreRoles {
@ -53,9 +80,10 @@ private:
ItemWasBuy
};
const Store *_store = nullptr;
Store *_store = nullptr;
QList<int> _keys;
const User* _currentUser = nullptr;
User* _currentUser = nullptr;
bool _visible = false;
};
}

View File

@ -60,6 +60,7 @@ bool User::isUnlocked(int item) const {
void User::unclokItem(int item) {
_unlockedItems.insert(item);
emit itemUlocked({item});
}
void User::droppItem(int item) {
@ -68,6 +69,7 @@ void User::droppItem(int item) {
void User::setUnlockedItems(const QSet<int> &newUnlockedItems) {
_unlockedItems = newUnlockedItems;
emit itemUlocked(newUnlockedItems);
}
int User::recalcTier() {

View File

@ -144,6 +144,12 @@ signals:
void tierChanged();
void xpChanged();
/**
* @brief itemUlocked This signal emited when user unlocked item.
* @param unclokedItems This is unlocked items set. Each items in the set is id of the unclocked item.
*/
void itemUlocked(const QSet<int> & unclokedItems);
protected:
/**
* @brief setUnlockedItems This method sets new set of uncloked items