diff --git a/buttons.py b/buttons.py index 492c9a3..8a37365 100644 --- a/buttons.py +++ b/buttons.py @@ -337,25 +337,33 @@ class EmoteButton(QtGui.QLabel): self.clicked.emit() class BackEmoteButton(QtGui.QLabel): - def __init__(self, gamewindow): super(BackEmoteButton, self).__init__(gamewindow) self.gamewindow = gamewindow - self.setPixmap(QtGui.QPixmap(AO2XPpath + 'themes/default/arrow_left.png')) self.show() def mousePressEvent(self, event): self.gamewindow.currentEmotePage -= 1 self.gamewindow.setEmotePage() + + def setPixmaps(self, theme): + self.setPixmap(QtGui.QPixmap(testPath( + AO2XPpath + "ao2xp_themes/%s/arrow_left.png" % (theme), + AO2XPpath + 'themes/default/arrow_left.png' + ))) class NextEmoteButton(QtGui.QLabel): - def __init__(self, gamewindow): super(NextEmoteButton, self).__init__(gamewindow) self.gamewindow = gamewindow - self.setPixmap(QtGui.QPixmap(AO2XPpath + 'themes/default/arrow_right.png')) self.show() def mousePressEvent(self, event): self.gamewindow.currentEmotePage += 1 self.gamewindow.setEmotePage() + + def setPixmaps(self, theme): + self.setPixmap(QtGui.QPixmap(testPath( + AO2XPpath + "ao2xp_themes/%s/arrow_right.png" % (theme), + AO2XPpath + 'themes/default/arrow_right.png' + ))) diff --git a/gameview.py b/gameview.py index 602c238..bd9fbe0 100644 --- a/gameview.py +++ b/gameview.py @@ -19,7 +19,7 @@ bucket = "" def delay(msec): dieTime = QtCore.QTime.currentTime().addMSecs(msec) - + while QtCore.QTime.currentTime() < dieTime: QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 100) @@ -58,7 +58,7 @@ def getTextColor(textColor): return QtGui.QColor(0, 255, 255) elif textColor == "_inline_grey": return QtGui.QColor(187, 187, 187) - + return QtGui.QColor(0, 0, 0) def testPath(*args): @@ -86,7 +86,7 @@ def downloadThread(link, savepath): DOWNLOAD_BLACKLIST.append(link) print "couldn't download '%s'" % link - + def mockString(text): upper = random.choice([True, False]) if isinstance(text, QtCore.QString): @@ -94,7 +94,7 @@ def mockString(text): for i in range(len(text)): if text[i] == " ": continue - + l[i] = l[i].toUpper() if upper else l[i].toLower() upper = not upper return l.join("") @@ -103,11 +103,11 @@ def mockString(text): for i in range(len(text)): if text[i] == " ": continue - + l[i] = l[i].upper() if upper else l[i].lower() upper = not upper return "".join(l) - + class MusicDownloadThread(QtCore.QThread): # Part of the evil HTTPS music download hack for XP systems finished_signal = QtCore.pyqtSignal(int, str) @@ -125,7 +125,7 @@ class MusicDownloadThread(QtCore.QThread): def download(self, url): if self.exiting: return - + headers = { 'User-Agent': "AO2XP %s" % (GAME_VERSION), 'Accept': '*/*', @@ -134,7 +134,7 @@ class MusicDownloadThread(QtCore.QThread): 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } - + request = Request(url, headers=headers) request.get_method = lambda: 'HEAD' try: @@ -144,29 +144,29 @@ class MusicDownloadThread(QtCore.QThread): print "[audio]", e, url self.quit() return - + file_length = int(response.headers.get('Content-Length', 0)) if file_length > 0: request = Request(url, headers=headers) response = urlopen(request) stream = "" - + bytes_downloaded = 0 buffer_size = 8192 - + while bytes_downloaded < file_length: if self.exiting: self.quit() break - + chunk = response.read(buffer_size) if not chunk: break - + stream += chunk bytes_downloaded += len(chunk) - + if not self.exiting: self.caller.stream = create_string_buffer(stream) self.finished_signal.emit(file_length, self.url) @@ -174,7 +174,7 @@ class MusicDownloadThread(QtCore.QThread): print "[audio] Stream is empty, aborting..." self.quit() return - + def stop(self): self.exiting = True @@ -188,14 +188,14 @@ class ChatLogs(QtGui.QTextEdit): self.savelog = False self.combinelog = False self.setLogFiles(logfile) - + def setLogFiles(self, logfile=None): self.savelog = ini.read_ini_bool("AO2XP.ini", "General", "save logs") self.combinelog = ini.read_ini_bool("AO2XP.ini", "General", "combined logs") - + if not exists("logs"): os.mkdir("logs") - + if not self.logfile: currtime = time.localtime() if self.combinelog: @@ -210,11 +210,11 @@ class ChatLogs(QtGui.QTextEdit): self.logfile = "logs/%d-%02d-%02d %02d.%02d.%02d [OOC].log" % (currtime[0], currtime[1], currtime[2], currtime[3], currtime[4], currtime[5]) else: self.logfile = None - + def __del__(self): if self.savelog: self.logfile.close() - + def append(self, text): if self.savelog and not "Log started" in text: with open(self.logfile, "a") as logfile: @@ -236,7 +236,7 @@ class ChatLogs(QtGui.QTextEdit): logfile.write("[OOC] " + text_.replace("", "").replace("", "") +"\n") else: logfile.write(text_.replace("", "").replace("", "") +"\n") - + super(ChatLogs, self).append(text) class AOCharMovie(QtGui.QLabel): @@ -250,7 +250,7 @@ class AOCharMovie(QtGui.QLabel): def __init__(self, parent, gameview): QtGui.QLabel.__init__(self, parent) - + self.parent = parent self.gameview = gameview self.setAlignment(QtCore.Qt.AlignCenter) @@ -259,9 +259,9 @@ class AOCharMovie(QtGui.QLabel): self.mFlipped = False self.scaling = SCALING_AUTO self.showOnPlay = True - + self.mMovie = QtGui.QMovie() - + self.preanimTimer = QtCore.QTimer(self) self.preanimTimer.setSingleShot(True) self.pillowTimer = QtCore.QTimer(self) @@ -270,9 +270,9 @@ class AOCharMovie(QtGui.QLabel): self.preanimTimer.timeout.connect(self.timer_done) self.pillowTimer.timeout.connect(self.pillowFrameChange) self.mMovie.frameChanged.connect(self.frameChange) - + self.prevGifPath = "" - + def resize(self): super(AOCharMovie, self).resize(self.parent.size()) @@ -281,17 +281,17 @@ class AOCharMovie(QtGui.QLabel): self.xx = x self.yy = y super(AOCharMovie, self).move(x, y) - + def moveSlide(self, x): super(AOCharMovie, self).move(x, self.y()) - + def setFlipped(self, flip): self.mFlipped = flip - + def play(self, pChar, pEmote, emotePrefix, scaling = SCALING_AUTO, singleFrameDuration = -1): if not len(pEmote): return - + if pEmote[0] == "/" or pEmote[0] == "/": pEmote = pEmote[1:] elif "../../characters" in pEmote: @@ -300,12 +300,12 @@ class AOCharMovie(QtGui.QLabel): emote = a[4] emotePrefix = "" pEmote = emote - + self.pillowFrames = [] self.pillowFrame = 0 - + self.scaling = scaling - + pChar = pChar.lower() pEmote = pEmote.lower() @@ -318,12 +318,12 @@ class AOCharMovie(QtGui.QLabel): AOpath + "characters/" + pChar + "/(a)/" + pEmote + ".apng", AOpath + "characters/" + pChar + "/(b)/" + pEmote + ".apng" ) - + placeholderPath = AO2XPpath + "themes/default/oldplaceholder.gif" - + imgPath = "" downloadCharacters = ini.read_ini_bool("AO2XP.ini", "General", "download characters") - + if apngPath: imgPath = apngPath self.usePillow = 1 @@ -332,7 +332,7 @@ class AOCharMovie(QtGui.QLabel): url = "base/characters/" + pChar.lower() + "/" + emotePrefix + pEmote.lower() + ".apng" url = url.replace(" ", "%20") thread.start_new_thread(downloadThread, (url, apngPath)) - + pngPath = testPath( AOpath + "characters/" + pChar + "/" + emotePrefix + pEmote + ".png", AOpath + "characters/" + pChar + "/" + emotePrefix + "/" + pEmote + ".png", @@ -351,7 +351,7 @@ class AOCharMovie(QtGui.QLabel): url = "base/characters/" + pChar.lower() + "/" + emotePrefix + pEmote.lower() + ".png" url = url.replace(" ", "%20") thread.start_new_thread(downloadThread, (url, pngPath)) - + webpPath = testPath( AOpath + "characters/" + pChar + "/" + emotePrefix + pEmote + ".webp", AOpath + "characters/" + pChar + "/" + emotePrefix + "/" + pEmote + ".webp", @@ -361,7 +361,7 @@ class AOCharMovie(QtGui.QLabel): AOpath + "characters/" + pChar + "/(a)/" + pEmote + ".webp", AOpath + "characters/" + pChar + "/(b)/" + pEmote + ".webp" ) - + if webpPath: imgPath = webpPath self.usePillow = 2 @@ -370,7 +370,7 @@ class AOCharMovie(QtGui.QLabel): url = "base/characters/" + pChar.lower() + "/"+pEmote.lower() + ".webp" url = url.replace(" ", "%20") thread.start_new_thread(downloadThread, (url, webpPath)) - + gifPath = testPath( AOpath + "characters/" + pChar + "/" + emotePrefix + pEmote + ".gif", AOpath + "characters/" + pChar + "/" + emotePrefix + "/" + pEmote + ".gif", @@ -380,7 +380,7 @@ class AOCharMovie(QtGui.QLabel): AOpath + "characters/" + pChar + "/(a)/" + pEmote + ".gif", AOpath + "characters/" + pChar + "/(b)/" + pEmote + ".gif" ) - + if gifPath: imgPath = gifPath self.usePillow = 0 @@ -396,7 +396,7 @@ class AOCharMovie(QtGui.QLabel): else: imgPath = "" self.usePillow = 0 - + if imgPath == "": imgPath = self.prevGifPath # Second check just in case @@ -408,7 +408,7 @@ class AOCharMovie(QtGui.QLabel): imgPath = "placeholder.png" else: self.prevGifPath = imgPath - + #print "[debug]", pChar, emotePrefix, pEmote, "(!) path is null!" if imgPath == "" else imgPath if not self.usePillow: @@ -420,7 +420,7 @@ class AOCharMovie(QtGui.QLabel): self.pillowTimer.start(int(self.pillowFrames[0][1] * self.pillowSpeed)) else: self.pillowTimer.start(int(singleFrameDuration * self.pillowSpeed)) - + self.setPillowFrame() elif self.usePillow == 2: # webp try: @@ -429,7 +429,7 @@ class AOCharMovie(QtGui.QLabel): self.pillowTimer.start(int(self.pillowFrames[0][1] * self.pillowSpeed)) else: self.pillowTimer.start(int(singleFrameDuration * self.pillowSpeed)) - + self.setPillowFrame() except: if exists(placeholderPath): @@ -439,20 +439,20 @@ class AOCharMovie(QtGui.QLabel): imgPath = "placeholder.png" self.mMovie.setFileName(imgPath) self.mMovie.start() - + if self.showOnPlay: self.show() - + def playPre(self, pChar, pEmote, duration, scaling = SCALING_AUTO): pChar = pChar.lower() - + gifPath = AOpath + "characters/" + pChar + "/" + pEmote + ".gif" apngPath = AOpath + "characters/" + pChar + "/" + pEmote + ".apng" webpPath = AOpath + "characters/" + pChar + "/" + pEmote + ".webp" - + fullDuration = duration * self.timeMod realDuration = 0 - + self.playOnce = False self.mMovie.stop() self.clear() @@ -467,16 +467,16 @@ class AOCharMovie(QtGui.QLabel): for nFrame in range(self.mMovie.frameCount()): realDuration += self.mMovie.nextFrameDelay() self.mMovie.jumpToFrame(nFrame + 1) - + percentageModifier = 100.0 - + if realDuration != 0 and duration != 0: modifier = fullDuration / float(realDuration) percentageModifier = 100 / modifier - + if percentageModifier > 100.0 or percentageModifier < 0.0: percentageModifier = 100.0 - + self.pillow_fullduration = fullDuration if fullDuration == 0 or fullDuration >= realDuration: self.playOnce = True @@ -484,7 +484,7 @@ class AOCharMovie(QtGui.QLabel): self.playOnce = False if fullDuration >= 0: self.preanimTimer.start(fullDuration) - + self.mMovie.setSpeed(int(percentageModifier)) self.pillowSpeed = percentageModifier / 100. @@ -492,16 +492,16 @@ class AOCharMovie(QtGui.QLabel): self.play(pChar, pEmote, "", scaling) else: self.play(pChar, pEmote, "", scaling, fullDuration) - + def playTalking(self, pChar, pEmote, scaling = SCALING_AUTO): pChar = pChar.lower() gifPath = AOpath + 'characters/' + pChar + '/(b)' + pEmote + '.gif' - + self.mMovie.stop() self.clear() self.mMovie.setFileName(gifPath) self.mMovie.jumpToFrame(0) - + self.playOnce = False self.mMovie.setSpeed(100) self.pillowSpeed = 1 @@ -510,12 +510,12 @@ class AOCharMovie(QtGui.QLabel): def playIdle(self, pChar, pEmote, scaling = SCALING_AUTO): pChar = pChar.lower() gifPath = AOpath + 'characters/' + pChar + '/(a)' + pEmote + '.gif' - + self.mMovie.stop() self.clear() self.mMovie.setFileName(gifPath) self.mMovie.jumpToFrame(0) - + self.playOnce = False self.mMovie.setSpeed(100) self.pillowSpeed = 1 @@ -525,7 +525,7 @@ class AOCharMovie(QtGui.QLabel): self.mMovie.stop() self.preanimTimer.stop() self.hide() - + def getTransform(self, smooth_condition=True): if self.scaling == SCALING_PIXEL: return QtCore.Qt.FastTransformation @@ -535,13 +535,13 @@ class AOCharMovie(QtGui.QLabel): return QtCore.Qt.SmoothTransformation else: return QtCore.Qt.FastTransformation - + def getAspect(self, size): if size.width() / float(size.height()) >= self.gameview.viewportRatio: return QtCore.Qt.KeepAspectRatioByExpanding else: return QtCore.Qt.KeepAspectRatio - + def getScaledImage(self, f_img): if not f_img.isNull(): transform = self.getTransform(f_img.size().height() > self.size().height()) @@ -555,7 +555,7 @@ class AOCharMovie(QtGui.QLabel): fPixmap = QtGui.QPixmap.fromImage(f_img) self.setPixmap(fPixmap) - + if self.mMovie.frameCount() - 1 == nFrame and self.playOnce: self.preanimTimer.start(self.mMovie.nextFrameDelay()) @@ -577,7 +577,7 @@ class AOCharMovie(QtGui.QLabel): def setPillowFrame(self): f_img = self.getScaledImage(self.pillowFrames[self.pillowFrame][0].mirrored(self.mFlipped, False)) - + fPixmap = QtGui.QPixmap.fromImage(f_img) self.setPixmap(fPixmap) @@ -606,10 +606,10 @@ class AOMovie(QtGui.QLabel): self.pillowTimer = QtCore.QTimer(self) self.pillowTimer.setSingleShot(True) self.pillowTimer.timeout.connect(self.pillowFrameChange) - + self.pillowLabel = QtGui.QLabel(self) self.pillowLabel.hide() - + def resize(self): super(AOMovie, self).resize(self.parent.size()) self.pillowLabel.setGeometry(0, 0, self.parent.size().width(), self.parent.size().height()) @@ -621,13 +621,13 @@ class AOMovie(QtGui.QLabel): def setPlayOnce(self, once): self.playOnce = once - + def play(self, pImage, pChar=""): gifPath = pImage pillowModes = {".gif": 0, ".apng": 1, ".webp": 2, ".png": 1} - + pImage = unicode(pImage) - + if not exists(gifPath): pathlist = [ getImageSuffix(AO2XPpath + "themes/default/" + pImage + "_bubble"), @@ -635,18 +635,18 @@ class AOMovie(QtGui.QLabel): getImageSuffix(AOpath + "misc/default/" + pImage), getImageSuffix(AO2XPpath + "themes/default/" + pImage) ] - + for f in pathlist: if exists(f): gifPath = f break - + if not exists(gifPath): self.done.emit() return self.usePillow = pillowModes[os.path.splitext(gifPath)[1]] - + if not self.usePillow: self.mMovie.setFileName(gifPath) self.mMovie.start() @@ -665,7 +665,7 @@ class AOMovie(QtGui.QLabel): self.setPillowFrame() self.show() - + def stop(self): self.pillowFrames = [] self.pillowFrame = 0 @@ -674,7 +674,7 @@ class AOMovie(QtGui.QLabel): self.pillowLabel.clear() self.pillowLabel.hide() self.hide() - + @QtCore.pyqtSlot(int) def frameChange(self, nFrame): if nFrame == self.mMovie.frameCount() - 1 and self.playOnce: @@ -718,7 +718,7 @@ class ZoomLines(QtGui.QLabel): self.setScaledContents(True) self.movie = QtGui.QMovie() self.movie.frameChanged.connect(self.frameChange) - + def resize(self): super(ZoomLines, self).resize(self.parent.size()) @@ -747,7 +747,7 @@ class WTCEView(QtGui.QLabel): self.finalframeTimer = QtCore.QTimer() self.finalframeTimer.setSingleShot(False) self.finalframeTimer.timeout.connect(self.finished) - + def resize(self): super(WTCEView, self).move(self.parent.viewport.x(), self.parent.viewport.y()) super(WTCEView, self).resize(self.parent.viewport.size()) @@ -802,7 +802,7 @@ class EditEvidenceDialog(QtGui.QDialog): self.evipicture.setPixmap(evipic) self.evipicture.move(434, 8) self.evipicture.show() - + self.save = QtGui.QPushButton(self) self.save.setText('Save') self.save.clicked.connect(self.onSaveClicked) @@ -819,7 +819,7 @@ class EditEvidenceDialog(QtGui.QDialog): self.browse.setText('Browse') self.browse.clicked.connect(self.onBrowseClicked) self.browse.move(self.choosepic.x() + self.choosepic.width() + 8, self.choosepic.y()) - + files = os.listdir(AOpath + 'evidence') fileslength = len(files) i = 0 @@ -861,7 +861,7 @@ class EditEvidenceDialog(QtGui.QDialog): if self.editing: self.gamegui.privateEvidence[self.gamegui.selectedEvidence] = [unicode(name), unicode(desc), unicode(self.filename)] self.gamegui.boxPrivateEvidence.setItemText(self.gamegui.selectedEvidence, name) - + evi = self.gamegui.privateEvidence[self.gamegui.selectedEvidence] self.gamegui.evidenceDescription.setText(evi[1]) self.gamegui.setEvidenceImage(self.gamegui.evidenceImage, evi[2]) @@ -890,7 +890,7 @@ class EditEvidenceDialog(QtGui.QDialog): self.setTitle() self.choosepic.setCurrentIndex(self.emptyfile) self.hide() - + def onBrowseClicked(self): path = str(QtGui.QFileDialog.getOpenFileName(self, "Select an image", AOpath + 'evidence', "Images (*.png)")) if path: @@ -898,7 +898,7 @@ class EditEvidenceDialog(QtGui.QDialog): QtGui.QMessageBox.warning(self, 'Wrong directory', 'Please select a file from the "evidence" directory.') self.onBrowseClicked() return - + file = basename(path) if file.lower().endswith('.png'): ind = os.listdir(AOpath + 'evidence').index(file) @@ -911,7 +911,7 @@ class EditEvidenceDialog(QtGui.QDialog): self.editing = True self.editInd = ind evidence = self.gamegui.privateEvidence if self.gamegui.privateInventorySelected else self.gamegui.evidence - + if evidence[ind][2] not in self.filenames: self.filenames.append(evidence[ind][2]) self.choosepic.addItem(evidence[ind][2].split('.')[0]) @@ -920,10 +920,10 @@ class EditEvidenceDialog(QtGui.QDialog): self.evidesc.setText(evidence[ind][1]) self.setWindowTitle("Edit evidence" if not self.gamegui.privateInventorySelected else "Edit evidence in private inventory") self.show() - + def setTitle(self): self.setWindowTitle('Add evidence' if not self.gamegui.privateInventorySelected else "Add evidence to private inventory") - + class TCPThread(QtCore.QThread): connectionError = QtCore.pyqtSignal(str, str, str) MS_Chat = QtCore.pyqtSignal(list) @@ -937,15 +937,15 @@ class TCPThread(QtCore.QThread): rainbowColor = QtCore.pyqtSignal(str) updatePlayerList = QtCore.pyqtSignal(str, int, int, str) timerUpdate = QtCore.pyqtSignal(int, int, int) - + send_attempts = 0 max_attempts = 5 stop_now = False - + def __init__(self, parent): super(TCPThread, self).__init__(parent) self.parent = parent - + def run(self): pingtimer = 150 rainbow = 0 @@ -959,7 +959,7 @@ class TCPThread(QtCore.QThread): self.parent.tcp = None self.quit() return - + if self.parent.disconnectNow: self.parent.disconnectCommon() self.quit() @@ -970,7 +970,7 @@ class TCPThread(QtCore.QThread): pingbefore = time.time() self.parent.tcp.send('CH#%') pingtimer = 150 - + if self.parent.mChatMessage[TEXT_COLOR] == str(C_RAINBOW): color.setHsv(rainbow, 255, 255) rainbow += 5 @@ -978,7 +978,7 @@ class TCPThread(QtCore.QThread): rainbow = 0 #self.parent.text.setStyleSheet('color: rgb(' + str(color.red()) + ', ' + str(color.green()) + ', ' + str(color.blue()) + ')') self.rainbowColor.emit('background-color: rgba(0, 0, 0, 0); color: rgb(' + str(color.red()) + ', ' + str(color.green()) + ', ' + str(color.blue()) + ')') - + if sendtick: sendtick -= 1 if self.parent.messageQueue and not sendtick: @@ -1008,9 +1008,9 @@ class TCPThread(QtCore.QThread): return else: self.send_attempts = 0 - + packets.handlePackets(self, total) - + def stop(self): self.stop_now = True @@ -1020,14 +1020,14 @@ class Chatbox(QtGui.QLabel): self.parent = parent self.initial = None self.geometrySet = False - + def setGeometry(self, x, y, w, h): if self.geometrySet: return self.geometrySet = True super(Chatbox, self).setGeometry(x - self.parent.x(), y - self.parent.y(), w, h) self.initial = self.geometry() - + def resetGeometry(self): self.geometrySet = False @@ -1035,7 +1035,7 @@ class GUI(QtGui.QWidget): gamewindow = None # In theory 3 sounds may play at the same time: character, evidence sweep, # effect - soundChannels = 3 + soundChannels = 3 soundChannel = 0 sound = [] for i in range(soundChannels): @@ -1046,7 +1046,7 @@ class GUI(QtGui.QWidget): currentDisplaySpeed = 3 messageDisplaySpeed = (30, 40, 50, 60, 75, 100, 120) entireMessageIsBlue = False - inlineColorStack = [] + inlineColorStack = [] inlineBlueDepth = 0 otherCharId = -1 offsetWithPair = 0 @@ -1068,7 +1068,7 @@ class GUI(QtGui.QWidget): textState = 2 objectionState = 0 textColor = 0 - + charini = ConfigParser() chatmsg = '' charid = -1 @@ -1076,7 +1076,7 @@ class GUI(QtGui.QWidget): privateMusicSelected = False privateInventorySelected = False scaling = [SCALING_AUTO, SCALING_AUTO] - + wtceSignal = QtCore.pyqtSignal(str, int) healthbars = QtCore.pyqtSignal(int, int) gotPing = QtCore.pyqtSignal(int) @@ -1084,25 +1084,25 @@ class GUI(QtGui.QWidget): def __init__(self, parent=None): super(GUI, self).__init__(parent) self.gamewindow = parent - + self.gotPing.connect(self.setPing) - + for i in range(self.chatMessageSize): self.mChatMessage.append("") - + self.chatTickTimer = QtCore.QTimer(self) self.chatTickTimer.timeout.connect(self.chatTick) - + self.sfxDelayTimer = QtCore.QTimer(self) self.sfxDelayTimer.setSingleShot(True) self.sfxDelayTimer.timeout.connect(self.playSfx) - + self.inboxTimer = QtCore.QTimer(self) self.inboxTimer.setSingleShot(True) self.inboxTimer.timeout.connect(self.inboxTimerTimeout) - + self.modcall = None - + self.healthbars.connect(self.netmsgHP) self.disconnectNow = False self.swapping = False @@ -1110,24 +1110,24 @@ class GUI(QtGui.QWidget): self.background = 'default' self.viewportScale = 1 self.viewportRatio = 1 - + self.viewport = QtGui.QWidget(self) self.viewport.setObjectName("ui_viewport") self.court = QtGui.QLabel(self.viewport) - + self.slideBg = QtGui.QLabel(self.viewport) self.slideBgAnimation = QtCore.QPropertyAnimation(self.slideBg, "geometry") self.slideBgAnimation.finished.connect(self.slideDone) self.slideBgAnimation.valueChanged.connect(self.slideChanged) self.slideBg.hide() - + self.zoom = ZoomLines(self.viewport) - + self.char = AOCharMovie(self.viewport, self) self.char.done.connect(self.preanimDone) self.sideChar = AOCharMovie(self.viewport, self) self.sideChar.hide() - + self.slideLastWit = [] self.slideLastPos = None self.slideWitness = AOCharMovie(self.viewport, self) @@ -1136,10 +1136,10 @@ class GUI(QtGui.QWidget): self.slideSpeaker = AOCharMovie(self.viewport, self) self.slideSpeaker.hide() self.slideSpeaker.showOnPlay = False - + self.slideOverlay = QtGui.QLabel(self.viewport) self.slideOverlay.hide() - + self.bench = QtGui.QLabel(self.viewport) self.effectView = AOMovie(self.viewport) @@ -1147,7 +1147,7 @@ class GUI(QtGui.QWidget): self.chatbox = Chatbox(self.viewport) self.chatbox.setScaledContents(True) - + self.text = QtGui.QTextEdit(self.chatbox) self.text.setFrameStyle(QtGui.QFrame.NoFrame) self.text.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) @@ -1155,20 +1155,20 @@ class GUI(QtGui.QWidget): self.text.setReadOnly(True) self.text.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) self.text.initial = None - + self.ao2text = QtGui.QTextEdit(self.chatbox) self.ao2text.setFrameStyle(QtGui.QFrame.NoFrame) self.ao2text.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.ao2text.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.ao2text.setReadOnly(True) self.ao2text.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) - + self.name = QtGui.QLabel(self.chatbox) - + self.presentedEvidence = QtGui.QLabel(self) self.presentedEvidence.setScaledContents(True) self.presentedEvidence.hide() - + self.wtceView = WTCEView(self) self.wtceSignal.connect(self.wtceView.showWTCE) @@ -1194,17 +1194,17 @@ class GUI(QtGui.QWidget): self.onscreenTimer = QtCore.QTimer(self) self.onscreenTimer.timeout.connect(self.updateOnscreenTimers) self.onscreenTimerTick = 1000 - + for i in range(len(self.onscreenTimerTimes)): label = QtGui.QLabel(self.viewport) label.hide() label.setText("00:00:00") self.onscreenTimerLabels.append(label) - + self.onscreenTimerLabels[0].setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop) self.onscreenTimerLabels[3].setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTop) self.onscreenTimerLabels[4].setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTop) - + # GUI start self.gameTabs = QtGui.QTabWidget(self) self.serverTabs = QtGui.QTabWidget(self) @@ -1218,7 +1218,7 @@ class GUI(QtGui.QWidget): self.tabPlayers = QtGui.QWidget() # player list self.tabMusic = QtGui.QWidget() # music list self.tabBackgrounds = QtGui.QWidget() # backgrounds list - + # OOC chat log self.OOCLog = ChatLogs(self, 1) self.OOCLog.setReadOnly(True) @@ -1233,13 +1233,13 @@ class GUI(QtGui.QWidget): self.OOCInput.setObjectName("ui_ooc_chat_message") self.OOCLogin = QtGui.QPushButton("Lo&gin", self) self.OOCLogin.clicked.connect(self.onOOCLoginClicked) - + # IC chat log self.ICLog = ChatLogs(self.tabLog, 0, self.OOCLog.logfile) self.ICLog.setReadOnly(True) self.ICLog.textChanged.connect(self.onICLogChanged) self.ICLog.setObjectName("ui_ic_chatlog") - + # Evidence self.boxEvidence = QtGui.QComboBox(self.tabEvidence) self.boxEvidence.currentIndexChanged.connect(self.changeGlobalEvidence) @@ -1289,7 +1289,7 @@ class GUI(QtGui.QWidget): self.btnEvidenceMoveToGlobal.hide() self.btnEvidenceMoveAllToGlobal.hide() self.btnEvidenceSwitchToGlobal.hide() - + # Muting self.unmutedList = QtGui.QListWidget(self.tabMute) self.unmutedList.itemClicked.connect(self.changeUnmuteIndex) @@ -1305,7 +1305,7 @@ class GUI(QtGui.QWidget): self.lblNotMuted.setText('Not muted') self.lblMuted = QtGui.QLabel(self.tabMute) self.lblMuted.setText('Muted') - + # Ini swaps self.iniSwapList = QtGui.QComboBox(self.tabIniSwap) self.iniSwapList.currentIndexChanged.connect(self.iniSwapIndexChange) @@ -1321,7 +1321,7 @@ class GUI(QtGui.QWidget): self.btnIniSwapRefresh.clicked.connect(self.loadSwapCharacters) self.lblIniSwapInfo = QtGui.QLabel(self.tabIniSwap) self.lblIniSwapInfo.setText('Not swapped') - + # Pairing self.cbPair = QtGui.QCheckBox(self.tabPair) self.cbPair.setChecked(False) @@ -1341,7 +1341,7 @@ class GUI(QtGui.QWidget): self.boxPairOrder.addItem("Front") self.boxPairOrder.addItem("Behind") self.lblPairOrder = QtGui.QLabel("Pairing order", self.tabPair) - + # Misc self.layMisc = QtGui.QVBoxLayout(self.tabMisc) self.layMisc.setAlignment(QtCore.Qt.AlignTop) @@ -1362,7 +1362,7 @@ class GUI(QtGui.QWidget): self.layMisc.addWidget(self.cbSpacing) self.layMisc.addWidget(self.cbAutoCaps) self.layMisc.addWidget(self.cbFirstPerson) - + # Message queue self.queueItems = QtGui.QListWidget(self.tabQueue) self.queueItems.itemClicked.connect(self.onMessageQueueItemClicked) @@ -1380,7 +1380,7 @@ class GUI(QtGui.QWidget): self.gameTabs.addTab(self.tabPair, 'Pai&r') self.gameTabs.addTab(self.tabMisc, 'E&xtras') self.gameTabs.addTab(self.tabQueue, '&Queue') - + # Music list self.musicItems = QtGui.QListWidget(self.tabMusic) self.musicItems.itemClicked.connect(self.onMusicItemClicked) @@ -1441,11 +1441,11 @@ class GUI(QtGui.QWidget): self.musicListPrivate = OrderedDict([]) self.onActMusicRefreshTriggered(True) - + # Areas list self.areaItems = QtGui.QListWidget() self.areaItems.itemDoubleClicked.connect(self.onAreaItemClicked) - + # Player list self.playerItems = QtGui.QListWidget(self.tabPlayers) self.playerItems.itemClicked.connect(self.onPlayerItemClicked) @@ -1461,7 +1461,7 @@ class GUI(QtGui.QWidget): self.btnPlayerBan.setText('Ban') self.btnPlayerBan.clicked.connect(self.onPlayerBanClicked) self.btnPlayerBan.setDisabled(True) - + # Background list self.backgrounds = [] self.backgroundItems = QtGui.QListWidget(self.tabBackgrounds) @@ -1473,58 +1473,58 @@ class GUI(QtGui.QWidget): self.btnBackgroundsRefresh.setText('Refresh') self.btnBackgroundsRefresh.clicked.connect(self.loadBackgrounds) self.loadBackgrounds() - + # Demo list self.demoItems = demo.get_demo_treeview() self.demoItems.doubleClicked.connect(self.onDemoClicked) - + self.serverTabs.addTab(self.tabMusic, "&Music") self.serverTabs.addTab(self.areaItems, "&Areas") self.serverTabs.addTab(self.tabPlayers, 'Pla&yers') self.serverTabs.addTab(self.tabBackgrounds, "&Backs") self.serverTabs.addTab(self.demoItems, "Demos") - + # IC options self.ICChatInput = QtGui.QLineEdit(self) self.ICChatInput.returnPressed.connect(self.onICReturn) self.ICChatInput.setPlaceholderText('Game chat') - + self.showname = "" self.shownameEdit = QtGui.QLineEdit(self) self.shownameEdit.textChanged.connect(self.onShownameChanged) self.shownameEdit.setPlaceholderText("Showname") self.shownameEdit.setToolTip('Set a custom name for your character') self.shownameEdit.setObjectName("ui_ic_chat_name") - + self.btnChangeChar = QtGui.QPushButton(self) self.btnChangeChar.clicked.connect(self.onChangeCharClicked) self.btnChangeChar.setObjectName("ui_change_character") - + self.btnCallMod = QtGui.QPushButton(self) self.btnCallMod.setText('Call mod') self.btnCallMod.clicked.connect(self.onCallModClicked) self.btnCallMod.setObjectName("ui_call_mod") - + self.btnReloadTheme = QtGui.QPushButton(self) self.btnReloadTheme.setText('Reload theme') self.btnReloadTheme.clicked.connect(self.onReloadThemeClicked) self.btnReloadTheme.setVisible(False) self.btnReloadTheme.setObjectName("ui_reload_theme") - + self.btnSettings = QtGui.QPushButton("&Settings", self) self.btnSettings.clicked.connect(self.gamewindow.showSettings) self.btnSettings.setObjectName("ui_settings") - + self.boxEmotes = QtGui.QComboBox(self) self.boxEmotes.currentIndexChanged.connect(partial(self.changeEmote, True)) self.boxEmotes.setToolTip('Select an emotion for your character') self.boxEmotes.setObjectName('ui_emote_dropdown') - + self.boxColors = QtGui.QComboBox(self) self.boxColors.currentIndexChanged.connect(self.setChatColor) self.boxColors.setToolTip('Change the color of your message') self.boxColors.setObjectName('ui_text_color') - + self.defaultPositions = ["def", "pro", "wit", "hld", "hlp", "jud", "jur", "sea"] self.boxPositions = QtGui.QComboBox(self) self.boxPositions.addItems(self.defaultPositions) @@ -1536,20 +1536,20 @@ class GUI(QtGui.QWidget): self.boxEffects.currentIndexChanged.connect(self.ICChatFocus) self.boxEffects.setToolTip('Show this effect on your next message') self.boxEffects.setObjectName('ui_effects_dropdown') - + self.boxSounds = QtGui.QComboBox(self) self.boxSounds.currentIndexChanged.connect(self.ICChatFocus) self.boxSounds.setToolTip('Play this sound effect') self.boxSounds.setObjectName('ui_sfx_dropdown') self.populateSoundList() - + self.cbFlip = QtGui.QCheckBox(self) self.cbFlip.stateChanged.connect(self.changeFlipCheck) self.cbFlip.setText('&Flip') self.cbFlip.resize(self.cbFlip.sizeHint()) self.cbFlip.setToolTip("Mirror your character horizontally") self.cbFlip.setObjectName('ui_flip') - + self.cbPreanim = QtGui.QCheckBox(self) self.cbPreanim.setChecked(True) self.cbPreanim.stateChanged.connect(self.changePreanimCheck) @@ -1562,13 +1562,13 @@ class GUI(QtGui.QWidget): self.cbBench.setText('&Desk') self.cbBench.stateChanged.connect(self.ICChatFocus) self.cbBench.setToolTip('Show or hide the desk in front of your character') - + self.cbSlide = QtGui.QCheckBox(self) self.cbSlide.stateChanged.connect(self.ICChatFocus) self.cbSlide.setText('Slide') self.cbSlide.resize(self.cbSlide.sizeHint()) self.cbSlide.setToolTip("Tell clients to play courtroom slide animations for your message") - + self.cbNoInterrupt = QtGui.QCheckBox(self) self.cbNoInterrupt.setChecked(False) self.cbNoInterrupt.stateChanged.connect(self.ICChatFocus) @@ -1583,7 +1583,7 @@ class GUI(QtGui.QWidget): self.cbAdditive.clicked.connect(self.ICChatFocus) self.cbAdditive.setToolTip('Append the next message to the previous one, without a new textbox') self.cbAdditive.setObjectName('ui_additive') - + # Emotions self.btnPrevEmotePage = buttons.BackEmoteButton(self) self.btnPrevEmotePage.hide() @@ -1594,21 +1594,21 @@ class GUI(QtGui.QWidget): self.currentEmotePage = 0 self.maxEmotesOnPage = 0 self.emoteButtons = [] - + # Special effects self.btnRealization = buttons.AOToggleButton(self, "realization") self.btnRealization.clicked.connect(self.onRealizationClicked) self.btnRealization.setToolTip('Show the next message with a realization effect') self.btnRealization.setObjectName("ui_realization") - + self.btnShake = buttons.AOToggleButton(self, "screenshake") # AO 2.8 self.btnShake.clicked.connect(self.onShakeClicked) self.btnShake.setToolTip('Show the next message with a shaking effect') self.btnShake.setObjectName("ui_screenshake") - + self.sndRealization = audio.loadHandle(False, AOpath + 'sounds/general/sfx-realization.wav', 0, 0, 0) #self.sndShake = audio.loadHandle(False, AOpath + 'sounds/general/sfx-damage.wav', 0, 0, 0) - + # Objections self.btnCustomObjection = buttons.CustomObjection(self) self.btnCustomObjection.clicked.connect(self.ICChatFocus) @@ -1627,7 +1627,7 @@ class GUI(QtGui.QWidget): self.btnHoldIt.setToolTip("Hold it!") self.btnHoldIt.setObjectName("ui_hold_it") self.sndObjection = 0 - + # Judge buttons self.btnDefenseBar = buttons.PenaltyBars(self, 1) self.btnDefenseBar.minusClicked.connect(self.onPenaltyBarMinusClicked) @@ -1656,7 +1656,7 @@ class GUI(QtGui.QWidget): self.btnNotGuilty.show() self.btnGuilty.show() self.presenting = -1 - + # Volume sliders and their labels self.lblMusicVolume = QtGui.QLabel("Music", self) self.lblSoundVolume = QtGui.QLabel("SFX", self) @@ -1677,13 +1677,13 @@ class GUI(QtGui.QWidget): self.lblMusicVolume.setObjectName("ui_music_label") self.lblSoundVolume.setObjectName("ui_sfx_label") self.lblBlipsVolume.setObjectName("ui_blip_label") - + # Demo playback seekbar self.sliDemoSeekbar = QtGui.QSlider(QtCore.Qt.Horizontal, self) self.sliDemoSeekbar.valueChanged.connect(self.demoSeek) self.sliDemoSeekbar.setVisible(False) self.sliDemoSeekbar.setMinimum(0) - + self.lblNotMuted.setObjectName("lblNotMuted") self.lblMuted.setObjectName("lblMuted") self.lblIniSwapInfo.setObjectName("lblIniSwapInfo") @@ -1700,15 +1700,15 @@ class GUI(QtGui.QWidget): self.tabMusic.setObjectName("tabMusic") self.tabPlayers.setObjectName("tabPlayers") self.tabBackgrounds.setObjectName("tabBackgrounds") - + # GUI end - + self.name.show() self.char.show() self.court.show() self.bench.show() self.chatbox.show() - + self.areas = [] self.areasLen = 0 self.noARUP = False @@ -1740,44 +1740,44 @@ class GUI(QtGui.QWidget): self.musicList = {} self.pickedMusicItem = False self.currentMusicURL = None - + self.slideEnabled = getOption("General", "slide", False) == 'True' self.slideAvailable = False self.slideHasOverlay = False self.slideKind = 0 # 0 = def-pro, 1 = def-wit, 2 = pro-wit self.slideDirection = 0 # 0 = left to right, 1 = right to left - + # slideMap[oldPos][newPos] = [kind, direction] self.slideMap = { "def": { "pro": [0, 0], "wit": [1, 0] }, "wit": { "def": [1, 1], "pro": [2, 0] }, "pro": { "def": [0, 1], "wit": [2, 1] }, } - + self.loadSwapCharacters() self.iniSwapList.setCurrentIndex(0) self.evidenceEditor = EditEvidenceDialog(self) - + self.connect(self, QtCore.SIGNAL('showMessage(QString, QString, QString)'), self.showMessage) - + self.charSelect = charselect.charselect(self) - + self.wtceSfx = 0 self.guiltySfx = 0 self.notGuiltySfx = 0 - + self.stream = 0 self.specialStream = False self.downloadThread = None self.tcp = None self.demoPlayer = None - + # Finally, load the theme self.width = 820 self.height = 730 self.defaultStyle = QtGui.QApplication.style().objectName() self.loadTheme() - + def loadTheme(self, switching=False): theme = getOption("General", "theme", "default") # try: @@ -1789,23 +1789,25 @@ class GUI(QtGui.QWidget): self.btnReloadTheme.setVisible(False) self.cbBench.setVisible(True) self.cbSlide.setVisible(True) + self.OOCLogin.setVisible(True) self.nameFontPointSize = 6 self.textFontPointSize = 12 - + for w in [self.gameTabs, self.serverTabs]: stack = w.findChild(QtGui.QStackedWidget) if stack: stack.setAutoFillBackground(False) stack.setAttribute(QtCore.Qt.WA_NoSystemBackground, True) - + for btn in [self.btnRealization, self.btnShake, self.btnCustomObjection, self.btnObjection, self.btnTakeThat, self.btnHoldIt, self.btnGuilty, self.btnNotGuilty, self.btnWitnessTestimony, self.btnCrossExamination, self.btnDefenseBar, - self.btnProsecutionBar]: + self.btnProsecutionBar, self.btnPrevEmotePage, + self.btnNextEmotePage]: btn.setPixmaps(theme) - + # Design courtroomDesign = AO2XPpath + "ao2xp_themes/" + theme + '/courtroom_design.ini' if exists(courtroomDesign): @@ -1816,7 +1818,7 @@ class GUI(QtGui.QWidget): key, value = keys.split("=") design[key.strip()] = value.split(',') - + geometry = { "viewport": self.viewport, "ic_chatlog": self.gameTabs, @@ -1846,8 +1848,9 @@ class GUI(QtGui.QWidget): "music_list": self.serverTabs, "defense_bar": self.btnDefenseBar, "prosecution_bar": self.btnProsecutionBar, + "ao2xp_login": self.OOCLogin, } - + move = { "pre": self.cbPreanim, "flip": self.cbFlip, @@ -1870,8 +1873,9 @@ class GUI(QtGui.QWidget): "defense_minus": self.btnDefenseBar.btnMinus, "prosecution_plus": self.btnProsecutionBar.btnPlus, "prosecution_minus": self.btnProsecutionBar.btnMinus, + "ao2xp_desk" : self.cbBench, } - + for e in geometry.keys(): if e in design: d = [int(x) for x in design[e]] @@ -1881,7 +1885,7 @@ class GUI(QtGui.QWidget): geometry[e].setGeometry(*d) else: geometry[e].move(-500, -500) - + for e in move.keys(): if e in design: d = [int(x) for x in design[e]] @@ -1891,24 +1895,25 @@ class GUI(QtGui.QWidget): move[e].move(*d[0:2]) else: move[e].move(-500, -500) - + if "emotes" in design: self.emotePageGeometry = [int(x) for x in design["emotes"]] else: self.emotePageGeometry = [0, 0, 0, 0] - + if "emote_button_spacing" in design: self.emotePageGeometry += [int(x) for x in design["emote_button_spacing"]] else: self.emotePageGeometry += [1, 1] - + if "found_song_color" in design: self.foundSongItemColor = QtGui.QColor(*[int(x) for x in design["found_song_color"]]) - + self.cbSlide.setVisible("slide_enable" in design) - self.cbBench.setVisible("ao2xp_desk" in design) + self.cbBench.setVisible("ao2xp_desk" in design) + self.OOCLogin.setVisible("ao2xp_login" in design) self.btnReloadTheme.setVisible(True) - + QtGui.QApplication.setStyle('plastique') for w in [self.gameTabs, self.serverTabs]: stack = w.findChild(QtGui.QStackedWidget) @@ -1930,16 +1935,16 @@ class GUI(QtGui.QWidget): exec t else: self._themeCommon() - + if switching: # This is to reset the colors on the music list. Not necessary on startup self.onMusicSearch("") - + if not self.viewportScale: self.viewportScale = self.viewport.height() / float(192) - + self.viewportRatio = self.viewport.width() / float(self.viewport.height()) - + self.court.resize(self.viewport.size()) self.bench.resize(self.viewport.size()) self.whiteFlashLabel.resize(self.viewport.size()) @@ -1955,7 +1960,7 @@ class GUI(QtGui.QWidget): self.ao2text.setGeometry(self.text.initial) self.ao2text.setStyleSheet(self.text.styleSheet()) self.sliDemoSeekbar.setGeometry(self.ICChatInput.geometry()) - + # Theme chatbox chatboxPixmap = QtGui.QPixmap(testPath( AO2XPpath + "ao2xp_themes/%s/chatmed.png" % theme, @@ -1970,7 +1975,7 @@ class GUI(QtGui.QWidget): self.chatboxWidth = self.chatbox.width() self.chatboxHeight = self.chatbox.height() self.chatbox.setPixmap(chatboxPixmap.scaled(self.chatboxWidth, self.chatboxHeight, QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.FastTransformation)) - + # Theme background courtroomBackground = AO2XPpath + "ao2xp_themes/" + theme + '/courtroombackground.png' if exists(courtroomBackground): @@ -1978,17 +1983,17 @@ class GUI(QtGui.QWidget): courtroomBackground = QtGui.QPixmap(courtroomBackground) self.width = courtroomBackground.size().width() self.height = courtroomBackground.size().height() - + # Stylesheet courtroomStylesheets = AO2XPpath + "ao2xp_themes/" + theme + '/courtroom_stylesheets.css' if exists(courtroomStylesheets): with open(courtroomStylesheets) as f: stylesheet += f.read() - + self.gamewindow.setStyleSheet(stylesheet) - + self.presentedEvidence.setGeometry(self.viewport.x() + 16, self.viewport.y() + 16, 70 * self.viewportScale, 70 * self.viewportScale) - + # Theme fonts fontDb = QtGui.QFontDatabase() fonts = { @@ -2011,7 +2016,7 @@ class GUI(QtGui.QWidget): "path": AO2XPpath + 'font/igiari-cyrillic.ttf' }, } - + courtroomFonts = AO2XPpath + "ao2xp_themes/" + theme + '/courtroom_fonts.ini' if exists(courtroomFonts): fontData = {} @@ -2020,7 +2025,7 @@ class GUI(QtGui.QWidget): if not keys or "=" not in keys or keys[0] == ";": continue key, value = keys.split("=") fontData[key.strip()] = value.split(',') - + if "showname" in fontData: fonts["showname"]["pointSize"] = int(*fontData["showname"]) if "showname_font" in fontData: @@ -2031,7 +2036,7 @@ class GUI(QtGui.QWidget): fonts["showname"]["bold"] = int(*fontData["showname_bold"]) if "showname_fontpath" in fontData: # AO2XP exclusive fonts["showname"]["path"] = AO2XPpath + "ao2xp_themes/" + theme + "/" + fontData["showname_fontpath"][0].strip() - + if "message" in fontData: fonts["message"]["pointSize"] = int(*fontData["message"]) if "message_font" in fontData: @@ -2048,21 +2053,21 @@ class GUI(QtGui.QWidget): QFont.setFamily(fonts[w]["family"]) QFont.setBold(fonts[w]["bold"]) fonts[w]["widget"].setStyleSheet("color: rgb(%s)" % fonts[w]["color"]) - + self.text.setFont(fonts["message"]["QFont"]) self.ao2text.setFont(self.text.font()) self.name.setFont(fonts["showname"]["QFont"]) - + for label in self.onscreenTimerLabels: label.resize(self.viewport.width(), self.viewport.height()) label.setFont(self.name.font()) label.setStyleSheet(self.name.styleSheet()) - + # TODO: Figure out proper height px = fonts["showname"]["pointSize"] * 72 / 96 self.onscreenTimerLabels[2].move(self.onscreenTimerLabels[1].x(), self.onscreenTimerLabels[1].y() + px + 4) self.onscreenTimerLabels[4].move(self.onscreenTimerLabels[3].x(), self.onscreenTimerLabels[3].y() + px + 4) - + # Load emote buttons # TODO: Buggy on theme switch / reload xMod_count = yMod_count = 0 @@ -2070,15 +2075,15 @@ class GUI(QtGui.QWidget): columns = (width - 40) / (hSpacing + 40) + 1 rows = (height - 40) / (vSpacing + 40) + 1 self.maxEmotesOnPage = columns * rows - + if len(self.emoteButtons) > 0: for button in self.emoteButtons: button.setParent(None) button.deleteLater() button = None - + self.emoteButtons = [] - + for i in range(self.maxEmotesOnPage): xPos = (40 + hSpacing) * xMod_count yPos = (40 + vSpacing) * yMod_count @@ -2086,17 +2091,17 @@ class GUI(QtGui.QWidget): if xMod_count == columns: xMod_count = 0 yMod_count += 1 - + button = buttons.EmoteButton(self, i) button.move(left + xPos, top + yPos) button.clicked.connect(self.ICChatFocus) button.show() button.lower() self.emoteButtons.append(button) - + self.btnPrevEmotePage.raise_() self.btnNextEmotePage.raise_() - + if switching: self.setBackground() self.setScene() @@ -2107,7 +2112,7 @@ class GUI(QtGui.QWidget): # except Exception as e: # QtGui.QMessageBox.critical(None, "Unable to load theme", "There was a problem loading the current theme \"%s\":\n\n%s." % (theme, e)) # os._exit(-2) - + def _themeCommon(self): # IC input and demo slider viewportRight = max(self.viewport.x() + self.viewport.width(), 512) @@ -2121,7 +2126,7 @@ class GUI(QtGui.QWidget): self.boxEvidence.setGeometry(8, 8, self.evidenceImage.x() - 16, 20) self.btnEvidenceAdd.move(8, 32) self.btnEvidenceAdd.resize(30, 26) - + evidenceadd_size = self.btnEvidenceAdd.size() self.btnEvidenceEdit.resize(evidenceadd_size) self.btnEvidenceDelete.resize(evidenceadd_size) @@ -2176,14 +2181,9 @@ class GUI(QtGui.QWidget): self.lblPairOrder.move(self.lblPairOffset.x(), self.lblPairOffset.y()+144) self.boxPairOrder.setGeometry(self.sliPairOffset.x(), self.lblPairOrder.y()-4, 80, self.btnPairOffsetReset.sizeHint().height()) - ## Sidebar - oocBottom = self.OOCNameInput.y() + self.OOCNameInput.height() # 268 - self.OOCLogin.resize(48, 20) - self.OOCLogin.move(viewportRight + 14 + self.OOCLog.size().width() - (self.OOCLogin.size().width()), oocBottom + 6) - # Server tabs serverTabsHeight = self.serverTabs.height() - self.serverTabs.findChild(QtGui.QTabBar).height() - + self.musicItems.setGeometry(8, 8, self.serverTabs.width() - 20, serverTabsHeight - self.musicSearch.sizeHint().height() - 20) 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()) @@ -2221,7 +2221,7 @@ class GUI(QtGui.QWidget): self.sideChar.move(self.sideChar.xx, self.sideChar.yy, True) self.chatbox.move(self.chatbox.initial.topLeft()) self.screenshake.stop() - + def ICChatFocus(self): self.ICChatInput.setFocus() @@ -2239,7 +2239,7 @@ class GUI(QtGui.QWidget): def onOOCLoginClicked(self): if not self.OOCNameInput.text(): self.OOCNameInput.setText("unnamed") - + if not self.login: password, ok = QtGui.QInputDialog.getText(self, "Login as moderator", "Enter password.") if password and ok: @@ -2247,10 +2247,10 @@ class GUI(QtGui.QWidget): self.sendOOCchat(self.OOCNameInput.text().toUtf8(), password.toUtf8()) else: self.sendOOCchat(self.OOCNameInput.text().toUtf8(), "/logout") - + def setPing(self, newping): self.lblPing.setText("Ping: %d" % newping) - + def setPosition(self, ind): if not self.OOCNameInput.text(): self.OOCNameInput.setText("unnamed") @@ -2258,17 +2258,17 @@ class GUI(QtGui.QWidget): self.charSide = str(self.boxPositions.itemText(ind)) self.setJudgeButtons() self.ICChatFocus() - + if self.demoPlaying: return server_is_2_8 = "additive" in self.features and "looping_sfx" in self.features and "effects" in self.features - + if server_is_2_8: self.tcp.send("SP#"+self.charSide+"#%") # all hail new AO 2.8 packet else: self.sendOOCchat(self.OOCNameInput.text().toUtf8(), "/pos "+self.charSide) - + def changeMusicVolume(self, value): if self.music: audio.setHandleAttr(self.music, BASS_ATTRIB_VOL, value / 100.0) @@ -2276,7 +2276,7 @@ class GUI(QtGui.QWidget): audio.pauseHandle(self.music) elif audio.handleIsActive(self.music) == BASS_ACTIVE_PAUSED: audio.playHandle(self.music, False) - + def changeSoundVolume(self, value): for s in self.sound: if s: @@ -2287,11 +2287,11 @@ class GUI(QtGui.QWidget): audio.setHandleAttr(self.notGuiltySfx, BASS_ATTRIB_VOL, value / 100.0) if self.modcall: audio.setHandleAttr(self.modcall, BASS_ATTRIB_VOL, value / 100.0) - + def changeBlipVolume(self, value): if self.blipSound: audio.setHandleAttr(self.blipSound, BASS_ATTRIB_VOL, value / 100.0) - + def setJudgeButtons(self): if self.charSide == 'jud': self.btnDefenseBar.btnMinus.show() @@ -2311,7 +2311,7 @@ class GUI(QtGui.QWidget): self.btnCrossExamination.hide() self.btnNotGuilty.hide() self.btnGuilty.hide() - + def onShownameChanged(self, text): self.showname = str(text.toUtf8()) @@ -2319,22 +2319,22 @@ class GUI(QtGui.QWidget): self.actMusicCopy.setDisabled(False) # self.actMusicEdit.setDisabled(False) # self.actMusicDelete.setDisabled(False) - + def onMusicItemDoubleClicked(self, item): self.pickedMusicItem = True if self.privateMusicSelected: self.sendOOCchat(self.OOCNameInput.text().toUtf8(), "/play " + encodeAOString(self.musicListPrivate[item.text()])) else: self.sendMC(self.musicList[item.text()]) - + def onMusicSearch(self, text): self.musicItems.clear() self.actMusicCopy.setDisabled(True) self.actMusicEdit.setDisabled(True) self.actMusicDelete.setDisabled(True) - + _musicList = self.musicListPrivate if self.privateMusicSelected else self.musicList - + if text: for song, fname in _musicList.items(): if QtCore.QString(fname).contains(text, QtCore.Qt.CaseInsensitive): @@ -2345,10 +2345,10 @@ class GUI(QtGui.QWidget): self.musicItems.addItem(songitem) else: self.loadAllMusic() - + def onMusicOptionsClicked(self): self.mnuMusicOptions.exec_(QtGui.QCursor.pos()) - + def onActMusicRandomTriggered(self): _musicList = self.musicListPrivate if self.privateMusicSelected else self.musicList choice = random.randint(0, self.musicItems.count() - 1) @@ -2358,10 +2358,10 @@ class GUI(QtGui.QWidget): # self.actMusicEdit.setDisabled(False) # self.actMusicDelete.setDisabled(False) self.onMusicItemDoubleClicked(_item) - + def onActMusicCopyTriggered(self): QtGui.QApplication.clipboard().setText(self.musicItems.currentItem().text()) - + def onActMusicAddTriggered(self): title, ok = QtGui.QInputDialog.getText(self, "Add new song", "Please enter a title for the song. Leave this empty to add a separator that acts as music stop.") url = QtCore.QString("") @@ -2380,7 +2380,7 @@ class GUI(QtGui.QWidget): with open(AO2XPpath + "music.ini", "ab") as f: f.write(("\n" + title + " = " + url).toUtf8()) self.onActMusicRefreshTriggered() - + def onActMusicAddCurrentTriggered(self): title, ok = QtGui.QInputDialog.getText(self, "Add currently playing song", "Please enter a title for the song.") if title and ok: @@ -2388,30 +2388,30 @@ class GUI(QtGui.QWidget): f.write(("\n" + title + " = " + self.currentMusicURL).toUtf8()) if self.privateMusicSelected: self.onActMusicRefreshTriggered() - + def onActMusicEditTriggered(self): pass - + def onActMusicDeleteTriggered(self): pass - + def onActMusicEditExternalTriggered(self): path = AO2XPpath + "music.ini" if platform.system() == 'Windows': os.startfile(path) else: subprocess.call(('xdg-open', path)) - + def onActMusicRefreshTriggered(self, init=False): if exists(AO2XPpath + "music.ini"): self.musicListPrivate = ini.sectionless_ini_to_dict(AO2XPpath + "music.ini", QtCore.QString) if not init: self.musicItems.clear() self.loadAllMusic() - + def onActMusicSwitchTriggered(self): self.privateMusicSelected = not self.privateMusicSelected - + self.actMusicSeparator.setVisible(self.privateMusicSelected) self.actMusicAdd.setVisible(self.privateMusicSelected) self.actMusicEdit.setVisible(self.privateMusicSelected) @@ -2420,14 +2420,14 @@ class GUI(QtGui.QWidget): self.actMusicRefresh.setVisible(self.privateMusicSelected) self.actMusicSwitchToGlobal.setVisible(self.privateMusicSelected) self.actMusicSwitchToPrivate.setVisible(not self.privateMusicSelected) - + self.musicItems.clear() self.musicSearch.blockSignals(True) self.musicSearch.clear() self.musicSearch.blockSignals(False) self.actMusicCopy.setDisabled(True) self.loadAllMusic() - + def loadBackgrounds(self): self.backgroundItems.clear() self.backgroundSearch.clear() @@ -2435,10 +2435,10 @@ class GUI(QtGui.QWidget): for folder in os.listdir(unicode(AOpath + 'background')): self.backgrounds.append(folder) self.backgroundItems.addItem(folder) - + def onBackgroundSearch(self, text): self.backgroundItems.clear() - + if text: for bg in self.backgrounds: if QtCore.QString(bg).contains(text, QtCore.Qt.CaseInsensitive): @@ -2460,14 +2460,14 @@ class GUI(QtGui.QWidget): guiobj.setPixmap(img.scaled(140, 140, QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.FastTransformation)) else: guiobj.setPixmap(img) - + if ini.read_ini_bool("AO2XP.ini", "General", "download evidence", True): url = "base/evidence/"+image.lower() url = url.replace("evidence/../", "") path = AOpath + "evidence/"+image path = path.replace("evidence/../", "") thread.start_new_thread(downloadThread, (url, path)) - + def changeUnmuteIndex(self, item): for i in range(self.unmutedList.count()): if self.unmutedList.item(i) == item: @@ -2568,7 +2568,7 @@ class GUI(QtGui.QWidget): self.gamewindow.center() if not self.swapping and charName: self.loadCharacter(charName) - + def loadCharacter(self, charName): self.queueItems.clear() self.messageQueue = [] @@ -2577,21 +2577,21 @@ class GUI(QtGui.QWidget): self.charEmotes = [] self.selectedEmote = 0 self.currentEmotePage = 0 - + self.swapping = False self.lblIniSwapInfo.setText('Not swapped') - + effectsList = ini.get_effects(charName) self.boxEffects.setVisible(bool(effectsList)) if effectsList: effectsList.insert(0, "No effect") self.boxEffects.addItems(effectsList) - + if isinstance(charName, str): charName = unicode(charName.lower()) elif isinstance(charName, QtCore.QString): charName = unicode(charName.toLower()) - + #self.charName = ini.read_ini(AOpath + 'characters/' + charName + '/char.ini', "options", "name", charName.decode('utf-8').lower() self.charName = charName # Just use the folder name @@ -2599,7 +2599,7 @@ class GUI(QtGui.QWidget): if not self.charShowname == "": self.charShowname = self.charShowname.decode('utf-8') self.charSide = ini.read_ini(AOpath + 'characters/' + charName + '/char.ini', "options", "side", "def") - + self.boxPositions.setCurrentIndex(self.boxPositions.findText(self.charSide)) self.setJudgeButtons() @@ -2608,15 +2608,15 @@ class GUI(QtGui.QWidget): suffix = 'on' else: suffix = 'off' - + emote = ini.read_ini(AOpath + 'characters/' + charName + '/char.ini', "emotions", str(emoteind), 'normal#(a)normal#normal#0#') sound = ini.read_ini(AOpath + 'characters/' + charName + '/char.ini', "soundn", str(emoteind), '1') soundt = ini.read_ini(AOpath + 'characters/' + charName + '/char.ini', "soundt", str(emoteind), '0') soundl = ini.read_ini(AOpath + 'characters/' + charName + '/char.ini', "soundl", str(emoteind), '0') # AO 2.8 - + emoteList = emote.split('#') deskmod = emoteList.pop(len(emoteList) - 1) - + emoteList.append(sound) emoteList.append(soundt) emoteList.append(soundl) # AO 2.8 @@ -2636,11 +2636,11 @@ class GUI(QtGui.QWidget): self.btnPrevEmotePage.hide() self.btnNextEmotePage.hide() - totalEmotes = len(self.charEmotes) - + totalEmotes = len(self.charEmotes) + for button in self.emoteButtons: button.hide() - + if not totalEmotes: print "[client] The selected character appears to have no emotions defined" return @@ -2665,15 +2665,15 @@ class GUI(QtGui.QWidget): image = QtGui.QPixmap(AOpath + 'characters/' + self.charName + '/emotions/button' + str(nRealEmote + 1) + '_on.png') else: image = QtGui.QPixmap(AOpath + 'characters/' + self.charName + '/emotions/button' + str(nRealEmote + 1) + '_off.png') - + if not image.isNull() and not image.width() == 40: self.emoteButtons[nEmote].setPixmap(image.scaled(40, 40, QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation)) else: self.emoteButtons[nEmote].setPixmap(image) - + self.emoteButtons[nEmote].show() - self.emoteButtons[nEmote].setToolTip(self.charEmotes[nEmote + self.currentEmotePage * self.maxEmotesOnPage][0]) - + self.emoteButtons[nEmote].setToolTip(self.charEmotes[nEmote + self.currentEmotePage * self.maxEmotesOnPage][0]) + def iniSwapIndexChange(self, ind): self.iniSwapIndex = ind @@ -2709,7 +2709,7 @@ class GUI(QtGui.QWidget): def onDeleteEvidence(self): if self.selectedEvidence == -1: return - + if not self.privateInventorySelected: if self.evidence: self.tcp.send('DE#' + str(self.selectedEvidence) + '#%') @@ -2718,13 +2718,13 @@ class GUI(QtGui.QWidget): elif len(self.privateEvidence): del self.privateEvidence[self.selectedEvidence] self.boxPrivateEvidence.removeItem(self.selectedEvidence) - + def onExportEvidence(self, isAutosave=False): if not exists("evidence"): os.mkdir("evidence") - + path = unicode(QtGui.QFileDialog.getSaveFileName(self, "Save evidence", "evidence", "Evidence (*.ini)")) if not isAutosave else "evidence/inventory.ini" - + if path: evidence = self.evidence if not self.privateInventorySelected else self.privateEvidence inifile = ConfigParser() @@ -2736,20 +2736,20 @@ class GUI(QtGui.QWidget): inifile.set(id, "name", evi[0].replace('\n', '\\n').toUtf8()) else: inifile.set(id, "name", evi[0].replace('\n', '\\n').encode('utf-8')) - + if isinstance(evi[1], QtCore.QString): inifile.set(id, "description", evi[1].replace('\n', '\\n').toUtf8()) else: inifile.set(id, "description", evi[1].replace('\n', '\\n').encode('utf-8')) - + if isinstance(evi[2], QtCore.QString): inifile.set(id, "image", evi[2].toUtf8()) else: inifile.set(id, "image", evi[2].encode('utf-8')) - + with open(path, "wb") as f: inifile.write(f) - + def onImportEvidence(self, is_autoload=False): if not is_autoload: if not self.privateInventorySelected: @@ -2761,7 +2761,7 @@ class GUI(QtGui.QWidget): if not exists("evidence"): os.mkdir("evidence") - + path = unicode(QtGui.QFileDialog.getOpenFileName(self, "Load evidence", "evidence", "Evidence (*.ini)")) if not is_autoload else "evidence/inventory.ini" if path and exists(path): evidence = [] @@ -2771,17 +2771,17 @@ class GUI(QtGui.QWidget): name = ini.read_ini(inifile, section, "name").replace('\\n', '\n').replace('\\"', '"').rstrip() description = ini.read_ini(inifile, section, "description").replace('\\n', '\n').replace('\\"', '"').rstrip() image = ini.read_ini(inifile, section, "image", "empty.png") - + # Remove opening and closing quotes if description[0] == '"' and description[-1] == '"': description = description[1:-1] - + # Not all evidence files are plain unicode name = name.decode("unicode_escape") if "\\x" in name else name.decode('utf-8') description = description.decode("unicode_escape") if "\\x" in description else description.decode('utf-8') - + evidence.append([name, description, image]) - + if self.privateInventorySelected or is_autoload: dropdown = self.boxPrivateEvidence self.privateEvidence = evidence @@ -2792,7 +2792,7 @@ class GUI(QtGui.QWidget): for evi in evidence: dropdown.addItem(evi[0]) dropdown.setCurrentIndex(self.selectedEvidence) - + if not is_autoload: self.onExportEvidence(True) elif evidence: @@ -2801,7 +2801,7 @@ class GUI(QtGui.QWidget): self.tcp.send('DE#' + str(self.selectedEvidence) + '#%') for evi in evidence: self.tcp.send('PE#' + evi[0] + '#' + evi[1] + '#' + evi[2] + '#%') - + def onTransferEvidence(self): if self.privateInventorySelected: evi = self.privateEvidence[self.selectedEvidence] @@ -2811,7 +2811,7 @@ class GUI(QtGui.QWidget): evi = self.evidence[self.selectedEvidence] target = self.privateEvidence target_str = "private" - + if evi in target: return QtGui.QMessageBox.information(self, "Can't transfer evidence", 'The evidence "%s" already exists in the %s inventory.' % (evi[0], target_str)) else: @@ -2822,10 +2822,10 @@ class GUI(QtGui.QWidget): else: self.privateEvidence.append(evi) self.boxPrivateEvidence.addItem(evi[0]) - + def onTransferAllEvidence(self): fail = [] - + if self.privateInventorySelected: evi = self.privateEvidence[self.selectedEvidence] origin = self.privateEvidence @@ -2836,7 +2836,7 @@ class GUI(QtGui.QWidget): origin = self.evidence target = self.privateEvidence target_str = "private" - + for evi in origin: if evi in target: fail.append(evi[0]) @@ -2846,10 +2846,10 @@ class GUI(QtGui.QWidget): else: self.privateEvidence.append(evi) self.boxPrivateEvidence.addItem(evi[0]) - + if fail: return QtGui.QMessageBox.information(self, "Some evidence wasn't transferred", "The following evidence already exists in the %s inventory:\n\n%s." % (target_str, ", ".join(fail))) - + def onSwitchInventory(self, reset=False): self.privateInventorySelected = not self.privateInventorySelected if self.privateInventorySelected and not reset: @@ -2886,7 +2886,7 @@ class GUI(QtGui.QWidget): self.tcp.send("ZZ#"+reason.toUtf8() + "#%") else: self.tcp.send("ZZ#%") - + def onReloadThemeClicked(self): self.loadTheme() @@ -2926,10 +2926,10 @@ class GUI(QtGui.QWidget): return QtGui.QMessageBox.information(self, 'No message selected', 'Select a message from the list to remove it.') self.queueItems.takeItem(self.selectedMessage) del self.messageQueue[self.selectedMessage] - + def onClearQueueClicked(self): return QtGui.QMessageBox.information(self, "Clear queue", 'Not implemented.') - + def onPlayerItemClicked(self, item): for i in range(len(self.playerItems)): sel = self.playerItems.item(i) @@ -2956,7 +2956,7 @@ class GUI(QtGui.QWidget): self.tcp.send("MA#%s#0#%s#%%" % (self.selectedPlayer, reason)) else: return QtGui.QMessageBox.information(self, 'No player selected', 'Select a player from the list to kick.') - + def onPlayerBanClicked(self): if not self.selectedPlayer == -1: reason, ok = QtGui.QInputDialog.getText(self, "Ban a player", "Please enter the reason.", text="Being annoying") @@ -2978,23 +2978,23 @@ class GUI(QtGui.QWidget): if not kind == 0: return evi = self.evidence - + self.selectedEvidence = ind if len(evi) > 0: self.evidenceDescription.setText(evi[ind][1]) self.setEvidenceImage(self.evidenceImage, evi[ind][2]) - + def changeGlobalEvidence(self, ind): self.changeEvidence(ind, 0) - + def changePrivateEvidence(self, ind): self.changeEvidence(ind, 1) def changeEmote(self, dropdown, ind): if ind == -1: return - - self.ICChatFocus() + + self.ICChatFocus() if not dropdown: self.selectedEmote = ind + self.currentEmotePage * self.maxEmotesOnPage else: @@ -3005,7 +3005,7 @@ class GUI(QtGui.QWidget): image = QtGui.QPixmap(button.path + '_on.png') else: image = QtGui.QPixmap(AOpath + 'characters/' + self.charName + '/emotions/button' + str(button.emoteid + self.currentEmotePage * self.maxEmotesOnPage + 1) + '_off.png') - + if not image.isNull() and not image.width() == 40: button.setPixmap(image.scaled(40, 40, QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation)) else: @@ -3027,7 +3027,7 @@ class GUI(QtGui.QWidget): if self.willDisconnect: self.disconnectCommon() self.gamewindow.returnToMenu() - + def disconnectCommon(self): self.onSwitchInventory(True) self.selectedPlayer = -1 @@ -3046,7 +3046,7 @@ class GUI(QtGui.QWidget): self.demoRecorder = None self.demoPlaying = False self.stopMusic() - + def onAreaItemClicked(self, item): area = item.text().split('\n')[0] self.sendMC(area) @@ -3065,7 +3065,7 @@ class GUI(QtGui.QWidget): def onOOCLogChanged(self): if self.OOCLog.verticalScrollBar().value() == self.OOCLog.verticalScrollBar().maximum(): self.OOCLog.verticalScrollBar().setValue(self.OOCLog.verticalScrollBar().maximum()) - + def sendOOCchat(self, name, text): self.tcp.send('CT#' + name + '#' + text + '#%') @@ -3089,13 +3089,13 @@ class GUI(QtGui.QWidget): if ind >= 0: self.boxPositions.setCurrentIndex(ind) self.OOCInput.clear() return - + if self.cbMockText.isChecked(): text = mockString(text) if self.cbAutoCaps.isChecked(): l = QtCore.QStringList(list(text)) l[0] = l[0].toUpper() - + last = [".", "?", "!", ")", "]"] if not l[-1] in last: l.append(".") @@ -3105,13 +3105,13 @@ class GUI(QtGui.QWidget): for i in range(1, len(l)+len(l)-1, 2): l.insert(i, " ") text = l.join("") - + self.sendOOCchat(self.OOCNameInput.text().toUtf8(), text) self.OOCInput.clear() def onICReturn(self): text = encodeAOString(unicode(self.ICChatInput.text())) #.replace('/n', '\n') - + if text: if self.cbMockText.isChecked(): text = mockString(text) @@ -3130,7 +3130,7 @@ class GUI(QtGui.QWidget): for i in range(1, len(l)+len(l)-1, 2): l.insert(i, " ") text = "".join(l) - + emote = self.charEmotes[self.selectedEmote] pre = (emote[1] != "-") @@ -3164,9 +3164,9 @@ class GUI(QtGui.QWidget): modifier = 0 else: modifier = 2 - + msg = u"MS#" - + # Visible desk modifier if "deskmod" in self.features: if emote[3] == '5': # Zoom forcibly hides the desk @@ -3183,7 +3183,7 @@ class GUI(QtGui.QWidget): msg += ("" if self.cbFirstPerson.isChecked() else emote[2]) + "#" #anim msg += text + "#" msg += (self.lastSide if self.cbFirstPerson.isChecked() else self.charSide) + "#" - + # sfx if self.boxSounds.currentIndex() > 0: msg += unicode(self.boxSounds.currentText()) + "#" @@ -3191,25 +3191,25 @@ class GUI(QtGui.QWidget): msg += "1#" else: msg += emote[4] + "#" - + msg += str(modifier) + "#" #emote modifier msg += str(self.myChar) + "#" #character ID msg += emote[5] + "#" #sfx delay msg += str(objection) + "#" msg += str((self.selectedEvidence + 1) * int(self.present)) + "#" #selected evidence - + if self.present: self.present = False self.btnEvidencePresent.setPixmap(self.btnEvidencePresent.button_off) - + if "flipping" in self.features: msg += str(self.myFlip) + "#" else: msg += str(self.myChar) + "#" # old AO servers send a second charID in the message because drunk fanat - + msg += str(int(self.btnRealization.isPressed())) + "#" msg += str(self.myChatColor) + "#" - + if "cccc_ic_support" in self.features: showname = self.showname.decode('utf-8') if self.showname == "" and not self.charShowname == "": @@ -3258,9 +3258,9 @@ class GUI(QtGui.QWidget): p_effect = ini.read_ini(AOpath + "characters/"+self.charName+"/char.ini", "options", "effects") msg += str(fx + "|" + p_effect + "|" + fxSound + "#").encode('utf-8') self.boxEffects.setCurrentIndex(0) - + self.boxSounds.setCurrentIndex(0) - + # AO 2.10.2+ if "custom_blips" in self.features: blip = ini.read_ini(AOpath + "characters/"+self.charName+"/char.ini", "options", "blips") @@ -3268,16 +3268,16 @@ class GUI(QtGui.QWidget): blip = ini.read_ini(AOpath + "characters/"+self.charName+"/char.ini", "options", "gender") if blip: msg += str(blip) + "#" - + # Slides msg += "%d#" % self.cbSlide.isChecked() msg += "%" - + self.queueItems.addItem(self.ICChatInput.text()) self.messageQueue.append(msg) self.lastMessage = msg - + self.ICChatInput.clear() self.btnRealization.setPressed(False) self.btnShake.setPressed(False) @@ -3287,7 +3287,7 @@ class GUI(QtGui.QWidget): bg = self.background else: self.background = bg - + if not exists(AOpath + 'background/' + bg): bg = 'default' @@ -3320,58 +3320,58 @@ class GUI(QtGui.QWidget): setattr(self, bgfile[0], QtGui.QPixmap.fromImage(bgimg)) else: setattr(self, bgfile[0], QtGui.QPixmap.fromImage(bgimg)) - + court = AOpath + 'background/' + bg + '/court.png' self.slideAvailable = exists(court) - + if self.slideAvailable: slide = QtGui.QPixmap(court) slide_width = slide.width() * 2 - - self.slideBg.resize(slide_width, self.viewport.height()) + + self.slideBg.resize(slide_width, self.viewport.height()) self.slideBg.setPixmap(slide.scaled(slide.width() * 2, self.viewport.height(), QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.FastTransformation)) courtOverlay = AOpath + 'background/' + bg + '/courtOverlay.png' if exists(courtOverlay): slideOverlay = QtGui.QPixmap(courtOverlay) - self.slideOverlay.resize(slide_width, self.viewport.height()) + self.slideOverlay.resize(slide_width, self.viewport.height()) self.slideOverlay.setPixmap(slideOverlay.scaled(slide.width() * 2, self.viewport.height(), QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.FastTransformation)) self.slideHasOverlay = True else: self.slideHasOverlay = False - + self.bench.show() - + if reset: self.chatbox.hide() self.char.hide() self.setScene(True) - + def startSlide(self, value = [0, 0]): self.chatbox.hide() self.presentedEvidence.hide() - + slide_time = 500 self.bench.hide() self.slideBg.show() - + defPos = QtCore.QRect(0, 0, self.slideBg.width(), self.viewport.height()) proPos = QtCore.QRect(-(defPos.size().width() - self.viewport.width()), 0, defPos.size().width(), self.viewport.height()) witPos = QtCore.QRect(-(self.slideBg.width() / 2 - self.viewport.width() / 2), 0, self.slideBg.width(), self.viewport.height()) - + self.slideKind = value[0] self.slideDirection = value[1] - + # TODO: play only first frame of preanim, figure out zooms scaling = getScaling(ini.read_ini(AOpath + 'characters/' + self.mChatMessage[CHARNAME].lower() + '/char.ini', "options", "scaling").lower()) if self.mChatMessage[FLIP] == "1": self.slideSpeaker.setFlipped(True) else: self.slideSpeaker.setFlipped(False) - + self.slideSpeaker.playIdle(self.mChatMessage[CHARNAME], self.mChatMessage[ANIM], scaling) self.slideSpeaker.show() - + if self.slideKind == 0: if self.slideLastWit: self.slideWitness.playIdle(self.slideLastWit[0], self.slideLastWit[1], self.slideLastWit[2]) @@ -3396,7 +3396,7 @@ class GUI(QtGui.QWidget): else: bg_start = proPos bg_end = witPos - + self.slideBg.setGeometry(bg_start) self.slideBgAnimation.setStartValue(bg_start) self.slideBgAnimation.setEndValue(bg_end) @@ -3407,11 +3407,11 @@ class GUI(QtGui.QWidget): if self.slideHasOverlay: self.slideOverlay.show() self.slideOverlay.setGeometry(bg_start) - + def slideChanged(self): x = self.slideBg.x() self.slideOverlay.move(x, 0) - + # def-pro if self.slideKind == 0: if self.slideLastWit: @@ -3438,7 +3438,7 @@ class GUI(QtGui.QWidget): else: self.char.moveSlide(x + self.slideBg.width() - self.viewport.width()) self.slideSpeaker.moveSlide(x + self.slideBg.width() / 2 - self.viewport.width() / 2) - + def slideDone(self): self.slideBg.hide() self.slideOverlay.hide() @@ -3451,16 +3451,16 @@ class GUI(QtGui.QWidget): self.btnDefenseBar.setHealth(health) elif type == 2: self.btnProsecutionBar.setHealth(health) - + def netmsgMS(self, p_contents): if len(p_contents) < 15: #this is already done on the TCP thread but i'll do it here anyway as well return - + AO2chat = "cccc_ic_support" in self.features if int(p_contents[CHAR_ID]) in self.muted: # skip the self.chatmessage copy line below return - + mChatMessage = {} for n_string in range(self.chatMessageSize): @@ -3468,21 +3468,21 @@ class GUI(QtGui.QWidget): mChatMessage[n_string] = p_contents[n_string] else: mChatMessage[n_string] = "" - + # For debugging # print mChatMessage fCharId = int(mChatMessage[CHAR_ID]) - + if fCharId < 0 or fCharId >= len(self.charList): return - + fShowname = "" if not mChatMessage[SHOWNAME]: fShowname = mChatMessage[CHARNAME] else: fShowname = mChatMessage[SHOWNAME] - + if self.messageQueue: chatMsgComp = decodeAOString(self.messageQueue[0].split('#')[5]).strip() examine = chatMsgComp == ">" or chatMsgComp == "<" or chatMsgComp == "=" @@ -3492,19 +3492,19 @@ class GUI(QtGui.QWidget): self.queueItems.takeItem(0) if self.cbAdditive.isChecked(): self.ICChatInput.insert(" ") - + mChatMessage[CHARNAME] = mChatMessage[CHARNAME].decode("utf-8") mChatMessage[OTHER_NAME] = mChatMessage[OTHER_NAME].decode("utf-8") mChatMessage[SHOWNAME] = mChatMessage[SHOWNAME].decode('utf-8') - + fChar = mChatMessage[CHARNAME] evidence = int(mChatMessage[EVIDENCE]) - 1 - + # Some characters use " - " instead of "-" for no preanim. mChatMessage[PREANIM] = mChatMessage[PREANIM].strip() - + customObjection = "custom" - try: + try: objectionMod = int(mChatMessage[SHOUT_MOD]) except: if "4&" in mChatMessage[SHOUT_MOD]: # custom objection name @@ -3512,22 +3512,22 @@ class GUI(QtGui.QWidget): customObjection = mChatMessage[SHOUT_MOD].split("4&")[1] # get the name else: # just in case of mindfuckery objectionMod = 0 - + # TODO: Make logging format customizable t = time.localtime() logcharName = fChar - + timestamp = "[%d:%.2d] " % (t[3], t[4]) if not self.demoPlaying else "" - + if fChar.lower() != self.charList[fCharId][0].lower(): logcharName = self.charList[fCharId][0] + ' (' + fChar + ')' - + chatmsg = mChatMessage[CHATMSG].strip() - + # Callwords mentioned = False if exists(AO2XPpath + "callwords.ini"): - with open(AO2XPpath + "callwords.ini") as f: + with open(AO2XPpath + "callwords.ini") as f: callwords = [line.rstrip() for line in f] for callword in callwords: if callword.decode('utf-8').lower() in chatmsg.lower().split(" "): @@ -3538,20 +3538,20 @@ class GUI(QtGui.QWidget): audio.playHandle(snd, True) mentioned = True break - + if mChatMessage[SHOWNAME] and mChatMessage[SHOWNAME].lower() != fChar.lower(): try: logcharName += " (" + mChatMessage[SHOWNAME]+")" except: logcharName += " (???)" - + if objectionMod == 1: self.ICLog.append(timestamp + '%s: %s' % (logcharName, "Hold it!")) elif objectionMod == 2 or objectionMod == 4: self.ICLog.append(timestamp + '%s: %s' % (logcharName, "Objection!")) elif objectionMod == 3: self.ICLog.append(timestamp + '%s: %s' % (logcharName, "Take that!")) - + if evidence == -1: if chatmsg: self.ICLog.append("" + timestamp + '%s%s: %s%s' % ( @@ -3566,7 +3566,7 @@ class GUI(QtGui.QWidget): eviname = self.evidence[evidence][0] except: pass - + if chatmsg: self.ICLog.append("" + timestamp + '%s%s: %s%s' % ( "" if mentioned else "", @@ -3577,7 +3577,7 @@ class GUI(QtGui.QWidget): self.ICLog.append(timestamp + '%s presented an evidence: %s' % (fChar, eviname.strip())) self.isAdditive = (mChatMessage[ADDITIVE] == "1") - + if objectionMod <= 4 and objectionMod >= 1: # Skip everything in the queue, show message immediately self.inboxQueue = [] @@ -3585,13 +3585,13 @@ class GUI(QtGui.QWidget): self.inboxTimer.stop() self.chatTickTimer.stop() self.mChatMessage = mChatMessage - + objections = ["holdit", "objection", "takethat", "custom_objections/"+customObjection if customObjection != "custom" else "custom"] self.objectionView.stop() self.objectionView.play(objections[objectionMod - 1], fChar.lower()) self.presentedEvidence.hide() self.playObjectionSound(fChar.lower(), objectionMod) - + emoteMod = int(self.mChatMessage[EMOTE_MOD]) if emoteMod == 0: self.mChatMessage[EMOTE_MOD] = 1 @@ -3599,17 +3599,17 @@ class GUI(QtGui.QWidget): # Old behavior #self.mChatMessage = mChatMessage #self.handleChatMessage2() - + # Add message to queue and wait, unless queue empty self.inboxQueue.append(mChatMessage) if len(self.inboxQueue) == 1: self.handleChatMessage1(mChatMessage) - + def setTextColor(self): textColor = int(self.mChatMessage[TEXT_COLOR]) - + isRainbow = textColor == C_RAINBOW - + if textColor == 0: color = QtGui.QColor(255, 255, 255) elif textColor == 1: @@ -3632,18 +3632,18 @@ class GUI(QtGui.QWidget): color = QtGui.QColor(0, 0, 0) else: color = QtGui.QColor(255, 255, 255) - + if isRainbow: self.text.show() self.ao2text.hide() else: self.text.hide() self.ao2text.show() - + style = "background-color: rgba(0, 0, 0, 0);\n" style += "color: rgb(" + str(color.red()) + ", " + str(color.green()) + ", " + str(color.blue()) + ")" self.ao2text.setStyleSheet(style) - + def setScene(self, init=False): if not init: if self.animIsEmpty: @@ -3655,9 +3655,9 @@ class GUI(QtGui.QWidget): side = 'wit' else: side = 'wit' - + self.presentedEvidence.hide() - + if side == 'def': self.court.setPixmap(self.sideDef) self.bench.setPixmap(self.benchDef) @@ -3694,9 +3694,9 @@ class GUI(QtGui.QWidget): def setBench(self, isPreanim = False): if self.animIsEmpty: return - + deskmod = self.mChatMessage[DESK_MOD] - + if deskmod == "0" or (deskmod == "chat" and side in ("jud", "hld", "hlp")): self.bench.hide() elif deskmod == "1" or (deskmod == "chat" and side in ("def", "pro", "wit")): @@ -3716,22 +3716,22 @@ class GUI(QtGui.QWidget): def objectionDone(self): self.handleChatMessage1() - + def handleChatMessage1(self, mChatMessage = None): if not self.slideEnabled: if mChatMessage: self.mChatMessage = mChatMessage self.handleChatMessage2() return - + wasZoom = self.mChatMessage[EMOTE_MOD] and int(self.mChatMessage[EMOTE_MOD]) >= 5 - + if mChatMessage: self.mChatMessage = mChatMessage - + newSide = self.mChatMessage[SIDE] canSlide = self.slideAvailable and not wasZoom and int(self.mChatMessage[EMOTE_MOD]) < 5 and self.mChatMessage[ANIM].strip() != "" - + if canSlide and self.mChatMessage[SLIDE] == "1" and self.slideLastPos and newSide != self.slideLastPos and newSide in ["def", "pro", "wit"]: self.startSlide(self.slideMap[self.slideLastPos][newSide]) else: @@ -3740,16 +3740,16 @@ class GUI(QtGui.QWidget): def handleChatMessage2(self): self.zoom.setZoom(False) self.effectView.stop() - + self.textState = 0 self.animState = 0 self.objectionView.stop() self.chatTickTimer.stop() self.presentedEvidence.hide() - + self.chatMessageIsEmpty = self.mChatMessage[CHATMSG].strip() == "" self.animIsEmpty = self.mChatMessage[ANIM].strip() == "" - + if not self.animIsEmpty: self.char.stop() @@ -3762,20 +3762,20 @@ class GUI(QtGui.QWidget): self.setScene() self.setTextColor() - + fMessage = self.mChatMessage[CHATMSG] if len(fMessage) >= 2: self.messageIsCentered = fMessage.startswith("~~") else: self.ao2text.setAlignment(QtCore.Qt.AlignLeft) self.text.setAlignment(QtCore.Qt.AlignLeft) - + if not self.animIsEmpty: if self.mChatMessage[FLIP] == "1": self.char.setFlipped(True) else: self.char.setFlipped(False) - + side = self.mChatMessage[SIDE] emoteMod = int(self.mChatMessage[EMOTE_MOD]) @@ -3789,7 +3789,7 @@ class GUI(QtGui.QWidget): vert_offset = int(offset[1]) if len(offset) > 1 else 0 else: hor_offset = int(self.mChatMessage[SELF_OFFSET]) - + if side == "def": if hor_offset > 0 and vert_offset == 0: vert_offset = hor_offset / 10 @@ -3812,11 +3812,11 @@ class GUI(QtGui.QWidget): if got_otherCharId > -1: # user is paired self.sideChar.show() - + boxPairOrder = self.mChatMessage[OTHER_CHARID].split("^") - if "effects" in self.features and len(boxPairOrder) > 1: + if "effects" in self.features and len(boxPairOrder) > 1: boxPairOrder = int(boxPairOrder[1]) - else: + else: boxPairOrder = -1 hor2_offset = vert2_offset = 0 @@ -3856,19 +3856,19 @@ class GUI(QtGui.QWidget): self.effectView.raise_() self.objectionView.raise_() self.whiteFlashLabel.raise_() - + self.scaling[1] = getScaling(ini.read_ini(AOpath + 'characters/' + self.mChatMessage[OTHER_NAME].lower() + '/char.ini', "options", "scaling").lower()) self.sideChar.setFlipped(self.mChatMessage[OTHER_FLIP] == "1") if not self.animIsEmpty: self.sideChar.playIdle(self.mChatMessage[OTHER_NAME], self.mChatMessage[OTHER_EMOTE], self.scaling[1]) - + elif not self.animIsEmpty: self.sideChar.hide() self.sideChar.move(0, 0) - + self.scaling[0] = getScaling(ini.read_ini(AOpath + 'characters/' + self.mChatMessage[CHARNAME].lower() + '/char.ini', "options", "scaling").lower()) - + if self.slideEnabled and self.slideAvailable: if side == "wit": if int(self.mChatMessage[EMOTE_MOD]) < 5: # Don't save anim if zoom @@ -3893,26 +3893,26 @@ class GUI(QtGui.QWidget): self.handleChatMessage3() else: self.playPre(True) - + def playPre(self, nonInterrupting): fChar = self.mChatMessage[CHARNAME].lower() fPreanim = self.mChatMessage[PREANIM].strip() - + ao2Duration = ini.read_ini_int(AOpath + "characters/" + fChar + "/char.ini", "time", fPreanim, -1) textDelay = ini.read_ini_int(AOpath + "characters/" + fChar + "/char.ini", "textdelay", fPreanim, -1) sfxDelay = int(self.mChatMessage[SFX_DELAY]) * 60 - + if sfxDelay > 0: self.sfxDelayTimer.start(sfxDelay) else: self.playSfx() - + preanimDuration = ao2Duration - + animToFind = AOpath + "characters/" + fChar + "/" + fPreanim + ".gif" apngToFind = AOpath + "characters/" + fChar + "/" + fPreanim + ".apng" webpToFind = AOpath + "characters/" + fChar + "/" + fPreanim + ".webp" - + if (not animToFind and not apngToFind and not webpToFind) or preanimDuration < 0: if nonInterrupting: self.animState = 4 @@ -3920,39 +3920,39 @@ class GUI(QtGui.QWidget): self.animState = 1 self.preanimDone() return - + self.char.playPre(fChar, fPreanim, preanimDuration, self.scaling[0]) if nonInterrupting: self.animState = 4 else: self.animState = 1 - + if textDelay >= 0: pass # TODO: text delay timer, but not now. - + if nonInterrupting: self.handleChatMessage3() - + def preanimDone(self): self.animState = 1 self.handleChatMessage3() - + def handleChatMessage3(self): self.startChatTicking() self.setBench(False) - + fEvidenceId = int(self.mChatMessage[EVIDENCE]) fSide = self.mChatMessage[SIDE] - + emoteMod = int(self.mChatMessage[EMOTE_MOD]) - + if fEvidenceId > 0 and fEvidenceId <= len(self.evidence): fImage = self.evidence[fEvidenceId-1][2] isLeftSide = not (fSide == "def" or fSide == "hlp" or fSide == "jud" or fSide == "jur") - + self.setEvidenceImage(self.presentedEvidence, fImage, True) self.playSound("sfx-evidenceshoop.opus") - + if not isLeftSide: self.presentedEvidence.move(self.viewport.x() + 170 * self.viewportScale, self.viewport.y() + 16 * self.viewportScale) else: @@ -3960,37 +3960,37 @@ class GUI(QtGui.QWidget): self.presentedEvidence.show() else: self.presentedEvidence.hide() - + side = self.mChatMessage[SIDE] if emoteMod == 5 or emoteMod == 6: self.bench.hide() self.sideChar.hide() self.char.move(0,0) - + if side == "pro" or side == "hlp" or side == "wit": self.zoom.setZoom(True, 1) else: self.zoom.setZoom(True, 0) - + f_animState = 0 text_is_blue = int(self.mChatMessage[TEXT_COLOR]) == 4 - + if not text_is_blue and self.textState == 1: f_animState = 2 self.entireMessageIsBlue = False else: f_animState = 3 self.entireMessageIsBlue = True - + if f_animState <= self.animState: return - + fChar = self.mChatMessage[CHARNAME] f_emote = self.mChatMessage[ANIM] - + if not self.animIsEmpty: self.char.stop() - + if f_animState == 2: self.char.playTalking(fChar, f_emote, self.scaling[0]) self.animState = 2 @@ -4031,7 +4031,7 @@ class GUI(QtGui.QWidget): elif self.mChatMessage[REALIZATION] == "1": self.setWhiteFlash(True, 1, 125) - + self.setTextColor() charid = int(self.mChatMessage[CHAR_ID]) @@ -4044,20 +4044,20 @@ class GUI(QtGui.QWidget): self.textState = 2 self.inboxTimer.start(self.textWaitTime) return - + self.inlineColorStack = [] - + self.chatbox.show() self.tickPos = 0 self.blipPos = 0 self.inlineBlueDepth = 0 - + self.currentDisplaySpeed = 3 self.chatTickTimer.start(self.messageDisplaySpeed[self.currentDisplaySpeed]) self.blip = self.mChatMessage[BLIPS].lower() - + if not self.blip or self.blip == "-1": self.blip = self.charList[charid][2].lower() if not self.blip: @@ -4069,7 +4069,7 @@ class GUI(QtGui.QWidget): AOpath + "sounds/general/sfx-blip"+ self.blip +".wav", AOpath + "sounds/general/sfx-blip"+ self.blip +".opus" ) - + if path: if self.blipSound: audio.freeHandle(self.blipSound) @@ -4083,16 +4083,16 @@ class GUI(QtGui.QWidget): self.setScreenShake(True) self.textState = 1 - + def chatTick(self): fMessage = self.mChatMessage[CHATMSG] - + self.chatTickTimer.stop() formattingChar = False - + if self.messageIsCentered: fMessage = fMessage.strip("~~") - + if self.tickPos >= len(fMessage): self.textState = 2 if self.animState != 4: @@ -4100,7 +4100,7 @@ class GUI(QtGui.QWidget): if not self.animIsEmpty: self.char.playIdle(self.mChatMessage[CHARNAME], self.mChatMessage[ANIM], self.scaling[0]) self.inboxTimer.start(self.textWaitTime) - + else: fCharacter2 = fMessage[self.tickPos] fCharacter = QtCore.QString(fCharacter2) @@ -4108,23 +4108,23 @@ class GUI(QtGui.QWidget): if fCharacter in [" ", "\n", "<", ">"]: self.text.insertPlainText(fCharacter) self.ao2text.insertPlainText(fCharacter) - + elif fCharacter == "\r": self.text.insertPlainText("\n") self.ao2text.insertPlainText("\n") - + elif fCharacter == "\\" and not self.nextCharacterIsNotSpecial: self.nextCharacterIsNotSpecial = True formattingChar = True - + elif fCharacter == "{" and not self.nextCharacterIsNotSpecial: self.currentDisplaySpeed += 1 formattingChar = True - + elif fCharacter == "}" and not self.nextCharacterIsNotSpecial: self.currentDisplaySpeed -= 1 formattingChar = True - + elif fCharacter == "|" and not self.nextCharacterIsNotSpecial: #orange. if self.inlineColorStack: if self.inlineColorStack[-1] == INLINE_ORANGE: @@ -4134,30 +4134,30 @@ class GUI(QtGui.QWidget): else: self.inlineColorStack.append(INLINE_ORANGE) formattingChar = True - + elif fCharacter == "(" and not self.nextCharacterIsNotSpecial: #blue. self.inlineColorStack.append(INLINE_BLUE) html = "" + fCharacter + "" self.ao2text.insertHtml(html) self.text.insertHtml(html) - + self.inlineBlueDepth += 1 if not self.entireMessageIsBlue and self.animState != 4: fChar = self.mChatMessage[CHARNAME] f_emote = self.mChatMessage[ANIM] if not self.animIsEmpty: self.char.playIdle(fChar, f_emote, self.scaling[0]) - + elif fCharacter == ")" and not self.nextCharacterIsNotSpecial and self.inlineColorStack: if self.inlineColorStack[-1] == INLINE_BLUE: del self.inlineColorStack[-1] html = "" + fCharacter + "" self.ao2text.insertHtml(html) self.text.insertHtml(html) - + if self.inlineBlueDepth > 0: self.inlineBlueDepth -= 1 - + if not self.entireMessageIsBlue: if self.inlineBlueDepth == 0 and self.animState != 4 and not (self.tickPos+1 >= len(fMessage)): fChar = self.mChatMessage[CHARNAME] @@ -4166,13 +4166,13 @@ class GUI(QtGui.QWidget): else: self.nextCharacterIsNotSpecial = True self.tickPos -= 1 - + elif fCharacter == "[" and not self.nextCharacterIsNotSpecial: #gray. self.inlineColorStack.append(INLINE_GRAY) html = "" + fCharacter + "" self.ao2text.insertHtml(html) self.text.insertHtml(html) - + elif fCharacter == "]" and not self.nextCharacterIsNotSpecial and self.inlineColorStack: if self.inlineColorStack[-1] == INLINE_GRAY: del self.inlineColorStack[-1] @@ -4182,7 +4182,7 @@ class GUI(QtGui.QWidget): else: self.nextCharacterIsNotSpecial = True self.tickPos -= 1 - + elif fCharacter == "`" and not self.nextCharacterIsNotSpecial: #green. if self.inlineColorStack: if self.inlineColorStack[-1] == INLINE_GREEN: @@ -4215,7 +4215,7 @@ class GUI(QtGui.QWidget): self.text.insertPlainText("\n") self.ao2text.insertPlainText("\n") self.nextCharacterIsNotSpecial = False - + else: self.nextCharacterIsNotSpecial = False if self.inlineColorStack: @@ -4248,24 +4248,24 @@ class GUI(QtGui.QWidget): self.text.insertHtml(fCharacter) else: self.ao2text.insertHtml(fCharacter) - + if self.messageIsCentered: self.ao2text.setAlignment(QtCore.Qt.AlignCenter) self.text.setAlignment(QtCore.Qt.AlignCenter) else: self.ao2text.setAlignment(QtCore.Qt.AlignLeft) self.text.setAlignment(QtCore.Qt.AlignLeft) - + if fMessage[self.tickPos] != " " or self.blankBlip: if self.blipPos % self.blipRate == 0 and not formattingChar: self.blipPos = 0 if self.blipSound: audio.playHandle(self.blipSound, True) - + self.blipPos += 1 - + self.tickPos += 1 - + if self.currentDisplaySpeed < 0: self.currentDisplaySpeed = 0 elif self.currentDisplaySpeed > 6: @@ -4275,7 +4275,7 @@ class GUI(QtGui.QWidget): self.chatTickTimer.start(1) else: self.chatTickTimer.start(self.messageDisplaySpeed[self.currentDisplaySpeed]) - + def inboxTimerTimeout(self): if len(self.inboxQueue) > 0: del self.inboxQueue[0] @@ -4292,14 +4292,14 @@ class GUI(QtGui.QWidget): except: print "[warning] Can't play objection sound if charName is unicode yet" return - + if self.sndObjection: if audio.handleIsActive(self.sndObjection): audio.stopHandle(self.sndObjection) audio.freeHandle(self.sndObjection) objecting = ["holdit", "objection", "takethat", "custom"][objection - 1] - + if objecting: if exists(AOpath + 'characters/' + charName + '/' + objecting + '.wav'): self.sndObjection = audio.loadHandle(False, AOpath + 'characters/' + charName + '/' + objecting + '.wav', 0, 0, 0) @@ -4317,7 +4317,7 @@ class GUI(QtGui.QWidget): self.sndObjection = audio.loadHandle(False, AOpath + 'sounds/general/sfx-objection.wav', 0, 0, 0) audio.setHandleAttr(self.sndObjection, BASS_ATTRIB_VOL, self.sliSoundVolume.value() / 100.0) audio.playHandle(self.sndObjection, True) - + def populateSoundList(self): self.boxSounds.clear() self.boxSounds.addItem("Default") @@ -4327,48 +4327,48 @@ class GUI(QtGui.QWidget): if not sound: continue self.boxSounds.addItem(sound.strip()) - + def playSfx(self): sfxName = self.mChatMessage[SFX] if sfxName == "1" or sfxName == "0": return - + self.playSound(sfxName) def playSound(self, sfx): self.soundChannel = (self.soundChannel + 1) % self.soundChannels - + if self.sound[self.soundChannel]: if audio.handleIsActive(self.sound[self.soundChannel]): audio.stopHandle(self.sound[self.soundChannel]) audio.freeHandle(self.sound[self.soundChannel]) - + path = testPath( AOpath + 'sounds/general/' + sfx, AOpath + 'sounds/general/' + sfx + '.wav', AOpath + 'sounds/general/' + sfx + '.opus' ) - + if path: self.sound[self.soundChannel] = audio.loadHandle(False, path, 0, 0, 0) audio.setHandleAttr(self.sound[self.soundChannel], BASS_ATTRIB_VOL, self.sliSoundVolume.value() / 100.0) if self.sound[self.soundChannel]: audio.playHandle(self.sound[self.soundChannel], True) - + def playMusic(self, mus): self.stopMusic() if mus == "~stop.mp3" or not mus: self.setCurrentMusicURL(None) return - + _musicList = self.musicListPrivate if self.privateMusicSelected else self.musicList - + if not mus.endswith(".mp3") and "===MUSIC START===.mp3" in _musicList: #vidya workaround mus += ".mp3" musl = mus.lower() - + playLocal = False - + if exists(AOpath + 'sounds/music/' + musl): playLocal = True elif self.pickedMusicItem: @@ -4381,9 +4381,9 @@ class GUI(QtGui.QWidget): if exists(AOpath + 'sounds/music/' + _musl): musl = _musl playLocal = True - + self.pickedMusicItem = False - + if playLocal: if isinstance(musl, unicode): if platform.system() == "Windows": @@ -4400,7 +4400,7 @@ class GUI(QtGui.QWidget): else: error = audio.getBassError() print "[audio] Couldn't play local track! Error", error - + elif ini.read_ini_bool("AO2XP.ini", "General", "download music", True): if musl.startswith("http"): self.music = audio.loadURLHandle(mus, 0, BASS_SAMPLE_LOOP) @@ -4443,11 +4443,11 @@ class GUI(QtGui.QWidget): audio.freeHandle(self.music) if self.stream: self.stream = None - + if self.downloadThread: self.downloadThread.stop() self.downloadThread = None - + def playDownloadedMusic(self, file_length, url): # Part of the evil HTTPS music download hack for XP systems if self.specialStream: @@ -4463,16 +4463,16 @@ class GUI(QtGui.QWidget): audio.pauseHandle(self.music) else: print "[audio] Done downloading, but the stream couldn't be played. Error", audio.getBassError() - + def setCurrentMusicURL(self, url): self.currentMusicURL = url self.actMusicAddCurrent.setDisabled(url is None) def loadAllMusic(self): _musicList = self.musicListPrivate if self.privateMusicSelected else self.musicList - + self.actMusicRandom.setDisabled(not len(_musicList.items())) - + for song, fname in _musicList.items(): songitem = QtGui.QListWidgetItem() songitem.setText(song) @@ -4498,11 +4498,11 @@ class GUI(QtGui.QWidget): self.evidenceDescription.setText('.') else: self.boxEvidence.setCurrentIndex(self.selectedEvidence) - + def updatePlayerList(self, pid, op, utype, data=""): if not self.playerList: return - + pid = str(pid) if op == 0: # Add or remove player if utype == 0: # Add a player @@ -4518,7 +4518,7 @@ class GUI(QtGui.QWidget): else: # Update a player if pid in self.playerList: self.playerList[pid][utype] = data - + item = self.playerItems.findItems("[%s]" % pid, QtCore.Qt.MatchStartsWith) if item: name = self.playerList[pid][0] @@ -4532,11 +4532,11 @@ class GUI(QtGui.QWidget): if name: text += " %s" % name item[0].setText(text) - + def startPauseOnscreenTimers(self, command, timer_id, timer_ms): if timer_id > 4: return - + if command == 0: if not self.onscreenTimer.isActive(): self.onscreenTimer.start(self.onscreenTimerTick) @@ -4550,43 +4550,43 @@ class GUI(QtGui.QWidget): self.onscreenTimerLabels[timer_id].show() elif command == 3: self.onscreenTimerLabels[timer_id].hide() - + def updateOnscreenTimers(self): for timer_id, label in enumerate(self.onscreenTimerLabels): time_ms = self.onscreenTimerTimes[timer_id] if not time_ms or self.onscreenTimerPaused[timer_id]: continue - + secs = time_ms / 1000 mins = secs / 60 hours = mins / 60 label.setText("%02d:%02d:%02d" % (hours, mins % 60, secs % 60)) - + self.onscreenTimerTimes[timer_id] -= self.onscreenTimerTick if self.onscreenTimerTimes[timer_id] <= 0: label.hide() self.onscreenTimerTimes[timer_id] = 0 self.onscreenTimerPaused[timer_id] = True - + if self.onscreenTimerTimes == [0, 0, 0, 0, 0]: self.onscreenTimer.stop() def onDemoClicked(self, item): fname = demo.getDemoFilename(self.demoItems, item) - + if not fname: return - + self.playerItems.clear() self.stopMusic() self.ICLog.clear() self.OOCLog.clear() - + if not self.demoPlaying: self.enableWidgets(True) self.tcpThread.stop() self.demoPlaying = True - + self.demoPlayer = demo.DemoPlayer(self) self.demoPlayer.MS_Chat.connect(self.netmsgMS) self.demoPlayer.newChar.connect(self.onPVPacket) @@ -4598,7 +4598,7 @@ class GUI(QtGui.QWidget): self.demoPlayer.updatePlayerList.connect(self.updatePlayerList) self.demoPlayer.rainbowColor.connect(self.text.setStyleSheet) self.demoPlayer.timerUpdate.connect(self.startPauseOnscreenTimers) - + self.demoPlayer.start(fname) def demoSeek(self, time): @@ -4616,7 +4616,7 @@ class GUI(QtGui.QWidget): self.areasLen = len(areas[0]) self.features = features self.musicList = OrderedDict([]) - + # We want only song names without paths or extensions in the music list for song in musicList: _basename = os.path.splitext(basename(song)) @@ -4626,7 +4626,7 @@ class GUI(QtGui.QWidget): webAO_bucket = webAO_bucket.replace("base/", "") global bucket bucket = webAO_bucket - + self.charSelect.setCharList(charList) autopick = getOption("General", "auto pick").decode('utf-8').lower() coincidence = -1 @@ -4643,12 +4643,12 @@ class GUI(QtGui.QWidget): # Putting it down here because some servers won't allow you to switch areas without picking a character first autojoinarea = getOption("General", "auto join area").decode('utf-8') if autojoinarea != "": self.sendMC(autojoinarea) - + self.OOCNameInput.setText(ini.read_ini("AO2XP.ini", "General", "OOC name", "unnamed")) self.shownameEdit.setText(ini.read_ini("AO2XP.ini", "General", "Showname")) - + self.enableWidgets() - + self.boxPair.clear() self.cbPair.setChecked(False) if "cccc_ic_support" in features: @@ -4670,13 +4670,13 @@ class GUI(QtGui.QWidget): self.btnCustomObjection.setVisible("customobjections" in features) self.sliPairOffsetY.setVisible("y_offset" in features) self.lblPairOffsetY.setVisible("y_offset" in features) - + self.boxColors.clear() self.boxColors.addItems(['White', 'Green', 'Red', 'Orange', 'Blue']) if "yellowtext" in features: self.boxColors.addItems(['Yellow', 'Pink', 'Cyan', 'Gray', 'Rainbow', 'Black']) self.boxColors.setCurrentIndex(self.myChatColor) - + for hp in hpList: self.healthbars.emit(hp[0], hp[1]) @@ -4711,14 +4711,14 @@ class GUI(QtGui.QWidget): self.ICLog.append("\n"+logstart) else: self.ICLog.append(logstart) - + self.setBackground(background.lower()) self.setScene(True) self.chatbox.hide() - + for msg in joinOOC: self.OOCLog.append(msg) - + if self.areasLen: for i in range(self.areasLen): areaitem = QtGui.QListWidgetItem() @@ -4727,7 +4727,7 @@ class GUI(QtGui.QWidget): self.updateAreaList() else: self.noARUP = True - + for pid in playerList: self.updatePlayerList(pid, 0, 0) for type in range(len(playerList[pid])): @@ -4736,7 +4736,7 @@ class GUI(QtGui.QWidget): self.sliMusicVolume.setValue(ini.read_ini_int("AO2XP.ini", "Audio", "Music volume", 100)) self.sliSoundVolume.setValue(ini.read_ini_int("AO2XP.ini", "Audio", "Sound volume", 100)) self.sliBlipsVolume.setValue(ini.read_ini_int("AO2XP.ini", "Audio", "Blip volume", 100)) - + self.onImportEvidence(True) self.tcpThread = TCPThread(self) @@ -4752,12 +4752,12 @@ class GUI(QtGui.QWidget): self.tcpThread.rainbowColor.connect(self.text.setStyleSheet) self.tcpThread.timerUpdate.connect(self.startPauseOnscreenTimers) self.tcpThread.start() - + self.demoPlaying = False - + self.startDemoRecorder(background) self.ICChatInput.setFocus() - + def startDemo(self, fname): self.playerList = [] self.charList = [] @@ -4768,17 +4768,17 @@ class GUI(QtGui.QWidget): self.musicList = OrderedDict([]) self.charSelect.hide() self.onPVPacket() - + self.setBackground("default") self.setScene(True) self.chatbox.hide() - + self.sliMusicVolume.setValue(ini.read_ini_int("AO2XP.ini", "Audio", "Music volume", 100)) self.sliSoundVolume.setValue(ini.read_ini_int("AO2XP.ini", "Audio", "Sound volume", 100)) self.sliBlipsVolume.setValue(ini.read_ini_int("AO2XP.ini", "Audio", "Blip volume", 100)) - + self.onImportEvidence(True) - + self.demoPlayer = demo.DemoPlayer(self) self.demoPlayer.MS_Chat.connect(self.netmsgMS) self.demoPlayer.newChar.connect(self.onPVPacket) @@ -4790,17 +4790,17 @@ class GUI(QtGui.QWidget): self.demoPlayer.updatePlayerList.connect(self.updatePlayerList) self.demoPlayer.rainbowColor.connect(self.text.setStyleSheet) self.demoPlayer.timerUpdate.connect(self.startPauseOnscreenTimers) - + self.playerItems.clear() self.stopMusic() self.ICLog.clear() self.OOCLog.clear() - + self.btnChangeChar.setText('Disconnect') self.enableWidgets(True) self.demoPlaying = True self.demoPlayer.start(fname) - + def startDemoRecorder(self, bg=None): if ini.read_ini_bool("AO2XP.ini", "General", "record demos", False): self.demoRecorder = demo.DemoRecorder() @@ -4808,7 +4808,7 @@ class GUI(QtGui.QWidget): self.demoRecorder.record([["SC"] + [char[0] for char in self.charList]], encode=True) if bg: self.demoRecorder.record([["BN", bg, ""]], encode=True) - + def enableWidgets(self, demo = False): for widget in [ self.OOCInput, self.btnCallMod, @@ -4828,12 +4828,12 @@ class GUI(QtGui.QWidget): self.sliDemoSeekbar.setVisible(demo) self.shownameEdit.setVisible(not demo) self.ICChatInput.setVisible(not demo) - + if demo: self.btnChangeChar.setText('Disconnect') else: self.btnChangeChar.setText('Switch &character') - + def updateAreaList(self): try: for i in range(self.areasLen): @@ -4846,7 +4846,7 @@ class GUI(QtGui.QWidget): self.areaItems.item(i).setText("%s\n%s | %s\n%s users | %s" % (areaName, areaStatus, areaCM, areaPlayers, areaLocked)) else: self.areaItems.item(i).setText("%s\n%s\n%s users | %s" % (areaName, areaStatus, areaPlayers, areaLocked)) - + if areaLocked == "Locked": self.areaItems.item(i).setIcon(QtGui.QIcon(AO2XPpath + "icons/" + "lock.png")) else: