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 0000000..67de2c6 Binary files /dev/null and b/AO2XPbase/icons/cog.png differ diff --git a/AO2XPbase/icons/control_play_blue.png b/AO2XPbase/icons/control_play_blue.png new file mode 100644 index 0000000..f8c8ec6 Binary files /dev/null and b/AO2XPbase/icons/control_play_blue.png differ diff --git a/AO2XPbase/icons/page_copy.png b/AO2XPbase/icons/page_copy.png new file mode 100644 index 0000000..195dc6d Binary files /dev/null and b/AO2XPbase/icons/page_copy.png differ diff --git a/gameview.py b/gameview.py index e9f46bb..45de863 100644 --- a/gameview.py +++ b/gameview.py @@ -1065,6 +1065,7 @@ class GUI(QtGui.QWidget): chatmsg = '' charid = -1 login = False + privateMusicSelected = False privateInventorySelected = False scaling = [SCALING_AUTO, SCALING_AUTO] @@ -1369,6 +1370,39 @@ class GUI(QtGui.QWidget): self.musicSearch.setPlaceholderText("Search...") self.musicSearch.textChanged.connect(self.onMusicSearch) self.foundSongItemColor = "background: #80FF80;" + self.btnMusicOptions = QtGui.QPushButton(QtGui.QIcon(AO2XPpath + "icons/" + "cog.png"), "", self.tabMusic) + self.btnMusicOptions.setToolTip('Music options') + self.btnMusicOptions.clicked.connect(self.onMusicOptionsClicked) + + self.actMusicRandom = QtGui.QAction(QtGui.QIcon(AO2XPpath + "icons/" + "control_play_blue.png"), "&Play random", self.tabMusic) + self.actMusicRandom.triggered.connect(self.onActMusicRandomTriggered) + self.actMusicCopy = QtGui.QAction(QtGui.QIcon(AO2XPpath + "icons/" + "page_copy.png"), "&Copy selected song name", self.tabMusic) + self.actMusicCopy.triggered.connect(self.onActMusicCopyTriggered) + self.actMusicCopy.setDisabled(True) + + self.actMusicAdd = QtGui.QAction(QtGui.QIcon(AO2XPpath + "icons/" + "add.png"), "&Add new entry", self.tabMusic) + self.actMusicEdit = QtGui.QAction(QtGui.QIcon(AO2XPpath + "icons/" + "edit.png"), "&Edit selected entry", self.tabMusic) + self.actMusicDelete = QtGui.QAction(QtGui.QIcon(AO2XPpath + "icons/" + "delete.png"), "&Delete selected entry", self.tabMusic) + + self.actMusicSwitchToGlobal = QtGui.QAction(QtGui.QIcon(AO2XPpath + "icons/" + "world.png"), "&View global music list", self.tabMusic) + self.actMusicSwitchToPrivate = QtGui.QAction(QtGui.QIcon(AO2XPpath + "icons/" + "briefcase.png"), "&View private music list", self.tabMusic) + self.actMusicSwitchToPrivate.setDisabled(True) + + self.mnuMusicOptions = QtGui.QMenu(self.tabMusic) + self.mnuMusicOptions.addAction(self.actMusicRandom) + self.mnuMusicOptions.addAction(self.actMusicCopy) + self.mnuMusicOptions.addSeparator() + self.mnuMusicOptions.addAction(self.actMusicSwitchToPrivate) + + self.mnuMusicOptionsPrivate = QtGui.QMenu(self.tabMusic) + self.mnuMusicOptionsPrivate.addAction(self.actMusicRandom) + self.mnuMusicOptionsPrivate.addAction(self.actMusicCopy) + self.mnuMusicOptionsPrivate.addSeparator() + self.mnuMusicOptionsPrivate.addAction(self.actMusicAdd) + self.mnuMusicOptionsPrivate.addAction(self.actMusicEdit) + self.mnuMusicOptionsPrivate.addAction(self.actMusicDelete) + self.mnuMusicOptionsPrivate.addSeparator() + self.mnuMusicOptionsPrivate.addAction(self.actMusicSwitchToGlobal) # Areas list self.areaItems = QtGui.QListWidget() @@ -1596,7 +1630,8 @@ class GUI(QtGui.QWidget): self.demoRecorder = None self.demoPlaying = False self.musicList = {} - self.userPickedMusicItem = False + self.musicListPrivate = {} + self.pickedMusicItem = False self.slideEnabled = getOption("General", "slide", False) == 'True' self.slideAvailable = False @@ -1851,20 +1886,48 @@ class GUI(QtGui.QWidget): def onShownameChanged(self, text): self.showname = str(text.toUtf8()) + + def onMusicItemClicked(self, item): + self.actMusicCopy.setDisabled(False) + + def onMusicItemDoubleClicked(self, item): + self.pickedMusicItem = True + _musicList = self.musicListPrivate if self.privateMusicSelected else self.musicList + self.sendMC(_musicList[item.text()]) def onMusicSearch(self, text): self.musicItems.clear() + self.actMusicCopy.setDisabled(True) + + _musicList = self.musicListPrivate if self.privateMusicSelected else self.musicList if text: - for song, fname in self.musicList.items(): + for song, fname in _musicList.items(): if QtCore.QString(fname).contains(text, QtCore.Qt.CaseInsensitive): 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)) 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/", "")