Added FApplication::setDarkTheme() and FApplication::setDefaultTheme()

This commit is contained in:
Markus Gans 2020-05-30 23:02:53 +02:00
parent 6a20b728ba
commit f76a9d2114
42 changed files with 358 additions and 192 deletions

View File

@ -1,3 +1,9 @@
2020-05-30 Markus Gans <guru.mail@muenster.de>
* With the two new methods FApplication::setDarkTheme() and
FApplication::setDefaultTheme() you can now change the theme
within an application. An example can be found in examples/ui
via the menu items "View" -> "Dark mode".
2020-05-29 Markus Gans <guru.mail@muenster.de> 2020-05-29 Markus Gans <guru.mail@muenster.de>
* Adding a dark theme. Can be activated with the --dark-theme parameter. * Adding a dark theme. Can be activated with the --dark-theme parameter.

View File

@ -132,6 +132,40 @@ void move (int xold, int yold, int xnew, int ynew)
<< std::right << std::setw(10) << byte << "\r\n"; << std::right << std::setw(10) << byte << "\r\n";
} }
//----------------------------------------------------------------------
class DirectLogger : public finalcut::FLog
{
public:
void info (const std::string& entry) override
{
output << entry << "\r" << std::endl;
}
void warn (const std::string&) override
{ }
void error (const std::string&) override
{ }
void debug (const std::string&) override
{ }
void setOutputStream (const std::ostream& os) override
{ output.rdbuf(os.rdbuf()); }
void setLineEnding (LineEnding) override
{ }
void enableTimestamp() override
{ }
void disableTimestamp() override
{ }
private:
// Data member
std::ostream output{std::cerr.rdbuf()};
};
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// main part // main part
@ -189,7 +223,11 @@ int main (int argc, char* argv[])
keyPressed(); keyPressed();
// Show terminal speed and milliseconds for all cursor movement sequence // Show terminal speed and milliseconds for all cursor movement sequence
std::cout << "\r" << line; std::cout << "\r" << line << std::flush;
// Generation of a logger in a shared_ptr via a pointer
finalcut::FApplication::setLog(std::make_shared<DirectLogger>());
// Get the shared_ptr with the base class
std::shared_ptr<finalcut::FLog> log = finalcut::FApplication::getLog();
const finalcut::FOptiMove& opti_move = *finalcut::FTerm::getFOptiMove(); const finalcut::FOptiMove& opti_move = *finalcut::FTerm::getFOptiMove();
finalcut::printDurations(opti_move); finalcut::printDurations(opti_move);

View File

@ -301,6 +301,7 @@ class MyDialog final : public finalcut::FDialog
void cb_copyClipboard (const finalcut::FWidget*, const FDataPtr); void cb_copyClipboard (const finalcut::FWidget*, const FDataPtr);
void cb_pasteClipboard (const finalcut::FWidget*, const FDataPtr); void cb_pasteClipboard (const finalcut::FWidget*, const FDataPtr);
void cb_clearInput (const finalcut::FWidget*, const FDataPtr); void cb_clearInput (const finalcut::FWidget*, const FDataPtr);
void cb_switchTheme (const finalcut::FWidget*, const FDataPtr);
void cb_input2buttonText (finalcut::FWidget*, FDataPtr); void cb_input2buttonText (finalcut::FWidget*, FDataPtr);
void cb_setTitlebar (finalcut::FWidget*, const FDataPtr); void cb_setTitlebar (finalcut::FWidget*, const FDataPtr);
void cb_showProgressBar (const finalcut::FWidget*, const FDataPtr); void cb_showProgressBar (const finalcut::FWidget*, const FDataPtr);
@ -339,6 +340,8 @@ class MyDialog final : public finalcut::FDialog
// "View" menu items // "View" menu items
finalcut::FMenuItem Env{"&Terminal...", &View}; finalcut::FMenuItem Env{"&Terminal...", &View};
finalcut::FMenuItem Drive{"&Drive symbols...", &View}; finalcut::FMenuItem Drive{"&Drive symbols...", &View};
finalcut::FMenuItem Line3{&View};
finalcut::FCheckMenuItem Theme{"Dark &mode", &View};
// Statusbar // Statusbar
finalcut::FStatusBar Statusbar{this}; finalcut::FStatusBar Statusbar{this};
finalcut::FStatusKey key_F1{fc::Fkey_f1, "About", &Statusbar}; finalcut::FStatusKey key_F1{fc::Fkey_f1, "About", &Statusbar};
@ -422,6 +425,10 @@ void MyDialog::initMenu()
// "View" menu items // "View" menu items
Env.setStatusbarMessage ("Informations about this terminal"); Env.setStatusbarMessage ("Informations about this terminal");
Drive.setStatusbarMessage ("Show drive symbols"); Drive.setStatusbarMessage ("Show drive symbols");
Line3.setSeparator();
if ( finalcut::FStartOptions::getFStartOptions().dark_theme )
Theme.setChecked();
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -517,6 +524,12 @@ void MyDialog::initViewMenuCallbacks()
"clicked", "clicked",
F_METHOD_CALLBACK (this, &MyDialog::cb_drives) F_METHOD_CALLBACK (this, &MyDialog::cb_drives)
); );
Theme.addCallback
(
"clicked",
F_METHOD_CALLBACK (this, &MyDialog::cb_switchTheme)
);
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -902,6 +915,21 @@ void MyDialog::cb_clearInput (const finalcut::FWidget*, const FDataPtr)
myLineEdit.redraw(); myLineEdit.redraw();
} }
//----------------------------------------------------------------------
void MyDialog::cb_switchTheme (const finalcut::FWidget* widget, const FDataPtr)
{
const auto& check_menu = *(static_cast<const finalcut::FCheckMenuItem*>(widget));
if ( check_menu.isChecked() )
finalcut::FApplication::setDarkTheme();
else
finalcut::FApplication::setDefaultTheme();
auto root_widget = getRootWidget();
root_widget->resetColors();
root_widget->redraw();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void MyDialog::cb_input2buttonText (finalcut::FWidget* widget, FDataPtr data) void MyDialog::cb_input2buttonText (finalcut::FWidget* widget, FDataPtr data)
{ {

View File

@ -282,6 +282,37 @@ FWidget* FApplication::processParameters (const int& argc, char* argv[])
return nullptr; return nullptr;
} }
//----------------------------------------------------------------------
void FApplication::setDefaultTheme()
{
if ( FTerm::getMaxColor() < 16 ) // for 8 color mode
{
if ( getStartOptions().color_change )
FTerm::setColorPaletteTheme<default8ColorPalette>(&FTerm::setPalette);
setColorTheme<default8ColorTheme>();
}
else
{
if ( getStartOptions().color_change )
FTerm::setColorPaletteTheme<default16ColorPalette>(&FTerm::setPalette);
setColorTheme<default16ColorTheme>();
}
}
//----------------------------------------------------------------------
void FApplication::setDarkTheme()
{
if ( getStartOptions().color_change )
FTerm::setColorPaletteTheme<default16DarkColorPalette>(&FTerm::setPalette);
if ( FTerm::getMaxColor() < 16 ) // for 8 color mode
setColorTheme<default8ColorDarkTheme>();
else
setColorTheme<default16ColorDarkTheme>();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FApplication::showParameterUsage() void FApplication::showParameterUsage()
{ {

View File

@ -127,6 +127,20 @@ void FButton::setInactiveBackgroundColor (FColor color)
updateButtonColor(); updateButtonColor();
} }
//----------------------------------------------------------------------
void FButton::resetColors()
{
const auto& wc = getColorTheme();
setForegroundColor (wc->button_active_fg);
setBackgroundColor (wc->button_active_bg);
setHotkeyForegroundColor (wc->button_hotkey_fg);
setFocusForegroundColor (wc->button_active_focus_fg);
setFocusBackgroundColor (wc->button_active_focus_bg);
setInactiveForegroundColor (wc->button_inactive_fg);
setInactiveBackgroundColor (wc->button_inactive_bg);
FWidget::resetColors();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool FButton::setNoUnderline (bool enable) bool FButton::setNoUnderline (bool enable)
{ {

View File

@ -383,7 +383,7 @@ void FButtonGroup::draw()
if ( FTerm::isMonochron() ) if ( FTerm::isMonochron() )
setReverse(true); setReverse(true);
setColor(); useParentWidgetColor();
clearArea(); clearArea();
if ( FTerm::isMonochron() ) if ( FTerm::isMonochron() )
@ -427,9 +427,6 @@ bool FButtonGroup::isRadioButton (const FToggleButton* button) const
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FButtonGroup::init() void FButtonGroup::init()
{ {
const auto& wc = getColorTheme();
setForegroundColor (wc->label_fg);
setBackgroundColor (wc->label_bg);
setMinimumSize (FSize{7, 3}); setMinimumSize (FSize{7, 3});
buttonlist.clear(); // no buttons yet buttonlist.clear(); // no buttons yet
} }

View File

@ -74,7 +74,7 @@ void FCheckBox::draw()
void FCheckBox::drawCheckButton() void FCheckBox::drawCheckButton()
{ {
print() << FPoint{1, 1}; print() << FPoint{1, 1};
setColor(); useParentWidgetColor();
if ( FTerm::isMonochron() ) if ( FTerm::isMonochron() )
{ {

View File

@ -177,7 +177,7 @@ void default16DarkColorPalette::setColorPalette()
setPalette (fc::Blue, 0x41, 0x58, 0xb3); setPalette (fc::Blue, 0x41, 0x58, 0xb3);
setPalette (fc::Green, 0x18, 0x78, 0x18); setPalette (fc::Green, 0x18, 0x78, 0x18);
setPalette (fc::Cyan, 0x4e, 0x66, 0x72); setPalette (fc::Cyan, 0x4e, 0x66, 0x72);
setPalette (fc::Red, 0xba, 0x49, 0x49); setPalette (fc::Red, 0xa5, 0x40, 0x40);
setPalette (fc::Magenta, 0xb2, 0x18, 0xb2); setPalette (fc::Magenta, 0xb2, 0x18, 0xb2);
setPalette (fc::Brown, 0xe8, 0x87, 0x1f); setPalette (fc::Brown, 0xe8, 0x87, 0x1f);
setPalette (fc::LightGray, 0xd2, 0xd2, 0xd2); setPalette (fc::LightGray, 0xd2, 0xd2, 0xd2);

View File

@ -136,6 +136,15 @@ bool FDialog::setBorder (bool enable)
return (setFlags().no_border = ! enable); return (setFlags().no_border = ! enable);
} }
//----------------------------------------------------------------------
void FDialog::resetColors()
{
const auto& wc = getColorTheme();
setForegroundColor (wc->dialog_fg);
setBackgroundColor (wc->dialog_bg);
FWidget::resetColors();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool FDialog::setResizeable (bool enable) bool FDialog::setResizeable (bool enable)
{ {
@ -800,9 +809,7 @@ void FDialog::init()
addDialog(this); addDialog(this);
setActiveWindow(this); setActiveWindow(this);
setTransparentShadow(); setTransparentShadow();
const auto& wc = getColorTheme(); resetColors();
setForegroundColor (wc->dialog_fg);
setBackgroundColor (wc->dialog_bg);
auto old_focus = FWidget::getFocusWidget(); auto old_focus = FWidget::getFocusWidget();
if ( old_focus ) if ( old_focus )

View File

@ -246,20 +246,7 @@ void FLabel::cb_accelWidgetDestroyed (const FWidget*, const FDataPtr)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FLabel::init() void FLabel::init()
{ {
const auto& parent_widget = getParentWidget();
unsetFocusable(); unsetFocusable();
if ( parent_widget )
{
setForegroundColor (parent_widget->getForegroundColor());
setBackgroundColor (parent_widget->getBackgroundColor());
}
else
{
const auto& wc = getColorTheme();
setForegroundColor (wc->dialog_fg);
setBackgroundColor (wc->dialog_bg);
}
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -303,6 +290,8 @@ void FLabel::draw()
if ( text.isEmpty() ) if ( text.isEmpty() )
return; return;
useParentWidgetColor();
if ( FTerm::isMonochron() ) if ( FTerm::isMonochron() )
{ {
setReverse(true); setReverse(true);

View File

@ -99,28 +99,8 @@ const FLineEdit& FLineEdit::operator >> (FString& s)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool FLineEdit::setEnable (bool enable) bool FLineEdit::setEnable (bool enable)
{ {
const auto& wc = getColorTheme();
FWidget::setEnable(enable); FWidget::setEnable(enable);
resetColors();
if ( enable )
{
if ( hasFocus() )
{
setForegroundColor (wc->inputfield_active_focus_fg);
setBackgroundColor (wc->inputfield_active_focus_bg);
}
else
{
setForegroundColor (wc->inputfield_active_fg);
setBackgroundColor (wc->inputfield_active_bg);
}
}
else
{
setForegroundColor (wc->inputfield_inactive_fg);
setBackgroundColor (wc->inputfield_inactive_bg);
}
return enable; return enable;
} }
@ -128,23 +108,7 @@ bool FLineEdit::setEnable (bool enable)
bool FLineEdit::setFocus (bool enable) bool FLineEdit::setFocus (bool enable)
{ {
FWidget::setFocus(enable); FWidget::setFocus(enable);
resetColors();
if ( isEnabled() )
{
const auto& wc = getColorTheme();
if ( enable )
{
setForegroundColor (wc->inputfield_active_focus_fg);
setBackgroundColor (wc->inputfield_active_focus_bg);
}
else
{
setForegroundColor (wc->inputfield_active_fg);
setBackgroundColor (wc->inputfield_active_bg);
}
}
return enable; return enable;
} }
@ -255,6 +219,34 @@ void FLineEdit::setLabelOrientation (const label_o o)
adjustLabel(); adjustLabel();
} }
//----------------------------------------------------------------------
void FLineEdit::resetColors()
{
const auto& wc = getColorTheme();
if ( isEnabled() ) // active
{
if ( hasFocus() )
{
setForegroundColor (wc->inputfield_active_focus_fg);
setBackgroundColor (wc->inputfield_active_focus_bg);
}
else
{
setForegroundColor (wc->inputfield_active_fg);
setBackgroundColor (wc->inputfield_active_bg);
}
}
else // inactive
{
setForegroundColor (wc->inputfield_inactive_fg);
setBackgroundColor (wc->inputfield_inactive_bg);
}
FWidget::resetColors();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FLineEdit::setSize (const FSize& size, bool adjust) void FLineEdit::setSize (const FSize& size, bool adjust)
{ {
@ -655,34 +647,14 @@ void FLineEdit::adjustSize()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FLineEdit::init() void FLineEdit::init()
{ {
const auto& wc = getColorTheme();
label->setAccelWidget(this); label->setAccelWidget(this);
setShadow();
resetColors();
if ( isReadOnly() ) if ( isReadOnly() )
unsetVisibleCursor(); unsetVisibleCursor();
else else
setVisibleCursor(); setVisibleCursor();
setShadow();
if ( isEnabled() )
{
if ( hasFocus() )
{
setForegroundColor (wc->inputfield_active_focus_fg);
setBackgroundColor (wc->inputfield_active_focus_bg);
}
else
{
setForegroundColor (wc->inputfield_active_fg);
setBackgroundColor (wc->inputfield_active_bg);
}
}
else // inactive
{
setForegroundColor (wc->inputfield_inactive_fg);
setBackgroundColor (wc->inputfield_inactive_bg);
}
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------

View File

@ -655,9 +655,6 @@ void FListBox::init()
initScrollbar (vbar, fc::vertical, this, &FListBox::cb_vbarChange); initScrollbar (vbar, fc::vertical, this, &FListBox::cb_vbarChange);
initScrollbar (hbar, fc::horizontal, this, &FListBox::cb_hbarChange); initScrollbar (hbar, fc::horizontal, this, &FListBox::cb_hbarChange);
setGeometry (FPoint{1, 1}, FSize{5, 4}, false); // initialize geometry values setGeometry (FPoint{1, 1}, FSize{5, 4}, false); // initialize geometry values
const auto& wc = getColorTheme();
setForegroundColor (wc->dialog_fg);
setBackgroundColor (wc->dialog_bg);
nf_offset = FTerm::isNewFont() ? 1 : 0; nf_offset = FTerm::isNewFont() ? 1 : 0;
setTopPadding(1); setTopPadding(1);
setLeftPadding(1); setLeftPadding(1);
@ -722,7 +719,8 @@ void FListBox::draw()
if ( current < 1 ) if ( current < 1 )
current = 1; current = 1;
setColor(); useParentWidgetColor();
if ( FTerm::isMonochron() ) if ( FTerm::isMonochron() )
setReverse(true); setReverse(true);

View File

@ -1523,9 +1523,6 @@ void FListView::init()
root = selflist.begin(); root = selflist.begin();
getNullIterator() = selflist.end(); getNullIterator() = selflist.end();
setGeometry (FPoint{1, 1}, FSize{5, 4}, false); // initialize geometry values setGeometry (FPoint{1, 1}, FSize{5, 4}, false); // initialize geometry values
const auto& wc = getColorTheme();
setForegroundColor (wc->dialog_fg);
setBackgroundColor (wc->dialog_bg);
nf_offset = FTerm::isNewFont() ? 1 : 0; nf_offset = FTerm::isNewFont() ? 1 : 0;
setTopPadding(1); setTopPadding(1);
setLeftPadding(1); setLeftPadding(1);
@ -1637,7 +1634,7 @@ void FListView::draw()
if ( current_iter.getPosition() < 1 ) if ( current_iter.getPosition() < 1 )
current_iter = itemlist.begin(); current_iter = itemlist.begin();
setColor(); useParentWidgetColor();
if ( FTerm::isMonochron() ) if ( FTerm::isMonochron() )
setReverse(true); setReverse(true);

View File

@ -83,6 +83,15 @@ void FMenu::setStatusbarMessage (const FString& msg)
menuitem.setStatusbarMessage(msg); menuitem.setStatusbarMessage(msg);
} }
//----------------------------------------------------------------------
void FMenu::resetColors()
{
const auto& wc = getColorTheme();
setForegroundColor (wc->menu_active_fg);
setBackgroundColor (wc->menu_active_bg);
FWidget::resetColors();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FMenu::show() void FMenu::show()
{ {
@ -458,10 +467,7 @@ void FMenu::init(FWidget* parent)
setTransparentShadow(); setTransparentShadow();
setMenuWidget(); setMenuWidget();
hide(); hide();
resetColors();
const auto& wc = getColorTheme();
setForegroundColor (wc->menu_active_fg);
setBackgroundColor (wc->menu_active_bg);
menuitem.setMenu(this); menuitem.setMenu(this);
if ( parent ) if ( parent )

View File

@ -55,6 +55,15 @@ FMenuBar::~FMenuBar() // destructor
// public methods of FMenuBar // public methods of FMenuBar
//----------------------------------------------------------------------
void FMenuBar::resetColors()
{
const auto& wc = getColorTheme();
setForegroundColor (wc->menu_active_fg);
setBackgroundColor (wc->menu_active_bg);
FWidget::resetColors();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FMenuBar::resetMenu() void FMenuBar::resetMenu()
{ {
@ -249,9 +258,7 @@ void FMenuBar::init()
addAccelerator (fc::Fkey_f10); addAccelerator (fc::Fkey_f10);
addAccelerator (fc::Fckey_space); addAccelerator (fc::Fckey_space);
const auto& wc = getColorTheme(); resetColors();
setForegroundColor (wc->menu_active_fg);
setBackgroundColor (wc->menu_active_bg);
unsetFocusable(); unsetFocusable();
} }

View File

@ -22,7 +22,9 @@
#include <cstring> #include <cstring>
#include "final/fapplication.h"
#include "final/fc.h" #include "final/fc.h"
#include "final/flog.h"
#include "final/foptimove.h" #include "final/foptimove.h"
#include "final/ftermcap.h" #include "final/ftermcap.h"
@ -1105,42 +1107,43 @@ void FOptiMove::moveByMethod ( int method
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void printDurations (const FOptiMove& om) void printDurations (const FOptiMove& om)
{ {
std::cout << " speed: " finalcut::FLog& log = *FApplication::getLog();
<< om.baudrate << " baud\r\n"; log << " speed: "
std::cout << " char_duration: " << om.baudrate << " baud" << std::flush;
<< om.char_duration << " ms\r\n"; log << " char_duration: "
std::cout << " cursor_home: " << om.char_duration << " ms" << std::flush;
<< om.F_cursor_home.duration << " ms\r\n"; log << " cursor_home: "
std::cout << " cursor_to_ll: " << om.F_cursor_home.duration << " ms" << std::flush;
<< om.F_cursor_to_ll.duration << " ms\r\n"; log << " cursor_to_ll: "
std::cout << " carriage_return: " << om.F_cursor_to_ll.duration << " ms" << std::flush;
<< om.F_carriage_return.duration << " ms\r\n"; log << " carriage_return: "
std::cout << " tab: " << om.F_carriage_return.duration << " ms" << std::flush;
<< om.F_tab.duration << " ms\r\n"; log << " tab: "
std::cout << " back_tab: " << om.F_tab.duration << " ms" << std::flush;
<< om.F_back_tab.duration << " ms\r\n"; log << " back_tab: "
std::cout << " cursor_up: " << om.F_back_tab.duration << " ms" << std::flush;
<< om.F_cursor_up.duration << " ms\r\n"; log << " cursor_up: "
std::cout << " cursor_down: " << om.F_cursor_up.duration << " ms" << std::flush;
<< om.F_cursor_down.duration << " ms\r\n"; log << " cursor_down: "
std::cout << " cursor_left: " << om.F_cursor_down.duration << " ms" << std::flush;
<< om.F_cursor_left.duration << " ms\r\n"; log << " cursor_left: "
std::cout << " cursor_right: " << om.F_cursor_left.duration << " ms" << std::flush;
<< om.F_cursor_right.duration << " ms\r\n"; log << " cursor_right: "
std::cout << " cursor_address: " << om.F_cursor_right.duration << " ms" << std::flush;
<< om.F_cursor_address.duration << " ms\r\n"; log << " cursor_address: "
std::cout << " column_address: " << om.F_cursor_address.duration << " ms" << std::flush;
<< om.F_column_address.duration << " ms\r\n"; log << " column_address: "
std::cout << " row_address: " << om.F_column_address.duration << " ms" << std::flush;
<< om.F_row_address.duration << " ms\r\n"; log << " row_address: "
std::cout << " parm_up_cursor: " << om.F_row_address.duration << " ms" << std::flush;
<< om.F_parm_up_cursor.duration << " ms\r\n"; log << " parm_up_cursor: "
std::cout << " parm_down_cursor: " << om.F_parm_up_cursor.duration << " ms" << std::flush;
<< om.F_parm_down_cursor.duration << " ms\r\n"; log << " parm_down_cursor: "
std::cout << " parm_left_cursor: " << om.F_parm_down_cursor.duration << " ms" << std::flush;
<< om.F_parm_left_cursor.duration << " ms\r\n"; log << " parm_left_cursor: "
std::cout << "parm_right_cursor: " << om.F_parm_left_cursor.duration << " ms" << std::flush;
<< om.F_parm_right_cursor.duration << " ms\r\n"; log << "parm_right_cursor: "
<< om.F_parm_right_cursor.duration << " ms" << std::flush;
} }
} // namespace finalcut } // namespace finalcut

View File

@ -148,20 +148,10 @@ void FProgressbar::draw()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FProgressbar::drawProgressLabel() void FProgressbar::drawProgressLabel()
{ {
const auto& parent_widget = getParentWidget();
if ( parent_widget )
setColor ( parent_widget->getForegroundColor()
, parent_widget->getBackgroundColor() );
else
{
const auto& wc = getColorTheme();
setColor (wc->dialog_fg, wc->dialog_bg);
}
if ( FTerm::isMonochron() ) if ( FTerm::isMonochron() )
setReverse(true); setReverse(true);
useParentWidgetColor();
print() << FPoint{int(getWidth()) - 3, 0}; print() << FPoint{int(getWidth()) - 3, 0};
if ( percentage > 100 ) if ( percentage > 100 )

View File

@ -74,7 +74,7 @@ void FRadioButton::draw()
void FRadioButton::drawRadioButton() void FRadioButton::drawRadioButton()
{ {
print() << FPoint{1, 1}; print() << FPoint{1, 1};
setColor(); useParentWidgetColor();
if ( FTerm::isMonochron() ) if ( FTerm::isMonochron() )
{ {

View File

@ -512,7 +512,7 @@ inline void FScrollbar::drawVerticalBackgroundLine()
if ( FTerm::isMonochron() || max_color < 16 ) if ( FTerm::isMonochron() || max_color < 16 )
print (fc::MediumShade); // ▒ print (fc::MediumShade); // ▒
else if ( FTerm::isNewFont() ) else if ( FTerm::isNewFont() )
print (fc::NF_rev_border_line_right); // print (fc::NF_rev_border_line_right); //
else else
print (' '); print (' ');
} }

View File

@ -293,6 +293,15 @@ bool FScrollView::setViewportPrint (bool enable)
return (use_own_print_area = ! enable); return (use_own_print_area = ! enable);
} }
//----------------------------------------------------------------------
void FScrollView::resetColors()
{
const auto& wc = getColorTheme();
setForegroundColor (wc->dialog_fg);
setBackgroundColor (wc->dialog_bg);
FWidget::resetColors();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool FScrollView::setBorder (bool enable) bool FScrollView::setBorder (bool enable)
{ {
@ -712,9 +721,7 @@ void FScrollView::init (const FWidget* parent)
initScrollbar (vbar, fc::vertical, &FScrollView::cb_vbarChange); initScrollbar (vbar, fc::vertical, &FScrollView::cb_vbarChange);
initScrollbar (hbar, fc::horizontal, &FScrollView::cb_hbarChange); initScrollbar (hbar, fc::horizontal, &FScrollView::cb_hbarChange);
mapKeyFunctions(); mapKeyFunctions();
const auto& wc = getColorTheme(); resetColors();
setForegroundColor (wc->dialog_fg);
setBackgroundColor (wc->dialog_bg);
setGeometry (FPoint{1, 1}, FSize{4, 4}); setGeometry (FPoint{1, 1}, FSize{4, 4});
setMinimumSize (FSize{4, 4}); setMinimumSize (FSize{4, 4});
const int xoffset_end = int(getScrollWidth() - getViewportWidth()); const int xoffset_end = int(getScrollWidth() - getViewportWidth());

View File

@ -158,6 +158,15 @@ void FStatusBar::setMessage (const FString& mgs)
text.setString(mgs); text.setString(mgs);
} }
//----------------------------------------------------------------------
void FStatusBar::resetColors()
{
const auto& wc = getColorTheme();
setForegroundColor (wc->statusbar_fg);
setBackgroundColor (wc->statusbar_bg);
FWidget::resetColors();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool FStatusBar::hasActivatedKey() const bool FStatusBar::hasActivatedKey() const
{ {
@ -513,9 +522,7 @@ void FStatusBar::init()
if ( getRootWidget() ) if ( getRootWidget() )
getRootWidget()->setBottomPadding(1, true); getRootWidget()->setBottomPadding(1, true);
const auto& wc = getColorTheme(); resetColors();
setForegroundColor (wc->statusbar_fg);
setBackgroundColor (wc->statusbar_bg);
unsetFocusable(); unsetFocusable();
} }

View File

@ -57,7 +57,7 @@ FStringStream::~FStringStream() // destructor
// public methods of FStringStream // public methods of FStringStream
//---------------------------------------------------------------------- //----------------------------------------------------------------------
FStringStream& FStringStream::operator = (FStringStream&& sstream) FStringStream& FStringStream::operator = (FStringStream&& sstream) noexcept
{ {
std::wiostream::operator = (std::move(sstream)); std::wiostream::operator = (std::move(sstream));
buffer = std::move(sstream.buffer); buffer = std::move(sstream.buffer);

View File

@ -1882,13 +1882,13 @@ void FTerm::redefineColorPalette()
{ {
// Redefine the color palette // Redefine the color palette
if ( ! canChangeColorPalette() ) if ( ! (canChangeColorPalette() && getStartOptions().color_change) )
return; return;
resetColorMap(); resetColorMap();
saveColorMap(); saveColorMap();
if ( FStartOptions::getFStartOptions().dark_theme ) if ( getStartOptions().dark_theme )
{ {
setColorPaletteTheme<default16DarkColorPalette>(&FTerm::setPalette); setColorPaletteTheme<default16DarkColorPalette>(&FTerm::setPalette);
} }
@ -1899,14 +1899,12 @@ void FTerm::redefineColorPalette()
else // 8 colors else // 8 colors
setColorPaletteTheme<default8ColorPalette>(&FTerm::setPalette); setColorPaletteTheme<default8ColorPalette>(&FTerm::setPalette);
} }
getColorPaletteTheme()->setColorPalette();
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FTerm::restoreColorPalette() void FTerm::restoreColorPalette()
{ {
if ( ! canChangeColorPalette() ) if ( ! (canChangeColorPalette() && getStartOptions().color_change) )
return; return;
// Reset screen settings // Reset screen settings
@ -2283,8 +2281,7 @@ void FTerm::init (bool disable_alt_screen)
initTermspecifics(); initTermspecifics();
// Redefine the color palette // Redefine the color palette
if ( getStartOptions().color_change ) redefineColorPalette();
redefineColorPalette();
// Set 220 Hz beep (100 ms) // Set 220 Hz beep (100 ms)
setBeep(220, 100); setBeep(220, 100);
@ -2447,8 +2444,7 @@ void FTerm::finish()
getFTermXTerminal()->setCursorStyle (fc::steady_block); getFTermXTerminal()->setCursorStyle (fc::steady_block);
// Restore the color palette // Restore the color palette
if ( getStartOptions().color_change ) restoreColorPalette();
restoreColorPalette();
// Switch to normal escape key mode // Switch to normal escape key mode
disableApplicationEscKey(); disableApplicationEscKey();

View File

@ -104,6 +104,15 @@ void FTextView::setGeometry ( const FPoint& pos, const FSize& size
changeOnResize(); changeOnResize();
} }
//----------------------------------------------------------------------
void FTextView::resetColors()
{
const auto& wc = getColorTheme();
setForegroundColor (wc->dialog_fg);
setBackgroundColor (wc->dialog_bg);
FWidget::resetColors();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FTextView::setText (const FString& str) void FTextView::setText (const FString& str)
{ {
@ -569,9 +578,7 @@ void FTextView::init()
{ {
initScrollbar (vbar, fc::vertical, this, &FTextView::cb_vbarChange); initScrollbar (vbar, fc::vertical, this, &FTextView::cb_vbarChange);
initScrollbar (hbar, fc::horizontal, this, &FTextView::cb_hbarChange); initScrollbar (hbar, fc::horizontal, this, &FTextView::cb_hbarChange);
const auto& wc = getColorTheme(); resetColors();
setForegroundColor (wc->dialog_fg);
setBackgroundColor (wc->dialog_bg);
nf_offset = FTerm::isNewFont() ? 1 : 0; nf_offset = FTerm::isNewFont() ? 1 : 0;
setTopPadding(1); setTopPadding(1);
setLeftPadding(1); setLeftPadding(1);

View File

@ -111,6 +111,33 @@ void FToggleButton::setGeometry ( const FPoint& pos, const FSize& s
FWidget::setGeometry (pos, size, adjust); FWidget::setGeometry (pos, size, adjust);
} }
//----------------------------------------------------------------------
void FToggleButton::resetColors()
{
const auto& wc = getColorTheme();
if ( isEnabled() ) // active
{
if ( hasFocus() )
{
setForegroundColor (wc->toggle_button_active_focus_fg);
setBackgroundColor (wc->toggle_button_active_focus_bg);
}
else
{
setForegroundColor (wc->toggle_button_active_fg);
setBackgroundColor (wc->toggle_button_active_bg);
}
}
else // inactive
{
setForegroundColor (wc->label_inactive_fg);
setBackgroundColor (wc->label_inactive_bg);
}
FWidget::resetColors();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool FToggleButton::setNoUnderline (bool enable) bool FToggleButton::setNoUnderline (bool enable)
{ {
@ -497,26 +524,7 @@ void FToggleButton::setGroup (FButtonGroup* btngroup)
void FToggleButton::init() void FToggleButton::init()
{ {
setGeometry (FPoint{1, 1}, FSize{4, 1}, false); // initialize geometry values setGeometry (FPoint{1, 1}, FSize{4, 1}, false); // initialize geometry values
const auto& wc = getColorTheme(); resetColors();
if ( isEnabled() )
{
if ( hasFocus() )
{
setForegroundColor (wc->toggle_button_active_focus_fg);
setBackgroundColor (wc->toggle_button_active_focus_bg);
}
else
{
setForegroundColor (wc->toggle_button_active_fg);
setBackgroundColor (wc->toggle_button_active_bg);
}
}
else // inactive
{
setForegroundColor (wc->label_inactive_fg);
setBackgroundColor (wc->label_inactive_bg);
}
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------

View File

@ -73,6 +73,15 @@ void FToolTip::setText (const FString& txt)
calculateDimensions(); calculateDimensions();
} }
//----------------------------------------------------------------------
void FToolTip::resetColors()
{
const auto& wc = getColorTheme();
setForegroundColor (wc->tooltip_fg);
setBackgroundColor (wc->tooltip_bg);
FWidget::resetColors();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool FToolTip::setBorder (bool enable) bool FToolTip::setBorder (bool enable)
{ {
@ -107,9 +116,7 @@ void FToolTip::init()
// initialize geometry values // initialize geometry values
setGeometry (FPoint{1, 1}, FSize{3, 3}, false); setGeometry (FPoint{1, 1}, FSize{3, 3}, false);
setMinimumSize (FSize{3, 3}); setMinimumSize (FSize{3, 3});
const auto& wc = getColorTheme(); resetColors();
setForegroundColor (wc->tooltip_fg);
setBackgroundColor (wc->tooltip_bg);
calculateDimensions(); calculateDimensions();
} }

View File

@ -305,6 +305,42 @@ bool FWidget::setFocus (bool enable)
return (flags.focus = enable); return (flags.focus = enable);
} }
//----------------------------------------------------------------------
void FWidget::resetColors()
{
if ( ! hasChildren() )
return;
for (auto&& child : getChildren())
{
if ( child->isWidget() )
{
auto widget = static_cast<FWidget*>(child);
widget->resetColors();
}
}
}
//----------------------------------------------------------------------
void FWidget::useParentWidgetColor()
{
const auto& parent_widget = getParentWidget();
if ( parent_widget )
{
setForegroundColor (parent_widget->getForegroundColor());
setBackgroundColor (parent_widget->getBackgroundColor());
}
else // Fallback
{
const auto& wc = getColorTheme();
setForegroundColor (wc->dialog_fg);
setBackgroundColor (wc->dialog_bg);
}
setColor();
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FWidget::setColor() void FWidget::setColor()
{ {

View File

@ -442,9 +442,9 @@ void default16ColorDarkTheme::setColorTheme()
titlebar_active_fg = fc::White; titlebar_active_fg = fc::White;
titlebar_active_bg = fc::DarkGray; titlebar_active_bg = fc::DarkGray;
titlebar_inactive_fg = fc::DarkGray; titlebar_inactive_fg = fc::DarkGray;
titlebar_inactive_bg = fc::LightGray; titlebar_inactive_bg = fc::LightBlue;
titlebar_button_fg = fc::DarkGray; titlebar_button_fg = fc::DarkGray;
titlebar_button_bg = fc::LightGray; titlebar_button_bg = fc::LightBlue;
titlebar_button_focus_fg = fc::LightGray; titlebar_button_focus_fg = fc::LightGray;
titlebar_button_focus_bg = fc::Black; titlebar_button_focus_bg = fc::Black;
menu_active_focus_fg = fc::White; menu_active_focus_fg = fc::White;

View File

@ -131,6 +131,8 @@ class FApplication : public FWidget
bool removeQueuedEvent (const FObject*); bool removeQueuedEvent (const FObject*);
virtual void processExternalUserEvent(); virtual void processExternalUserEvent();
static FWidget* processParameters (const int&, char*[]); static FWidget* processParameters (const int&, char*[]);
static void setDefaultTheme();
static void setDarkTheme();
static void showParameterUsage () static void showParameterUsage ()
#if defined(__clang__) || defined(__GNUC__) #if defined(__clang__) || defined(__GNUC__)
__attribute__((noreturn)) __attribute__((noreturn))

View File

@ -88,6 +88,7 @@ class FButton : public FWidget
void setFocusBackgroundColor (FColor); void setFocusBackgroundColor (FColor);
void setInactiveForegroundColor (FColor); void setInactiveForegroundColor (FColor);
void setInactiveBackgroundColor (FColor); void setInactiveBackgroundColor (FColor);
void resetColors();
bool setNoUnderline(bool); bool setNoUnderline(bool);
bool setNoUnderline(); bool setNoUnderline();
bool unsetNoUnderline(); bool unsetNoUnderline();

View File

@ -108,6 +108,7 @@ class FDialog : public FWindow
bool setBorder (bool); bool setBorder (bool);
bool setBorder(); bool setBorder();
bool unsetBorder(); bool unsetBorder();
void resetColors();
virtual void setText (const FString&); virtual void setText (const FString&);
// Inquiries // Inquiries

View File

@ -120,6 +120,7 @@ class FLineEdit : public FWidget
void setInputType (const inputType); void setInputType (const inputType);
void setLabelOrientation (const label_o); void setLabelOrientation (const label_o);
void setLabelAssociatedWidget (FWidget*); void setLabelAssociatedWidget (FWidget*);
void resetColors();
void setSize (const FSize&, bool = true) override; void setSize (const FSize&, bool = true) override;
void setGeometry ( const FPoint&, const FSize& void setGeometry ( const FPoint&, const FSize&
, bool = true ) override; , bool = true ) override;

View File

@ -106,6 +106,7 @@ class FMenu : public FWindow, public FMenuList
void setStatusbarMessage (const FString&) override; void setStatusbarMessage (const FString&) override;
void setMenu (FMenu*); void setMenu (FMenu*);
void setText (const FString&); void setText (const FString&);
void resetColors();
// Inquiries // Inquiries
bool isSelected() const; bool isSelected() const;

View File

@ -86,6 +86,7 @@ class FMenuBar : public FWindow, public FMenuList
const FString getClassName() const override; const FString getClassName() const override;
// Methods // Methods
void resetColors();
void resetMenu(); void resetMenu();
void hide() override; void hide() override;
void adjustSize() override; void adjustSize() override;

View File

@ -108,6 +108,7 @@ class FScrollView : public FWidget
bool setViewportPrint (bool); bool setViewportPrint (bool);
bool setViewportPrint(); bool setViewportPrint();
bool unsetViewportPrint(); bool unsetViewportPrint();
void resetColors();
bool setBorder (bool); bool setBorder (bool);
bool setBorder(); bool setBorder();
bool unsetBorder(); bool unsetBorder();

View File

@ -205,6 +205,7 @@ class FStatusBar : public FWindow
void activateKey (int); void activateKey (int);
void deactivateKey (int); void deactivateKey (int);
void setMessage (const FString&); void setMessage (const FString&);
void resetColors();
// Inquiries // Inquiries
bool isActivated (int) const; bool isActivated (int) const;

View File

@ -78,7 +78,7 @@ class FStringStream : public std::wiostream
FStringStream& operator = (const FStringStream&) = delete; FStringStream& operator = (const FStringStream&) = delete;
// Move assignment operator (=) // Move assignment operator (=)
FStringStream& operator = (FStringStream&& sstream); FStringStream& operator = (FStringStream&& sstream) noexcept;
virtual const FString getClassName() const; virtual const FString getClassName() const;
void swap (FStringStream&) noexcept; void swap (FStringStream&) noexcept;

View File

@ -444,6 +444,7 @@ template<typename ClassT>
inline void FTerm::setColorPaletteTheme (const FSetPalette& f) inline void FTerm::setColorPaletteTheme (const FSetPalette& f)
{ {
getColorPaletteTheme() = std::make_shared<ClassT>(f); getColorPaletteTheme() = std::make_shared<ClassT>(f);
getColorPaletteTheme()->setColorPalette();
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------

View File

@ -100,6 +100,7 @@ class FTextView : public FWidget
void setSize (const FSize&, bool = true) override; void setSize (const FSize&, bool = true) override;
void setGeometry ( const FPoint&, const FSize& void setGeometry ( const FPoint&, const FSize&
, bool = true ) override; , bool = true ) override;
void resetColors();
void setText (const FString&); void setText (const FString&);
void scrollToX (int); void scrollToX (int);
void scrollToY (int); void scrollToY (int);

View File

@ -86,6 +86,7 @@ class FToggleButton : public FWidget
void setSize (const FSize&, bool = true) override; void setSize (const FSize&, bool = true) override;
void setGeometry ( const FPoint&, const FSize& void setGeometry ( const FPoint&, const FSize&
, bool = true ) override; , bool = true ) override;
void resetColors();
bool setNoUnderline (bool); bool setNoUnderline (bool);
bool setNoUnderline(); bool setNoUnderline();
bool unsetNoUnderline(); bool unsetNoUnderline();

View File

@ -85,6 +85,7 @@ class FToolTip : public FWindow
// Mutators // Mutators
void setText (const FString&); void setText (const FString&);
void resetColors();
bool setBorder (bool); bool setBorder (bool);
bool setBorder(); bool setBorder();
bool unsetBorder(); bool unsetBorder();

View File

@ -266,6 +266,8 @@ class FWidget : public FVTerm, public FObject
bool acceptPadding(); bool acceptPadding();
virtual void setForegroundColor (FColor); virtual void setForegroundColor (FColor);
virtual void setBackgroundColor (FColor); virtual void setBackgroundColor (FColor);
virtual void resetColors();
void useParentWidgetColor();
void setColor(); void setColor();
FWidgetFlags& setFlags(); FWidgetFlags& setFlags();
// Positioning and sizes mutators... // Positioning and sizes mutators...