Skip to content

Commit

Permalink
allow user to use custom themes
Browse files Browse the repository at this point in the history
  • Loading branch information
doctorguile committed Mar 21, 2014
1 parent 1e2c6c5 commit ba0d79d
Show file tree
Hide file tree
Showing 6 changed files with 203 additions and 133 deletions.
10 changes: 4 additions & 6 deletions ggpo/common/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,14 +248,12 @@ def extractStateChangesResponse(data):
return state, p1, p2, playerinfo, data

def getPlayerColor(self, name):
if name == 'ponder':
if name == self.username or name == 'ponder':
return '#ff0000'
elif name != self.username and name in self.players:
elif name in self.players:
if hasattr(self.players[name], 'id'):
return ColorTheme.getPlayerColor(self.players[name].id)
if Settings.value(Settings.COLORTHEME) == 'darkorange':
return '#ececec'
return '#000000'
return '#808080'

def ggpoPathJoin(self, *args):
if self.fba:
Expand Down Expand Up @@ -461,7 +459,7 @@ def parsePlayerLeftResponse(self, p1):
self.awayfromkb.pop(p1, None)
self.playing.pop(p1, None)
if p1 in self.challengers:
del self.challenged[p1]
del self.challengers[p1]
if p1 == self.challenged:
self.challenged = None
self.sigPlayerStateChange.emit(p1, PlayerStates.QUIT)
Expand Down
27 changes: 21 additions & 6 deletions ggpo/gui/colortheme.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@

# noinspection PyClassHasNoInit
class ColorTheme:
originalStyle = None
originalPalette = None

# http://dmcritchie.mvps.org/excel/colors.htm
LIGHT = {
'status': 'C0C0C0',
'player': ['993300',
'003366',
'333399',
Expand All @@ -35,7 +37,6 @@ class ColorTheme:
}

DARK = {
'status': '808080',
'player': ['FF6600',
'FF9900',
'99CC00',
Expand All @@ -53,20 +54,30 @@ class ColorTheme:
'CCFFCC',
'99CCFF',
'CC99FF',
'FFFFFF',
'ECECEC',
'9999FF',
'FFFFCC',
'CCFFFF',
'FF8080',
'CCCCFF']
}

SAFE = {
'player': ['FF6600', 'CC99FF', '00CCFF', '00FF00',
'9999FF', 'FF8080', 'FF00FF', '33CCCC', '99CC00']
}

SELECTED = LIGHT

@staticmethod
def getPlayerColor(playerid):
return '#' + ColorTheme.SELECTED['player'][playerid % ColorTheme.SELECTED['count']]

@classmethod
def saveDefaultStyle(cls):
cls.originalStyle = QtGui.QApplication.style().objectName()
cls.originalPalette = QtGui.QApplication.palette()

@staticmethod
def setDarkTheme(boolean):
if boolean:
Expand All @@ -82,23 +93,27 @@ def setDarkTheme(boolean):
except:
qss = ''
pass
QtGui.QApplication.setStyle(ColorTheme.originalStyle)
QtGui.QApplication.setPalette(ColorTheme.originalPalette)
QtGui.QApplication.instance().setStyleSheet(qss)

@staticmethod
def setNormalTheme(boolean):
if boolean:
qss = ''
ColorTheme.SELECTED = ColorTheme.LIGHT
QtGui.QApplication.setStyle(ColorTheme.originalStyle)
QtGui.QApplication.setPalette(ColorTheme.originalPalette)
Settings.setValue(Settings.COLORTHEME, '')
QtGui.QApplication.instance().setStyleSheet(qss)
QtGui.QApplication.instance().setStyleSheet('')

@staticmethod
def statusHtml(txt):
if txt:
txt = cgi.escape(txt)
txt = txt.replace("\n", "<br/>")
return '<font color="#' + ColorTheme.SELECTED['status'] + '">' + txt + "</font>"
return '<font color="#808080">' + txt + "</font>"


ColorTheme.LIGHT['count'] = len(ColorTheme.LIGHT['player'])
ColorTheme.DARK['count'] = len(ColorTheme.DARK['player'])
ColorTheme.SAFE['count'] = len(ColorTheme.SAFE['player'])
159 changes: 110 additions & 49 deletions ggpo/gui/ggpowindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import logging
import logging.handlers
import os
import re
import shutil
from colortheme import ColorTheme
from PyQt4 import QtCore, QtGui
Expand All @@ -21,6 +22,11 @@


class GGPOWindow(QtGui.QMainWindow, Ui_MainWindow):

@staticmethod
def buildInStyleToActionName(styleName):
return 'ui{}ThemeAct'.format(re.sub(r'[^a-zA-Z0-9]', '', styleName))

def __init__(self, QWidget_parent=None):
super(GGPOWindow, self).__init__(QWidget_parent)
self.setupUi(self)
Expand All @@ -30,49 +36,13 @@ def __init__(self, QWidget_parent=None):
self.lastSplitterExpandedSizes = []
self.lastStateChangeMsg = ''
self.playChallengeSound = lambda: None

self.addSplitterHandleToggleButton()
self.uiChatInputEdit.returnPressed.connect(self.returnPressed)
self.uiCustomQssFileAct.toggled.connect(self.setCustomQss)
self.uiDarkThemeAct.toggled.connect(ColorTheme.setDarkTheme)
self.uiNormalThemeAct.toggled.connect(ColorTheme.setNormalTheme)
self.uiEmoticonAct.triggered.connect(self.insertEmoticon)
self.setupMenuAction()
self.setupMenuSettings()
self.setupMenuHelp()
self.uiEmoticonTbtn.setDefaultAction(self.uiEmoticonAct)
self.uiEmoticonTbtn.setText(':)')
self.uiLocateGgpofbaAct.triggered.connect(self.locateGGPOFBA)
self.uiLocateUnsupportedSavestatesDirAct.triggered.connect(self.locateUnsupportedSavestatesDirAct)
self.uiSelectUnsupportedSavestateAct.triggered.connect(self.selectUnsupportedSavestate)
self.uiSyncUnsupportedSavestatesAct.triggered.connect(lambda: UnsupportedSavestates.sync(self))
if IS_WINDOWS:
self.uiLocateWineAct.setVisible(False)
else:
self.uiLocateWineAct.triggered.connect(self.locateWine)
if GeoIP2Reader:
self.uiLocateGeommdbAct.triggered.connect(self.locateGeoMMDB)
else:
self.uiLocateGeommdbAct.setVisible(False)
if Settings.value(Settings.DEBUG_LOG):
self.uiDebugLogAct.setChecked(True)
self.uiDebugLogAct.triggered.connect(self.__class__.debuglogTriggered)
self.uiFontAct.triggered.connect(self.changeFont)
self.uiAboutAct.triggered.connect(self.aboutDialog)
self.uiAwayAct.triggered.connect(self.toggleAFK)
self.uiMuteChallengeSoundAct.toggled.connect(self.__class__.toggleSound)
self.uiNotifyPlayerStateChangeAct.toggled.connect(self.__class__.toggleNotifyPlayerStateChange)
self.uiToggleSidebarAction.triggered.connect(self.onToggleSidebarAction)
channelPart, chatHistoryPart, playerViewPart = range(3)
self.uiContractChannelSidebarAct.triggered.connect(self.onSplitterHotkeyResizeAction(channelPart, -1))
self.uiExpandChannelSidebarAct.triggered.connect(self.onSplitterHotkeyResizeAction(channelPart, +1))
self.uiContractPlayerListAct.triggered.connect(self.onSplitterHotkeyResizeAction(playerViewPart, -1))
self.uiExpandPlayerListAct.triggered.connect(self.onSplitterHotkeyResizeAction(playerViewPart, +1))
self.uiSRKForumAct.triggered.connect(
lambda: openURL('http://forums.shoryuken.com/categories/super-street-fighter-ii-turbo'))
self.uiSRKWikiAct.triggered.connect(lambda: openURL('http://wiki.shoryuken.com/Super_Street_Fighter_2_Turbo'))
self.uiJPWikiAct.triggered.connect(lambda: openURL('http://sf2.gamedb.info/wiki/'))
self.uiStrevivalAct.triggered.connect(lambda: openURL('http://www.strevival.com/'))
self.uiHitboxViewerAct.triggered.connect(lambda: openURL('http://www.strevival.com/hitbox/'))
self.uiSafejumpGuideAct.triggered.connect(lambda: openURL('http://www.strevival.com/hitbox/st-safejump/'))
self.uiMatchVideosAct.triggered.connect(lambda: openURL('http://www.strevival.com/yt/'))
self.addSplitterHandleToggleButton()

def aboutDialog(self):
QtGui.QMessageBox.information(self, 'About', copyright.about())
Expand Down Expand Up @@ -281,8 +251,10 @@ def restorePreference(self):
elif theme == 'custom':
fname = Settings.value(Settings.CUSTOM_THEME_FILENAME)
self.setCustomQssfile(fname)
else:
self.uiNormalThemeAct.setChecked(True)
else:
cleanname = self.buildInStyleToActionName(theme)
if hasattr(self, cleanname):
getattr(self, cleanname).setChecked(True)
if Settings.value(Settings.MUTE_CHALLENGE_SOUND):
self.uiMuteChallengeSoundAct.setChecked(True)
if Settings.value(Settings.NOTIFY_PLAYER_STATE_CHANGE):
Expand Down Expand Up @@ -354,14 +326,14 @@ def setController(self, controller):
controller.sigStatusMessage.connect(self.onStatusMessage)
controller.sigServerDisconnected.connect(
lambda: self.onStatusMessage("Disconnected from ggpo.net. Please restart application"))
if Settings.value(Settings.MUTE_CHALLENGE_SOUND):
self.uiMuteChallengeSoundAct.setChecked(True)

def setCustomQss(self, boolean):
if boolean:
fname = QtGui.QFileDialog.getOpenFileName(self, 'Locate Qt Stylesheet qss file', os.path.expanduser("~"),
"qss file (*.qss)")
self.setCustomQssfile(fname)
def setCustomQss(self):
fname = QtGui.QFileDialog.getOpenFileName(self, 'Locate Qt Stylesheet qss file', os.path.expanduser("~"),
"qss file (*.qss)")
if self.setCustomQssfile(fname):
for a in self.uiMenuThemeGroup.actions():
if a.isChecked():
a.setChecked(False)

def setCustomQssfile(self, fname):
if fname and os.path.isfile(fname):
Expand All @@ -370,9 +342,25 @@ def setCustomQssfile(self, fname):
QtGui.QApplication.instance().setStyleSheet(open(fname).read())
Settings.setValue(Settings.COLORTHEME, 'custom')
Settings.setValue(Settings.CUSTOM_THEME_FILENAME, fname)
ColorTheme.SELECTED = ColorTheme.SAFE
return True
except:
pass

def setStyleBuiltin(self, styleName):
if styleName in QtGui.QStyleFactory.keys():
ColorTheme.SELECTED = ColorTheme.LIGHT
QtGui.QApplication.instance().setStyleSheet('')
QtGui.QApplication.setStyle(QtGui.QStyleFactory.create(styleName))
QtGui.QApplication.setPalette(QtGui.QApplication.style().standardPalette())
Settings.setValue(Settings.COLORTHEME, styleName)

def setStyleCallback(self, styleName):
def setStyle(boolean):
if boolean:
self.setStyleBuiltin(styleName)
return setStyle

def setupMediaPlayer(self):
# can't properly install PyQt4.phonon on osx yet
if IS_OSX:
Expand All @@ -396,6 +384,79 @@ def play():
self.playChallengeSound = self.controller.playChallengeSound
pass

def setupMenuAction(self):
self.uiAwayAct.triggered.connect(self.toggleAFK)
self.uiEmoticonAct.triggered.connect(self.insertEmoticon)
self.uiToggleSidebarAction.triggered.connect(self.onToggleSidebarAction)
channelPart, chatHistoryPart, playerViewPart = range(3)
self.uiContractChannelSidebarAct.triggered.connect(self.onSplitterHotkeyResizeAction(channelPart, -1))
self.uiExpandChannelSidebarAct.triggered.connect(self.onSplitterHotkeyResizeAction(channelPart, +1))
self.uiContractPlayerListAct.triggered.connect(self.onSplitterHotkeyResizeAction(playerViewPart, -1))
self.uiExpandPlayerListAct.triggered.connect(self.onSplitterHotkeyResizeAction(playerViewPart, +1))
self.uiSelectUnsupportedSavestateAct.triggered.connect(self.selectUnsupportedSavestate)
self.uiSyncUnsupportedSavestatesAct.triggered.connect(lambda: UnsupportedSavestates.sync(self))

def setupMenuHelp(self):
self.uiSRKForumAct.triggered.connect(
lambda: openURL('http://forums.shoryuken.com/categories/super-street-fighter-ii-turbo'))
self.uiSRKWikiAct.triggered.connect(lambda: openURL('http://wiki.shoryuken.com/Super_Street_Fighter_2_Turbo'))
self.uiJPWikiAct.triggered.connect(lambda: openURL('http://sf2.gamedb.info/wiki/'))
self.uiStrevivalAct.triggered.connect(lambda: openURL('http://www.strevival.com/'))
self.uiHitboxViewerAct.triggered.connect(lambda: openURL('http://www.strevival.com/hitbox/'))
self.uiSafejumpGuideAct.triggered.connect(lambda: openURL('http://www.strevival.com/hitbox/st-safejump/'))
self.uiMatchVideosAct.triggered.connect(lambda: openURL('http://www.strevival.com/yt/'))
self.uiAboutAct.triggered.connect(self.aboutDialog)

def setupMenuSettings(self):
self.uiMuteChallengeSoundAct.toggled.connect(self.__class__.toggleSound)
self.uiFontAct.triggered.connect(self.changeFont)
self.setupMenuTheme()
self.uiLocateGgpofbaAct.triggered.connect(self.locateGGPOFBA)
if IS_WINDOWS:
self.uiLocateWineAct.setVisible(False)
else:
self.uiLocateWineAct.triggered.connect(self.locateWine)
self.uiLocateUnsupportedSavestatesDirAct.triggered.connect(self.locateUnsupportedSavestatesDirAct)
if GeoIP2Reader:
self.uiLocateGeommdbAct.triggered.connect(self.locateGeoMMDB)
else:
self.uiLocateGeommdbAct.setVisible(False)
self.uiNotifyPlayerStateChangeAct.toggled.connect(self.__class__.toggleNotifyPlayerStateChange)
if Settings.value(Settings.DEBUG_LOG):
self.uiDebugLogAct.setChecked(True)
self.uiDebugLogAct.triggered.connect(self.__class__.debuglogTriggered)

def setupMenuTheme(self):
# unfortunately Qt Designer doesn't support QActionGroup, we have to code it up
actionTitleShortcuts = set()
def actionTitle(title):
shortcutFound = False
ret = ''
for c in title:
l = c.lower()
if not shortcutFound and l in 'abcdefghijklmnopqrstuvwxy' and l not in actionTitleShortcuts:
ret += '&'
actionTitleShortcuts.add(l)
shortcutFound = True
ret += c
return ret
self.uiMenuThemeGroup = QtGui.QActionGroup(self.uiMenuTheme, exclusive=True)
self.uiDarkThemeAct = QtGui.QAction(actionTitle("Dark Orange"), self)
self.uiDarkThemeAct.setCheckable(True)
self.uiDarkThemeAct.toggled.connect(ColorTheme.setDarkTheme)
self.uiMenuTheme.addAction(self.uiMenuThemeGroup.addAction(self.uiDarkThemeAct))
for k in QtGui.QStyleFactory.keys():
act = QtGui.QAction(actionTitle(k), self)
act.setCheckable(True)
self.uiMenuTheme.addAction(self.uiMenuThemeGroup.addAction(act))
cleanname = self.buildInStyleToActionName(k)
setattr(self, cleanname, act)
if hasattr(self, cleanname):
getattr(self, cleanname).toggled.connect(self.setStyleCallback(k))
self.uiCustomQssFileAct = QtGui.QAction(actionTitle("Custom Qss stylesheet"), self)
self.uiCustomQssFileAct.triggered.connect(self.setCustomQss)
self.uiMenuTheme.addAction(self.uiCustomQssFileAct)

def setupUserTable(self):
model = PlayerModel(self.controller)
self.uiPlayersTableV.setModel(model)
Expand Down
14 changes: 5 additions & 9 deletions ggpo/gui/ui/ggpowindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -115,20 +115,16 @@
</widget>
<widget class="QMenu" name="menuSetting">
<property name="title">
<string>S&amp;etting</string>
<string>S&amp;ettings</string>
</property>
<widget class="QMenu" name="menuTheme">
<widget class="QMenu" name="uiMenuTheme">
<property name="title">
<string>Theme</string>
<string>&amp;Theme</string>
</property>
<addaction name="uiNormalThemeAct"/>
<addaction name="uiDarkThemeAct"/>
<addaction name="separator"/>
<addaction name="uiCustomQssFileAct"/>
</widget>
<addaction name="uiMuteChallengeSoundAct"/>
<addaction name="uiFontAct"/>
<addaction name="menuTheme"/>
<addaction name="uiMenuTheme"/>
<addaction name="separator"/>
<addaction name="uiLocateGgpofbaAct"/>
<addaction name="uiLocateWineAct"/>
Expand Down Expand Up @@ -246,7 +242,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Dark Theme</string>
<string>&amp;Dark Orange</string>
</property>
</action>
<action name="uiDebugLogAct">
Expand Down
Loading

0 comments on commit ba0d79d

Please sign in to comment.