4
1
mirror of https://github.com/QuasarApp/Snake.git synced 2025-05-10 16:39:45 +00:00

fix lelect level view model

This commit is contained in:
Andrei Yankovich 2021-08-15 23:13:33 +03:00
parent 6158ce4a3b
commit 36b4ead978
12 changed files with 82 additions and 60 deletions

@ -118,7 +118,7 @@ Item {
id: selectLvl
source: SelectLevelView {
id: selectLvlView
model: root.model ? root.model.availableLvlsModel: null
model: root.model ? root.model.selectLevelModle: null
}

@ -20,12 +20,21 @@ Page {
id: delegateRow
Rectangle {
anchors.fill: parent
width: listView.width
height: 100
color: (itemId === store.model.currentLevel) ? "#ffaf2c": "#00000000"
Behavior on color {
ColorAnimation {
duration: 200
}
}
color: (itemId == currentLevel) ? "#ffaf2c": "#00000000"
RowLayout {
width: listView.width
height: 100
anchors.fill: parent
Image {
id: img
fillMode: Image.PreserveAspectCrop
@ -47,7 +56,7 @@ Page {
Button {
text: qsTr("Select");
visible: !itemWasBuy
visible: itemId !== store.model.currentLevel
onClicked: () => {
if (store.model)

@ -15,16 +15,6 @@ AvailableLevelsModel::AvailableLevelsModel() {
}
void AvailableLevelsModel::setAllLevels(const QList<const IItem *> &newAllLevels) {
_allLevels = newAllLevels;
QList<int> keys;
for (auto level: qAsConst(_allLevels)) {
keys += level->itemId();
}
setKeys(keys);
}
int AvailableLevelsModel::getCurrentLevel() const {
return currentLevel;
}
@ -38,12 +28,9 @@ void AvailableLevelsModel::setCurrentLevel(int newCurrentLevel) {
void AvailableLevelsModel::select(int levelId) {
if (getUser()->isUnlocked(levelId)) {
setCurrentLevel(levelId);
emit sigUserSelectLevel(levelId);
}
}
const IItem *AvailableLevelsModel::getItem(int id) const {
return _allLevels.value(id, nullptr);
}
}

@ -28,19 +28,12 @@ class AvailableLevelsModel: public BaseUserListModel
* @see AvailableLevelsModel::getCurrentLevel
* @see AvailableLevelsModel::setCurrentLevel
* @see AvailableLevelsModel::currentLevelChanged
*/
Q_PROPERTY(int currentLevel READ getCurrentLevel WRITE setCurrentLevel NOTIFY currentLevelChanged)
public:
AvailableLevelsModel();
/**
* @brief setAllLevels This method sets list of the available levels in game.
* @param newAllLevels This is new value of thge availabel games list.
*/
void setAllLevels(const QList<const IItem *> &newAllLevels);
/**
* @brief getCurrentLevel This method return value of the curernt level property
* @return value of the curernt level property
@ -66,10 +59,6 @@ public:
Q_INVOKABLE void select(int levelId);
// BaseUserListModel interface
protected:
const IItem *getItem(int id) const;
signals:
/**
* @brief currentLevelChanged This signal emited when the currentLevel propertye is changed.
@ -86,7 +75,6 @@ signals:
void sigUserSelectLevel(int level);
private:
QList<const IItem*> _allLevels;
int currentLevel = -1;
};

@ -8,7 +8,7 @@
#include "baseuserlistmodel.h"
#include "user.h"
#include "store.h"
#include <Crawl/iitem.h>
namespace CRAWL {
@ -43,6 +43,14 @@ int BaseUserListModel::getIndexById(int id) const {
return _keysIndexes.value(id, -1);
}
Store *BaseUserListModel::store() const {
return _store;
}
void BaseUserListModel::setStore(Store *newStore) {
_store = newStore;
}
const QList<int> &BaseUserListModel::keys() const {
return _keys;
}
@ -75,7 +83,7 @@ void BaseUserListModel::setKeys(const QList<int> &visibleKeysList) {
void BaseUserListModel::addKey(int newKey) {
beginInsertRows({}, _keys.size(), _keys.size());
_keys.push_back(newKey);
_keysIndexes[newKey] = _keys.size();
_keysIndexes[newKey] = _keys.size() - 1;
endInsertRows();
}
@ -83,12 +91,12 @@ void BaseUserListModel::removeKey(int oldKey) {
int idx = getIndexById(oldKey);
if (idx >= 0) {
beginInsertRows({}, _keys.size(), _keys.size());
beginRemoveRows({}, _keys.size(), _keys.size());
_keys.removeAt(idx);
_keysIndexes.remove(oldKey);
endInsertRows();
endRemoveRows();
}
}
@ -159,7 +167,10 @@ void BaseUserListModel::handleDroppedItem(int item) {
void BaseUserListModel::handleUnlockedItemsListChanged(const QSet<int> &) {
emit dataChanged(index(0,0), index(_keys.size() - 1, 0), {ItemWasBuy});
}
const IItem *BaseUserListModel::getItem(int id) const {
return _store->getItemById(id);
}
}

@ -14,6 +14,7 @@ namespace CRAWL {
class User;
class IItem;
class Store;
/**
* @brief The BaseUserListModel class This is base class wint implementation methods for working with user object.
@ -61,8 +62,28 @@ public:
QVariant data(const QModelIndex &index, int role) const override;
QHash<int, QByteArray> roleNames() const override;
/**
* @brief store This method return pointer to current store object.
* @return current store object.
*/
Store *store() const;
/**
* @brief setStore This method sets new pointer value for the store property.
* @param newStore This is new value of the store property
*/
void setStore(Store *newStore);
protected:
enum ViewItemRoles {
ItemId,
ItemName,
ItemImage,
ItemDescription,
ItemWasBuy
};
/**
* @brief getUser This method return pointer to current user.
* @return pointer to current user.
@ -92,7 +113,7 @@ protected:
* @param id This is item id
* @return const pointer to item object.
*/
virtual const IItem* getItem(int id) const = 0;
virtual const IItem* getItem(int id) const;
/**
* @brief getIndexById This method return index of the item by id.
@ -102,17 +123,11 @@ protected:
int getIndexById(int id) const;
private:
enum ViewItemRoles {
ItemId,
ItemName,
ItemImage,
ItemDescription,
ItemWasBuy
};
User * _user = nullptr;
QList<int> _keys;
QHash<int, int> _keysIndexes;
Store *_store = nullptr;
};
}

@ -138,6 +138,10 @@ void Engine::handleUnlockedItemsListChanged(const QSet<int> &newSet) {
static_cast<AvailableLevelsModel*>(_menu->selectLevelModle())->setKeys(QList<int>(newSet.begin(), newSet.end()));
}
void Engine::handleLevelChanged(int levelId) {
}
QObject *Engine::getGameObject(int id) const {
if (!_currentLevel)
return nullptr;
@ -227,14 +231,20 @@ void Engine::init(const QMultiHash<int, const IItem *> &availabelItems) {
_store->init(availabelItems);
static_cast<StoreViewModel*>(_menu->storeView())->init(_store, _currentUser);
QList<const IItem*> availableWorlds;
for (const IItem * item : availabelItems) {
QList<int> availableWorlds;
for (int id : _currentUser->unlockedItems()) {
auto item = availabelItems.value(id);
if (item->itemType() == IWorld::type()) {
availableWorlds.push_back(item);
availableWorlds.push_back(item->itemId());
}
}
static_cast<AvailableLevelsModel*>(_menu->selectLevelModle())->setAllLevels(availableWorlds);
#define selectedLevelModel static_cast<AvailableLevelsModel*>(_menu->selectLevelModle())
selectedLevelModel->setStore(_store);
selectedLevelModel->setKeys(availableWorlds);
connect(selectedLevelModel, &AvailableLevelsModel::sigUserSelectLevel,
this, &Engine::handleLevelChanged);
}
}

@ -174,6 +174,11 @@ private slots:
*/
void handleUnlockedItemsListChanged(const QSet<int>& newSet);
/**
* @brief handleLevelChanged This slot invoked when user select new level.
* @param levelId level id
*/
void handleLevelChanged(int levelId);
private:
void renderLoop();

@ -47,7 +47,7 @@ QObject *MainMenuModel::storeView() const {
return _storeView;
}
AvailableLevelsModel *MainMenuModel::selectLevelModle() const {
QObject *MainMenuModel::selectLevelModle() const {
return _selectLevelModle;
}

@ -31,7 +31,7 @@ class MainMenuModel : public QObject
Q_PROPERTY(QObject* userSettingsModel READ userSettingsModel NOTIFY userSettingsModelChanged)
Q_PROPERTY(bool visible READ getVisible WRITE setVisible NOTIFY visibleChanged)
Q_PROPERTY(QObject * storeView READ storeView NOTIFY storeViewChanged)
Q_PROPERTY(AvailableLevelsModel * selectLevelModle READ selectLevelModle NOTIFY selectLevelModleChanged)
Q_PROPERTY(QObject * selectLevelModle READ selectLevelModle NOTIFY selectLevelModleChanged)
public:
MainMenuModel(QObject *ptr = nullptr);
@ -65,7 +65,7 @@ public:
* @brief selectLevelModle This method return pointer to the available levels model.
* @return pointer to main available levels model.
*/
AvailableLevelsModel *selectLevelModle() const;
QObject *selectLevelModle() const;
signals:

@ -12,21 +12,21 @@ StoreViewModel::StoreViewModel() {
void StoreViewModel::init(Store *store, User *user) {
setUser(user);
setStore(store);
setKeys(store->keysList());
_store = store;
}
void StoreViewModel::buy(int item) {
if (_store && getUser()) {
_store->buy(*getUser(), item);
if (store() && getUser()) {
store()->buy(*getUser(), item);
}
}
const IItem *StoreViewModel::getItem(int id) const {
if (!_store)
if (!store())
return nullptr;
return _store->getItemById(id);
return store()->getItemById(id);
}
}

@ -43,9 +43,6 @@ public:
protected:
const IItem *getItem(int id) const;
private:
Store *_store = nullptr;
};
}