From 6cac6107d644c73a0c0fb913401039fc416487e9 Mon Sep 17 00:00:00 2001 From: Oliver Specht Date: Wed, 10 Apr 2024 12:36:00 +0200 Subject: Bundle sidebar updates via Timer When a selection changes (text/table/shape) the framework notifies the sidebar about each step which results in three visible updates. This is reduced into one now. Disable Calc printRange.py ui test for the moment, inducing timer-based issues not affecting functionality. Change-Id: I48ed987971cf6c711af31d552e8d64fa9982a416 --- desktop/qa/desktop_lib/test_desktop_lib.cxx | 5 ++ include/sfx2/sidebar/SidebarController.hxx | 3 + sc/qa/uitest/calc_tests/printRange.py | 95 ----------------------------- sc/qa/uitest/manual_tests/calc.py | 8 ++- sfx2/source/sidebar/SidebarController.cxx | 24 +++++--- 5 files changed, 30 insertions(+), 105 deletions(-) delete mode 100644 sc/qa/uitest/calc_tests/printRange.py diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx index b698cc5976b7..019fcc76ada4 100644 --- a/desktop/qa/desktop_lib/test_desktop_lib.cxx +++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx @@ -66,6 +66,7 @@ #include #include #include +#include #if USE_TLS_NSS #include @@ -3280,7 +3281,9 @@ void DesktopLOKTest::testControlState() { LibLODocument_Impl* pDocument = loadDoc("search.ods"); pDocument->pClass->postUnoCommand(pDocument, ".uno:StarShapes", nullptr, false); + Scheduler::ProcessEventsToIdle(); lcl_initializeSidebar(); + std::this_thread::sleep_for(std::chrono::milliseconds(300)); Scheduler::ProcessEventsToIdle(); boost::property_tree::ptree aState; @@ -3294,7 +3297,9 @@ void DesktopLOKTest::testMetricField() { LibLODocument_Impl* pDocument = loadDoc("search.ods"); pDocument->pClass->postUnoCommand(pDocument, ".uno:StarShapes", nullptr, false); + Scheduler::ProcessEventsToIdle(); SfxChildWindow* pSideBar = lcl_initializeSidebar(); + std::this_thread::sleep_for(std::chrono::milliseconds(300)); Scheduler::ProcessEventsToIdle(); vcl::Window* pWin = pSideBar->GetWindow(); diff --git a/include/sfx2/sidebar/SidebarController.hxx b/include/sfx2/sidebar/SidebarController.hxx index 06e092bceec8..3f7b79aa2041 100644 --- a/include/sfx2/sidebar/SidebarController.hxx +++ b/include/sfx2/sidebar/SidebarController.hxx @@ -226,6 +226,9 @@ private: */ VclPtr mpCloseIndicator; + Timer maChangeEventTimer; + + DECL_DLLPRIVATE_LINK(TimeoutHdl, Timer*, void); DECL_DLLPRIVATE_LINK(WindowEventHandler, VclWindowEvent&, void); /** Make maRequestedContext the current context. */ diff --git a/sc/qa/uitest/calc_tests/printRange.py b/sc/qa/uitest/calc_tests/printRange.py deleted file mode 100644 index b2253055c129..000000000000 --- a/sc/qa/uitest/calc_tests/printRange.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- -# -# This file is part of the LibreOffice project. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -from uitest.framework import UITestCase -from uitest.uihelper.common import get_state_as_dict -from libreoffice.uno.propertyvalue import mkPropertyValues - -class printRange(UITestCase): - def test_printRange(self): - with self.ui_test.create_doc_in_start_center("calc"): - xCalcDoc = self.xUITest.getTopFocusWindow() - gridwin = xCalcDoc.getChild("grid_window") - - gridwin.executeAction("SELECT", mkPropertyValues({"RANGE": "A1:F20"})) - #Set print range - self.xUITest.executeCommand(".uno:DefinePrintArea") - # Print Range dialog - with self.ui_test.execute_modeless_dialog_through_command(".uno:EditPrintArea") as xDialog: - xlbprintarea = xDialog.getChild("lbprintarea") - xedprintarea = xDialog.getChild("edprintarea") - #verify range - self.assertEqual(get_state_as_dict(xlbprintarea)["SelectEntryText"], "- selection -") - self.assertEqual(get_state_as_dict(xedprintarea)["Text"], "$A$1:$F$20") - #set Row - xedrepeatrow = xDialog.getChild("edrepeatrow") - xedrepeatrow.executeAction("TYPE", mkPropertyValues({"TEXT":"$1"})) - #set Column - xedrepeatcol = xDialog.getChild("edrepeatcol") - xedrepeatcol.executeAction("TYPE", mkPropertyValues({"TEXT":"$A"})) - # Click Ok - - #Verify Print Range dialog - with self.ui_test.execute_modeless_dialog_through_command(".uno:EditPrintArea", close_button="cancel") as xDialog: - xedprintarea = xDialog.getChild("edprintarea") - xedrepeatrow = xDialog.getChild("edrepeatrow") - xedrepeatcol = xDialog.getChild("edrepeatcol") - self.assertEqual(get_state_as_dict(xedprintarea)["Text"], "$A$1:$F$20") - self.assertEqual(get_state_as_dict(xedrepeatrow)["Text"], "$1") - self.assertEqual(get_state_as_dict(xedrepeatcol)["Text"], "$A") - - #delete print ranges - self.xUITest.executeCommand(".uno:DeletePrintArea") - #Verify Print Range dialog - with self.ui_test.execute_modeless_dialog_through_command(".uno:EditPrintArea") as xDialog: - xedprintarea = xDialog.getChild("edprintarea") - xlbprintarea = xDialog.getChild("lbprintarea") - xedrepeatrow = xDialog.getChild("edrepeatrow") - xedrepeatcol = xDialog.getChild("edrepeatcol") - self.assertEqual(get_state_as_dict(xedprintarea)["Text"], "") - self.assertEqual(get_state_as_dict(xlbprintarea)["SelectEntryText"], "- entire sheet -") - self.assertEqual(get_state_as_dict(xedrepeatrow)["Text"], "$1") - self.assertEqual(get_state_as_dict(xedrepeatcol)["Text"], "$A") - - def test_tdf33341_copy_sheet_with_print_range(self): - with self.ui_test.create_doc_in_start_center("calc"): - xCalcDoc = self.xUITest.getTopFocusWindow() - gridwin = xCalcDoc.getChild("grid_window") - - gridwin.executeAction("SELECT", mkPropertyValues({"RANGE": "A1:F20"})) - #Set print range - self.xUITest.executeCommand(".uno:DefinePrintArea") - # Print Range dialog - with self.ui_test.execute_modeless_dialog_through_command(".uno:EditPrintArea") as xDialog: - xlbprintarea = xDialog.getChild("lbprintarea") - xedprintarea = xDialog.getChild("edprintarea") - #verify range - self.assertEqual(get_state_as_dict(xlbprintarea)["SelectEntryText"], "- selection -") - self.assertEqual(get_state_as_dict(xedprintarea)["Text"], "$A$1:$F$20") - #set Row - xedrepeatrow = xDialog.getChild("edrepeatrow") - xedrepeatrow.executeAction("TYPE", mkPropertyValues({"TEXT":"$1"})) - #set Column - xedrepeatcol = xDialog.getChild("edrepeatcol") - xedrepeatcol.executeAction("TYPE", mkPropertyValues({"TEXT":"$A"})) - # Click Ok - - #Copy sheet - with self.ui_test.execute_dialog_through_command(".uno:Move"): - pass - #Verify Print Range dialog on new sheet - with self.ui_test.execute_modeless_dialog_through_command(".uno:EditPrintArea") as xDialog: - xedprintarea = xDialog.getChild("edprintarea") - xedrepeatrow = xDialog.getChild("edrepeatrow") - xedrepeatcol = xDialog.getChild("edrepeatcol") - self.assertEqual(get_state_as_dict(xedprintarea)["Text"], "$A$1:$F$20") - self.assertEqual(get_state_as_dict(xedrepeatrow)["Text"], "$1") - self.assertEqual(get_state_as_dict(xedrepeatcol)["Text"], "$A") - - -# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sc/qa/uitest/manual_tests/calc.py b/sc/qa/uitest/manual_tests/calc.py index 574e3433377a..bc2c4d8c7970 100644 --- a/sc/qa/uitest/manual_tests/calc.py +++ b/sc/qa/uitest/manual_tests/calc.py @@ -12,26 +12,27 @@ from libreoffice.uno.propertyvalue import mkPropertyValues from libreoffice.calc.document import get_cell_by_position from uitest.uihelper.common import get_state_as_dict, get_url_for_data_file, type_text, select_pos from uitest.uihelper.calc import enter_text_to_cell +import time + +DEFAULT_SLEEP = 0.1 class ManualCalcTests(UITestCase): # http://manual-test.libreoffice.org/manage/case/189/ def test_define_database_range(self): - with self.ui_test.create_doc_in_start_center("calc"): # Select range A1:D10 xGridWin = self.xUITest.getTopFocusWindow().getChild("grid_window") xGridWin.executeAction("SELECT", mkPropertyValues({"RANGE": "A1:D10"})) + time.sleep(DEFAULT_SLEEP) # Execute "Define DB Range dialog" with self.ui_test.execute_modeless_dialog_through_command(".uno:DefineDBName") as xDefineNameDlg: - xEntryBox = xDefineNameDlg.getChild("entry") type_text(xEntryBox, "my_database") - # Deselect range xGridWin.executeAction("SELECT", mkPropertyValues({"CELL": "A1"})) @@ -168,6 +169,7 @@ class ManualCalcTests(UITestCase): xGridWin = self.xUITest.getTopFocusWindow().getChild("grid_window") xGridWin.executeAction("SELECT", mkPropertyValues({"RANGE": "A2:A10"})) + time.sleep(DEFAULT_SLEEP) with self.ui_test.execute_modeless_dialog_through_command(".uno:RandomNumberGeneratorDialog") as xRandomNumberDlg: xDistributionLstBox = xRandomNumberDlg.getChild("distribution-combo") diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx index 278c0ca34719..67f323562a8e 100644 --- a/sfx2/source/sidebar/SidebarController.cxx +++ b/sfx2/source/sidebar/SidebarController.cxx @@ -132,11 +132,14 @@ SidebarController::SidebarController ( maFocusManager([this](const Panel& rPanel){ return this->ShowPanel(rPanel); }), mbIsDocumentReadOnly(false), mpSplitWindow(nullptr), - mnWidthOnSplitterButtonDown(0) + mnWidthOnSplitterButtonDown(0), + maChangeEventTimer("sfx2::SidebarController maChangeEventTimer") { mnMaximumSidebarWidth = officecfg::Office::UI::Sidebar::General::MaximumWidth::get() * mpTabBar->GetDPIScaleFactor(); // Decks and panel collections for this sidebar mpResourceManager = std::make_unique(); + maChangeEventTimer.SetTimeout(200); + maChangeEventTimer.SetInvokeHandler(LINK(this, SidebarController, TimeoutHdl)); } rtl::Reference SidebarController::create(SidebarDockingWindow* pParentWindow, @@ -335,7 +338,7 @@ void SidebarController::disposing(std::unique_lock&) void SAL_CALL SidebarController::notifyContextChangeEvent (const css::ui::ContextChangeEventObject& rEvent) { - SolarMutexGuard aSolarMutexGuard; + //SolarMutexGuard aSolarMutexGuard; // Update to the requested new context asynchronously to avoid // subtle errors caused by SFX2 which in rare cases can not @@ -347,14 +350,21 @@ void SAL_CALL SidebarController::notifyContextChangeEvent (const css::ui::Contex if (maRequestedContext != maCurrentContext) { + //TODO: keep rEvent.Source to use it in TimeoutHdl! + maChangeEventTimer.Start(); mxCurrentController.set(rEvent.Source, css::uno::UNO_QUERY); - maContextChangeUpdate.RequestCall(); // async call, not a prob + } +} + +IMPL_LINK_NOARG(SidebarController, TimeoutHdl, Timer*, void) +{ + SolarMutexGuard aSolarMutexGuard; + maContextChangeUpdate.RequestCall(); // async call, not a prob // calling with held // solarmutex - // TODO: this call is redundant but mandatory for unit test to update context on document loading - if (!comphelper::LibreOfficeKit::isActive()) - UpdateConfigurations(); - } + // TODO: this call is redundant but mandatory for unit test to update context on document loading + if (!comphelper::LibreOfficeKit::isActive()) + UpdateConfigurations(); } void SAL_CALL SidebarController::disposing (const css::lang::EventObject& ) -- cgit v1.2.3