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
9da7b1592e (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 <vmiklos@collabora.com>
Tested-by: Jenkins
This commit is contained in:
Miklos Vajna 2023-11-07 08:31:29 +01:00
parent ca650cad8f
commit 4f1121255e
3 changed files with 27 additions and 1 deletions

View file

@ -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:

View file

@ -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:

View file

@ -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)))