From a00ab9f4ae4190b07616c99abe5c1d04e38240c4 Mon Sep 17 00:00:00 2001 From: cidoku Date: Wed, 8 Oct 2025 17:24:16 -0300 Subject: [PATCH] add music options, random play and copy selected track name --- AO2XPbase/ao2xp_themes/default/theme.py | 11 +-- AO2XPbase/icons/cog.png | Bin 0 -> 512 bytes AO2XPbase/icons/control_play_blue.png | Bin 0 -> 717 bytes AO2XPbase/icons/page_copy.png | Bin 0 -> 663 bytes gameview.py | 98 +++++++++++++++++++----- 5 files changed, 83 insertions(+), 26 deletions(-) create mode 100644 AO2XPbase/icons/cog.png create mode 100644 AO2XPbase/icons/control_play_blue.png create mode 100644 AO2XPbase/icons/page_copy.png diff --git a/AO2XPbase/ao2xp_themes/default/theme.py b/AO2XPbase/ao2xp_themes/default/theme.py index 330fbba..dccb339 100644 --- a/AO2XPbase/ao2xp_themes/default/theme.py +++ b/AO2XPbase/ao2xp_themes/default/theme.py @@ -4,7 +4,7 @@ self.gamewindow.setStyleSheet("") # window size is defined at the end of the file # IC viewport -_scale = 2 +_scale = 2.5 self.viewport.move(0, 0) self.viewport.resize(256 * _scale, 192 * _scale) @@ -162,13 +162,14 @@ self.btnNextEmotePage.move(viewportRight + 286, self.btnPrevEmotePage.y()) self.serverTabs.setGeometry(viewportRight + 14, oocBottom + 200, 288, 258) self.musicItems.setGeometry(8, 8, 268, 184) -self.musicSearch.setGeometry(8, self.musicItems.size().height() + 16, 268, self.musicSearch.sizeHint().height()) +self.btnMusicOptions.setGeometry(self.musicItems.x() + self.musicItems.width() - self.btnMusicOptions.sizeHint().width(), self.musicItems.size().height() + 16, self.btnMusicOptions.sizeHint().width(), self.musicSearch.sizeHint().height()) +self.musicSearch.setGeometry(8, self.btnMusicOptions.y(), self.musicItems.width() - self.btnMusicOptions.width() - 4, self.musicSearch.sizeHint().height()) self.foundSongItemColor = "#80ff80" self.backgroundItems.setGeometry(8, 8, 268, 184) -self.backgroundSearch.setGeometry(8, self.musicItems.size().height() + 16, 268 - self.btnBackgroundsRefresh.sizeHint().width() - 20, self.musicSearch.sizeHint().height()) -self.btnBackgroundsRefresh.resize(self.btnBackgroundsRefresh.sizeHint()) -self.btnBackgroundsRefresh.move(268 - self.btnBackgroundsRefresh.sizeHint().width(), self.backgroundItems.size().height() + 16) +self.backgroundSearch.setGeometry(8, self.musicItems.size().height() + 16, 268 - self.btnBackgroundsRefresh.sizeHint().width() - 20, self.backgroundSearch.sizeHint().height()) +self.btnBackgroundsRefresh.resize(self.btnBackgroundsRefresh.sizeHint().width(), self.backgroundSearch.height()) +self.btnBackgroundsRefresh.move(self.backgroundItems.width() - self.btnBackgroundsRefresh.width(), self.backgroundItems.size().height() + 16) self.playerItems.setGeometry(8, 8, 268, 180) self.btnPlayerPair.resize(self.btnPlayerPair.sizeHint()) diff --git a/AO2XPbase/icons/cog.png b/AO2XPbase/icons/cog.png new file mode 100644 index 0000000000000000000000000000000000000000..67de2c6ccbeac17742f56cf7391e72b2bf5033ba GIT binary patch literal 512 zcmV+b0{{JqP)CQDsH?WF>AIFt zQuJ}i;w2$ZUU#3SZ6RY0Gw;kZ&ol1~2ky^QZ(fom$=jNJZt!z7w_pH~wdQ;R)Gh%BbQFCx+Nm!4SuS-vkr`vhhrX zM*>w%e+v~?m@q~ImPAgtLkR_3U<2F8LP3W5=LJ*ZN|S5p#sf4YFr$p~Q~Z*0Ngxf2 zjk#J#<7EAlhzlrV53~GF&pIzcCN_lz9@05UeoUXiK%N z#x+4o*i_c|6_Uu1+&TIho?3@y4k-#b8Y_o94zW*B3a1ne2-Y5s0uke$$|@=}OP-i= zNYZQA=>PrZu0MfSL=b8UhD_={W4IY1{b{)U)*gc45xtL%IYLY&hF;d`@GzI&7H&D# zh;z_BX$#hqh@q?AY3sJTod2%*Yd)_>YM0#q&ixGuh+PQsneK)F0000*bxx-)TO!p6i!Q&%N5)kR|pVJuNho7M&@5o@ZpsgYXg z6pCpqAEgW*0v6~{n89ISU>M4A&V?DNy7MOQX68Ka`MBqf0l?U(ZY+X9l}VLZ)#Om- z;Wxvd@uT21RmKNz1dH$Bj0zp6>Db9B7mX*l{i7uPYA;7kd3g)QVC)rxA$;8vC|jea zS%$3%AWB_OF8f4{mJFo|55c22v$T`7VytGO85j|cC%=pBjskcjxd*)11x{77(<9$R zNrwG!M09PX(8Nd#urDkdGiz{FkfHKZhPUAguyq;A^$wKyj&8EE8)WXSvDl6Q4NN}z z2Zd#i!U*1a7=Vq#3W3jRZ6Z9$+&MVBAqrVEFbBV-XzUqFMNrFnb9RsDb%-T!q1pza zrNBj9g5~vhG_q(g8Ht^6IILQuOJK}cdY)autaf$;u_Hxz{;liNSF+ zP7JVo4aPtM&mF+{jGz3=veK}ME-bIS)D6sEz9#6p*nx(m=)Gd##2kGE&YZW%&7_NU zaJbxh3nsTeLlsIj==Xtu`3s4ZJ3jM?zzC+xEl8DG(CzhM_b>rg=Lda=hWnnX#UBVW zoG_R&W`Q?ax-3JI?gr8ns1oY(%Y_9|I!G4+85=MXv^z2{WgQJlI?w zaoVx^@R5;6Z z(>-WZK@^7J_sq=QY_e{46@P+~LNG}sRzZsxQHvCsN*h5ir6^j7pq-$xu$N#V1gx}9 zClV7;5)7zih-s3DB)G=7|99>ji@So7-P24n=VQ(@GctDX!^_@$bj%oviY6e4Dh;od zooe%Wvs8LEKQ&&bL&@bwi=STIAI@!-gB2jC5+?y?VR~VkrNxam-`6*8&po|RZ5LpS zNKdJ%c4bTX`XjKsnecf%W>1%6WT?pKNdLLq{=(f(Col?P1+oq@R>)W(n=x!|*BIIh z6DJGw_w`)u6yN|vAhMteYK5#b%r5^v+VCFl1IGssaclZZMS{vs-LJ2$)n7DAr6==K z<29#%AXsBsDoO}SBaXR#_Ap!JKx)(1)3O2pj0_dYWz5By*X74fRT01$Fk%P_RzOMDtV?GU{nsYq#K8iy zb6qzLYDj`_f5$BwC*WE(t0m#xYJ*=jC2|HQYHh=pf#QG7oowi`h!L!{DB$8|qY{~X zu8@sU1tWq;n$XThR0%;45mdqXM892|{CJ@0DS*}>?ami06Q_^tvM~Y3K(_-`#m!8f z8f!QIrH4y#61;0Ym0cCoLl8{IPombPHtnn7%SbTdI&G-d>ZQo!_wBMF9nzX!g8HVY xYTJPGciz9XMh3w2fmZ(7v{)r*QZD48?mrio{~Iaoq","&").lower())): + if not self.privateMusicSelected and exists(unicode(AOpath + 'sounds/music/' + decodeAOString(fname).lower())): songitem.setBackgroundColor(QtGui.QColor(self.foundSongItemColor)) self.musicItems.addItem(songitem) else: self.loadAllMusic() + + def onMusicOptionsClicked(self): + if self.privateMusicSelected: + self.mnuMusicOptionsPrivate.exec_(QtGui.QCursor.pos()) + else: + self.mnuMusicOptions.exec_(QtGui.QCursor.pos()) + + def onActMusicRandomTriggered(self): + self.pickedMusicItem = True + _musicList = self.musicListPrivate if self.privateMusicSelected else self.musicList + _item = self.musicItems.item(random.randint(0, self.musicItems.count())) + self.musicItems.setCurrentItem(_item) + self.actMusicCopy.setDisabled(False) + self.sendMC(_musicList[_item.text()]) + + def onActMusicCopyTriggered(self): + QtGui.QApplication.clipboard().setText(self.musicItems.currentItem().text()) def loadBackgrounds(self): self.backgroundItems.clear() @@ -2255,7 +2318,7 @@ class GUI(QtGui.QWidget): else: if self.privateInventorySelected: for i in range(len(evi)): - evi[i] = evi[i].replace('#', '').replace('%', '').replace('&', '').replace('$', '').replace('\\n', '\n') + evi[i] = encodeAOString(evi[i]).replace('\\n', '\n') self.tcp.send('PE#' + evi[0] + '#' + evi[1] + '#' + evi[2] + '#%') else: self.privateEvidence.append(evi) @@ -2480,13 +2543,6 @@ class GUI(QtGui.QWidget): self.demoRecorder = None self.demoPlaying = False self.stopMusic() - - def onMusicItemClicked(self, item): - pass - - def onMusicItemDoubleClicked(self, item): - self.userPickedMusicItem = True - self.sendMC(self.musicList[item.text()]) def onAreaItemClicked(self, item): area = item.text().split('\n')[0] @@ -2511,7 +2567,7 @@ class GUI(QtGui.QWidget): self.tcp.send('CT#' + name + '#' + text + '#%') def onOOCReturn(self): - text = self.OOCInput.text().replace('#', '').replace('%', '').replace('&', '').replace('$', '').replace('\\n', '\n') + text = encodeAOString(self.OOCInput.text()).replace('\\n', '\n') if text.startsWith('//'): code = str(self.OOCInput.text()).replace('//', '', 1).replace('\\NEWLINE', '\n') try: @@ -2551,7 +2607,7 @@ class GUI(QtGui.QWidget): self.OOCInput.clear() def onICReturn(self): - text = unicode(self.ICChatInput.text()).replace('#', '').replace('%', '').replace('&', '').replace('$', '')#.replace('/n', '\n') + text = encodeAOString(unicode(self.ICChatInput.text())) #.replace('/n', '\n') if text: if self.cbMockText.isChecked(): @@ -2910,7 +2966,7 @@ class GUI(QtGui.QWidget): fShowname = mChatMessage[SHOWNAME] if self.messageQueue: - chatMsgComp = (self.messageQueue[0].split('#')[5]).replace('', '$').replace('', '%').replace('', '&').replace('', '#') + chatMsgComp = decodeAOString(self.messageQueue[0].split('#')[5]) examine = chatMsgComp == ">" or chatMsgComp == "<" or chatMsgComp == "=" special = not chatMsgComp or chatMsgComp.isspace() if examine or (fCharId == self.myChar and (special or mChatMessage[CHATMSG] == chatMsgComp)): # our message showed up @@ -3746,7 +3802,7 @@ class GUI(QtGui.QWidget): if exists(AOpath + 'sounds/music/' + musl): playLocal = True - elif self.userPickedMusicItem: + elif self.pickedMusicItem: _musl = self.musicList[self.musicItems.currentItem().text()] if exists(AOpath + 'sounds/music/' + _musl): musl = _musl @@ -3757,7 +3813,7 @@ class GUI(QtGui.QWidget): musl = _musl playLocal = True - self.userPickedMusicItem = False + self.pickedMusicItem = False if playLocal: if isinstance(musl, unicode): @@ -3833,13 +3889,13 @@ class GUI(QtGui.QWidget): audio.pauseHandle(self.music) def loadAllMusic(self): - for song, fname in self.musicList.items(): + _musicList = self.musicListPrivate if self.privateMusicSelected else self.musicList + + for song, fname in _musicList.items(): songitem = QtGui.QListWidgetItem() songitem.setText(song) - if exists(unicode(AOpath + 'sounds/music/' + fname.replace("","&").lower())): + if not self.privateMusicSelected and exists(unicode(AOpath + 'sounds/music/' + decodeAOString(fname).lower())): songitem.setBackgroundColor(QtGui.QColor(self.foundSongItemColor)) - #else: - #songitem.setBackgroundColor(QtGui.QColor(255, 128, 128)) self.musicItems.addItem(songitem) def loadAllEvidence(self, evi): @@ -3982,7 +4038,7 @@ class GUI(QtGui.QWidget): # We want only song names without paths or extensions in the music list for song in musicList: _basename = os.path.splitext(basename(song)) - self.musicList[QtCore.QString(_basename[0].decode('utf-8').replace("","&"))] = song.decode('utf-8') + self.musicList[QtCore.QString(decodeAOString(_basename[0].decode('utf-8')))] = song.decode('utf-8') if "base/" in webAO_bucket: webAO_bucket = webAO_bucket.replace("base/", "")