Re-add original Chum groups

Conflicts:

	TODO
	pesterchum.py
This commit is contained in:
Kiooeht 2011-04-14 00:04:33 -07:00
parent 1b6a4ba58c
commit d43312a639
11 changed files with 740 additions and 392 deletions

View file

@ -187,7 +187,7 @@ class pesterQuirks(object):
yield q yield q
class PesterProfile(object): class PesterProfile(object):
def __init__(self, handle, color=None, mood=Mood("offline"), chumdb=None): def __init__(self, handle, color=None, mood=Mood("offline"), group=None, chumdb=None):
self.handle = handle self.handle = handle
if color is None: if color is None:
if chumdb: if chumdb:
@ -196,6 +196,12 @@ class PesterProfile(object):
color = QtGui.QColor("black") color = QtGui.QColor("black")
self.color = color self.color = color
self.mood = mood self.mood = mood
if group is None:
if chumdb:
group = chumdb.getGroup(handle, "Chums")
else:
group = "Chums"
self.group = group
def initials(self, time=None): def initials(self, time=None):
handle = self.handle handle = self.handle
caps = [l for l in handle if l.isupper()] caps = [l for l in handle if l.isupper()]
@ -225,7 +231,8 @@ class PesterProfile(object):
def plaindict(self): def plaindict(self):
return (self.handle, {"handle": self.handle, return (self.handle, {"handle": self.handle,
"mood": self.mood.name(), "mood": self.mood.name(),
"color": unicode(self.color.name())}) "color": unicode(self.color.name()),
"group": unicode(self.group)})
def blocked(self, config): def blocked(self, config):
return self.handle in config.getBlocklist() return self.handle in config.getBlocklist()

View file

@ -39,6 +39,13 @@ class RightClickList(QtGui.QListWidget):
def getOptionsMenu(self): def getOptionsMenu(self):
return self.optionsMenu return self.optionsMenu
class RightClickTree(QtGui.QTreeWidget):
def contextMenuEvent(self, event):
if event.reason() == QtGui.QContextMenuEvent.Mouse:
listing = self.itemAt(event.pos())
self.setCurrentItem(listing)
self.optionsMenu.popup(event.globalPos())
class MultiTextDialog(QtGui.QDialog): class MultiTextDialog(QtGui.QDialog):
def __init__(self, title, parent, *queries): def __init__(self, title, parent, *queries):
QtGui.QDialog.__init__(self, parent) QtGui.QDialog.__init__(self, parent)

View file

@ -3,7 +3,7 @@ import codecs
import re import re
from time import strftime, strptime from time import strftime, strptime
from PyQt4 import QtGui, QtCore from PyQt4 import QtGui, QtCore
from generic import RightClickList from generic import RightClickList, RightClickTree
from parsetools import convertTags from parsetools import convertTags
from convo import PesterText from convo import PesterText
@ -138,7 +138,8 @@ class PesterLogViewer(QtGui.QDialog):
self.logList.sort() self.logList.sort()
self.logList.reverse() self.logList.reverse()
self.tree = QtGui.QTreeWidget() self.tree = RightClickTree()
self.tree.optionsMenu = QtGui.QMenu(self)
self.tree.setFixedSize(260, 300) self.tree.setFixedSize(260, 300)
self.tree.header().hide() self.tree.header().hide()
if theme.has_key("convo/scrollbar"): if theme.has_key("convo/scrollbar"):
@ -148,6 +149,7 @@ class PesterLogViewer(QtGui.QDialog):
self.connect(self.tree, QtCore.SIGNAL('itemSelectionChanged()'), self.connect(self.tree, QtCore.SIGNAL('itemSelectionChanged()'),
self, QtCore.SLOT('loadSelectedLog()')) self, QtCore.SLOT('loadSelectedLog()'))
self.tree.setSortingEnabled(False) self.tree.setSortingEnabled(False)
child_1 = None child_1 = None
last = ["",""] last = ["",""]
for (i,l) in enumerate(self.logList): for (i,l) in enumerate(self.logList):

View file

@ -546,6 +546,10 @@ class PesterOptions(QtGui.QDialog):
self.theme = theme self.theme = theme
self.setStyleSheet(self.theme["main/defaultwindow/style"]) self.setStyleSheet(self.theme["main/defaultwindow/style"])
hr = QtGui.QFrame()
hr.setFrameShape(QtGui.QFrame.HLine)
hr.setFrameShadow(QtGui.QFrame.Sunken)
self.tabcheck = QtGui.QCheckBox("Tabbed Conversations", self) self.tabcheck = QtGui.QCheckBox("Tabbed Conversations", self)
if self.config.tabs(): if self.config.tabs():
self.tabcheck.setChecked(True) self.tabcheck.setChecked(True)
@ -572,6 +576,12 @@ class PesterOptions(QtGui.QDialog):
if self.config.showSeconds(): if self.config.showSeconds():
self.secondscheck.setChecked(True) self.secondscheck.setChecked(True)
# Will add ability to turn off groups later
#self.groupscheck = QtGui.QCheckBox("Use Groups", self)
#self.groupscheck.setChecked(self.config.useGroups())
self.showemptycheck = QtGui.QCheckBox("Show Empty Groups", self)
self.showemptycheck.setChecked(self.config.showEmptyGroups())
self.ok = QtGui.QPushButton("OK", self) self.ok = QtGui.QPushButton("OK", self)
self.ok.setDefault(True) self.ok.setDefault(True)
self.connect(self.ok, QtCore.SIGNAL('clicked()'), self.connect(self.ok, QtCore.SIGNAL('clicked()'),
@ -587,6 +597,9 @@ class PesterOptions(QtGui.QDialog):
layout_0.addWidget(self.tabcheck) layout_0.addWidget(self.tabcheck)
layout_0.addWidget(self.soundcheck) layout_0.addWidget(self.soundcheck)
layout_0.addWidget(self.hideOffline) layout_0.addWidget(self.hideOffline)
#layout_0.addWidget(self.groupscheck)
layout_0.addWidget(self.showemptycheck)
layout_0.addWidget(hr)
layout_0.addWidget(self.timestampcheck) layout_0.addWidget(self.timestampcheck)
layout_0.addWidget(self.timestampBox) layout_0.addWidget(self.timestampBox)
layout_0.addWidget(self.secondscheck) layout_0.addWidget(self.secondscheck)

View file

@ -135,7 +135,14 @@ class PesterProfileDB(dict):
json.dump(chumdict, fp) json.dump(chumdict, fp)
fp.close() fp.close()
converted = dict([(handle, PesterProfile(handle, color=QtGui.QColor(c['color']), mood=Mood(c['mood']))) for (handle, c) in chumdict.iteritems()]) u = []
for (handle, c) in chumdict.iteritems():
try:
g = c['group']
u.append((handle, PesterProfile(handle, color=QtGui.QColor(c['color']), mood=Mood(c['mood']), group=g)))
except KeyError:
u.append((handle, PesterProfile(handle, color=QtGui.QColor(c['color']), mood=Mood(c['mood']))))
converted = dict(u)
self.update(converted) self.update(converted)
def save(self): def save(self):
@ -156,6 +163,17 @@ class PesterProfileDB(dict):
self[handle].color = color self[handle].color = color
else: else:
self[handle] = PesterProfile(handle, color) self[handle] = PesterProfile(handle, color)
def getGroup(self, handle, default="Chums"):
if not self.has_key(handle):
return default
else:
return self[handle].group
def setGroup(self, handle, theGroup):
if self.has_key(handle):
self[handle].group = theGroup
else:
self[handle] = PesterProfile(handle, group=theGroup)
self.save()
def __setitem__(self, key, val): def __setitem__(self, key, val):
dict.__setitem__(self, key, val) dict.__setitem__(self, key, val)
self.save() self.save()
@ -268,6 +286,18 @@ class userConfig(object):
if not self.config.has_key('showSeconds'): if not self.config.has_key('showSeconds'):
self.set("showSeconds", False) self.set("showSeconds", False)
return self.config.get('showSeconds', False) return self.config.get('showSeconds', False)
def useGroups(self):
if not self.config.has_key('useGroups'):
self.set("useGroups", False)
return self.config.get('useGroups', False)
def openDefaultGroup(self):
if not self.config.has_key('openDefaultGroup'):
self.set("openDefaultGroup", True)
return self.config.get('openDefaultGroup', True)
def showEmptyGroups(self):
if not self.config.has_key('emptyGroups'):
self.set("emptyGroups", False)
return self.config.get('emptyGroups', False)
def addChum(self, chum): def addChum(self, chum):
if chum.handle not in self.chums(): if chum.handle not in self.chums():
fp = open(self.filename) # what if we have two clients open?? fp = open(self.filename) # what if we have two clients open??
@ -295,6 +325,25 @@ class userConfig(object):
l = self.getBlocklist() l = self.getBlocklist()
l.pop(l.index(handle)) l.pop(l.index(handle))
self.set('block', l) self.set('block', l)
def getGroups(self):
if not self.config.has_key('groups'):
self.set('groups', [])
return self.config.get('groups', [])
def addGroup(self, group, open=False):
l = self.getGroups()
if group not in l:
l.append([group,open])
l.sort()
self.set('groups', l)
def delGroup(self, group):
l = self.getGroups()
i = 0
for g in l:
if g[0] == group: break
i = i+1
l.pop(i)
l.sort()
self.set('groups', l)
def server(self): def server(self):
return self.config.get('server', 'irc.mindfang.org') return self.config.get('server', 'irc.mindfang.org')
def port(self): def port(self):
@ -411,9 +460,9 @@ class WMButton(QtGui.QPushButton):
self.setStyleSheet("QPushButton { padding: 0px; }") self.setStyleSheet("QPushButton { padding: 0px; }")
self.setAutoDefault(False) self.setAutoDefault(False)
class chumListing(QtGui.QListWidgetItem): class chumListing(QtGui.QTreeWidgetItem):
def __init__(self, chum, window): def __init__(self, chum, window):
QtGui.QListWidgetItem.__init__(self, chum.handle) QtGui.QTreeWidgetItem.__init__(self, [chum.handle])
self.mainwindow = window self.mainwindow = window
self.chum = chum self.chum = chum
self.handle = chum.handle self.handle = chum.handle
@ -427,33 +476,45 @@ class chumListing(QtGui.QListWidgetItem):
mood = self.chum.mood mood = self.chum.mood
self.mood = mood self.mood = mood
icon = self.mood.icon(self.mainwindow.theme) icon = self.mood.icon(self.mainwindow.theme)
self.setIcon(icon) self.setIcon(0, icon)
try: try:
self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"])) self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"]))
except KeyError: except KeyError:
self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"])) self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"]))
def changeTheme(self, theme): def changeTheme(self, theme):
icon = self.mood.icon(theme) icon = self.mood.icon(theme)
self.setIcon(icon) self.setIcon(0, icon)
try: try:
self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"])) self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods"][self.mood.name()]["color"]))
except KeyError: except KeyError:
self.setTextColor(QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"])) self.setTextColor(0, QtGui.QColor(self.mainwindow.theme["main/chums/moods/chummy/color"]))
def __lt__(self, cl): def __lt__(self, cl):
h1 = self.handle.lower() h1 = self.handle.lower()
h2 = cl.handle.lower() h2 = cl.handle.lower()
return (h1 < h2) return (h1 < h2)
class chumArea(RightClickList): class chumArea(RightClickTree):
def __init__(self, chums, parent=None): def __init__(self, chums, parent=None):
QtGui.QListWidget.__init__(self, parent) QtGui.QTreeWidget.__init__(self, parent)
self.mainwindow = parent self.mainwindow = parent
theme = self.mainwindow.theme theme = self.mainwindow.theme
self.chums = chums self.chums = chums
gTemp = self.mainwindow.config.getGroups()
self.groups = [g[0] for g in gTemp]
self.openGroups = [g[1] for g in gTemp]
# quick hack to sort saved groups
self.mainwindow.config.addGroup("f3rskv9dssag[%3ffvsla09iv34G#$v")
self.mainwindow.config.delGroup("f3rskv9dssag[%3ffvsla09iv34G#$v")
# end quick hack
self.showAllGroups()
if not self.mainwindow.config.hideOfflineChums(): if not self.mainwindow.config.hideOfflineChums():
self.showAllChums() self.showAllChums()
self.optionsMenu = QtGui.QMenu(self) if not self.mainwindow.config.showEmptyGroups():
self.hideEmptyGroups()
self.chumoptions = QtGui.QMenu(self)
self.groupoptions = QtGui.QMenu(self)
self.canonMenu = QtGui.QMenu(self) self.canonMenu = QtGui.QMenu(self)
self.optionsMenu = self.chumoptions
self.pester = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/pester"], self) self.pester = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/pester"], self)
self.connect(self.pester, QtCore.SIGNAL('triggered()'), self.connect(self.pester, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('activateChum()')) self, QtCore.SLOT('activateChum()'))
@ -472,13 +533,22 @@ class chumArea(RightClickList):
self.findalts = QtGui.QAction("Find Alts", self) self.findalts = QtGui.QAction("Find Alts", self)
self.connect(self.findalts, QtCore.SIGNAL('triggered()'), self.connect(self.findalts, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('findAlts()')) self, QtCore.SLOT('findAlts()'))
self.removegroup = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/removegroup"], self)
self.connect(self.removegroup, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('removeGroup()'))
self.renamegroup = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/renamegroup"], self)
self.connect(self.renamegroup, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('renameGroup()')) self.chumoptions.addAction(self.pester)
self.optionsMenu.addAction(self.pester) self.chumoptions.addAction(self.logchum)
self.optionsMenu.addAction(self.logchum) self.chumoptions.addAction(self.blockchum)
self.optionsMenu.addAction(self.blockchum) self.chumoptions.addAction(self.removechum)
self.optionsMenu.addAction(self.removechum) self.moveMenu = QtGui.QMenu(self.mainwindow.theme["main/menus/rclickchumlist/movechum"], self)
self.optionsMenu.addAction(self.reportchum) self.chumoptions.addMenu(self.moveMenu)
self.moveGroupMenu()
self.groupoptions.addAction(self.renamegroup)
self.groupoptions.addAction(self.removegroup)
self.canonMenu.addAction(self.pester) self.canonMenu.addAction(self.pester)
self.canonMenu.addAction(self.logchum) self.canonMenu.addAction(self.logchum)
@ -488,13 +558,71 @@ class chumArea(RightClickList):
self.canonMenu.addAction(self.findalts) self.canonMenu.addAction(self.findalts)
self.initTheme(theme) self.initTheme(theme)
self.sortItems() #self.sortItems()
#self.sortItems(1, QtCore.Qt.AscendingOrder)
self.setSortingEnabled(False)
self.header().hide()
self.setDropIndicatorShown(False)
self.setIndentation(0)
self.setDragEnabled(True)
self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
self.connect(self, QtCore.SIGNAL('itemDoubleClicked(QTreeWidgetItem *, int)'),
self, QtCore.SLOT('expandGroup()'))
def getOptionsMenu(self): def getOptionsMenu(self):
currenthandle = self.currentItem().chum.handle currenthandle = self.currentItem().chum.handle
if currenthandle in canon_handles: if currenthandle in canon_handles:
return self.canonMenu return self.canonMenu
else: else:
return self.optionsMenu return self.optionsMenu
def dropEvent(self, event):
item = self.itemAt(event.pos())
if item:
if item.text(0) == "Chums" or item.text(0) in self.groups:
group = item.text(0)
else:
group = item.parent().text(0)
chumLabel = event.source().currentItem()
chumLabel.chum.group = group
self.mainwindow.chumdb.setGroup(chumLabel.chum.handle, group)
self.takeItem(chumLabel)
self.addItem(chumLabel)
def chumoptionsmenu(self):
self.optionsMenu = self.chumoptions
def groupoptionsmenu(self):
self.optionsMenu = self.groupoptions
def moveGroupMenu(self):
currentGroup = self.currentItem()
if currentGroup:
currentGroup = currentGroup.parent().text(0)
self.moveMenu.clear()
actGroup = QtGui.QActionGroup(self)
groups = self.groups[:]
groups.insert(0, "Chums")
for gtext in groups:
if gtext == currentGroup:
continue
movegroup = self.moveMenu.addAction(gtext)
actGroup.addAction(movegroup)
self.connect(actGroup, QtCore.SIGNAL('triggered(QAction *)'),
self, QtCore.SLOT('moveToGroup(QAction *)'))
def contextMenuEvent(self, event):
#fuckin Qt
if event.reason() == QtGui.QContextMenuEvent.Mouse:
listing = self.itemAt(event.pos())
self.setCurrentItem(listing)
if self.currentItem().text(0) == "Chums" or \
self.currentItem().text(0) in self.groups:
self.groupoptionsmenu()
else:
self.chumoptionsmenu()
self.moveGroupMenu()
self.optionsMenu.popup(event.globalPos())
def addChum(self, chum): def addChum(self, chum):
if len([c for c in self.chums if c.handle == chum.handle]) != 0: if len([c for c in self.chums if c.handle == chum.handle]) != 0:
return return
@ -503,29 +631,95 @@ class chumArea(RightClickList):
chum.mood.name() == "offline"): chum.mood.name() == "offline"):
chumLabel = chumListing(chum, self.mainwindow) chumLabel = chumListing(chum, self.mainwindow)
self.addItem(chumLabel) self.addItem(chumLabel)
self.sortItems() #self.topLevelItem(0).addChild(chumLabel)
#self.topLevelItem(0).sortChildren(0, QtCore.Qt.AscendingOrder)
def getChums(self, handle): def getChums(self, handle):
chums = self.findItems(handle, QtCore.Qt.MatchFlags(0)) chums = self.findItems(handle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive)
return chums return chums
def showAllChums(self): def showAllChums(self):
for c in self.chums: for c in self.chums:
chandle = c.handle chandle = c.handle
if not self.findItems(chandle, QtCore.Qt.MatchFlags(0)): if not len(self.findItems(chandle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive)):
chumLabel = chumListing(c, self.mainwindow) chumLabel = chumListing(c, self.mainwindow)
self.addItem(chumLabel) self.addItem(chumLabel)
self.sortItems() #self.sortItems()
def hideOfflineChums(self): def hideOfflineChums(self):
for j in range(self.topLevelItemCount()):
i = 0 i = 0
listing = self.item(i) listing = self.topLevelItem(j).child(i)
while listing is not None: while listing is not None:
if listing.chum.mood.name() == "offline": if listing.chum.mood.name() == "offline":
self.takeItem(i) self.topLevelItem(j).takeChild(i)
else: else:
i += 1 i += 1
listing = self.item(i) listing = self.topLevelItem(j).child(i)
self.sortItems() self.topLevelItem(j).sortChildren(0, QtCore.Qt.AscendingOrder)
def showAllGroups(self):
curgroups = []
for i in range(self.topLevelItemCount()):
curgroups.append(self.topLevelItem(i).text(0))
if "Chums" not in curgroups:
child_1 = QtGui.QTreeWidgetItem(["Chums"])
self.addTopLevelItem(child_1)
if self.mainwindow.config.openDefaultGroup():
child_1.setExpanded(True)
for i,g in enumerate(self.groups):
if g not in curgroups:
child_1 = QtGui.QTreeWidgetItem(["%s" % (g)])
self.addTopLevelItem(child_1)
if self.openGroups[i]:
child_1.setExpanded(True)
def hideEmptyGroups(self):
i = 0
listing = self.topLevelItem(i)
while listing is not None:
if listing.childCount() == 0:
self.takeTopLevelItem(i)
else:
i += 1
listing = self.topLevelItem(i)
@QtCore.pyqtSlot()
def expandGroup(self):
item = self.currentItem()
if item.text(0) in self.groups:
self.mainwindow.config.delGroup(str(item.text(0)))
expand = item.isExpanded()
self.mainwindow.config.addGroup(str(item.text(0)), not expand)
elif item.text(0) == "Chums":
self.mainwindow.config.set("openDefaultGroup", not item.isExpanded())
def addItem(self, chumLabel):
if hasattr(self, 'groups'):
if chumLabel.chum.group not in self.groups:
self.topLevelItem(0).addChild(chumLabel)
self.topLevelItem(0).sortChildren(0, QtCore.Qt.AscendingOrder)
else:
if not self.findItems(chumLabel.handle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive):
if not self.findItems(chumLabel.chum.group, QtCore.Qt.MatchFlags(0)):
child_1 = QtGui.QTreeWidgetItem(["%s" % (chumLabel.chum.group)])
self.addTopLevelItem(child_1)
if self.openGroups[self.groups.index("%s" % (chumLabel.chum.group))]:
child_1.setExpanded(True)
for i in range(self.topLevelItemCount()):
if self.topLevelItem(i).text(0) == chumLabel.chum.group:
break
self.topLevelItem(i).addChild(chumLabel)
self.topLevelItem(i).sortChildren(0, QtCore.Qt.AscendingOrder)
else: # usually means this is now the trollslum
if not self.findItems(chumLabel.handle, QtCore.Qt.MatchContains | QtCore.Qt.MatchRecursive):
self.topLevelItem(0).addChild(chumLabel)
self.topLevelItem(0).sortChildren(0, QtCore.Qt.AscendingOrder)
def takeItem(self, chumLabel):
r = None
for i in range(self.topLevelItemCount()):
for j in range(self.topLevelItem(i).childCount()):
if self.topLevelItem(i).child(j).text(0) == chumLabel.chum.handle:
r = self.topLevelItem(i).takeChild(j)
break
if not self.mainwindow.config.showEmptyGroups():
self.hideEmptyGroups()
return r
def updateMood(self, handle, mood): def updateMood(self, handle, mood):
hideoff = self.mainwindow.config.hideOfflineChums() hideoff = self.mainwindow.config.hideOfflineChums()
chums = self.getChums(handle) chums = self.getChums(handle)
@ -536,7 +730,7 @@ class chumArea(RightClickList):
handle in [p.handle for p in self.chums]: handle in [p.handle for p in self.chums]:
newLabel = chumListing([p for p in self.chums if p.handle == handle][0], self.mainwindow) newLabel = chumListing([p for p in self.chums if p.handle == handle][0], self.mainwindow)
self.addItem(newLabel) self.addItem(newLabel)
self.sortItems() #self.sortItems()
chums = [newLabel] chums = [newLabel]
elif mood.name() == "offline" and \ elif mood.name() == "offline" and \
len(chums) > 0: len(chums) > 0:
@ -562,14 +756,27 @@ class chumArea(RightClickList):
self.removechum.setText(theme["main/menus/rclickchumlist/removechum"]) self.removechum.setText(theme["main/menus/rclickchumlist/removechum"])
self.blockchum.setText(theme["main/menus/rclickchumlist/blockchum"]) self.blockchum.setText(theme["main/menus/rclickchumlist/blockchum"])
self.logchum.setText(theme["main/menus/rclickchumlist/viewlog"]) self.logchum.setText(theme["main/menus/rclickchumlist/viewlog"])
self.removegroup.setText(theme["main/menus/rclickchumlist/removegroup"])
self.renamegroup.setText(theme["main/menus/rclickchumlist/renamegroup"])
self.moveMenu.setTitle(theme["main/menus/rclickchumlist/movechum"])
def changeTheme(self, theme): def changeTheme(self, theme):
self.initTheme(theme) self.initTheme(theme)
chumlistings = [self.item(i) for i in range(0, self.count())] chumlistings = []
for i in range(self.topLevelItemCount()):
for j in range(self.topLevelItem(i).childCount()):
chumlistings.append(self.topLevelItem(i).child(j))
#chumlistings = [self.item(i) for i in range(0, self.count())]
for c in chumlistings: for c in chumlistings:
c.changeTheme(theme) c.changeTheme(theme)
def count(self):
c = 0
for i in range(self.topLevelItemCount()):
c = c + self.topLevelItem(i).childCount()
return c
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def activateChum(self): def activateChum(self):
self.itemActivated.emit(self.currentItem()) self.itemActivated.emit(self.currentItem(), 0)
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def removeChum(self, handle = None): def removeChum(self, handle = None):
if handle: if handle:
@ -581,7 +788,7 @@ class chumArea(RightClickList):
currentChum = self.currentItem().chum currentChum = self.currentItem().chum
self.chums = [c for c in self.chums if c.handle != currentChum.handle] self.chums = [c for c in self.chums if c.handle != currentChum.handle]
self.removeChumSignal.emit(self.currentItem().chum.handle) self.removeChumSignal.emit(self.currentItem().chum.handle)
oldlist = self.takeItem(self.currentRow()) oldlist = self.takeItem(self.currentItem())
del oldlist del oldlist
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def blockChum(self): def blockChum(self):
@ -603,7 +810,7 @@ class chumArea(RightClickList):
self.mainwindow.sendMessage.emit("ALT %s" % (currentChum.chum.handle) , "calSprite") self.mainwindow.sendMessage.emit("ALT %s" % (currentChum.chum.handle) , "calSprite")
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def openChumLogs(self): def openChumLogs(self):
currentChum = self.currentItem().text() currentChum = self.currentItem().text(0)
if not currentChum: if not currentChum:
return return
self.pesterlogviewer = PesterLogViewer(currentChum, self.mainwindow.config, self.mainwindow.theme, self.mainwindow) self.pesterlogviewer = PesterLogViewer(currentChum, self.mainwindow.config, self.mainwindow.theme, self.mainwindow)
@ -618,20 +825,59 @@ class chumArea(RightClickList):
self.pesterlogviewer = None self.pesterlogviewer = None
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def renameGroup(self): def renameGroup(self):
if not hasattr(self, 'renamegroupdialog'):
self.renamegroupdialog = None
if not self.renamegroupdialog:
(gname, ok) = QtGui.QInputDialog.getText(self, "Rename Group", "Enter a new name for the group:") (gname, ok) = QtGui.QInputDialog.getText(self, "Rename Group", "Enter a new name for the group:")
if ok: if ok:
pass gname = unicode(gname)
#rename group currentGroup = self.currentItem()
if not currentGroup:
return
index = self.indexOfTopLevelItem(currentGroup)
if index != -1:
expanded = currentGroup.isExpanded()
self.mainwindow.config.delGroup(str(currentGroup.text(0)))
self.mainwindow.config.addGroup(gname, expanded)
gTemp = self.mainwindow.config.getGroups()
self.groups = [g[0] for g in gTemp]
self.openGroups = [g[1] for g in gTemp]
for i in range(currentGroup.childCount()):
currentGroup.child(i).chum.group = gname
self.mainwindow.chumdb.setGroup(currentGroup.child(i).chum.handle, gname)
currentGroup.setText(0, gname)
self.renamegroupdialog = None
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def removeGroup(self): def removeGroup(self):
pass currentGroup = self.currentItem()
#remove group if not currentGroup:
return
self.mainwindow.config.delGroup(currentGroup.text(0))
gTemp = self.mainwindow.config.getGroups()
self.groups = [g[0] for g in gTemp]
self.openGroups = [g[1] for g in gTemp]
for i in range(self.topLevelItemCount()):
if self.topLevelItem(i).text(0) == currentGroup.text(0):
break
while self.topLevelItem(i).child(0):
chumLabel = self.topLevelItem(i).child(0)
chumLabel.chum.group = "Chums"
self.mainwindow.chumdb.setGroup(chumLabel.chum.handle, "Chums")
self.takeItem(chumLabel)
self.addItem(chumLabel)
self.takeTopLevelItem(i)
@QtCore.pyqtSlot(QtGui.QAction) @QtCore.pyqtSlot(QtGui.QAction)
def moveToGroup(self, item): def moveToGroup(self, item):
pass if not item:
#move to group return
group = str(item.text())
chumLabel = self.currentItem()
if not chumLabel:
return
chumLabel.chum.group = group
self.mainwindow.chumdb.setGroup(chumLabel.chum.handle, group)
self.takeItem(chumLabel)
self.addItem(chumLabel)
removeChumSignal = QtCore.pyqtSignal(QtCore.QString) removeChumSignal = QtCore.pyqtSignal(QtCore.QString)
blockChumSignal = QtCore.pyqtSignal(QtCore.QString) blockChumSignal = QtCore.pyqtSignal(QtCore.QString)
@ -643,19 +889,34 @@ class trollSlum(chumArea):
theme = self.mainwindow.theme theme = self.mainwindow.theme
self.setStyleSheet(theme["main/trollslum/chumroll/style"]) self.setStyleSheet(theme["main/trollslum/chumroll/style"])
self.chums = trolls self.chums = trolls
child_1 = QtGui.QTreeWidgetItem([""])
self.addTopLevelItem(child_1)
child_1.setExpanded(True)
for c in self.chums: for c in self.chums:
chandle = c.handle chandle = c.handle
if not self.findItems(chandle, QtCore.Qt.MatchFlags(0)): if not self.findItems(chandle, QtCore.Qt.MatchFlags(0)):
chumLabel = chumListing(c, self.mainwindow) chumLabel = chumListing(c, self.mainwindow)
self.addItem(chumLabel) self.addItem(chumLabel)
self.setSortingEnabled(False)
self.header().hide()
self.setDropIndicatorShown(False)
self.setIndentation(0)
self.optionsMenu = QtGui.QMenu(self) self.optionsMenu = QtGui.QMenu(self)
self.unblockchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/unblockchum"], self) self.unblockchum = QtGui.QAction(self.mainwindow.theme["main/menus/rclickchumlist/unblockchum"], self)
self.connect(self.unblockchum, QtCore.SIGNAL('triggered()'), self.connect(self.unblockchum, QtCore.SIGNAL('triggered()'),
self, QtCore.SIGNAL('unblockChumSignal()')) self, QtCore.SIGNAL('unblockChumSignal()'))
self.optionsMenu.addAction(self.unblockchum) self.optionsMenu.addAction(self.unblockchum)
self.sortItems() #self.sortItems()
def contextMenuEvent(self, event):
#fuckin Qt
if event.reason() == QtGui.QContextMenuEvent.Mouse:
listing = self.itemAt(event.pos())
self.setCurrentItem(listing)
if self.currentItem().text(0) != "":
self.optionsMenu.popup(event.globalPos())
def changeTheme(self, theme): def changeTheme(self, theme):
self.setStyleSheet(theme["main/trollslum/chumroll/style"]) self.setStyleSheet(theme["main/trollslum/chumroll/style"])
self.removechum.setText(theme["main/menus/rclickchumlist/removechum"]) self.removechum.setText(theme["main/menus/rclickchumlist/removechum"])
@ -872,6 +1133,10 @@ class PesterWindow(MovingWindow):
self.logv = logv self.logv = logv
self.connect(logv, QtCore.SIGNAL('triggered()'), self.connect(logv, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('openLogv()')) self, QtCore.SLOT('openLogv()'))
grps = QtGui.QAction(self.theme["main/menus/client/addgroup"], self)
self.grps = grps
self.connect(grps, QtCore.SIGNAL('triggered()'),
self, QtCore.SLOT('addGroupWindow()'))
opts = QtGui.QAction(self.theme["main/menus/client/options"], self) opts = QtGui.QAction(self.theme["main/menus/client/options"], self)
self.opts = opts self.opts = opts
self.connect(opts, QtCore.SIGNAL('triggered()'), self.connect(opts, QtCore.SIGNAL('triggered()'),
@ -908,6 +1173,7 @@ class PesterWindow(MovingWindow):
filemenu.addAction(logv) filemenu.addAction(logv)
filemenu.addAction(userlistaction) filemenu.addAction(userlistaction)
filemenu.addAction(self.idleaction) filemenu.addAction(self.idleaction)
filemenu.addAction(grps)
filemenu.addAction(self.importaction) filemenu.addAction(self.importaction)
filemenu.addAction(self.reconnectAction) filemenu.addAction(self.reconnectAction)
filemenu.addAction(exitaction) filemenu.addAction(exitaction)
@ -971,7 +1237,7 @@ class PesterWindow(MovingWindow):
chums = [PesterProfile(c, chumdb=self.chumdb) for c in set(self.config.chums())] chums = [PesterProfile(c, chumdb=self.chumdb) for c in set(self.config.chums())]
self.chumList = chumArea(chums, self) self.chumList = chumArea(chums, self)
self.connect(self.chumList, self.connect(self.chumList,
QtCore.SIGNAL('itemActivated(QListWidgetItem *)'), QtCore.SIGNAL('itemActivated(QTreeWidgetItem *, int)'),
self, self,
QtCore.SLOT('pesterSelectedChum()')) QtCore.SLOT('pesterSelectedChum()'))
self.connect(self.chumList, self.connect(self.chumList,
@ -1217,6 +1483,7 @@ class PesterWindow(MovingWindow):
# menus # menus
self.menu.move(*theme["main/menu/loc"]) self.menu.move(*theme["main/menu/loc"])
self.logv.setText(theme["main/menus/client/logviewer"]) self.logv.setText(theme["main/menus/client/logviewer"])
self.grps.setText(theme["main/menus/client/addgroup"])
self.opts.setText(theme["main/menus/client/options"]) self.opts.setText(theme["main/menus/client/options"])
self.exitaction.setText(theme["main/menus/client/exit"]) self.exitaction.setText(theme["main/menus/client/exit"])
self.userlistaction.setText(theme["main/menus/client/userlist"]) self.userlistaction.setText(theme["main/menus/client/userlist"])
@ -1371,6 +1638,8 @@ class PesterWindow(MovingWindow):
def pesterSelectedChum(self): def pesterSelectedChum(self):
curChum = self.chumList.currentItem() curChum = self.chumList.currentItem()
if curChum: if curChum:
if curChum.text(0) not in self.chumList.groups and \
curChum.text(0) != "Chums":
self.newConversationWindow(curChum) self.newConversationWindow(curChum)
@QtCore.pyqtSlot(QtGui.QListWidgetItem) @QtCore.pyqtSlot(QtGui.QListWidgetItem)
def newConversationWindow(self, chumlisting): def newConversationWindow(self, chumlisting):
@ -1723,6 +1992,25 @@ class PesterWindow(MovingWindow):
def closeLogUsers(self): def closeLogUsers(self):
self.logusermenu.close() self.logusermenu.close()
self.logusermenu = None self.logusermenu = None
@QtCore.pyqtSlot()
def addGroupWindow(self):
if not hasattr(self, 'addgroupdialog'):
self.addgroupdialog = None
if not self.addgroupdialog:
(gname, ok) = QtGui.QInputDialog.getText(self, "Add Group", "Enter a name for the new group:")
if ok:
gname = unicode(gname)
self.config.addGroup(gname)
gTemp = self.config.getGroups()
self.chumList.groups = [g[0] for g in gTemp]
self.chumList.openGroups = [g[1] for g in gTemp]
self.chumList.showAllGroups()
if not self.config.showEmptyGroups():
self.chumList.hideEmptyGroups()
self.addgroupdialog = None
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def openOpts(self): def openOpts(self):
if not hasattr(self, 'optionmenu'): if not hasattr(self, 'optionmenu'):
@ -1804,6 +2092,16 @@ class PesterWindow(MovingWindow):
self.config.set("time12Format", False) self.config.set("time12Format", False)
secondssetting = self.optionmenu.secondscheck.isChecked() secondssetting = self.optionmenu.secondscheck.isChecked()
self.config.set("showSeconds", secondssetting) self.config.set("showSeconds", secondssetting)
# groups
groupssetting = self.optionmenu.groupscheck.isChecked()
self.config.set("useGroups", groupssetting)
emptygroupssetting = self.optionmenu.showemptycheck.isChecked()
curemptygroup = self.config.showEmptyGroups()
if curemptygroup and not emptygroupssetting:
self.chumList.hideEmptyGroups()
elif emptygroupssetting and not curemptygroup:
self.chumList.showAllGroups()
self.config.set("emptyGroups", emptygroupssetting)
self.optionmenu = None self.optionmenu = None
@QtCore.pyqtSlot() @QtCore.pyqtSlot()

View file

@ -20,6 +20,7 @@
"memos": "Memos", "memos": "Memos",
"logviewer": "Pesterlogs", "logviewer": "Pesterlogs",
"userlist": "Userlist", "userlist": "Userlist",
"addgroup": "Add Group",
"import": "Import", "import": "Import",
"reconnect": "Reconnect", "reconnect": "Reconnect",
"idle": "Idle", "idle": "Idle",
@ -39,6 +40,9 @@
"addchum": "Add Chum", "addchum": "Add Chum",
"viewlog": "View Pesterlog", "viewlog": "View Pesterlog",
"unblockchum": "Unblock", "unblockchum": "Unblock",
"removegroup": "Remove Group",
"renamegroup": "Rename Group",
"movechum": "Move To",
"banuser": "Ban User", "banuser": "Ban User",
"opuser": "Make OP", "opuser": "Make OP",
"quirksoff": "Quirks Off" "quirksoff": "Quirks Off"

View file

@ -22,6 +22,7 @@
"memos": "Memos", "memos": "Memos",
"logviewer": "Pesterlogs", "logviewer": "Pesterlogs",
"userlist": "Userlist", "userlist": "Userlist",
"addgroup": "Add Group",
"import": "Import", "import": "Import",
"reconnect": "Reconnect", "reconnect": "Reconnect",
"idle": "Idle", "idle": "Idle",
@ -41,6 +42,9 @@
"addchum": "Add Chum", "addchum": "Add Chum",
"viewlog": "View Pesterlog", "viewlog": "View Pesterlog",
"unblockchum": "Unblock", "unblockchum": "Unblock",
"removegroup": "Remove Group",
"renamegroup": "Rename Group",
"movechum": "Move To",
"banuser": "Ban User", "banuser": "Ban User",
"opuser": "Make OP", "opuser": "Make OP",
"quirksoff": "Quirks Off" "quirksoff": "Quirks Off"

View file

@ -22,6 +22,7 @@
"memos": "MEMOS", "memos": "MEMOS",
"logviewer": "PESTERLOGS", "logviewer": "PESTERLOGS",
"userlist": "USERLIST", "userlist": "USERLIST",
"addgroup": "ADD GROUP",
"import": "IMPORT", "import": "IMPORT",
"reconnect": "RECONNECT", "reconnect": "RECONNECT",
"idle": "IDLE", "idle": "IDLE",
@ -41,6 +42,9 @@
"addchum": "ADD CHUM", "addchum": "ADD CHUM",
"viewlog": "VIEW PESTERLOG", "viewlog": "VIEW PESTERLOG",
"unblockchum": "UNBLOCK", "unblockchum": "UNBLOCK",
"removegroup": "REMOVE GROUP",
"renamegroup": "RENAME GROUP",
"movechum": "MOVE TO",
"banuser": "BAN USER", "banuser": "BAN USER",
"opuser": "MAKE OP", "opuser": "MAKE OP",
"quirksoff": "QUIRKS OFF" "quirksoff": "QUIRKS OFF"

View file

@ -21,7 +21,9 @@
"memos": "Memos", "memos": "Memos",
"logviewer": "Pesterlogs", "logviewer": "Pesterlogs",
"userlist": "Fresh Targets", "userlist": "Fresh Targets",
"addgroup": "Add Group",
"import": "import U2;", "import": "import U2;",
"reconnect": "Reconnect",
"idle": "Idle", "idle": "Idle",
"exit": "Abscond"}, "exit": "Abscond"},
"profile": {"_name": "View", "profile": {"_name": "View",
@ -39,6 +41,9 @@
"addchum": "Add Chump", "addchum": "Add Chump",
"viewlog": "View Pesterlog", "viewlog": "View Pesterlog",
"unblockchum": "Mercy", "unblockchum": "Mercy",
"removegroup": "Remove Group",
"renamegroup": "Rename Group",
"movechum": "Move To",
"banuser": "Ban", "banuser": "Ban",
"opuser": "Promote", "opuser": "Promote",
"quirksoff": "Quirks Off" } "quirksoff": "Quirks Off" }

View file

@ -22,6 +22,7 @@
"memos": "Bulletin Boards", "memos": "Bulletin Boards",
"logviewer": "Pesterlogs", "logviewer": "Pesterlogs",
"userlist": "Userlist", "userlist": "Userlist",
"addgroup": "Add Group",
"import": "Import", "import": "Import",
"idle": "Idle", "idle": "Idle",
"reconnect": "Reconnect", "reconnect": "Reconnect",
@ -41,6 +42,9 @@
"addchum": "Add User", "addchum": "Add User",
"viewlog": "View Pesterlog", "viewlog": "View Pesterlog",
"unblockchum": "Forgive", "unblockchum": "Forgive",
"removegroup": "Remove Group",
"renamegroup": "Rename Group",
"movechum": "Move To",
"banuser": "Expel User", "banuser": "Expel User",
"opuser": "Promote", "opuser": "Promote",
"quirksoff": "Quirks Off" "quirksoff": "Quirks Off"