From 2bd96ad1a634a1ba4f24040f273ce4b4b60e9278 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Sat, 27 Mar 2021 13:55:57 +0000 Subject: [PATCH] Make more robust --- app/musicmuster.py | 127 ++++-- app/ui/icon-fade.png | Bin 0 -> 4099 bytes app/ui/icon-play-next.png | Bin 0 -> 2782 bytes app/ui/icon-play.png | Bin 0 -> 11891 bytes app/ui/icon-stop.png | Bin 0 -> 2719 bytes app/ui/icon_open_file.png | Bin 0 -> 19141 bytes app/ui/icon_search_database.png | Bin 0 -> 24591 bytes app/ui/main_window.ui | 750 +++++++++++++++++++++++--------- notes.otl | 102 +++-- 9 files changed, 711 insertions(+), 268 deletions(-) create mode 100644 app/ui/icon-fade.png create mode 100644 app/ui/icon-play-next.png create mode 100644 app/ui/icon-play.png create mode 100644 app/ui/icon-stop.png create mode 100644 app/ui/icon_open_file.png create mode 100644 app/ui/icon_search_database.png diff --git a/app/musicmuster.py b/app/musicmuster.py index 4e4113a..130afc4 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -33,34 +33,70 @@ class Music: } def get_current_artist(self): - return self.current_track['meta'].artist + try: + return self.current_track['meta'].artist + except AttributeError: + return "" def get_current_duration(self): - return self.current_track['meta'].duration + try: + return self.current_track['meta'].duration + except AttributeError: + return 0 def get_current_fade_at(self): - return self.current_track['meta'].fade_at + try: + return self.current_track['meta'].fade_at + except AttributeError: + return 0 def get_current_playtime(self): - return self.current_track['player'].get_time() + try: + return self.current_track['player'].get_time() + except AttributeError: + return 0 def get_current_silence_at(self): - return self.current_track['meta'].silence_at + try: + return self.current_track['meta'].silence_at + except AttributeError: + return 0 def get_current_title(self): - return self.current_track['meta'].title + try: + return self.current_track['meta'].title + except AttributeError: + return "" - def get_last_artist(self): - return self.last_track['meta'].artist + def get_current_track_id(self): + try: + return self.current_track['meta'].id + except AttributeError: + return 0 - def get_last_title(self): - return self.last_track['meta'].title + def get_previous_artist(self): + try: + return self.previous_track['meta'].artist + except AttributeError: + return "" + + def get_previous_title(self): + try: + return self.previous_track['meta'].title + except AttributeError: + return "" def get_next_artist(self): - return self.next_track['meta'].artist + try: + return self.next_track['meta'].artist + except AttributeError: + return "" def get_next_title(self): - return self.next_track['meta'].title + try: + return self.next_track['meta'].title + except AttributeError: + return "" def play_next(self): if self.previous_track['player']: @@ -83,7 +119,7 @@ class Music: else: return False - def resume_last(self): + def resume_previous(self): pass def set_next_track(self, id): @@ -104,6 +140,7 @@ class Window(QMainWindow, Ui_MainWindow): self.timer = QTimer() self.connectSignalsSlots() self.music = Music() + self.disable_play_next_controls() record = Settings.get_int("mainwindow_x") x = record.f_int or 1 @@ -147,11 +184,10 @@ class Window(QMainWindow, Ui_MainWindow): record.update({'f_int': self.y()}) def connectSignalsSlots(self): - self.fileButton.clicked.connect(self.selectFile) - self.databaseButton.clicked.connect(self.selectFromDatabase) + self.actionSearch_database.triggered.connect(self.selectFromDatabase) self.actionPlay_selected.triggered.connect(self.play_next) self.actionPlay_next.triggered.connect(self.play_next) - self.playlist.itemSelectionChanged.connect(self.set_next) + self.playlist.itemSelectionChanged.connect(self.set_next_track) self.timer.timeout.connect(self.tick) def selectFromDatabase(self): @@ -160,19 +196,22 @@ class Window(QMainWindow, Ui_MainWindow): def play_next(self): self.music.play_next() + self.current_track.setText( + f"{self.music.get_current_title()} - " + f"{self.music.get_current_artist()}" + ) + self.previous_track.setText( + f"{self.music.get_previous_title()} - " + f"{self.music.get_previous_artist()}" + ) + self.set_next_track() # Set time clocks now = datetime.now() self.label_start_tod.setText(now.strftime("%H:%M:%S")) - fade_time = now + timedelta( - milliseconds=self.music.get_current_fade_at()) - self.label_fade_tod.setText(fade_time.strftime("%H:%M:%S")) silence_time = now + timedelta( milliseconds=self.music.get_current_silence_at()) self.label_silent_tod.setText(silence_time.strftime("%H:%M:%S")) - end_time = now + timedelta( - milliseconds=self.music.get_current_duration()) - self.label_end_tod.setText(end_time.strftime("%H:%M:%S")) def play_selected(self): if self.playlist.selectionModel().hasSelection(): @@ -200,17 +239,42 @@ class Window(QMainWindow, Ui_MainWindow): # track = Track(fname) # self.add_to_playlist(track) - def set_next(self): + def set_next_track(self): + """ + Set the next track. In order of priority: + + - the highlighted track so long as it's not the current track + - if the current track is highlighted, the next track if there + is one + - none, in which case disable play next controls + """ + + track_id = None if self.playlist.selectionModel().hasSelection(): row = self.playlist.currentRow() track_id = int(self.playlist.item(row, 0).text()) - DEBUG(f"set_next: track_id={track_id}") + if track_id == self.music.get_current_track_id(): + # Current track highlighted: get next if it exists + try: + track_id = int(self.playlist.item(row + 1, 0).text()) + except AttributeError: + # There is no next track + track_id = None + if track_id: + DEBUG(f"set_next_track: track_id={track_id}") if self.music.set_next_track(track_id) != track_id: ERROR("Can't set next track") + self.next_track.setText( + f"{self.music.get_next_title()} - " + f"{self.music.get_next_artist()}" + ) + self.enable_play_next_controls() + else: + self.next_track.setText("") + self.disable_play_next_controls() def tick(self): - now = datetime.now() - self.current_time.setText(now.strftime("%H:%M:%S")) + # self.current_time.setText(now.strftime("%H:%M:%S")) if self.music.playing(): playtime = self.music.get_current_playtime() self.label_elapsed_timer.setText(ms_to_mmss(playtime)) @@ -245,6 +309,15 @@ class Window(QMainWindow, Ui_MainWindow): item = QTableWidgetItem(track.path) pl.setItem(row, 7, item) + def disable_play_next_controls(self): + self.actionPlay_selected.setEnabled(False) + self.actionPlay_next.setEnabled(False) + + def enable_play_next_controls(self): + self.actionPlay_selected.setEnabled(True) + self.actionPlay_next.setEnabled(True) + + class DbDialog(QDialog): def __init__(self, parent=None): @@ -301,6 +374,8 @@ def ms_to_mmss(ms, decimals=0, negative=False): minutes, remainder = divmod(ms, 60 * 1000) seconds = remainder / 1000 + if seconds == 60: + print(f"ms_to_mmss({ms}) gave 60 seconds") return f"{sign}{minutes:.0f}:{seconds:02.{decimals}f}" diff --git a/app/ui/icon-fade.png b/app/ui/icon-fade.png new file mode 100644 index 0000000000000000000000000000000000000000..bd4ce4d02c5e06c1f66f5dd68b0e97f11e76c1b8 GIT binary patch literal 4099 zcmds)dsx!fAICqS3u`TEwX}=67G>)qIyFT_ElXt;w%RJqYd7XHabgj8fsJRiewGxj z(!fhUwz(dE&ZTLY;$>z<2;?ZOD7943n4&@{qVPMeUH;$m+aJGp9-ec)?{hxS`JVGS zpZ7W66I-dFZ_QXZ0|4Hlgl*UcfJId-*iA!)@#wvARM;}sQ$DsszjV8OU!&*g$zc%; z)W3b|k6FJ$coc~XQaA2O-A+G{%8XCh4@@T0H6iIBV{d%&eph-5O*rVk5CG4mY*_d4 zQPIE?_aCB1<8KXjl13%w0>_!rtKay@^V@gw_RQHc<0dbP`0q81GxD65oo)@jxboBT zCseN!4Z+7|VdKl&JTW^rO1G`s95lR*uBoJlEh(+JH=FRd&(tw%^wPOrU-u0DNT&Fz;=EtzrM)!o^ahF;?>8o~S2} zKqRnyrI*C*bMc7_>QBWkH#N8F1_*(hM^yf1#b0)m@?!SZk#H-HUJ77z_l?8Cs|5cxx~?=yNbbZQHjC z&gayAvv1)~Cvdd<9=c%Sa6yK)z4nDogLtqT^HcR$eZfBZy?3*lM{_2s?V#_l^(w?< zXK{Fv#B4A4E`W`TGvrwp4Oelp4h!hlU7$#{9M&?;^^3eGDorc_(R>7g3TvD(wGQ^y zkm3r`OZXcI2c$A)!8db&puli_857?Ur^?a584j@GU4Wv~0NnLx+s~K|u!8Wv77m?q z0(>Qp!4S{{wWoXf3B}nl;U`7SE)yR}iPy;NGssNdo(vsLd%ULklzg^vg_10)6i$?*Iq#G^e!zSgzSoWDXH9bJAU0Erm3f z3eqvXljHU-CoBy5`go)8Rg{jf6gCQGQe9X}aoQMZBT1jyI0pliY}c7(E-ccCtQ%t5 z9nFI}S8QA`G~AR?UWV|yzEI0FyMoCW5Gs$yE+q5z8U$(BAh?^vxN1F!xaGVrJs5h+ z>9gtZNaEl<;pLkzzkECr%Z(8ppNLva=Eb`@<=bqPO2aE?&(bV%>H)^Apk0giDFz@n?f^rg}oO5I$0tFj{J;o>GHKfB+$3E)ai zM*N+DH_HgDrPBV!gJVxf`8}r|*A0D`6q`F}4aUITL`M8kvQ$P1`20*4gFb~RlVfWK z+$5sQ!$ssTaY;ns-bs!v1eM6OO~g|Ljh9*d9cfr3h~-Z#WzA~KmhTB=j*e*<*!sNr z+S9Vu{={qvzz-Fy+sfuv4+qU2G}ap^+g@>6&I&=!&x$v~v9xtlHTG0364gjkjPj9Z zX4s+=qUdy?v3L4wt%XG?LYtrdAK1 z16d}w-G-QFB!GNs6erM6eLhs#l{=6at2m+4yC64dx96n3Un5&2rX_Daa^8ES**W^U znU5MCwoRm;Q{%+6A?}*1_;Rm6j=mmwkenJ7yT96}JD(f+U~nYlT$TrVgT0*-vjGNB zQ|~=~p{(1l?7I8Vobp_}VN6j%deN;NtRF*zackp*qP(W|Oqu1^U-}lfT>viO;e|pJ(b%`ZKh95$ zLr>0R8>eYl5cK>i|D?*ERy%jdP95EG`{lFEiVmY3|21&=B1!d~_Kr+fzP|SP&4$q1 zdjeVzXU#!+p!ONwc@8AkqXD)#?GDJhb?y(iBM(O8{#EI}&@4lg-C|rra027_Si6D9 zxpMZ!xZ0HbqBQ-QZ_fSkHzP`~R>XvhT~hc7k+g!reFaJT-Sss0Sh;8PFqt!!sv6gG zI+gK)bVFzKUHI3S-9L3}{0l7FK8)`Z$ZT642?x(x@{0Y$p$H%pDMVAb`nw!~xc({E z`Tim26|c%GzTdZG<_F;=Xn(ePfKLoVp?5w|opH!Gds;+Ntjsit5){coEhNg*B3fLr zhvpmNQRYsmnL_ZXw`LxxBH}xK{#^aAPGm46Prx(`3)^&Q1sDULGo&)Zkmk{CeYC`iN{Oy z+MP^`XGvx3tO@@M#h;v0x0ieAtDoYzHJKUk`0!-QjvYEWt#W)vKvcf;v&pai)25Cn zE5-$$Q6^q!Lu;8=yc;bY@;0at?z>OW P9D%Zty5Yz5abNxyaKlS? literal 0 HcmV?d00001 diff --git a/app/ui/icon-play-next.png b/app/ui/icon-play-next.png new file mode 100644 index 0000000000000000000000000000000000000000..cdde2189bee04d6ae43804fe376b1fff9b9ec46d GIT binary patch literal 2782 zcmdT`e^8Tk7=K=0W%z@QvSh&c(OH?A99jY?vgKhx3e(U|OACz1m+}LPa&&vRzfUZB=-L~)ZJfG+D`FuaO zdv6EVCqC^nD_|A?_{7J>J_|4nkJG@L#ILW^4}OhbWY+5Vjo#kgt(|-$mNV1iwqybL zEu`PX@_2e$ z$kF2`PJVu-N~=5f?ZuYMSB#z4O+B~n*d5MF#;Op^Z&Q5ilN+U1%?80y&Uyd+KOCOU zF7R!d?KYh50{=LR?K4%${Pu1RWpp*ujLq&jY; z>Y>TpY+GemrdTSMwsa?u?8u(n1_A8McYeO0%qv`;tDm1pvb!(L4$chF4fJO7pYTbE zb{osDZS@Lo(tIlYUI5*{tSlD?=-6F6jv{J3Bb50QQAp-O7cWT1-gb}_dQSXc=^q06 z=)wGom~1SA|F)utIy9DH60ow@IiHFPm~>hk^}W{^9~0t69H5~?jPUZaX8kjyFXJ{e z@w<3|BO6MUMD_}8d)TLEsoOr-#Y6RRR&_PbI8NLUMPtDV$OvWeI3M0EE0{da*I51m zjRnz=L6>8u9x%H*DWk&2GZ@9CC@-Bah?r!9Haw)}p=a}lpd-?w9JDms?Z>z}iFidY z0}7i7=*j?vlmnqtmPT8Kk%ALMRTn^S6!4;%;9Ek%pW8VDejtFi@3tDd#~~&zb<~?= z2@yxuygsG4>$c3!f*-;1)W7+gz7hQxty9X4NutIj3}QfO zI=^FDsC=-AfZyAyaW`JGhXW~B&Hgx(M7q5~<$*X;x65&MLGuF6tipLXlWSeqg2CLn zkO`l4MZ8JE=`VzsTv6J4QK0*%^+9Y~stZYYv_1&iYeh2LG%vwGPdA)Ls^2sbh;SW6 z?wlHT%=8M`4TP!MKEmxV%_BH#G03GM3aiZKt*|aZqMO-z%w1);iHIEA1rn}CE=O2r zi;{%Y+&|9@=2;d%wn-yWu5A{i15wi}Q}fd|D);LX>e7r4&#h#jjFS@meb6tyGG7 zD}f3rNu#I|QOBlJ`{)q(Zb+41DR&V+J1V(O^0U5#Qasz#>#(1frAExzOWRh!_4X=L zh+>JTy`QDqADQJ~q-a$u5N?n;j8Ktx2Fa|oCOsEc8eT(Sv1RaS1{ms`*Ifk9HZK9m zGCxML>Y8jC(-z5ML9IrNH10R*r5ep_&Q_tBM{ARD z|8iRd?k`R|j=&ijJ(}sybGgov3X3qpNru~VR4$@)?;z@3toK36-wiEw&FH{dhJA5e zBKE%!Vqe|XfIM?8rq*UcVG02(kR4@E4~0`43|&8K+@P)4i7A3 z2q_d6q3{%3W5)uN8nUA^H>=&t{w^wY6_~VhMr?X4=pn7W&;JN|pzk9Du4?#Vm)d(f z50AFTU2{@bI?bpm9mjYa{vl!b4&R3k(xW$;%|93DoQETsD7x}`;{ykVvTKO=XNYuu a#z^~>-pB-X?@{`x6Tc=gwsLjKYkvWOs7HMO literal 0 HcmV?d00001 diff --git a/app/ui/icon-play.png b/app/ui/icon-play.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad12c305c603b1fd5fc0b1dbde6d890aeff67d8 GIT binary patch literal 11891 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ÎuymsGn>5ky%!TXReQw;F<-p`Zhi~VCGw;T>;7?3uKXz5e zRYr+A$qH~Ak4(g_BUWP{dmEQ#p6FM{*ULcaNxw6R=7 z2T`nB@L?EEjX3nybn#E)))7lFDbZv14L|BIW1cq;b80aRq`t4N;<{m@=sKd9Lq698 z-VucTPWgXn{`2+Q;%T%5ZPom~!npKEAv&05;$-+@_>mzdT3a?rcRa_bL-DLFt{~$r zpkKBtWYhECHbR6LNj8W^@1M{hT@Kfokt{JsV0ZBre8F|0J96T-mL1S~GFnaR44O{b zYKJR!jK#VJP2RB6g+Mg)J3b*#%2Ujis(J0>F0m9oVZ<0acKpaE!y+9oXknBD3A{hy zer}&TId-kYT%+SB-n!_Fw4j0$Uly_M?>-UU5s#(bX1nT|d|}60*UHI1><&RVTeHV& zs@3xkq=bjl3Y-kv$$7B9W`ltqeBl^cyKe(YX&t_*;}kQ}`A8St>V{DW9wV`6$c>YG zbO}O<4yg$Ab?lG>ykn29ne*3{Vz`Bsx7i6D=IdpM)p#GzJt;jWCGTQx3Vkm}?aDyE z-5n%kF>zIK=j@7;Z_isqGK{1|=uG8%dRV*^M}J5BW#f}r?vRa?nL}*Yc{4QtX{DLQa%zlu`!#c=&OakG}ikw5yE z15NOIF&;1INKc$sGGV3wd*e^gESKKev#Av0G+kN5&Is4-hg&0WSGQ<-A~=M7Pi{%X zPZ@TG1Qq3APZ#vdb;V%?!5S-0fsmz^$Ti^wSWXbcr~TbnttJ98Mt6}x&I`M03DL2% zmG~_odfnn^9JDUspD1SheDkt^FW#J!aE6sb<%)Fha%Zt|##wC5)wh79pSVv~w4rrM zKc`=WXAJ$_V?shC96&RwT33=E9iRI5Kg+|bVgC+?>1;88W@a1bjGX4q& zUCq7TdP3O$#7v)_oZYIcs-wu^NG9tbNm}_^n{KJ^`T3pKb`t}FmH zo(99cqk%R7$xwiB&+?K=Xeh%ZLIdQgHCYJ|wp|8wRjiD_Ky0X^O|?4RPRPZZgSJ7< zP$0sC27hJxW7yP@f26<9vTipfTJ7}^>i~5ILTo2HtDH{?0xEZACuO&0LG|q%JNM|B z-rWgtR1|%5!PnU-)qrsIl805B(6)Q4tDfk1O^NWbP-1yJfvWnE zViv$5y68sJ%7cLXs!dJ~)GD!@{X|C}o_ZIymJj3Z7{$!9PG{27=z8xV;FFTMob})! zl#e-O<(lq)KL^jtbB(ViPmNN{at1kd(Rbm+SAcCk)u*3T+yObf`{T}|ZT3NZ;^<)c zybslr0jGH(R&08`iKQ12lC+kMq7xR(lCoJ#1Xd)%MupLZAJ67~Zl_o!9&MbP{s2dz}Sitc#9Vo*wlyc7)sW z94kk&Ri(~A#i`cat{PO&iNNyszE0YE39r}Ky40!#f%mI7d%Wy$lsz)NUpGKcY(Q~( zMU4*f@TbT=PW|6b+U~(bD~G<|!?#Ba9EMGG=!K13(6Fja4~3(6ZWSM{Q^2=X8xpw` zL#o*jICmdfMtO`;{XGLl&ptTEth+LBp5c}Q@}w-nW5}#rIL+_ehJuk=CtS^_GL}mE z4bHrJGI0JN0i_f0*NS~YNrlNC4=-pBLgYL_sTt3quMgV_erHvEN%suK3gY9Js*A6M zlM1(Z*|@&iSm!OoCL_QO*W+x{cSa6SbD&w7eI4=Zh7Sk~BeS08;mfS-DgzfyvU7mE zqjQolOC z3j$=;Nys5aMi;1cDW{P$F1-aC9@+;*VU?)ipDAYNHB6ytP)%+dm$hP8LQ5lI&|LMs z>8mj&bXJ=h4)GNJ&?=)IbG7&!RN2TST>H1)H=3I-2149C;COglg zKh_W0zulzs%gqh~kd zvG9NzkQ=*Y&Y$E$TaIG0MXv>@p*i{Qn+kjQ=d{OdNsxgmZCgW-DIuo@aVQzKnFQj3gqu=m; z=8f`<;%yL_5_*UXppq&?-y*9%hUtbUGsO`CLMAxC9Z)RA3zgC5sgDb_b6);V5NSh@78X2Bas8%w@4rloc%Jv`^POX6rQ?KYKZxC2BWXCCfuOTVwt8mgTYlx2G zti6Oy@(>u@&w2Q@&prksvn9^fjK$;CbaadxL%BX1h^XDLQ>OB7#galLLft1ca)xC3 zfY`6LQckm+!G`%J=%{4DHz%1|&R|M|R>D$Egsd$`$U!W#af5;MfTLmhwlj!79Fg&Y zBZo+5cip}i4f}h_=5Ss%sjn}+$6h7ts_E2YR*NE}Dqje@8tk*B3OB?EKPxy(Qi2rj z-Uk}pPzcYXxYt3!82ItMh>Lju1DaGP_0!= zmjwM}_4`nPy8IUOc8U3^0|mlAR8`=6ZJN86LKL#&rmfP4xrO@yoi3R$Nhq@+F>I5- z)o5WvEwcg!)EJbawCHVue)L{R?WvtY0-f7bxi65S`UQ0hiY9Y3`_q}JO8N!cI z_>m+0cnm)Zgdf3Gi&kyoQ1DT9l1m=2<_6(WtFEb?|FzYxiiJAh{ z0b@)y=%S9nmgiGa#wtku7 zXlAm)m-|qKZLY1`9;C3x+zDnh6N&d;d#;h`dXiO>rmYdOk;5&Kog=y!(2cQns&3%- zuhpAcdh!&HhQk9ZQ?;mDbfj(=syUXdA{E(N?KlV?A;gDQ3#opbODWp z^sUr5w)^re>`Kst2KTqSIpDph(Q6-BD!;zPZCN%cvKQx~o1mDkC$!2T0Xp!d?<#}` zWb9`!`@fqAc?WMAG52Nu?X7_ePW~W!c^j1^H@Dae@3DWrYy%_sErBNK%CtO zx)z2VuC4gsjv-?zE)-W2G<%rL5>ihNIux3g)PYyhQ53BTRJuyu@P+NG8g}GJ(@ou% zBEU#YiS-;(I3Mq;4~q&nS3>;0z* z=eN>_y=QHj;)|+!WtcQcz)N>tiKPZ)#4U5T+-1Lcs|S4Vl6G4=?S{~EZs6ZM8+(~; zX@8mxB}lpwC3?f<^*Ps7Q5Y;yICJDkk(%C=2zZab>VlLf{_^n-laO-cx&OQgHRqzR zDbu-kjCJS(TzwgxeVcfTZ2QW!m2z!za>yv_@HPN^|NQ=wOot|-Zd$ZHFzj%)svfBt-pt z0HBsbP2~)Ja;b~n2EAkEf($$O2=tEGzMggE|JOSPT3%n~Y)H!P%TB6pt|{*Cz|w|Y zvvsMAXD?k_d;a{%3J`GIdLhq6=$G;s0`(J*?HkbZC6Z7u7@+nGNhhIZJn!*`n)pyJ zA!5NkQ{PHy!(e;>Bq3Z4nx+g@#{?@2wQcX!gB+FiS+4^zw5}ef0if0 z=L9R@8(WtP7fOltH>3B!jS2tW@o22d(^&?D%9)Wgp%UIx+ydnSp$cMo-|qU@JIyun zZ;tW5J?hiD^HLn3YNSMCssaR6PLpNe>9+(JaOnH>1cDr18aU{BT<+~DoP*+_Q{LywQa2`-UE5*IO6)>;|nx2 zl=Np&)ZoajQzdsF3OTMva)+XWs8iv++L6y}BW;7cy<`BA`CxvC;R)5n&+7}I=Mqp? z^scP0uTu&nmtT8Pw!5dU51gQ>m&$I{g+S;ztXK(OkSaRwVuMtUDF}}9UiS@Kcn)_m zV-CUyt!wq7cE?lg$j%h>4Rdg)b9U%GwoodOnmesbj}&(t?;cKkbngatCsMjg+uJ{^E11P=G*chVu{~Ruy>%!;W6f{Jwxz4 zm&l5G=vcXuWRj_$`$_~9t`L@AHV@mA)FHY;;O8Y%P8b%fBc?ik7<{n<89V7B1B6{c zIK2~NV=*ls-$SCaAzzQr#M{%?LOr$2-HVY;`g2Ceo)nBOROC*|1yv>0huzq{ ztGJo?w~clH@J9-}*Iadjprve5%#Zq>ij@Hax}x)#n#6A*RrfZ37J>H!Ws?`;f8!Jw zGr=H7oDtLQ--n%UK`r3Nr4O!8+D^g1BpVKS2LmeNh4(gbeoZlm!l}{5RJRT{zxX9l zYiZ9 zGw5td_^HqWA47Eiw^^H_hy-Ei%oz&NiMByU&Ebl+f}a{Zl-rFDxxO{%(R3d-j)%@N7oZt;fmQkCy}0>$NT!Ek10cGG-p2iOSh}qSjYaIp4>{BZhJkrYYa8SnG<2pt_#1oQ z;r+p?TIkUKA70icfUiRm^J*|&j+>wez=-<1Dwumgwf1;>LGt^KLNb zvZeO0d~}7U)R3nw%Tg191kAF`s(1W^Ku;rzcgj+K#CtG{ED_L|DKu$i2aMeSyj zkf@to%2ZND)LhGa8`uVZKhW-q9v0HZPuVbI&Q7ee-QA z6twC6FP>}qu`Mk&*U79ut&;nt>gL-JID^wnY$$^nI;ZL8@+##N-2qMHyvpbq9ziHe z?8k6sjL*cnAUPYHz=Ai8K=xp==s^fhyNlzSEyaE4NC7pI4!lluw@`tG6I*znm8XAd zQ~nli+3LO|$pI%Jo8b>Zt8VtFwCXRB^my`qq5a_p8MGgpLhX*IS{`>1o|r_1XdAf0 z#a+=hN8~I|MhM${@bQI0?!pwy0-yeUd2AhTSVaYC1znm@M3?pr=wx{D`OpV&C`_m= z5kdomIk?70;?aj`CN757JBosZ7t9)-7pfyvcV~w*;=E^Og}d({>C0y1Jl_}bn6vAz zz-RpjDP9!6J7TH>CN7x^MuB% zU|Jof+$i_vdT)L3eD?RWhyg2YUP;g-+_3D~=gfs+uJR%(j{dt2+k)g{-27O%knu4`T*CK)qKrAp!dAFg3lNs14vt*9|I> zz`>#FduFC>#5POV*XWn6q{NWmOCJUV%@RQ#?R!Wz!K`i1j2&-1@2;>F1Y_-3re3{D zFoQ1iR9_+L!VLG8CT#TKWhVQ=Ab3F5QN;R4Lm1FoQYU-!^-I%d04G* zmD$SS%pg%9GrLQbDrzLrY^>A$N_eJpEDJE(HB{_ykAb`^)JNyb7Bo;tm_vQW5jQ(J z>x+zIOy2M3Zt|8k>K^qiAef2u#QB!uHVTiX=A%spAC^~wLnRB3tBiW{_VBI>S5|(9 z%;>y*R}_^7M;~Yxhpt^1lz_YQgLq!Pu$bzOaii$#eY3tdHUeLv@o@WSgGy?wd^mx7 z?Z{m4qZJUAto-6&Mv8KN3Qgj0YISCwaF0GPs0Xn^E4d;+UnkrP(N)l_tTU~lVDSo8 zir{8_i=A0pG8>CR<*A;WPpBfM^zhQpC*o$^7VYWCtMAGC8IL}tqA|=E^9iM#JQ<|m zB_{-{_OVuk9NFfN_}0zOWy&C1(qYk0l7tZpZeLOD=IC&m&tX_2a~$_NoESzC9Ojik zQAinq$@(;5_Vd))V9dYXw3R>kdQYdpL)j~;^nr&U1k?3ke(shGf?<_nlCaHeNGv6M ztKbS}i8`SaaDjk=1MPuGCdM8b7N_ZDNx?(T(m~jh?FDcyihu1b;3I_!1;vNSf)PYU zW2No0h#ya7^gLQxM#55a+NaR-%$VbFJY+bzyt*?%N^mPVRr2|@o*-%5G_D}ki&|inQt6|r)t``IlRR+QnwDs)i z+L|Tj?a@b1!^oW@Zfvp32@ujd6)b1`al6hC!^nbER4z<~obg18_ZFQ#Ic9H@>Ih2) zu`uS2^S)faKKsJgkmU3|GuhmIE(Pi)70)x{w z^k$$yHME?1vfry-JD?1%a@ZBF6)!-g?(GE68D3HV++*#s6(%Ha13VnoS`f zcV&t8cwuduK|`oKos)=(m!Ef_tu({lbOJ(?C0f-q5e>><-=T-KO@a|vySE5y_sV67 zt^4bA1vK7kSoWtJcalG_t)KP_>(fdtQ8xb@W786 zq&5E)>EXKW#`dAC^Pj8}&dLagJT@mDE=hn(dTt<=I()FRqW*0p07P60!ujEiDBDaWdv?KCM0_#R9_&@US1Zn zNqrMN0LuP^X{$Wxyp)^70Plx5UlFZWoJrVaFbK*TVs{D*VX5bT1&nLG@$tjGj}JmA zN-f&OT{6%Zln4phHYhga1=J@=>dK*OlL%Ig(a5TeD)P4#>hA11k|m%GZ#+5 zic6FKS8?et>LXIIBiGuqM~av068F=cHfAp|el7bXuF&UV8kE$TSBF~Wtu3o~o;;bX z?eL*u{PEM6;){^4dVVS~-&S{Xv^XqCRm$i%jz+=)&hq$8nZlCK6bI8g^S!VTc4A;{ z+2KsgNa4;!-yd(9NLW})YG+|29=$mfFE|sw>l&?Ayg{}BKcCB4>c1aWOoIiD0+mq@ zwk2;ZyYig*CA^b+P!Va$7w4VJjLOPTt$T$xD{}Jnncoi!b-P9HoZ6nnK%-caCZQ=e zC+UZT#j>;ep1x(}oO_F07c8L;#`yOV@7KHs@ol(xlFt8@+d|!tLU)FGym83s#i6z? zqN|p?cg%(K``3!U!2ozRk%*Ch_3Z+W!i#>d_jiuSH@~QRt;7cPW#oGH37irvUFvfV z+F;bQVt8+5{NvW}j2ARs92zuh+A8)whv{|cE+ZBO)B~(7vuGq=PFh^_^jZ- zN*p@3XQuRkGZl9fr&L!qyx-tLfZWGT?6}|LYkAMDb`Sf@eFfi29u2P)EC!BePGi4? z{h?j=9B;O>?6Jo8Q$K>F3M^+0KDSL)|5x7ZQnc9VlG(OQ{3*Mj7&n;ja)p5Oz@oi% zO}WV>kNa@;K*~c<$L+>!IV_kJh?tH%{Wkje@BgixURsr|u1-uly5a^4!~ykyoki7t HzjOZwedMX_ literal 0 HcmV?d00001 diff --git a/app/ui/icon-stop.png b/app/ui/icon-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4d1659c706c5bd65bf265c03ac0405f16db805 GIT binary patch literal 2719 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 literal 0 HcmV?d00001 diff --git a/app/ui/icon_search_database.png b/app/ui/icon_search_database.png new file mode 100644 index 0000000000000000000000000000000000000000..ccea50690b702462cadd841fee11f5fbcf00855d GIT binary patch literal 24591 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 I+_roAKlZ=9JOBUy literal 0 HcmV?d00001 diff --git a/app/ui/main_window.ui b/app/ui/main_window.ui index dcd1a2c..f5b4c58 100644 --- a/app/ui/main_window.ui +++ b/app/ui/main_window.ui @@ -14,178 +14,89 @@ MainWindow - - - - - 10 + + + + + + 0 + 0 + - - - - Elapsed - - - - - - - Sans - 40 - 75 - true - - - - 2:46 - - - - - - - - DejaVu Sans - 16 - - - - 10:17:37 - - - false - - - - - - - - - - Fade at - - - - - - - Sans - 40 - 75 - true - - - - 0:53 - - - - - - - - DejaVu Sans - 16 - - - - 10:21:23 - - - false - - - - - - - - - - background-color: rgb(252, 233, 79); - - - Silent at - - - - - - - Sans - 40 - 75 - true - - - - 0:58 - - - - - - - - DejaVu Sans - 16 - - - - 10:21:28 - - - false - - - - - - - - - - End at - - - - - - - Sans - 40 - 75 - true - - - - 1:00 - - - - - - - - DejaVu Sans - 16 - - - - 10:21:30 - - - false - - - - - - - + + + 116 + 16777215 + + + + + Sans + 20 + + + + background-color: #f8d7da; +border: 1px solid rgb(85, 87, 83); + + + Last track: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + - + + + + + Sans + 20 + + + + background-color: #f8d7da; +border: 1px solid rgb(85, 87, 83); + + + Before the goldrush - Neil Young [3:46] + + + + + + + + 0 + 0 + + + + + 116 + 16777215 + + + + + Sans + 20 + + + + background-color: #d4edda; +border: 1px solid rgb(85, 87, 83); + + + Current track: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + @@ -194,7 +105,56 @@ - background-color: rgb(138, 226, 52); + background-color: #d4edda; +border: 1px solid rgb(85, 87, 83); + + + During the goldrush - Neil Young [3:46] + + + + + + + + 0 + 0 + + + + + 116 + 16777215 + + + + + Sans + 20 + + + + background-color: #fff3cd; +border: 1px solid rgb(85, 87, 83); + + + Next track: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + Sans + 20 + + + + background-color: #fff3cd; border: 1px solid rgb(85, 87, 83); @@ -202,7 +162,7 @@ border: 1px solid rgb(85, 87, 83); - + QAbstractItemView::NoEditTriggers @@ -225,6 +185,9 @@ border: 1px solid rgb(85, 87, 83); 8 + + 0 + Index @@ -267,41 +230,340 @@ border: 1px solid rgb(85, 87, 83); - - - - Select file + + + + 5 - - - - - - Database - - - - - - - - DejaVu Sans - 25 - 75 - true - - - - 10:20:30 - - + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + Started at: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + FreeSans + 16 + + + + 10:17:37 + + + false + + + + + + + + + + + Silent at: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + FreeSans + 16 + + + + 10:21:28 + + + false + + + + + + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Elapsed time + + + Qt::AlignCenter + + + + + + + + FreeSans + 40 + 50 + false + + + + 2:46 + + + Qt::AlignCenter + + + + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Fade + + + Qt::AlignCenter + + + + + + + + FreeSans + 40 + 50 + false + + + + 2:46 + + + Qt::AlignCenter + + + + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Silent + + + Qt::AlignCenter + + + + + + + + FreeSans + 40 + 50 + false + + + + 2:46 + + + Qt::AlignCenter + + + + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + End + + + Qt::AlignCenter + + + + + + + + FreeSans + 40 + 50 + false + + + + 2:46 + + + Qt::AlignCenter + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + playlist - current_time - fileButton current_track - databaseButton + previous_track + next_track + horizontalSpacer + horizontalSpacer_2 + horizontalSpacer_3 + horizontalSpacer_4 + frame_elapsed + frame + frame_elapsed_2 + frame_elapsed_3 + frame_elapsed_4 + horizontalSpacer_5 + current_track_2 + next_track_2 + previous_track_2 @@ -323,16 +585,58 @@ border: 1px solid rgb(85, 87, 83); + + + + + + + true + background-color: rgb(211, 215, 207); + + + toolBar + + + TopToolBarArea + + + false + + + + + + + + + + + + + toolBar_2 + + + TopToolBarArea + + + false + + + + + icon-play.pngicon-play.png + &Play selected @@ -341,8 +645,48 @@ border: 1px solid rgb(85, 87, 83); + + + icon-play-next.pngicon-play-next.png + - Play &next + Skip to &next + + + + + + icon_search_database.pngicon_search_database.png + + + Search &database + + + + + + icon_open_file.pngicon_open_file.png + + + Add &file + + + + + + icon-fade.pngicon-fade.png + + + F&ade + + + + + + icon-stop.pngicon-stop.png + + + S&top diff --git a/notes.otl b/notes.otl index 49d71ed..45e6d4e 100644 --- a/notes.otl +++ b/notes.otl @@ -1,46 +1,70 @@ -Play track - cause - menu command (play or skip to next) - autoplay - back to last track - track assignments (modify for "back to last track") - last = current - current = next - next = None - other - update last / current / next track display - timers to new current - show track as played - update start time for remaining tracks - record track as played - if playing, fade current over 1 second -During playback - Update timers - Update time colours - Status bar Total remaining playlist time - Stop - Fade -Playlist management - Save playlist - Load playlist - Add track to database and playlist - Reorder playlist - Remove track - Add track - Clear playlist +First release + Play track + Cause + menu command (play next) + menu command (skip to next) + back to last track + track assignments (modify for "back to last track") + ✓ last = current + ✓ current = next + ✓ next = None + other + ✓ update last / current / next track display + timers to new current + update start time for remaining tracks + show track as played + if playing, fade current over 1 second + Log tracks played + During playback + ✓ Update timers + Update time colours + Status bar Total remaining playlist time + Stop + Fade + Playlist management + Automatically save playlist + Automatically load playlist + Add track to database and playlist + Reorder playlist + Remove track + ✓ Add track + Clear playlist + Clear selection + Click current does not change next + Display + ✓ Remember window size + ✓ Remember dialog size + ✓ Remember playlist column sizes + ✓ Timer font less bold + Make elapsed time and end time correct when track ends + Select next track if not already selected on track end + ✓ Top: previous, current, next track + Buttons + Play next + Skip to next + Fade + Stop + Fix icons in toolbar + Misc + ✓ Logging + ✓ Preferences + Database check for new/missing + Database check mtimes as well + ✓ Move clocks to bottom + Status bar + Timer colour warnings + Non-track playlist entries +Later releases + Autoplay next track Track properties Copy track Paste track - Clear selection Track volume analysis Open track in Audacity Wikipedia for song title Song facts for song title -Display - ✓ Remember window size - ✓ Remember dialog size - ✓ Remember playlist column sizes - Top: previous, current, next track -Misc - Logging - Preferences + Named playlists + Song lookup as RompR + Visualise track volume + Script notes + Higher precision timer for some things (RTC)