Fix a crash when a script generates a Fg/BgColor change when closing the app

If a script Dialog changes the app.fgColor/bgColor in its onclose
callback, it will notify all fgColor/bgColor preference
observers (ContextBar is one of them), if we don't disconnect from
these signals when we're deleting ContextBar, the signals will call a
deleted slot/connection from app::script::close_all_dialogs().
This commit is contained in:
David Capello 2022-06-08 16:24:36 -03:00
parent def9752199
commit 1630416991
2 changed files with 13 additions and 8 deletions

View File

@ -854,7 +854,7 @@ public:
: ButtonSet(1) { : ButtonSet(1) {
addItem(SkinTheme::get(this)->parts.pivotCenter()); addItem(SkinTheme::get(this)->parts.pivotCenter());
Preferences::instance().selection.pivotPosition.AfterChange.connect( m_pivotConn = Preferences::instance().selection.pivotPosition.AfterChange.connect(
[this]{ onPivotChange(); }); [this]{ onPivotChange(); });
onPivotChange(); onPivotChange();
@ -925,6 +925,7 @@ private:
getItem(0)->setIcon(part); getItem(0)->setIcon(part);
} }
obs::scoped_connection m_pivotConn;
}; };
class ContextBar::RotAlgorithmField : public ComboBox { class ContextBar::RotAlgorithmField : public ComboBox {
@ -1586,17 +1587,16 @@ ContextBar::ContextBar(TooltipManager* tooltipManager,
UIContext::instance()->add_observer(this); UIContext::instance()->add_observer(this);
auto& pref = Preferences::instance(); auto& pref = Preferences::instance();
pref.symmetryMode.enabled.AfterChange.connect(
m_symmModeConn = pref.symmetryMode.enabled.AfterChange.connect(
[this]{ onSymmetryModeChange(); }); [this]{ onSymmetryModeChange(); });
pref.colorBar.fgColor.AfterChange.connect( m_fgColorConn = pref.colorBar.fgColor.AfterChange.connect(
[this]{ onFgOrBgColorChange(doc::Brush::ImageColor::MainColor); }); [this]{ onFgOrBgColorChange(doc::Brush::ImageColor::MainColor); });
pref.colorBar.bgColor.AfterChange.connect( m_bgColorConn = pref.colorBar.bgColor.AfterChange.connect(
[this]{ onFgOrBgColorChange(doc::Brush::ImageColor::BackgroundColor); }); [this]{ onFgOrBgColorChange(doc::Brush::ImageColor::BackgroundColor); });
m_keysConn = KeyboardShortcuts::instance()->UserChange.connect(
KeyboardShortcuts::instance()->UserChange.connect(
[this, tooltipManager]{ setupTooltips(tooltipManager); }); [this, tooltipManager]{ setupTooltips(tooltipManager); });
m_dropPixelsConn = m_dropPixels->DropPixels.connect(&ContextBar::onDropPixels, this);
m_dropPixels->DropPixels.connect(&ContextBar::onDropPixels, this);
setActiveBrush(createBrushFromPreferences()); setActiveBrush(createBrushFromPreferences());

View File

@ -196,6 +196,11 @@ namespace app {
ui::Label* m_selectBoxHelp; ui::Label* m_selectBoxHelp;
SymmetryField* m_symmetry; SymmetryField* m_symmetry;
SliceFields* m_sliceFields; SliceFields* m_sliceFields;
obs::scoped_connection m_symmModeConn;
obs::scoped_connection m_fgColorConn;
obs::scoped_connection m_bgColorConn;
obs::scoped_connection m_keysConn;
obs::scoped_connection m_dropPixelsConn;
obs::scoped_connection m_sizeConn; obs::scoped_connection m_sizeConn;
obs::scoped_connection m_angleConn; obs::scoped_connection m_angleConn;
obs::scoped_connection m_opacityConn; obs::scoped_connection m_opacityConn;