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: