From 4f1121255ebac035a439d242b47c2f81124418c3 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Tue, 7 Nov 2023 08:31:29 +0100 Subject: [PATCH] sw floattable, insert UI: fix default frame width when inserting a new one Insert -> Frame -> Frame presented a dialog which stated the width of the new frame will be 2cm, but the width was ~zero. This is a regression from commit 9da7b1592e010928c26c43ee93b91cdd66403985 (sw: remove all uses of MM50 with (added) o3tl::toTwip, 2021-07-23). Previously the code worked because the 2cm was speficified as MM50*4 (283*4=1132 twips), and we compared this to the 2cm from the UI, which had no rounding errors (283.46456692913387*4=1134 twips), and this 1132 vs 1134 meant the dialog put the unchanged size to the output item set. Now we don't have rounding errors anymore, so we have 1134 everywhere, which means the dialog doesn't specify a default size, but no other code would do it, resulting in a frame with minimal width, which is clearly not wanted. Fix the problem by checking if this will be a new frame, and if so, the dialog should send the default size to the caller, even if the user didn't customize the size. This restores the lost 2cm default width while keeping the rounding improvements. This requires running the test in its own process, because the measurement unit is only loaded once from the config and the rounding error is not hit with the default inches. Change-Id: I9a5945fdd0e5cd64ff8bd84f95f11be5277b8d18 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159050 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- sw/UITest_sw_ui_frmdlg.mk | 2 ++ sw/qa/uitest/ui/frmdlg/frmdlg.py | 18 ++++++++++++++++++ sw/source/ui/frmdlg/frmpage.cxx | 8 +++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/sw/UITest_sw_ui_frmdlg.mk b/sw/UITest_sw_ui_frmdlg.mk index 0fae8bf25f1d..219a72ddfae3 100644 --- a/sw/UITest_sw_ui_frmdlg.mk +++ b/sw/UITest_sw_ui_frmdlg.mk @@ -15,4 +15,6 @@ $(eval $(call gb_UITest_set_defs,sw_ui_frmdlg, \ TDOC="$(SRCDIR)/sw/qa/uitest/data" \ )) +$(eval $(call gb_UITest_avoid_oneprocess,sw_ui_frmdlg)) + # vim: set noet sw=4 ts=4: diff --git a/sw/qa/uitest/ui/frmdlg/frmdlg.py b/sw/qa/uitest/ui/frmdlg/frmdlg.py index e3aeb67c569c..e30b67ff5313 100644 --- a/sw/qa/uitest/ui/frmdlg/frmdlg.py +++ b/sw/qa/uitest/ui/frmdlg/frmdlg.py @@ -62,4 +62,22 @@ class Test(UITestCase): # and floating tables. self.assertEqual(get_state_as_dict(xFlysplit)['Visible'], "false") + def test_insert_frame_dialog(self): + # Change from inch to cm to hit the rounding error. 2 means Centimeter, see + # officecfg/registry/schema/org/openoffice/Office/Writer.xcs. + with self.ui_test.set_config('/org.openoffice.Office.Writer/Layout/Other/MeasureUnit', 2): + # Given a Writer document: + with self.ui_test.create_doc_in_start_center("writer") as xComponent: + # When inserting a new frame with the default width: + with self.ui_test.execute_dialog_through_command(".uno:InsertFrame") as xDialog: + xWidth = xDialog.getChild("width") + frame_width = float(get_state_as_dict(xWidth)["Value"]) + # Then make sure the width is not zero: + # cm -> mm100 + expected_mm100 = frame_width * 1000 + # Without the accompanying fix in place, this test would have failed with: + # AssertionError: 0 != 2000.0 + # i.e. the width was empty instead of the size from the UI. + self.assertEqual(xComponent.TextFrames.Frame1.Size.Width, expected_mm100) + # vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sw/source/ui/frmdlg/frmpage.cxx b/sw/source/ui/frmdlg/frmpage.cxx index 352dc15df463..b38ac22d0d11 100644 --- a/sw/source/ui/frmdlg/frmpage.cxx +++ b/sw/source/ui/frmdlg/frmpage.cxx @@ -1264,7 +1264,13 @@ bool SwFramePage::FillItemSet(SfxItemSet *rSet) pOldItem = GetOldItem(*rSet, RES_FRM_SIZE); - if ((pOldItem && aSz != *pOldItem) || (!pOldItem && !m_bFormat) || + bool bSizeChanged = pOldItem && aSz != *pOldItem; + if (!bSizeChanged && m_bNew) + { + // If no custom size is provided, always set a size for a new frame, to avoid ~zero width. + bSizeChanged = true; + } + if (bSizeChanged || (!pOldItem && !m_bFormat) || (m_bFormat && (aSz.GetWidth() > 0 || aSz.GetWidthPercent() > 0) && (aSz.GetHeight() > 0 || aSz.GetHeightPercent() > 0)))