From 6ad81b67821eca67e96cfa8e84b5149a3960d613 Mon Sep 17 00:00:00 2001
From: "Arens, Tobias" <t.arens@fz-juelich.de>
Date: Fri, 8 Sep 2023 11:51:48 +0200
Subject: [PATCH] Resolve "Make Slider only scrollable when clicking on them"

---
 CMakeLists.txt            |  2 ++
 include/pSlider.h         | 43 +++++++++++++++++++++++++++++++++++++++
 src/pSlider.cpp           | 36 ++++++++++++++++++++++++++++++++
 ui/alignmentGridBox.ui    | 21 +++++++++++--------
 ui/control.ui             | 27 ++++++++++++++----------
 ui/coordinateSystemBox.ui | 21 +++++++++++--------
 ui/filterBeforeBox.ui     | 11 +++++++---
 7 files changed, 131 insertions(+), 30 deletions(-)
 create mode 100644 include/pSlider.h
 create mode 100644 src/pSlider.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1adffc0cd..e8bc34134 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -391,6 +391,7 @@ target_sources(petrack_core PRIVATE
     include/frameRange.h
     include/pdoublespinbox.h
     include/pspinbox.h
+    include/pSlider.h
     include/filterBeforeBox.h
     include/intrinsicBox.h
     include/intrinsicCameraParams.h
@@ -491,6 +492,7 @@ target_sources(petrack_core PRIVATE
     ui/pGroupBox.ui
     src/alignmentGridBox.cpp
     ui/alignmentGridBox.ui
+    src/pSlider.cpp
     ui/about.ui
     ui/codeMarker.ui
     ui/colorMarker.ui
diff --git a/include/pSlider.h b/include/pSlider.h
new file mode 100644
index 000000000..6919d2336
--- /dev/null
+++ b/include/pSlider.h
@@ -0,0 +1,43 @@
+/*
+ * PeTrack - Software for tracking pedestrians movement in videos
+ * Copyright (C) 2023 Forschungszentrum Jülich GmbH, IAS-7
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef PSLIDER_H
+#define PSLIDER_H
+
+
+#include <QScrollEvent>
+#include <QSlider>
+
+/**
+ * Custom Slider-class that changes scrolling behaviour.
+ *
+ * To prevent an unwanted change in value when scrolling on the UI, this custom
+ * implementation of the Slider only scrolls, if it has focus.
+ */
+class PSlider : public QSlider
+{
+    Q_OBJECT
+public:
+    PSlider(QWidget *parent = nullptr) : QSlider(parent){};
+
+protected:
+    void wheelEvent(QWheelEvent *event) override;
+};
+
+
+#endif // PSLIDER_H
diff --git a/src/pSlider.cpp b/src/pSlider.cpp
new file mode 100644
index 000000000..6da39698e
--- /dev/null
+++ b/src/pSlider.cpp
@@ -0,0 +1,36 @@
+/*
+ * PeTrack - Software for tracking pedestrians movement in videos
+ * Copyright (C) 2023 Forschungszentrum Jülich GmbH, IAS-7
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "pSlider.h"
+
+
+/**
+ * Overwritten event that only scrolls if there is focus on this object
+ * @param e QTEvent
+ */
+void PSlider::wheelEvent(QWheelEvent *e)
+{
+    if(hasFocus())
+    {
+        QSlider::wheelEvent(e);
+    }
+    else
+    {
+        e->ignore();
+    }
+}
\ No newline at end of file
diff --git a/ui/alignmentGridBox.ui b/ui/alignmentGridBox.ui
index 0e4d08dd2..c6d410e5f 100644
--- a/ui/alignmentGridBox.ui
+++ b/ui/alignmentGridBox.ui
@@ -164,7 +164,7 @@
           </widget>
          </item>
          <item row="0" column="1">
-          <widget class="QScrollBar" name="grid3DTransX">
+          <widget class="PSlider" name="grid3DTransX">
            <property name="sizePolicy">
             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
              <horstretch>0</horstretch>
@@ -233,7 +233,7 @@
           </widget>
          </item>
          <item row="1" column="1">
-          <widget class="QScrollBar" name="grid3DTransY">
+          <widget class="PSlider" name="grid3DTransY">
            <property name="minimumSize">
             <size>
              <width>0</width>
@@ -293,7 +293,7 @@
           </widget>
          </item>
          <item row="2" column="1">
-          <widget class="QScrollBar" name="grid3DTransZ">
+          <widget class="PSlider" name="grid3DTransZ">
            <property name="sizePolicy">
             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
              <horstretch>0</horstretch>
@@ -368,7 +368,7 @@
           </widget>
          </item>
          <item row="3" column="1">
-          <widget class="QScrollBar" name="grid3DResolution">
+          <widget class="PSlider" name="grid3DResolution">
            <property name="minimumSize">
             <size>
              <width>0</width>
@@ -475,7 +475,7 @@
           </widget>
          </item>
          <item row="0" column="1">
-          <widget class="QScrollBar" name="gridTransX">
+          <widget class="PSlider" name="gridTransX">
            <property name="sizePolicy">
             <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
              <horstretch>0</horstretch>
@@ -550,7 +550,7 @@
           </widget>
          </item>
          <item row="1" column="1">
-          <widget class="QScrollBar" name="gridTransY">
+          <widget class="PSlider" name="gridTransY">
            <property name="minimumSize">
             <size>
              <width>0</width>
@@ -616,7 +616,7 @@
           </widget>
          </item>
          <item row="2" column="1">
-          <widget class="QScrollBar" name="gridRotate">
+          <widget class="PSlider" name="gridRotate">
            <property name="sizePolicy">
             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
              <horstretch>0</horstretch>
@@ -706,7 +706,7 @@
           </widget>
          </item>
          <item row="3" column="1">
-          <widget class="QScrollBar" name="gridScale">
+          <widget class="PSlider" name="gridScale">
            <property name="minimumSize">
             <size>
              <width>0</width>
@@ -781,6 +781,11 @@
    <extends>QSpinBox</extends>
    <header>pspinbox.h</header>
   </customwidget>
+  <customwidget>
+   <class>PSlider</class>
+   <extends>QSlider</extends>
+   <header>pSlider.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections>
diff --git a/ui/control.ui b/ui/control.ui
index d1f534d74..bad8bd868 100644
--- a/ui/control.ui
+++ b/ui/control.ui
@@ -534,7 +534,7 @@
                    </widget>
                   </item>
                   <item>
-                   <widget class="QScrollBar" name="markerBrightness">
+                   <widget class="PSlider" name="markerBrightness">
                     <property name="sizePolicy">
                      <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
                       <horstretch>0</horstretch>
@@ -815,7 +815,7 @@
                    </widget>
                   </item>
                   <item>
-                   <widget class="QScrollBar" name="recoColorZ">
+                   <widget class="PSlider" name="recoColorZ">
                     <property name="minimumSize">
                      <size>
                       <width>100</width>
@@ -866,7 +866,7 @@
                    </widget>
                   </item>
                   <item>
-                   <widget class="QScrollBar" name="recoGreyLevel">
+                   <widget class="PSlider" name="recoGreyLevel">
                     <property name="value">
                      <number>50</number>
                     </property>
@@ -889,7 +889,7 @@
                    </widget>
                   </item>
                   <item>
-                   <widget class="QScrollBar" name="recoSymbolSize">
+                   <widget class="PSlider" name="recoSymbolSize">
                     <property name="minimum">
                      <number>1</number>
                     </property>
@@ -1015,7 +1015,7 @@
                         </widget>
                        </item>
                        <item row="0" column="2">
-                        <widget class="QScrollBar" name="mapX">
+                        <widget class="PSlider" name="mapX">
                          <property name="sizePolicy">
                           <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
                            <horstretch>0</horstretch>
@@ -1082,7 +1082,7 @@
                         </widget>
                        </item>
                        <item row="1" column="4">
-                        <widget class="QScrollBar" name="mapH">
+                        <widget class="PSlider" name="mapH">
                          <property name="maximum">
                           <number>395</number>
                          </property>
@@ -1105,7 +1105,7 @@
                         </widget>
                        </item>
                        <item row="1" column="2">
-                        <widget class="QScrollBar" name="mapW">
+                        <widget class="PSlider" name="mapW">
                          <property name="maximum">
                           <number>395</number>
                          </property>
@@ -1115,7 +1115,7 @@
                         </widget>
                        </item>
                        <item row="0" column="4">
-                        <widget class="QScrollBar" name="mapY">
+                        <widget class="PSlider" name="mapY">
                          <property name="sizePolicy">
                           <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
                            <horstretch>0</horstretch>
@@ -2277,7 +2277,7 @@
                    </widget>
                   </item>
                   <item row="0" column="1">
-                   <widget class="QScrollBar" name="trackRegionScale">
+                   <widget class="PSlider" name="trackRegionScale">
                     <property name="minimum">
                      <number>1</number>
                     </property>
@@ -2303,7 +2303,7 @@
                    </widget>
                   </item>
                   <item row="1" column="1">
-                   <widget class="QScrollBar" name="trackRegionLevels">
+                   <widget class="PSlider" name="trackRegionLevels">
                     <property name="minimum">
                      <number>0</number>
                     </property>
@@ -2319,7 +2319,7 @@
                    </widget>
                   </item>
                   <item row="2" column="1">
-                   <widget class="QScrollBar" name="trackErrorExponent">
+                   <widget class="PSlider" name="trackErrorExponent">
                     <property name="minimum">
                      <number>-10</number>
                     </property>
@@ -4126,6 +4126,11 @@
    <extends>QSpinBox</extends>
    <header>pspinbox.h</header>
   </customwidget>
+  <customwidget>
+   <class>PSlider</class>
+   <extends>QSlider</extends>
+   <header>pSlider.h</header>
+  </customwidget>
   <customwidget>
    <class>PDoubleSpinBox</class>
    <extends>QDoubleSpinBox</extends>
diff --git a/ui/coordinateSystemBox.ui b/ui/coordinateSystemBox.ui
index 28009814a..6ba54109a 100644
--- a/ui/coordinateSystemBox.ui
+++ b/ui/coordinateSystemBox.ui
@@ -226,7 +226,7 @@
           </widget>
          </item>
          <item row="2" column="1">
-          <widget class="QScrollBar" name="coord3DTransZ">
+          <widget class="PSlider" name="coord3DTransZ">
            <property name="minimumSize">
             <size>
              <width>0</width>
@@ -260,7 +260,7 @@
           </widget>
          </item>
          <item row="0" column="1">
-          <widget class="QScrollBar" name="coord3DTransX">
+          <widget class="PSlider" name="coord3DTransX">
            <property name="sizePolicy">
             <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
              <horstretch>0</horstretch>
@@ -303,7 +303,7 @@
           </widget>
          </item>
          <item row="1" column="1">
-          <widget class="QScrollBar" name="coord3DTransY">
+          <widget class="PSlider" name="coord3DTransY">
            <property name="minimumSize">
             <size>
              <width>0</width>
@@ -420,7 +420,7 @@
           </widget>
          </item>
          <item row="3" column="1">
-          <widget class="QScrollBar" name="coord3DAxeLen">
+          <widget class="PSlider" name="coord3DAxeLen">
            <property name="minimumSize">
             <size>
              <width>0</width>
@@ -676,7 +676,7 @@
           </widget>
          </item>
          <item row="1" column="1">
-          <widget class="QScrollBar" name="coordTransX">
+          <widget class="PSlider" name="coordTransX">
            <property name="minimumSize">
             <size>
              <width>0</width>
@@ -726,7 +726,7 @@
           </widget>
          </item>
          <item row="2" column="1">
-          <widget class="QScrollBar" name="coordTransY">
+          <widget class="PSlider" name="coordTransY">
            <property name="minimumSize">
             <size>
              <width>0</width>
@@ -773,7 +773,7 @@
           </widget>
          </item>
          <item row="4" column="1">
-          <widget class="QScrollBar" name="coordScale">
+          <widget class="PSlider" name="coordScale">
            <property name="minimumSize">
             <size>
              <width>0</width>
@@ -873,7 +873,7 @@
           </widget>
          </item>
          <item row="3" column="1">
-          <widget class="QScrollBar" name="coordRotate">
+          <widget class="PSlider" name="coordRotate">
            <property name="sizePolicy">
             <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
              <horstretch>0</horstretch>
@@ -1141,6 +1141,11 @@
    <extends>QSpinBox</extends>
    <header>pspinbox.h</header>
   </customwidget>
+  <customwidget>
+   <class>PSlider</class>
+   <extends>QSlider</extends>
+   <header>pSlider.h</header>
+  </customwidget>
   <customwidget>
    <class>PDoubleSpinBox</class>
    <extends>QDoubleSpinBox</extends>
diff --git a/ui/filterBeforeBox.ui b/ui/filterBeforeBox.ui
index 3c5de164e..7d290e127 100644
--- a/ui/filterBeforeBox.ui
+++ b/ui/filterBeforeBox.ui
@@ -229,7 +229,7 @@
    <item row="3" column="1">
     <layout class="QHBoxLayout" name="horizontalLayout_10">
      <item>
-      <widget class="QScrollBar" name="filterBorderParamSize">
+      <widget class="PSlider" name="filterBorderParamSize">
        <property name="sizePolicy">
         <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
          <horstretch>0</horstretch>
@@ -277,7 +277,7 @@
     </widget>
    </item>
    <item row="0" column="1">
-    <widget class="QScrollBar" name="filterBrightParam">
+    <widget class="PSlider" name="filterBrightParam">
      <property name="minimumSize">
       <size>
        <width>100</width>
@@ -310,7 +310,7 @@
     </widget>
    </item>
    <item row="1" column="1">
-    <widget class="QScrollBar" name="filterContrastParam">
+    <widget class="PSlider" name="filterContrastParam">
      <property name="minimumSize">
       <size>
        <width>100</width>
@@ -407,6 +407,11 @@
    <extends>QSpinBox</extends>
    <header>pspinbox.h</header>
   </customwidget>
+  <customwidget>
+   <class>PSlider</class>
+   <extends>QSlider</extends>
+   <header>pSlider.h</header>
+  </customwidget>
  </customwidgets>
  <tabstops>
   <tabstop>filterBrightContrast</tabstop>
-- 
GitLab