mood buttons!

This commit is contained in:
Stephen Dranger 2011-01-28 20:36:12 -06:00
parent c07bb7b17f
commit 99175a9f6d
11 changed files with 294 additions and 46 deletions

8
TODO
View file

@ -1,9 +1,4 @@
Features: Features:
* Handle user signoffs/signons
* Handle nick changes
* theme elements define, implement
* default user
* Moods
* Add chum * Add chum
* REMOVE chum * REMOVE chum
* Sounds * Sounds
@ -12,10 +7,13 @@ Features:
* menubar should pass on mouse move * menubar should pass on mouse move
* Quirks * Quirks
-- package -- package
* theme elements define, implement
* User signon?
* Logging * Logging
* Block list * Block list
* User list/add from list * User list/add from list
* User commands/stop user from sending commands accidentally * User commands/stop user from sending commands accidentally
-- release alpha
* System tray stuff * System tray stuff
* Chat rooms * Chat rooms
-- release beta -- release beta

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -13,7 +13,9 @@ from PyQt4 import QtGui, QtCore
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
class Mood(object): class Mood(object):
moods = ["chummy", "rancorous", "offline"] moods = ["chummy", "rancorous", "offline", "pleasant", "distraught",
"unruly", "smooth", "ecstatic", "relaxed", "discontent",
"devious", "sleek", "detestful"]
def __init__(self, mood): def __init__(self, mood):
if type(mood) is int: if type(mood) is int:
self.mood = mood self.mood = mood
@ -124,16 +126,19 @@ class userProfile(object):
"quirks": [], "quirks": [],
"theme": "pesterchum"} "theme": "pesterchum"}
self.theme = pesterTheme("pesterchum") self.theme = pesterTheme("pesterchum")
self.chat.mood = Mood(self.theme["main/defaultmood"])
self.quirks = pesterQuirks([]) self.quirks = pesterQuirks([])
else: else:
fp = open("profiles/%s.js" % (user)) fp = open("profiles/%s.js" % (user))
self.userprofile = json.load(fp) self.userprofile = json.load(fp)
fp.close() fp.close()
self.theme = pesterTheme(self.userprofile["theme"])
self.chat = PesterProfile(self.userprofile["handle"], self.chat = PesterProfile(self.userprofile["handle"],
QtGui.QColor(self.userprofile["color"]), QtGui.QColor(self.userprofile["color"]),
Mood(0)) Mood(self.theme["main/defaultmood"]))
self.theme = pesterTheme(self.userprofile["theme"])
self.quirks = pesterQuirks(self.userprofile["quirks"]) self.quirks = pesterQuirks(self.userprofile["quirks"])
def setMood(self, mood):
self.chat.mood = mood
def setTheme(self, theme): def setTheme(self, theme):
self.theme = theme self.theme = theme
self.userprofile["theme"] = theme.name self.userprofile["theme"] = theme.name
@ -240,6 +245,12 @@ class PesterChooseProfile(QtGui.QDialog):
else: else:
self.profileBox = None 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 = 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()'),
@ -261,6 +272,7 @@ class PesterChooseProfile(QtGui.QDialog):
layout_0.addWidget(profileLabel) layout_0.addWidget(profileLabel)
layout_0.addWidget(self.profileBox) layout_0.addWidget(self.profileBox)
layout_0.addLayout(layout_ok) layout_0.addLayout(layout_ok)
layout_0.addLayout(layout_2)
self.errorMsg = QtGui.QLabel(self) self.errorMsg = QtGui.QLabel(self)
self.errorMsg.setStyleSheet("color:red;") self.errorMsg.setStyleSheet("color:red;")
layout_0.addWidget(self.errorMsg) layout_0.addWidget(self.errorMsg)
@ -387,6 +399,59 @@ class chumArea(QtGui.QListWidget):
for c in chums: for c in chums:
c.changeTheme(theme) c.changeTheme(theme)
class PesterMoodHandler(QtCore.QObject):
def __init__(self, parent, *buttons):
QtCore.QObject.__init__(self)
self.buttons = {}
self.mainwindow = parent
for b in buttons:
self.buttons[b.mood.value()] = b
if b.mood.value() == self.mainwindow.profile().mood.value():
b.setSelected(True)
self.connect(b, QtCore.SIGNAL('clicked()'),
b, QtCore.SLOT('updateMood()'))
self.connect(b, QtCore.SIGNAL('moodUpdated(int)'),
self, QtCore.SLOT('updateMood(int)'))
def removeButtons(self):
for b in self.buttons.values():
b.close()
def showButtons(self):
for b in self.buttons.values():
b.show()
b.raise_()
@QtCore.pyqtSlot(int)
def updateMood(self, m):
oldmood = self.mainwindow.profile().mood
oldbutton = self.buttons[oldmood.value()]
newbutton = self.buttons[m]
oldbutton.setSelected(False)
newbutton.setSelected(True)
newmood = Mood(m)
self.mainwindow.userprofile.chat.mood = newmood
self.mainwindow.moodUpdated.emit()
class PesterMoodButton(QtGui.QPushButton):
def __init__(self, parent, **options):
icon = QtGui.QIcon(options["icon"])
QtGui.QPushButton.__init__(self, icon, options["text"], parent)
self.setFlat(True)
self.resize(*options["size"])
self.move(*options["loc"])
self.unselectedSheet = options["style"]
self.selectedSheet = options["selected"]
self.setStyleSheet(self.unselectedSheet)
self.mainwindow = parent
self.mood = Mood(options["mood"])
def setSelected(self, selected):
if selected:
self.setStyleSheet(self.selectedSheet)
else:
self.setStyleSheet(self.unselectedSheet)
@QtCore.pyqtSlot()
def updateMood(self):
self.moodUpdated.emit(self.mood.value())
moodUpdated = QtCore.pyqtSignal(int)
class MovingWindow(QtGui.QFrame): class MovingWindow(QtGui.QFrame):
def __init__(self, *x, **y): def __init__(self, *x, **y):
QtGui.QFrame.__init__(self, *x, **y) QtGui.QFrame.__init__(self, *x, **y)
@ -528,19 +593,19 @@ class PesterText(QtGui.QTextEdit):
parent = self.parent() parent = self.parent()
parent.setChumOpen(True) parent.setChumOpen(True)
window = parent.mainwindow window = parent.mainwindow
me = window.profile me = window.profile()
msg = chum.beganpestermsg(me) msg = chum.beganpestermsg(me)
self.append(msg) self.append(msg)
elif msg == "PESTERCHUM:CEASE": elif msg == "PESTERCHUM:CEASE":
parent = self.parent() parent = self.parent()
parent.setChumOpen(False) parent.setChumOpen(False)
window = parent.mainwindow window = parent.mainwindow
me = window.profile me = window.profile()
msg = chum.ceasedpestermsg(me) msg = chum.ceasedpestermsg(me)
self.append(msg) self.append(msg)
else: else:
if not self.parent().chumopen and chum is not self.parent().mainwindow.profile: if not self.parent().chumopen and chum is not self.parent().mainwindow.profile():
me = self.parent().mainwindow.profile me = self.parent().mainwindow.profile()
beginmsg = chum.beganpestermsg(me) beginmsg = chum.beganpestermsg(me)
self.parent().setChumOpen(True) self.parent().setChumOpen(True)
self.append(beginmsg) self.append(beginmsg)
@ -591,10 +656,14 @@ class PesterConvo(QtGui.QFrame):
if parent: if parent:
parent.addChat(self) parent.addChat(self)
if initiated: if initiated:
msg = self.mainwindow.profile.beganpestermsg(self.chum) msg = self.mainwindow.profile().beganpestermsg(self.chum)
self.textArea.append(msg) self.textArea.append(msg)
def updateMood(self, mood): def updateMood(self, mood):
if mood.name() == "offline":
msg = self.mainwindow.profile().ceasepestermsg(self.chum)
self.textArea.append(msg)
self.chumopen = False
if self.parent(): if self.parent():
self.parent().updateMood(self.chum.handle, mood) self.parent().updateMood(self.chum.handle, mood)
else: else:
@ -604,7 +673,7 @@ class PesterConvo(QtGui.QFrame):
self.chum.color = color self.chum.color = color
def addMessage(self, text, me=True): def addMessage(self, text, me=True):
if me: if me:
chum = self.mainwindow.profile chum = self.mainwindow.profile()
else: else:
chum = self.chum chum = self.chum
self.textArea.addMessage(text, chum) self.textArea.addMessage(text, chum)
@ -652,11 +721,9 @@ class PesterWindow(MovingWindow):
self.config = userConfig() self.config = userConfig()
if self.config.defaultprofile(): if self.config.defaultprofile():
self.userprofile = userProfile(self.config.defaultprofile()) self.userprofile = userProfile(self.config.defaultprofile())
self.profile = self.userprofile.chat
self.theme = self.userprofile.getTheme() self.theme = self.userprofile.getTheme()
else: else:
self.userprofile = userProfile(PesterProfile("pesterClient%d" % (random.randint(100,999)), QtGui.QColor("black"), Mood(0))) self.userprofile = userProfile(PesterProfile("pesterClient%d" % (random.randint(100,999)), QtGui.QColor("black"), Mood(0)))
self.profile = self.userprofile.chat
self.theme = self.userprofile.getTheme() self.theme = self.userprofile.getTheme()
self.changeProfile() self.changeProfile()
@ -705,9 +772,13 @@ class PesterWindow(MovingWindow):
self.connect(self.chumList, QtCore.SIGNAL('itemDoubleClicked(QListWidgetItem *)'), self.connect(self.chumList, QtCore.SIGNAL('itemDoubleClicked(QListWidgetItem *)'),
self, QtCore.SLOT('newConversationWindow(QListWidgetItem *)')) self, QtCore.SLOT('newConversationWindow(QListWidgetItem *)'))
self.moods = PesterMoodHandler(self, *[PesterMoodButton(self, **d) for d in self.theme["main/moods"]])
self.convos = {} self.convos = {}
self.tabconvo = None self.tabconvo = None
self.optionmenu = None self.optionmenu = None
def profile(self):
return self.userprofile.chat
def mainSS(self): def mainSS(self):
self.setStyleSheet("QFrame#main { "+self.theme["main/style"]+" }") self.setStyleSheet("QFrame#main { "+self.theme["main/style"]+" }")
def menuBarSS(self): def menuBarSS(self):
@ -792,6 +863,10 @@ class PesterWindow(MovingWindow):
self.miniButton.move(*self.theme["main/minimize/loc"]) self.miniButton.move(*self.theme["main/minimize/loc"])
# chum area # chum area
self.chumList.changeTheme(theme) self.chumList.changeTheme(theme)
# moods
self.moods.removeButtons()
self.moods = PesterMoodHandler(self, *[PesterMoodButton(self, **d) for d in self.theme["main/moods"]])
self.moods.showButtons()
# do open windows # do open windows
if self.tabconvo: if self.tabconvo:
self.tabconvo.changeTheme(theme) self.tabconvo.changeTheme(theme)
@ -889,16 +964,21 @@ class PesterWindow(MovingWindow):
if self.chooseprofile.profileBox and \ if self.chooseprofile.profileBox and \
self.chooseprofile.profileBox.currentIndex() > 0: self.chooseprofile.profileBox.currentIndex() > 0:
handle = unicode(self.chooseprofile.profileBox.currentText()) handle = unicode(self.chooseprofile.profileBox.currentText())
if handle == self.profile().handle:
return
self.userprofile = userProfile(handle) self.userprofile = userProfile(handle)
self.profile = self.userprofile.chat
self.changeTheme(self.userprofile.getTheme()) self.changeTheme(self.userprofile.getTheme())
else: else:
profile = PesterProfile(unicode(self.chooseprofile.chumHandle.text()), handle = unicode(self.chooseprofile.chumHandle.text())
self.chooseprofile.chumcolor, if handle == self.profile().handle:
Mood(0)) return
profile = PesterProfile(handle,
self.chooseprofile.chumcolor)
self.userprofile = userProfile.newUserProfile(profile) self.userprofile = userProfile.newUserProfile(profile)
self.profile = self.userprofile.chat
# is default?
if self.chooseprofile.defaultcheck.isChecked():
self.config.set("defaultprofile", self.userprofile.chat.handle)
# this may have to be fixed # this may have to be fixed
self.closeConversations() self.closeConversations()
self.profileChanged.emit() self.profileChanged.emit()
@ -935,13 +1015,14 @@ class PesterWindow(MovingWindow):
convoClosed = QtCore.pyqtSignal(QtCore.QString) convoClosed = QtCore.pyqtSignal(QtCore.QString)
profileChanged = QtCore.pyqtSignal() profileChanged = QtCore.pyqtSignal()
moodRequest = QtCore.pyqtSignal(PesterProfile) moodRequest = QtCore.pyqtSignal(PesterProfile)
moodUpdated = QtCore.pyqtSignal()
class PesterIRC(QtCore.QObject): class PesterIRC(QtCore.QObject):
def __init__(self, window): def __init__(self, window):
QtCore.QObject.__init__(self) QtCore.QObject.__init__(self)
self.mainwindow = window self.mainwindow = window
def IRCConnect(self): def IRCConnect(self):
self.cli = IRCClient(PesterHandler, host="irc.tymoon.eu", port=6667, nick=self.mainwindow.profile.handle, blocking=True) self.cli = IRCClient(PesterHandler, host="irc.tymoon.eu", port=6667, nick=self.mainwindow.profile().handle, blocking=True)
self.cli.command_handler.parent = self self.cli.command_handler.parent = self
self.cli.command_handler.mainwindow = self.mainwindow self.cli.command_handler.mainwindow = self.mainwindow
self.conn = self.cli.connect() self.conn = self.cli.connect()
@ -960,16 +1041,20 @@ class PesterIRC(QtCore.QObject):
h = str(handle) h = str(handle)
if initiated: if initiated:
helpers.msg(self.cli, h, "PESTERCHUM:BEGIN") helpers.msg(self.cli, h, "PESTERCHUM:BEGIN")
helpers.msg(self.cli, h, "COLOR >%s" % (self.mainwindow.profile.colorcmd())) helpers.msg(self.cli, h, "COLOR >%s" % (self.mainwindow.profile().colorcmd()))
@QtCore.pyqtSlot(QtCore.QString) @QtCore.pyqtSlot(QtCore.QString)
def endConvo(self, handle): def endConvo(self, handle):
h = str(handle) h = str(handle)
helpers.msg(self.cli, h, "PESTERCHUM:CEASE") helpers.msg(self.cli, h, "PESTERCHUM:CEASE")
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def updateProfile(self): def updateProfile(self):
me = self.mainwindow.profile me = self.mainwindow.profile()
handle = me.handle handle = me.handle
helpers.nick(self.cli, handle) helpers.nick(self.cli, handle)
self.updateMood()
@QtCore.pyqtSlot()
def updateMood(self):
me = self.mainwindow.profile()
helpers.msg(self.cli, "#pesterchum", "MOOD >%d" % (me.mood.value())) helpers.msg(self.cli, "#pesterchum", "MOOD >%d" % (me.mood.value()))
def updateIRC(self): def updateIRC(self):
self.conn.next() self.conn.next()
@ -995,8 +1080,8 @@ class PesterHandler(DefaultCommandHandler):
mood = Mood(0) mood = Mood(0)
self.parent.moodUpdated.emit(handle, mood) self.parent.moodUpdated.emit(handle, mood)
elif msg[0:7] == "GETMOOD": elif msg[0:7] == "GETMOOD":
mychumhandle = self.mainwindow.profile.handle mychumhandle = self.mainwindow.profile().handle
mymood = self.mainwindow.profile.mood.value() mymood = self.mainwindow.profile().mood.value()
if msg.find(mychumhandle, 8) != -1: if msg.find(mychumhandle, 8) != -1:
helpers.msg(self.client, "#pesterchum", helpers.msg(self.client, "#pesterchum",
"MOOD >%d" % (mymood)) "MOOD >%d" % (mymood))
@ -1004,7 +1089,7 @@ class PesterHandler(DefaultCommandHandler):
else: else:
# private message # private message
# silently ignore messages to yourself. # silently ignore messages to yourself.
if handle == self.mainwindow.profile.handle: if handle == self.mainwindow.profile().handle:
return return
if msg[0:7] == "COLOR >": if msg[0:7] == "COLOR >":
colors = msg[7:].split(",") colors = msg[7:].split(",")
@ -1020,8 +1105,8 @@ class PesterHandler(DefaultCommandHandler):
def welcome(self, server, nick, msg): def welcome(self, server, nick, msg):
helpers.join(self.client, "#pesterchum") helpers.join(self.client, "#pesterchum")
mychumhandle = self.mainwindow.profile.handle mychumhandle = self.mainwindow.profile().handle
mymood = self.mainwindow.profile.mood.value() mymood = self.mainwindow.profile().mood.value()
helpers.msg(self.client, "#pesterchum", "MOOD >%d" % (mymood)) helpers.msg(self.client, "#pesterchum", "MOOD >%d" % (mymood))
chums = self.mainwindow.chumList.chums chums = self.mainwindow.chumList.chums
@ -1030,11 +1115,20 @@ class PesterHandler(DefaultCommandHandler):
def nicknameinuse(self, server, cmd, nick, msg): def nicknameinuse(self, server, cmd, nick, msg):
helpers.nick(self.client, "pesterClient%d" % (random.randint(100,999))) helpers.nick(self.client, "pesterClient%d" % (random.randint(100,999)))
self.parent.nickCollision.emit(nick) self.parent.nickCollision.emit(nick)
def quit(self, nick, reason):
handle = nick[0:nick.find("!")]
self.parent.moodUpdated.emit(handle, Mood("offline"))
def nick(self, oldnick, newnick):
oldhandle = oldnick[0:oldnick.find("!")]
newchum = PesterProfile(newnick)
self.parent.moodUpdated.emit(oldhandle, Mood("offline"))
self.getMood(newchum)
def getMood(self, *chums): def getMood(self, *chums):
chumglub = "GETMOOD " chumglub = "GETMOOD "
for c in chums: for c in chums:
chandle = c.handle chandle = c.handle
if len(chumglub+chandle) >= 510: if len(chumglub+chandle) >= 350:
helpers.msg(self.client, "#pesterchum", chumglub) helpers.msg(self.client, "#pesterchum", chumglub)
chumglub = "GETMOOD " chumglub = "GETMOOD "
chumglub += chandle chumglub += chandle
@ -1079,6 +1173,10 @@ def main():
QtCore.SIGNAL('moodRequest(PyQt_PyObject)'), QtCore.SIGNAL('moodRequest(PyQt_PyObject)'),
irc, irc,
QtCore.SLOT('getMood(PyQt_PyObject)')) QtCore.SLOT('getMood(PyQt_PyObject)'))
irc.connect(widget,
QtCore.SIGNAL('moodUpdated()'),
irc,
QtCore.SLOT('updateMood()'))
irc.connect(irc, irc.connect(irc,
QtCore.SIGNAL('moodUpdated(QString, PyQt_PyObject)'), QtCore.SIGNAL('moodUpdated(QString, PyQt_PyObject)'),
widget, widget,

View file

@ -1 +1 @@
{"color": "#00aaff", "theme": "trollian", "quirks": [], "handle": "superGhost"} {"color": "#00aaff", "theme": "pesterchum", "quirks": [], "handle": "superGhost"}

View file

@ -12,20 +12,96 @@
}, },
"chums": { "style": "background-color: black;color: white;font: bold;font-family: 'Courier New';selection-background-color:#919191; ", "chums": { "style": "background-color: black;color: white;font: bold;font-family: 'Courier New';selection-background-color:#919191; ",
"loc": [20, 65], "loc": [20, 65],
"size": [265, 400], "size": [265, 350],
"moods": { "chummy": { "icon": "$path/chummy.gif", "moods": { "chummy": { "icon": "$path/chummy.gif",
"color": "white" }, "color": "white" },
"offline": { "icon": "$path/offline.gif", "offline": { "icon": "$path/offline.gif",
"color": "#919191"}, "color": "#919191"},
"rancorous": { "icon": "$path/rancorous.gif", "rancorous": { "icon": "$path/rancorous.gif",
"color": "red" } "color": "red" },
"detestful": { "icon": "$path/detestful.gif",
"color": "red" },
"devious": { "icon": "$path/devious.gif",
"color": "white" },
"discontent": { "icon": "$path/discontent.gif",
"color": "white" },
"distraught": { "icon": "$path/distraught.gif",
"color": "white" },
"ecstatic": { "icon": "$path/estatic.gif",
"color": "white" },
"pleasant": { "icon": "$path/pleasant.gif",
"color": "white" },
"relaxed": { "icon": "$path/relaxed.gif",
"color": "white" },
"sleek": { "icon": "$path/sleek.gif",
"color": "white" },
"smooth": { "icon": "$path/smooth.gif",
"color": "white" },
"unruly": { "icon": "$path/unruly.gif",
"color": "white" }
} }
}, },
"defaultwindow": { "style": "background: #fdb302; font-family:'Courier New';font:bold;selection-background-color:#919191; " "defaultwindow": { "style": "background: #fdb302; font-family:'Courier New';font:bold;selection-background-color:#919191; "
}, },
"labels": { "mychumhandle": "MYCHUMHANDLE" }, "labels": { "mychumhandle": "MYCHUMHANDLE" },
"elements": [ "defaultmood": 0,
{ "style": "" } "moods": [
{ "style": "text-align:left; background: white; border:3px solid black; padding: 5px;color:#919191;",
"selected": "text-align:left; background: white; border:3px solid black; padding: 5px;font: bold;",
"loc": [20, 470],
"size": [133, 30],
"text": "CHUMMY",
"icon": "$path/chummy.gif",
"mood": 0
},
{ "style": "text-align:left; background: white; border:3px solid black; padding: 5px;color: #919191",
"selected": "text-align:left; background: white; border:3px solid black; padding: 5px;font: bold;",
"loc": [20, 497],
"size": [133, 30],
"text": "PLEASANT",
"icon": "$path/pleasant.gif",
"mood": 3
},
{ "style": "text-align:left; background: white; border:3px solid black; padding: 5px;color:#919191;",
"selected": "text-align:left; background: white; border:3px solid black; padding: 5px;font: bold;",
"loc": [20, 524],
"size": [133, 30],
"text": "DISTRAUGHT",
"icon": "$path/distraught.gif",
"mood": 4
},
{ "style": "text-align:left; background: white; border:3px solid black; padding: 5px;color:#919191;",
"selected": "text-align:left; background: white; border:3px solid black; padding: 5px;font: bold;",
"loc": [150, 470],
"size": [133, 30],
"text": "UNRULY",
"icon": "$path/unruly.gif",
"mood": 5
},
{ "style": "text-align:left; background: white; border:3px solid black; padding: 5px;color:#919191;",
"selected": "text-align:left; background: white; border:3px solid black; padding: 5px;font: bold;",
"loc": [150, 497],
"size": [133, 30],
"text": "SMOOTH",
"icon": "$path/smooth.gif",
"mood": 6
},
{ "style": "text-align:left; background: red; border:3px solid black; padding: 5px;",
"selected": "text-align:left; background: red; border:3px solid black; padding: 5px;font: bold;",
"loc": [150, 524],
"size": [133, 30],
"text": "RANCOROUS",
"icon": "$path/rancorous.gif",
"mood": 1
},
{ "style": "text-align:center; background: #919191; border:3px solid black; padding: 5px;",
"selected": "text-align:center; background: #919191; border:3px solid black; padding: 5px;font: bold;",
"loc": [20, 551],
"size": [263, 30],
"text": "ABSCOND",
"icon": "$path/offline.gif",
"mood": 2
}
] ]
}, },
"convo": "convo":

View file

@ -1,31 +1,107 @@
{"main": {"main":
{"style": "background-image:url($path/tnbg2.png);", {"style": "background-image:url($path/tnbg2.png);",
"size": [300, 620], "size": [300, 620],
"icon": "$path/trayicon3.gif", "icon": "$path/trayicon3.png",
"close": { "image": "$path/x.gif", "close": { "image": "$path/x.gif",
"loc": [255, 0]}, "loc": [275, 0]},
"minimize": { "image": "$path/m.gif", "minimize": { "image": "$path/m.gif",
"loc": [225, 0]}, "loc": [255, 0]},
"menubar": { "style": "font-family: 'Courier New'; font-weight: bold; font-size: 12px;" }, "menubar": { "style": "font-family: 'Courier New'; font-weight: bold; font-size: 12px;" },
"menu" : { "style": "font-family: 'Courier New'; font-weight: bold; font-size: 12px; background-color: #e5000f; border:2px solid #ff0000", "menu" : { "style": "font-family: 'Courier New'; font-weight: bold; font-size: 12px; background-color: #e5000f; border:2px solid #ff0000",
"selected": "background-color: #ff0000" "selected": "background-color: #ff0000"
}, },
"chums": { "style": "background-color: white;color: black;font: bold;font-family: 'Courier New';selection-background-color:#ffb6b6; ", "chums": { "style": "background-color: black;color: white;font: bold;font-family: 'Courier New';selection-background-color:#ffb6b6; ",
"loc": [20, 65], "loc": [20, 65],
"size": [265, 450], "size": [266, 350],
"moods": { "chummy": { "icon": "$path/chummy.gif", "moods": { "chummy": { "icon": "$path/chummy.gif",
"color": "black" }, "color": "white" },
"offline": { "icon": "$path/offline.gif", "offline": { "icon": "$path/offline.gif",
"color": "#dbdbdb"}, "color": "#919191"},
"rancorous": { "icon": "$path/rancorous.gif", "rancorous": { "icon": "$path/rancorous.gif",
"color": "red" } "color": "red" },
"detestful": { "icon": "$path/detestful.gif",
"color": "red" },
"devious": { "icon": "$path/devious.gif",
"color": "white" },
"discontent": { "icon": "$path/discontent.gif",
"color": "white" },
"distraught": { "icon": "$path/distraught.gif",
"color": "white" },
"ecstatic": { "icon": "$path/estatic.gif",
"color": "white" },
"pleasant": { "icon": "$path/pleasant.gif",
"color": "white" },
"relaxed": { "icon": "$path/relaxed.gif",
"color": "white" },
"sleek": { "icon": "$path/sleek.gif",
"color": "white" },
"smooth": { "icon": "$path/smooth.gif",
"color": "white" },
"unruly": { "icon": "$path/unruly.gif",
"color": "white" }
} }
}, },
"defaultwindow": { "style": "background: #e5000f; font-family:'Courier New';font:bold;selection-background-color:#ffb6b6; " "defaultwindow": { "style": "background: #e5000f; font-family:'Courier New';font:bold;selection-background-color:#ffb6b6; "
}, },
"labels": { "mychumhandle": "MYTROLLTAG" }, "labels": { "mychumhandle": "MYTROLLTAG" },
"elements": [ "defaultmood": 7,
{ "style": "" } "moods": [
{ "style": "text-align:left; background: black; border:3px solid black; padding: 5px;color:#dbdbdb;",
"selected": "text-align:left; background: white; border:3px solid black; padding: 5px;font: bold;",
"loc": [20, 470],
"size": [133, 30],
"text": "ECSTATIC",
"icon": "$path/estatic.gif",
"mood": 7
},
{ "style": "text-align:left; background: black; border:3px solid black; padding: 5px;color: #dbdbdb",
"selected": "text-align:left; background: white; border:3px solid black; padding: 5px;font: bold;",
"loc": [20, 497],
"size": [133, 30],
"text": "RELAXED",
"icon": "$path/relaxed.gif",
"mood": 8
},
{ "style": "text-align:left; background: black; border:3px solid black; padding: 5px;color:#dbdbdb;",
"selected": "text-align:left; background: white; border:3px solid black; padding: 5px;font: bold;",
"loc": [20, 524],
"size": [133, 30],
"text": "DISCONTENT",
"icon": "$path/discontent.gif",
"mood": 9
},
{ "style": "text-align:left; background: black; border:3px solid black; padding: 5px;color:#dbdbdb;",
"selected": "text-align:left; background: white; border:3px solid black; padding: 5px;font: bold;",
"loc": [150, 470],
"size": [133, 30],
"text": "DEVIOUS",
"icon": "$path/devious.gif",
"mood": 10
},
{ "style": "text-align:left; background: black; border:3px solid black; padding: 5px;color:#dbdbdb;",
"selected": "text-align:left; background: white; border:3px solid black; padding: 5px;font: bold;",
"loc": [150, 497],
"size": [133, 30],
"text": "SLEEK",
"icon": "$path/sleek.gif",
"mood": 11
},
{ "style": "text-align:left; background: red; border:3px solid black; padding: 5px;",
"selected": "text-align:left; background: red; border:3px solid black; padding: 5px;font: bold;",
"loc": [150, 524],
"size": [133, 30],
"text": "DETESTFUL",
"icon": "$path/detestful.gif",
"mood": 12
},
{ "style": "text-align:center; background: #919191; border:3px solid black; padding: 5px;",
"selected": "text-align:center; background: #919191; border:3px solid black; padding: 5px;font: bold;",
"loc": [20, 551],
"size": [263, 30],
"text": "ABSCOND",
"icon": "$path/offline.gif",
"mood": 2
}
] ]
}, },
"convo": "convo":