mirror of https://github.com/axmolengine/axmol.git
205 lines
4.7 KiB
C++
205 lines
4.7 KiB
C++
#include "Controller.h"
|
|
#include "GComponent.h"
|
|
#include "controller_action/ControllerAction.h"
|
|
#include "utils/ByteBuffer.h"
|
|
#include "utils/ToolSet.h"
|
|
|
|
NS_FGUI_BEGIN
|
|
USING_NS_AX;
|
|
|
|
GController::GController() : changing(false),
|
|
autoRadioGroupDepth(false),
|
|
_parent(nullptr),
|
|
_selectedIndex(-1),
|
|
_previousIndex(-1)
|
|
{
|
|
}
|
|
|
|
GController::~GController()
|
|
{
|
|
for (auto& it : _actions)
|
|
delete it;
|
|
}
|
|
|
|
void GController::setSelectedIndex(int value, bool triggerEvent)
|
|
{
|
|
if (_selectedIndex != value)
|
|
{
|
|
CCASSERT(value < (int)_pageIds.size(), "Invalid selected index");
|
|
|
|
changing = true;
|
|
|
|
_previousIndex = _selectedIndex;
|
|
_selectedIndex = value;
|
|
_parent->applyController(this);
|
|
|
|
if (triggerEvent)
|
|
dispatchEvent(UIEventType::Changed);
|
|
|
|
changing = false;
|
|
}
|
|
}
|
|
|
|
const std::string& GController::getSelectedPage() const
|
|
{
|
|
if (_selectedIndex == -1)
|
|
return STD_STRING_EMPTY;
|
|
else
|
|
return _pageNames[_selectedIndex];
|
|
}
|
|
|
|
void GController::setSelectedPage(const std::string& value, bool triggerEvent)
|
|
{
|
|
int i = ToolSet::findInStringArray(_pageNames, value);
|
|
if (i == -1)
|
|
i = 0;
|
|
setSelectedIndex(i, triggerEvent);
|
|
}
|
|
|
|
const std::string& GController::getSelectedPageId() const
|
|
{
|
|
if (_selectedIndex == -1)
|
|
return STD_STRING_EMPTY;
|
|
else
|
|
return _pageIds[_selectedIndex];
|
|
}
|
|
|
|
void GController::setSelectedPageId(const std::string& value, bool triggerEvent)
|
|
{
|
|
int i = ToolSet::findInStringArray(_pageIds, value);
|
|
if (i != -1)
|
|
setSelectedIndex(i, triggerEvent);
|
|
}
|
|
|
|
const std::string& GController::getPreviousPage() const
|
|
{
|
|
if (_previousIndex == -1)
|
|
return STD_STRING_EMPTY;
|
|
else
|
|
return _pageNames[_previousIndex];
|
|
}
|
|
|
|
const std::string& GController::getPreviousPageId() const
|
|
{
|
|
if (_previousIndex == -1)
|
|
return STD_STRING_EMPTY;
|
|
else
|
|
return _pageIds[_previousIndex];
|
|
}
|
|
|
|
int GController::getPageCount() const
|
|
{
|
|
return (int)_pageIds.size();
|
|
}
|
|
|
|
bool GController::hasPage(const std::string& aName) const
|
|
{
|
|
return ToolSet::findInStringArray(_pageNames, aName) != -1;
|
|
}
|
|
|
|
int GController::getPageIndexById(const std::string& value) const
|
|
{
|
|
return ToolSet::findInStringArray(_pageIds, value);
|
|
}
|
|
|
|
const std::string& GController::getPageNameById(const std::string& value) const
|
|
{
|
|
int i = ToolSet::findInStringArray(_pageIds, value);
|
|
if (i != -1)
|
|
return _pageNames[i];
|
|
else
|
|
return STD_STRING_EMPTY;
|
|
}
|
|
|
|
const std::string& GController::getPageId(int index) const
|
|
{
|
|
return _pageIds[index];
|
|
}
|
|
|
|
void GController::setOppositePageId(const std::string& value)
|
|
{
|
|
int i = ToolSet::findInStringArray(_pageIds, value);
|
|
if (i > 0)
|
|
setSelectedIndex(0);
|
|
else if (_pageIds.size() > 1)
|
|
setSelectedIndex(1);
|
|
}
|
|
|
|
void GController::runActions()
|
|
{
|
|
if (_actions.empty())
|
|
return;
|
|
|
|
for (auto& it : _actions)
|
|
it->run(this, getPreviousPageId(), getSelectedPageId());
|
|
}
|
|
|
|
void GController::setup(ByteBuffer* buffer)
|
|
{
|
|
int beginPos = buffer->getPos();
|
|
buffer->seek(beginPos, 0);
|
|
|
|
name = buffer->readS();
|
|
autoRadioGroupDepth = buffer->readBool();
|
|
|
|
buffer->seek(beginPos, 1);
|
|
|
|
int cnt = buffer->readShort();
|
|
_pageIds.resize(cnt);
|
|
_pageNames.resize(cnt);
|
|
for (int i = 0; i < cnt; i++)
|
|
{
|
|
_pageIds[i].assign(buffer->readS());
|
|
_pageNames[i].assign(buffer->readS());
|
|
}
|
|
|
|
int homePageIndex = 0;
|
|
if (buffer->version >= 2)
|
|
{
|
|
int homePageType = buffer->readByte();
|
|
switch (homePageType)
|
|
{
|
|
case 1:
|
|
homePageIndex = buffer->readShort();
|
|
break;
|
|
|
|
case 2:
|
|
homePageIndex = ToolSet::findInStringArray(_pageNames, UIPackage::getBranch());
|
|
if (homePageIndex == -1)
|
|
homePageIndex = 0;
|
|
break;
|
|
|
|
case 3:
|
|
homePageIndex = ToolSet::findInStringArray(_pageNames, UIPackage::getVar(buffer->readS()));
|
|
if (homePageIndex == -1)
|
|
homePageIndex = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
buffer->seek(beginPos, 2);
|
|
|
|
cnt = buffer->readShort();
|
|
if (cnt > 0)
|
|
{
|
|
for (int i = 0; i < cnt; i++)
|
|
{
|
|
int nextPos = buffer->readUshort();
|
|
nextPos += buffer->getPos();
|
|
|
|
ControllerAction* action = ControllerAction::createAction(buffer->readByte());
|
|
action->setup(buffer);
|
|
_actions.push_back(action);
|
|
|
|
buffer->setPos(nextPos);
|
|
}
|
|
}
|
|
|
|
if (_parent != nullptr && _pageIds.size() > 0)
|
|
_selectedIndex = homePageIndex;
|
|
else
|
|
_selectedIndex = -1;
|
|
}
|
|
|
|
NS_FGUI_END
|