sw/source/uibase/sidebar/A11yCheckIssuesPanel.cxx |   34 ++++++++++++++++++++--
 sw/source/uibase/sidebar/A11yCheckIssuesPanel.hxx |    6 +++
 sw/uiconfig/swriter/ui/a11ycheckissuespanel.ui    |   26 ++++++++++++++++
 3 files changed, 64 insertions(+), 2 deletions(-)

New commits:
commit efd665b931fdc46f226964ac838fb72a73782b98
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Mon May 20 15:45:51 2024 +0900
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Fri Jun 14 17:27:26 2024 +0200

    sw: add update button to a11y check sidebar when using LOKit
    
    Running the a11y check when the sidebar gets enable takes some
    time, because populating the widgets is quite expensive. Instead
    of running the check right away, add a "update" button to the
    sidebar, that needs to be clicked first to start running the
    accessibility check. This does not check the behavior of the
    sidebar in desktop LibreOffice.
    
    Also change the populate call to be async, which helps a bit to
    make the UI interaction more fluent, but doesn't fix the issue.
    
    Change-Id: Ia04f4a5fbae952035c1b8d4d7c56211e061d8251
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167855
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    (cherry picked from commit 5e6d7927e27551aa63a2b22134b1a9ee6408d39a)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168784
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/sw/source/uibase/sidebar/A11yCheckIssuesPanel.cxx 
b/sw/source/uibase/sidebar/A11yCheckIssuesPanel.cxx
index 5cfe86ba84d0..dc91eaebfca9 100644
--- a/sw/source/uibase/sidebar/A11yCheckIssuesPanel.cxx
+++ b/sw/source/uibase/sidebar/A11yCheckIssuesPanel.cxx
@@ -25,6 +25,7 @@
 #include <vcl/ptrstyle.hxx>
 #include <vcl/svapp.hxx>
 #include <o3tl/enumrange.hxx>
+#include <comphelper/lok.hxx>
 
 #include "A11yCheckIssuesPanel.hxx"
 
@@ -106,6 +107,10 @@ std::unique_ptr<PanelLayout> 
A11yCheckIssuesPanel::Create(weld::Widget* pParent,
 A11yCheckIssuesPanel::A11yCheckIssuesPanel(weld::Widget* pParent, SfxBindings* 
pBindings)
     : PanelLayout(pParent, u"A11yCheckIssuesPanel"_ustr,
                   u"modules/swriter/ui/a11ycheckissuespanel.ui"_ustr)
+    , mxAccessibilityBox(m_xBuilder->weld_box(u"accessibilityCheckBox"_ustr))
+    , mxUpdateBox(m_xBuilder->weld_box(u"updateBox"_ustr))
+    , 
mxUpdateLinkButton(m_xBuilder->weld_link_button(u"updateLinkButton"_ustr))
+
     , mpBindings(pBindings)
     , mpDoc(nullptr)
     , maA11yCheckController(FN_STAT_ACCESSIBILITY_CHECK, *pBindings, *this)
@@ -134,6 +139,9 @@ A11yCheckIssuesPanel::A11yCheckIssuesPanel(weld::Widget* 
pParent, SfxBindings* p
     m_xBoxes[8] = m_xBuilder->weld_box(u"box_numbering"_ustr);
     m_xBoxes[9] = m_xBuilder->weld_box(u"box_other"_ustr);
 
+    mxUpdateLinkButton->connect_activate_link(
+        LINK(this, A11yCheckIssuesPanel, UpdateLinkButtonClicked));
+
     SwDocShell* pDocSh = dynamic_cast<SwDocShell*>(SfxObjectShell::Current());
     if (!pDocSh)
         return;
@@ -152,9 +160,31 @@ A11yCheckIssuesPanel::A11yCheckIssuesPanel(weld::Widget* 
pParent, SfxBindings* p
 
     mpDoc = pDocSh->GetDoc();
 
-    populateIssues();
+    // If LOKit is enabled, then enable the update button and don't run the 
accessibility check.
+    // In desktop don't show the update button and schedule to run the 
accessibility check async
+    if (comphelper::LibreOfficeKit::isActive())
+    {
+        mxAccessibilityBox->hide();
+        mxUpdateBox->show();
+    }
+    else
+    {
+        mxAccessibilityBox->show();
+        mxUpdateBox->hide();
+        Application::PostUserEvent(LINK(this, A11yCheckIssuesPanel, 
PopulateIssuesHdl));
+    }
+}
+
+IMPL_LINK_NOARG(A11yCheckIssuesPanel, UpdateLinkButtonClicked, 
weld::LinkButton&, bool)
+{
+    mxAccessibilityBox->show();
+    mxUpdateBox->hide();
+    Application::PostUserEvent(LINK(this, A11yCheckIssuesPanel, 
PopulateIssuesHdl));
+    return true;
 }
 
+IMPL_LINK_NOARG(A11yCheckIssuesPanel, PopulateIssuesHdl, void*, void) { 
populateIssues(); }
+
 void A11yCheckIssuesPanel::ImplDestroy()
 {
     // Restore state when this panel is no longer used
@@ -198,7 +228,7 @@ void 
A11yCheckIssuesPanel::addEntryForGroup(AccessibilityCheckGroups eGroup,
 
 void A11yCheckIssuesPanel::populateIssues()
 {
-    if (!mpDoc)
+    if (!mpDoc || !mxAccessibilityBox->is_visible())
         return;
 
     SfxViewShell* pViewShell = SfxViewShell::Current();
diff --git a/sw/source/uibase/sidebar/A11yCheckIssuesPanel.hxx 
b/sw/source/uibase/sidebar/A11yCheckIssuesPanel.hxx
index 519cd6b244e8..ef8d4da0e186 100644
--- a/sw/source/uibase/sidebar/A11yCheckIssuesPanel.hxx
+++ b/sw/source/uibase/sidebar/A11yCheckIssuesPanel.hxx
@@ -78,11 +78,17 @@ private:
     std::array<std::vector<std::unique_ptr<AccessibilityCheckEntry>>, 10> 
m_aEntries;
     std::array<std::unique_ptr<weld::Expander>, 10> m_xExpanders;
     std::array<std::unique_ptr<weld::Box>, 10> m_xBoxes;
+    std::unique_ptr<weld::Box> mxAccessibilityBox;
+    std::unique_ptr<weld::Box> mxUpdateBox;
+    std::unique_ptr<weld::LinkButton> mxUpdateLinkButton;
 
     sfx::AccessibilityIssueCollection m_aIssueCollection;
     void removeAllEntries();
     void populateIssues();
 
+    DECL_LINK(UpdateLinkButtonClicked, weld::LinkButton&, bool);
+    DECL_LINK(PopulateIssuesHdl, void*, void);
+
     void addEntryForGroup(AccessibilityCheckGroups eGroup, 
std::vector<sal_Int32>& rIndices,
                           std::shared_ptr<sfx::AccessibilityIssue> const& 
pIssue);
 
diff --git a/sw/uiconfig/swriter/ui/a11ycheckissuespanel.ui 
b/sw/uiconfig/swriter/ui/a11ycheckissuespanel.ui
index 6657b8c80c4b..3918611f7590 100644
--- a/sw/uiconfig/swriter/ui/a11ycheckissuespanel.ui
+++ b/sw/uiconfig/swriter/ui/a11ycheckissuespanel.ui
@@ -318,5 +318,31 @@
         <property name="position">0</property>
       </packing>
     </child>
+    <child>
+      <object class="GtkBox" id="updateBox">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GtkLinkButton" id="updateLinkButton">
+            <property name="label" translatable="yes" 
context="a11ycheckissuespanel|updateLinkButton">Click to update...</property>
+            <property name="visible">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">True</property>
+            <property name="relief">none</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
   </object>
 </interface>

Reply via email to