frontends: define the constants with classes and inheritance instance of using __builtin__

This commit is contained in:
souliane 2013-11-23 10:21:40 +01:00
commit f5dd3f2265
11 changed files with 169 additions and 95 deletions

View file

@ -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 <http://www.gnu.org/licenses/>.
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")
}

View file

@ -16,59 +16,65 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
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")
}

View file

@ -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:

View file

@ -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#

View file

@ -16,6 +16,10 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import __builtin__
__builtin__.__dict__['const_PRIVATE_PREFIX'] = "@PRIVATE@"
from sat_frontends import constants
class Const(constants.Const):
PRIVATE_PREFIX = "@PRIVATE@"

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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 <http://www.gnu.org/licenses/>.
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")
]

View file

@ -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

View file

@ -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