Better handling of empty strings in FLineEdit and FButton + sub-menu example
This commit is contained in:
parent
70dd5af0fb
commit
ae62812335
|
@ -1,3 +1,7 @@
|
||||||
|
2015-11-29 Markus Gans <guru.mail@muenster.de>
|
||||||
|
* Better handling of empty strings in FLineEdit and FButton
|
||||||
|
* Add a sub-menu to the "ui.cpp" example
|
||||||
|
|
||||||
2015-11-25 Markus Gans <guru.mail@muenster.de>
|
2015-11-25 Markus Gans <guru.mail@muenster.de>
|
||||||
* Small menu improvements
|
* Small menu improvements
|
||||||
|
|
||||||
|
|
|
@ -137,9 +137,6 @@ void FButton::draw()
|
||||||
bool is_ActiveFocus, is_Active, is_Focus, is_Flat;
|
bool is_ActiveFocus, is_Active, is_Focus, is_Flat;
|
||||||
bool is_NonFlatShadow, is_NoUnderline;
|
bool is_NonFlatShadow, is_NoUnderline;
|
||||||
|
|
||||||
if ( text.isNull() || text.isEmpty() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
length = int(text.getLength());
|
length = int(text.getLength());
|
||||||
hotkeypos = -1;
|
hotkeypos = -1;
|
||||||
hotkey_offset = 0;
|
hotkey_offset = 0;
|
||||||
|
@ -150,7 +147,7 @@ void FButton::draw()
|
||||||
else
|
else
|
||||||
ButtonText = new wchar_t[length+1]();
|
ButtonText = new wchar_t[length+1]();
|
||||||
|
|
||||||
txt = text;
|
txt = FString(text);
|
||||||
src = const_cast<wchar_t*>(txt.wc_str());
|
src = const_cast<wchar_t*>(txt.wc_str());
|
||||||
dest = const_cast<wchar_t*>(ButtonText);
|
dest = const_cast<wchar_t*>(ButtonText);
|
||||||
|
|
||||||
|
@ -710,6 +707,9 @@ void FButton::onFocusOut (FFocusEvent*)
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FButton::setText (const FString& txt)
|
void FButton::setText (const FString& txt)
|
||||||
{
|
{
|
||||||
|
if ( txt )
|
||||||
text = txt;
|
text = txt;
|
||||||
|
else
|
||||||
|
text = "";
|
||||||
detectHotkey();
|
detectHotkey();
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,10 +185,11 @@ void FLineEdit::drawInputField()
|
||||||
if ( isUTF8_linux_terminal() )
|
if ( isUTF8_linux_terminal() )
|
||||||
{
|
{
|
||||||
setUTF8(true);
|
setUTF8(true);
|
||||||
|
if ( show_text )
|
||||||
print (show_text);
|
print (show_text);
|
||||||
setUTF8(false);
|
setUTF8(false);
|
||||||
}
|
}
|
||||||
else
|
else if ( show_text )
|
||||||
print (show_text);
|
print (show_text);
|
||||||
|
|
||||||
x = int(show_text.getLength());
|
x = int(show_text.getLength());
|
||||||
|
@ -782,12 +783,23 @@ void FLineEdit::onFocusOut (FFocusEvent*)
|
||||||
hideCursor();
|
hideCursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void FLineEdit::clearText()
|
||||||
|
{
|
||||||
|
offset = 0;
|
||||||
|
cursor_pos = 0;
|
||||||
|
text.clear();
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FLineEdit::setText (FString txt)
|
void FLineEdit::setText (FString txt)
|
||||||
{
|
{
|
||||||
offset = 0;
|
offset = 0;
|
||||||
cursor_pos = 0;
|
cursor_pos = 0;
|
||||||
|
if ( txt )
|
||||||
text = txt;
|
text = txt;
|
||||||
|
else
|
||||||
|
text = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
|
@ -105,6 +105,7 @@ class FLineEdit : public FWidget
|
||||||
void onFocusIn (FFocusEvent*);
|
void onFocusIn (FFocusEvent*);
|
||||||
void onFocusOut (FFocusEvent*);
|
void onFocusOut (FFocusEvent*);
|
||||||
|
|
||||||
|
void clearText();
|
||||||
void setText (FString);
|
void setText (FString);
|
||||||
FString getText() const;
|
FString getText() const;
|
||||||
void setLabelText (FString);
|
void setLabelText (FString);
|
||||||
|
|
|
@ -659,15 +659,20 @@ const FString& FString::operator += (const char* s)
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
const FString& FString::operator += (const wchar_t c)
|
const FString& FString::operator += (const wchar_t c)
|
||||||
{
|
{
|
||||||
_insert (length, 1, &c);
|
wchar_t s[2];
|
||||||
|
s[0] = c;
|
||||||
|
s[1] = L'\0';
|
||||||
|
_insert (length, 1, s);
|
||||||
return (*this);
|
return (*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
const FString& FString::operator += (const char c)
|
const FString& FString::operator += (const char c)
|
||||||
{
|
{
|
||||||
const wchar_t wc = static_cast<wchar_t>(c);
|
wchar_t s[2];
|
||||||
_insert (length, 1, &wc );
|
s[0] = wchar_t(c & 0xff);
|
||||||
|
s[1] = L'\0';
|
||||||
|
_insert (length, 1, s);
|
||||||
return (*this);
|
return (*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -724,17 +729,22 @@ const FString FString::operator + (const char* s)
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
const FString FString::operator + (const wchar_t c)
|
const FString FString::operator + (const wchar_t c)
|
||||||
{
|
{
|
||||||
|
wchar_t s[2];
|
||||||
|
s[0] = c;
|
||||||
|
s[1] = L'\0';
|
||||||
FString tmp(string);
|
FString tmp(string);
|
||||||
tmp._insert (length, 1, &c);
|
tmp._insert (length, 1, s);
|
||||||
return(tmp);
|
return(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
const FString FString::operator + (const char c)
|
const FString FString::operator + (const char c)
|
||||||
{
|
{
|
||||||
const wchar_t wc = static_cast<wchar_t>(c);
|
wchar_t s[2];
|
||||||
|
s[0] = wchar_t(c & 0xff);
|
||||||
|
s[1] = L'\0';
|
||||||
FString tmp(string);
|
FString tmp(string);
|
||||||
tmp._insert (length, 1, &wc);
|
tmp._insert (length, 1, s);
|
||||||
return(tmp);
|
return(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
117
test/ui.cpp
117
test/ui.cpp
|
@ -160,7 +160,9 @@ void ProgressDialog::cb_exit_bar (FWidget*, void*)
|
||||||
class MyDialog : public FDialog
|
class MyDialog : public FDialog
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
FLineEdit* myLineEdit;
|
||||||
FListBox* myList;
|
FListBox* myList;
|
||||||
|
FString clipboard;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MyDialog (const MyDialog&); // Disabled copy constructor
|
MyDialog (const MyDialog&); // Disabled copy constructor
|
||||||
|
@ -174,6 +176,10 @@ class MyDialog : public FDialog
|
||||||
void cb_about (FWidget*, void*);
|
void cb_about (FWidget*, void*);
|
||||||
void cb_terminfo (FWidget*, void*);
|
void cb_terminfo (FWidget*, void*);
|
||||||
void cb_drives (FWidget*, void*);
|
void cb_drives (FWidget*, void*);
|
||||||
|
void cb_cutClipboard (FWidget*, void*);
|
||||||
|
void cb_copyClipboard (FWidget*, void*);
|
||||||
|
void cb_pasteClipboard (FWidget*, void*);
|
||||||
|
void cb_clearInput (FWidget*, void*);
|
||||||
void cb_input2buttonText (FWidget*, void*);
|
void cb_input2buttonText (FWidget*, void*);
|
||||||
void cb_setTitlebar (FWidget*, void*);
|
void cb_setTitlebar (FWidget*, void*);
|
||||||
void cb_ProgressBar (FWidget*, void*);
|
void cb_ProgressBar (FWidget*, void*);
|
||||||
|
@ -190,7 +196,9 @@ class MyDialog : public FDialog
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
MyDialog::MyDialog (FWidget* parent)
|
MyDialog::MyDialog (FWidget* parent)
|
||||||
: FDialog(parent)
|
: FDialog(parent)
|
||||||
|
, myLineEdit()
|
||||||
, myList()
|
, myList()
|
||||||
|
, clipboard()
|
||||||
{
|
{
|
||||||
// menu bar
|
// menu bar
|
||||||
FMenuBar* Menubar = new FMenuBar (this);
|
FMenuBar* Menubar = new FMenuBar (this);
|
||||||
|
@ -202,9 +210,10 @@ MyDialog::MyDialog (FWidget* parent)
|
||||||
Edit->setStatusbarMessage ("Cut-and-paste editing commands");
|
Edit->setStatusbarMessage ("Cut-and-paste editing commands");
|
||||||
FMenu* View = new FMenu ("&View", Menubar);
|
FMenu* View = new FMenu ("&View", Menubar);
|
||||||
View->setStatusbarMessage ("Show internal informations");
|
View->setStatusbarMessage ("Show internal informations");
|
||||||
FMenuItem* Options = new FMenuItem ("&Options", Menubar);
|
//FMenuItem* Options = new FMenuItem ("&Options", Menubar);
|
||||||
|
FMenu* Options = new FMenu ("&Options", Menubar);
|
||||||
Options->setStatusbarMessage ("Set program defaults");
|
Options->setStatusbarMessage ("Set program defaults");
|
||||||
Options->setDisable();
|
//Options->setDisable();
|
||||||
FMenuItem* Help = new FMenuItem ("&Help", Menubar);
|
FMenuItem* Help = new FMenuItem ("&Help", Menubar);
|
||||||
Help->setStatusbarMessage ("Show version and copyright information");
|
Help->setStatusbarMessage ("Show version and copyright information");
|
||||||
|
|
||||||
|
@ -212,12 +221,20 @@ MyDialog::MyDialog (FWidget* parent)
|
||||||
FMenuItem* Open = new FMenuItem ("&Open...", File);
|
FMenuItem* Open = new FMenuItem ("&Open...", File);
|
||||||
Open->addAccelerator (fc::Fckey_o); // Ctrl + O
|
Open->addAccelerator (fc::Fckey_o); // Ctrl + O
|
||||||
Open->setStatusbarMessage ("Locate and open a text file");
|
Open->setStatusbarMessage ("Locate and open a text file");
|
||||||
|
FMenu* Recent = new FMenu ("System files", File);
|
||||||
|
Recent->setStatusbarMessage ("View text file");
|
||||||
|
|
||||||
FMenuItem* Line1 = new FMenuItem (File);
|
FMenuItem* Line1 = new FMenuItem (File);
|
||||||
Line1->setSeparator();
|
Line1->setSeparator();
|
||||||
FMenuItem* Quit = new FMenuItem ("&Quit", File);
|
FMenuItem* Quit = new FMenuItem ("&Quit", File);
|
||||||
Quit->addAccelerator (fc::Fmkey_x); // Meta/Alt + X
|
Quit->addAccelerator (fc::Fmkey_x); // Meta/Alt + X
|
||||||
Quit->setStatusbarMessage ("Exit the program");
|
Quit->setStatusbarMessage ("Exit the program");
|
||||||
|
|
||||||
|
// "Recent" menu items
|
||||||
|
FMenuItem* File1 = new FMenuItem ("/etc/services", Recent);
|
||||||
|
FMenuItem* File2 = new FMenuItem ("/etc/fstab", Recent);
|
||||||
|
FMenuItem* File3 = new FMenuItem ("/etc/passwd", Recent);
|
||||||
|
|
||||||
// "Edit" menu items
|
// "Edit" menu items
|
||||||
FMenuItem* Undo = new FMenuItem (fc::Fckey_z, "Undo", Edit);
|
FMenuItem* Undo = new FMenuItem (fc::Fckey_z, "Undo", Edit);
|
||||||
Undo->setDisable();
|
Undo->setDisable();
|
||||||
|
@ -240,6 +257,15 @@ MyDialog::MyDialog (FWidget* parent)
|
||||||
FMenuItem* Drive = new FMenuItem ("&Drive symbols...", View);
|
FMenuItem* Drive = new FMenuItem ("&Drive symbols...", View);
|
||||||
Drive->setStatusbarMessage ("Show drive symbols");
|
Drive->setStatusbarMessage ("Show drive symbols");
|
||||||
|
|
||||||
|
// "Options" menu items
|
||||||
|
FCheckMenuItem* aa = new FCheckMenuItem ("Disk &Status", Options);
|
||||||
|
aa->setStatusbarMessage ("1");
|
||||||
|
aa->setChecked();
|
||||||
|
FRadioMenuItem* bb = new FRadioMenuItem ("&Quick View", Options);
|
||||||
|
bb->setStatusbarMessage ("2");
|
||||||
|
FRadioMenuItem* cc = new FRadioMenuItem ("&Baumstrucktur", Options);
|
||||||
|
cc->setStatusbarMessage ("3");
|
||||||
|
|
||||||
// Menu function callbacks
|
// Menu function callbacks
|
||||||
Open->addCallback
|
Open->addCallback
|
||||||
(
|
(
|
||||||
|
@ -254,22 +280,22 @@ MyDialog::MyDialog (FWidget* parent)
|
||||||
Cut->addCallback
|
Cut->addCallback
|
||||||
(
|
(
|
||||||
"clicked",
|
"clicked",
|
||||||
_METHOD_CALLBACK (this, &MyDialog::cb_noFunctionMsg)
|
_METHOD_CALLBACK (this, &MyDialog::cb_cutClipboard)
|
||||||
);
|
);
|
||||||
Copy->addCallback
|
Copy->addCallback
|
||||||
(
|
(
|
||||||
"clicked",
|
"clicked",
|
||||||
_METHOD_CALLBACK (this, &MyDialog::cb_noFunctionMsg)
|
_METHOD_CALLBACK (this, &MyDialog::cb_copyClipboard)
|
||||||
);
|
);
|
||||||
Paste->addCallback
|
Paste->addCallback
|
||||||
(
|
(
|
||||||
"clicked",
|
"clicked",
|
||||||
_METHOD_CALLBACK (this, &MyDialog::cb_noFunctionMsg)
|
_METHOD_CALLBACK (this, &MyDialog::cb_pasteClipboard)
|
||||||
);
|
);
|
||||||
Clear->addCallback
|
Clear->addCallback
|
||||||
(
|
(
|
||||||
"clicked",
|
"clicked",
|
||||||
_METHOD_CALLBACK (this, &MyDialog::cb_noFunctionMsg)
|
_METHOD_CALLBACK (this, &MyDialog::cb_clearInput)
|
||||||
);
|
);
|
||||||
Env->addCallback
|
Env->addCallback
|
||||||
(
|
(
|
||||||
|
@ -286,6 +312,21 @@ MyDialog::MyDialog (FWidget* parent)
|
||||||
"clicked",
|
"clicked",
|
||||||
_METHOD_CALLBACK (this, &MyDialog::cb_about)
|
_METHOD_CALLBACK (this, &MyDialog::cb_about)
|
||||||
);
|
);
|
||||||
|
File1->addCallback
|
||||||
|
(
|
||||||
|
"clicked",
|
||||||
|
_METHOD_CALLBACK (this, &MyDialog::cb_view)
|
||||||
|
);
|
||||||
|
File2->addCallback
|
||||||
|
(
|
||||||
|
"clicked",
|
||||||
|
_METHOD_CALLBACK (this, &MyDialog::cb_view)
|
||||||
|
);
|
||||||
|
File3->addCallback
|
||||||
|
(
|
||||||
|
"clicked",
|
||||||
|
_METHOD_CALLBACK (this, &MyDialog::cb_view)
|
||||||
|
);
|
||||||
|
|
||||||
// Buttons
|
// Buttons
|
||||||
FButton* MyButton1 = new FButton (this);
|
FButton* MyButton1 = new FButton (this);
|
||||||
|
@ -341,12 +382,12 @@ MyDialog::MyDialog (FWidget* parent)
|
||||||
check2->setNoUnderline();
|
check2->setNoUnderline();
|
||||||
|
|
||||||
// A text input field
|
// A text input field
|
||||||
FLineEdit* MyLineEdit = new FLineEdit (this);
|
myLineEdit = new FLineEdit (this);
|
||||||
MyLineEdit->setGeometry(22, 1, 10, 1);
|
myLineEdit->setGeometry(22, 1, 10, 1);
|
||||||
MyLineEdit->setText (FString("EnTry").toLower());
|
myLineEdit->setText (FString("EnTry").toLower());
|
||||||
MyLineEdit->setLabelText (L"&Input:");
|
myLineEdit->setLabelText (L"&Input:");
|
||||||
MyLineEdit->setStatusbarMessage ("Press Enter to set the title");
|
myLineEdit->setStatusbarMessage ("Press Enter to set the title");
|
||||||
MyLineEdit->setShadow();
|
myLineEdit->setShadow();
|
||||||
|
|
||||||
// Buttons
|
// Buttons
|
||||||
FButton* MyButton4 = new FButton (this);
|
FButton* MyButton4 = new FButton (this);
|
||||||
|
@ -431,7 +472,7 @@ MyDialog::MyDialog (FWidget* parent)
|
||||||
(
|
(
|
||||||
"clicked",
|
"clicked",
|
||||||
_METHOD_CALLBACK (this, &MyDialog::cb_input2buttonText),
|
_METHOD_CALLBACK (this, &MyDialog::cb_input2buttonText),
|
||||||
dynamic_cast<FWidget::data_ptr>(MyLineEdit)
|
dynamic_cast<FWidget::data_ptr>(myLineEdit)
|
||||||
);
|
);
|
||||||
|
|
||||||
MyButton5->addCallback
|
MyButton5->addCallback
|
||||||
|
@ -446,7 +487,7 @@ MyDialog::MyDialog (FWidget* parent)
|
||||||
_METHOD_CALLBACK (this, &MyDialog::cb_exitApp)
|
_METHOD_CALLBACK (this, &MyDialog::cb_exitApp)
|
||||||
);
|
);
|
||||||
|
|
||||||
MyLineEdit->addCallback
|
myLineEdit->addCallback
|
||||||
(
|
(
|
||||||
"activate", // e.g. on <Enter>
|
"activate", // e.g. on <Enter>
|
||||||
_METHOD_CALLBACK (this, &MyDialog::cb_setTitlebar)
|
_METHOD_CALLBACK (this, &MyDialog::cb_setTitlebar)
|
||||||
|
@ -463,7 +504,7 @@ MyDialog::MyDialog (FWidget* parent)
|
||||||
(
|
(
|
||||||
"clicked",
|
"clicked",
|
||||||
_METHOD_CALLBACK (this, &MyDialog::cb_setInput),
|
_METHOD_CALLBACK (this, &MyDialog::cb_setInput),
|
||||||
dynamic_cast<FWidget::data_ptr>(MyLineEdit)
|
dynamic_cast<FWidget::data_ptr>(myLineEdit)
|
||||||
);
|
);
|
||||||
|
|
||||||
myList->addCallback
|
myList->addCallback
|
||||||
|
@ -593,6 +634,43 @@ void MyDialog::cb_drives (FWidget*, void*)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void MyDialog::cb_cutClipboard (FWidget*, void*)
|
||||||
|
{
|
||||||
|
if ( ! myLineEdit )
|
||||||
|
return;
|
||||||
|
clipboard = myLineEdit->getText();
|
||||||
|
myLineEdit->clearText();
|
||||||
|
myLineEdit->redraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void MyDialog::cb_copyClipboard (FWidget*, void*)
|
||||||
|
{
|
||||||
|
if ( ! myLineEdit )
|
||||||
|
return;
|
||||||
|
clipboard = myLineEdit->getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void MyDialog::cb_pasteClipboard (FWidget*, void*)
|
||||||
|
{
|
||||||
|
if ( ! myLineEdit )
|
||||||
|
return;
|
||||||
|
myLineEdit->setText(clipboard);
|
||||||
|
myLineEdit->redraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void MyDialog::cb_clearInput (FWidget*, void*)
|
||||||
|
{
|
||||||
|
if ( ! myLineEdit )
|
||||||
|
return;
|
||||||
|
clipboard.clear();
|
||||||
|
myLineEdit->clearText();
|
||||||
|
myLineEdit->redraw();
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void MyDialog::cb_input2buttonText (FWidget* widget, void* data_ptr)
|
void MyDialog::cb_input2buttonText (FWidget* widget, void* data_ptr)
|
||||||
{
|
{
|
||||||
|
@ -645,9 +723,14 @@ void MyDialog::cb_activateButton (FWidget* widget, void* data_ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void MyDialog::cb_view (FWidget*, void*)
|
void MyDialog::cb_view (FWidget* widget, void*)
|
||||||
{
|
{
|
||||||
FString file = FFileDialog::fileOpenChooser (this);
|
FString file;
|
||||||
|
FMenuItem* item = static_cast<FMenuItem*>(widget);
|
||||||
|
if ( item->getText() )
|
||||||
|
file = item->getText();
|
||||||
|
else
|
||||||
|
file = FFileDialog::fileOpenChooser (this);
|
||||||
if ( file.isNull() )
|
if ( file.isNull() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue