cui/inc/tipoftheday.hrc                  |    2 -
 sc/source/ui/inc/tpcalc.hxx              |   11 +++++
 sc/source/ui/optdlg/tpcalc.cxx           |   62 +++++++++++++++++++++++++++----
 sc/uiconfig/scalc/ui/optcalculatepage.ui |   50 ++++++++++++++++++++++++-
 4 files changed, 116 insertions(+), 9 deletions(-)

New commits:
commit 9eb3f5d5406b7e6e50712c3f8f9dfed9b3f240a3
Author:     Sahil Gautam <[email protected]>
AuthorDate: Wed Sep 24 13:58:21 2025 +0530
Commit:     Sahil Gautam <[email protected]>
CommitDate: Sat Oct 11 14:42:49 2025 +0200

    tdf#151144 add opencl controls to calc > calculate tab page
    
    Change-Id: If2e42ba1a10fe289b691d4973ff524ded8f00daa
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/187559
    Reviewed-by: Sahil Gautam <[email protected]>
    Tested-by: Jenkins

diff --git a/cui/inc/tipoftheday.hrc b/cui/inc/tipoftheday.hrc
index db4125104406..a0300a48d20e 100644
--- a/cui/inc/tipoftheday.hrc
+++ b/cui/inc/tipoftheday.hrc
@@ -180,7 +180,7 @@ const std::tuple<TranslateId, OUString, OUString, 
tipModule> TIPOFTHEDAY_STRINGA
      { NC_("RID_CUI_TIPOFTHEDAY", "Use your Android or iPhone to remotely 
control your Impress presentation."), 
"https://help.libreoffice.org/%PRODUCTVERSION/he/text/simpress/guide/impress_remote.html";,
 "", simpress}, //local help missing
      { NC_("RID_CUI_TIPOFTHEDAY", "Want to know how many days there are in the 
current month? Use the DAYSINMONTH(TODAY()) function."), "", "", scalc},
      { NC_("RID_CUI_TIPOFTHEDAY", "Your numbers are displayed as ### in your 
spreadsheet? The column is too narrow to display all digits."), "", "", scalc},
-     { NC_("RID_CUI_TIPOFTHEDAY", "Enable massive parallel calculations of 
formula cells via Tools ▸ Options ▸ %PRODUCTNAME ▸ OpenCL."), 
"cui/ui/optopenclpage/OptOpenCLPage", "", scalc}, 
//https://help.libreoffice.org/%PRODUCTVERSION/%LANGUAGENAME/text/shared/optionen/opencl.html
+     { NC_("RID_CUI_TIPOFTHEDAY", "Enable massive parallel calculations of 
formula cells via Tools ▸ Options ▸ %PRODUCTNAME Calc ▸ Calculate ▸ OpenCL 
Options."), "cui/ui/optcalculatepage/OptOpenCLPage", "", scalc}, 
//https://help.libreoffice.org/%PRODUCTVERSION/%LANGUAGENAME/text/shared/optionen/opencl.html
      { NC_("RID_CUI_TIPOFTHEDAY", "Use the Connector tool from the Drawing 
toolbar in Draw/Impress to create nice flow charts and optionally copy/paste 
the object into Writer."), "", "", sdraw},
      { NC_("RID_CUI_TIPOFTHEDAY", "Your donations support our worldwide 
community."), "https://www.libreoffice.org/donate/";, "", soffice},
      { NC_("RID_CUI_TIPOFTHEDAY", "You want to add x months to a date? Use 
=EDATE(date;months)."), 
"https://help.libreoffice.org/%PRODUCTVERSION/%LANGUAGENAME/text/scalc/01/func_edate.html";,
 "", scalc}, //local help missing
diff --git a/sc/source/ui/inc/tpcalc.hxx b/sc/source/ui/inc/tpcalc.hxx
index 6bfacaee3c30..aef06ccd5bfd 100644
--- a/sc/source/ui/inc/tpcalc.hxx
+++ b/sc/source/ui/inc/tpcalc.hxx
@@ -21,6 +21,10 @@
 
 #include <sfx2/tabdlg.hxx>
 #include "editfield.hxx"
+#include <config_feature_opencl.h>
+#if HAVE_FEATURE_OPENCL
+#include <opencl/openclconfig.hxx>
+#endif
 #include <com/sun/star/configuration/ReadWriteAccess.hpp>
 #include <com/sun/star/beans/PropertyAttribute.hpp>
 
@@ -59,6 +63,12 @@ private:
     std::unique_ptr<weld::RadioButton> m_xBtnDate1904;
     std::unique_ptr<weld::Widget> m_xDateImg;
 
+#if HAVE_FEATURE_OPENCL
+    OpenCLConfig maConfig;
+    std::unique_ptr<weld::CheckButton> m_xAllowOpenCL;
+#endif
+    std::unique_ptr<weld::Frame> m_xOpenCLFrame;
+
     std::unique_ptr<weld::CheckButton> m_xBtnCase;
     std::unique_ptr<weld::Widget> m_xBtnCaseImg;
     std::unique_ptr<weld::CheckButton> m_xBtnCalc;
@@ -83,6 +93,7 @@ private:
 
 private:
     void            Init();
+    void InitOpenCL();
 
     // Handler:
     DECL_LINK( RadioClickHdl, weld::Toggleable&, void );
diff --git a/sc/source/ui/optdlg/tpcalc.cxx b/sc/source/ui/optdlg/tpcalc.cxx
index 24b56c8f4b55..9cefe920079d 100644
--- a/sc/source/ui/optdlg/tpcalc.cxx
+++ b/sc/source/ui/optdlg/tpcalc.cxx
@@ -28,9 +28,13 @@
 #include <docoptio.hxx>
 #include <sc.hrc>
 #include <officecfg/Office/Calc.hxx>
+#include <officecfg/Office/Common.hxx>
 #include <svtools/restartdialog.hxx>
 
 #include <tpcalc.hxx>
+#if HAVE_FEATURE_OPENCL
+#include <opencl/openclwrapper.hxx>
+#endif
 
 ScTpCalcOptions::ScTpCalcOptions(weld::Container* pPage, 
weld::DialogController* pController, const SfxItemSet& rCoreAttrs)
     : SfxTabPage(pPage, pController, 
u"modules/scalc/ui/optcalculatepage.ui"_ustr, u"OptCalculatePage"_ustr, 
&rCoreAttrs)
@@ -49,6 +53,11 @@ ScTpCalcOptions::ScTpCalcOptions(weld::Container* pPage, 
weld::DialogController*
     , m_xBtnDateSc10(m_xBuilder->weld_radio_button(u"datesc10"_ustr))
     , m_xBtnDate1904(m_xBuilder->weld_radio_button(u"date1904"_ustr))
     , m_xDateImg(m_xBuilder->weld_widget(u"lockdate"_ustr))
+#if HAVE_FEATURE_OPENCL
+    , maConfig(OpenCLConfig::get())
+    , m_xAllowOpenCL(m_xBuilder->weld_check_button(u"allowopencl"_ustr))
+#endif
+    , m_xOpenCLFrame(m_xBuilder->weld_frame(u"OptOpenCLPage"_ustr))
     , m_xBtnCase(m_xBuilder->weld_check_button(u"case"_ustr))
     , m_xBtnCaseImg(m_xBuilder->weld_widget(u"lockcase"_ustr))
     , m_xBtnCalc(m_xBuilder->weld_check_button(u"calc"_ustr))
@@ -70,6 +79,7 @@ ScTpCalcOptions::ScTpCalcOptions(weld::Container* pPage, 
weld::DialogController*
     , m_xBtnThreadImg(m_xBuilder->weld_widget(u"lockthreadingenabled"_ustr))
 {
     Init();
+    InitOpenCL();
     SetExchangeSupport();
 
     const css::uno::Reference < css::uno::XComponentContext >& 
xContext(::comphelper::getProcessComponentContext());
@@ -90,6 +100,16 @@ void ScTpCalcOptions::Init()
     m_xBtnThread->connect_toggled( LINK( this, ScTpCalcOptions, CheckClickHdl 
) );
 }
 
+void ScTpCalcOptions::InitOpenCL()
+{
+#if HAVE_FEATURE_OPENCL
+    m_xAllowOpenCL->set_active(maConfig.mbUseOpenCL);
+    
m_xAllowOpenCL->set_sensitive(!officecfg::Office::Common::Misc::UseOpenCL::isReadOnly()
+                                  && openclwrapper::GPUEnv::isOpenCLEnabled());
+#endif
+    m_xOpenCLFrame->set_visible(HAVE_FEATURE_OPENCL);
+}
+
 std::unique_ptr<SfxTabPage> ScTpCalcOptions::Create( weld::Container* pPage, 
weld::DialogController* pController, const SfxItemSet* rAttrSet )
 {
     return std::make_unique<ScTpCalcOptions>( pPage, pController, *rAttrSet );
@@ -243,13 +263,20 @@ void ScTpCalcOptions::Reset(const SfxItemSet* rCoreAttrs)
     m_xBtnThread->set_active( 
officecfg::Office::Calc::Formula::Calculation::UseThreadedCalculationForFormulaGroups::get()
 );
 
     CheckClickHdl(*m_xBtnIterate);
+
+#if HAVE_FEATURE_OPENCL
+    maConfig = OpenCLConfig::get();
+    m_xAllowOpenCL->set_active(maConfig.mbUseOpenCL);
+    m_xAllowOpenCL->save_state();
+#endif
 }
 
 OUString ScTpCalcOptions::GetAllStrings()
 {
     OUString sAllStrings;
-    OUString labels[]
-        = { u"label5"_ustr, u"label1"_ustr, u"precft"_ustr, u"label2"_ustr, 
u"stepsft"_ustr, u"minchangeft"_ustr, u"label4"_ustr, u"label3"_ustr };
+    OUString labels[] = { u"label5"_ustr, u"label1"_ustr,  u"precft"_ustr,
+                          u"label2"_ustr, u"stepsft"_ustr, u"minchangeft"_ustr,
+                          u"label4"_ustr, u"label3"_ustr,  u"openclframe"_ustr 
};
 
     for (const auto& label : labels)
     {
@@ -295,25 +322,46 @@ bool ScTpCalcOptions::FillItemSet( SfxItemSet* rCoreAttrs 
)
     else
         pLocalOptions->SetStdPrecision( SvNumberFormatter::UNLIMITED_PRECISION 
);
 
+    bool bRestartRequired = false;
     bool bShouldEnableThreading = m_xBtnThread->get_active();
     if (bShouldEnableThreading != 
officecfg::Office::Calc::Formula::Calculation::UseThreadedCalculationForFormulaGroups::get())
     {
         std::shared_ptr<comphelper::ConfigurationChanges> 
xBatch(comphelper::ConfigurationChanges::create());
         
officecfg::Office::Calc::Formula::Calculation::UseThreadedCalculationForFormulaGroups::set(bShouldEnableThreading,
 xBatch);
         xBatch->commit();
+        bRestartRequired = true;
+    }
+
+#if HAVE_FEATURE_OPENCL
+    std::shared_ptr<comphelper::ConfigurationChanges> batch(
+        comphelper::ConfigurationChanges::create());
+
+    if (m_xAllowOpenCL->get_state_changed_from_saved())
+        maConfig.mbUseOpenCL = m_xAllowOpenCL->get_active();
+
+    if (maConfig != OpenCLConfig::get())
+    {
+        maConfig.set();
+        bRestartRequired = true;
+        batch->commit();
+    }
+#endif
+
+    if (bRestartRequired)
+    {
         SolarMutexGuard aGuard;
-        if (svtools::executeRestartDialog(
-                     comphelper::getProcessComponentContext(), GetFrameWeld(),
-                     svtools::RESTART_REASON_CALCULATION))
+        if 
(svtools::executeRestartDialog(comphelper::getProcessComponentContext(), 
nullptr,
+                                          svtools::RESTART_REASON_CALCULATION))
             GetDialogController()->response(RET_OK);
     }
+
     if ( *pLocalOptions != *pOldOptions )
     {
         rCoreAttrs->Put( ScTpCalcItem( SID_SCDOCOPTIONS, *pLocalOptions ) );
         return true;
     }
-    else
-        return false;
+
+    return false;
 }
 
 DeactivateRC ScTpCalcOptions::DeactivatePage( SfxItemSet* pSetP )
diff --git a/sc/uiconfig/scalc/ui/optcalculatepage.ui 
b/sc/uiconfig/scalc/ui/optcalculatepage.ui
index c1f7160be2d6..81d8279a633f 100644
--- a/sc/uiconfig/scalc/ui/optcalculatepage.ui
+++ b/sc/uiconfig/scalc/ui/optcalculatepage.ui
@@ -18,6 +18,8 @@
   <object class="GtkGrid" id="OptCalculatePage">
     <property name="visible">True</property>
     <property name="can-focus">False</property>
+    <property name="halign">start</property>
+    <property name="valign">start</property>
     <property name="border-width">6</property>
     <property name="row-spacing">12</property>
     <property name="column-spacing">24</property>
@@ -335,7 +337,6 @@
       <packing>
         <property name="left-attach">0</property>
         <property name="top-attach">1</property>
-        <property name="width">2</property>
       </packing>
     </child>
     <child>
@@ -745,5 +746,52 @@
         <property name="top-attach">0</property>
       </packing>
     </child>
+    <child>
+      <object class="GtkFrame" id="OptOpenCLPage">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="label-xalign">0</property>
+        <property name="shadow-type">none</property>
+        <child>
+          <object class="GtkBox">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="halign">start</property>
+            <property name="valign">start</property>
+            <property name="margin-start">12</property>
+            <property name="margin-top">6</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkCheckButton" id="allowopencl">
+                <property name="label" translatable="yes" 
context="optcalculatepage|allowopencl">Allow use of OpenCL</property>
+                <property name="visible">True</property>
+                <property name="can-focus">True</property>
+                <property name="receives-default">False</property>
+                <property name="draw-indicator">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+        <child type="label">
+          <object class="GtkLabel" id="openclframe">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="label" translatable="yes" 
context="optcalculatepage|openclframe">OpenCL Options</property>
+            <attributes>
+              <attribute name="weight" value="bold"/>
+            </attributes>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="left-attach">1</property>
+        <property name="top-attach">1</property>
+      </packing>
+    </child>
   </object>
 </interface>

Reply via email to