From 9ba7fc6178c716a9cd877775da5fee3d3b94a911 Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Tue, 27 Apr 2021 11:51:53 +0200 Subject: [PATCH] Code optimization at widget focus --- ChangeLog | 3 +++ src/fbutton.cpp | 13 +----------- src/fcombobox.cpp | 32 ++++-------------------------- src/flabel.cpp | 31 ++++------------------------- src/flineedit.cpp | 38 +++--------------------------------- src/flistbox.cpp | 19 +----------------- src/flistview.cpp | 13 +----------- src/fscrollbar.cpp | 3 +++ src/fspinbox.cpp | 14 +------------ src/ftextview.cpp | 16 +-------------- src/ftogglebutton.cpp | 14 +------------ src/fwidget_functions.cpp | 19 ++++++++++++++++++ src/include/final/flistbox.h | 1 - src/include/final/flog.h | 4 ++-- src/include/final/fwidget.h | 1 + 15 files changed, 45 insertions(+), 176 deletions(-) diff --git a/ChangeLog b/ChangeLog index b0f05bd6..5725e959 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2021-04-27 Markus Gans + * Code optimization at widget focus + 2021-04-24 Markus Gans * Fixed mutex deadlock in FLogger diff --git a/src/fbutton.cpp b/src/fbutton.cpp index 6203c1c7..442baadb 100644 --- a/src/fbutton.cpp +++ b/src/fbutton.cpp @@ -284,18 +284,7 @@ void FButton::onMouseDown (FMouseEvent* ev) return; } - if ( ! hasFocus() ) - { - auto focused_widget = getFocusWidget(); - setFocus(); - - if ( focused_widget ) - focused_widget->redraw(); - - if ( getStatusBar() ) - getStatusBar()->drawMessage(); - } - + setWidgetFocus(this); const FPoint tPos{ev->getTermPos()}; if ( getTermGeometry().contains(tPos) ) diff --git a/src/fcombobox.cpp b/src/fcombobox.cpp index a058844d..f0f4f135 100644 --- a/src/fcombobox.cpp +++ b/src/fcombobox.cpp @@ -396,26 +396,15 @@ void FComboBox::onMouseDown (FMouseEvent* ev) if ( ev->getButton() != MouseButton::Left ) return; - if ( ! hasFocus() ) - { - auto focused_widget = getFocusWidget(); - setFocus(); - - if ( focused_widget ) - focused_widget->redraw(); - - redraw(); - - if ( getStatusBar() ) - getStatusBar()->drawMessage(); - } - + setWidgetFocus(this); const int mouse_x = ev->getX(); const int mouse_y = ev->getY(); if ( mouse_x >= int(getWidth()) - nf && mouse_x <= int(getWidth()) && mouse_y == 1 ) { + redraw(); + if ( list_window.isHidden() ) showDropDown(); else @@ -633,20 +622,7 @@ void FComboBox::cb_inputFieldSwitch() } else if ( ! is_editable ) { - if ( ! hasFocus() ) - { - auto focused_widget = getFocusWidget(); - setFocus(); - - if ( focused_widget ) - focused_widget->redraw(); - - redraw(); - - if ( getStatusBar() ) - getStatusBar()->drawMessage(); - } - + setWidgetFocus(this); showDropDown(); } } diff --git a/src/flabel.cpp b/src/flabel.cpp index c678f9e3..085a6fd3 100644 --- a/src/flabel.cpp +++ b/src/flabel.cpp @@ -184,20 +184,7 @@ void FLabel::onMouseDown (FMouseEvent* ev) return; } - if ( ! accel_widget->hasFocus() ) - { - // focus the accelerator widget - auto focused_widget = getFocusWidget(); - accel_widget->setFocus(); - - if ( focused_widget ) - focused_widget->redraw(); - - accel_widget->redraw(); - - if ( getStatusBar() ) - accel_widget->getStatusBar()->drawMessage(); - } + setWidgetFocus(accel_widget); // focus the accelerator widget } //---------------------------------------------------------------------- @@ -208,19 +195,9 @@ void FLabel::onAccel (FAccelEvent* ev) if ( ! accel_widget->hasFocus() ) { - auto focused_widget = ev->focusedWidget(); - - if ( focused_widget && focused_widget->isWidget() ) - { - accel_widget->setFocus(); - focused_widget->redraw(); - accel_widget->redraw(); - FFocusEvent in (Event::FocusIn); - FApplication::sendEvent(accel_widget, &in); - - if ( getStatusBar() ) - accel_widget->getStatusBar()->drawMessage(); - } + setWidgetFocus(accel_widget); + FFocusEvent in (Event::FocusIn); + FApplication::sendEvent(accel_widget, &in); } ev->accept(); diff --git a/src/flineedit.cpp b/src/flineedit.cpp index 91cd2781..2127470c 100644 --- a/src/flineedit.cpp +++ b/src/flineedit.cpp @@ -328,20 +328,7 @@ void FLineEdit::onMouseDown (FMouseEvent* ev) if ( ev->getButton() != MouseButton::Left || isReadOnly() ) return; - if ( ! hasFocus() ) - { - auto focused_widget = getFocusWidget(); - setFocus(); - - if ( focused_widget ) - focused_widget->redraw(); - - redraw(); - - if ( getStatusBar() ) - getStatusBar()->drawMessage(); - } - + setWidgetFocus(this); const int mouse_x = ev->getX(); const int mouse_y = ev->getY(); const int xmin = 2 + int(char_width_offset); @@ -494,21 +481,7 @@ void FLineEdit::onAccel (FAccelEvent* ev) if ( ! isEnabled() ) return; - if ( ! hasFocus() ) - { - auto focused_widget = ev->focusedWidget(); - - if ( focused_widget && focused_widget->isWidget() ) - { - setFocus(); - focused_widget->redraw(); - redraw(); - - if ( getStatusBar() ) - getStatusBar()->drawMessage(); - } - } - + setWidgetFocus(this); ev->accept(); } @@ -1116,12 +1089,7 @@ inline wchar_t FLineEdit::characterFilter (const wchar_t c) const //---------------------------------------------------------------------- void FLineEdit::processActivate() { - if ( ! hasFocus() ) - { - setFocus(); - redraw(); - } - + setWidgetFocus(this); emitCallback("activate"); } diff --git a/src/flistbox.cpp b/src/flistbox.cpp index fc1dc78c..5ca7472d 100644 --- a/src/flistbox.cpp +++ b/src/flistbox.cpp @@ -313,8 +313,7 @@ void FListBox::onMouseDown (FMouseEvent* ev) if ( ev->getButton() == MouseButton::Right && ! isMultiSelection() ) return; - getWidgetFocus(); - + setWidgetFocus(this); const int yoffset_before = yoffset; const std::size_t current_before = current; const int mouse_x = ev->getX(); @@ -1104,22 +1103,6 @@ void FListBox::recalculateVerticalBar (std::size_t element_count) const } } -//---------------------------------------------------------------------- -inline void FListBox::getWidgetFocus() -{ - if ( hasFocus() ) - return; - - auto focused_widget = getFocusWidget(); - setFocus(); - - if ( focused_widget ) - focused_widget->redraw(); - - if ( getStatusBar() ) - getStatusBar()->drawMessage(); -} - //---------------------------------------------------------------------- void FListBox::multiSelection (std::size_t pos) { diff --git a/src/flistview.cpp b/src/flistview.cpp index 3bb6964c..a91a09ed 100644 --- a/src/flistview.cpp +++ b/src/flistview.cpp @@ -1006,18 +1006,7 @@ void FListView::onMouseDown (FMouseEvent* ev) return; } - if ( ! hasFocus() ) - { - auto focused_widget = getFocusWidget(); - setFocus(); - - if ( focused_widget ) - focused_widget->redraw(); - - if ( getStatusBar() ) - getStatusBar()->drawMessage(); - } - + setWidgetFocus(this); const int mouse_x = ev->getX(); const int mouse_y = ev->getY(); first_line_position_before = first_visible_line.getPosition(); diff --git a/src/fscrollbar.cpp b/src/fscrollbar.cpp index 24046eba..cabe0111 100644 --- a/src/fscrollbar.cpp +++ b/src/fscrollbar.cpp @@ -25,6 +25,7 @@ #include "final/fevent.h" #include "final/fscrollbar.h" #include "final/fsize.h" +#include "final/fstatusbar.h" #include "final/fwidgetcolors.h" namespace finalcut @@ -246,6 +247,8 @@ void FScrollbar::onMouseDown (FMouseEvent* ev) && ev->getButton() != MouseButton::Middle ) return; + setWidgetFocus(getParentWidget()); + if ( min == max ) return; diff --git a/src/fspinbox.cpp b/src/fspinbox.cpp index 69ba71a4..602a17c5 100644 --- a/src/fspinbox.cpp +++ b/src/fspinbox.cpp @@ -419,19 +419,7 @@ void FSpinBox::processChanged() const //---------------------------------------------------------------------- void FSpinBox::forceFocus() { - if ( hasFocus() ) - return; - - auto focused_widget = getFocusWidget(); - setFocus(); - - if ( focused_widget ) - focused_widget->redraw(); - - redraw(); - - if ( getStatusBar() ) - getStatusBar()->drawMessage(); + setWidgetFocus(this); } //---------------------------------------------------------------------- diff --git a/src/ftextview.cpp b/src/ftextview.cpp index 88dfc193..87651bcd 100644 --- a/src/ftextview.cpp +++ b/src/ftextview.cpp @@ -348,18 +348,7 @@ void FTextView::onMouseDown (FMouseEvent* ev) if ( ev->getButton() != MouseButton::Left ) return; - if ( ! hasFocus() ) - { - FWidget* focused_widget = getFocusWidget(); - setFocus(); - - if ( focused_widget ) - focused_widget->redraw(); - - if ( getStatusBar() ) - getStatusBar()->drawMessage(); - } - + setWidgetFocus(this); auto parent = getParentWidget(); if ( ! parent ) @@ -374,7 +363,6 @@ void FTextView::onMouseDown (FMouseEvent* ev) const auto b = ev->getButton(); const auto& tp = ev->getTermPos(); const auto& p = parent->termToWidgetPos(tp); - parent->setFocus(); const auto& _ev = \ std::make_shared(Event::MouseDown, p, tp, b); FApplication::sendEvent (parent, _ev.get()); @@ -395,7 +383,6 @@ void FTextView::onMouseUp (FMouseEvent* ev) const auto b = ev->getButton(); const auto& tp = ev->getTermPos(); const auto& p = parent->termToWidgetPos(tp); - parent->setFocus(); const auto& _ev = \ std::make_shared(Event::MouseUp, p, tp, b); FApplication::sendEvent (parent, _ev.get()); @@ -420,7 +407,6 @@ void FTextView::onMouseMove (FMouseEvent* ev) const auto b = ev->getButton(); const auto& tp = ev->getTermPos(); const auto& p = parent->termToWidgetPos(tp); - parent->setFocus(); const auto& _ev = \ std::make_shared(Event::MouseMove, p, tp, b); FApplication::sendEvent (parent, _ev.get()); diff --git a/src/ftogglebutton.cpp b/src/ftogglebutton.cpp index deaa9153..a69633e8 100644 --- a/src/ftogglebutton.cpp +++ b/src/ftogglebutton.cpp @@ -210,19 +210,7 @@ void FToggleButton::onMouseDown (FMouseEvent* ev) if ( ev->getButton() != MouseButton::Left ) return; - if ( hasFocus() ) - return; - - auto focused_widget = getFocusWidget(); - setFocus(); - - if ( focused_widget ) - focused_widget->redraw(); - - redraw(); - - if ( getStatusBar() ) - getStatusBar()->drawMessage(); + setWidgetFocus(this); } //---------------------------------------------------------------------- diff --git a/src/fwidget_functions.cpp b/src/fwidget_functions.cpp index 2c8405ac..a2d91a6d 100644 --- a/src/fwidget_functions.cpp +++ b/src/fwidget_functions.cpp @@ -22,6 +22,7 @@ #include "final/fapplication.h" #include "final/fcolorpair.h" +#include "final/fstatusbar.h" #include "final/fstyle.h" #include "final/fwidget.h" #include "final/fwidgetcolors.h" @@ -142,6 +143,24 @@ void setHotkeyViaString (FWidget* w, const FString& text) w->delAccelerator(); } +//---------------------------------------------------------------------- +void setWidgetFocus (FWidget* widget) +{ + if ( ! widget || widget->hasFocus() ) + return; + + auto focused_widget = FWidget::getFocusWidget(); + widget->setFocus(); + + if ( focused_widget && focused_widget->isWidget() ) // old focused widget + focused_widget->redraw(); + + widget->redraw(); + + if ( FWidget::getStatusBar() ) + FWidget::getStatusBar()->drawMessage(); +} + //---------------------------------------------------------------------- void drawShadow (FWidget* w) { diff --git a/src/include/final/flistbox.h b/src/include/final/flistbox.h index e8151aa9..d4237781 100644 --- a/src/include/final/flistbox.h +++ b/src/include/final/flistbox.h @@ -311,7 +311,6 @@ class FListBox : public FWidget void updateDrawing (bool, bool); void recalculateHorizontalBar (std::size_t, bool); void recalculateVerticalBar (std::size_t) const; - void getWidgetFocus(); void multiSelection (std::size_t); void multiSelectionUpTo (std::size_t); void wheelUp (int); diff --git a/src/include/final/flog.h b/src/include/final/flog.h index 5fe5d3e8..aa01f979 100644 --- a/src/include/final/flog.h +++ b/src/include/final/flog.h @@ -100,7 +100,7 @@ class FLog : public std::stringbuf int sync() override; const LogLevel& getLevel() const; LogLevel& setLevel(); - const LineEnding& getEnding(); + const LineEnding& getEnding() const; LineEnding& setEnding(); private: @@ -151,7 +151,7 @@ inline FLog::LogLevel& FLog::setLevel() } //---------------------------------------------------------------------- -inline const FLog::LineEnding& FLog::getEnding() +inline const FLog::LineEnding& FLog::getEnding() const { return end_of_line; } diff --git a/src/include/final/fwidget.h b/src/include/final/fwidget.h index 47a0bc8a..aa409340 100644 --- a/src/include/final/fwidget.h +++ b/src/include/final/fwidget.h @@ -510,6 +510,7 @@ bool isFocusPrevKey (const FKey); FKey getHotkey (const FString&); std::size_t getHotkeyPos (const FString& src, FString& dest); void setHotkeyViaString (FWidget*, const FString&); +void setWidgetFocus (FWidget*); void drawShadow (FWidget*); void drawTransparentShadow (FWidget*); void drawBlockShadow (FWidget*);