Initial Commit
This commit is contained in:
commit
2abe6733bd
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
bin/
|
||||
obj/
|
||||
|
279
CUI.cpp
Normal file
279
CUI.cpp
Normal file
@ -0,0 +1,279 @@
|
||||
#include "CUI.h"
|
||||
#include <cstdio>
|
||||
|
||||
Selection::Selection()
|
||||
{
|
||||
id=-1;
|
||||
}
|
||||
|
||||
//virtual
|
||||
void Selection::drawText()
|
||||
{
|
||||
printf("%s",text.c_str());
|
||||
}
|
||||
|
||||
//virtual
|
||||
void Selection::drawInfo()
|
||||
{
|
||||
printf("%s",info.c_str());
|
||||
}
|
||||
|
||||
bool Selection::hasInfo()
|
||||
{
|
||||
return !info.empty();
|
||||
}
|
||||
|
||||
//virtual
|
||||
int Selection::onClick()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
Page::Page()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Page::~Page()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//virtual
|
||||
void Page::draw()
|
||||
{
|
||||
if(!title.empty())
|
||||
{
|
||||
printf("%s\n",title.c_str());
|
||||
}
|
||||
if(!text.empty())
|
||||
{
|
||||
printf("%s\n",text.c_str());
|
||||
}
|
||||
|
||||
int id=1;
|
||||
for(std::list<Selection*>::iterator iter=_vec.begin();iter!=_vec.end();iter++)
|
||||
{
|
||||
printf("%d ",id);
|
||||
(*iter)->drawText();
|
||||
if((*iter)->hasInfo())
|
||||
{
|
||||
printf(" (");
|
||||
(*iter)->drawInfo();
|
||||
printf(")");
|
||||
}
|
||||
printf("\n");
|
||||
++id;
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
//virtual
|
||||
void Page::onLoad()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//virtual
|
||||
int Page::onUnload()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//virtual
|
||||
void Page::onForeground()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//virtual
|
||||
void Page::onBackground()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int Page::getSelectionSize()
|
||||
{
|
||||
return _vec.size();
|
||||
}
|
||||
|
||||
int Page::onActive(int id)
|
||||
{
|
||||
int left=id;
|
||||
std::list<Selection*>::iterator iter=_vec.begin();
|
||||
while(left>0)
|
||||
{
|
||||
++iter;
|
||||
--left;
|
||||
}
|
||||
return (*iter)->onClick();
|
||||
}
|
||||
|
||||
void Page::setFrame(Frame* f)
|
||||
{
|
||||
_pframe=f;
|
||||
}
|
||||
|
||||
Frame* Page::getFrame()
|
||||
{
|
||||
return _pframe;
|
||||
}
|
||||
|
||||
void Page::add(Selection* p)
|
||||
{
|
||||
_vec.push_back(p);
|
||||
}
|
||||
|
||||
Frame::Frame()
|
||||
{
|
||||
_page=nullptr;
|
||||
_cpage=nullptr;
|
||||
_npage=nullptr;
|
||||
}
|
||||
|
||||
Frame::~Frame()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//protected
|
||||
void Frame::clearScreen()
|
||||
{
|
||||
system("cls");
|
||||
}
|
||||
|
||||
//protected
|
||||
void Frame::clearInput()
|
||||
{
|
||||
fflush(stdin);
|
||||
}
|
||||
|
||||
//protected
|
||||
int Frame::onInvalidInput()
|
||||
{
|
||||
clearInput();
|
||||
printf("Invalid Input.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Frame::setPage(Page* p)
|
||||
{
|
||||
_page=p;
|
||||
p->setFrame(this);
|
||||
}
|
||||
|
||||
Page* Frame::getPage()
|
||||
{
|
||||
return _page;
|
||||
}
|
||||
|
||||
void Frame::jumpTo(Page* p)
|
||||
{
|
||||
_npage=p;
|
||||
}
|
||||
|
||||
void Frame::run()
|
||||
{
|
||||
/// No Page
|
||||
if(_page==nullptr) return;
|
||||
|
||||
bool stop=false;
|
||||
_cpage=_page;
|
||||
|
||||
_cpage->onLoad();
|
||||
|
||||
while(!stop)
|
||||
{
|
||||
clearScreen();
|
||||
_cpage->draw();
|
||||
if(_cpage->getSelectionSize()>0)
|
||||
{
|
||||
int uinput;
|
||||
while(scanf("%d%*c",&uinput)!=1)
|
||||
{
|
||||
if(onInvalidInput()!=0)
|
||||
{
|
||||
stop=true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(stop) continue;
|
||||
|
||||
if(uinput<1||uinput>_cpage->getSelectionSize())
|
||||
{
|
||||
if(onInvalidInput()!=0)
|
||||
{
|
||||
stop=true;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
int ret=_cpage->onActive(uinput-1);
|
||||
switch(ret)
|
||||
{
|
||||
case 2:
|
||||
stop=true;
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
if(_stk.empty())
|
||||
{
|
||||
stop=true;
|
||||
}
|
||||
else
|
||||
{
|
||||
/// Unload Current Page
|
||||
if(_cpage->onUnload()==0)
|
||||
{
|
||||
delete _cpage;
|
||||
}
|
||||
_cpage=_stk.top();
|
||||
_stk.pop();
|
||||
_cpage->onForeground();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0:
|
||||
{
|
||||
if(_npage!=nullptr)
|
||||
{
|
||||
/// New Page.
|
||||
_cpage->onBackground();
|
||||
_stk.push(_cpage);
|
||||
_cpage=_npage;
|
||||
_npage=nullptr;
|
||||
_cpage->onLoad();
|
||||
}
|
||||
else
|
||||
{
|
||||
/// continue running.
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/// No Selection on page...
|
||||
stop=true;
|
||||
}
|
||||
}
|
||||
|
||||
if(_cpage->onUnload()==0)
|
||||
{
|
||||
delete _cpage;
|
||||
}
|
||||
_cpage=nullptr;
|
||||
|
||||
/// Unload all inactive pages.
|
||||
while(!_stk.empty())
|
||||
{
|
||||
_cpage=_stk.top();
|
||||
_stk.pop();
|
||||
if(_cpage->onUnload()==0)
|
||||
{
|
||||
delete _cpage;
|
||||
}
|
||||
_cpage=nullptr;
|
||||
}
|
||||
}
|
87
CUI.h
Normal file
87
CUI.h
Normal file
@ -0,0 +1,87 @@
|
||||
#pragma once
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <stack>
|
||||
|
||||
/// Fwd DECL
|
||||
class Frame;
|
||||
|
||||
class Selection
|
||||
{
|
||||
public:
|
||||
Selection();
|
||||
int id;
|
||||
std::string text;
|
||||
std::string info;
|
||||
|
||||
virtual void drawText();
|
||||
virtual void drawInfo();
|
||||
bool hasInfo();
|
||||
Frame* getFrame();
|
||||
void setFrame();
|
||||
|
||||
/// return 2 to exit.
|
||||
/// return 1 to return last page.(If no page to return, exit the program)
|
||||
/// return 0 to continue running.(If you want to change page, you should return 0)
|
||||
virtual int onClick();
|
||||
private:
|
||||
Frame* _pframe;
|
||||
};
|
||||
|
||||
class Page
|
||||
{
|
||||
public:
|
||||
Page();
|
||||
virtual ~Page();
|
||||
std::string title;
|
||||
std::string text;
|
||||
|
||||
void add(Selection*);
|
||||
int del(Selection*);
|
||||
int getSelectionSize();
|
||||
|
||||
Frame* getFrame();
|
||||
void setFrame(Frame*);
|
||||
|
||||
virtual void draw();
|
||||
|
||||
virtual void onLoad();
|
||||
virtual void onForeground();
|
||||
virtual void onBackground();
|
||||
/// return 0 tell frame to delete page, return 1 tell frame not to delete
|
||||
virtual int onUnload();
|
||||
|
||||
virtual int onActive(int id);
|
||||
private:
|
||||
std::list<Selection*> _vec;
|
||||
Frame* _pframe;
|
||||
};
|
||||
|
||||
class Frame
|
||||
{
|
||||
public:
|
||||
Frame();
|
||||
~Frame();
|
||||
void run();
|
||||
Page* getPage();
|
||||
void setPage(Page*);
|
||||
|
||||
void jumpTo(Page*);
|
||||
|
||||
protected:
|
||||
void clearScreen();
|
||||
void clearInput();
|
||||
|
||||
/// return 1 if error cannot be solve. return 0 on solved problem.
|
||||
int onInvalidInput();
|
||||
private:
|
||||
/// First Page.
|
||||
Page* _page;
|
||||
/// Current Processing Page (Internal Variable)
|
||||
Page* _cpage;
|
||||
/// Next Page to be processed (Internal Variable)
|
||||
Page* _npage;
|
||||
/// Inactive Page Stack (Internal Variable)
|
||||
std::stack<Page*> _stk;
|
||||
};
|
||||
|
Reference in New Issue
Block a user