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:
parent
6158ce4a3b
commit
36b4ead978
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user