diff --git a/frontends/src/constants.py b/frontends/src/constants.py
new file mode 100644
index 00000000..650cbaf4
--- /dev/null
+++ b/frontends/src/constants.py
@@ -0,0 +1,34 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Primitivus: a SAT frontend
+# Copyright (C) 2009, 2010, 2011, 2012, 2013 Jérôme Poisson (goffi@goffi.org)
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+
+
+try:
+ _("dummy")
+except: # libervia doesn't allow to explicit the exception here
+ _ = lambda text: text
+
+class Const(object):
+
+ # TODO: find a way to merge it with the ones of primitivus and wix
+ PRESENCE = {"": _("Online"),
+ "chat": _("Free for chat"),
+ "away": _("Away from keyboard"),
+ "dnd": _("Do not disturb"),
+ "xa": _("Away")
+ }
diff --git a/frontends/src/primitivus/constants.py b/frontends/src/primitivus/constants.py
index 02dd767e..b496ee93 100644
--- a/frontends/src/primitivus/constants.py
+++ b/frontends/src/primitivus/constants.py
@@ -16,59 +16,65 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
-import __builtin__
-__builtin__.__dict__['const_APP_NAME'] = "Primitivus"
-__builtin__.__dict__['const_PALETTE'] = [
- ('title', 'black', 'light gray', 'standout,underline'),
- ('title_focus', 'white,bold', 'light gray', 'standout,underline'),
- ('selected', 'default', 'dark red'),
- ('selected_focus', 'default,bold', 'dark red'),
- ('default', 'default', 'default'),
- ('default_focus', 'default,bold', 'default'),
- ('alert', 'default,underline', 'default'),
- ('alert_focus', 'default,bold,underline', 'default'),
- ('date', 'light gray', 'default'),
- ('my_nick', 'dark red,bold', 'default'),
- ('other_nick', 'dark cyan,bold', 'default'),
- ('menubar', 'light gray,bold', 'dark red'),
- ('menubar_focus', 'light gray,bold', 'dark green'),
- ('selected_menu', 'light gray,bold', 'dark green'),
- ('menuitem', 'light gray,bold', 'dark red'),
- ('menuitem_focus', 'light gray,bold', 'dark green'),
- ('notifs', 'black,bold', 'yellow'),
- ('notifs_focus', 'dark red', 'yellow'),
- ('card_neutral', 'dark gray', 'white', 'standout,underline'),
- ('card_neutral_selected', 'dark gray', 'dark green', 'standout,underline'),
- ('card_special', 'brown', 'white', 'standout,underline'),
- ('card_special_selected', 'brown', 'dark green', 'standout,underline'),
- ('card_red', 'dark red', 'white', 'standout,underline'),
- ('card_red_selected', 'dark red', 'dark green', 'standout,underline'),
- ('card_black', 'black', 'white', 'standout,underline'),
- ('card_black_selected', 'black', 'dark green', 'standout,underline'),
- ('directory', 'dark cyan, bold', 'default'),
- ('directory_focus', 'dark cyan, bold', 'dark green'),
- ('separator', 'brown', 'default'),
- ('warning', 'light red', 'default'),
- ('progress_normal', 'default', 'black'),
- ('progress_complete', 'default', 'light red'),
- ('show_disconnected', 'dark gray', 'default'),
- ('show_normal', 'default', 'default'),
- ('show_normal_focus', 'default, bold', 'default'),
- ('show_chat', 'dark green', 'default'),
- ('show_chat_focus', 'dark green, bold', 'default'),
- ('show_away', 'brown', 'default'),
- ('show_away_focus', 'brown, bold', 'default'),
- ('show_dnd', 'dark red', 'default'),
- ('show_dnd_focus', 'dark red, bold', 'default'),
- ('show_xa', 'dark red', 'default'),
- ('show_xa_focus', 'dark red, bold', 'default'),
- ('status', 'yellow', 'default'),
- ('status_focus', 'yellow, bold', 'default'),
- ]
-__builtin__.__dict__['const_SHOW_ICON'] = {"unavailable": (u'⨯', "show_disconnected"),
- "": (u'✔', "show_normal"),
- "chat": (u'✆', "show_chat"),
- "away": (u'✈', "show_away"),
- "dnd": (u'✖', "show_dnd"),
- "xa": (u'☄', "show_xa")}
+from sat_frontends.quick_frontend import constants
+
+
+class Const(constants.Const):
+
+ APP_NAME = "Primitivus"
+ PALETTE = [
+ ('title', 'black', 'light gray', 'standout,underline'),
+ ('title_focus', 'white,bold', 'light gray', 'standout,underline'),
+ ('selected', 'default', 'dark red'),
+ ('selected_focus', 'default,bold', 'dark red'),
+ ('default', 'default', 'default'),
+ ('default_focus', 'default,bold', 'default'),
+ ('alert', 'default,underline', 'default'),
+ ('alert_focus', 'default,bold,underline', 'default'),
+ ('date', 'light gray', 'default'),
+ ('my_nick', 'dark red,bold', 'default'),
+ ('other_nick', 'dark cyan,bold', 'default'),
+ ('menubar', 'light gray,bold', 'dark red'),
+ ('menubar_focus', 'light gray,bold', 'dark green'),
+ ('selected_menu', 'light gray,bold', 'dark green'),
+ ('menuitem', 'light gray,bold', 'dark red'),
+ ('menuitem_focus', 'light gray,bold', 'dark green'),
+ ('notifs', 'black,bold', 'yellow'),
+ ('notifs_focus', 'dark red', 'yellow'),
+ ('card_neutral', 'dark gray', 'white', 'standout,underline'),
+ ('card_neutral_selected', 'dark gray', 'dark green', 'standout,underline'),
+ ('card_special', 'brown', 'white', 'standout,underline'),
+ ('card_special_selected', 'brown', 'dark green', 'standout,underline'),
+ ('card_red', 'dark red', 'white', 'standout,underline'),
+ ('card_red_selected', 'dark red', 'dark green', 'standout,underline'),
+ ('card_black', 'black', 'white', 'standout,underline'),
+ ('card_black_selected', 'black', 'dark green', 'standout,underline'),
+ ('directory', 'dark cyan, bold', 'default'),
+ ('directory_focus', 'dark cyan, bold', 'dark green'),
+ ('separator', 'brown', 'default'),
+ ('warning', 'light red', 'default'),
+ ('progress_normal', 'default', 'black'),
+ ('progress_complete', 'default', 'light red'),
+ ('show_disconnected', 'dark gray', 'default'),
+ ('show_normal', 'default', 'default'),
+ ('show_normal_focus', 'default, bold', 'default'),
+ ('show_chat', 'dark green', 'default'),
+ ('show_chat_focus', 'dark green, bold', 'default'),
+ ('show_away', 'brown', 'default'),
+ ('show_away_focus', 'brown, bold', 'default'),
+ ('show_dnd', 'dark red', 'default'),
+ ('show_dnd_focus', 'dark red, bold', 'default'),
+ ('show_xa', 'dark red', 'default'),
+ ('show_xa_focus', 'dark red, bold', 'default'),
+ ('status', 'yellow', 'default'),
+ ('status_focus', 'yellow, bold', 'default'),
+ ]
+ PRESENCE = {"unavailable": (u'⨯', "show_disconnected"),
+ "": (u'✔', "show_normal"),
+ "chat": (u'✆', "show_chat"),
+ "away": (u'✈', "show_away"),
+ "dnd": (u'✖', "show_dnd"),
+ "xa": (u'☄', "show_xa")
+ }
+
diff --git a/frontends/src/primitivus/contact_list.py b/frontends/src/primitivus/contact_list.py
index b9794707..45a5b774 100644
--- a/frontends/src/primitivus/contact_list.py
+++ b/frontends/src/primitivus/contact_list.py
@@ -22,7 +22,7 @@ from urwid_satext import sat_widgets
from sat_frontends.quick_frontend.quick_contact_list import QuickContactList
from sat_frontends.quick_frontend.quick_utils import escapePrivate, unescapePrivate
from sat.tools.jid import JID
-
+from sat_frontends.primitivus.constants import Const
class ContactList(urwid.WidgetWrap, QuickContactList):
signals = ['click','change']
@@ -87,7 +87,7 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
# contact group
value = widget.getValue()
elif isinstance(widget, sat_widgets.SelectableText):
- if widget.data.startswith(const_PRIVATE_PREFIX):
+ if widget.data.startswith(Const.PRIVATE_PREFIX):
# muc private dialog
value = widget.getValue()
else:
@@ -137,7 +137,7 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
widgets = [] #list of built widgets
for contact in contacts:
- if contact.startswith(const_PRIVATE_PREFIX):
+ if contact.startswith(Const.PRIVATE_PREFIX):
contact_disp = ('alert' if contact in self.alert_jid else "show_normal", unescapePrivate(contact))
show_icon = ''
status = ''
@@ -152,7 +152,7 @@ class ContactList(urwid.WidgetWrap, QuickContactList):
if (not self.show_disconnected and show == "unavailable"
and not contact in self.alert_jid and contact != self.selected):
continue
- show_icon, show_attr = const_SHOW_ICON.get(show,('','default'))
+ show_icon, show_attr = Const.PRESENCE.get(show, ('', 'default'))
contact_disp = ('alert' if contact in self.alert_jid else show_attr, nick or name or jid.node or jid.bare)
display = [ show_icon + " " , contact_disp]
if self.show_status:
diff --git a/frontends/src/primitivus/primitivus b/frontends/src/primitivus/primitivus
index 1276e02d..61fec258 100755
--- a/frontends/src/primitivus/primitivus
+++ b/frontends/src/primitivus/primitivus
@@ -32,7 +32,7 @@ from sat_frontends.primitivus.xmlui import XMLUI
from sat_frontends.primitivus.progress import Progress
from sat_frontends.primitivus.notify import Notify
from sat_frontends.tools.misc import InputHistory
-import sat_frontends.primitivus.constants
+from sat_frontends.primitivus.constants import Const
import logging
from logging import debug, info, error
from sat.tools.jid import JID
@@ -151,7 +151,7 @@ class PrimitivusApp(QuickApp, InputHistory):
## main loop setup ##
self.main_widget = ProfileManager(self)
- self.loop = urwid.MainLoop(self.main_widget, const_PALETTE, event_loop=urwid.GLibEventLoop(), input_filter=self.inputFilter, unhandled_input=self.keyHandler)
+ self.loop = urwid.MainLoop(self.main_widget, const.PALETTE, event_loop=urwid.GLibEventLoop(), input_filter=self.inputFilter, unhandled_input=self.keyHandler)
##misc setup##
self.chat_wins = ChatList(self)
@@ -590,7 +590,7 @@ class PrimitivusApp(QuickApp, InputHistory):
self.showPopUp(pop_up_widget)
def onAboutRequest(self, menu):
- self.showPopUp(sat_widgets.Alert(_("About"), const_APP_NAME + " v" + self.bridge.getVersion(), ok_cb=self.removePopUp))
+ self.showPopUp(sat_widgets.Alert(_("About"), const.APP_NAME + " v" + self.bridge.getVersion(), ok_cb=self.removePopUp))
#MISC CALLBACKS#
diff --git a/frontends/src/quick_frontend/constants.py b/frontends/src/quick_frontend/constants.py
index 96ef057b..506bc4bb 100644
--- a/frontends/src/quick_frontend/constants.py
+++ b/frontends/src/quick_frontend/constants.py
@@ -16,6 +16,10 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
-import __builtin__
-__builtin__.__dict__['const_PRIVATE_PREFIX'] = "@PRIVATE@"
+from sat_frontends import constants
+
+
+class Const(constants.Const):
+
+ PRIVATE_PREFIX = "@PRIVATE@"
diff --git a/frontends/src/quick_frontend/quick_app.py b/frontends/src/quick_frontend/quick_app.py
index e3d62d6a..df76c904 100644
--- a/frontends/src/quick_frontend/quick_app.py
+++ b/frontends/src/quick_frontend/quick_app.py
@@ -25,7 +25,7 @@ from sat.core.exceptions import BridgeExceptionNoService, BridgeInitError
from sat_frontends.quick_frontend.quick_utils import escapePrivate, unescapePrivate
from optparse import OptionParser
-import sat_frontends.quick_frontend.constants
+from sat_frontends.quick_frontend.constants import Const
import gettext
gettext.install('sat_frontend', unicode=True)
@@ -283,7 +283,7 @@ class QuickApp(object):
self.chat_wins[win.bare].printMessage(from_jid, msg, profile, float(timestamp) if timestamp else '')
def sendMessage(self, to_jid, message, subject='', mess_type="auto", extra={}, profile_key="@NONE@"):
- if to_jid.startswith(const_PRIVATE_PREFIX):
+ if to_jid.startswith(Const.PRIVATE_PREFIX):
to_jid = unescapePrivate(to_jid)
mess_type = "chat"
self.bridge.sendMessage(to_jid, message, subject, mess_type, extra, profile_key)
diff --git a/frontends/src/quick_frontend/quick_chat.py b/frontends/src/quick_frontend/quick_chat.py
index 9382721d..8d4adfda 100644
--- a/frontends/src/quick_frontend/quick_chat.py
+++ b/frontends/src/quick_frontend/quick_chat.py
@@ -20,6 +20,7 @@
from logging import debug, info, warning, error
from sat.tools.jid import JID
from sat_frontends.quick_frontend.quick_utils import unescapePrivate
+from sat_frontends.quick_frontend.constants import Const
class QuickChat(object):
@@ -107,7 +108,7 @@ class QuickChat(object):
def onHistoryError(err):
error (_("Can't get history"))
- if self.target.startswith(const_PRIVATE_PREFIX):
+ if self.target.startswith(Const.PRIVATE_PREFIX):
target = unescapePrivate(self.target)
else:
target = self.target.bare
@@ -116,9 +117,9 @@ class QuickChat(object):
def _get_nick(self, jid):
"""Return nick of this jid when possible"""
- if self.target.startswith(const_PRIVATE_PREFIX):
+ if self.target.startswith(Const.PRIVATE_PREFIX):
unescaped = unescapePrivate(self.target)
- if jid.startswith(const_PRIVATE_PREFIX) or unescaped.bare == jid.bare:
+ if jid.startswith(Const.PRIVATE_PREFIX) or unescaped.bare == jid.bare:
return unescaped.resource
return jid.resource if self.type == "group" else (self.host.contact_list.getCache(jid,'nick') or self.host.contact_list.getCache(jid,'name') or jid.node)
diff --git a/frontends/src/quick_frontend/quick_utils.py b/frontends/src/quick_frontend/quick_utils.py
index 17d56e59..44d7543b 100644
--- a/frontends/src/quick_frontend/quick_utils.py
+++ b/frontends/src/quick_frontend/quick_utils.py
@@ -19,15 +19,16 @@
from sat.tools.jid import JID
from os.path import exists, splitext
+from sat_frontends.quick_frontend.constants import Const
def escapePrivate(ori_jid):
"""Escape a private jid"""
- return JID(const_PRIVATE_PREFIX + ori_jid.bare + '@' + ori_jid.resource)
+ return JID(Const.PRIVATE_PREFIX + ori_jid.bare + '@' + ori_jid.resource)
def unescapePrivate(escaped_jid):
- if not escaped_jid.startswith(const_PRIVATE_PREFIX):
+ if not escaped_jid.startswith(Const.PRIVATE_PREFIX):
return escaped_jid
- escaped_split = tuple(escaped_jid[len(const_PRIVATE_PREFIX):].split('@'))
+ escaped_split = tuple(escaped_jid[len(Const.PRIVATE_PREFIX):].split('@'))
assert(len(escaped_split) == 3)
return JID("%s@%s/%s" % escaped_split)
diff --git a/frontends/src/wix/constants.py b/frontends/src/wix/constants.py
index e0cd5261..39def933 100644
--- a/frontends/src/wix/constants.py
+++ b/frontends/src/wix/constants.py
@@ -1,17 +1,44 @@
-import sys,os.path
-import __builtin__
-import sat_frontends.wix
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Primitivus: a SAT frontend
+# Copyright (C) 2009, 2010, 2011, 2012, 2013 Jérôme Poisson (goffi@goffi.org)
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+
+import sys
+import os.path
+import gettext
+import sat_frontends.wix
+from sat_frontends.quick_frontend import constants
+
+
+_ = gettext.gettext
wix_root = os.path.dirname(sat_frontends.wix.__file__)
-__builtin__.__dict__['APP_NAME'] = "Wix"
-__builtin__.__dict__['LICENCE_PATH'] = os.path.join(wix_root,"COPYING")
-__builtin__.__dict__['msgOFFLINE'] = _("offline")
-__builtin__.__dict__['msgONLINE'] = _("online")
-__builtin__.__dict__['const_DEFAULT_GROUP'] = "Unclassed"
-__builtin__.__dict__['const_STATUS'] = [("", _("Online"), None),
- ("chat", _("Free for chat"), "green"),
- ("away", _("AFK"), "brown"),
- ("dnd", _("DND"), "red"),
- ("xa", _("Away"), "red")]
+class Const(constants.Const):
+
+ APP_NAME = "Wix"
+ LICENCE_PATH = os.path.join(wix_root, "COPYING")
+ msgOFFLINE = _("offline")
+ msgONLINE = _("online")
+ DEFAULT_GROUP = "Unclassed"
+ PRESENCE = [("", _("Online"), None),
+ ("chat", _("Free for chat"), "green"),
+ ("away", _("AFK"), "brown"),
+ ("dnd", _("DND"), "red"),
+ ("xa", _("Away"), "red")
+ ]
+
diff --git a/frontends/src/wix/contact_list.py b/frontends/src/wix/contact_list.py
index e051fd68..5ac75188 100644
--- a/frontends/src/wix/contact_list.py
+++ b/frontends/src/wix/contact_list.py
@@ -19,6 +19,7 @@
import wx
from sat_frontends.quick_frontend.quick_contact_list import QuickContactList
+from sat_frontends.wix.constants import Const
from logging import debug, info, error
from cgi import escape
from sat.tools.jid import JID
@@ -113,7 +114,7 @@ class ContactList(wx.SimpleHtmlListBox, QuickContactList):
_show = self.getCache(jid,'show')
if _show == None or _show == 'unavailable':
return None
- show = filter(lambda x : x[0] == _show, const_STATUS)[0]
+ show = filter(lambda x : x[0] == _show, Const.PRESENCE)[0]
#show[0]==shortcut
#show[1]==human readable
diff --git a/frontends/src/wix/main_window.py b/frontends/src/wix/main_window.py
index c65ead4b..4b66b9cf 100644
--- a/frontends/src/wix/main_window.py
+++ b/frontends/src/wix/main_window.py
@@ -31,7 +31,7 @@ from sat_frontends.wix.profile_manager import ProfileManager
import os.path
from sat.tools.jid import JID
from logging import debug, info, warning, error
-import sat_frontends.wix.constants
+from sat_frontends.wix.constants import Const
idCONNECT,\
idDISCONNECT,\
@@ -72,7 +72,7 @@ class MainWindow(wx.Frame, QuickApp):
#ToolBar
self.tools=self.CreateToolBar()
- self.statusBox = wx.ComboBox(self.tools, -1, "Online", choices=[status[1] for status in const_STATUS],
+ self.statusBox = wx.ComboBox(self.tools, -1, "Online", choices=[status[1] for status in Const.PRESENCE],
style=wx.CB_DROPDOWN | wx.CB_READONLY)
self.tools.AddControl(self.statusBox)
self.tools.AddSeparator()
@@ -122,7 +122,7 @@ class MainWindow(wx.Frame, QuickApp):
connectMenu.Append(idDISCONNECT, _("&Disconnect CTRL-d"),_(" Disconnect from the server"))
connectMenu.Append(idPARAM,_("&Parameters"),_(" Configure the program"))
connectMenu.AppendSeparator()
- connectMenu.Append(idABOUT,_("A&bout"),_(" About %s") % APP_NAME)
+ connectMenu.Append(idABOUT, _("A&bout"), _(" About %s") % Const.APP_NAME)
connectMenu.Append(idEXIT,_("E&xit"),_(" Terminate the program"))
contactMenu = wx.Menu()
contactMenu.Append(idADD_CONTACT, _("&Add contact"),_(" Add a contact to your list"))
@@ -212,10 +212,10 @@ class MainWindow(wx.Frame, QuickApp):
def setStatusOnline(self, online=True):
"""enable/disable controls, must be called when local user online status change"""
if online:
- self.SetStatusText(msgONLINE)
+ self.SetStatusText(Const.msgONLINE)
self.tools.Enable()
else:
- self.SetStatusText(msgOFFLINE)
+ self.SetStatusText(Const.msgOFFLINE)
self.tools.Disable()
return
@@ -351,7 +351,7 @@ class MainWindow(wx.Frame, QuickApp):
self.bridge.disconnect(self.profile)
def __updateStatus(self):
- show = filter(lambda x:x[1] == self.statusBox.GetValue(), const_STATUS)[0][0]
+ show = filter(lambda x:x[1] == self.statusBox.GetValue(), Const.PRESENCE)[0][0]
status = self.statusTxt.GetValue()
self.bridge.setPresence(show=show, statuses={'default':status}, profile_key=self.profile) #FIXME: manage multilingual statuses
@@ -367,15 +367,15 @@ class MainWindow(wx.Frame, QuickApp):
def onAbout(self, e):
about = wx.AboutDialogInfo()
- about.SetName(APP_NAME)
+ about.SetName(Const.APP_NAME)
about.SetVersion (unicode(self.bridge.getVersion()))
about.SetCopyright(u"(C) 2009, 2010, 2011, 2012, 2013 Jérôme Poisson aka Goffi")
about.SetDescription( _(u"%(name)s is a SàT (Salut à Toi) frontend\n"+
- u"%(name)s is based on WxPython, and is the standard graphic interface of SàT") % {'name':APP_NAME})
+ u"%(name)s is based on WxPython, and is the standard graphic interface of SàT") % {'name': Const.APP_NAME})
about.SetWebSite(("http://www.goffi.org", "Goffi's non-hebdo (french)"))
about.SetDevelopers([ "Goffi (Jérôme Poisson)"])
try:
- with open(LICENCE_PATH,"r") as licence:
+ with open(Const.LICENCE_PATH, "r") as licence:
about.SetLicence(''.join(licence.readlines()))
except:
pass