sd/qa/unit/tiledrendering/tiledrendering.cxx |   24 ++++++++++++++++++++++++
 sfx2/source/sidebar/SidebarController.cxx    |   18 ++++++++----------
 2 files changed, 32 insertions(+), 10 deletions(-)

New commits:
commit a521fc2917e8f887f4e53788bf31935998ba1ad1
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Thu Mar 21 17:01:20 2024 +0100
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Fri Mar 22 10:16:51 2024 +0100

    cool#8278 sfx2 lok: fix lost hide notification on sidebar switch
    
    Similar to commit 55feb670ca28e0a48ac82a65b5559598704d993e (cool#8278
    sfx2 lok: fix unexpected non-json sidebar status update, 2024-03-21),
    the trouble here was not around hiding the sidebar but around switching
    between decks.
    
    This went wrong in commit aaf6ce108e91b1504befe19afcee471e3316ae7a
    (cool#7492 sfx2 lok: set language/locale on async sidebar update,
    2024-01-11), where I didn't notice that
    SidebarController::SwitchToDeck() may emit two callbacks, so the effort
    to avoid code duplication went a bit too far: the hide+show case only
    emitted a show callback.
    
    Fix this by building a list of state changes to emit, so once se switch
    decks, not only the new one is "on", but also the old one is "off".
    
    (cherry picked from commit d8061151acf4e287b60a055a67b84c56989a37af)
    
    Change-Id: I1678ee61e004697a6a5c6ecaf40a18b2d1d47e61
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165155
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx 
b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index 40e1fc7e4ef6..3e28200b4b6a 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -3001,6 +3001,30 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testSidebarHide)
     CPPUNIT_ASSERT(it != aView.m_aStateChanges.end());
 }
 
+CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testSidebarSwitchDeck)
+{
+    // Given an impress document, with a visible sidebar (ModifyPage deck):
+    createDoc("dummy.odp");
+    ViewCallback aView;
+    sfx2::sidebar::Sidebar::Setup(u"");
+    Scheduler::ProcessEventsToIdle();
+    aView.m_aStateChanges.clear();
+
+    // When switching to the MasterSlidesPanel deck:
+    dispatchCommand(mxComponent, ".uno:MasterSlidesPanel", {});
+
+    // Then make sure notifications are sent for both the old and the new 
decks:
+    auto it = aView.m_aStateChanges.find(".uno:ModifyPage");
+    // Without the accompanying fix in place, this test would have failed, the 
notification for the
+    // old deck was missing.
+    CPPUNIT_ASSERT(it != aView.m_aStateChanges.end());
+    boost::property_tree::ptree aTree = it->second;
+    CPPUNIT_ASSERT(aTree.get_child_optional("state").has_value());
+    CPPUNIT_ASSERT_EQUAL(std::string("false"), 
aTree.get_child("state").get_value<std::string>());
+    it = aView.m_aStateChanges.find(".uno:MasterSlidesPanel");
+    CPPUNIT_ASSERT(it != aView.m_aStateChanges.end());
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/sidebar/SidebarController.cxx 
b/sfx2/source/sidebar/SidebarController.cxx
index a9ec224cfe7d..a2baef7967a9 100644
--- a/sfx2/source/sidebar/SidebarController.cxx
+++ b/sfx2/source/sidebar/SidebarController.cxx
@@ -816,30 +816,28 @@ void SidebarController::SwitchToDeck (
     {
         if (const SfxViewShell* pViewShell = mpViewFrame->GetViewShell())
         {
-            boost::property_tree::ptree aTree;
-            aTree.put("locale", 
comphelper::LibreOfficeKit::getLocale().getBcp47());
-            bool bStateChanged = false;
+            std::vector<std::pair<std::string, std::string>> aStateChanges;
             if (msCurrentDeckId != rDeckDescriptor.msId)
             {
                 const std::string hide = UnoNameFromDeckId(msCurrentDeckId, 
GetCurrentContext());
                 if (!hide.empty())
                 {
-                    aTree.put("commandName", hide);
-                    aTree.put("state", "false");
-                    bStateChanged = true;
+                    aStateChanges.push_back({hide, std::string("false")});
                 }
             }
 
             const std::string show = UnoNameFromDeckId(rDeckDescriptor.msId, 
GetCurrentContext());
             if (!show.empty())
             {
-                aTree.put("commandName", show);
-                aTree.put("state", "true");
-                bStateChanged = true;
+                aStateChanges.push_back({show, std::string("true")});
             }
 
-            if (bStateChanged)
+            for (const auto& rStateChange : aStateChanges)
             {
+                boost::property_tree::ptree aTree;
+                aTree.put("locale", 
comphelper::LibreOfficeKit::getLocale().getBcp47());
+                aTree.put("commandName", rStateChange.first);
+                aTree.put("state", rStateChange.second);
                 std::stringstream aStream;
                 boost::property_tree::write_json(aStream, aTree);
                 
pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED,

Reply via email to