New method setInputType() in FLineEdit that allows to obscure password entries
This commit is contained in:
parent
5e4a71dc0d
commit
5ceee8b4c8
|
@ -1,3 +1,8 @@
|
||||||
|
2019-10-20 Markus Gans <guru.mail@muenster.de>
|
||||||
|
* New method setInputType() in FLineEdit that allows to obscure
|
||||||
|
password entries
|
||||||
|
* FAcceleratorList reimplemented as non-pointer
|
||||||
|
|
||||||
2019-10-15 Markus Gans <guru.mail@muenster.de>
|
2019-10-15 Markus Gans <guru.mail@muenster.de>
|
||||||
* Version 0.6.0
|
* Version 0.6.0
|
||||||
|
|
||||||
|
|
|
@ -514,3 +514,4 @@ bit 0 (EGA Only) Output to pin 21 of the Feature Connector.
|
||||||
is the logical OR of the vertical sync and the vertical display
|
is the logical OR of the vertical sync and the vertical display
|
||||||
enable.
|
enable.
|
||||||
Note: On the VGA this register can be read from port 3CAh.
|
Note: On the VGA this register can be read from port 3CAh.
|
||||||
|
|
||||||
|
|
|
@ -71,25 +71,28 @@ int main (int argc, char* argv[])
|
||||||
|
|
||||||
// Create input fields
|
// Create input fields
|
||||||
finalcut::FLineEdit name_field (&dgl);
|
finalcut::FLineEdit name_field (&dgl);
|
||||||
|
finalcut::FLineEdit pw_field (&dgl);
|
||||||
finalcut::FLineEdit email_field (&dgl);
|
finalcut::FLineEdit email_field (&dgl);
|
||||||
finalcut::FLineEdit org_field (&dgl);
|
|
||||||
finalcut::FLineEdit city_field (&dgl);
|
finalcut::FLineEdit city_field (&dgl);
|
||||||
finalcut::FLineEdit st_field (&dgl);
|
finalcut::FLineEdit st_field (&dgl);
|
||||||
finalcut::FLineEdit c_field (&dgl);
|
finalcut::FLineEdit c_field (&dgl);
|
||||||
|
|
||||||
|
// Set input type to password
|
||||||
|
pw_field.setInputType (finalcut::FLineEdit::password);
|
||||||
|
|
||||||
name_field.setLabelText (L"&Name");
|
name_field.setLabelText (L"&Name");
|
||||||
|
pw_field.setLabelText (L"&Password");
|
||||||
email_field.setLabelText (L"&Email");
|
email_field.setLabelText (L"&Email");
|
||||||
org_field.setLabelText (L"Or&ganization");
|
|
||||||
city_field.setLabelText (L"&City");
|
city_field.setLabelText (L"&City");
|
||||||
st_field.setLabelText (L"&State");
|
st_field.setLabelText (L"&State");
|
||||||
c_field.setLabelText (L"&Country");
|
c_field.setLabelText (L"&Country");
|
||||||
|
|
||||||
name_field.setGeometry (FPoint(15, 1), FSize(19, 1));
|
name_field.setGeometry (FPoint(11, 1), FSize(23, 1));
|
||||||
email_field.setGeometry (FPoint(15, 3), FSize(19, 1));
|
pw_field.setGeometry (FPoint(11, 3), FSize(23, 1));
|
||||||
org_field.setGeometry (FPoint(15, 5), FSize(19, 1));
|
email_field.setGeometry (FPoint(11, 5), FSize(23, 1));
|
||||||
city_field.setGeometry (FPoint(15, 7), FSize(19, 1));
|
city_field.setGeometry (FPoint(11, 7), FSize(23, 1));
|
||||||
st_field.setGeometry (FPoint(15, 9), FSize(19, 1));
|
st_field.setGeometry (FPoint(11, 9), FSize(23, 1));
|
||||||
c_field.setGeometry (FPoint(15, 11), FSize(4, 1));
|
c_field.setGeometry (FPoint(11, 11), FSize(4, 1));
|
||||||
|
|
||||||
// Create the button group
|
// Create the button group
|
||||||
finalcut::FButtonGroup radioButtonGroup ("Sex", &dgl);
|
finalcut::FButtonGroup radioButtonGroup ("Sex", &dgl);
|
||||||
|
|
|
@ -13,10 +13,13 @@ License: LGPL-3.0-or-later
|
||||||
Group: Development/Libraries/C and C++
|
Group: Development/Libraries/C and C++
|
||||||
URL: https://github.com/gansm/finalcut/
|
URL: https://github.com/gansm/finalcut/
|
||||||
Source: https://github.com/gansm/finalcut/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz
|
Source: https://github.com/gansm/finalcut/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz
|
||||||
|
BuildRequires: autoconf
|
||||||
|
BuildRequires: autoconf-archive
|
||||||
BuildRequires: automake
|
BuildRequires: automake
|
||||||
BuildRequires: gcc-c++
|
BuildRequires: gcc-c++ >= 5.1
|
||||||
BuildRequires: glib2-devel
|
BuildRequires: glib2-devel
|
||||||
BuildRequires: gpm-devel
|
BuildRequires: gpm-devel
|
||||||
|
BuildRequires: gdb
|
||||||
BuildRequires: libtool
|
BuildRequires: libtool
|
||||||
BuildRequires: ncurses-devel
|
BuildRequires: ncurses-devel
|
||||||
|
|
||||||
|
@ -35,12 +38,13 @@ Group: Development/Libraries/C and C++
|
||||||
Requires: libfinal%{sover} = %{version}
|
Requires: libfinal%{sover} = %{version}
|
||||||
Requires: bdftopcf
|
Requires: bdftopcf
|
||||||
Requires: coreutils
|
Requires: coreutils
|
||||||
Requires: gcc-c++
|
Requires: gcc-c++ >= 5.1
|
||||||
Requires: grep
|
Requires: grep
|
||||||
Requires: gzip
|
Requires: gzip
|
||||||
Requires: sed
|
Requires: sed
|
||||||
Requires: vim
|
Requires: vim
|
||||||
Provides: libfinal-devel = %{version}
|
Provides: libfinal-devel = %{version}
|
||||||
|
Obsoletes: libfinal-devel < %{version}
|
||||||
Recommends: libfinal-examples = %{version}
|
Recommends: libfinal-examples = %{version}
|
||||||
|
|
||||||
%description -n libfinal-devel
|
%description -n libfinal-devel
|
||||||
|
@ -56,6 +60,8 @@ radio buttons, input lines, list boxes, status bars and so on.
|
||||||
Summary: Example files for the FINAL CUT library
|
Summary: Example files for the FINAL CUT library
|
||||||
Group: Development/Languages/C and C++
|
Group: Development/Languages/C and C++
|
||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
|
Provides: libfinal-examples = %{version}
|
||||||
|
Obsoletes: libfinal-examples < %{version}
|
||||||
|
|
||||||
%description -n libfinal-examples
|
%description -n libfinal-examples
|
||||||
FINAL CUT is a class library and widget toolkit with full mouse
|
FINAL CUT is a class library and widget toolkit with full mouse
|
||||||
|
@ -108,8 +114,10 @@ make %{?_smp_mflags} V=1
|
||||||
make install libdir=%{buildroot}%{_libdir}/ \
|
make install libdir=%{buildroot}%{_libdir}/ \
|
||||||
includedir=%{buildroot}%{_includedir} \
|
includedir=%{buildroot}%{_includedir} \
|
||||||
bindir=%{buildroot}%{_bindir} \
|
bindir=%{buildroot}%{_bindir} \
|
||||||
docdir=%{buildroot}%{_docdir}/%{name}/
|
docdir=%{buildroot}%{_docdir}/%{name}/ \
|
||||||
|
fontdir=%{buildroot}%{_miscfontsdir}/%{name}/
|
||||||
mkdir -p %{buildroot}%{_docdir}/%{name}/examples
|
mkdir -p %{buildroot}%{_docdir}/%{name}/examples
|
||||||
|
mkdir -p %{buildroot}%{_miscfontsdir}/%{name}/
|
||||||
cp -p examples/*.cpp %{buildroot}%{_docdir}/%{name}/examples
|
cp -p examples/*.cpp %{buildroot}%{_docdir}/%{name}/examples
|
||||||
cp -p examples/Makefile.clang %{buildroot}%{_docdir}/%{name}/examples
|
cp -p examples/Makefile.clang %{buildroot}%{_docdir}/%{name}/examples
|
||||||
cp -p examples/Makefile.gcc %{buildroot}%{_docdir}/%{name}/examples
|
cp -p examples/Makefile.gcc %{buildroot}%{_docdir}/%{name}/examples
|
||||||
|
|
|
@ -716,11 +716,10 @@ bool FApplication::processAccelerator (const FWidget*& widget)
|
||||||
bool accpt{false};
|
bool accpt{false};
|
||||||
|
|
||||||
if ( widget
|
if ( widget
|
||||||
&& widget->getAcceleratorList()
|
&& ! widget->getAcceleratorList().empty() )
|
||||||
&& ! widget->getAcceleratorList()->empty() )
|
|
||||||
{
|
{
|
||||||
auto iter = widget->getAcceleratorList()->begin();
|
auto iter = widget->getAcceleratorList().begin();
|
||||||
auto last = widget->getAcceleratorList()->end();
|
auto last = widget->getAcceleratorList().end();
|
||||||
|
|
||||||
while ( iter != last )
|
while ( iter != last )
|
||||||
{
|
{
|
||||||
|
|
|
@ -794,9 +794,6 @@ void FDialog::init()
|
||||||
old_focus->redraw();
|
old_focus->redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create your own accelerator list for this dialog
|
|
||||||
createWidgetAcceleratorList();
|
|
||||||
|
|
||||||
// Add the dialog menu
|
// Add the dialog menu
|
||||||
initDialogMenu();
|
initDialogMenu();
|
||||||
}
|
}
|
||||||
|
|
|
@ -263,6 +263,8 @@ void FLineEdit::setText (const FString& txt)
|
||||||
else
|
else
|
||||||
text.setString("");
|
text.setString("");
|
||||||
|
|
||||||
|
print_text = ( isPasswordField() ) ? getPasswordText() : text;
|
||||||
|
|
||||||
if ( isShown() )
|
if ( isShown() )
|
||||||
{
|
{
|
||||||
cursorEnd();
|
cursorEnd();
|
||||||
|
@ -276,7 +278,10 @@ void FLineEdit::setMaxLength (std::size_t max)
|
||||||
max_length = max;
|
max_length = max;
|
||||||
|
|
||||||
if ( text.getLength() > max_length )
|
if ( text.getLength() > max_length )
|
||||||
|
{
|
||||||
text.setString(text.left(max_length));
|
text.setString(text.left(max_length));
|
||||||
|
print_text = ( isPasswordField() ) ? getPasswordText() : text;
|
||||||
|
}
|
||||||
|
|
||||||
if ( isShown() )
|
if ( isShown() )
|
||||||
{
|
{
|
||||||
|
@ -343,6 +348,7 @@ void FLineEdit::clear()
|
||||||
text_offset = 0;
|
text_offset = 0;
|
||||||
char_width_offset = 0;
|
char_width_offset = 0;
|
||||||
text.clear();
|
text.clear();
|
||||||
|
print_text.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
@ -439,7 +445,7 @@ void FLineEdit::onMouseDown (FMouseEvent* ev)
|
||||||
|
|
||||||
if ( mouse_x >= xmin && mouse_x <= int(getWidth()) && mouse_y == 1 )
|
if ( mouse_x >= xmin && mouse_x <= int(getWidth()) && mouse_y == 1 )
|
||||||
{
|
{
|
||||||
std::size_t len = text.getLength();
|
std::size_t len = print_text.getLength();
|
||||||
cursor_pos = clickPosToCursorPos (std::size_t(mouse_x) - 2);
|
cursor_pos = clickPosToCursorPos (std::size_t(mouse_x) - 2);
|
||||||
|
|
||||||
if ( cursor_pos >= len )
|
if ( cursor_pos >= len )
|
||||||
|
@ -470,7 +476,7 @@ void FLineEdit::onMouseMove (FMouseEvent* ev)
|
||||||
if ( ev->getButton() != fc::LeftButton )
|
if ( ev->getButton() != fc::LeftButton )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::size_t len = text.getLength();
|
std::size_t len = print_text.getLength();
|
||||||
int mouse_x = ev->getX();
|
int mouse_x = ev->getX();
|
||||||
int mouse_y = ev->getY();
|
int mouse_y = ev->getY();
|
||||||
|
|
||||||
|
@ -531,7 +537,7 @@ void FLineEdit::onMouseMove (FMouseEvent* ev)
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FLineEdit::onTimer (FTimerEvent*)
|
void FLineEdit::onTimer (FTimerEvent*)
|
||||||
{
|
{
|
||||||
auto len = text.getLength();
|
auto len = print_text.getLength();
|
||||||
|
|
||||||
switch ( int(drag_scroll) )
|
switch ( int(drag_scroll) )
|
||||||
{
|
{
|
||||||
|
@ -765,20 +771,24 @@ void FLineEdit::drawInputField()
|
||||||
if ( isActiveFocus && getMaxColor() < 16 )
|
if ( isActiveFocus && getMaxColor() < 16 )
|
||||||
setBold();
|
setBold();
|
||||||
|
|
||||||
auto text_offset_column = getColumnWidth (text, text_offset);
|
std::size_t text_offset_column = [&] () -> std::size_t
|
||||||
std::size_t start_column = text_offset_column - char_width_offset + 1;
|
{
|
||||||
const FString& show_text = \
|
switch ( input_type )
|
||||||
getColumnSubString(text, start_column, getWidth() - 2);
|
{
|
||||||
|
case FLineEdit::textfield:
|
||||||
|
return printTextField();
|
||||||
|
|
||||||
if ( show_text )
|
case FLineEdit::password:
|
||||||
print (show_text);
|
return printPassword();
|
||||||
|
}
|
||||||
|
|
||||||
std::size_t x = getColumnWidth(show_text);
|
return 0;
|
||||||
|
}();
|
||||||
|
|
||||||
while ( x + 1 < getWidth() )
|
while ( x_pos + 1 < getWidth() )
|
||||||
{
|
{
|
||||||
print (' ');
|
print (' ');
|
||||||
x++;
|
x_pos++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( isActiveFocus && getMaxColor() < 16 )
|
if ( isActiveFocus && getMaxColor() < 16 )
|
||||||
|
@ -794,26 +804,81 @@ void FLineEdit::drawInputField()
|
||||||
drawShadow(this);
|
drawShadow(this);
|
||||||
|
|
||||||
// set the cursor to the insert pos.
|
// set the cursor to the insert pos.
|
||||||
auto cursor_pos_column = getColumnWidth (text, cursor_pos);
|
auto cursor_pos_column = getCursorColumnPos();
|
||||||
int xpos = int(2 + cursor_pos_column
|
int xpos = int(2 + cursor_pos_column
|
||||||
- text_offset_column
|
- text_offset_column
|
||||||
+ char_width_offset);
|
+ char_width_offset);
|
||||||
setCursorPos (FPoint(xpos, 1));
|
setCursorPos (FPoint(xpos, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline std::size_t FLineEdit::printTextField()
|
||||||
|
{
|
||||||
|
std::size_t text_offset_column = getColumnWidth (print_text, text_offset);
|
||||||
|
std::size_t start_column = text_offset_column - char_width_offset + 1;
|
||||||
|
const FString& show_text = \
|
||||||
|
getColumnSubString(print_text, start_column, getWidth() - 2);
|
||||||
|
|
||||||
|
if ( ! show_text.isEmpty() )
|
||||||
|
print (show_text);
|
||||||
|
|
||||||
|
x_pos = getColumnWidth(show_text);
|
||||||
|
return text_offset_column;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline std::size_t FLineEdit::printPassword()
|
||||||
|
{
|
||||||
|
std::size_t text_offset_column = text_offset;
|
||||||
|
FString show_text(print_text.mid(1 + text_offset, getWidth() - 2));
|
||||||
|
|
||||||
|
if ( ! show_text.isEmpty() )
|
||||||
|
print() << FString(show_text.getLength(), fc::Bullet); // •
|
||||||
|
|
||||||
|
x_pos = show_text.getLength();
|
||||||
|
return text_offset_column;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline std::size_t FLineEdit::getCursorColumnPos()
|
||||||
|
{
|
||||||
|
switch ( input_type )
|
||||||
|
{
|
||||||
|
case FLineEdit::textfield:
|
||||||
|
return getColumnWidth (print_text, cursor_pos);
|
||||||
|
|
||||||
|
case FLineEdit::password:
|
||||||
|
return cursor_pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline const FString FLineEdit::getPasswordText() const
|
||||||
|
{
|
||||||
|
return FString(text.getLength(), fc::Bullet); // •
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline bool FLineEdit::isPasswordField() const
|
||||||
|
{
|
||||||
|
return bool( input_type == FLineEdit::password );
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
inline FLineEdit::offsetPair FLineEdit::endPosToOffset (std::size_t pos)
|
inline FLineEdit::offsetPair FLineEdit::endPosToOffset (std::size_t pos)
|
||||||
{
|
{
|
||||||
std::size_t input_width = getWidth() - 2;
|
std::size_t input_width = getWidth() - 2;
|
||||||
std::size_t fullwidth_char_offset{0};
|
std::size_t fullwidth_char_offset{0};
|
||||||
std::size_t len = text.getLength();
|
std::size_t len = print_text.getLength();
|
||||||
|
|
||||||
if ( pos >= len )
|
if ( pos >= len )
|
||||||
pos = len - 1;
|
pos = len - 1;
|
||||||
|
|
||||||
while ( pos > 0 && input_width > 0 )
|
while ( pos > 0 && input_width > 0 )
|
||||||
{
|
{
|
||||||
std::size_t char_width = getColumnWidth(text[pos]);
|
std::size_t char_width = getColumnWidth(print_text[pos]);
|
||||||
|
|
||||||
if ( input_width >= char_width )
|
if ( input_width >= char_width )
|
||||||
input_width -= char_width;
|
input_width -= char_width;
|
||||||
|
@ -825,7 +890,7 @@ inline FLineEdit::offsetPair FLineEdit::endPosToOffset (std::size_t pos)
|
||||||
{
|
{
|
||||||
if ( char_width == 1 )
|
if ( char_width == 1 )
|
||||||
{
|
{
|
||||||
if ( getColumnWidth(text[pos - 1]) == 2 ) // pos is always > 0
|
if ( getColumnWidth(print_text[pos - 1]) == 2 ) // pos is always > 0
|
||||||
{
|
{
|
||||||
fullwidth_char_offset = 1;
|
fullwidth_char_offset = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -850,12 +915,12 @@ std::size_t FLineEdit::clickPosToCursorPos (std::size_t pos)
|
||||||
{
|
{
|
||||||
std::size_t click_width{0};
|
std::size_t click_width{0};
|
||||||
std::size_t idx = text_offset;
|
std::size_t idx = text_offset;
|
||||||
std::size_t len = text.getLength();
|
std::size_t len = print_text.getLength();
|
||||||
pos -= char_width_offset;
|
pos -= char_width_offset;
|
||||||
|
|
||||||
while ( click_width < pos && idx < len )
|
while ( click_width < pos && idx < len )
|
||||||
{
|
{
|
||||||
std::size_t char_width = getColumnWidth(text[idx]);
|
std::size_t char_width = getColumnWidth(print_text[idx]);
|
||||||
idx++;
|
idx++;
|
||||||
click_width += char_width;
|
click_width += char_width;
|
||||||
|
|
||||||
|
@ -870,25 +935,25 @@ std::size_t FLineEdit::clickPosToCursorPos (std::size_t pos)
|
||||||
void FLineEdit::adjustTextOffset()
|
void FLineEdit::adjustTextOffset()
|
||||||
{
|
{
|
||||||
std::size_t input_width = getWidth() - 2;
|
std::size_t input_width = getWidth() - 2;
|
||||||
std::size_t len = text.getLength();
|
std::size_t len = print_text.getLength();
|
||||||
std::size_t len_column = getColumnWidth (text);
|
std::size_t len_column = getColumnWidth (print_text);
|
||||||
std::size_t text_offset_column = getColumnWidth (text, text_offset);
|
std::size_t text_offset_column = getColumnWidth (print_text, text_offset);
|
||||||
std::size_t cursor_pos_column = getColumnWidth (text, cursor_pos);
|
std::size_t cursor_pos_column = getColumnWidth (print_text, cursor_pos);
|
||||||
std::size_t first_char_width{0};
|
std::size_t first_char_width{0};
|
||||||
std::size_t cursor_char_width{1};
|
std::size_t cursor_char_width{1};
|
||||||
char_width_offset = 0;
|
char_width_offset = 0;
|
||||||
|
|
||||||
if ( cursor_pos < len )
|
if ( cursor_pos < len )
|
||||||
cursor_char_width = getColumnWidth(text[cursor_pos]);
|
cursor_char_width = getColumnWidth(print_text[cursor_pos]);
|
||||||
|
|
||||||
if ( len > 0 )
|
if ( len > 0 )
|
||||||
first_char_width = getColumnWidth(text[0]);
|
first_char_width = getColumnWidth(print_text[0]);
|
||||||
|
|
||||||
// Text alignment right for long lines
|
// Text alignment right for long lines
|
||||||
while ( text_offset > 0 && len_column - text_offset_column < input_width )
|
while ( text_offset > 0 && len_column - text_offset_column < input_width )
|
||||||
{
|
{
|
||||||
text_offset--;
|
text_offset--;
|
||||||
text_offset_column = getColumnWidth (text, text_offset);
|
text_offset_column = getColumnWidth (print_text, text_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Right cursor overflow
|
// Right cursor overflow
|
||||||
|
@ -897,7 +962,7 @@ void FLineEdit::adjustTextOffset()
|
||||||
offsetPair offset_pair = endPosToOffset(cursor_pos);
|
offsetPair offset_pair = endPosToOffset(cursor_pos);
|
||||||
text_offset = offset_pair.first;
|
text_offset = offset_pair.first;
|
||||||
char_width_offset = offset_pair.second;
|
char_width_offset = offset_pair.second;
|
||||||
text_offset_column = getColumnWidth (text, text_offset);
|
text_offset_column = getColumnWidth (print_text, text_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Right full-width cursor overflow
|
// Right full-width cursor overflow
|
||||||
|
@ -965,6 +1030,7 @@ inline void FLineEdit::deleteCurrentCharacter()
|
||||||
if ( len > 0 && cursor_pos < len )
|
if ( len > 0 && cursor_pos < len )
|
||||||
{
|
{
|
||||||
text.remove(cursor_pos, 1);
|
text.remove(cursor_pos, 1);
|
||||||
|
print_text = ( isPasswordField() ) ? getPasswordText() : text;
|
||||||
processChanged();
|
processChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1035,6 +1101,7 @@ inline bool FLineEdit::keyInput (FKey key)
|
||||||
text.setString(ch);
|
text.setString(ch);
|
||||||
|
|
||||||
cursor_pos++;
|
cursor_pos++;
|
||||||
|
print_text = ( isPasswordField() ) ? getPasswordText() : text;
|
||||||
adjustTextOffset();
|
adjustTextOffset();
|
||||||
processChanged();
|
processChanged();
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -208,10 +208,10 @@ void FMenuItem::addAccelerator (FKey key, FWidget* obj)
|
||||||
auto root = getRootWidget();
|
auto root = getRootWidget();
|
||||||
FAccelerator accel = { key, obj };
|
FAccelerator accel = { key, obj };
|
||||||
|
|
||||||
if ( root && root->getAcceleratorList() )
|
if ( root )
|
||||||
{
|
{
|
||||||
accel_key = key;
|
accel_key = key;
|
||||||
root->getAcceleratorList()->push_back(accel);
|
root->setAcceleratorList().push_back(accel);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateSuperMenuDimensions();
|
updateSuperMenuDimensions();
|
||||||
|
@ -223,17 +223,16 @@ void FMenuItem::delAccelerator (FWidget* obj)
|
||||||
auto root = getRootWidget();
|
auto root = getRootWidget();
|
||||||
|
|
||||||
if ( root
|
if ( root
|
||||||
&& root->getAcceleratorList()
|
&& ! root->getAcceleratorList().empty() )
|
||||||
&& ! root->getAcceleratorList()->empty() )
|
|
||||||
{
|
{
|
||||||
auto iter = root->getAcceleratorList()->begin();
|
auto iter = root->getAcceleratorList().begin();
|
||||||
|
|
||||||
while ( iter != root->getAcceleratorList()->end() )
|
while ( iter != root->getAcceleratorList().end() )
|
||||||
{
|
{
|
||||||
if ( iter->object == obj )
|
if ( iter->object == obj )
|
||||||
{
|
{
|
||||||
accel_key = 0;
|
accel_key = 0;
|
||||||
iter = root->getAcceleratorList()->erase(iter);
|
iter = root->setAcceleratorList().erase(iter);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
++iter;
|
++iter;
|
||||||
|
|
|
@ -124,11 +124,7 @@ FWidget::~FWidget() // destructor
|
||||||
quit();
|
quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( accelerator_list )
|
accelerator_list.clear();
|
||||||
{
|
|
||||||
delete accelerator_list;
|
|
||||||
accelerator_list = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// finish the program
|
// finish the program
|
||||||
if ( rootObject == this )
|
if ( rootObject == this )
|
||||||
|
@ -929,8 +925,8 @@ void FWidget::addAccelerator (FKey key, FWidget* obj)
|
||||||
if ( ! widget || widget == statusbar || widget == menubar )
|
if ( ! widget || widget == statusbar || widget == menubar )
|
||||||
widget = getRootWidget();
|
widget = getRootWidget();
|
||||||
|
|
||||||
if ( widget && widget->accelerator_list )
|
if ( widget )
|
||||||
widget->accelerator_list->push_back(accel);
|
widget->accelerator_list.push_back(accel);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
@ -944,15 +940,14 @@ void FWidget::delAccelerator (FWidget* obj)
|
||||||
widget = getRootWidget();
|
widget = getRootWidget();
|
||||||
|
|
||||||
if ( widget
|
if ( widget
|
||||||
&& widget->accelerator_list
|
&& ! widget->accelerator_list.empty() )
|
||||||
&& ! widget->accelerator_list->empty() )
|
|
||||||
{
|
{
|
||||||
auto iter = widget->accelerator_list->begin();
|
auto iter = widget->accelerator_list.begin();
|
||||||
|
|
||||||
while ( iter != widget->accelerator_list->end() )
|
while ( iter != widget->accelerator_list.end() )
|
||||||
{
|
{
|
||||||
if ( iter->object == obj )
|
if ( iter->object == obj )
|
||||||
iter = widget->accelerator_list->erase(iter);
|
iter = widget->accelerator_list.erase(iter);
|
||||||
else
|
else
|
||||||
++iter;
|
++iter;
|
||||||
}
|
}
|
||||||
|
@ -1393,23 +1388,6 @@ void FWidget::hideArea (const FSize& size)
|
||||||
flushOutputBuffer();
|
flushOutputBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
void FWidget::createWidgetAcceleratorList()
|
|
||||||
{
|
|
||||||
if ( accelerator_list == 0 )
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
accelerator_list = new FAcceleratorList();
|
|
||||||
}
|
|
||||||
catch (const std::bad_alloc& ex)
|
|
||||||
{
|
|
||||||
std::cerr << bad_alloc_str << ex.what() << std::endl;
|
|
||||||
std::abort();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
bool FWidget::focusNextChild()
|
bool FWidget::focusNextChild()
|
||||||
{
|
{
|
||||||
|
@ -1734,9 +1712,6 @@ void FWidget::init()
|
||||||
foreground_color = wcolors.term_fg;
|
foreground_color = wcolors.term_fg;
|
||||||
background_color = wcolors.term_bg;
|
background_color = wcolors.term_bg;
|
||||||
init_desktop = false;
|
init_desktop = false;
|
||||||
|
|
||||||
// Create the root object accelerator list
|
|
||||||
createWidgetAcceleratorList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
|
@ -70,13 +70,19 @@ class FLabel;
|
||||||
class FLineEdit : public FWidget
|
class FLineEdit : public FWidget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Enumeration
|
// Enumerations
|
||||||
enum label_o
|
enum label_o
|
||||||
{
|
{
|
||||||
label_above = 0,
|
label_above = 0,
|
||||||
label_left = 1
|
label_left = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum inputType
|
||||||
|
{
|
||||||
|
textfield = 0,
|
||||||
|
password = 1
|
||||||
|
};
|
||||||
|
|
||||||
// Using-declaration
|
// Using-declaration
|
||||||
using FWidget::setGeometry;
|
using FWidget::setGeometry;
|
||||||
|
|
||||||
|
@ -121,6 +127,7 @@ class FLineEdit : public FWidget
|
||||||
void setMaxLength (std::size_t);
|
void setMaxLength (std::size_t);
|
||||||
void setCursorPosition (std::size_t);
|
void setCursorPosition (std::size_t);
|
||||||
void setLabelText (const FString&);
|
void setLabelText (const FString&);
|
||||||
|
void setInputType (const inputType);
|
||||||
void setLabelOrientation (const label_o);
|
void setLabelOrientation (const label_o);
|
||||||
void setGeometry ( const FPoint&, const FSize&
|
void setGeometry ( const FPoint&, const FSize&
|
||||||
, bool = true ) override;
|
, bool = true ) override;
|
||||||
|
@ -177,6 +184,11 @@ class FLineEdit : public FWidget
|
||||||
bool hasHotkey();
|
bool hasHotkey();
|
||||||
void draw() override;
|
void draw() override;
|
||||||
void drawInputField();
|
void drawInputField();
|
||||||
|
std::size_t printTextField();
|
||||||
|
std::size_t printPassword();
|
||||||
|
std::size_t getCursorColumnPos();
|
||||||
|
const FString getPasswordText() const;
|
||||||
|
bool isPasswordField() const;
|
||||||
offsetPair endPosToOffset (std::size_t);
|
offsetPair endPosToOffset (std::size_t);
|
||||||
std::size_t clickPosToCursorPos (std::size_t);
|
std::size_t clickPosToCursorPos (std::size_t);
|
||||||
void adjustTextOffset();
|
void adjustTextOffset();
|
||||||
|
@ -195,17 +207,20 @@ class FLineEdit : public FWidget
|
||||||
|
|
||||||
// Data members
|
// Data members
|
||||||
FString text{""};
|
FString text{""};
|
||||||
|
FString print_text{""};
|
||||||
FString label_text{""};
|
FString label_text{""};
|
||||||
FLabel* label{};
|
FLabel* label{};
|
||||||
std::wstring input_filter{};
|
std::wstring input_filter{};
|
||||||
dragScroll drag_scroll{FLineEdit::noScroll};
|
dragScroll drag_scroll{FLineEdit::noScroll};
|
||||||
label_o label_orientation{FLineEdit::label_left};
|
label_o label_orientation{FLineEdit::label_left};
|
||||||
|
inputType input_type{FLineEdit::textfield};
|
||||||
int scroll_repeat{100};
|
int scroll_repeat{100};
|
||||||
bool scroll_timer{false};
|
bool scroll_timer{false};
|
||||||
bool insert_mode{true};
|
bool insert_mode{true};
|
||||||
std::size_t cursor_pos{NOT_SET};
|
std::size_t cursor_pos{NOT_SET};
|
||||||
std::size_t text_offset{0};
|
std::size_t text_offset{0};
|
||||||
std::size_t char_width_offset{0};
|
std::size_t char_width_offset{0};
|
||||||
|
std::size_t x_pos{0};
|
||||||
std::size_t max_length{std::numeric_limits<std::size_t>::max()};
|
std::size_t max_length{std::numeric_limits<std::size_t>::max()};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -239,6 +254,10 @@ inline void FLineEdit::setInputFilter (const FString& regex_string)
|
||||||
inline void FLineEdit::clearInputFilter()
|
inline void FLineEdit::clearInputFilter()
|
||||||
{ input_filter.clear(); }
|
{ input_filter.clear(); }
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline void FLineEdit::setInputType (const inputType type)
|
||||||
|
{ input_type = type; }
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
inline bool FLineEdit::setEnable()
|
inline bool FLineEdit::setEnable()
|
||||||
{ return setEnable(true); }
|
{ return setEnable(true); }
|
||||||
|
|
|
@ -36,9 +36,19 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
#if defined(__x86_64__) || defined(__i386) || defined(__arm__)
|
|
||||||
#include <sys/io.h> // <asm/io.h> is deprecated
|
#if defined(__arm__) && defined(__GLIBC__) && defined(__GLIBC_PREREQ)
|
||||||
#endif // defined(__x86_64__) || defined(__i386) || defined(__arm__)
|
// ISA sysctl support on arm processors only up to glibc-2.29
|
||||||
|
#if !__GLIBC_PREREQ(2,30)
|
||||||
|
#define ARM_ISA_SYSCTL
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(__i386) || defined(ARM_ISA_SYSCTL)
|
||||||
|
#define ISA_SYSCTL_SUPPORT
|
||||||
|
#include <sys/io.h>
|
||||||
|
#endif // defined(__x86_64__) || defined(__i386) || defined(ARM_ISA_SYSCTL)
|
||||||
|
|
||||||
#endif // defined(__linux__)
|
#endif // defined(__linux__)
|
||||||
|
|
||||||
#if defined(__sun) && defined(__SVR4)
|
#if defined(__sun) && defined(__SVR4)
|
||||||
|
@ -88,8 +98,7 @@ class FSystemImpl : public FSystem
|
||||||
virtual ~FSystemImpl();
|
virtual ~FSystemImpl();
|
||||||
|
|
||||||
// Methods
|
// Methods
|
||||||
#if defined(__linux__)
|
#if defined(ISA_SYSCTL_SUPPORT)
|
||||||
#if defined(__x86_64__) || defined(__i386) || defined(__arm__)
|
|
||||||
uChar inPortByte (uShort port) override
|
uChar inPortByte (uShort port) override
|
||||||
{
|
{
|
||||||
return ::inb (port);
|
return ::inb (port);
|
||||||
|
@ -100,16 +109,9 @@ class FSystemImpl : public FSystem
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#else
|
|
||||||
uChar inPortByte (uShort) override
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(ISA_SYSCTL_SUPPORT)
|
||||||
#if defined(__x86_64__) || defined(__i386) || defined(__arm__)
|
|
||||||
void outPortByte (uChar value, uShort port) override
|
void outPortByte (uChar value, uShort port) override
|
||||||
{
|
{
|
||||||
::outb (value, port);
|
::outb (value, port);
|
||||||
|
@ -118,11 +120,6 @@ class FSystemImpl : public FSystem
|
||||||
void outPortByte (uChar, uShort) override
|
void outPortByte (uChar, uShort) override
|
||||||
{ }
|
{ }
|
||||||
#endif
|
#endif
|
||||||
#else
|
|
||||||
void outPortByte (uChar, uShort) override
|
|
||||||
{ }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
int isTTY (int fd) override
|
int isTTY (int fd) override
|
||||||
{
|
{
|
||||||
|
|
|
@ -202,7 +202,8 @@ class FWidget : public FVTerm, public FObject
|
||||||
static FStatusBar* getStatusBar();
|
static FStatusBar* getStatusBar();
|
||||||
virtual FWidget* getFirstFocusableWidget (FObjectList);
|
virtual FWidget* getFirstFocusableWidget (FObjectList);
|
||||||
virtual FWidget* getLastFocusableWidget (FObjectList);
|
virtual FWidget* getLastFocusableWidget (FObjectList);
|
||||||
FAcceleratorList* getAcceleratorList() const;
|
const FAcceleratorList& getAcceleratorList() const;
|
||||||
|
FAcceleratorList& setAcceleratorList();
|
||||||
FString getStatusbarMessage() const;
|
FString getStatusbarMessage() const;
|
||||||
FColor getForegroundColor() const; // get the primary
|
FColor getForegroundColor() const; // get the primary
|
||||||
FColor getBackgroundColor() const; // widget colors
|
FColor getBackgroundColor() const; // widget colors
|
||||||
|
@ -379,7 +380,6 @@ class FWidget : public FVTerm, public FObject
|
||||||
virtual void adjustSize();
|
virtual void adjustSize();
|
||||||
void adjustSizeGlobal();
|
void adjustSizeGlobal();
|
||||||
void hideArea (const FSize&);
|
void hideArea (const FSize&);
|
||||||
void createWidgetAcceleratorList();
|
|
||||||
virtual bool focusNextChild(); // Change child...
|
virtual bool focusNextChild(); // Change child...
|
||||||
virtual bool focusPrevChild(); // ...focus
|
virtual bool focusPrevChild(); // ...focus
|
||||||
|
|
||||||
|
@ -486,7 +486,7 @@ class FWidget : public FVTerm, public FObject
|
||||||
FColor foreground_color{fc::Default};
|
FColor foreground_color{fc::Default};
|
||||||
FColor background_color{fc::Default};
|
FColor background_color{fc::Default};
|
||||||
FString statusbar_message{};
|
FString statusbar_message{};
|
||||||
FAcceleratorList* accelerator_list{nullptr};
|
FAcceleratorList accelerator_list{};
|
||||||
FCallbackObjects callback_objects{};
|
FCallbackObjects callback_objects{};
|
||||||
|
|
||||||
static FStatusBar* statusbar;
|
static FStatusBar* statusbar;
|
||||||
|
@ -583,7 +583,11 @@ inline FStatusBar* FWidget::getStatusBar()
|
||||||
{ return statusbar; }
|
{ return statusbar; }
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
inline FWidget::FAcceleratorList* FWidget::getAcceleratorList() const
|
inline const FWidget::FAcceleratorList& FWidget::getAcceleratorList() const
|
||||||
|
{ return accelerator_list; }
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline FWidget::FAcceleratorList& FWidget::setAcceleratorList()
|
||||||
{ return accelerator_list; }
|
{ return accelerator_list; }
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue