Many improvements.

This commit is contained in:
Berk Geveci 2001-11-05 22:10:52 -05:00
parent 1a8e3ba1e6
commit 4848c81428
6 changed files with 214 additions and 35 deletions

View File

@ -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);
myform = new cmCursesMainForm(argv[1], newCache); if ( argc == 2 )
{
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();

View File

@ -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())
{ {

View File

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

View File

@ -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");
std::string arg; if (m_WhereSource != "")
arg = m_WhereSource; {
args.push_back(arg); std::string arg;
arg = m_WhereSource;
args.push_back(arg);
}
// run the generate process // run the generate process
if(make.Generate(args, generateMakefiles) != 0) if(make.Generate(args, generateMakefiles) != 0)
{ {
@ -269,7 +350,7 @@ void cmCursesMainForm::RunCMake(bool generateMakefiles)
cbreak(); /* nl- or cr not needed */ cbreak(); /* nl- or cr not needed */
keypad(m_Window,TRUE); /* Use key symbols as keypad(m_Window,TRUE); /* Use key symbols as
KEY_DOWN*/ KEY_DOWN*/
this->InitializeUI(m_Window); this->InitializeUI(m_Window);
this->Render(1, 1, x, y); this->Render(1, 1, x, y);
@ -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);

View File

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

View File

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