tmp commit

This commit is contained in:
Andrei Yankovich 2021-08-15 20:32:46 +03:00
parent 82c2a7e2ed
commit 6158ce4a3b
15 changed files with 255 additions and 11 deletions

View File

@ -126,7 +126,7 @@ bool ClientApp::init(QQmlApplicationEngine *engine) {
QMultiHash<int, const IItem *> availabelItems; QMultiHash<int, const IItem *> availabelItems;
initStore(availabelItems); initStore(availabelItems);
_engine->initStore(availabelItems); _engine->init(availabelItems);
_engine->setLevel(getLastLevel()); _engine->setLevel(getLastLevel());

View File

@ -70,4 +70,22 @@ void IItem::deactivate(int item) {
bool IItem::isActive(int item) { bool IItem::isActive(int item) {
return _childs.contains(item) && _activeItems.contains(item); return _childs.contains(item) && _activeItems.contains(item);
} }
unsigned int IItem::itemType() {
if (_typeItem) {
return _typeItem;
}
_typeItem = qHash(itemTextType());
return _typeItem;
}
unsigned int IItem::itemType() const {
if (_typeItem) {
return _typeItem;
}
return qHash(itemTextType());
}
} }

View File

@ -34,6 +34,13 @@ public:
*/ */
virtual QString itemTextId() const = 0; virtual QString itemTextId() const = 0;
/**
* @brief itemTextType This method return text of the item group or type.
* @return text of the item group of type.
* @see IITem::itemType
*/
virtual QString itemTextType() const = 0;
/** /**
* @brief itemName This method should be return name of the item. * @brief itemName This method should be return name of the item.
* @return Name of the item (translated to all supported languages) * @return Name of the item (translated to all supported languages)
@ -92,6 +99,7 @@ public:
/** /**
* @brief itemId This method return hash of the IItem::itemTextId. * @brief itemId This method return hash of the IItem::itemTextId.
* @return hash of the IItem::itemTextId. * @return hash of the IItem::itemTextId.
* @see IItem::itemTextId
* @note The not const implementation inlike const implementation write a id to cache. * @note The not const implementation inlike const implementation write a id to cache.
*/ */
unsigned int itemId(); unsigned int itemId();
@ -99,10 +107,27 @@ public:
/** /**
* @brief itemId This method return hash of the IItem::itemTextId. * @brief itemId This method return hash of the IItem::itemTextId.
* @return hash of the IItem::itemTextId. * @return hash of the IItem::itemTextId.
* @warning if the object are const and not const implementation of the IItem::itemId method never invoked then this method return 0. * @see IItem::itemTextId
* @warning This method not cached id value, so works sloyle then not cons implementation.
*/ */
unsigned int itemId() const; unsigned int itemId() const;
/**
* @brief itemType This method return item type id. (items group)
* @return item type id.
* @see IItem::itemTextType
* @note The not const implementation inlike const implementation write a id to cache.
*/
unsigned int itemType();
/**
* @brief itemType This method return item type id. (items group)
* @return item type id.
* @see IItem::itemTextType
* @warning This method not cached id value, so works sloyle then not cons implementation.
*/
unsigned int itemType() const;
/** /**
* @brief activeItems This method return set of the actived items. * @brief activeItems This method return set of the actived items.
* @return set of the actived items. * @return set of the actived items.
@ -156,6 +181,7 @@ public:
private: private:
unsigned int _id = 0; unsigned int _id = 0;
unsigned int _typeItem = 0;
QHash<int, const IItem*> _childs; QHash<int, const IItem*> _childs;
QSet<int> _activeItems; QSet<int> _activeItems;

View File

@ -41,6 +41,18 @@ IWorld::~IWorld() {
delete _eventServer; delete _eventServer;
} }
QString IWorld::itemTextType() const {
return IWorld::typeText();
}
unsigned int IWorld::type() {
return qHash(IWorld::typeText());
}
QString IWorld::typeText() {
return "WorldObject";
}
void IWorld::init() { void IWorld::init() {
} }

View File

@ -81,6 +81,22 @@ public:
IWorld(); IWorld();
~IWorld() override; ~IWorld() override;
QString itemTextType() const override;
/**
* @brief type This method return const string value of the all world types.
* @return const string value of the all world types.
* @see IItem::itemTextType
* @see IItem::type
*/
static QString typeText();
/**
* @brief type This is wrapper of the IWorld::typeText method that invoke the qHash function for results string.
* @return integer type object id.
*/
static unsigned int type();
void init() override; void init() override;
/** /**
@ -549,6 +565,7 @@ private:
// testing // testing
friend ClastersTest; friend ClastersTest;
}; };
} }

View File

@ -41,6 +41,18 @@ Snake::~Snake( ){
delete [] _vectors; delete [] _vectors;
} }
QString Snake::itemTextType() const {
return Snake::typeText();
}
QString Snake::typeText() {
return "PlayableObject";
}
unsigned int Snake::type() {
return qHash(typeText());
}
void Snake::render(unsigned int tbfMsec) { void Snake::render(unsigned int tbfMsec) {
PlayableObject::render(tbfMsec); PlayableObject::render(tbfMsec);
} }

View File

@ -28,6 +28,22 @@ public:
QObject *ptr = nullptr); QObject *ptr = nullptr);
~Snake() override; ~Snake() override;
QString itemTextType() const override;
/**
* @brief type This method return const string value of the all world types.
* @return const string value of the all world types.
* @see IItem::itemTextType
* @see IItem::type
*/
static QString typeText();
/**
* @brief type This is wrapper of the IWorld::typeText method that invoke the qHash function for results string.
* @return integer type object id.
*/
static unsigned int type();
void render(unsigned int tbfMsec) override; void render(unsigned int tbfMsec) override;
void add(ClasterItem *object) override; void add(ClasterItem *object) override;
@ -132,6 +148,7 @@ private:
float _speed; float _speed;
int _hp = 100; int _hp = 100;
}; };
} }

View File

@ -42,4 +42,8 @@ void AvailableLevelsModel::select(int levelId) {
} }
} }
const IItem *AvailableLevelsModel::getItem(int id) const {
return _allLevels.value(id, nullptr);
}
} }

View File

@ -18,6 +18,7 @@ class IItem;
/** /**
* @brief The AvailableLevelsModel class is model of the available levels qml view. * @brief The AvailableLevelsModel class is model of the available levels qml view.
* This model just show available levels of the current user. * This model just show available levels of the current user.
* @see the SelectLevelView.qml module.
*/ */
class AvailableLevelsModel: public BaseUserListModel class AvailableLevelsModel: public BaseUserListModel
{ {
@ -64,6 +65,11 @@ public:
*/ */
Q_INVOKABLE void select(int levelId); Q_INVOKABLE void select(int levelId);
// BaseUserListModel interface
protected:
const IItem *getItem(int id) const;
signals: signals:
/** /**
* @brief currentLevelChanged This signal emited when the currentLevel propertye is changed. * @brief currentLevelChanged This signal emited when the currentLevel propertye is changed.
@ -82,6 +88,7 @@ signals:
private: private:
QList<const IItem*> _allLevels; QList<const IItem*> _allLevels;
int currentLevel = -1; int currentLevel = -1;
}; };
} }

View File

@ -72,6 +72,27 @@ 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();
endInsertRows();
}
void BaseUserListModel::removeKey(int oldKey) {
int idx = getIndexById(oldKey);
if (idx >= 0) {
beginInsertRows({}, _keys.size(), _keys.size());
_keys.removeAt(idx);
_keysIndexes.remove(oldKey);
endInsertRows();
}
}
int BaseUserListModel::rowCount(const QModelIndex &) const { int BaseUserListModel::rowCount(const QModelIndex &) const {
return _keys.size(); return _keys.size();
} }

View File

@ -44,6 +44,18 @@ public:
*/ */
void setKeys(const QList<int>& visibleKeysList); void setKeys(const QList<int>& visibleKeysList);
/**
* @brief addKey This method add new key value for view.
* @param newKey new key value.
*/
void addKey(int newKey);
/**
* @brief removeKey This method remove old key from view.
* @param oldKey This is old key that will be removed.
*/
void removeKey(int oldKey);
int rowCount(const QModelIndex &parent = {}) const override; int rowCount(const QModelIndex &parent = {}) const override;
int columnCount(const QModelIndex &parent = {}) const override; int columnCount(const QModelIndex &parent = {}) const override;
QVariant data(const QModelIndex &index, int role) const override; QVariant data(const QModelIndex &index, int role) const override;

View File

@ -5,6 +5,7 @@
//# of this license document, but changing it is not allowed. //# of this license document, but changing it is not allowed.
//# //#
#include "availablelevelsmodel.h"
#include "engine.h" #include "engine.h"
#include "mainmenumodel.h" #include "mainmenumodel.h"
@ -24,9 +25,10 @@ namespace CRAWL {
Engine::Engine(QObject *parent): QObject(parent) { Engine::Engine(QObject *parent): QObject(parent) {
_store = new Store(); _store = new Store();
_currentUser = new User();
_menu = new MainMenuModel(); _menu = new MainMenuModel();
setNewUser(new User());
} }
Engine::~Engine() { Engine::~Engine() {
@ -124,6 +126,18 @@ void Engine::stop() const {
_currentLevel->previewScane()->start(_currentLevel->previewScane()->configuration()); _currentLevel->previewScane()->start(_currentLevel->previewScane()->configuration());
} }
void Engine::handleUnlockedItem(int item) {
static_cast<AvailableLevelsModel*>(_menu->selectLevelModle())->addKey(item);
}
void Engine::handleDroppedItem(int item) {
static_cast<AvailableLevelsModel*>(_menu->selectLevelModle())->removeKey(item);
}
void Engine::handleUnlockedItemsListChanged(const QSet<int> &newSet) {
static_cast<AvailableLevelsModel*>(_menu->selectLevelModle())->setKeys(QList<int>(newSet.begin(), newSet.end()));
}
QObject *Engine::getGameObject(int id) const { QObject *Engine::getGameObject(int id) const {
if (!_currentLevel) if (!_currentLevel)
return nullptr; return nullptr;
@ -171,6 +185,29 @@ QObject *Engine::menu() const {
return _menu; return _menu;
} }
void Engine::setNewUser(User *user) {
if (_currentUser) {
disconnect(_currentUser, &User::sigUnlcoked, this, &Engine::handleUnlockedItem);
disconnect(_currentUser, &User::sigDropped, this, &Engine::handleDroppedItem);
disconnect(_currentUser, &User::sigUlockedItemsChanged,
this, &Engine::handleUnlockedItemsListChanged);
}
_currentUser = user;
static_cast<StoreViewModel*>(_menu->storeView())->setUser(_currentUser);
static_cast<AvailableLevelsModel*>(_menu->selectLevelModle())->setUser(_currentUser);
if (_currentUser) {
connect(_currentUser, &User::sigUnlcoked, this, &Engine::handleUnlockedItem);
connect(_currentUser, &User::sigDropped, this, &Engine::handleDroppedItem);
connect(_currentUser, &User::sigUlockedItemsChanged,
this, &Engine::handleUnlockedItemsListChanged);
}
}
Store *Engine::store() const { Store *Engine::store() const {
return _store; return _store;
} }
@ -186,10 +223,18 @@ User *Engine::currentUser() const {
return _currentUser; return _currentUser;
} }
void Engine::init(const QMultiHash<int, const IItem *> &availabelItems) {
void Engine::initStore(const QMultiHash<int, const IItem *> &availabelItems) {
_store->init(availabelItems); _store->init(availabelItems);
static_cast<StoreViewModel*>(_menu->storeView())->init(_store, _currentUser); static_cast<StoreViewModel*>(_menu->storeView())->init(_store, _currentUser);
QList<const IItem*> availableWorlds;
for (const IItem * item : availabelItems) {
if (item->itemType() == IWorld::type()) {
availableWorlds.push_back(item);
}
}
static_cast<AvailableLevelsModel*>(_menu->selectLevelModle())->setAllLevels(availableWorlds);
} }
} }

View File

@ -107,10 +107,10 @@ public:
User *currentUser() const; User *currentUser() const;
/** /**
* @brief initStore This method is wrapper of the Store::init method. * @brief init This method initialize the main model. Sets available levels and items.
* @param availabelItems This is list of available items. * @param availabelItems This is list of available items.
*/ */
void initStore(const QMultiHash<int, const IItem *> &availabelItems); void init(const QMultiHash<int, const IItem *> &availabelItems);
/** /**
* @brief store This pointer return pointer to store. * @brief store This pointer return pointer to store.
@ -130,6 +130,11 @@ public:
*/ */
QObject *menu() const; QObject *menu() const;
/**
* @brief setNewUser This method will initialise the new user profile.
* @param user This is pointer to new user profile.
*/
void setNewUser(User* user);
signals: signals:
void scaneChanged(); void scaneChanged();
@ -151,6 +156,24 @@ private slots:
*/ */
void stop() const; void stop() const;
/**
* @brief handleUnlockedItem This slot invoked when emited the User::unclokItem signal.
* @param item This is id of the unlocked item
*/
void handleUnlockedItem(int item);
/**
* @brief handleUnlockedItem This slot invoked when emited the User::droppItem signal.
* @param item This is id of the dropped item
*/
void handleDroppedItem(int item);
/**
* @brief handleUnlockedItem This slot invoked when emited the User::setUnlockedItems signal.
* @param item This is new list of the unclod items.
*/
void handleUnlockedItemsListChanged(const QSet<int>& newSet);
private: private:
void renderLoop(); void renderLoop();

View File

@ -6,6 +6,7 @@
//# //#
#include <listviewmodel.h> #include <listviewmodel.h>
#include "availablelevelsmodel.h"
#include "mainmenumodel.h" #include "mainmenumodel.h"
#include "settingsviewmodel.h" #include "settingsviewmodel.h"
#include "storeviewmodel.h" #include "storeviewmodel.h"
@ -19,10 +20,12 @@ MainMenuModel::MainMenuModel(QObject *ptr): QObject (ptr) {
_conf = QuasarAppUtils::Settings::instance(); _conf = QuasarAppUtils::Settings::instance();
_userSettingsModel = new SettingsViewModel(this); _userSettingsModel = new SettingsViewModel(this);
_storeView = new StoreViewModel(); _storeView = new StoreViewModel();
_selectLevelModle = new AvailableLevelsModel();
} }
MainMenuModel::~MainMenuModel() { MainMenuModel::~MainMenuModel() {
delete _storeView; delete _storeView;
delete _selectLevelModle;
} }
QObject *MainMenuModel::userSettingsModel() const { QObject *MainMenuModel::userSettingsModel() const {
@ -44,4 +47,8 @@ QObject *MainMenuModel::storeView() const {
return _storeView; return _storeView;
} }
AvailableLevelsModel *MainMenuModel::selectLevelModle() const {
return _selectLevelModle;
}
} }

View File

@ -19,6 +19,7 @@ namespace CRAWL {
class WorldInfo; class WorldInfo;
class StoreViewModel; class StoreViewModel;
class AvailableLevelsModel;
/** /**
* @brief The MainMenuModel class This is main class for controll user interface * @brief The MainMenuModel class This is main class for controll user interface
@ -30,13 +31,28 @@ class MainMenuModel : public QObject
Q_PROPERTY(QObject* userSettingsModel READ userSettingsModel NOTIFY userSettingsModelChanged) Q_PROPERTY(QObject* userSettingsModel READ userSettingsModel NOTIFY userSettingsModelChanged)
Q_PROPERTY(bool visible READ getVisible WRITE setVisible NOTIFY visibleChanged) Q_PROPERTY(bool visible READ getVisible WRITE setVisible NOTIFY visibleChanged)
Q_PROPERTY(QObject * storeView READ storeView NOTIFY storeViewChanged) Q_PROPERTY(QObject * storeView READ storeView NOTIFY storeViewChanged)
Q_PROPERTY(AvailableLevelsModel * selectLevelModle READ selectLevelModle NOTIFY selectLevelModleChanged)
public: public:
MainMenuModel(QObject *ptr = nullptr); MainMenuModel(QObject *ptr = nullptr);
~MainMenuModel(); ~MainMenuModel();
/**
* @brief userSettingsModel This method return pointer to the setting model.
* @return This is pointer to setting model.
*/
QObject* userSettingsModel() const; QObject* userSettingsModel() const;
/**
* @brief getVisible This method return visible property of the main game menu.
* @return true if the menu is visble.
*/
bool getVisible() const; bool getVisible() const;
/**
* @brief setVisible This method will change visible of the main menu.
* @param newVisible This is new vlaue of the visible.
*/
void setVisible(bool newVisible); void setVisible(bool newVisible);
/** /**
@ -45,18 +61,25 @@ public:
*/ */
QObject *storeView() const; QObject *storeView() const;
/**
* @brief selectLevelModle This method return pointer to the available levels model.
* @return pointer to main available levels model.
*/
AvailableLevelsModel *selectLevelModle() const;
signals: signals:
void userSettingsModelChanged(QObject* userSettingsModel); void userSettingsModelChanged(QObject* userSettingsModel);
void visibleChanged(); void visibleChanged();
void storeViewChanged(); void storeViewChanged();
void selectLevelModleChanged();
private: private:
Settings *_conf = nullptr; Settings *_conf = nullptr;
QObject* _userSettingsModel = nullptr; QObject* _userSettingsModel = nullptr;
bool visible = true; bool visible = true;
StoreViewModel *_storeView = nullptr; StoreViewModel *_storeView = nullptr;
AvailableLevelsModel *_selectLevelModle = nullptr;
}; };