From 2ae6763f5ba7f698bd12eda06ecc957c0637535c Mon Sep 17 00:00:00 2001 From: Stephen Dranger Date: Wed, 2 Feb 2011 18:32:35 -0600 Subject: [PATCH] different files, started userlist --- TODO | 3 +- generic.py | 9 ++ generic.pyc | Bin 0 -> 780 bytes pesterchum.py | 310 +------------------------------------- pestermenus.py | 316 +++++++++++++++++++++++++++++++++++++++ pestermenus.pyc | Bin 0 -> 12551 bytes themes/trollian/style.js | 4 +- 7 files changed, 336 insertions(+), 306 deletions(-) create mode 100644 generic.py create mode 100644 generic.pyc create mode 100644 pestermenus.py create mode 100644 pestermenus.pyc diff --git a/TODO b/TODO index cc2d9c4..f3ac15b 100644 --- a/TODO +++ b/TODO @@ -9,13 +9,14 @@ Features: * help menu -- about and forum * new sound on CEASE and BEGIN? -- release alpha +* Chat rooms/browser * shared buddy lists - changes to the buddy list should refresh it? multiple clients share buddy list??? * System tray menu +* tab right-click menu on tabbed convos * comment history (up button) * page up/down scrolling * ctrl-tab should prefer new convos -* Chat rooms/browser * More complex quirks: random, spelling, by-sound * Implement TC options * spell check? diff --git a/generic.py b/generic.py new file mode 100644 index 0000000..e2e0e0b --- /dev/null +++ b/generic.py @@ -0,0 +1,9 @@ +from PyQt4 import QtGui +class RightClickList(QtGui.QListWidget): + def contextMenuEvent(self, event): + #fuckin Qt + if event.reason() == QtGui.QContextMenuEvent.Mouse: + listing = self.itemAt(event.pos()) + self.setCurrentItem(listing) + self.optionsMenu.popup(event.globalPos()) + diff --git a/generic.pyc b/generic.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de25e623a3448e0e951e1561f4786f7fc9cb51aa GIT binary patch literal 780 zcmb7C!EV$r5FKZ?+ig)%IdI?)a)DepaHtTlLZ}j3b<+dtUZN#&vt|=JiYJ9i%c=Yz zzruklyqT@2#I08RJob#|y&31{ucO0Pzfb2S-HkEUH<X1oM!p+o6e1-TJ@Nhq9<*+Rrv-Fu?$*3kEaQ%x2qU@4vSbsE@r{A{l;_ahxgakvlcoJL$n(2*tTz( zMQ|6Q)(+2X=zGMT!pV=|3LU%Pqa@M$UFe3658$br@OjmohnPwV9s{Cnt~AOj-#(5S zG|~Awg-HrgFk6S#W>vrPwe7R7q2FYkjcogJJ+xVEz3pB3qPyW^1egESA#`yHpyZi( zYL3iKfSeSCU$wR&I&$f?JZlt~n6p&M)l$!I7W{J8b?Mha e{+ds&sx9lKdqTAy#L817JlPfTS`;YzvH1%TIHzI& literal 0 HcmV?d00001 diff --git a/pesterchum.py b/pesterchum.py index 4b02a6a..0ed01bd 100644 --- a/pesterchum.py +++ b/pesterchum.py @@ -13,6 +13,10 @@ import re from PyQt4 import QtGui, QtCore import pygame +from pestermenus import PesterChooseQuirks, PesterChooseTheme, \ + PesterChooseProfile, PesterOptions, PesterUserlist +from generic import RightClickList + logging.basicConfig(level=logging.INFO) class Mood(object): @@ -481,293 +485,6 @@ class MultiTextDialog(QtGui.QDialog): return retval else: return None -class PesterQuirkItem(QtGui.QListWidgetItem): - def __init__(self, quirk, parent): - QtGui.QListWidgetItem.__init__(self, parent) - self.quirk = quirk - self.setText(unicode(quirk)) - - def __lt__(self, quirkitem): - if self.quirk.type == "prefix": - return True - elif (self.quirk.type == "replace" or self.quirk.type == "regexp") and \ - quirkitem.type == "suffix": - return True - else: - return False - -class PesterQuirkList(QtGui.QListWidget): - def __init__(self, mainwindow, parent): - QtGui.QListWidget.__init__(self, parent) - self.resize(400, 200) - self.mainwindow = mainwindow - self.setStyleSheet("background:black; color:white;") - - for q in mainwindow.userprofile.quirks: - item = PesterQuirkItem(q, self) - self.addItem(item) - self.sortItems() - - @QtCore.pyqtSlot() - def removeCurrent(self): - i = self.currentRow() - if i >= 0: - self.takeItem(i) - -class PesterChooseQuirks(QtGui.QDialog): - def __init__(self, config, theme, parent): - QtGui.QDialog.__init__(self, parent) - self.setModal(False) - self.config = config - self.theme = theme - self.mainwindow = parent - self.setStyleSheet(self.theme["main/defaultwindow/style"]) - self.setWindowTitle("Set Quirks") - - self.quirkList = PesterQuirkList(self.mainwindow, self) - - self.addPrefixButton = QtGui.QPushButton("ADD PREFIX", self) - self.connect(self.addPrefixButton, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('addPrefixDialog()')) - self.addSuffixButton = QtGui.QPushButton("ADD SUFFIX", self) - self.connect(self.addSuffixButton, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('addSuffixDialog()')) - self.addSimpleReplaceButton = QtGui.QPushButton("SIMPLE REPLACE", self) - self.connect(self.addSimpleReplaceButton, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('addSimpleReplaceDialog()')) - self.addRegexpReplaceButton = QtGui.QPushButton("REGEXP REPLACE", self) - self.connect(self.addRegexpReplaceButton, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('addRegexpDialog()')) - layout_1 = QtGui.QHBoxLayout() - layout_1.addWidget(self.addPrefixButton) - layout_1.addWidget(self.addSuffixButton) - layout_1.addWidget(self.addSimpleReplaceButton) - layout_1.addWidget(self.addRegexpReplaceButton) - - self.removeSelectedButton = QtGui.QPushButton("REMOVE", self) - self.connect(self.removeSelectedButton, QtCore.SIGNAL('clicked()'), - self.quirkList, QtCore.SLOT('removeCurrent()')) - - self.ok = QtGui.QPushButton("OK", self) - self.ok.setDefault(True) - self.connect(self.ok, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('accept()')) - self.cancel = QtGui.QPushButton("CANCEL", self) - self.connect(self.cancel, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('reject()')) - layout_ok = QtGui.QHBoxLayout() - layout_ok.addWidget(self.cancel) - layout_ok.addWidget(self.ok) - - layout_0 = QtGui.QVBoxLayout() - layout_0.addWidget(self.quirkList) - layout_0.addLayout(layout_1) - layout_0.addWidget(self.removeSelectedButton) - layout_0.addLayout(layout_ok) - self.setLayout(layout_0) - - def quirks(self): - return [self.quirkList.item(i).quirk for i in - range(0,self.quirkList.count())] - - - @QtCore.pyqtSlot() - def addPrefixDialog(self): - pdict = MultiTextDialog("ENTER PREFIX", self, {"label": "Value:", "inputname": "value"}).getText() - pdict["type"] = "prefix" - prefix = pesterQuirk(pdict) - pitem = PesterQuirkItem(prefix, self.quirkList) - self.quirkList.addItem(pitem) - self.quirkList.sortItems() - @QtCore.pyqtSlot() - def addSuffixDialog(self): - vdict = MultiTextDialog("ENTER SUFFIX", self, {"label": "Value:", "inputname": "value"}).getText() - vdict["type"] = "suffix" - quirk = pesterQuirk(vdict) - item = PesterQuirkItem(quirk, self.quirkList) - self.quirkList.addItem(item) - self.quirkList.sortItems() - @QtCore.pyqtSlot() - def addSimpleReplaceDialog(self): - vdict = MultiTextDialog("REPLACE", self, {"label": "Replace:", "inputname": "from"}, {"label": "With:", "inputname": "to"}).getText() - vdict["type"] = "replace" - quirk = pesterQuirk(vdict) - item = PesterQuirkItem(quirk, self.quirkList) - self.quirkList.addItem(item) - self.quirkList.sortItems() - @QtCore.pyqtSlot() - def addRegexpDialog(self): - vdict = MultiTextDialog("REGEXP REPLACE", self, {"label": "Regexp:", "inputname": "from"}, {"label": "Replace With:", "inputname": "to"}).getText() - vdict["type"] = "regexp" - quirk = pesterQuirk(vdict) - item = PesterQuirkItem(quirk, self.quirkList) - self.quirkList.addItem(item) - self.quirkList.sortItems() - -class PesterChooseTheme(QtGui.QDialog): - def __init__(self, config, theme, parent): - QtGui.QDialog.__init__(self, parent) - self.config = config - self.theme = theme - self.parent = parent - self.setStyleSheet(self.theme["main/defaultwindow/style"]) - self.setWindowTitle("Pick a theme") - - instructions = QtGui.QLabel("Pick a theme:") - - avail_themes = config.availableThemes() - self.themeBox = QtGui.QComboBox(self) - for (i, t) in enumerate(avail_themes): - self.themeBox.addItem(t) - if t == theme.name: - self.themeBox.setCurrentIndex(i) - - self.ok = QtGui.QPushButton("OK", self) - self.ok.setDefault(True) - self.connect(self.ok, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('accept()')) - self.cancel = QtGui.QPushButton("CANCEL", self) - self.connect(self.cancel, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('reject()')) - layout_ok = QtGui.QHBoxLayout() - layout_ok.addWidget(self.cancel) - layout_ok.addWidget(self.ok) - - layout_0 = QtGui.QVBoxLayout() - layout_0.addWidget(instructions) - layout_0.addWidget(self.themeBox) - layout_0.addLayout(layout_ok) - - self.setLayout(layout_0) - - self.connect(self, QtCore.SIGNAL('accepted()'), - parent, QtCore.SLOT('themeSelected()')) - self.connect(self, QtCore.SIGNAL('rejected()'), - parent, QtCore.SLOT('closeTheme()')) - -class PesterChooseProfile(QtGui.QDialog): - def __init__(self, userprofile, config, theme, parent, collision=None): - QtGui.QDialog.__init__(self, parent) - self.userprofile = userprofile - self.theme = theme - self.config = config - self.parent = parent - self.setStyleSheet(self.theme["main/defaultwindow/style"]) - - self.chumHandle = QtGui.QLineEdit(self) - self.chumHandle.setMinimumWidth(200) - self.chumHandleLabel = QtGui.QLabel(self.theme["main/mychumhandle/label/text"], self) - self.chumColorButton = QtGui.QPushButton(self) - self.chumColorButton.resize(50, 20) - self.chumColorButton.setStyleSheet("background: %s" % (userprofile.chat.colorhtml())) - self.chumcolor = userprofile.chat.color - self.connect(self.chumColorButton, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('openColorDialog()')) - layout_1 = QtGui.QHBoxLayout() - layout_1.addWidget(self.chumHandleLabel) - layout_1.addWidget(self.chumHandle) - layout_1.addWidget(self.chumColorButton) - - # available profiles? - avail_profiles = self.config.availableProfiles() - if avail_profiles: - self.profileBox = QtGui.QComboBox(self) - self.profileBox.addItem("Choose a profile...") - for p in avail_profiles: - self.profileBox.addItem(p.chat.handle) - else: - self.profileBox = None - - self.defaultcheck = QtGui.QCheckBox(self) - self.defaultlabel = QtGui.QLabel("Set This Profile As Default", self) - layout_2 = QtGui.QHBoxLayout() - layout_2.addWidget(self.defaultlabel) - layout_2.addWidget(self.defaultcheck) - - self.ok = QtGui.QPushButton("OK", self) - self.ok.setDefault(True) - self.connect(self.ok, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('validateProfile()')) - self.cancel = QtGui.QPushButton("CANCEL", self) - self.connect(self.cancel, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('reject()')) - layout_ok = QtGui.QHBoxLayout() - layout_ok.addWidget(self.cancel) - layout_ok.addWidget(self.ok) - - layout_0 = QtGui.QVBoxLayout() - if collision: - collision_warning = QtGui.QLabel("%s is taken already! Pick a new profile." % (collision)) - layout_0.addWidget(collision_warning) - layout_0.addLayout(layout_1) - if avail_profiles: - profileLabel = QtGui.QLabel("Or choose an existing profile:", self) - layout_0.addWidget(profileLabel) - layout_0.addWidget(self.profileBox) - layout_0.addLayout(layout_ok) - layout_0.addLayout(layout_2) - self.errorMsg = QtGui.QLabel(self) - self.errorMsg.setStyleSheet("color:red;") - layout_0.addWidget(self.errorMsg) - self.setLayout(layout_0) - - self.connect(self, QtCore.SIGNAL('accepted()'), - parent, QtCore.SLOT('profileSelected()')) - self.connect(self, QtCore.SIGNAL('rejected()'), - parent, QtCore.SLOT('closeProfile()')) - - @QtCore.pyqtSlot() - def openColorDialog(self): - self.colorDialog = QtGui.QColorDialog(self) - color = self.colorDialog.getColor(initial=self.userprofile.chat.color) - self.chumColorButton.setStyleSheet("background: %s" % color.name()) - self.chumcolor = color - self.colorDialog = None - - @QtCore.pyqtSlot() - def validateProfile(self): - if not self.profileBox or self.profileBox.currentIndex() == 0: - handle = unicode(self.chumHandle.text()) - if not PesterProfile.checkLength(handle): - self.errorMsg.setText("PROFILE HANDLE IS TOO LONG") - return - if not PesterProfile.checkValid(handle): - self.errorMsg.setText("NOT A VALID CHUMTAG") - return - self.accept() - -class PesterOptions(QtGui.QDialog): - def __init__(self, config, theme, parent): - QtGui.QDialog.__init__(self, parent) - self.setModal(False) - self.config = config - self.theme = theme - self.setStyleSheet(self.theme["main/defaultwindow/style"]) - - self.tabcheck = QtGui.QCheckBox(self) - if self.config.tabs(): - self.tabcheck.setChecked(True) - self.tablabel = QtGui.QLabel("Tabbed Conversations", self) - layout_1 = QtGui.QHBoxLayout() - layout_1.addWidget(self.tablabel) - layout_1.addWidget(self.tabcheck) - - self.ok = QtGui.QPushButton("OK", self) - self.ok.setDefault(True) - self.connect(self.ok, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('accept()')) - self.cancel = QtGui.QPushButton("CANCEL", self) - self.connect(self.cancel, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('reject()')) - layout_2 = QtGui.QHBoxLayout() - layout_2.addWidget(self.cancel) - layout_2.addWidget(self.ok) - - layout_0 = QtGui.QVBoxLayout() - layout_0.addLayout(layout_1) - layout_0.addLayout(layout_2) - - self.setLayout(layout_0) class WMButton(QtGui.QPushButton): def __init__(self, icon, parent=None): @@ -802,7 +519,7 @@ class chumListing(QtGui.QListWidgetItem): h2 = cl.handle.lower() return (h1 < h2) -class chumArea(QtGui.QListWidget): +class chumArea(RightClickList): def __init__(self, chums, parent=None): QtGui.QListWidget.__init__(self, parent) self.mainwindow = parent @@ -861,12 +578,6 @@ class chumArea(QtGui.QListWidget): chumlistings = [self.item(i) for i in range(0, self.count())] for c in chumlistings: c.changeTheme(theme) - def contextMenuEvent(self, event): - #fuckin Qt - if event.reason() == QtGui.QContextMenuEvent.Mouse: - chumlisting = self.itemAt(event.pos()) - self.setCurrentItem(chumlisting) - self.optionsMenu.popup(event.globalPos()) @QtCore.pyqtSlot() def activateChum(self): self.itemActivated.emit(self.currentItem()) @@ -906,11 +617,11 @@ class trollSlum(chumArea): chumLabel = chumListing(c, self.mainwindow) self.addItem(chumLabel) - self.blockedMenu = QtGui.QMenu(self) + self.optionsMenu = QtGui.QMenu(self) self.unblockchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/unblockchum"], self) self.connect(self.unblockchum, QtCore.SIGNAL('triggered()'), self, QtCore.SIGNAL('unblockChumSignal()')) - self.blockedMenu.addAction(self.unblockchum) + self.optionsMenu.addAction(self.unblockchum) self.sortItems() def changeTheme(self, theme): @@ -922,13 +633,6 @@ class trollSlum(chumArea): for c in chumlistings: c.changeTheme(theme) - def contextMenuEvent(self, event): - #fuckin Qt - if event.reason() == QtGui.QContextMenuEvent.Mouse: - chumlisting = self.itemAt(event.pos()) - self.setCurrentItem(chumlisting) - self.blockedMenu.popup(event.globalPos()) - unblockChumSignal = QtCore.pyqtSignal(QtCore.QString) class TrollSlumWindow(QtGui.QFrame): diff --git a/pestermenus.py b/pestermenus.py new file mode 100644 index 0000000..989d113 --- /dev/null +++ b/pestermenus.py @@ -0,0 +1,316 @@ +from PyQt4 import QtGui, QtCore + +from generic import RightClickList + +class PesterQuirkItem(QtGui.QListWidgetItem): + def __init__(self, quirk, parent): + QtGui.QListWidgetItem.__init__(self, parent) + self.quirk = quirk + self.setText(unicode(quirk)) + + def __lt__(self, quirkitem): + if self.quirk.type == "prefix": + return True + elif (self.quirk.type == "replace" or self.quirk.type == "regexp") and \ + quirkitem.type == "suffix": + return True + else: + return False + +class PesterQuirkList(QtGui.QListWidget): + def __init__(self, mainwindow, parent): + QtGui.QListWidget.__init__(self, parent) + self.resize(400, 200) + self.mainwindow = mainwindow + self.setStyleSheet("background:black; color:white;") + + for q in mainwindow.userprofile.quirks: + item = PesterQuirkItem(q, self) + self.addItem(item) + self.sortItems() + + @QtCore.pyqtSlot() + def removeCurrent(self): + i = self.currentRow() + if i >= 0: + self.takeItem(i) + +class PesterChooseQuirks(QtGui.QDialog): + def __init__(self, config, theme, parent): + QtGui.QDialog.__init__(self, parent) + self.setModal(False) + self.config = config + self.theme = theme + self.mainwindow = parent + self.setStyleSheet(self.theme["main/defaultwindow/style"]) + self.setWindowTitle("Set Quirks") + + self.quirkList = PesterQuirkList(self.mainwindow, self) + + self.addPrefixButton = QtGui.QPushButton("ADD PREFIX", self) + self.connect(self.addPrefixButton, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('addPrefixDialog()')) + self.addSuffixButton = QtGui.QPushButton("ADD SUFFIX", self) + self.connect(self.addSuffixButton, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('addSuffixDialog()')) + self.addSimpleReplaceButton = QtGui.QPushButton("SIMPLE REPLACE", self) + self.connect(self.addSimpleReplaceButton, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('addSimpleReplaceDialog()')) + self.addRegexpReplaceButton = QtGui.QPushButton("REGEXP REPLACE", self) + self.connect(self.addRegexpReplaceButton, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('addRegexpDialog()')) + layout_1 = QtGui.QHBoxLayout() + layout_1.addWidget(self.addPrefixButton) + layout_1.addWidget(self.addSuffixButton) + layout_1.addWidget(self.addSimpleReplaceButton) + layout_1.addWidget(self.addRegexpReplaceButton) + + self.removeSelectedButton = QtGui.QPushButton("REMOVE", self) + self.connect(self.removeSelectedButton, QtCore.SIGNAL('clicked()'), + self.quirkList, QtCore.SLOT('removeCurrent()')) + + self.ok = QtGui.QPushButton("OK", self) + self.ok.setDefault(True) + self.connect(self.ok, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('accept()')) + self.cancel = QtGui.QPushButton("CANCEL", self) + self.connect(self.cancel, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('reject()')) + layout_ok = QtGui.QHBoxLayout() + layout_ok.addWidget(self.cancel) + layout_ok.addWidget(self.ok) + + layout_0 = QtGui.QVBoxLayout() + layout_0.addWidget(self.quirkList) + layout_0.addLayout(layout_1) + layout_0.addWidget(self.removeSelectedButton) + layout_0.addLayout(layout_ok) + self.setLayout(layout_0) + + def quirks(self): + return [self.quirkList.item(i).quirk for i in + range(0,self.quirkList.count())] + + + @QtCore.pyqtSlot() + def addPrefixDialog(self): + pdict = MultiTextDialog("ENTER PREFIX", self, {"label": "Value:", "inputname": "value"}).getText() + pdict["type"] = "prefix" + prefix = pesterQuirk(pdict) + pitem = PesterQuirkItem(prefix, self.quirkList) + self.quirkList.addItem(pitem) + self.quirkList.sortItems() + @QtCore.pyqtSlot() + def addSuffixDialog(self): + vdict = MultiTextDialog("ENTER SUFFIX", self, {"label": "Value:", "inputname": "value"}).getText() + vdict["type"] = "suffix" + quirk = pesterQuirk(vdict) + item = PesterQuirkItem(quirk, self.quirkList) + self.quirkList.addItem(item) + self.quirkList.sortItems() + @QtCore.pyqtSlot() + def addSimpleReplaceDialog(self): + vdict = MultiTextDialog("REPLACE", self, {"label": "Replace:", "inputname": "from"}, {"label": "With:", "inputname": "to"}).getText() + vdict["type"] = "replace" + quirk = pesterQuirk(vdict) + item = PesterQuirkItem(quirk, self.quirkList) + self.quirkList.addItem(item) + self.quirkList.sortItems() + @QtCore.pyqtSlot() + def addRegexpDialog(self): + vdict = MultiTextDialog("REGEXP REPLACE", self, {"label": "Regexp:", "inputname": "from"}, {"label": "Replace With:", "inputname": "to"}).getText() + vdict["type"] = "regexp" + quirk = pesterQuirk(vdict) + item = PesterQuirkItem(quirk, self.quirkList) + self.quirkList.addItem(item) + self.quirkList.sortItems() + +class PesterChooseTheme(QtGui.QDialog): + def __init__(self, config, theme, parent): + QtGui.QDialog.__init__(self, parent) + self.config = config + self.theme = theme + self.parent = parent + self.setStyleSheet(self.theme["main/defaultwindow/style"]) + self.setWindowTitle("Pick a theme") + + instructions = QtGui.QLabel("Pick a theme:") + + avail_themes = config.availableThemes() + self.themeBox = QtGui.QComboBox(self) + for (i, t) in enumerate(avail_themes): + self.themeBox.addItem(t) + if t == theme.name: + self.themeBox.setCurrentIndex(i) + + self.ok = QtGui.QPushButton("OK", self) + self.ok.setDefault(True) + self.connect(self.ok, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('accept()')) + self.cancel = QtGui.QPushButton("CANCEL", self) + self.connect(self.cancel, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('reject()')) + layout_ok = QtGui.QHBoxLayout() + layout_ok.addWidget(self.cancel) + layout_ok.addWidget(self.ok) + + layout_0 = QtGui.QVBoxLayout() + layout_0.addWidget(instructions) + layout_0.addWidget(self.themeBox) + layout_0.addLayout(layout_ok) + + self.setLayout(layout_0) + + self.connect(self, QtCore.SIGNAL('accepted()'), + parent, QtCore.SLOT('themeSelected()')) + self.connect(self, QtCore.SIGNAL('rejected()'), + parent, QtCore.SLOT('closeTheme()')) + +class PesterChooseProfile(QtGui.QDialog): + def __init__(self, userprofile, config, theme, parent, collision=None): + QtGui.QDialog.__init__(self, parent) + self.userprofile = userprofile + self.theme = theme + self.config = config + self.parent = parent + self.setStyleSheet(self.theme["main/defaultwindow/style"]) + + self.chumHandle = QtGui.QLineEdit(self) + self.chumHandle.setMinimumWidth(200) + self.chumHandleLabel = QtGui.QLabel(self.theme["main/mychumhandle/label/text"], self) + self.chumColorButton = QtGui.QPushButton(self) + self.chumColorButton.resize(50, 20) + self.chumColorButton.setStyleSheet("background: %s" % (userprofile.chat.colorhtml())) + self.chumcolor = userprofile.chat.color + self.connect(self.chumColorButton, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('openColorDialog()')) + layout_1 = QtGui.QHBoxLayout() + layout_1.addWidget(self.chumHandleLabel) + layout_1.addWidget(self.chumHandle) + layout_1.addWidget(self.chumColorButton) + + # available profiles? + avail_profiles = self.config.availableProfiles() + if avail_profiles: + self.profileBox = QtGui.QComboBox(self) + self.profileBox.addItem("Choose a profile...") + for p in avail_profiles: + self.profileBox.addItem(p.chat.handle) + else: + self.profileBox = None + + self.defaultcheck = QtGui.QCheckBox(self) + self.defaultlabel = QtGui.QLabel("Set This Profile As Default", self) + layout_2 = QtGui.QHBoxLayout() + layout_2.addWidget(self.defaultlabel) + layout_2.addWidget(self.defaultcheck) + + self.ok = QtGui.QPushButton("OK", self) + self.ok.setDefault(True) + self.connect(self.ok, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('validateProfile()')) + self.cancel = QtGui.QPushButton("CANCEL", self) + self.connect(self.cancel, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('reject()')) + layout_ok = QtGui.QHBoxLayout() + layout_ok.addWidget(self.cancel) + layout_ok.addWidget(self.ok) + + layout_0 = QtGui.QVBoxLayout() + if collision: + collision_warning = QtGui.QLabel("%s is taken already! Pick a new profile." % (collision)) + layout_0.addWidget(collision_warning) + layout_0.addLayout(layout_1) + if avail_profiles: + profileLabel = QtGui.QLabel("Or choose an existing profile:", self) + layout_0.addWidget(profileLabel) + layout_0.addWidget(self.profileBox) + layout_0.addLayout(layout_ok) + layout_0.addLayout(layout_2) + self.errorMsg = QtGui.QLabel(self) + self.errorMsg.setStyleSheet("color:red;") + layout_0.addWidget(self.errorMsg) + self.setLayout(layout_0) + + self.connect(self, QtCore.SIGNAL('accepted()'), + parent, QtCore.SLOT('profileSelected()')) + self.connect(self, QtCore.SIGNAL('rejected()'), + parent, QtCore.SLOT('closeProfile()')) + + @QtCore.pyqtSlot() + def openColorDialog(self): + self.colorDialog = QtGui.QColorDialog(self) + color = self.colorDialog.getColor(initial=self.userprofile.chat.color) + self.chumColorButton.setStyleSheet("background: %s" % color.name()) + self.chumcolor = color + self.colorDialog = None + + @QtCore.pyqtSlot() + def validateProfile(self): + if not self.profileBox or self.profileBox.currentIndex() == 0: + handle = unicode(self.chumHandle.text()) + if not PesterProfile.checkLength(handle): + self.errorMsg.setText("PROFILE HANDLE IS TOO LONG") + return + if not PesterProfile.checkValid(handle): + self.errorMsg.setText("NOT A VALID CHUMTAG") + return + self.accept() + +class PesterOptions(QtGui.QDialog): + def __init__(self, config, theme, parent): + QtGui.QDialog.__init__(self, parent) + self.setModal(False) + self.config = config + self.theme = theme + self.setStyleSheet(self.theme["main/defaultwindow/style"]) + + self.tabcheck = QtGui.QCheckBox(self) + if self.config.tabs(): + self.tabcheck.setChecked(True) + self.tablabel = QtGui.QLabel("Tabbed Conversations", self) + layout_1 = QtGui.QHBoxLayout() + layout_1.addWidget(self.tablabel) + layout_1.addWidget(self.tabcheck) + + self.ok = QtGui.QPushButton("OK", self) + self.ok.setDefault(True) + self.connect(self.ok, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('accept()')) + self.cancel = QtGui.QPushButton("CANCEL", self) + self.connect(self.cancel, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('reject()')) + layout_2 = QtGui.QHBoxLayout() + layout_2.addWidget(self.cancel) + layout_2.addWidget(self.ok) + + layout_0 = QtGui.QVBoxLayout() + layout_0.addLayout(layout_1) + layout_0.addLayout(layout_2) + + self.setLayout(layout_0) + +class PesterUserlist(QtGui.QDialog): + def __init__(self, config, theme, parent): + QtGui.QDialog.__init__(self, parent) + self.setModal(False) + self.config = config + self.theme = theme + self.setStyleSheet(self.theme["main/defaultwindow/style"]) + self.resize([200, 600]) + + self.label = QtGui.QLabel("USERLIST") + self.userarea = RightClickList(self) + self.userarea.setStyleSheet(self.theme["main/chums/style"]) + + self.ok = QtGui.QPushButton("OK", self) + self.ok.setDefault(True) + self.connect(self.ok, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('accept()')) + + layout_0 = QVBoxLayout() + layout.addWidget(self.label) + layout.addWidget(self.userarea) + layout.addWidget(self.ok) + + self.setLayout(layout) diff --git a/pestermenus.pyc b/pestermenus.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7364c6decfbe344ae94abbd3bfb2541c7a641c6 GIT binary patch literal 12551 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 X2|HDqD9s$7nVNYpb7|(wne+b-evn7h literal 0 HcmV?d00001 diff --git a/themes/trollian/style.js b/themes/trollian/style.js index c14994b..fac09e0 100644 --- a/themes/trollian/style.js +++ b/themes/trollian/style.js @@ -30,7 +30,7 @@ "switch": "Trolltag", "theme": "Theme", "color": "Hemospectrum", - "block": "Trollslum", + "block": "Chumpdump", "quirks": "Annoying"}, "rclickchumlist": {"pester": "Troll", "removechum": "Trash", @@ -91,7 +91,7 @@ "trollslum": { "style": "background: rgb(190, 19, 4); font-family: 'Arial'", "size": [175, 461], - "label": { "text": "TROLLSLUM", + "label": { "text": "Chumpdump", "style": "color: rgba(0, 0, 0, 100%) ;font:bold; font-family: 'Arial';border: 0px;" }, "chumroll": {"style": "border: 0px; background-color: white; padding: 5px; font-family: 'Arial';selection-background-color:rgb(200,200,200); " } },