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