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;
initStore(availabelItems);
_engine->initStore(availabelItems);
_engine->init(availabelItems);
_engine->setLevel(getLastLevel());

View File

@ -19,8 +19,8 @@ const QHash<int, const IItem *>& IItem::childItems() const {
return _childs;
}
QMultiHash<int, const IItem *> IItem::childItemsRecursive() const {
QMultiHash<int, const IItem *> result;
QMultiHash<int, const IItem *> IItem::childItemsRecursive() const {
QMultiHash<int, const IItem *> result;
for (const IItem* item : _childs) {
result.unite(item->childItemsRecursive());
@ -70,4 +70,22 @@ void IItem::deactivate(int item) {
bool IItem::isActive(int 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;
/**
* @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.
* @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.
* @return hash of the IItem::itemTextId.
* @see IItem::itemTextId
* @note The not const implementation inlike const implementation write a id to cache.
*/
unsigned int itemId();
@ -99,10 +107,27 @@ public:
/**
* @brief itemId This method 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;
/**
* @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.
* @return set of the actived items.
@ -156,6 +181,7 @@ public:
private:
unsigned int _id = 0;
unsigned int _typeItem = 0;
QHash<int, const IItem*> _childs;
QSet<int> _activeItems;

View File

@ -41,6 +41,18 @@ IWorld::~IWorld() {
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() {
}

View File

@ -81,6 +81,22 @@ public:
IWorld();
~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;
/**
@ -549,6 +565,7 @@ private:
// testing
friend ClastersTest;
};
}

View File

@ -41,6 +41,18 @@ Snake::~Snake( ){
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) {
PlayableObject::render(tbfMsec);
}

View File

@ -28,6 +28,22 @@ public:
QObject *ptr = nullptr);
~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 add(ClasterItem *object) override;
@ -132,6 +148,7 @@ private:
float _speed;
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.
* This model just show available levels of the current user.
* @see the SelectLevelView.qml module.
*/
class AvailableLevelsModel: public BaseUserListModel
{
@ -64,6 +65,11 @@ 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.
@ -82,6 +88,7 @@ signals:
private:
QList<const IItem*> _allLevels;
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 {
return _keys.size();
}

View File

@ -44,6 +44,18 @@ public:
*/
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 columnCount(const QModelIndex &parent = {}) 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.
//#
#include "availablelevelsmodel.h"
#include "engine.h"
#include "mainmenumodel.h"
@ -24,9 +25,10 @@ namespace CRAWL {
Engine::Engine(QObject *parent): QObject(parent) {
_store = new Store();
_currentUser = new User();
_menu = new MainMenuModel();
setNewUser(new User());
}
Engine::~Engine() {
@ -124,6 +126,18 @@ void Engine::stop() const {
_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 {
if (!_currentLevel)
return nullptr;
@ -171,6 +185,29 @@ QObject *Engine::menu() const {
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 {
return _store;
}
@ -186,10 +223,18 @@ User *Engine::currentUser() const {
return _currentUser;
}
void Engine::initStore(const QMultiHash<int, const IItem *> &availabelItems) {
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) {
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;
/**
* @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.
*/
void initStore(const QMultiHash<int, const IItem *> &availabelItems);
void init(const QMultiHash<int, const IItem *> &availabelItems);
/**
* @brief store This pointer return pointer to store.
@ -130,6 +130,11 @@ public:
*/
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:
void scaneChanged();
@ -151,6 +156,24 @@ private slots:
*/
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:
void renderLoop();

View File

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

View File

@ -19,6 +19,7 @@ namespace CRAWL {
class WorldInfo;
class StoreViewModel;
class AvailableLevelsModel;
/**
* @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(bool visible READ getVisible WRITE setVisible NOTIFY visibleChanged)
Q_PROPERTY(QObject * storeView READ storeView NOTIFY storeViewChanged)
Q_PROPERTY(AvailableLevelsModel * selectLevelModle READ selectLevelModle NOTIFY selectLevelModleChanged)
public:
MainMenuModel(QObject *ptr = nullptr);
~MainMenuModel();
/**
* @brief userSettingsModel This method return pointer to the setting model.
* @return This is pointer to setting model.
*/
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;
/**
* @brief setVisible This method will change visible of the main menu.
* @param newVisible This is new vlaue of the visible.
*/
void setVisible(bool newVisible);
/**
@ -45,18 +61,25 @@ public:
*/
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:
void userSettingsModelChanged(QObject* userSettingsModel);
void visibleChanged();
void storeViewChanged();
void selectLevelModleChanged();
private:
Settings *_conf = nullptr;
QObject* _userSettingsModel = nullptr;
bool visible = true;
StoreViewModel *_storeView = nullptr;
AvailableLevelsModel *_selectLevelModle = nullptr;
};