Fix Runtime Bug.
Now ColorPage's Pointer to ColorFrame will be updated when a new pointer is set. (Fix getFrame() == nullptr Error)
This commit is contained in:
parent
cbf1fa55af
commit
e9e815ba77
71
ColorUI.cpp
71
ColorUI.cpp
@ -70,6 +70,8 @@ inline int _ConsoleColor2winForeColor(ConsoleColor conColor)
|
||||
return FOREGROUND_RED | FOREGROUND_GREEN;
|
||||
case ConsoleColor::white:
|
||||
return FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -100,7 +102,7 @@ inline int _ConsoleColor2winBackColor(ConsoleColor conColor)
|
||||
|
||||
inline void cprint(ConsoleColor FrontColor,ConsoleColor BackColor)
|
||||
{
|
||||
int iFront=_ConsoleColor2winBackColor(FrontColor);
|
||||
int iFront=_ConsoleColor2winForeColor(FrontColor);
|
||||
int iBack=_ConsoleColor2winBackColor(BackColor);
|
||||
if(iFront!=0) iFront=iFront | FOREGROUND_INTENSITY;
|
||||
if(iBack!=0) iBack=iBack| BACKGROUND_INTENSITY;
|
||||
@ -296,6 +298,7 @@ ColorPage::~ColorPage()
|
||||
|
||||
void ColorPage::add(ColorSelection* p)
|
||||
{
|
||||
p->setFrame(getFrame());
|
||||
_vec.push_back(p);
|
||||
}
|
||||
|
||||
@ -312,12 +315,41 @@ int ColorPage::del(ColorSelection* p)
|
||||
{
|
||||
/// Current Activated Selection is to be deleted.
|
||||
_curActive=0;
|
||||
|
||||
/// Delete Selection
|
||||
if((*iter)->onDelete()==0)
|
||||
{
|
||||
(*iter)->setFrame(nullptr);
|
||||
delete (*iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
(*iter)->setFrame(nullptr);
|
||||
}
|
||||
|
||||
/// Delete From Record.
|
||||
_vec.erase(iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
/// Get current activated selection.
|
||||
ColorSelection* _curActive_ptr=_vec.at(_curActive-1);
|
||||
|
||||
/// Delete Target Selection
|
||||
if((*iter)->onDelete()==0)
|
||||
{
|
||||
(*iter)->setFrame(nullptr);
|
||||
delete (*iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
(*iter)->setFrame(nullptr);
|
||||
}
|
||||
|
||||
/// Delete Target From Record.
|
||||
_vec.erase(iter);
|
||||
|
||||
/// Re-Calculate active id.
|
||||
_curActive=std::find(_vec.begin(),_vec.end(),_curActive_ptr)-_vec.begin()+1;
|
||||
}
|
||||
|
||||
@ -343,6 +375,10 @@ ColorFrame* ColorPage::getFrame()
|
||||
void ColorPage::setFrame(ColorFrame* pFrame)
|
||||
{
|
||||
_pframe=pFrame;
|
||||
for(auto& ptr:_vec)
|
||||
{
|
||||
ptr->setFrame(getFrame());
|
||||
}
|
||||
}
|
||||
|
||||
//virtual
|
||||
@ -451,11 +487,17 @@ ColorFrame::ColorFrame()
|
||||
_has_started=false;
|
||||
}
|
||||
|
||||
ColorFrame::~ColorFrame()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ColorFrame::setHomePage(ColorPage* pPage,bool deleteOnRemove)
|
||||
{
|
||||
if(_has_started) return;
|
||||
_home_page=pPage;
|
||||
_delete_home_page_on_dtor=deleteOnRemove;
|
||||
pPage->setFrame(this);
|
||||
}
|
||||
|
||||
ColorPage* ColorFrame::getHomePage()
|
||||
@ -511,6 +553,7 @@ void ColorFrame::run()
|
||||
if(_cur_page->getSelectionSize()>0)
|
||||
{
|
||||
cid=_cur_page->getCurrentActive();
|
||||
int oldcid=cid;
|
||||
if(_cns::GetAction(cid,1,_cur_page->getSelectionSize(),_cur_page->getSelectionSize()))
|
||||
{
|
||||
/// Confirmed Key Pressed.
|
||||
@ -528,6 +571,7 @@ void ColorFrame::run()
|
||||
/// Load New Page
|
||||
_cur_page=_next_page;
|
||||
_next_page=nullptr;
|
||||
_cur_page->setFrame(this);
|
||||
_cur_page->onLoad();
|
||||
}
|
||||
else
|
||||
@ -541,8 +585,13 @@ void ColorFrame::run()
|
||||
/// Unload Current Page
|
||||
if(_cur_page->onUnload()==0)
|
||||
{
|
||||
_cur_page->setFrame(nullptr);
|
||||
delete _cur_page;
|
||||
}
|
||||
else
|
||||
{
|
||||
_cur_page->setFrame(nullptr);
|
||||
}
|
||||
_cur_page=nullptr;
|
||||
|
||||
/// Bring Previous Page to Foreground.
|
||||
@ -567,16 +616,24 @@ void ColorFrame::run()
|
||||
else
|
||||
{
|
||||
/// If not confirmed , just go ahead.
|
||||
if(oldcid!=cid)
|
||||
{
|
||||
_cur_page->onSelectionOver(cid);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/// No Selection on this page
|
||||
/// Unload Current Page
|
||||
if(_cur_page->onUnload()==0)
|
||||
{
|
||||
_cur_page->setFrame(nullptr);
|
||||
delete _cur_page;
|
||||
}
|
||||
else
|
||||
{
|
||||
_cur_page->setFrame(nullptr);
|
||||
}
|
||||
_cur_page=nullptr;
|
||||
|
||||
/// Bring Previous Page to Foreground.
|
||||
@ -597,8 +654,13 @@ void ColorFrame::run()
|
||||
{
|
||||
if(_cur_page->onUnload()==0)
|
||||
{
|
||||
_cur_page->setFrame(nullptr);
|
||||
delete _cur_page;
|
||||
}
|
||||
else
|
||||
{
|
||||
_cur_page->setFrame(nullptr);
|
||||
}
|
||||
_cur_page=nullptr;
|
||||
}
|
||||
while(!_stk.empty())
|
||||
@ -607,8 +669,13 @@ void ColorFrame::run()
|
||||
_cur_page->onForeground();
|
||||
if(_cur_page->onUnload()==0)
|
||||
{
|
||||
_cur_page->setFrame(nullptr);
|
||||
delete _cur_page;
|
||||
}
|
||||
else
|
||||
{
|
||||
_cur_page->setFrame(nullptr);
|
||||
}
|
||||
}
|
||||
_cur_page=nullptr;
|
||||
}
|
||||
|
Reference in New Issue
Block a user