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:
Kirigaya Kazuto 2017-05-14 16:52:32 +08:00
parent cbf1fa55af
commit e9e815ba77

View File

@ -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;
}