Many improvements.
This commit is contained in:
parent
1a8e3ba1e6
commit
4848c81428
|
@ -24,7 +24,7 @@ void onsig(int sig)
|
||||||
getmaxyx(w, y, x);
|
getmaxyx(w, y, x);
|
||||||
myform->SetWindow(w);
|
myform->SetWindow(w);
|
||||||
myform->Render(1,1,x,y);
|
myform->Render(1,1,x,y);
|
||||||
std::cerr << "Size change: " << x << " " << y << std::endl;
|
myform->UpdateStatusBar();
|
||||||
}
|
}
|
||||||
signal(SIGWINCH, onsig);
|
signal(SIGWINCH, onsig);
|
||||||
}
|
}
|
||||||
|
@ -32,9 +32,9 @@ void onsig(int sig)
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
|
|
||||||
if ( argc != 2 )
|
if ( argc > 2 )
|
||||||
{
|
{
|
||||||
std::cerr << "Usage: " << argv[0] << " source_directory"
|
std::cerr << "Usage: " << argv[0] << " source_directory."
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,14 @@ int main(int argc, char** argv)
|
||||||
int x,y;
|
int x,y;
|
||||||
getmaxyx(w, y, x);
|
getmaxyx(w, y, x);
|
||||||
|
|
||||||
|
if ( argc == 2 )
|
||||||
|
{
|
||||||
myform = new cmCursesMainForm(argv[1], newCache);
|
myform = new cmCursesMainForm(argv[1], newCache);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
myform = new cmCursesMainForm("", newCache);
|
||||||
|
}
|
||||||
myform->InitializeUI(w);
|
myform->InitializeUI(w);
|
||||||
myform->Render(1, 1, x, y);
|
myform->Render(1, 1, x, y);
|
||||||
myform->HandleInput();
|
myform->HandleInput();
|
||||||
|
|
|
@ -14,7 +14,7 @@ cmCursesBoolWidget::cmCursesBoolWidget(int width, int height,
|
||||||
bool cmCursesBoolWidget::HandleInput(int& key, FORM* form, WINDOW* w)
|
bool cmCursesBoolWidget::HandleInput(int& key, FORM* form, WINDOW* w)
|
||||||
{
|
{
|
||||||
// 10 == enter
|
// 10 == enter
|
||||||
if (key == 10)
|
if (key == 10 || key == KEY_ENTER)
|
||||||
{
|
{
|
||||||
if (this->GetValueAsBool())
|
if (this->GetValueAsBool())
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,6 +7,7 @@ cmCursesLabelWidget::cmCursesLabelWidget(int width, int height,
|
||||||
{
|
{
|
||||||
field_opts_off(m_Field, O_EDIT);
|
field_opts_off(m_Field, O_EDIT);
|
||||||
field_opts_off(m_Field, O_ACTIVE);
|
field_opts_off(m_Field, O_ACTIVE);
|
||||||
|
field_opts_off(m_Field, O_STATIC);
|
||||||
this->SetValue(name.c_str());
|
this->SetValue(name.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,16 @@
|
||||||
#include "cmCursesDummyWidget.h"
|
#include "cmCursesDummyWidget.h"
|
||||||
#include "cmCursesCacheEntryComposite.h"
|
#include "cmCursesCacheEntryComposite.h"
|
||||||
|
|
||||||
|
const int cmCursesMainForm::MIN_WIDTH = 65;
|
||||||
|
const int cmCursesMainForm::MIN_HEIGHT = 6;
|
||||||
|
const int cmCursesMainForm::IDEAL_WIDTH = 80;
|
||||||
|
const int cmCursesMainForm::MAX_WIDTH = 512;
|
||||||
|
|
||||||
|
inline int ctrl(int z)
|
||||||
|
{
|
||||||
|
return (z&037);
|
||||||
|
}
|
||||||
|
|
||||||
cmCursesMainForm::cmCursesMainForm(const char* whereSource,
|
cmCursesMainForm::cmCursesMainForm(const char* whereSource,
|
||||||
bool newCache) :
|
bool newCache) :
|
||||||
m_WhereSource(whereSource)
|
m_WhereSource(whereSource)
|
||||||
|
@ -188,14 +198,13 @@ void cmCursesMainForm::Render(int left, int top, int width, int height)
|
||||||
free_form(m_Form);
|
free_form(m_Form);
|
||||||
m_Form = 0;
|
m_Form = 0;
|
||||||
}
|
}
|
||||||
if ( width < 22 || height < 2 )
|
if ( width < cmCursesMainForm::MIN_WIDTH ||
|
||||||
|
height < cmCursesMainForm::MIN_HEIGHT )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cerr << "Rendering again." << std::endl;
|
height -= 5;
|
||||||
|
|
||||||
height -= 3;
|
|
||||||
m_Height = height;
|
m_Height = height;
|
||||||
|
|
||||||
int size = m_Entries->size();
|
int size = m_Entries->size();
|
||||||
|
@ -212,29 +221,98 @@ void cmCursesMainForm::Render(int left, int top, int width, int height)
|
||||||
}
|
}
|
||||||
m_Form = new_form(m_Fields);
|
m_Form = new_form(m_Fields);
|
||||||
post_form(m_Form);
|
post_form(m_Form);
|
||||||
this->UpdateCurrentEntry();
|
this->UpdateStatusBar();
|
||||||
|
this->PrintKeys();
|
||||||
touchwin(m_Window);
|
touchwin(m_Window);
|
||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmCursesMainForm::UpdateCurrentEntry()
|
void cmCursesMainForm::PrintKeys()
|
||||||
{
|
{
|
||||||
FIELD* cur = current_field(m_Form);
|
|
||||||
int index = field_index(cur);
|
|
||||||
char* text = field_buffer(m_Fields[index-2], 0);
|
|
||||||
|
|
||||||
int x,y;
|
int x,y;
|
||||||
getmaxyx(m_Window, y, x);
|
getmaxyx(m_Window, y, x);
|
||||||
|
if ( x < cmCursesMainForm::MIN_WIDTH ||
|
||||||
|
y < cmCursesMainForm::MIN_HEIGHT )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
char firstLine[512], secondLine[512];
|
||||||
|
sprintf(firstLine, "C)onfigure G)enerate and Exit");
|
||||||
|
sprintf(secondLine, "Q)uit H)elp");
|
||||||
|
|
||||||
|
move(y-2,0);
|
||||||
|
printw(firstLine);
|
||||||
move(y-1,0);
|
move(y-1,0);
|
||||||
printw(text);
|
printw(secondLine);
|
||||||
|
pos_form_cursor(m_Form);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print the key of the current entry and the CMake version
|
||||||
|
// on the status bar. Designed for a width of 80 chars.
|
||||||
|
void cmCursesMainForm::UpdateStatusBar()
|
||||||
|
{
|
||||||
|
int x,y;
|
||||||
|
getmaxyx(m_Window, y, x);
|
||||||
|
if ( x < cmCursesMainForm::MIN_WIDTH ||
|
||||||
|
y < cmCursesMainForm::MIN_HEIGHT )
|
||||||
|
{
|
||||||
|
move(0,0);
|
||||||
|
printw("Window is too small. A size of at least %dx%d is required.",
|
||||||
|
cmCursesMainForm::MIN_WIDTH, cmCursesMainForm::MIN_HEIGHT);
|
||||||
|
touchwin(m_Window);
|
||||||
|
wrefresh(m_Window);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FIELD* cur = current_field(m_Form);
|
||||||
|
int index = field_index(cur);
|
||||||
|
char* curField = field_buffer(m_Fields[index-2], 0);
|
||||||
|
|
||||||
char version[128];
|
char version[128];
|
||||||
sprintf(version,"CMake Version %d.%d", cmMakefile::GetMajorVersion(),
|
sprintf(version,"(CMake Version %d.%d)", cmMakefile::GetMajorVersion(),
|
||||||
cmMakefile::GetMinorVersion());
|
cmMakefile::GetMinorVersion());
|
||||||
int len = strlen(version);
|
|
||||||
move(y-1, x-len);
|
|
||||||
printw(version);
|
|
||||||
|
|
||||||
|
char bar[cmCursesMainForm::MAX_WIDTH];
|
||||||
|
int i, curFieldLen = strlen(curField);
|
||||||
|
int versionLen = strlen(version);
|
||||||
|
int leftLen = cmCursesMainForm::IDEAL_WIDTH - versionLen;
|
||||||
|
if (curFieldLen >= leftLen)
|
||||||
|
{
|
||||||
|
strncpy(bar, curField, leftLen);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy(bar, curField);
|
||||||
|
for(i=curFieldLen; i < leftLen; ++i) { bar[i] = ' '; }
|
||||||
|
}
|
||||||
|
strcpy(bar+leftLen, version);
|
||||||
|
|
||||||
|
if ( x < cmCursesMainForm::MAX_WIDTH )
|
||||||
|
{
|
||||||
|
if (x > cmCursesMainForm::IDEAL_WIDTH )
|
||||||
|
{
|
||||||
|
for(i=cmCursesMainForm::IDEAL_WIDTH; i < x; i++)
|
||||||
|
{
|
||||||
|
bar[i] = ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bar[x] = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(i=cmCursesMainForm::IDEAL_WIDTH;
|
||||||
|
i < cmCursesMainForm::MAX_WIDTH-1; i++)
|
||||||
|
{
|
||||||
|
bar[i] = ' ';
|
||||||
|
}
|
||||||
|
bar[cmCursesMainForm::MAX_WIDTH-1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
move(y-3,0);
|
||||||
|
attron(A_STANDOUT);
|
||||||
|
printw(bar);
|
||||||
|
attroff(A_STANDOUT);
|
||||||
pos_form_cursor(m_Form);
|
pos_form_cursor(m_Form);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,9 +332,12 @@ void cmCursesMainForm::RunCMake(bool generateMakefiles)
|
||||||
// create the arguments for the cmake object
|
// create the arguments for the cmake object
|
||||||
std::vector<std::string> args;
|
std::vector<std::string> args;
|
||||||
args.push_back("cmake");
|
args.push_back("cmake");
|
||||||
|
if (m_WhereSource != "")
|
||||||
|
{
|
||||||
std::string arg;
|
std::string arg;
|
||||||
arg = m_WhereSource;
|
arg = m_WhereSource;
|
||||||
args.push_back(arg);
|
args.push_back(arg);
|
||||||
|
}
|
||||||
// run the generate process
|
// run the generate process
|
||||||
if(make.Generate(args, generateMakefiles) != 0)
|
if(make.Generate(args, generateMakefiles) != 0)
|
||||||
{
|
{
|
||||||
|
@ -307,7 +388,8 @@ void cmCursesMainForm::HandleInput()
|
||||||
cmCursesWidget* currentWidget;
|
cmCursesWidget* currentWidget;
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
this->UpdateCurrentEntry();
|
this->UpdateStatusBar();
|
||||||
|
this->PrintKeys();
|
||||||
int key = getch();
|
int key = getch();
|
||||||
|
|
||||||
currentField = current_field(m_Form);
|
currentField = current_field(m_Form);
|
||||||
|
@ -316,11 +398,13 @@ void cmCursesMainForm::HandleInput()
|
||||||
|
|
||||||
if (!currentWidget || !currentWidget->HandleInput(key, m_Form, m_Window))
|
if (!currentWidget || !currentWidget->HandleInput(key, m_Form, m_Window))
|
||||||
{
|
{
|
||||||
|
// quit
|
||||||
if ( key == 'q' )
|
if ( key == 'q' )
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if ( key == KEY_DOWN )
|
// if not end of page, next field otherwise next page
|
||||||
|
else if ( key == KEY_DOWN || key == ctrl('n') )
|
||||||
{
|
{
|
||||||
int x,y;
|
int x,y;
|
||||||
getmaxyx(m_Window, y, x);
|
getmaxyx(m_Window, y, x);
|
||||||
|
@ -339,7 +423,8 @@ void cmCursesMainForm::HandleInput()
|
||||||
form_driver(m_Form, REQ_NEXT_FIELD);
|
form_driver(m_Form, REQ_NEXT_FIELD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( key == KEY_UP )
|
// if not beginning of page, previous field, otherwise previous page
|
||||||
|
else if ( key == KEY_UP || key == ctrl('p') )
|
||||||
{
|
{
|
||||||
int x,y;
|
int x,y;
|
||||||
getmaxyx(m_Window, y, x);
|
getmaxyx(m_Window, y, x);
|
||||||
|
@ -359,23 +444,75 @@ void cmCursesMainForm::HandleInput()
|
||||||
form_driver(m_Form, REQ_PREV_FIELD);
|
form_driver(m_Form, REQ_PREV_FIELD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( key == KEY_NPAGE )
|
// pg down
|
||||||
|
else if ( key == KEY_NPAGE || key == ctrl('d') )
|
||||||
{
|
{
|
||||||
form_driver(m_Form, REQ_NEXT_PAGE);
|
form_driver(m_Form, REQ_NEXT_PAGE);
|
||||||
}
|
}
|
||||||
else if ( key == KEY_PPAGE )
|
// pg up
|
||||||
|
else if ( key == KEY_PPAGE || key == ctrl('u') )
|
||||||
{
|
{
|
||||||
form_driver(m_Form, REQ_PREV_PAGE);
|
form_driver(m_Form, REQ_PREV_PAGE);
|
||||||
}
|
}
|
||||||
|
// configure
|
||||||
else if ( key == 'c' )
|
else if ( key == 'c' )
|
||||||
{
|
{
|
||||||
this->RunCMake(false);
|
this->RunCMake(false);
|
||||||
}
|
}
|
||||||
else if ( key == 'o' )
|
// generate and exit
|
||||||
|
else if ( key == 'g' )
|
||||||
{
|
{
|
||||||
this->RunCMake(true);
|
this->RunCMake(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// delete cache entry
|
||||||
|
else if ( key == 'd' )
|
||||||
|
{
|
||||||
|
FIELD* cur = current_field(m_Form);
|
||||||
|
int index = field_index(cur);
|
||||||
|
|
||||||
|
// make the next or prev. current field after deletion
|
||||||
|
FIELD* nextCur;
|
||||||
|
if ( index == 2 )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if ( index == 3*m_Entries->size()-1 )
|
||||||
|
{
|
||||||
|
nextCur = m_Fields[index-5];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nextCur = m_Fields[index+1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the label widget
|
||||||
|
cmCursesWidget* lbl = reinterpret_cast<cmCursesWidget*>(field_userptr(
|
||||||
|
m_Fields[index-2]));
|
||||||
|
cmCacheManager::GetInstance()->RemoveCacheEntry(lbl->GetValue());
|
||||||
|
|
||||||
|
std::string nextVal (reinterpret_cast<cmCursesWidget*>(field_userptr(nextCur))->GetValue());
|
||||||
|
|
||||||
|
int x,y;
|
||||||
|
getmaxyx(m_Window, y, x);
|
||||||
|
this->InitializeUI(m_Window);
|
||||||
|
this->Render(1, 1, x, y);
|
||||||
|
|
||||||
|
// make the next or prev. current field after deletion
|
||||||
|
nextCur = 0;
|
||||||
|
std::vector<cmCursesCacheEntryComposite*>::iterator it;
|
||||||
|
for (it = m_Entries->begin(); it != m_Entries->end(); ++it)
|
||||||
|
{
|
||||||
|
if (nextVal == (*it)->m_Key)
|
||||||
|
{
|
||||||
|
nextCur = (*it)->m_Entry->m_Field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nextCur)
|
||||||
|
{
|
||||||
|
set_current_field(m_Form, nextCur);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
touchwin(m_Window);
|
touchwin(m_Window);
|
||||||
|
|
|
@ -36,11 +36,25 @@ public:
|
||||||
// list of current composites.
|
// list of current composites.
|
||||||
bool LookForCacheEntry(const char* key);
|
bool LookForCacheEntry(const char* key);
|
||||||
|
|
||||||
|
static const int MIN_WIDTH;
|
||||||
|
static const int MIN_HEIGHT;
|
||||||
|
static const int IDEAL_WIDTH;
|
||||||
|
static const int MAX_WIDTH;
|
||||||
|
|
||||||
|
// Description:
|
||||||
|
// This method should normally called only by the form.
|
||||||
|
// The only exception is during a resize.
|
||||||
|
void UpdateStatusBar();
|
||||||
|
|
||||||
|
// Description:
|
||||||
|
// This method should normally called only by the form.
|
||||||
|
// The only exception is during a resize.
|
||||||
|
void PrintKeys();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
cmCursesMainForm(const cmCursesMainForm& from);
|
cmCursesMainForm(const cmCursesMainForm& from);
|
||||||
void operator=(const cmCursesMainForm&);
|
void operator=(const cmCursesMainForm&);
|
||||||
|
|
||||||
void UpdateCurrentEntry();
|
|
||||||
void RunCMake(bool generateMakefiles);
|
void RunCMake(bool generateMakefiles);
|
||||||
void FillCacheManagerFromUI();
|
void FillCacheManagerFromUI();
|
||||||
|
|
||||||
|
@ -49,6 +63,7 @@ protected:
|
||||||
WINDOW* m_Window;
|
WINDOW* m_Window;
|
||||||
std::string m_WhereSource;
|
std::string m_WhereSource;
|
||||||
int m_Height;
|
int m_Height;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __cmCursesMainForm_h
|
#endif // __cmCursesMainForm_h
|
||||||
|
|
|
@ -29,12 +29,13 @@ bool cmCursesStringWidget::HandleInput(int& key, FORM* form, WINDOW* w)
|
||||||
// <Enter> is used to change edit mode (like <Esc> in vi).
|
// <Enter> is used to change edit mode (like <Esc> in vi).
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
if (!m_InEdit && ( key != 10 ) )
|
// If resize occured during edit, move out of edit mode
|
||||||
|
if (!m_InEdit && ( key != 10 && key != KEY_ENTER ) )
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// 10 == enter
|
// 10 == enter
|
||||||
if (key == 10)
|
if (key == 10 || key == KEY_ENTER)
|
||||||
{
|
{
|
||||||
if (m_InEdit)
|
if (m_InEdit)
|
||||||
{
|
{
|
||||||
|
@ -53,6 +54,7 @@ bool cmCursesStringWidget::HandleInput(int& key, FORM* form, WINDOW* w)
|
||||||
strcpy(originalStr, buf);
|
strcpy(originalStr, buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// esc
|
||||||
else if (key == 27)
|
else if (key == 27)
|
||||||
{
|
{
|
||||||
if (m_InEdit)
|
if (m_InEdit)
|
||||||
|
@ -73,7 +75,25 @@ bool cmCursesStringWidget::HandleInput(int& key, FORM* form, WINDOW* w)
|
||||||
{
|
{
|
||||||
form_driver(form, REQ_NEXT_CHAR);
|
form_driver(form, REQ_NEXT_CHAR);
|
||||||
}
|
}
|
||||||
else if ( key == ctrl('d') || key == 127 )
|
else if ( key == ctrl('k') )
|
||||||
|
{
|
||||||
|
form_driver(form, REQ_CLR_EOL);
|
||||||
|
}
|
||||||
|
else if ( key == ctrl('a') )
|
||||||
|
{
|
||||||
|
form_driver(form, REQ_BEG_FIELD);
|
||||||
|
}
|
||||||
|
else if ( key == ctrl('e') )
|
||||||
|
{
|
||||||
|
form_driver(form, REQ_END_FIELD);
|
||||||
|
}
|
||||||
|
else if ( key == ctrl('d') || key == 127 ||
|
||||||
|
key == KEY_BACKSPACE )
|
||||||
|
{
|
||||||
|
form_driver(form, REQ_DEL_PREV);
|
||||||
|
}
|
||||||
|
else if ( key == ctrl('d') || key == 127 ||
|
||||||
|
key == KEY_BACKSPACE || key == KEY_DC )
|
||||||
{
|
{
|
||||||
form_driver(form, REQ_DEL_PREV);
|
form_driver(form, REQ_DEL_PREV);
|
||||||
}
|
}
|
||||||
|
@ -101,6 +121,5 @@ const char* cmCursesStringWidget::GetString()
|
||||||
|
|
||||||
const char* cmCursesStringWidget::GetValue()
|
const char* cmCursesStringWidget::GetValue()
|
||||||
{
|
{
|
||||||
std::cout << field_buffer(m_Field, 0) << std::endl;
|
|
||||||
return field_buffer(m_Field, 0);
|
return field_buffer(m_Field, 0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue