diff --git a/src/Mod/TechDraw/App/Preferences.cpp b/src/Mod/TechDraw/App/Preferences.cpp index 99e31ed1f5..d06fcc469e 100644 --- a/src/Mod/TechDraw/App/Preferences.cpp +++ b/src/Mod/TechDraw/App/Preferences.cpp @@ -612,3 +612,32 @@ double Preferences::SnapLimitFactor() } +//! returns the key combination that simulates multiple selection. Traditionally Ctrl+pick, as that +//! is how QGraphicsScene implements multiple selection. This method is likely to only be used by +//! developers. +Qt::KeyboardModifiers Preferences::multiselectModifiers() +{ + uint iModifiers = getPreferenceGroup("General")->GetUnsigned("MultiselectModifiers", (uint)Qt::ControlModifier); + return (Qt::KeyboardModifiers)iModifiers; +// Qt::KeyboardModifiers testMods = Qt::ControlModifier; +// return testMods; +} + + +//! returns the key combination that modifies Balloon drag behaviour so that the bubble and leader +//! are moved together. Traditionally Ctrl+drag, but that can be in conflict with multi selection. +Qt::KeyboardModifiers Preferences::balloonDragModifiers() +{ + uint iModifiers = getPreferenceGroup("General")->GetUnsigned("BalloonDragModifier", (uint)Qt::ControlModifier); + return (Qt::KeyboardModifiers)iModifiers; +// Qt::KeyboardModifiers testMods = Qt::ShiftModifier | Qt::ControlModifier; +// return testMods; +} + + +void Preferences::setBalloonDragModifiers(Qt::KeyboardModifiers newModifiers) +{ + getPreferenceGroup("General")->SetUnsigned("BalloonDragModifier", (uint)newModifiers); +} + + diff --git a/src/Mod/TechDraw/App/Preferences.h b/src/Mod/TechDraw/App/Preferences.h index b4c46e945f..ab8b7d2f75 100644 --- a/src/Mod/TechDraw/App/Preferences.h +++ b/src/Mod/TechDraw/App/Preferences.h @@ -23,6 +23,7 @@ #ifndef Preferences_h_ #define Preferences_h_ +#include #include #include @@ -141,6 +142,11 @@ public: static bool SnapViews(); static double SnapLimitFactor(); + + static Qt::KeyboardModifiers multiselectModifiers(); + + static Qt::KeyboardModifiers balloonDragModifiers(); + static void setBalloonDragModifiers(Qt::KeyboardModifiers newModifiers); }; diff --git a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvanced.ui b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvanced.ui index 2897f27b27..ffa49c628e 100644 --- a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvanced.ui +++ b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvanced.ui @@ -6,8 +6,8 @@ 0 0 - 474 - 424 + 700 + 810 @@ -443,6 +443,149 @@ can be a performance penalty in complex models. + + + + <html><head/><body><p>Some combinations of OS and Navigation style key bindings may conflict with the default modifier keys for Ballon dragging and View snapping override. You can make adjustments here to find a non-conflicting key binding.</p></body></html> + + + Behaviour Overrides + + + + + + + + Check this box to use the default modifier keys. Uncheck this box to set a different key combination. + + + Use Default + + + true + + + + + + + Check this box to include the Shift key in the modifiers. + + + Shift + + + + + + + Check this box to use the default modifier keys. Uncheck this box to set a different key combination. + + + Use Default + + + true + + + + + + + Check this box to include the Shift key in the modifiers. + + + Shift + + + + + + + Check this box to include the Alt key in the modifiers. + + + Alt + + + + + + + Check this box to include the Meta/Start/Super key in the modifiers. + + + Meta + + + + + + + Balloon Drag + + + + + + + Snap Override + + + + + + + Check this box to include the Control key in the modifiers. + + + Control + + + + + + + Check this box to include the Control key in the modifiers. + + + Control + + + + + + + Check this box to include the Meta/Start/Super key in the modifiers. + + + Meta + + + + + + + Check this box to include the Alt key in the modifiers. + + + Alt + + + + + + + + + + + + + + + @@ -469,8 +612,8 @@ can be a performance penalty in complex models. - 17 - 1 + 20 + 40 diff --git a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvancedImp.cpp b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvancedImp.cpp index c3d3ea062e..b686b14aca 100644 --- a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvancedImp.cpp +++ b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvancedImp.cpp @@ -24,17 +24,21 @@ #include "PreCompiled.h" +#include #include "DlgPrefsTechDrawAdvancedImp.h" #include "ui_DlgPrefsTechDrawAdvanced.h" using namespace TechDrawGui; +using namespace TechDraw; DlgPrefsTechDrawAdvancedImp::DlgPrefsTechDrawAdvancedImp( QWidget* parent ) : PreferencePage( parent ) , ui(new Ui_DlgPrefsTechDrawAdvancedImp) { ui->setupUi(this); + + makeBalloonBoxConnections(); } DlgPrefsTechDrawAdvancedImp::~DlgPrefsTechDrawAdvancedImp() @@ -58,8 +62,40 @@ void DlgPrefsTechDrawAdvancedImp::saveSettings() ui->cbAutoCorrectRefs->onSave(); ui->cbNewFaceFinder->onSave(); ui->sbScrubCount->onSave(); + + saveBalloonOverride(); } + +void DlgPrefsTechDrawAdvancedImp::saveBalloonOverride() +{ + if (ui->cbBalloonDefault->isChecked()) { + Preferences::setBalloonDragModifiers(Qt::ControlModifier); + return; + } + + Qt::KeyboardModifiers result{Qt::NoModifier}; + + if (ui->cbBalloonShift->isChecked()) { + result |= Qt::ShiftModifier; + } + + if (ui->cbBalloonControl->isChecked()) { + result |= Qt::ControlModifier; + } + + if (ui->cbBalloonAlt->isChecked()) { + result |= Qt::AltModifier; + } + + if (ui->cbBalloonMeta->isChecked()) { + result |= Qt::MetaModifier; + } + + Preferences::setBalloonDragModifiers(result); +} + + void DlgPrefsTechDrawAdvancedImp::loadSettings() { ui->cbDetectFaces->onRestore(); @@ -76,18 +112,116 @@ void DlgPrefsTechDrawAdvancedImp::loadSettings() ui->cbAutoCorrectRefs->onRestore(); ui->cbNewFaceFinder->onRestore(); ui->sbScrubCount->onRestore(); + + loadBalloonOverride(); } +void DlgPrefsTechDrawAdvancedImp::loadBalloonOverride() +{ + uint prefOverride = Preferences::balloonDragModifiers(); + if (prefOverride == Qt::ControlModifier) { + // default case + ui->cbBalloonDefault->setChecked(true); + clearBalloonOptions(); + enableBalloonOptions(false); + return; + } + + ui->cbBalloonDefault->setChecked(false); + enableBalloonOptions(true); + + if (flagsContainValue(prefOverride, Qt::ShiftModifier)) { + ui->cbBalloonShift->setChecked(true); + } + if (flagsContainValue(prefOverride, Qt::ControlModifier)) { + ui->cbBalloonControl->setChecked(true); + } + + if (flagsContainValue(prefOverride, Qt::AltModifier)) { + ui->cbBalloonAlt->setChecked(true); + } + + if (flagsContainValue(prefOverride, Qt::MetaModifier)) { + ui->cbBalloonMeta->setChecked(true); + } +} + +//! true if bit pattern of value is found in flags. +bool DlgPrefsTechDrawAdvancedImp::flagsContainValue(uint flags, uint value) +{ + uint matchResult = flags & value; + if (matchResult == value) { + return true; + } + return false; +} + + +void DlgPrefsTechDrawAdvancedImp::clearBalloonOptions() +{ + ui->cbBalloonShift->setChecked(false); + ui->cbBalloonControl->setChecked(false); + ui->cbBalloonAlt->setChecked(false); + ui->cbBalloonMeta->setChecked(false); +} + + +void DlgPrefsTechDrawAdvancedImp::enableBalloonOptions(bool newState) +{ + ui->cbBalloonShift->setEnabled(newState); + ui->cbBalloonControl->setEnabled(newState); + ui->cbBalloonAlt->setEnabled(newState); + ui->cbBalloonMeta->setEnabled(newState); +} + + +void DlgPrefsTechDrawAdvancedImp::slotBalloonBoxChecked() +{ + if (ui->cbBalloonDefault->isChecked()) { + clearBalloonOptions(); + enableBalloonOptions(false); + } else { + enableBalloonOptions(true); + } + +} + + +void DlgPrefsTechDrawAdvancedImp::makeBalloonBoxConnections() +{ + connect(ui->cbBalloonDefault, + qOverload(&QCheckBox::stateChanged), + this, + &DlgPrefsTechDrawAdvancedImp::slotBalloonBoxChecked); + connect(ui->cbBalloonShift, + qOverload(&QCheckBox::stateChanged), + this, + &DlgPrefsTechDrawAdvancedImp::slotBalloonBoxChecked); + connect(ui->cbBalloonControl, + qOverload(&QCheckBox::stateChanged), + this, + &DlgPrefsTechDrawAdvancedImp::slotBalloonBoxChecked); + connect(ui->cbBalloonAlt, + qOverload(&QCheckBox::stateChanged), + this, + &DlgPrefsTechDrawAdvancedImp::slotBalloonBoxChecked); + connect(ui->cbBalloonMeta, + qOverload(&QCheckBox::stateChanged), + this, + &DlgPrefsTechDrawAdvancedImp::slotBalloonBoxChecked); +} + + /** * Sets the strings of the subwidgets using the current language. */ -void DlgPrefsTechDrawAdvancedImp::changeEvent(QEvent *e) +void DlgPrefsTechDrawAdvancedImp::changeEvent(QEvent *event) { - if (e->type() == QEvent::LanguageChange) { + if (event->type() == QEvent::LanguageChange) { ui->retranslateUi(this); } else { - QWidget::changeEvent(e); + QWidget::changeEvent(event); } } diff --git a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvancedImp.h b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvancedImp.h index cbdb05b32b..2970e45dd4 100644 --- a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvancedImp.h +++ b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawAdvancedImp.h @@ -44,7 +44,19 @@ public: protected: void saveSettings() override; void loadSettings() override; - void changeEvent(QEvent *e) override; + void changeEvent(QEvent *event) override; + + void loadBalloonOverride(); + void saveBalloonOverride(); + + void clearBalloonOptions(); + + static bool flagsContainValue(uint flags, uint value); + + void makeBalloonBoxConnections(); + void slotBalloonBoxChecked(); + void enableBalloonOptions(bool newState); + private: std::unique_ptr ui;