From a33a9e1b6bd13d3df63a37fe157e4d94d26dae0f Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Sun, 16 Feb 2020 00:01:36 +0100 Subject: [PATCH] Printing FStyle object to change attributes --- ChangeLog | 3 + examples/transparent.cpp | 28 +++--- src/Makefile.am | 1 + src/Makefile.clang | 1 + src/Makefile.gcc | 1 + src/foptiattr.cpp | 8 +- src/ftermbuffer.cpp | 38 ++++++++ src/ftermdebugdata.cpp | 6 +- src/fvterm.cpp | 52 +++++++++-- src/fwidget_functions.cpp | 56 ++++++------ src/include/final/fc.h | 22 ++++- src/include/final/fcolorpair.h | 6 +- src/include/final/final.h | 3 +- src/include/final/fstyle.h | 93 +++++++++++++++++++ src/include/final/ftermbuffer.h | 12 ++- src/include/final/ftypes.h | 47 +++++----- src/include/final/fvterm.h | 14 ++- test/Makefile.am | 3 + test/fcolorpair-test.cpp | 2 +- test/fstyle-test.cpp | 156 ++++++++++++++++++++++++++++++++ 20 files changed, 463 insertions(+), 89 deletions(-) create mode 100644 src/include/final/fstyle.h create mode 100644 test/fstyle-test.cpp diff --git a/ChangeLog b/ChangeLog index 7af709df..361530a1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2020-02-16 Markus Gans + * Printing a FStyle object allows you to change video attributes + 2020-02-13 Markus Gans * Rename setTransShadow() to setColorOverlay() diff --git a/examples/transparent.cpp b/examples/transparent.cpp index fba62c39..81fc9ecf 100644 --- a/examples/transparent.cpp +++ b/examples/transparent.cpp @@ -23,8 +23,10 @@ #include namespace fc = finalcut::fc; +using finalcut::FColorPair; using finalcut::FPoint; using finalcut::FSize; +using finalcut::FStyle; //---------------------------------------------------------------------- @@ -90,37 +92,31 @@ void Transparent::draw() if ( type == shadow ) { const auto& wc = getFWidgetColors(); - setColor(wc.shadow_bg, wc.shadow_fg); - setColorOverlay(); + print() << FColorPair (wc.shadow_bg, wc.shadow_fg) + << FStyle (fc::ColorOverlay); } else if ( type == inherit_background ) { if ( getMaxColor() > 8 ) - setColor(fc::Blue, fc::Black); + print() << FColorPair (fc::Blue, fc::Black); else - setColor(fc::Green, fc::Black); + print() << FColorPair (fc::Green, fc::Black); - setInheritBackground(); + print() << FStyle (fc::InheritBackground); } else - setTransparent(); + print() << FStyle (fc::Transparent); const finalcut::FString line(getClientWidth(), '.'); + // Fill window area for (int n{1}; n <= int(getClientHeight()); n++) { - print() << FPoint(2, 2 + n) << line; + print() << FPoint(2, 2 + n) + << line; } - if ( type == shadow ) - unsetColorOverlay(); - else if ( type == inherit_background ) - unsetInheritBackground(); - else - unsetTransparent(); - - if ( isMonochron() ) - setReverse(false); + print() << FStyle (fc::Reset); } //---------------------------------------------------------------------- diff --git a/src/Makefile.am b/src/Makefile.am index d9cdb25f..776d66ab 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -83,6 +83,7 @@ finalcutinclude_HEADERS = \ include/final/fbuttongroup.h \ include/final/fcheckbox.h \ include/final/fcolorpair.h \ + include/final/fstyle.h \ include/final/fconfig.h \ include/final/fswitch.h \ include/final/fdialog.h \ diff --git a/src/Makefile.clang b/src/Makefile.clang index c2696ce2..1341c7ca 100644 --- a/src/Makefile.clang +++ b/src/Makefile.clang @@ -13,6 +13,7 @@ INCLUDE_HEADERS = \ fbuttongroup.h \ fbutton.h \ fcolorpair.h \ + fstyle.h \ ftogglebutton.h \ fcheckbox.h \ fswitch.h \ diff --git a/src/Makefile.gcc b/src/Makefile.gcc index 4a1578b3..4800f483 100644 --- a/src/Makefile.gcc +++ b/src/Makefile.gcc @@ -13,6 +13,7 @@ INCLUDE_HEADERS = \ fbuttongroup.h \ fbutton.h \ fcolorpair.h \ + fstyle.h \ ftogglebutton.h \ fcheckbox.h \ fswitch.h \ diff --git a/src/foptiattr.cpp b/src/foptiattr.cpp index 4e3f3811..1ce4f2fe 100644 --- a/src/foptiattr.cpp +++ b/src/foptiattr.cpp @@ -38,11 +38,11 @@ namespace finalcut FOptiAttr::FOptiAttr() { // Set bits that must not be reset - reset_byte_mask.attr.bit.transparent = true; + reset_byte_mask.attr.bit.transparent = true; reset_byte_mask.attr.bit.color_overlay = true; - reset_byte_mask.attr.bit.inherit_bg = true; - reset_byte_mask.attr.bit.no_changes = true; - reset_byte_mask.attr.bit.printed = true; + reset_byte_mask.attr.bit.inherit_background = true; + reset_byte_mask.attr.bit.no_changes = true; + reset_byte_mask.attr.bit.printed = true; } //---------------------------------------------------------------------- diff --git a/src/ftermbuffer.cpp b/src/ftermbuffer.cpp index 79fd3325..c6a57255 100644 --- a/src/ftermbuffer.cpp +++ b/src/ftermbuffer.cpp @@ -26,6 +26,7 @@ #include "final/fc.h" #include "final/fcolorpair.h" #include "final/fstring.h" +#include "final/fstyle.h" #include "final/ftermbuffer.h" #include "final/fvterm.h" #include "final/ftypes.h" @@ -85,6 +86,43 @@ int FTermBuffer::write (wchar_t ch) return 1; } +//---------------------------------------------------------------------- +void FTermBuffer::write (const FStyle& style) +{ + FAttribute attr = style.getStyle(); + + if ( attr == 0 ) + FVTerm::setNormal(); + else if ( (attr & fc::Bold) != 0 ) + FVTerm::setBold(); + else if ( (attr & fc::Dim) != 0 ) + FVTerm::setDim(); + else if ( (attr & fc::Italic) != 0 ) + FVTerm::setItalic(); + else if ( (attr & fc::Underline) != 0 ) + FVTerm::setUnderline(); + else if ( (attr & fc::Blink) != 0 ) + FVTerm::setBlink(); + else if ( (attr & fc::Reverse) != 0 ) + FVTerm::setReverse(); + else if ( (attr & fc::Standout) != 0 ) + FVTerm::setStandout(); + else if ( (attr & fc::Invisible) != 0 ) + FVTerm::setInvisible(); + else if ( (attr & fc::Protected) != 0 ) + FVTerm::setProtected(); + else if ( (attr & fc::CrossedOut) != 0 ) + FVTerm::setCrossedOut(); + else if ( (attr & fc::DoubleUnderline) != 0 ) + FVTerm::setDoubleUnderline(); + else if ( (attr & fc::Transparent) != 0 ) + FVTerm::setTransparent(); + else if ( (attr & fc::ColorOverlay) != 0 ) + FVTerm::setColorOverlay(); + else if ( (attr & fc::InheritBackground) != 0 ) + FVTerm::setInheritBackground(); +} + //---------------------------------------------------------------------- void FTermBuffer::write (const FColorPair& pair) { diff --git a/src/ftermdebugdata.cpp b/src/ftermdebugdata.cpp index 0ae1fd6e..5260a594 100644 --- a/src/ftermdebugdata.cpp +++ b/src/ftermdebugdata.cpp @@ -3,7 +3,7 @@ * * * This file is part of the Final Cut widget toolkit * * * -* Copyright 2019 Markus Gans * +* Copyright 2019-2020 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * @@ -35,10 +35,10 @@ FTermData* FTermDebugData::data {nullptr}; FTermDetection* FTermDebugData::term_detection {nullptr}; //---------------------------------------------------------------------- -// class FClassName +// class FTermDebugData //---------------------------------------------------------------------- -// public methods of FClassName +// public methods of FTermDebugData //---------------------------------------------------------------------- void FTermDebugData::init() { diff --git a/src/fvterm.cpp b/src/fvterm.cpp index f3567fc3..abd0f743 100644 --- a/src/fvterm.cpp +++ b/src/fvterm.cpp @@ -31,6 +31,7 @@ #include "final/fkeyboard.h" #include "final/foptiattr.h" #include "final/foptimove.h" +#include "final/fstyle.h" #include "final/fsystem.h" #include "final/fterm.h" #include "final/ftermdata.h" @@ -530,7 +531,7 @@ int FVTerm::print (FTermArea* area, FChar& term_char) { if ( ( ! ac->attr.bit.transparent && nc.attr.bit.transparent ) || ( ! ac->attr.bit.color_overlay && nc.attr.bit.color_overlay ) - || ( ! ac->attr.bit.inherit_bg && nc.attr.bit.inherit_bg ) ) + || ( ! ac->attr.bit.inherit_background && nc.attr.bit.inherit_background ) ) { // add one transparent character form line area->changes[ay].trans_count++; @@ -538,7 +539,7 @@ int FVTerm::print (FTermArea* area, FChar& term_char) if ( ( ac->attr.bit.transparent && ! nc.attr.bit.transparent ) || ( ac->attr.bit.color_overlay && ! nc.attr.bit.color_overlay ) - || ( ac->attr.bit.inherit_bg && ! nc.attr.bit.inherit_bg ) ) + || ( ac->attr.bit.inherit_background && ! nc.attr.bit.inherit_background ) ) { // remove one transparent character from line area->changes[ay].trans_count--; @@ -583,6 +584,43 @@ void FVTerm::print (const FPoint& p) setPrintCursor (p); } +//---------------------------------------------------------------------- +void FVTerm::print (const FStyle& style) +{ + FAttribute attr = style.getStyle(); + + if ( attr == 0 ) + setNormal(); + else if ( (attr & fc::Bold) != 0 ) + setBold(); + else if ( (attr & fc::Dim) != 0 ) + setDim(); + else if ( (attr & fc::Italic) != 0 ) + setItalic(); + else if ( (attr & fc::Underline) != 0 ) + setUnderline(); + else if ( (attr & fc::Blink) != 0 ) + setBlink(); + else if ( (attr & fc::Reverse) != 0 ) + setReverse(); + else if ( (attr & fc::Standout) != 0 ) + setStandout(); + else if ( (attr & fc::Invisible) != 0 ) + setInvisible(); + else if ( (attr & fc::Protected) != 0 ) + setProtected(); + else if ( (attr & fc::CrossedOut) != 0 ) + setCrossedOut(); + else if ( (attr & fc::DoubleUnderline) != 0 ) + setDoubleUnderline(); + else if ( (attr & fc::Transparent) != 0 ) + setTransparent(); + else if ( (attr & fc::ColorOverlay) != 0 ) + setColorOverlay(); + else if ( (attr & fc::InheritBackground) != 0 ) + setInheritBackground(); +} + //---------------------------------------------------------------------- void FVTerm::print (const FColorPair& pair) { @@ -1232,7 +1270,7 @@ void FVTerm::clearArea (FTermArea* area, int fillchar) if ( nc.attr.bit.transparent || nc.attr.bit.color_overlay - || nc.attr.bit.inherit_bg ) + || nc.attr.bit.inherit_background ) area->changes[i].trans_count = w; else if ( area->right_shadow != 0 ) area->changes[i].trans_count = uInt(area->right_shadow); @@ -1593,7 +1631,7 @@ bool FVTerm::updateVTermCharacter ( FTermArea* area { updateShadedCharacter (area, area_pos, terminal_pos); } - else if ( ac->attr.bit.inherit_bg ) + else if ( ac->attr.bit.inherit_background ) { updateInheritBackground (area, area_pos, terminal_pos); } @@ -1758,7 +1796,7 @@ FChar FVTerm::generateCharacter (const FPoint& pos) sc = &s_ch; } - else if ( tmp->attr.bit.inherit_bg ) + else if ( tmp->attr.bit.inherit_background ) { // Add the covered background to this character std::memcpy (&i_ch, tmp, sizeof(i_ch)); @@ -1988,7 +2026,7 @@ void FVTerm::putAreaCharacter ( const FPoint& pos, FVTerm* obj std::memcpy (tc, &ch, sizeof(*tc)); } - else if ( ac->attr.bit.inherit_bg ) + else if ( ac->attr.bit.inherit_background ) { // Add the covered background to this character FChar ch{}; @@ -2026,7 +2064,7 @@ void FVTerm::getAreaCharacter ( const FPoint& pos, FTermArea* area s_ch.attr.bit.standout = false; cc = &s_ch; } - else if ( tmp->attr.bit.inherit_bg ) + else if ( tmp->attr.bit.inherit_background ) { // Add the covered background to this character std::memcpy (&i_ch, tmp, sizeof(i_ch)); diff --git a/src/fwidget_functions.cpp b/src/fwidget_functions.cpp index 5624794f..258a0476 100644 --- a/src/fwidget_functions.cpp +++ b/src/fwidget_functions.cpp @@ -20,6 +20,8 @@ * . * ***********************************************************************/ +#include "final/fcolorpair.h" +#include "final/fstyle.h" #include "final/fwidget.h" #include "final/fwidgetcolors.h" @@ -152,26 +154,26 @@ void drawTransparentShadow (FWidget* w) const std::size_t width = w->getWidth(); const std::size_t height = w->getHeight(); - w->setTransparent(); - w->print() << FPoint(int(width) + 1, 1) << " "; - w->unsetTransparent(); - w->setColor (w->wcolors.shadow_bg, w->wcolors.shadow_fg); - w->setColorOverlay(); + w->print() << FStyle (fc::Transparent) + << FPoint (int(width) + 1, 1) + << " " + << FStyle (fc::Reset) + << FColorPair (w->wcolors.shadow_bg, w->wcolors.shadow_fg) + << FStyle (fc::ColorOverlay); for (std::size_t y{1}; y < height; y++) { w->print() << FPoint(int(width) + 1, int(y) + 1) << " "; } - w->unsetColorOverlay(); - w->setTransparent(); - w->print() << FPoint(1, int(height) + 1) << " "; - w->unsetTransparent(); - w->setColor (w->wcolors.shadow_bg, w->wcolors.shadow_fg); - w->setColorOverlay(); - w->print() << FString(width, L' '); - - w->unsetColorOverlay(); + w->print() << FStyle (fc::Transparent) + << FPoint (1, int(height) + 1) + << " " + << FStyle (fc::Reset) + << FColorPair (w->wcolors.shadow_bg, w->wcolors.shadow_fg) + << FStyle (fc::ColorOverlay) + << FString (width, L' ') + << FStyle (fc::Reset); if ( w->isMonochron() ) w->setReverse(false); @@ -191,31 +193,32 @@ void drawBlockShadow (FWidget* w) if ( w->isWindowWidget() ) { - w->setColor (w->wcolors.shadow_fg, w->wcolors.shadow_bg); - w->setInheritBackground(); // current background color will be ignored + w->print() << FColorPair (w->wcolors.shadow_fg, w->wcolors.shadow_bg) + << FStyle (fc::InheritBackground); // current background color will be ignored } else if ( auto p = w->getParentWidget() ) - w->setColor (w->wcolors.shadow_fg, p->getBackgroundColor()); + w->print() << FColorPair (w->wcolors.shadow_fg, p->getBackgroundColor()); w->print (fc::LowerHalfBlock); // ▄ if ( w->isWindowWidget() ) - w->unsetInheritBackground(); + w->print() << FStyle (fc::InheritBackground); for (std::size_t y{1}; y < height; y++) { - w->print() << FPoint(int(width) + 1, int(y) + 1) << fc::FullBlock; // █ + w->print() << FPoint(int(width) + 1, int(y) + 1) + << fc::FullBlock; // █ } w->print() << FPoint(2, int(height) + 1); if ( w->isWindowWidget() ) - w->setInheritBackground(); + w->print() << FStyle (fc::InheritBackground); w->print() << FString(width, fc::UpperHalfBlock); // ▀ if ( w->isWindowWidget() ) - w->unsetInheritBackground(); + w->print() << FStyle (fc::Reset); } //---------------------------------------------------------------------- @@ -229,17 +232,18 @@ void clearShadow (FWidget* w) if ( w->isWindowWidget() ) { - w->setColor (w->wcolors.shadow_fg, w->wcolors.shadow_bg); - w->setInheritBackground(); // current background color will be ignored + w->print() << FColorPair (w->wcolors.shadow_fg, w->wcolors.shadow_bg) + << FStyle (fc::InheritBackground); // current background color will be ignored } else if ( auto p = w->getParentWidget() ) - w->setColor (w->wcolors.shadow_fg, p->getBackgroundColor()); + w->print() << FColorPair (w->wcolors.shadow_fg, p->getBackgroundColor()); if ( int(width) <= w->woffset.getX2() ) { for (std::size_t y{1}; y <= height; y++) { - w->print() << FPoint(int(width) + 1, int(y)) << ' '; // clear █ + w->print() << FPoint(int(width) + 1, int(y)) + << ' '; // clear █ } } @@ -250,7 +254,7 @@ void clearShadow (FWidget* w) } if ( w->isWindowWidget() ) - w->unsetInheritBackground(); + w->print() << FStyle (fc::Reset); } //---------------------------------------------------------------------- diff --git a/src/include/final/fc.h b/src/include/final/fc.h index 0f63cf05..10fccb2c 100644 --- a/src/include/final/fc.h +++ b/src/include/final/fc.h @@ -3,7 +3,7 @@ * * * This file is part of the Final Cut widget toolkit * * * -* Copyright 2015-2019 Markus Gans * +* Copyright 2015-2020 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * @@ -936,6 +936,26 @@ enum colornames : FColor Default = static_cast(-1) }; +// Console style names +enum stylenames : FAttribute +{ + Reset = 0, + Bold = 1, + Dim = 2, + Italic = 4, + Underline = 8, + Blink = 16, + Reverse = 32, + Standout = 64, + Invisible = 128, + Protected = 256, + CrossedOut = 512, + DoubleUnderline = 1024, + Transparent = 2048, + ColorOverlay = 4096, + InheritBackground = 8192 +}; + // Mouse/keyboard state values enum ButtonState { diff --git a/src/include/final/fcolorpair.h b/src/include/final/fcolorpair.h index 691195ba..331a6247 100644 --- a/src/include/final/fcolorpair.h +++ b/src/include/final/fcolorpair.h @@ -3,7 +3,7 @@ * * * This file is part of the Final Cut widget toolkit * * * -* Copyright 2019 Markus Gans * +* Copyright 2019-2020 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * @@ -24,7 +24,7 @@ * ════════════════ * * ▕▔▔▔▔▔▔▔▔▔▔▔▔▏ - * ▕ FClassName ▏ + * ▕ FColorPair ▏ * ▕▁▁▁▁▁▁▁▁▁▁▁▁▏ */ @@ -116,5 +116,3 @@ class FColorPair } // namespace finalcut #endif // FCOLORPAIR_H - - diff --git a/src/include/final/final.h b/src/include/final/final.h index 49d85d00..e829a454 100644 --- a/src/include/final/final.h +++ b/src/include/final/final.h @@ -4,7 +4,7 @@ * * * This file is part of the Final Cut widget toolkit * * * -* Copyright 2014-2019 Markus Gans * +* Copyright 2014-2020 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * @@ -68,6 +68,7 @@ #include #include #include +#include #include #include #include diff --git a/src/include/final/fstyle.h b/src/include/final/fstyle.h new file mode 100644 index 00000000..68befd40 --- /dev/null +++ b/src/include/final/fstyle.h @@ -0,0 +1,93 @@ +/*********************************************************************** +* fstyle.h - Style attribute of a character * +* * +* This file is part of the Final Cut widget toolkit * +* * +* Copyright 2020 Markus Gans * +* * +* The Final Cut is free software; you can redistribute it and/or * +* modify it under the terms of the GNU Lesser General Public License * +* as published by the Free Software Foundation; either version 3 of * +* the License, or (at your option) any later version. * +* * +* The Final Cut is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU Lesser General Public License for more details. * +* * +* You should have received a copy of the GNU Lesser General Public * +* License along with this program. If not, see * +* . * +***********************************************************************/ + +/* Standalone class + * ════════════════ + * + * ▕▔▔▔▔▔▔▔▔▏ + * ▕ FStyle ▏ + * ▕▁▁▁▁▁▁▁▁▏ + */ + +#ifndef FSTYLE_H +#define FSTYLE_H + +#if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT) + #error "Only can be included directly." +#endif + +#include "final/fc.h" +#include "final/fstring.h" +#include "final/ftypes.h" + +namespace finalcut +{ + +//---------------------------------------------------------------------- +// class FStyle +//---------------------------------------------------------------------- + +class FStyle +{ + public: + // Constructors + explicit FStyle (FAttribute attr = fc::Reset) + : attribute{attr} + { } + + // Copy constructor + FStyle (const FStyle& style) + : attribute{style.attribute} + { } + + // Destructor + ~FStyle() = default; + + // Assignment operator (=) + FStyle& operator = (const FStyle& style) + { + attribute = style.attribute; + return *this; + } + + // Accessor + const FString getClassName() const + { return "FStyle"; } + + FColor getStyle() const + { return attribute; } + + // Mutators + void setStyle (const FStyle& style) + { attribute = style.attribute; } + + void setStyle (FAttribute attr) + { attribute = attr; } + + private: + // Data members + FAttribute attribute; // Save character attributes +}; + +} // namespace finalcut + +#endif // FSTYLE_H diff --git a/src/include/final/ftermbuffer.h b/src/include/final/ftermbuffer.h index 139e5d02..6f55a5d2 100644 --- a/src/include/final/ftermbuffer.h +++ b/src/include/final/ftermbuffer.h @@ -3,7 +3,7 @@ * * * This file is part of the Final Cut widget toolkit * * * -* Copyright 2017-2019 Markus Gans * +* Copyright 2017-2020 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * @@ -44,6 +44,7 @@ namespace finalcut { // class forward declaration +class FStyle; class FColorPair; //---------------------------------------------------------------------- @@ -72,6 +73,7 @@ class FTermBuffer FTermBuffer& operator << (const FCharVector&); FTermBuffer& operator << (const std::string&); FTermBuffer& operator << (const std::wstring&); + FTermBuffer& operator << (const FStyle&); FTermBuffer& operator << (const FColorPair&); // Accessors @@ -95,6 +97,7 @@ class FTermBuffer int writef (const FString&, Args&&...); int write (const FString&); int write (wchar_t); + void write (const FStyle&); void write (const FColorPair&); FTermBuffer& write (); @@ -149,6 +152,13 @@ inline FTermBuffer& FTermBuffer::operator << (const std::wstring& wstring) return *this; } +//---------------------------------------------------------------------- +inline FTermBuffer& FTermBuffer::operator << (const FStyle& style) +{ + write (style); + return *this; +} + //---------------------------------------------------------------------- inline FTermBuffer& FTermBuffer::operator << (const FColorPair& pair) { diff --git a/src/include/final/ftypes.h b/src/include/final/ftypes.h index 90332021..cfd539b7 100644 --- a/src/include/final/ftypes.h +++ b/src/include/final/ftypes.h @@ -3,7 +3,7 @@ * * * This file is part of the Final Cut widget toolkit * * * -* Copyright 2017-2019 Markus Gans * +* Copyright 2017-2020 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * @@ -59,6 +59,7 @@ typedef std::int64_t sInt64; typedef long double lDouble; typedef uInt16 FColor; +typedef uInt16 FAttribute; typedef uInt32 FKey; typedef void* FDataPtr; @@ -118,31 +119,31 @@ typedef struct struct { // Attribute byte #0 - uInt8 bold : 1; // bold - uInt8 dim : 1; // dim - uInt8 italic : 1; // italic - uInt8 underline : 1; // underline - uInt8 blink : 1; // blink - uInt8 reverse : 1; // reverse - uInt8 standout : 1; // standout - uInt8 invisible : 1; // invisible + uInt8 bold : 1; // bold + uInt8 dim : 1; // dim + uInt8 italic : 1; // italic + uInt8 underline : 1; // underline + uInt8 blink : 1; // blink + uInt8 reverse : 1; // reverse + uInt8 standout : 1; // standout + uInt8 invisible : 1; // invisible // Attribute byte #1 - uInt8 protect : 1; // protect mode - uInt8 crossed_out : 1; // crossed out - uInt8 dbl_underline : 1; // double underline - uInt8 alt_charset : 1; // alternate character set (vt100) - uInt8 pc_charset : 1; // pc character set (CP437) - uInt8 transparent : 1; // transparent - uInt8 color_overlay : 1; // color overlay - uInt8 inherit_bg : 1; // inherit background + uInt8 protect : 1; // protect mode + uInt8 crossed_out : 1; // crossed out + uInt8 dbl_underline : 1; // double underline + uInt8 alt_charset : 1; // alternate character set (vt100) + uInt8 pc_charset : 1; // pc character set (CP437) + uInt8 transparent : 1; // transparent + uInt8 color_overlay : 1; // color overlay + uInt8 inherit_background : 1; // inherit background // Attribute byte #2 - uInt8 no_changes : 1; // no changes required - uInt8 printed : 1; // is printed to VTerm - uInt8 fullwidth_padding : 1; // padding char (after a full-width char) - uInt8 char_width : 2; // number of character cells on screen - uInt8 : 3; // padding bits + uInt8 no_changes : 1; // no changes required + uInt8 printed : 1; // is printed to VTerm + uInt8 fullwidth_padding : 1; // padding char (after a full-width char) + uInt8 char_width : 2; // number of character cells on screen + uInt8 : 3; // padding bits // Attribute byte #3 - uInt8 : 8; // padding byte + uInt8 : 8; // padding byte } bit; uInt8 byte[4]; diff --git a/src/include/final/fvterm.h b/src/include/final/fvterm.h index fdc7dbcf..dfe4649c 100644 --- a/src/include/final/fvterm.h +++ b/src/include/final/fvterm.h @@ -77,6 +77,7 @@ class FSystem; class FTerm; class FTermBuffer; class FTermDebugData; +class FStyle; class FWidget; //---------------------------------------------------------------------- @@ -141,6 +142,7 @@ class FVTerm FVTerm& operator << (const FTermBuffer&); FVTerm& operator << (const std::vector&); FVTerm& operator << (const FPoint&); + FVTerm& operator << (const FStyle&); FVTerm& operator << (const FColorPair&); // Accessors @@ -305,6 +307,7 @@ class FVTerm int print (FChar&); int print (FTermArea*, FChar&); virtual void print (const FPoint&); + virtual void print (const FStyle&); virtual void print (const FColorPair&); virtual FVTerm& print(); static void flush(); @@ -579,6 +582,13 @@ inline FVTerm& FVTerm::operator << (const FPoint& pos) return *this; } +//---------------------------------------------------------------------- +inline FVTerm& FVTerm::operator << (const FStyle& t_style) +{ + print (t_style); + return *this; +} + //---------------------------------------------------------------------- inline FVTerm& FVTerm::operator << (const FColorPair& pair) { @@ -851,7 +861,7 @@ inline bool FVTerm::unsetColorOverlay() //---------------------------------------------------------------------- inline bool FVTerm::setInheritBackground (bool enable) -{ return (next_attribute.attr.bit.inherit_bg = enable); } +{ return (next_attribute.attr.bit.inherit_background = enable); } //---------------------------------------------------------------------- inline bool FVTerm::setInheritBackground() @@ -943,7 +953,7 @@ inline bool FVTerm::isTransShadow() //---------------------------------------------------------------------- inline bool FVTerm::isInheritBackground() -{ return next_attribute.attr.bit.inherit_bg; } +{ return next_attribute.attr.bit.inherit_background; } //---------------------------------------------------------------------- inline bool FVTerm::isMonochron() diff --git a/test/Makefile.am b/test/Makefile.am index f2218ba9..a2ff0559 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -19,6 +19,7 @@ noinst_PROGRAMS = \ foptimove_test \ foptiattr_test \ fcolorpair_test \ + fstyle_test \ fstring_test \ fsize_test \ fpoint_test \ @@ -36,6 +37,7 @@ ftermfreebsd_test_SOURCES = ftermfreebsd-test.cpp foptimove_test_SOURCES = foptimove-test.cpp foptiattr_test_SOURCES = foptiattr-test.cpp fcolorpair_test_SOURCES = fcolorpair-test.cpp +fstyle_test_SOURCES = fstyle-test.cpp fstring_test_SOURCES = fstring-test.cpp fsize_test_SOURCES = fsize-test.cpp fpoint_test_SOURCES = fpoint-test.cpp @@ -53,6 +55,7 @@ TESTS = fobject_test \ foptimove_test \ foptiattr_test \ fcolorpair_test \ + fstyle_test \ fstring_test \ fsize_test \ fpoint_test \ diff --git a/test/fcolorpair-test.cpp b/test/fcolorpair-test.cpp index b07233a1..f130c652 100644 --- a/test/fcolorpair-test.cpp +++ b/test/fcolorpair-test.cpp @@ -3,7 +3,7 @@ * * * This file is part of the Final Cut widget toolkit * * * -* Copyright 2019 Markus Gans * +* Copyright 2019-2020 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * diff --git a/test/fstyle-test.cpp b/test/fstyle-test.cpp new file mode 100644 index 00000000..ecc90f75 --- /dev/null +++ b/test/fstyle-test.cpp @@ -0,0 +1,156 @@ +/*********************************************************************** +* fstyle-test.cpp - FStyle unit tests * +* * +* This file is part of the Final Cut widget toolkit * +* * +* Copyright 2019 Markus Gans * +* * +* The Final Cut is free software; you can redistribute it and/or * +* modify it under the terms of the GNU Lesser General Public License * +* as published by the Free Software Foundation; either version 3 of * +* the License, or (at your option) any later version. * +* * +* The Final Cut is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU Lesser General Public License for more details. * +* * +* You should have received a copy of the GNU Lesser General Public * +* License along with this program. If not, see * +* . * +***********************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +//---------------------------------------------------------------------- +// class FStyleTest +//---------------------------------------------------------------------- + +class FStyleTest : public CPPUNIT_NS::TestFixture +{ + public: + FStyleTest() + { } + + protected: + void classNameTest(); + void noArgumentTest(); + void copyConstructorTest(); + void assignmentTest(); + void setColorTest(); + void swapTest(); + + private: + // Adds code needed to register the test suite + CPPUNIT_TEST_SUITE (FStyleTest); + + // Add a methods to the test suite + CPPUNIT_TEST (classNameTest); + CPPUNIT_TEST (noArgumentTest); + CPPUNIT_TEST (copyConstructorTest); + CPPUNIT_TEST (assignmentTest); + CPPUNIT_TEST (setColorTest); + + // End of test suite definition + CPPUNIT_TEST_SUITE_END(); +}; + + +//---------------------------------------------------------------------- +void FStyleTest::classNameTest() +{ + const finalcut::FStyle s; + const finalcut::FString& classname = s.getClassName(); + CPPUNIT_ASSERT ( classname == "FStyle" ); +} + +//---------------------------------------------------------------------- +void FStyleTest::noArgumentTest() +{ + const finalcut::FStyle style{}; + CPPUNIT_ASSERT ( style.getStyle() == finalcut::fc::Reset ); +} + +//---------------------------------------------------------------------- +void FStyleTest::copyConstructorTest() +{ + const finalcut::FStyle style1a; + CPPUNIT_ASSERT ( style1a.getStyle() == finalcut::fc::Reset ); + finalcut::FStyle style1b (style1a); + CPPUNIT_ASSERT ( style1b.getStyle() == finalcut::fc::Reset ); + + const finalcut::FStyle style2a (finalcut::fc::Bold ); + CPPUNIT_ASSERT ( style2a.getStyle() == finalcut::fc::Bold ); + const finalcut::FStyle style2b (style2a); + CPPUNIT_ASSERT ( style2b.getStyle() == finalcut::fc::Bold ); + + const finalcut::FStyle style3a (finalcut::fc::Bold + finalcut::fc::Dim); + CPPUNIT_ASSERT ( style3a.getStyle() == (finalcut::fc::Bold | finalcut::fc::Dim) ); + const finalcut::FStyle style3b (style3a); + CPPUNIT_ASSERT ( style3b.getStyle() == (finalcut::fc::Bold | finalcut::fc::Dim) ); +} + +//---------------------------------------------------------------------- +void FStyleTest::assignmentTest() +{ + const finalcut::FStyle style1a; + const finalcut::FStyle style1b = style1a; + CPPUNIT_ASSERT ( style1b.getStyle() == finalcut::fc::Reset ); + + const finalcut::FStyle style2a (finalcut::fc::Italic ); + const finalcut::FStyle style2b = style2a; + CPPUNIT_ASSERT ( style2b.getStyle() == finalcut::fc::Italic ); + + const finalcut::FStyle style3a (finalcut::fc::Underline | finalcut::fc::Blink); + const finalcut::FStyle style3b = style3a; + CPPUNIT_ASSERT ( style3b.getStyle() == (finalcut::fc::Underline + finalcut::fc::Blink) ); + + finalcut::FStyle style4 = finalcut::FStyle(); + CPPUNIT_ASSERT ( style4.getStyle() == finalcut::fc::Reset ); + style4 = finalcut::FStyle(finalcut::fc::Bold | finalcut::fc::Dim); + CPPUNIT_ASSERT ( style4.getStyle() == (finalcut::fc::Bold | finalcut::fc::Dim) ); +} + +//---------------------------------------------------------------------- +void FStyleTest::setColorTest() +{ + finalcut::FStyle style1; + style1.setStyle (finalcut::fc::Reverse); + CPPUNIT_ASSERT ( style1.getStyle() == finalcut::fc::Reverse ); + + finalcut::FStyle style2 (finalcut::fc::Reverse); + style2.setStyle (finalcut::fc::Standout); + CPPUNIT_ASSERT ( style2.getStyle() == finalcut::fc::Standout ); + + finalcut::FStyle style3 (finalcut::fc::Protected | finalcut::fc::CrossedOut); + style3.setStyle (finalcut::fc::Invisible); + CPPUNIT_ASSERT ( style3.getStyle() == finalcut::fc::Invisible ); + finalcut::FStyle style4 (finalcut::fc::DoubleUnderline); + style3.setStyle (style4); + CPPUNIT_ASSERT ( style3.getStyle() == finalcut::fc::DoubleUnderline ); + + finalcut::FStyle style5 (finalcut::fc::Transparent); + CPPUNIT_ASSERT ( style5.getStyle() == finalcut::fc::Transparent ); + style5.setStyle (finalcut::fc::Reset); + CPPUNIT_ASSERT ( style5.getStyle() == finalcut::fc::Reset ); + style5.setStyle (finalcut::fc::ColorOverlay); + CPPUNIT_ASSERT ( style5.getStyle() == finalcut::fc::ColorOverlay ); + style5.setStyle (finalcut::fc::InheritBackground); + CPPUNIT_ASSERT ( style5.getStyle() == finalcut::fc::InheritBackground ); +} + +// Put the test suite in the registry +CPPUNIT_TEST_SUITE_REGISTRATION (FStyleTest); + +// The general unit test main part +#include