diff options
author | NickWingate <nick.wingate@collabora.com> | 2022-03-15 19:22:12 +0000 |
---|---|---|
committer | Gökay ŞATIR <gokaysatir@collabora.com> | 2022-04-20 10:23:22 +0200 |
commit | 7741b21f98e22a654962a5fdae165508cc90a7df (patch) | |
tree | 7fca3f5c1ad75b764ef837efc21a3bf89ca2a1f7 | |
parent | Fix regression in the iOS app (and possibly the Android and GTK apps) (diff) | |
download | core-7741b21f98e22a654962a5fdae165508cc90a7df.tar.gz core-7741b21f98e22a654962a5fdae165508cc90a7df.zip |
Make name dialog async
Including making the warning subdialog async
Signed-off-by: NickWingate <nick.wingate@collabora.com>
Change-Id: If3560a86ac349f0f6a5bc0ac19ba405ac4f04b36
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131654
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
-rw-r--r-- | cui/source/dialogs/dlgname.cxx | 12 | ||||
-rw-r--r-- | cui/source/factory/dlgfact.cxx | 26 | ||||
-rw-r--r-- | cui/source/factory/dlgfact.hxx | 9 | ||||
-rw-r--r-- | cui/source/inc/cuitabarea.hxx | 7 | ||||
-rw-r--r-- | cui/source/inc/dlgname.hxx | 8 | ||||
-rw-r--r-- | cui/source/tabpages/tpcolor.cxx | 55 | ||||
-rw-r--r-- | cui/uiconfig/ui/queryduplicatedialog.ui | 2 | ||||
-rw-r--r-- | include/svx/svxdlg.hxx | 2 | ||||
-rw-r--r-- | vcl/jsdialog/enabled.cxx | 4 | ||||
-rw-r--r-- | vcl/jsdialog/jsdialogbuilder.cxx | 1 |
10 files changed, 101 insertions, 25 deletions
diff --git a/cui/source/dialogs/dlgname.cxx b/cui/source/dialogs/dlgname.cxx index ffa540bbca5b..fd0e3953e98e 100644 --- a/cui/source/dialogs/dlgname.cxx +++ b/cui/source/dialogs/dlgname.cxx @@ -36,6 +36,18 @@ SvxNameDialog::SvxNameDialog(weld::Window* pParent, const OUString& rName, const m_xEdtName->select_region(0, -1); ModifyHdl(*m_xEdtName); m_xEdtName->connect_changed(LINK(this, SvxNameDialog, ModifyHdl)); + + m_xBtnOK->connect_clicked(LINK(this, SvxNameDialog, OkHdl)); +} + +IMPL_LINK_NOARG(SvxNameDialog, OkHdl, weld::Button&, void) +{ + if (m_aOkHdl.IsSet()) + { + m_aOkHdl.Call(*this); + return; + } + m_xDialog->response(RET_OK); } IMPL_LINK_NOARG(SvxNameDialog, ModifyHdl, weld::Entry&, void) diff --git a/cui/source/factory/dlgfact.cxx b/cui/source/factory/dlgfact.cxx index 7ee30c9b621a..ac715423dba3 100644 --- a/cui/source/factory/dlgfact.cxx +++ b/cui/source/factory/dlgfact.cxx @@ -221,6 +221,16 @@ short AbstractSvxNameDialog_Impl::Execute() return m_xDlg->run(); } +bool AbstractSvxNameDialog_Impl::StartExecuteAsync(AsyncContext &rCtx) +{ + return weld::DialogController::runAsync(m_xDlg, rCtx.maEndDialogFn); +} + +void AbstractSvxNameDialog_Impl::Response(int response) +{ + m_xDlg->response(response); +} + // #i68101# short AbstractSvxObjectNameDialog_Impl::Execute() { @@ -749,6 +759,15 @@ void AbstractSvxNameDialog_Impl::SetCheckNameHdl( const Link<AbstractSvxNameDial m_xDlg->SetCheckNameHdl( Link<SvxNameDialog&,bool>(), bCheckImmediately ); } +void AbstractSvxNameDialog_Impl::SetOkHdl(const Link<AbstractSvxNameDialog&, void>& rLink) +{ + aOkHdl = rLink; + if( rLink.IsSet() ) + m_xDlg->SetOkHdl( LINK(this, AbstractSvxNameDialog_Impl, OkHdl) ); + else + m_xDlg->SetOkHdl( Link<SvxNameDialog&, void>() ); +} + void AbstractSvxNameDialog_Impl::SetCheckNameTooltipHdl( const Link<AbstractSvxNameDialog&,OUString>& rLink) { aCheckNameTooltipHdl = rLink; @@ -778,6 +797,11 @@ IMPL_LINK_NOARG(AbstractSvxNameDialog_Impl, CheckNameHdl, SvxNameDialog&, bool) return aCheckNameHdl.Call(*this); } +IMPL_LINK_NOARG(AbstractSvxNameDialog_Impl, OkHdl, SvxNameDialog&, void) +{ + aOkHdl.Call(*this); +} + IMPL_LINK_NOARG(AbstractSvxNameDialog_Impl, CheckNameTooltipHdl, SvxNameDialog&, OUString) { return aCheckNameTooltipHdl.Call(*this); @@ -1258,7 +1282,7 @@ VclPtr<VclAbstractDialog> AbstractDialogFactory_Impl::CreateSvxEditDictionaryDia VclPtr<AbstractSvxNameDialog> AbstractDialogFactory_Impl::CreateSvxNameDialog(weld::Window* pParent, const OUString& rName, const OUString& rDesc) { - return VclPtr<AbstractSvxNameDialog_Impl>::Create(std::make_unique<SvxNameDialog>(pParent, rName, rDesc)); + return VclPtr<AbstractSvxNameDialog_Impl>::Create(std::make_shared<SvxNameDialog>(pParent, rName, rDesc)); } VclPtr<AbstractSvxObjectNameDialog> AbstractDialogFactory_Impl::CreateSvxObjectNameDialog(weld::Window* pParent, const OUString& rName) diff --git a/cui/source/factory/dlgfact.hxx b/cui/source/factory/dlgfact.hxx index b39e29efe821..c4679ba7b7e1 100644 --- a/cui/source/factory/dlgfact.hxx +++ b/cui/source/factory/dlgfact.hxx @@ -436,23 +436,28 @@ class SvxNameDialog; class AbstractSvxNameDialog_Impl :public AbstractSvxNameDialog { public: - explicit AbstractSvxNameDialog_Impl(std::unique_ptr<SvxNameDialog> p) + explicit AbstractSvxNameDialog_Impl(std::shared_ptr<SvxNameDialog> p) : m_xDlg(std::move(p)) { } virtual short Execute() override; + virtual bool StartExecuteAsync(AsyncContext &rCtx) override; virtual void GetName( OUString& rName ) override ; virtual void SetCheckNameHdl( const Link<AbstractSvxNameDialog&,bool>& rLink, bool bCheckImmediately = false ) override ; + virtual void SetOkHdl( const Link<AbstractSvxNameDialog&,void>& rLink ) override; + virtual void Response( int response ) override; virtual void SetCheckNameTooltipHdl( const Link<AbstractSvxNameDialog&, OUString>& rLink ) override ; virtual void SetEditHelpId(const OString&) override ; //from class Window virtual void SetHelpId( const OString& ) override ; virtual void SetText( const OUString& rStr ) override ; private: - std::unique_ptr<SvxNameDialog> m_xDlg; + std::shared_ptr<SvxNameDialog> m_xDlg; Link<AbstractSvxNameDialog&,bool> aCheckNameHdl; + Link<AbstractSvxNameDialog&,void> aOkHdl; Link<AbstractSvxNameDialog&,OUString> aCheckNameTooltipHdl; DECL_LINK(CheckNameHdl, SvxNameDialog&, bool); + DECL_LINK(OkHdl, SvxNameDialog&, void); DECL_LINK(CheckNameTooltipHdl, SvxNameDialog&, OUString); }; diff --git a/cui/source/inc/cuitabarea.hxx b/cui/source/inc/cuitabarea.hxx index a1927624f20d..ae5cc80664a3 100644 --- a/cui/source/inc/cuitabarea.hxx +++ b/cui/source/inc/cuitabarea.hxx @@ -27,6 +27,8 @@ #include <svx/SvxPresetListBox.hxx> #include <svx/PaletteManager.hxx> #include <svx/svdview.hxx> +#include <svx/svxdlg.hxx> +#include <dlgname.hxx> #define NO_BUTTON_SELECTED -1 @@ -647,6 +649,7 @@ private: PaletteManager maPaletteManager; SvxXRectPreview m_aCtlPreviewOld; SvxXRectPreview m_aCtlPreviewNew; + std::shared_ptr<weld::MessageDialogController> m_xWarnDialog; std::unique_ptr<SvxColorValueSet> m_xValSetColorList; std::unique_ptr<SvxColorValueSet> m_xValSetRecentList; std::unique_ptr<weld::ComboBox> m_xSelectPalette; @@ -680,6 +683,8 @@ private: std::unique_ptr<weld::CustomWeld> m_xValSetColorListWin; std::unique_ptr<weld::CustomWeld> m_xValSetRecentListWin; + VclPtr<AbstractSvxNameDialog> m_xNameDialog; + static void ConvertColorValues (Color& rColor, ColorModel eModell); static void RgbToCmyk_Impl( Color& rColor, sal_uInt16& rK ); static void CmykToRgb_Impl( Color& rColor, const sal_uInt16 nKey ); @@ -693,6 +698,8 @@ private: DECL_LINK(ClickWorkOnHdl_Impl, weld::Button&, void); DECL_LINK(ClickDeleteHdl_Impl, weld::Button&, void); + DECL_LINK(NameDialogOkHdl_Impl, AbstractSvxNameDialog&, void); + DECL_LINK(SelectPaletteLBHdl, weld::ComboBox&, void); DECL_LINK( SelectValSetHdl_Impl, ValueSet*, void ); DECL_LINK( SelectColorModeHdl_Impl, weld::ToggleButton&, void ); diff --git a/cui/source/inc/dlgname.hxx b/cui/source/inc/dlgname.hxx index 06e70562fc8d..ec6e361d8d55 100644 --- a/cui/source/inc/dlgname.hxx +++ b/cui/source/inc/dlgname.hxx @@ -27,11 +27,14 @@ private: std::unique_ptr<weld::Entry> m_xEdtName; std::unique_ptr<weld::Label> m_xFtDescription; std::unique_ptr<weld::Button> m_xBtnOK; + std::unique_ptr<weld::Button> m_xBtnCancel; Link<SvxNameDialog&, bool> m_aCheckNameHdl; + Link<SvxNameDialog&, void> m_aOkHdl; Link<SvxNameDialog&, OUString> m_aCheckNameTooltipHdl; DECL_LINK(ModifyHdl, weld::Entry&, void); + DECL_LINK(OkHdl, weld::Button&, void); public: SvxNameDialog(weld::Window* pWindow, const OUString& rName, const OUString& rDesc); @@ -60,6 +63,11 @@ public: m_xBtnOK->set_sensitive(rLink.Call(*this)); } + void SetOkHdl(const Link<SvxNameDialog&, void>& rLink) + { + m_aOkHdl = rLink; + } + void SetCheckNameTooltipHdl(const Link<SvxNameDialog&, OUString>& rLink) { m_aCheckNameTooltipHdl = rLink; diff --git a/cui/source/tabpages/tpcolor.cxx b/cui/source/tabpages/tpcolor.cxx index c9a6060f8169..46ecfefb4c4b 100644 --- a/cui/source/tabpages/tpcolor.cxx +++ b/cui/source/tabpages/tpcolor.cxx @@ -149,6 +149,9 @@ SvxColorTabPage::~SvxColorTabPage() m_xValSetRecentList.reset(); m_xValSetColorListWin.reset(); m_xValSetColorList.reset(); + + if (m_xNameDialog) + m_xNameDialog->Response(RET_CLOSE); } void SvxColorTabPage::ImpColorCountChanged() @@ -311,6 +314,10 @@ IMPL_LINK_NOARG(SvxColorTabPage, ModifiedHdl_Impl, weld::Entry&, void) IMPL_LINK_NOARG(SvxColorTabPage, ClickAddHdl_Impl, weld::Button&, void) { + // don't allow multiple name dialogs + if (m_xNameDialog) + m_xNameDialog->Response(RET_CLOSE); + OUString aNewName( SvxResId( RID_SVXSTR_COLOR ) ); OUString aDesc( CuiResId( RID_SVXSTR_DESC_COLOR ) ); OUString aName; @@ -325,29 +332,36 @@ IMPL_LINK_NOARG(SvxColorTabPage, ClickAddHdl_Impl, weld::Button&, void) } SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); - ScopedVclPtr<AbstractSvxNameDialog> pDlg(pFact->CreateSvxNameDialog(GetFrameWeld(), aName, aDesc)); - sal_uInt16 nError = 1; - - while (pDlg->Execute() == RET_OK) - { - pDlg->GetName( aName ); - - bValidColorName = (FindInCustomColors(aName) == -1); - if (bValidColorName) + m_xNameDialog = VclPtr<AbstractSvxNameDialog>(pFact->CreateSvxNameDialog(GetFrameWeld(), aName, aDesc)); + m_xNameDialog->SetOkHdl( LINK(this, SvxColorTabPage, NameDialogOkHdl_Impl)); + m_xNameDialog->StartExecuteAsync([&](sal_Int32){ + if (m_xWarnDialog) { - nError = 0; - break; + m_xWarnDialog->response(RET_CLOSE); } + m_xNameDialog->disposeOnce(); + }); +} - std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(GetFrameWeld(), "cui/ui/queryduplicatedialog.ui")); - std::unique_ptr<weld::MessageDialog> xWarnBox(xBuilder->weld_message_dialog("DuplicateNameDialog")); - if (xWarnBox->run() != RET_OK) - break; - } +IMPL_LINK(SvxColorTabPage, NameDialogOkHdl_Impl, AbstractSvxNameDialog&, rDialog, void) +{ + OUString aName; + rDialog.GetName(aName); + bool bValidColorName; - pDlg.disposeAndClear(); + bValidColorName = (FindInCustomColors(aName) == -1); - if (!nError) + if (!bValidColorName) + { + // close the old if already exists to bring it on top + if (m_xWarnDialog) + m_xWarnDialog->response(RET_CLOSE); + + m_xWarnDialog = std::make_shared<weld::MessageDialogController>( + GetFrameWeld(), "cui/ui/queryduplicatedialog.ui", "DuplicateNameDialog"); + weld::MessageDialogController::runAsync(m_xWarnDialog, [](sal_Int32) {}); + } + else { m_xSelectPalette->set_active(0); SelectPaletteLBHdl(*m_xSelectPalette); @@ -368,9 +382,10 @@ IMPL_LINK_NOARG(SvxColorTabPage, ClickAddHdl_Impl, weld::Button&, void) m_xBtnDelete->set_sensitive(false); m_xBtnDelete->set_tooltip_text( SvxResId(RID_SVXSTR_DELETEUSERCOLOR2) ); ImpColorCountChanged(); - } - UpdateModified(); + UpdateModified(); + rDialog.Response(RET_CLOSE); + } } IMPL_LINK_NOARG(SvxColorTabPage, ClickWorkOnHdl_Impl, weld::Button&, void) diff --git a/cui/uiconfig/ui/queryduplicatedialog.ui b/cui/uiconfig/ui/queryduplicatedialog.ui index 54dd9bde6daa..e2acd0fb3acf 100644 --- a/cui/uiconfig/ui/queryduplicatedialog.ui +++ b/cui/uiconfig/ui/queryduplicatedialog.ui @@ -32,4 +32,4 @@ </object> </child> </object> -</interface> +</interface>
\ No newline at end of file diff --git a/include/svx/svxdlg.hxx b/include/svx/svxdlg.hxx index 9d0b322a4374..a7dd0b30b20a 100644 --- a/include/svx/svxdlg.hxx +++ b/include/svx/svxdlg.hxx @@ -165,6 +165,8 @@ protected: public: virtual void GetName( OUString& rName ) = 0; virtual void SetCheckNameHdl( const Link<AbstractSvxNameDialog&,bool>& rLink, bool bCheckImmediately = false ) = 0; + virtual void SetOkHdl( const Link<AbstractSvxNameDialog&,void>& rLink ) = 0; + virtual void Response( int response ) = 0; virtual void SetCheckNameTooltipHdl( const Link<AbstractSvxNameDialog&,OUString>& rLink ) = 0; virtual void SetEditHelpId(const OString&) = 0; //from class Window diff --git a/vcl/jsdialog/enabled.cxx b/vcl/jsdialog/enabled.cxx index 64ce33400839..a9af4cfbecaa 100644 --- a/vcl/jsdialog/enabled.cxx +++ b/vcl/jsdialog/enabled.cxx @@ -59,7 +59,9 @@ bool isBuilderEnabled(const OUString& rUIFile, bool bMobile) || rUIFile == "xmlsec/ui/viewcertdialog.ui" || rUIFile == "xmlsec/ui/certgeneral.ui" || rUIFile == "xmlsec/ui/viewcertdialog.ui" || rUIFile == "xmlsec/ui/certpage.ui" || rUIFile == "svx/ui/accessibilitycheckdialog.ui" - || rUIFile == "svx/ui/accessibilitycheckentry.ui") + || rUIFile == "svx/ui/accessibilitycheckentry.ui" + || rUIFile == "cui/ui/namedialog.ui" + || rUIFile == "cui/ui/queryduplicatedialog.ui") { return true; } diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 7608d722f237..f99367d1f4b8 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -829,6 +829,7 @@ std::unique_ptr<weld::MessageDialog> JSInstanceBuilder::weld_message_dialog(cons m_bHasTopLevelDialog = true; initializeSender(GetNotifierWindow(), GetContentWindow(), GetTypeOfJSON()); + sendFullUpdate(); } pRet.reset(pMessageDialog ? new JSMessageDialog(this, pMessageDialog, this, false) : nullptr); |