mirror of
https://github.com/vcmi/vcmi.git
synced 2025-06-17 00:07:41 +02:00
Gui cleanup3 - UI refactoring to use smart pointers (#440)
* Changed most gui classes to use shared pointers * Store and use IImage as shared_ptr * CSpellWindow redesign * AdventureMapClasses cleanup * CLabel: store background as smart pointer * Store CObjectList items as smart pointers * Removed destroy function of list item * Store toggle buttons as smart pointers * Use CComponent as smart pointer * Attempt to fix artifact merchant drawing
This commit is contained in:
committed by
ArseniyShestakov
parent
db60983b5a
commit
5c09f751b3
@ -13,53 +13,45 @@
|
||||
#include "../gui/CGuiHandler.h"
|
||||
#include "Buttons.h"
|
||||
|
||||
|
||||
static void intDeleter(CIntObject* object)
|
||||
CObjectList::CObjectList(CreateFunc create)
|
||||
: createObject(create)
|
||||
{
|
||||
delete object;
|
||||
}
|
||||
|
||||
CObjectList::CObjectList(CreateFunc create, DestroyFunc destroy):
|
||||
createObject(create),
|
||||
destroyObject(destroy)
|
||||
void CObjectList::deleteItem(std::shared_ptr<CIntObject> item)
|
||||
{
|
||||
if (!destroyObject)
|
||||
destroyObject = intDeleter;
|
||||
}
|
||||
|
||||
void CObjectList::deleteItem(CIntObject* item)
|
||||
{
|
||||
if (!item)
|
||||
if(!item)
|
||||
return;
|
||||
removeChild(item);
|
||||
destroyObject(item);
|
||||
item->deactivate();
|
||||
removeChild(item.get());
|
||||
}
|
||||
|
||||
CIntObject* CObjectList::createItem(size_t index)
|
||||
std::shared_ptr<CIntObject> CObjectList::createItem(size_t index)
|
||||
{
|
||||
OBJ_CONSTRUCTION_CAPTURING_ALL;
|
||||
CIntObject * item = createObject(index);
|
||||
if (item == nullptr)
|
||||
item = new CIntObject();
|
||||
OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255-DISPOSE);
|
||||
std::shared_ptr<CIntObject> item = createObject(index);
|
||||
if(!item)
|
||||
item = std::make_shared<CIntObject>();
|
||||
|
||||
item->recActions = defActions;
|
||||
|
||||
addChild(item);
|
||||
addChild(item.get());
|
||||
item->activate();
|
||||
return item;
|
||||
}
|
||||
|
||||
CTabbedInt::CTabbedInt(CreateFunc create, DestroyFunc destroy, Point position, size_t ActiveID):
|
||||
CObjectList(create, destroy),
|
||||
activeTab(nullptr),
|
||||
activeID(ActiveID)
|
||||
CTabbedInt::CTabbedInt(CreateFunc create, Point position, size_t ActiveID)
|
||||
: CObjectList(create),
|
||||
activeTab(nullptr),
|
||||
activeID(ActiveID)
|
||||
{
|
||||
defActions &= ~DISPOSE;
|
||||
pos += position;
|
||||
reset();
|
||||
}
|
||||
|
||||
void CTabbedInt::setActive(size_t which)
|
||||
{
|
||||
if (which != activeID)
|
||||
if(which != activeID)
|
||||
{
|
||||
activeID = which;
|
||||
reset();
|
||||
@ -72,30 +64,29 @@ void CTabbedInt::reset()
|
||||
activeTab = createItem(activeID);
|
||||
activeTab->moveTo(pos.topLeft());
|
||||
|
||||
if (active)
|
||||
if(active)
|
||||
redraw();
|
||||
}
|
||||
|
||||
CIntObject * CTabbedInt::getItem()
|
||||
std::shared_ptr<CIntObject> CTabbedInt::getItem()
|
||||
{
|
||||
return activeTab;
|
||||
}
|
||||
|
||||
CListBox::CListBox(CreateFunc create, DestroyFunc destroy, Point Pos, Point ItemOffset, size_t VisibleSize,
|
||||
size_t TotalSize, size_t InitialPos, int Slider, Rect SliderPos):
|
||||
CObjectList(create, destroy),
|
||||
CListBox::CListBox(CreateFunc create, Point Pos, Point ItemOffset, size_t VisibleSize,
|
||||
size_t TotalSize, size_t InitialPos, int Slider, Rect SliderPos)
|
||||
: CObjectList(create),
|
||||
first(InitialPos),
|
||||
totalSize(TotalSize),
|
||||
itemOffset(ItemOffset),
|
||||
slider(nullptr)
|
||||
itemOffset(ItemOffset)
|
||||
{
|
||||
pos += Pos;
|
||||
items.resize(VisibleSize, nullptr);
|
||||
|
||||
if (Slider & 1)
|
||||
if(Slider & 1)
|
||||
{
|
||||
OBJ_CONSTRUCTION_CAPTURING_ALL;
|
||||
slider = new CSlider(SliderPos.topLeft(), SliderPos.w, std::bind(&CListBox::moveToPos, this, _1),
|
||||
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
|
||||
slider = std::make_shared<CSlider>(SliderPos.topLeft(), SliderPos.w, std::bind(&CListBox::moveToPos, this, _1),
|
||||
VisibleSize, TotalSize, InitialPos, Slider & 2, Slider & 4 ? CSlider::BLUE : CSlider::BROWN);
|
||||
}
|
||||
reset();
|
||||
@ -142,22 +133,22 @@ size_t CListBox::size()
|
||||
return totalSize;
|
||||
}
|
||||
|
||||
CIntObject * CListBox::getItem(size_t which)
|
||||
std::shared_ptr<CIntObject> CListBox::getItem(size_t which)
|
||||
{
|
||||
if (which < first || which > first + items.size() || which > totalSize)
|
||||
return nullptr;
|
||||
if(which < first || which > first + items.size() || which > totalSize)
|
||||
return std::shared_ptr<CIntObject>();
|
||||
|
||||
size_t i=first;
|
||||
for (auto iter = items.begin(); iter != items.end(); iter++, i++)
|
||||
if( i == which)
|
||||
return *iter;
|
||||
return nullptr;
|
||||
return std::shared_ptr<CIntObject>();
|
||||
}
|
||||
|
||||
size_t CListBox::getIndexOf(CIntObject *item)
|
||||
size_t CListBox::getIndexOf(std::shared_ptr<CIntObject> item)
|
||||
{
|
||||
size_t i=first;
|
||||
for (auto iter = items.begin(); iter != items.end(); iter++, i++)
|
||||
for(auto iter = items.begin(); iter != items.end(); iter++, i++)
|
||||
if(*iter == item)
|
||||
return i;
|
||||
return size_t(-1);
|
||||
@ -166,7 +157,7 @@ size_t CListBox::getIndexOf(CIntObject *item)
|
||||
void CListBox::scrollTo(size_t which)
|
||||
{
|
||||
//scroll up
|
||||
if (first > which)
|
||||
if(first > which)
|
||||
moveToPos(which);
|
||||
//scroll down
|
||||
else if (first + items.size() <= which && which < totalSize)
|
||||
@ -177,7 +168,7 @@ void CListBox::moveToPos(size_t which)
|
||||
{
|
||||
//Calculate new position
|
||||
size_t maxPossible;
|
||||
if (totalSize > items.size())
|
||||
if(totalSize > items.size())
|
||||
maxPossible = totalSize - items.size();
|
||||
else
|
||||
maxPossible = 0;
|
||||
@ -185,11 +176,15 @@ void CListBox::moveToPos(size_t which)
|
||||
size_t newPos = std::min(which, maxPossible);
|
||||
|
||||
//If move distance is 1 (most of calls from Slider) - use faster shifts instead of resetting all items
|
||||
if (first - newPos == 1)
|
||||
if(first - newPos == 1)
|
||||
{
|
||||
moveToPrev();
|
||||
else if (newPos - first == 1)
|
||||
}
|
||||
else if(newPos - first == 1)
|
||||
{
|
||||
moveToNext();
|
||||
else if (newPos != first)
|
||||
}
|
||||
else if(newPos != first)
|
||||
{
|
||||
first = newPos;
|
||||
reset();
|
||||
@ -199,7 +194,7 @@ void CListBox::moveToPos(size_t which)
|
||||
void CListBox::moveToNext()
|
||||
{
|
||||
//Remove front item and insert new one to end
|
||||
if (first + items.size() < totalSize)
|
||||
if(first + items.size() < totalSize)
|
||||
{
|
||||
first++;
|
||||
deleteItem(items.front());
|
||||
@ -212,7 +207,7 @@ void CListBox::moveToNext()
|
||||
void CListBox::moveToPrev()
|
||||
{
|
||||
//Remove last item and insert new one at start
|
||||
if (first)
|
||||
if(first)
|
||||
{
|
||||
first--;
|
||||
deleteItem(items.back());
|
||||
@ -227,7 +222,7 @@ size_t CListBox::getPos()
|
||||
return first;
|
||||
}
|
||||
|
||||
const std::list<CIntObject *> &CListBox::getItems()
|
||||
const std::list<std::shared_ptr<CIntObject>> & CListBox::getItems()
|
||||
{
|
||||
return items;
|
||||
}
|
||||
|
Reference in New Issue
Block a user