diff --git a/toonz/sources/include/toonz/preferences.h b/toonz/sources/include/toonz/preferences.h index 9d9bbfe..e674acd 100644 --- a/toonz/sources/include/toonz/preferences.h +++ b/toonz/sources/include/toonz/preferences.h @@ -231,6 +231,9 @@ public: } void setColorCalibrationLutPath(QString monitorName, QString path); QString getColorCalibrationLutPath(QString &monitorName) const; + bool isKeepTextboxFocus() const { + return getBoolValue(keepTextboxFocus); + } // Visualization tab bool getShow0ThickLines() const { return getBoolValue(show0ThickLines); } diff --git a/toonz/sources/include/toonz/preferencesitemids.h b/toonz/sources/include/toonz/preferencesitemids.h index 86bf502..1906f2e 100644 --- a/toonz/sources/include/toonz/preferencesitemids.h +++ b/toonz/sources/include/toonz/preferencesitemids.h @@ -45,6 +45,7 @@ enum PreferencesItemId { interfaceFontStyle, colorCalibrationEnabled, colorCalibrationLutPaths, + keepTextboxFocus, //---------- // Visualization diff --git a/toonz/sources/toonz/pane.cpp b/toonz/sources/toonz/pane.cpp index 463ae26..15a5e9f 100644 --- a/toonz/sources/toonz/pane.cpp +++ b/toonz/sources/toonz/pane.cpp @@ -32,6 +32,7 @@ #include #include #include +#include extern TEnv::StringVar EnvSafeAreaName; @@ -127,7 +128,24 @@ void TPanel::enterEvent(QEvent *event) { // Only when Toonz application is active QWidget *w = qApp->activeWindow(); if (w) { - widgetFocusOnEnter(); + // grab the focus, unless a line-edit is focused currently and the + // preference is set + bool shouldSetFocus = true; + + if (Preferences::instance()->isKeepTextboxFocus()) { + QWidget *focusWidget = qApp->focusWidget(); + if (focusWidget) { + QLineEdit *lineEdit = dynamic_cast(focusWidget); + if (lineEdit) { + shouldSetFocus = false; + } + } + } + + if (shouldSetFocus) { + widgetFocusOnEnter(); + } + // Some panels (e.g. Viewer, StudioPalette, Palette, ColorModel) are // activated when mouse enters. Viewer is activatable only when being // docked. diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index 82d5de0..9eb0dff 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -971,6 +971,7 @@ QString PreferencesPopup::getUIString(PreferencesItemId id) { {colorCalibrationLutPaths, tr("3DLUT File for [%1] *:") .arg(LutManager::instance()->getMonitorName())}, + {keepTextboxFocus, tr("Keep Textbox Focus When Moving Mouse to Another Panel")}, // Visualization {show0ThickLines, tr("Show Lines with Thickness 0")}, @@ -1417,6 +1418,7 @@ QWidget* PreferencesPopup::createInterfacePage() { insertUI(interfaceFontStyle, lay, buildFontStyleList()); QGridLayout* colorCalibLay = insertGroupBoxUI(colorCalibrationEnabled, lay); { insertUI(colorCalibrationLutPaths, colorCalibLay); } + insertUI(keepTextboxFocus, lay); lay->setRowStretch(lay->rowCount(), 1); insertFootNote(lay); diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index 6539fc6..18b19ce 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -431,7 +431,24 @@ void SceneViewer::onEnter() { tool->onEnter(); } - setFocus(); + // grab the focus, unless a line-edit is focused currently and the + // preference is set + bool shouldSetFocus = true; + + if (Preferences::instance()->isKeepTextboxFocus()) { + QWidget *focusWidget = qApp->focusWidget(); + if (focusWidget) { + QLineEdit *lineEdit = dynamic_cast(focusWidget); + if (lineEdit) { + shouldSetFocus = false; + } + } + } + + if (shouldSetFocus) { + setFocus(); + } + update(); } diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index 8212ccf..684e939 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -407,6 +407,8 @@ void Preferences::definePreferenceItems() { false); define(colorCalibrationLutPaths, "colorCalibrationLutPaths", QMetaType::QVariantMap, QVariantMap()); + define(keepTextboxFocus, "keepTextboxFocus", + QMetaType::Bool, false); setCallBack(pixelsOnly, &Preferences::setPixelsOnly); setCallBack(linearUnits, &Preferences::setUnits);