From 5a356664b275722349124a569c1b7f3ea1a174ab Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Sun, 4 Nov 2018 23:00:06 +0100 Subject: [PATCH] The widget flags are now stored in a bit field --- ChangeLog | 3 ++ README.md | 1 + doc/readme.txt | 7 +++-- src/fapplication.cpp | 2 +- src/fbutton.cpp | 36 ++++++++++-------------- src/fbuttongroup.cpp | 12 ++------ src/fdialog.cpp | 27 +++++------------- src/flabel.cpp | 9 ++---- src/flineedit.cpp | 17 ++++------- src/flistbox.cpp | 29 ++++++++----------- src/flistview.cpp | 11 ++------ src/fmenu.cpp | 9 ++---- src/fmenubar.cpp | 2 +- src/fprogressbar.cpp | 6 ++-- src/ftogglebutton.cpp | 22 ++++----------- src/fwidget.cpp | 47 ++++++++++++------------------- src/fwindow.cpp | 48 ++++++++++---------------------- src/include/final/fbutton.h | 4 +-- src/include/final/fc.h | 18 ------------ src/include/final/fdialog.h | 4 +-- src/include/final/flineedit.h | 2 +- src/include/final/fprogressbar.h | 2 +- src/include/final/fwidget.h | 37 +++++++++++++++++------- src/include/final/fwindow.h | 8 +++--- 24 files changed, 139 insertions(+), 224 deletions(-) diff --git a/ChangeLog b/ChangeLog index afd69b0d..a1e7af99 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2018-11-04 Markus Gans + * Widget flags are now stored in a bit field + 2018-11-03 Markus Gans * New method rgb2ColorIndex() to converts a 24-bit RGB color to a 256-color compatible approximation diff --git a/README.md b/README.md index 2e804149..1347b99e 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@      [![documented](https://codedocs.xyz/gansm/finalcut.svg)](https://codedocs.xyz/gansm/finalcut/hierarchy.html) The FINAL CUT is a C++ class library and widget toolkit with full mouse support for creating a [text-based user interface](https://en.wikipedia.org/wiki/Text-based_user_interface). The library supports the programmer to develop an application for the text console. It allows the simultaneous handling of multiple text windows on the screen. + The structure of the Qt framework was originally the inspiration for the C++ class design of FINAL CUT. It provides common controls like dialog boxes, push buttons, check boxes, radio buttons, input lines, list boxes, status bars and so on. ### Installation diff --git a/doc/readme.txt b/doc/readme.txt index 66ffe493..2f185b57 100644 --- a/doc/readme.txt +++ b/doc/readme.txt @@ -7,7 +7,8 @@ support for creating a text-based user interface. The library supports the programmer to develop an application for the text console. It allows the simultaneous handling of multiple text windows on the screen. -The C++ class design was inspired by the Qt framework. It provides -common controls like dialog boxes, push buttons, check boxes, -radio buttons, input lines, list boxes, status bars and so on. +The structure of the Qt framework was originally the inspiration for +the C++ class design of FINAL CUT. It provides common controls like +dialog boxes, push buttons, check boxes, radio buttons, input lines, +list boxes, status bars and so on. diff --git a/src/fapplication.cpp b/src/fapplication.cpp index e9444cef..9dd5cacb 100644 --- a/src/fapplication.cpp +++ b/src/fapplication.cpp @@ -188,7 +188,7 @@ bool FApplication::sendEvent ( const FObject* receiver // block events for widgets in non modal windows if ( window - && (window->getFlags() & fc::modal) == 0 + && ! window->getFlags().modal && ! window->isMenuWidget() ) { switch ( event->type() ) diff --git a/src/fbutton.cpp b/src/fbutton.cpp index d68266a0..abe5a607 100644 --- a/src/fbutton.cpp +++ b/src/fbutton.cpp @@ -157,12 +157,7 @@ void FButton::setInactiveBackgroundColor (short color) //---------------------------------------------------------------------- bool FButton::setNoUnderline (bool on) { - if ( on ) - flags |= fc::no_underline; - else - flags &= ~fc::no_underline; - - return on; + return (flags.no_underline = on); } //---------------------------------------------------------------------- @@ -211,11 +206,7 @@ bool FButton::setFocus (bool on) //---------------------------------------------------------------------- bool FButton::setFlat (bool on) { - if ( on ) - flags |= fc::flat; - else - flags &= ~fc::flat; - return on; + return (flags.flat = on); } //---------------------------------------------------------------------- @@ -225,16 +216,16 @@ bool FButton::setShadow (bool on) && getEncoding() != fc::VT100 && getEncoding() != fc::ASCII ) { - flags |= fc::shadow; + flags.shadow = true; setShadowSize(1,1); } else { - flags &= ~fc::shadow; + flags.shadow = false; setShadowSize(0,0); } - return on; + return flags.shadow; } //---------------------------------------------------------------------- @@ -465,13 +456,12 @@ void FButton::init() //---------------------------------------------------------------------- void FButton::getButtonState() { - int active_focus = fc::active + fc::focus; - is.active_focus = ((flags & active_focus) == active_focus); - is.active = ((flags & fc::active) != 0); - is.focus = ((flags & fc::focus) != 0); + is.active_focus = flags.active && flags.focus; + is.active = flags.active; + is.focus = flags.focus; is.flat = isFlat(); - is.non_flat_shadow = ((flags & (fc::shadow + fc::flat)) == fc::shadow); - is.no_underline = ((flags & fc::no_underline) != 0); + is.non_flat_shadow = ! flags.flat && flags.shadow; + is.no_underline = flags.no_underline; } //---------------------------------------------------------------------- @@ -666,10 +656,14 @@ inline void FButton::drawTopBottomBackground() inline void FButton::drawButtonTextLine (wchar_t button_text[]) { std::size_t pos; - center_offset = (getWidth() - txtlength - 1) / 2; setPrintPos (2 + int(indent), 1 + int(vcenter_offset)); setColor (button_fg, button_bg); + if ( getWidth() < txtlength + 1 ) + center_offset = 0; + else + center_offset = (getWidth() - txtlength - 1) / 2; + // Print button text line -------- for (pos = 0; pos < center_offset; pos++) print (space_char); // █ diff --git a/src/fbuttongroup.cpp b/src/fbuttongroup.cpp index fcede4b7..c5cf8612 100644 --- a/src/fbuttongroup.cpp +++ b/src/fbuttongroup.cpp @@ -543,9 +543,6 @@ bool FButtonGroup::isRadioButton (FToggleButton* button) const //---------------------------------------------------------------------- void FButtonGroup::init() { - if ( isEnabled() ) - flags |= fc::active; - setForegroundColor (wc.label_fg); setBackgroundColor (wc.label_bg); setMinimumSize (7, 4); @@ -582,9 +579,6 @@ void FButtonGroup::drawText ( wchar_t LabelText[] , std::size_t hotkeypos , std::size_t length ) { - bool isActive = ((flags & fc::active) != 0); - bool isNoUnderline = ((flags & fc::no_underline) != 0); - if ( isMonochron() ) setReverse(true); @@ -595,16 +589,16 @@ void FButtonGroup::drawText ( wchar_t LabelText[] for (std::size_t z = 0; z < length; z++) { - if ( (z == hotkeypos) && isActive ) + if ( (z == hotkeypos) && flags.active ) { setColor (wc.label_hotkey_fg, wc.label_hotkey_bg); - if ( ! isNoUnderline ) + if ( ! flags.no_underline ) setUnderline(); print (LabelText[z]); - if ( ! isNoUnderline ) + if ( ! flags.no_underline ) unsetUnderline(); setColor (wc.label_emphasis_fg, wc.label_bg); diff --git a/src/fdialog.cpp b/src/fdialog.cpp index b43780b2..995f75e8 100644 --- a/src/fdialog.cpp +++ b/src/fdialog.cpp @@ -103,16 +103,12 @@ bool FDialog::setDialogWidget (bool on) if ( isDialogWidget() == on ) return true; + flags.dialog_widget = on; + if ( on ) - { - flags |= fc::dialog_widget; setTermOffsetWithPadding(); - } else - { - flags &= ~fc::dialog_widget; setParentOffset(); - } return on; } @@ -123,16 +119,12 @@ bool FDialog::setModal (bool on) if ( isModal() == on ) return true; + flags.modal = on; + if ( on ) - { - flags |= fc::modal; modal_dialogs++; - } else - { - flags &= ~fc::modal; modal_dialogs--; - } return on; } @@ -141,12 +133,7 @@ bool FDialog::setModal (bool on) //---------------------------------------------------------------------- bool FDialog::setScrollable (bool on) { - if ( on ) - flags |= fc::scrollable; - else - flags &= ~fc::scrollable; - - return on; + return (flags.scrollable = on); } //---------------------------------------------------------------------- @@ -835,7 +822,7 @@ void FDialog::draw() drawTitleBar(); setCursorPos(2, int(getHeight()) - 1); - if ( (flags & fc::shadow) != 0 ) + if ( flags.shadow ) drawDialogShadow(); if ( isMonochron() ) @@ -845,7 +832,7 @@ void FDialog::draw() //---------------------------------------------------------------------- void FDialog::drawDialogShadow() { - if ( isMonochron() && (flags & fc::trans_shadow) == 0 ) + if ( isMonochron() && ! flags.trans_shadow ) return; drawShadow(); diff --git a/src/flabel.cpp b/src/flabel.cpp index c2b1baec..39985cbf 100644 --- a/src/flabel.cpp +++ b/src/flabel.cpp @@ -597,9 +597,6 @@ void FLabel::printLine ( wchar_t line[] { std::size_t to_char; std::size_t width = std::size_t(getWidth()); - bool isActive, isNoUnderline; - isActive = ((flags & fc::active) != 0); - isNoUnderline = ((flags & fc::no_underline) != 0); if ( align_offset > 0 ) print (FString(align_offset, ' ')); // leading spaces @@ -623,16 +620,16 @@ void FLabel::printLine ( wchar_t line[] } } - if ( z == hotkeypos && isActive ) + if ( z == hotkeypos && flags.active ) { setColor (wc.label_hotkey_fg, wc.label_hotkey_bg); - if ( ! isNoUnderline ) + if ( ! flags.no_underline ) setUnderline(); print (line[z]); - if ( ! isNoUnderline ) + if ( ! flags.no_underline ) unsetUnderline(); if ( hasEmphasis() ) diff --git a/src/flineedit.cpp b/src/flineedit.cpp index a1bef7b3..bdca4e7d 100644 --- a/src/flineedit.cpp +++ b/src/flineedit.cpp @@ -239,16 +239,16 @@ bool FLineEdit::setShadow (bool on) && getEncoding() != fc::VT100 && getEncoding() != fc::ASCII ) { - flags |= fc::shadow; + flags.shadow = true; setShadowSize(1,1); } else { - flags &= ~fc::shadow; + flags.shadow = false; setShadowSize(0,0); } - return on; + return flags.shadow; } //---------------------------------------------------------------------- @@ -698,11 +698,9 @@ bool FLineEdit::hasHotkey() //---------------------------------------------------------------------- void FLineEdit::draw() { - bool isFocus; drawInputField(); - isFocus = ((flags & fc::focus) != 0); - if ( isFocus && getStatusBar() ) + if ( flags.focus && getStatusBar() ) { const FString& msg = getStatusbarMessage(); const FString& curMsg = getStatusBar()->getMessage(); @@ -718,12 +716,9 @@ void FLineEdit::draw() //---------------------------------------------------------------------- void FLineEdit::drawInputField() { - bool isActiveFocus, isShadow; std::size_t x; FString show_text; - int active_focus = fc::active + fc::focus; - isActiveFocus = ((flags & active_focus) == active_focus); - isShadow = ((flags & fc::shadow) != 0 ); + bool isActiveFocus = flags.active && flags.focus; setPrintPos (1, 1); if ( isMonochron() ) @@ -776,7 +771,7 @@ void FLineEdit::drawInputField() setUnderline(false); } - if ( isShadow ) + if ( flags.shadow ) drawShadow (); // set the cursor to the first pos. diff --git a/src/flistbox.cpp b/src/flistbox.cpp index 83bae776..c14162a2 100644 --- a/src/flistbox.cpp +++ b/src/flistbox.cpp @@ -872,8 +872,6 @@ void FListBox::init() //---------------------------------------------------------------------- void FListBox::draw() { - bool isFocus; - if ( current < 1 ) current = 1; @@ -910,9 +908,8 @@ void FListBox::draw() hbar->redraw(); drawList(); - isFocus = ((flags & fc::focus) != 0); - if ( isFocus && getStatusBar() ) + if ( flags.focus && getStatusBar() ) { const FString& msg = getStatusbarMessage(); const FString& curMsg = getStatusBar()->getMessage(); @@ -1017,14 +1014,13 @@ inline void FListBox::drawListLine ( int y std::size_t i, len; std::size_t inc_len = inc_search.getLength(); bool isCurrentLine = bool(y + yoffset + 1 == int(current)); - bool isFocus = ((flags & fc::focus) != 0); FString element; element = getString(iter).mid ( std::size_t(1 + xoffset) , getWidth() - nf_offset - 4 ); const wchar_t* const& element_str = element.wc_str(); len = element.getLength(); - if ( isMonochron() && isCurrentLine && isFocus ) + if ( isMonochron() && isCurrentLine && flags.focus ) print (fc::BlackRightPointingPointer); // ► else print (' '); @@ -1035,14 +1031,14 @@ inline void FListBox::drawListLine ( int y for (i = 0; i < len; i++) { - if ( serach_mark && i == inc_len && isFocus ) + if ( serach_mark && i == inc_len && flags.focus ) setColor ( wc.current_element_focus_fg , wc.current_element_focus_bg ); print (element_str[i]); } - if ( isMonochron() && isCurrentLine && isFocus ) + if ( isMonochron() && isCurrentLine && flags.focus ) { print (fc::BlackLeftPointingPointer); // ◄ i++; @@ -1116,9 +1112,8 @@ inline void FListBox::drawListBracketsLine ( int y , i = 0 , b = 0; bool isCurrentLine = bool(y + yoffset + 1 == int(current)); - bool isFocus = ((flags & fc::focus) != 0); - if ( isMonochron() && isCurrentLine && isFocus ) + if ( isMonochron() && isCurrentLine && flags.focus ) print (fc::BlackRightPointingPointer); // ► else print (' '); @@ -1164,7 +1159,7 @@ inline void FListBox::drawListBracketsLine ( int y i++; } - if ( isMonochron() && isCurrentLine && isFocus ) + if ( isMonochron() && isCurrentLine && flags.focus ) { print (fc::BlackLeftPointingPointer); // ◄ i++; @@ -1180,10 +1175,8 @@ inline void FListBox::setLineAttributes ( int y , bool lineHasBrackets , bool& serach_mark ) { - bool isFocus = ((flags & fc::focus) != 0) - , isCurrentLine = bool(y + yoffset + 1 == int(current)); + bool isCurrentLine = bool(y + yoffset + 1 == int(current)); std::size_t inc_len = inc_search.getLength(); - setPrintPos (2, 2 + int(y)); if ( isLineSelected ) @@ -1203,14 +1196,14 @@ inline void FListBox::setLineAttributes ( int y if ( isCurrentLine ) { - if ( isFocus && getMaxColor() < 16 ) + if ( flags.focus && getMaxColor() < 16 ) setBold(); if ( isLineSelected ) { if ( isMonochron() ) setBold(); - else if ( isFocus ) + else if ( flags.focus ) setColor ( wc.selected_current_element_focus_fg , wc.selected_current_element_focus_bg ); else @@ -1224,7 +1217,7 @@ inline void FListBox::setLineAttributes ( int y if ( isMonochron() ) unsetBold(); - if ( isFocus ) + if ( flags.focus ) { setColor ( wc.current_element_focus_fg , wc.current_element_focus_bg ); @@ -1251,7 +1244,7 @@ inline void FListBox::setLineAttributes ( int y { if ( isMonochron() ) setReverse(true); - else if ( isFocus && getMaxColor() < 16 ) + else if ( flags.focus && getMaxColor() < 16 ) unsetBold(); } } diff --git a/src/flistview.cpp b/src/flistview.cpp index d6a48897..dfa08d8a 100644 --- a/src/flistview.cpp +++ b/src/flistview.cpp @@ -1481,8 +1481,6 @@ std::size_t FListView::getAlignOffset ( fc::text_alignment align //---------------------------------------------------------------------- void FListView::draw() { - bool isFocus; - if ( current_iter.getPosition() < 1 ) current_iter = itemlist.begin(); @@ -1519,9 +1517,8 @@ void FListView::draw() hbar->redraw(); drawList(); - isFocus = ((flags & fc::focus) != 0); - if ( isFocus && getStatusBar() ) + if ( flags.focus && getStatusBar() ) { const FString& msg = getStatusbarMessage(); const FString& curMsg = getStatusBar()->getMessage(); @@ -1587,7 +1584,6 @@ void FListView::drawColumnLabels() void FListView::drawList() { uInt page_height, y; - bool is_focus; FListViewIterator iter; if ( itemlist.empty() || getHeight() <= 2 || getWidth() <= 4 ) @@ -1595,7 +1591,6 @@ void FListView::drawList() y = 0; page_height = uInt(getHeight() - 2); - is_focus = ((flags & fc::focus) != 0); iter = first_visible_line; while ( iter != itemlist.end() && y < page_height ) @@ -1605,9 +1600,9 @@ void FListView::drawList() setPrintPos (2, 2 + int(y)); // Draw one FListViewItem - drawListLine (item, is_focus, is_current_line); + drawListLine (item, flags.focus, is_current_line); - if ( is_focus && is_current_line ) + if ( flags.focus && is_current_line ) setCursorPos (3, 2 + int(y)); // first character last_visible_line = iter; diff --git a/src/fmenu.cpp b/src/fmenu.cpp index cc75ae8b..149db2d2 100644 --- a/src/fmenu.cpp +++ b/src/fmenu.cpp @@ -82,12 +82,7 @@ bool FMenu::setMenuWidget (bool on) if ( isMenuWidget() == on ) return true; - if ( on ) - flags |= fc::menu_widget; - else - flags &= ~fc::menu_widget; - - return on; + return (flags.menu_widget = on); } //---------------------------------------------------------------------- @@ -1350,7 +1345,7 @@ inline void FMenu::drawMenuLine (FMenuItem* menuitem, int y) to_char--; txtdata.length = to_char; - txtdata.no_underline = ((menuitem->getFlags() & fc::no_underline) != 0); + txtdata.no_underline = menuitem->getFlags().no_underline; setCursorToHotkeyPosition (menuitem); if ( ! is_enabled || is_selected ) diff --git a/src/fmenubar.cpp b/src/fmenubar.cpp index 0d904cde..9f08939e 100644 --- a/src/fmenubar.cpp +++ b/src/fmenubar.cpp @@ -554,7 +554,7 @@ inline void FMenuBar::drawItem (FMenuItem* menuitem, std::size_t& x) bool is_selected = menuitem->isSelected(); txtdata.startpos = x + 1; - txtdata.no_underline = ((menuitem->getFlags() & fc::no_underline) != 0); + txtdata.no_underline = menuitem->getFlags().no_underline; // Set screen attributes setLineAttributes (menuitem); diff --git a/src/fprogressbar.cpp b/src/fprogressbar.cpp index 821ee5db..559ce6e0 100644 --- a/src/fprogressbar.cpp +++ b/src/fprogressbar.cpp @@ -83,12 +83,12 @@ bool FProgressbar::setShadow (bool on) && getEncoding() != fc::VT100 && getEncoding() != fc::ASCII ) { - flags |= fc::shadow; + flags.shadow = true; setShadowSize(1,1); } else { - flags &= ~fc::shadow; + flags.shadow = false; setShadowSize(0,0); } @@ -157,7 +157,7 @@ void FProgressbar::draw() drawPercentage(); drawBar(); - if ( (flags & fc::shadow) != 0 ) + if ( flags.shadow ) drawShadow (); flush_out(); diff --git a/src/ftogglebutton.cpp b/src/ftogglebutton.cpp index b86bec1e..6ac83c9b 100644 --- a/src/ftogglebutton.cpp +++ b/src/ftogglebutton.cpp @@ -109,12 +109,7 @@ void FToggleButton::setGeometry (int x, int y, std::size_t w, std::size_t h, boo //---------------------------------------------------------------------- bool FToggleButton::setNoUnderline (bool on) { - if ( on ) - flags |= fc::no_underline; - else - flags &= ~fc::no_underline; - - return on; + return (flags.no_underline = on); } //---------------------------------------------------------------------- @@ -464,9 +459,7 @@ bool FToggleButton::isCheckboxButton() const //---------------------------------------------------------------------- void FToggleButton::draw() { - bool isFocus = ((flags & fc::focus) != 0); - - if ( isFocus && getStatusBar() ) + if ( flags.focus && getStatusBar() ) { const FString& msg = getStatusbarMessage(); const FString& curMsg = getStatusBar()->getMessage(); @@ -649,12 +642,9 @@ std::size_t FToggleButton::getHotkeyPos ( wchar_t src[] //---------------------------------------------------------------------- void FToggleButton::drawText ( wchar_t LabelText[] - , std::size_t hotkeypos + , std::size_t hotkeypos , std::size_t length ) { - bool isActive = ((flags & fc::active) != 0); - bool isNoUnderline = ((flags & fc::no_underline) != 0); - if ( isMonochron() ) setReverse(true); @@ -665,16 +655,16 @@ void FToggleButton::drawText ( wchar_t LabelText[] for (std::size_t z = 0; z < length; z++) { - if ( (z == hotkeypos) && isActive ) + if ( (z == hotkeypos) && flags.active ) { setColor (wc.label_hotkey_fg, wc.label_hotkey_bg); - if ( ! isNoUnderline ) + if ( ! flags.no_underline ) setUnderline(); print ( LabelText[z] ); - if ( ! isNoUnderline ) + if ( ! flags.no_underline ) unsetUnderline(); setColor (wc.label_fg, wc.label_bg); diff --git a/src/fwidget.cpp b/src/fwidget.cpp index a31e34a9..ea385037 100644 --- a/src/fwidget.cpp +++ b/src/fwidget.cpp @@ -58,13 +58,11 @@ FWidget::FWidget (FWidget* parent, bool disable_alt_screen) : FVTerm(bool(! parent), disable_alt_screen) , FObject(parent) , accelerator_list(0) - , flags(0) + , flags() , callback_objects() , member_callback_objects() - , enable(true) , visible(true) , shown(false) - , focus(false) , focusable(true) , visible_cursor(true) , widget_cursor_position(-1, -1) @@ -84,8 +82,11 @@ FWidget::FWidget (FWidget* parent, bool disable_alt_screen) , background_color(fc::Default) , statusbar_message() { - if ( isEnabled() ) - flags |= fc::active; + // init bit field with 0 + memset (&flags, 0, sizeof(flags)); + + // Enable widget by default + flags.active = true; widget_object = true; @@ -124,7 +125,7 @@ FWidget::~FWidget() // destructor setClickedWidget(0); // unset the local window widget focus - if ( focus ) + if ( flags.focus ) { if ( FWindow* window = FWindow::getWindowWidget(this) ) window->setWindowFocusWidget(0); @@ -276,12 +277,7 @@ void FWidget::setMainWidget (FWidget* obj) //---------------------------------------------------------------------- bool FWidget::setEnable (bool on) { - if ( on ) - flags |= fc::active; - else - flags &= ~fc::active; - - return enable = on; + return (flags.active = on); } //---------------------------------------------------------------------- @@ -290,21 +286,16 @@ bool FWidget::setFocus (bool on) FWindow* window; FWidget* last_focus; - if ( ! enable ) + if ( ! isEnabled() ) return false; - if ( on ) - flags |= fc::focus; - else - flags &= ~fc::focus; - - if ( on == focus ) + if ( flags.focus == on ) return true; last_focus = FWidget::getFocusWidget(); // set widget focus - if ( on && ! focus ) + if ( on && ! flags.focus ) { int focusable_children = numOfFocusableChildren(); @@ -334,7 +325,7 @@ bool FWidget::setFocus (bool on) window->setWindowFocusWidget(this); } - return focus = on; + return (flags.focus = on); } //---------------------------------------------------------------------- @@ -659,7 +650,7 @@ bool FWidget::setCursorPos (int x, int y) widget_cursor_position.setPoint(x, y); - if ( (flags & fc::focus) == 0 || isWindowWidget() ) + if ( ! flags.focus || isWindowWidget() ) return false; if ( ! FWindow::getWindowWidget(this) ) @@ -856,7 +847,7 @@ bool FWidget::close() { hide(); - if ( (flags & fc::modal) == 0 ) + if ( ! flags.modal ) close_widget->push_back(this); } return true; @@ -1266,13 +1257,11 @@ void FWidget::move (int dx, int dy) //---------------------------------------------------------------------- void FWidget::drawShadow() { - bool trans_shadow = ((flags & fc::trans_shadow) != 0); - - if ( isMonochron() && ! trans_shadow ) + if ( isMonochron() && ! flags.trans_shadow ) return; - if ( (getEncoding() == fc::VT100 && ! trans_shadow) - || (getEncoding() == fc::ASCII && ! trans_shadow) ) + if ( (getEncoding() == fc::VT100 && ! flags.trans_shadow) + || (getEncoding() == fc::ASCII && ! flags.trans_shadow) ) { clearShadow(); return; @@ -1283,7 +1272,7 @@ void FWidget::drawShadow() , y1 = 1 , y2 = int(getHeight()); - if ( trans_shadow ) + if ( flags.trans_shadow ) { // transparent shadow drawTransparentShadow (x1, y1, x2, y2); diff --git a/src/fwindow.cpp b/src/fwindow.cpp index 2adcd7be..09834c93 100644 --- a/src/fwindow.cpp +++ b/src/fwindow.cpp @@ -93,16 +93,12 @@ bool FWindow::setWindowWidget (bool on) if ( isWindowWidget() == on ) return true; + flags.window_widget = on; + if ( on ) - { - flags |= fc::window_widget; setTermOffset(); - } else - { - flags &= ~fc::window_widget; setParentOffset(); - } return on; } @@ -179,29 +175,18 @@ void FWindow::unsetActiveWindow() //---------------------------------------------------------------------- bool FWindow::setResizeable (bool on) { - if ( on ) - flags |= fc::resizeable; - else - flags &= ~fc::resizeable; - - return on; + return (flags.resizeable = on); } //---------------------------------------------------------------------- bool FWindow::setTransparentShadow (bool on) { + flags.shadow = flags.trans_shadow = on; + if ( on ) - { - flags |= fc::shadow; - flags |= fc::trans_shadow; setShadowSize (2,1); - } else - { - flags &= ~fc::shadow; - flags &= ~fc::trans_shadow; setShadowSize (0,0); - } return on; } @@ -214,14 +199,14 @@ bool FWindow::setShadow (bool on) if ( on ) { - flags |= fc::shadow; - flags &= ~fc::trans_shadow; + flags.shadow = true; + flags.trans_shadow = false; setShadowSize (1,1); } else { - flags &= ~fc::shadow; - flags &= ~fc::trans_shadow; + flags.shadow = false; + flags.trans_shadow = false; setShadowSize (0,0); } @@ -234,10 +219,10 @@ bool FWindow::setAlwaysOnTop (bool on) if ( isAlwaysOnTop() == on ) return true; + flags.always_on_top = on; + if ( on ) { - flags |= fc::always_on_top; - if ( always_on_top_list ) { deleteFromAlwaysOnTopList (this); @@ -245,10 +230,7 @@ bool FWindow::setAlwaysOnTop (bool on) } } else - { - flags &= ~fc::always_on_top; deleteFromAlwaysOnTopList (this); - } return on; } @@ -580,10 +562,10 @@ void FWindow::swapWindow (FWidget* obj1, FWidget* obj2) if ( window_list->empty() ) return; - if ( (obj1->getFlags() & fc::modal) != 0 ) + if ( obj1->getFlags().modal ) return; - if ( (obj2->getFlags() & fc::modal) != 0 ) + if ( obj2->getFlags().modal ) return; iter = window_list->begin(); @@ -623,7 +605,7 @@ bool FWindow::raiseWindow (FWidget* obj) if ( window_list->back() == obj ) return false; - if ( (window_list->back()->getFlags() & fc::modal) != 0 + if ( window_list->back()->getFlags().modal && ! obj->isMenuWidget() ) return false; @@ -665,7 +647,7 @@ bool FWindow::lowerWindow (FWidget* obj) if ( window_list->front() == obj ) return false; - if ( (obj->getFlags() & fc::modal) != 0 ) + if ( obj->getFlags().modal ) return false; iter = window_list->begin(); diff --git a/src/include/final/fbutton.h b/src/include/final/fbutton.h index ca19690c..93814dde 100644 --- a/src/include/final/fbutton.h +++ b/src/include/final/fbutton.h @@ -265,7 +265,7 @@ inline bool FButton::unsetClickAnimation() //---------------------------------------------------------------------- inline bool FButton::isFlat() const -{ return ((flags & fc::flat) != 0); } +{ return flags.flat; } //---------------------------------------------------------------------- inline bool FButton::isDown() const @@ -273,7 +273,7 @@ inline bool FButton::isDown() const //---------------------------------------------------------------------- inline bool FButton::hasShadow() const -{ return ((flags & fc::shadow) != 0); } +{ return flags.shadow; } //---------------------------------------------------------------------- inline bool FButton::hasClickAnimation() diff --git a/src/include/final/fc.h b/src/include/final/fc.h index 9613c1f8..2d8ca33e 100644 --- a/src/include/final/fc.h +++ b/src/include/final/fc.h @@ -79,24 +79,6 @@ enum events Timer_Event // timer event occur }; -// Properties of a widget ⚑ -enum widget_flags -{ - shadow = 0x00000001, - trans_shadow = 0x00000002, - active = 0x00000004, - focus = 0x00000008, - scrollable = 0x00000010, - resizeable = 0x00000020, - modal = 0x00000040, - window_widget = 0x00000080, - dialog_widget = 0x00000100, - menu_widget = 0x00000200, - always_on_top = 0x00000400, - flat = 0x00000800, - no_underline = 0x00001000 -}; - // Internal character encoding enum encoding { diff --git a/src/include/final/fdialog.h b/src/include/final/fdialog.h index a129c9f5..c1540a77 100644 --- a/src/include/final/fdialog.h +++ b/src/include/final/fdialog.h @@ -282,11 +282,11 @@ inline void FDialog::setText (const FString& txt) //---------------------------------------------------------------------- inline bool FDialog::isModal() -{ return ((flags & fc::modal) != 0); } +{ return flags.modal; } //---------------------------------------------------------------------- inline bool FDialog::isScrollable() -{ return ((flags & fc::scrollable) != 0); } +{ return flags.scrollable; } } // namespace finalcut diff --git a/src/include/final/flineedit.h b/src/include/final/flineedit.h index ef71e174..45c065c3 100644 --- a/src/include/final/flineedit.h +++ b/src/include/final/flineedit.h @@ -227,7 +227,7 @@ inline bool FLineEdit::unsetShadow() //---------------------------------------------------------------------- inline bool FLineEdit::hasShadow() -{ return ((flags & fc::shadow) != 0); } +{ return flags.shadow; } } // namespace finalcut diff --git a/src/include/final/fprogressbar.h b/src/include/final/fprogressbar.h index c0861719..cc1bed21 100644 --- a/src/include/final/fprogressbar.h +++ b/src/include/final/fprogressbar.h @@ -129,7 +129,7 @@ inline bool FProgressbar::unsetShadow() //---------------------------------------------------------------------- inline bool FProgressbar::hasShadow() -{ return ((flags & fc::shadow) != 0); } +{ return flags.shadow; } } // namespace finalcut diff --git a/src/include/final/fwidget.h b/src/include/final/fwidget.h index 03caf45e..daa55ec2 100644 --- a/src/include/final/fwidget.h +++ b/src/include/final/fwidget.h @@ -142,6 +142,8 @@ class FWidget : public FVTerm, public FObject typedef void (FWidget::*FMemberCallback)(FWidget*, data_ptr); typedef std::vector Accelerators; + struct widget_flags; // forward declaration + // Constructor explicit FWidget (FWidget* = 0, bool = false); @@ -188,7 +190,7 @@ class FWidget : public FVTerm, public FObject const FRect& getTermGeometryWithShadow(); std::size_t getDesktopWidth(); std::size_t getDesktopHeight(); - int getFlags() const; + widget_flags getFlags() const; FPoint getCursorPos(); FPoint getPrintPos(); std::vector& doubleFlatLine_ref (fc::sides); @@ -373,7 +375,24 @@ class FWidget : public FVTerm, public FObject virtual void onClose (FCloseEvent*); // Data Members - int flags; + struct widget_flags // Properties of a widget ⚑ + { + uInt32 shadow : 1; + uInt32 trans_shadow : 1; + uInt32 active : 1; + uInt32 focus : 1; + uInt32 scrollable : 1; + uInt32 resizeable : 1; + uInt32 modal : 1; + uInt32 window_widget : 1; + uInt32 dialog_widget : 1; + uInt32 menu_widget : 1; + uInt32 always_on_top : 1; + uInt32 flat : 1; + uInt32 no_underline : 1; + uInt32 : 19; // padding bits + } flags; + static uInt modal_dialogs; static FWidgetColors wc; static widgetList* dialog_list; @@ -407,10 +426,8 @@ class FWidget : public FVTerm, public FObject static void setColorTheme(); // Data Members - bool enable; bool visible; bool shown; - bool focus; bool focusable; bool visible_cursor; FPoint widget_cursor_position; @@ -685,7 +702,7 @@ inline std::size_t FWidget::getDesktopHeight() { return getLineNumber(); } //---------------------------------------------------------------------- -inline int FWidget::getFlags() const +inline FWidget::widget_flags FWidget::getFlags() const { return flags; } //---------------------------------------------------------------------- @@ -873,19 +890,19 @@ inline bool FWidget::isShown() const //---------------------------------------------------------------------- inline bool FWidget::isWindowWidget() const -{ return ((flags & fc::window_widget) != 0); } +{ return flags.window_widget; } //---------------------------------------------------------------------- inline bool FWidget::isDialogWidget() const -{ return ((flags & fc::dialog_widget) != 0); } +{ return flags.dialog_widget; } //---------------------------------------------------------------------- inline bool FWidget::isMenuWidget() const -{ return ((flags & fc::menu_widget) != 0); } +{ return flags.menu_widget; } //---------------------------------------------------------------------- inline bool FWidget::isEnabled() const -{ return enable; } +{ return flags.active; } //---------------------------------------------------------------------- inline bool FWidget::hasVisibleCursor() const @@ -893,7 +910,7 @@ inline bool FWidget::hasVisibleCursor() const //---------------------------------------------------------------------- inline bool FWidget::hasFocus() const -{ return focus; } +{ return flags.focus; } //---------------------------------------------------------------------- inline bool FWidget::acceptFocus() const // is focusable diff --git a/src/include/final/fwindow.h b/src/include/final/fwindow.h index 5639fc51..ecc4a6d1 100644 --- a/src/include/final/fwindow.h +++ b/src/include/final/fwindow.h @@ -250,19 +250,19 @@ inline bool FWindow::isWindowActive() const //---------------------------------------------------------------------- inline bool FWindow::isResizeable() const -{ return ((flags & fc::resizeable) != 0); } +{ return flags.resizeable; } //---------------------------------------------------------------------- inline bool FWindow::isAlwaysOnTop() const -{ return ((flags & fc::always_on_top) != 0); } +{ return flags.always_on_top; } //---------------------------------------------------------------------- inline bool FWindow::hasTransparentShadow() const -{ return ((flags & fc::trans_shadow) != 0); } +{ return flags.trans_shadow; } //---------------------------------------------------------------------- inline bool FWindow::hasShadow() const -{ return ((flags & fc::shadow) != 0); } +{ return flags.shadow; } //---------------------------------------------------------------------- inline FWindow* FWindow::getWindowWidgetAt (const FPoint& pos)