diff --git a/AO2XPbase/ao2xp_themes/default/theme.py b/AO2XPbase/ao2xp_themes/default/theme.py index 144fb86..95f6fda 100644 --- a/AO2XPbase/ao2xp_themes/default/theme.py +++ b/AO2XPbase/ao2xp_themes/default/theme.py @@ -2,7 +2,7 @@ # window size is defined at the end of the file # IC viewport -_scale = 2 +_scale = 2.5 self.viewport.setGeometry(0, 0, 256 * _scale, 192 * _scale) # Textbox diff --git a/gameview.py b/gameview.py index d54ec47..37c8902 100644 --- a/gameview.py +++ b/gameview.py @@ -140,7 +140,7 @@ class MusicDownloadThread(QtCore.QThread): try: response = urlopen(request, timeout=5) except Exception as e: - print "[audio] There's no response, aborting. Details below:" + print "[audio] HTTP request failed, aborting... Details below:" print "[audio]", e, url self.quit() return @@ -171,7 +171,7 @@ class MusicDownloadThread(QtCore.QThread): self.caller.stream = create_string_buffer(stream) self.finished_signal.emit(file_length) else: - print "[audio] There's no response, aborting..." + print "[audio] Stream is empty, aborting..." self.quit() return @@ -811,6 +811,7 @@ class EditEvidenceDialog(QtGui.QDialog): self.cancel.clicked.connect(self.onCancelClicked) self.cancel.move(264 + 16, 384 - self.cancel.size().height() - 2) self.choosepic = QtGui.QComboBox(self) + self.choosepic.setEditable(True) self.choosepic.setGeometry(self.eviname.x() + self.eviname.size().width() - 128 - 84, self.eviname.y() + 70 - 32, 128, 24) self.filenames = [] self.browse = QtGui.QPushButton(self) @@ -1310,6 +1311,7 @@ class GUI(QtGui.QWidget): self.cbPair = QtGui.QCheckBox(self.tabPair) self.cbPair.setChecked(False) self.boxPair = QtGui.QComboBox(self.tabPair) + self.boxPair.setEditable(True) self.sliPairOffset = QtGui.QSlider(QtCore.Qt.Horizontal, self.tabPair) self.sliPairOffset.setRange(-100, 100) self.sliPairOffset.setValue(0) @@ -1468,6 +1470,11 @@ class GUI(QtGui.QWidget): self.btnCallMod.setText('Call mod') self.btnCallMod.clicked.connect(self.onCallModClicked) + self.btnReloadTheme = QtGui.QPushButton(self) + self.btnReloadTheme.setText('Reload theme') + self.btnReloadTheme.clicked.connect(self.onReloadThemeClicked) + self.btnReloadTheme.setVisible(False) + self.btnSettings = QtGui.QPushButton("Settings", self) self.btnSettings.clicked.connect(self.gamewindow.showSettings) @@ -1703,28 +1710,124 @@ class GUI(QtGui.QWidget): self.viewportScale = 1 self.nameFontPointSize = 12 self.textFontPointSize = 24 - self.emotePageGeometry = (526, 384, 288, 98) self.loadTheme() def loadTheme(self, switching=False): theme = getOption("General", "theme", "default") try: stylesheet = "" + self.emotePageGeometry = [] self.gamewindow.setStyleSheet("") self.chatbox.resetGeometry() + self.btnReloadTheme.setVisible(False) self.btnRealization.setPixmaps(theme) self.btnShake.setPixmaps(theme) self.btnObjection.setPixmaps(theme) self.btnTakeThat.setPixmaps(theme) self.btnHoldIt.setPixmaps(theme) + + # Design + courtroomDesign = AO2XPpath + "ao2xp_themes/" + theme + '/courtroom_design.ini' + if exists(courtroomDesign): + design = {} + with open(courtroomDesign) as f: + for keys in f.read().split("\n"): + if not keys or "=" not in keys or keys[0] == ";": continue + + key, value = keys.split("=") + design[key.strip()] = value.replace(" ", "").split(',') + + geometry = { + "viewport": self.viewport, + "ic_chatlog": self.gameTabs, + "server_chatlog": self.OOCLog, + "ooc_chat_name": self.OOCNameInput, + "ooc_chat_message": self.OOCInput, + "music_label": self.lblMusicVolume, + "sfx_label": self.lblSoundVolume, + "blip_label": self.lblBlipsVolume, + "music_slider": self.sliMusicVolume, + "sfx_slider": self.sliSoundVolume, + "blip_slider": self.sliBlipsVolume, + "emote_dropdown": self.boxEmotes, + "effects_dropdown": self.boxEffects, + "pos_dropdown": self.boxPositions, + "text_color": self.boxColors, + "pre_no_interrupt": self.cbNoInterrupt, + "change_character": self.btnChangeChar, + "call_mod": self.btnCallMod, + "reload_theme": self.btnReloadTheme, + "ic_chat_name": self.shownameEdit, + "settings": self.btnSettings, + "ao2_chatbox": self.chatbox, + "ao2_ic_chat_message": self.ICChatInput, + "message": self.text, + "showname": self.name, + "music_list": self.serverTabs + } + + move = { + "pre": self.cbPreanim, + "flip": self.cbFlip, + "additive": self.cbAdditive, + "slide_enable": self.cbSlide, + "hold_it": self.btnHoldIt, + "objection": self.btnObjection, + "take_that": self.btnTakeThat, + "custom_objection": self.btnCustomObjection, + "emote_left": self.btnPrevEmotePage, + "emote_right": self.btnNextEmotePage, + "realization": self.btnRealization, + "screenshake": self.btnShake, + "not_guilty": self.btnNotGuilty, + "guilty": self.btnGuilty, + "witness_testimony": self.btnWitnessTestimony, + "cross_examination": self.btnCrossExamination, + } + + bars = { + "defense_bar": self.btnDefenseBar, + "prosecution_bar": self.btnProsecutionBar + } + + for e in geometry.keys(): + if e in design: + geometry[e].setGeometry(*[int(x) for x in design[e]]) + + for e in move.keys(): + if e in design: + move[e].move(*[int(x) for x in design[e]][0:2]) + + for e in bars.keys(): + if e in design: + bars[e].moveBar(*[int(x) for x in design[e]][0:2]) + + 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.btnReloadTheme.setVisible(True) + else: + # Try to load ao2xp theme + pass + with open(AO2XPpath + "ao2xp_themes/" + theme + "/theme.py") as t: exec t if switching: # This is to reset the colors on the music list. Not necessary on startup self.onMusicSearch("") - + self.viewportScale = self.viewport.height() / float(192) self.court.resize(self.viewport.size()) @@ -1740,6 +1843,7 @@ class GUI(QtGui.QWidget): self.ao2text.setGeometry(self.text.geometry()) self.ao2text.setStyleSheet(self.text.styleSheet()) + self.sliDemoSeekbar.setGeometry(self.ICChatInput.geometry()) # Theme chatbox chatboxPixmap = QtGui.QPixmap(testPath( @@ -1774,6 +1878,16 @@ class GUI(QtGui.QWidget): self.presentedEvidence.setGeometry(self.viewport.x() + 16, self.viewport.y() + 16, 70 * self.viewportScale, 70 * self.viewportScale) # Theme fonts + courtroomFonts = AO2XPpath + "ao2xp_themes/" + theme + '/courtroom_fonts.ini' + if exists(courtroomFonts): + fonts = {} + with open(courtroomDesign) as f: + for keys in f.read().split("\n"): + if not keys or "=" not in keys or keys[0] == ";": continue + + key, value = keys.split("=") + fonts[key.strip()] = value.replace(" ", "").split(',') + fontDb = None nameFont = None textFont = None @@ -1792,6 +1906,8 @@ class GUI(QtGui.QWidget): label.resize(self.viewport.width(), label.sizeHint().height()) label.setFont(nameFont) + # Load emote buttons + # TODO: Buggy on theme switch / reload xMod_count = yMod_count = 0 left, top, width, height, hSpacing, vSpacing = self.emotePageGeometry columns = (width - 40) / (hSpacing + 40) + 1 @@ -2515,6 +2631,9 @@ class GUI(QtGui.QWidget): self.tcp.send("ZZ#"+reason.toUtf8() + "#%") else: self.tcp.send("ZZ#%") + + def onReloadThemeClicked(self): + self.loadTheme() def onChangeCharClicked(self): if self.demoPlaying: