summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNickWingate <nick.wingate@collabora.com>2022-03-15 19:22:12 +0000
committerGökay ŞATIR <gokaysatir@collabora.com>2022-04-20 10:23:22 +0200
commit7741b21f98e22a654962a5fdae165508cc90a7df (patch)
tree7fca3f5c1ad75b764ef837efc21a3bf89ca2a1f7
parentFix regression in the iOS app (and possibly the Android and GTK apps) (diff)
downloadcore-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.cxx12
-rw-r--r--cui/source/factory/dlgfact.cxx26
-rw-r--r--cui/source/factory/dlgfact.hxx9
-rw-r--r--cui/source/inc/cuitabarea.hxx7
-rw-r--r--cui/source/inc/dlgname.hxx8
-rw-r--r--cui/source/tabpages/tpcolor.cxx55
-rw-r--r--cui/uiconfig/ui/queryduplicatedialog.ui2
-rw-r--r--include/svx/svxdlg.hxx2
-rw-r--r--vcl/jsdialog/enabled.cxx4
-rw-r--r--vcl/jsdialog/jsdialogbuilder.cxx1
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);