From d6753dc986cc51be1571dd457b584e0218edee5c Mon Sep 17 00:00:00 2001
From: Theophile Terraz <theophile.terraz@inrae.fr>
Date: Fri, 1 Dec 2023 18:37:36 +0100
Subject: [PATCH] upgrade results slider

---
 src/View/Results/Window.py                    |  40 ++++++-
 src/View/ui/Results.ui                        | 108 ++++++++++++++----
 .../ui/ressources/media-playback-pause.png    | Bin 0 -> 217 bytes
 .../ui/ressources/media-playback-start.png    | Bin 0 -> 472 bytes
 .../ui/ressources/media-seek-backward.png     | Bin 0 -> 539 bytes
 src/View/ui/ressources/media-seek-forward.png | Bin 0 -> 610 bytes
 .../ui/ressources/media-skip-backward.png     | Bin 0 -> 557 bytes
 src/View/ui/ressources/media-skip-forward.png | Bin 0 -> 558 bytes
 8 files changed, 122 insertions(+), 26 deletions(-)
 create mode 100644 src/View/ui/ressources/media-playback-pause.png
 create mode 100644 src/View/ui/ressources/media-playback-start.png
 create mode 100644 src/View/ui/ressources/media-seek-backward.png
 create mode 100644 src/View/ui/ressources/media-seek-forward.png
 create mode 100644 src/View/ui/ressources/media-skip-backward.png
 create mode 100644 src/View/ui/ressources/media-skip-forward.png

diff --git a/src/View/Results/Window.py b/src/View/Results/Window.py
index d2f587af..a5114ba9 100644
--- a/src/View/Results/Window.py
+++ b/src/View/Results/Window.py
@@ -24,13 +24,13 @@ from tools import trace, timer
 from View.Tools.PamhyrWindow import PamhyrWindow
 
 from PyQt5.QtGui import (
-    QKeySequence,
+    QKeySequence, QIcon, QPixmap,
 )
 
 from PyQt5.QtCore import (
     Qt, QVariant, QAbstractTableModel,
     QCoreApplication, QModelIndex, pyqtSlot,
-    QItemSelectionModel,
+    QItemSelectionModel, QTimer,
 )
 
 from PyQt5.QtWidgets import (
@@ -124,6 +124,16 @@ class ResultsWindow(PamhyrWindow):
         self._slider_time.setMaximum(len(self._timestamps) - 1)
         self._slider_time.setValue(len(self._timestamps) - 1)
 
+        self._icon_start = QIcon()
+        self._icon_start.addPixmap(QPixmap('./src/View/ui/ressources/media-playback-start.png'))
+        self._icon_pause = QIcon()
+        self._icon_pause.addPixmap(QPixmap('./src/View/ui/ressources/media-playback-pause.png'))
+        self._button_play = self.find(QPushButton, f"playButton")
+        self._button_play.setIcon(self._icon_start)
+        self._button_back = self.find(QPushButton, f"backButton")
+        self._button_next = self.find(QPushButton, f"nextButton")
+        self._timer = QTimer(self)
+
     def setup_plot(self):
         self.canvas = MplCanvas(width=5, height=4, dpi=100)
         self.canvas.setObjectName("canvas")
@@ -310,6 +320,11 @@ class ResultsWindow(PamhyrWindow):
         self._slider_profile.valueChanged.connect(
             self._set_current_profile_slider)
         self._slider_time.valueChanged.connect(self._set_current_timestamp)
+        self._button_play.setChecked(False)
+        self._button_play.clicked.connect(self._pause)
+        self._button_back.clicked.connect(self._back)
+        self._button_next.clicked.connect(self._next)
+        self._timer.timeout.connect(self._update_slider)
 
     def update_table_selection_reach(self, ind):
         table = self.find(QTableView, f"tableView_reach")
@@ -525,3 +540,24 @@ class ResultsWindow(PamhyrWindow):
 
     def _redo(self):
         self._table.redo()
+
+    # play / pause buttons
+    def _update_slider(self):
+        if self._slider_time.value() == self._slider_time.maximum():
+            self._slider_time.setValue(self._slider_time.minimum())
+        else:
+            self._slider_time.setValue(self._slider_time.value()+1)
+
+    def _next(self):
+        self._slider_time.setValue(self._slider_time.value()+1)
+
+    def _back(self):
+        self._slider_time.setValue(self._slider_time.value()-1)
+
+    def _pause(self):
+        if self._button_play.isChecked():
+            self._timer.start(100)
+            self._button_play.setIcon(self._icon_pause)
+        else:
+            self._timer.stop()
+            self._button_play.setIcon(self._icon_start)
diff --git a/src/View/ui/Results.ui b/src/View/ui/Results.ui
index bb8aaae6..54666dd9 100644
--- a/src/View/ui/Results.ui
+++ b/src/View/ui/Results.ui
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>942</width>
-    <height>655</height>
+    <height>740</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -43,25 +43,29 @@
            </attribute>
            <layout class="QGridLayout" name="gridLayout">
             <item row="0" column="0">
-             <widget class="QSplitter" name="splitter_2">
-              <property name="orientation">
-               <enum>Qt::Vertical</enum>
-              </property>
-              <widget class="QSplitter" name="splitter">
-               <property name="orientation">
-                <enum>Qt::Horizontal</enum>
-               </property>
-               <widget class="QWidget" name="verticalLayoutWidget">
-                <layout class="QVBoxLayout" name="verticalLayout"/>
+             <layout class="QVBoxLayout" name="verticalLayout_4">
+              <item>
+               <widget class="QSplitter" name="splitter_2">
+                <property name="orientation">
+                 <enum>Qt::Vertical</enum>
+                </property>
+                <widget class="QSplitter" name="splitter">
+                 <property name="orientation">
+                  <enum>Qt::Horizontal</enum>
+                 </property>
+                 <widget class="QWidget" name="verticalLayoutWidget">
+                  <layout class="QVBoxLayout" name="verticalLayout"/>
+                 </widget>
+                 <widget class="QWidget" name="verticalLayoutWidget_2">
+                  <layout class="QVBoxLayout" name="verticalLayout_2"/>
+                 </widget>
+                </widget>
+                <widget class="QWidget" name="verticalLayoutWidget_3">
+                 <layout class="QVBoxLayout" name="verticalLayout_3"/>
+                </widget>
                </widget>
-               <widget class="QWidget" name="verticalLayoutWidget_2">
-                <layout class="QVBoxLayout" name="verticalLayout_2"/>
-               </widget>
-              </widget>
-              <widget class="QWidget" name="verticalLayoutWidget_3">
-               <layout class="QVBoxLayout" name="verticalLayout_3"/>
-              </widget>
-             </widget>
+              </item>
+             </layout>
             </item>
            </layout>
           </widget>
@@ -117,11 +121,67 @@
          </widget>
         </item>
         <item row="1" column="0">
-         <widget class="QSlider" name="horizontalSlider_time">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-         </widget>
+         <layout class="QHBoxLayout" name="horizontalLayout_2">
+          <item>
+           <widget class="QPushButton" name="backButton">
+            <property name="text">
+             <string/>
+            </property>
+            <property name="icon">
+             <iconset>
+              <normaloff>ressources/media-seek-backward.png</normaloff>ressources/media-seek-backward.png</iconset>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QPushButton" name="playButton">
+            <property name="enabled">
+             <bool>true</bool>
+            </property>
+            <property name="mouseTracking">
+             <bool>true</bool>
+            </property>
+            <property name="contextMenuPolicy">
+             <enum>Qt::DefaultContextMenu</enum>
+            </property>
+            <property name="autoFillBackground">
+             <bool>true</bool>
+            </property>
+            <property name="text">
+             <string/>
+            </property>
+            <property name="icon">
+             <iconset>
+              <normaloff>ressources/media-playback-start.png</normaloff>
+              <normalon>ressources/media-playback-pause.png</normalon>ressources/media-playback-start.png</iconset>
+            </property>
+            <property name="checkable">
+             <bool>true</bool>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QPushButton" name="nextButton">
+            <property name="text">
+             <string/>
+            </property>
+            <property name="icon">
+             <iconset>
+              <normaloff>ressources/media-seek-forward.png</normaloff>ressources/media-seek-forward.png</iconset>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QSlider" name="horizontalSlider_time">
+            <property name="orientation">
+             <enum>Qt::Horizontal</enum>
+            </property>
+           </widget>
+          </item>
+         </layout>
         </item>
        </layout>
       </widget>
diff --git a/src/View/ui/ressources/media-playback-pause.png b/src/View/ui/ressources/media-playback-pause.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1d8541d0f946f20c9c3db61f920626a4ef32942
GIT binary patch
literal 217
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sS^+*Gu0Z-fHUJc_udkm!fBydc
z`_G?04^*Pit^yQf;3x_53ua*Jo;vN#+xJld=R|;FVV*9IAr-gYUfIfcz<|dk(D>Ci
zdGj-K^cGx~sMr2z?<3Ve@A~HEJ3Jy~E6*NCntqpu;mHl9kQLTXvi6G~x!|>8$vXkd
r2Mx{J*}k_m9M-F@pKw=x>YIEo)eQM_C(o{#46@eK)z4*}Q$iB}6^dac

literal 0
HcmV?d00001

diff --git a/src/View/ui/ressources/media-playback-start.png b/src/View/ui/ressources/media-playback-start.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b696d8e87e1a57c73ce54552c7d002fd3e7be25
GIT binary patch
literal 472
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sD*}8%T!Hj|8~`ZA$jHdT!otSJ
z#?H>p$;rvZ#l^$JBPuE?CMG5=EiEG>qobpvr>AFPVq$7)>fzzx<Kq(=8k(7znU|MW
zUS3{bU*Fc&Hgo38g$oz%-o1Ozo;`;TA3k#A$mPqIZ``<X^XARFckkZ2ckjW22M-@U
zeEat8yLa#2zkmPn<Ht{*K7IT4?f38BfB*jd_wOIjfhw%8@_-KFED7=pW?<`{I&I~f
zx9`(AOLBpN*F0SuLn>~)z3S@3oG8Nlpi27A(zreAjCcM&S-@fasUY*(``@ufr)$bK
zwQ@zCOn>`JN&e9+nUeyV6CcOre{$$*Q@F_#)~A29lR3{bSK|>w!e&$PLWT|Hld`n<
z82a?Cbh73xHxdAf+?>;C!EocP%B(KthQr02+;{wzp1=JhhaqRHc*;ozuem84IV$tH
z9yxRQRc$ro(#`&=wWaX)aw{LU8}D?k{CS<Q){;;5eUy1gBj34@yoR~r&E^NHiWfbz
w|Dvcp`SZt$Ri6$d$DFx!zj;>tGxz6g?5liL!rplc0)5Ef>FVdQ&MBb@03#^edjJ3c

literal 0
HcmV?d00001

diff --git a/src/View/ui/ressources/media-seek-backward.png b/src/View/ui/ressources/media-seek-backward.png
new file mode 100644
index 0000000000000000000000000000000000000000..05bff6fcea23f8d0cb2a54334d73c61d62e3ef69
GIT binary patch
literal 539
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sTLOGST!Hj|8~`ZA$jHdV#KgkF
z!p_dl!NDOYC@3T(Bqb#!FE6jCsAy<tXk=t$Vq)U%?(X5?;pyq=?d|R3;}aVjo12?k
zUS3{TS65$O-_g<0+1c6C(=%bhg!%L5FJHcV)v8sSHf`FubLX*R$4;I+dFITSOP4O)
zx^?T$ojZ5$-hKA$*{fHtUcY|*=FOYWpFe;7`t{qlZ-4&$`TO_pzkmOLj+NP0Y6El}
zXGxG>Fauln)M+c<ynUa}S&|EMFt4YJV@SoVw^Le+4m<F;oL+lMCheKg-T(i?O^dg8
z?v*m)xg{O;<%#%)Z>L1ee!Hjp6_@Ss7oCz*eS*>Jc%PTzmu1!mS+s6`tl#Xndu{*3
zZ_^!j@BN~hZCo$ZYj;!b!{W+?Qv(@JJX>3-$H*aE*S=keC*jZe4{j_C_75IKwlHks
zY&gIBmcaoth6HDZUy02JjxoHLZ||iOD9yz8<z)KnAdVS#IGql3+O6bD*XdyV@-fs$
z%aUn%=afnH88vHPYcamtU7g#=@o?GqKZkQ)iFF9Y-(Ah|pxs8mq28{7u|b^Cp-KGj
zUUOcy9`U&juUr|bul^7T)n}^U{8DWj#dJ6>pH<=HEYCeBCaphpXvrD-<v)x4C3<I`
Q28I@cr>mdKI;Vst0AsoRVE_OC

literal 0
HcmV?d00001

diff --git a/src/View/ui/ressources/media-seek-forward.png b/src/View/ui/ressources/media-seek-forward.png
new file mode 100644
index 0000000000000000000000000000000000000000..9610f752cb36830d941f4e88c84f497c9fb780d6
GIT binary patch
literal 610
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s4+DHcT!Hj|8~`ZA$jHdV#Kg?Z
z%*MvX&d$!s$;rjV#m&vl&(AL`EG!}-A}T5>BO{}vq@<#vqNAgur>AFXYHDF&;o{=r
z<Kq(^9v&MTo0peYTwGjMR#skKUSD6|($do2-rmvC(cRrWVZwxI)22<IK7HZBg{xMr
z+O%oY)~#E&ZQHhg|NcXV4jnmi<mAbdr%s(ZbLPz1vuCefy?Xun^}BcP-oJnU`Sa&5
zU%q_x>ecJluiw0R^Y-oAckkYP`SRua_wPS`{P_L*_us#N|NZ+1^x1Dqc@v;dI7@>3
zf*IJlr%qe>=I#4*&XQc9@6<hA978H@y`9opbjU%Vt*~Rc-j3Z@=T=>={m=fYtj+gX
z9b3AHoyqQ>ddsD6$(6MvYbFI<{4hm8NYU+N`(ue94*^FzC&rJS&5I9vEw$wm$$PXk
zXk{$Bpvb9N%XVJP&z!XXy{X#w6<S>f=I|Y_6f{}>i}i01OWvo>e}avcFSYp{555=Y
zcKYTR=<uM9*WtpNN6Wu(v%Z|paj5XRdBB8)tD3%OH#MEVDavsx?yj<zkEqG+<%+6G
zv-C15c?<XUa$VlNWul{enQaj3-VZjlQD+}n>)rYJw5Rp-ok!Ph<p1@#FXetmI@F*m
z|FZe~$Ug_(&fPb2<6h(PiUz)2^Xjd+?#zz&>|=e`d%sdZPpbEvhKE{boOJKAElLyS
oM5U>0a#8GVpRPCc_NhMm&oNznJHAES1coDnr>mdKI;Vst0PjU5>Hq)$

literal 0
HcmV?d00001

diff --git a/src/View/ui/ressources/media-skip-backward.png b/src/View/ui/ressources/media-skip-backward.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f9480c7ca09f5a4e9e0bea01caa6181c6b5c91f
GIT binary patch
literal 557
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sdjotzT!Hj|8~`ZA$jHdT!otSJ
z#?H>p!^6YR&o3Y#ASfs(D=RB6FR!n!Z)j*}WMpJ!X6EYZ>fzzx>FF6B9v&MTn~;!@
zl9G~|nwp!NTV7sXS65eGU*FNu(b?HKVZwyjvu7_^vSjJfrK?u0+O%oY)~#E2?%cV5
z|Ng^=4<9>r?ELxjH*Vaxb?ess`}beGc=77hs}CPOeE$6T%a<=-zkdDw`}dzefByaZ
z2Xu94lZZUfm7FC(e!&cE-BYKneDn5wI%i2P(B)#DE{-7;x86>9?#FB>(Bj!JVPQGP
zUyI@rjuyEOzwO1grOv3>y79^VlOEU8zW#i6>fM<o8LO_vTxTmyk3MvH?zX?-vyb*%
zR=kinv2Xh`ciHW$_r~4f?0!EzwDfUb%){sZ_N?0T*sQ|#M|Xsb*=vSAcbVJwTPL$5
zeJqsjaM<(k_C+NVg%_q`%mQIQ^2``yJ2E*8dYKG(8J7hzEK@vS!ex+itwH3)`-Vve
zF3U||l27-R;E!4F#AK_$JjdykK;(lZB0IEtLOxvh!?%6*r>%Tdkq7Fooz{FHcJma2
z-}&E68{)ru@g=OYZ`c{qu=7W?@$_pBXO6NZ>8*90shxT8AR}WfheWY@+ksZYdyyJ4
k#z&ji)P(q%D*j^q`*4=lD(CRUz+hwWboFyt=akR{0J|{<iU0rr

literal 0
HcmV?d00001

diff --git a/src/View/ui/ressources/media-skip-forward.png b/src/View/ui/ressources/media-skip-forward.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2ab904e4c9f9214b8187be071692fa944b2b3ab
GIT binary patch
literal 558
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sdjotzT!Hj|8~`ZA$jHdT!otSJ
z#?H>p%gZYuARs6xC@U)~FE6jJuWw{zWM*dO>gwv|=H}ty;pyoa92^`H5)vC58y6Rs
zkdTm<mseh1URPIFUtizR(b3u2Ibp(tIdkSLUAlDDs#TjdZQ8nZ>&~4!_wV0-`0(K)
zM~)mjcI^1^<LA$xzj5Qnty{Nl-@bkS{{0s(Uc7qs>cfW*U%q_#`t|GY-@pI-`Sb7J
zKcK6vwDR?VuH-BU@(X5Q>z+Do<(s$f(>Y6Wfi4&Kba4!+xb=3*(>!NGp4QWAk82zE
z&8)2ae|*+vxs}sQt53bJ-v7zdUOVQ*Nv@+_$_BkfANR9FYSvAxHxLTYx?*O(>UEh)
zKuD1Ghuby#cKo@w<@5B-KmR=8b-i}-v(cgWNBl{*${D?Umd$x1U*GwpOUY@$+K<{^
zP6}Cf7o3P^DsGr0P}jYOWdX~DeXhnWH`e>RJM33zxVBY&L41(IejdiZlbC)z<=A3d
zJ%81T;(U&T1+2HMOIf8Rraj_5?4r2Qdu8)G`&XH^Hs#kAp6nGkaPE`sj6?4}DQhhJ
z{UE28@jF}7i(b_Q<~QywGH+|RcY^s!bphXn2cGhQ?|MsJ!dEMoa>lF)d!`z2{d$i_
mfTP;hFWovnSDoRov=7}r^T^%4&3?deWAJqKb6Mw<&;$TSKMz9y

literal 0
HcmV?d00001

-- 
GitLab