Mercurial > libervia-backend
view frontends/primitivus/primitivus @ 119:ded2431cea5a
Primitivus: chat window / text sending.
Primitivus has now the most basics features \o/
- core: new getVersion method
- primitivus: new debug key (C-d), only work if SàT is in dev version (D in version)
- quick_app: new post_init method, used for automatique task like auto-plug
- primitivus: lists now use genericList (Box) or List (Flow)
- primitivus: List now manage correctly its size
- primitivus: new FocusFrame widget which manage focus changing with 'tab'
- primitivus: advancedEdit now manage 'click' signal
- primitivus: contactList now manager 'change' and 'click' signals
- primitivus: Chat window now working
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 05 Jul 2010 19:13:36 +0800 |
parents | 76055a209ed9 |
children | 1ca5f254ce41 |
line wrap: on
line source
#!/usr/bin/python # -*- coding: utf-8 -*- """ Primitivus: a SAT frontend Copyright (C) 2009, 2010 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 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ from quick_frontend.quick_app import QuickApp from quick_frontend.quick_chat_list import QuickChatList from quick_frontend.quick_contact_list import QuickContactList from quick_frontend.quick_contact_management import QuickContactManagement import urwid from profile_manager import ProfileManager from contact_list import ContactList from chat import Chat from custom_widgets import AdvancedEdit,FocusFrame import pdb """from window import Window from editbox import EditBox from statusbar import StatusBar from chat import Chat from tools.jid import JID""" import logging from logging import debug, info, error #import locale import sys, os #from curses import ascii #import locale #from signal import signal, SIGWINCH #import fcntl #import struct #import termios #from boxsizer import BoxSizer ### logging configuration FIXME: put this elsewhere ### logging.basicConfig(level=logging.CRITICAL, #TODO: configure it to put messages in a log file format='%(message)s') ### const_APP_NAME = "Primitivus" const_PALETTE = [('title', 'black', 'light gray', 'standout,underline'), ('selected', 'default', 'dark red'), ('selected_focus', 'default,bold', 'dark red'), ('default', 'default', 'default'), ('default_focus', 'default,bold', 'default'), ] class ChatList(QuickChatList): """This class manage the list of chat windows""" def __init__(self, host): QuickChatList.__init__(self, host) def createChat(self, target): return Chat(target, self.host) class PrimitivusApp(QuickApp): def __init__(self): self.CM = QuickContactManagement() #FIXME: not the best place QuickApp.__init__(self) #XXX: yes it's an unusual place for the constructor of a parent class, but the init order is important ## main loop setup ## self.main_widget = ProfileManager(self) self.loop = urwid.MainLoop(self.main_widget, const_PALETTE, event_loop=urwid.GLibEventLoop(), unhandled_input=self.key_handler) ##misc setup## self.chat_wins=ChatList(self) def debug(self): """convenience method to reset screen and launch pdb""" import os os.system('reset') print 'Entered debug mode' pdb.set_trace() def redraw(self): """redraw the screen""" self.loop.draw_screen() def start(self): self.i = 0 self.loop.set_alarm_in(0,lambda a,b: self.postInit()) self.loop.run() def key_handler(self, input): if input in ('q', 'Q') or input == 'ctrl x': raise urwid.ExitMainLoop() elif input == 'ctrl d' and 'D' in self.bridge.getVersion(): #Debug only for dev versions self.debug() def __buildMainWidget(self): self.contactList = ContactList(self, self.CM, on_click = self.contactSelected, on_change=lambda w: self.redraw()) #self.center_part = urwid.Columns([('weight',2,self.contactList),('weight',8,Chat('',self))]) self.center_part = urwid.Columns([('weight',2,self.contactList), ('weight',8,urwid.Filler(urwid.Text('')))]) editBar = AdvancedEdit('> ') urwid.connect_signal(editBar,'click',self.onTextEntered) self.main_widget = FocusFrame(self.center_part, footer=editBar, focus_part='footer') return self.main_widget def plug_profile(self, profile_key='@DEFAULT@'): self.loop.widget = self.__buildMainWidget() QuickApp.plug_profile(self, profile_key) def removePopUp(self): self.loop.widget = self.main_widget def showPopUp(self, pop_up_widget): display_widget = urwid.Overlay(pop_up_widget, self.main_widget, 'center', ('relative', 40), 'middle', ('relative', 40)) self.loop.widget = display_widget def contactSelected(self, contact_list): contact = contact_list.get_contact() if contact: assert(len(self.center_part.widget_list)==2) #self.center_part.widget_list.append(self.chat_wins[contact]) #self.center_part.column_types.append(('weight',8)) self.center_part.widget_list[1] = self.chat_wins[contact] def onTextEntered(self, editBar): contact = self.contactList.get_contact() if contact: self.bridge.sendMessage(contact, editBar.get_edit_text(), profile_key=self.profile) editBar.set_edit_text('') sat = PrimitivusApp() sat.start()