Mercurial > libervia-backend
annotate frontends/sortilege/chat.py @ 68:9b842086d915
multiple profiles update
- Wix: new profile managed, it appear at launch in place of the contact list, and disappear once the profile is choosen
- SàT: default profile is now saved, first one is choosed is no default profile
- Bridge: new delete profile method
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 25 Feb 2010 17:09:18 +1100 |
parents | 0e50dd3a234a |
children | 8f2ed279784b |
rev | line source |
---|---|
0 | 1 #!/usr/bin/python |
2 # -*- coding: utf-8 -*- | |
3 | |
4 """ | |
5 sortilege: a SAT frontend | |
57 | 6 Copyright (C) 2009, 2010 Jérôme Poisson (goffi@goffi.org) |
0 | 7 |
8 This program is free software: you can redistribute it and/or modify | |
9 it under the terms of the GNU General Public License as published by | |
10 the Free Software Foundation, either version 3 of the License, or | |
11 (at your option) any later version. | |
12 | |
13 This program is distributed in the hope that it will be useful, | |
14 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 GNU General Public License for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 """ | |
21 | |
22 | |
23 | |
24 import os.path | |
25 import pdb | |
26 from logging import debug, info, error | |
27 from window import Window | |
28 import os | |
29 from time import time, localtime, strftime | |
30 import curses | |
31 import curses.ascii as ascii | |
32 from tools.jid import JID | |
33 from quick_frontend.quick_chat import QuickChat | |
34 | |
35 | |
36 def C(k): | |
37 """return the value of Ctrl+key""" | |
38 return ord(ascii.ctrl(k)) | |
39 | |
40 class Chat(Window, QuickChat): | |
41 | |
42 def __init__(self, to_id, host): | |
43 QuickChat.__init__(self, to_id, host) | |
44 self.__parent=host.stdscr | |
45 self.to_id=JID(to_id) | |
46 self.content=[] | |
47 self.__scollIdx=0 | |
48 Window.__init__(self, self.__parent, self.__parent.getmaxyx()[0]-2, self.__parent.getmaxyx()[1]-30, 0,30, code=host.code) | |
49 | |
50 #history | |
67
0e50dd3a234a
message sending bug fixes + sortilege update
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
51 self.historyPrint(50, True, profile=self.host.profile) |
0 | 52 |
53 self.hide() | |
54 | |
55 def resize(self, height, width, y, x): | |
56 Window.resize(self, height, width, y, x) | |
57 self.update() | |
58 | |
59 def resizeAdapt(self): | |
60 """Adapt window size to self.__parent size. | |
61 Must be called when self.__parent is resized.""" | |
62 self.resize(self.__parent.getmaxyx()[0]-2, self.__parent.getmaxyx()[1]-30, 0,30) | |
63 self.update() | |
64 | |
65 def __getHeader(self, line): | |
66 """Return the header of a line (eg: "[12:34] <toto> ").""" | |
67 header='' | |
68 if self.host.chatParams["timestamp"]: | |
69 header = header + '[%s] ' % strftime("%H:%M", localtime(float(line[0]))) | |
70 if self.host.chatParams['short_nick']: | |
67
0e50dd3a234a
message sending bug fixes + sortilege update
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
71 header = header + ('> ' if line[1]==self.host.profiles[self.host.profile]['whoami'] else '** ') |
0 | 72 else: |
73 header = header + '<%s> ' % line[1] | |
74 return header | |
75 | |
76 def update(self): | |
77 if self.isHidden(): | |
78 echo ("fenetre cachee") | |
79 return | |
80 Window.update(self) | |
81 content=[] #what is really printed | |
82 irange=range(len(self.content)) | |
83 irange.reverse() #we print the text upward | |
84 for idx in irange: | |
85 header=self.__getHeader(self.content[idx]) | |
86 msg=self.content[idx][2] | |
87 part=0 #part of the text | |
67
0e50dd3a234a
message sending bug fixes + sortilege update
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
88 if JID(self.content[idx][1]).short==self.host.profiles[self.host.profile]['whoami'].short: |
0 | 89 att_header=curses.color_pair(1) |
90 else: | |
91 att_header=curses.color_pair(2) | |
92 | |
93 while (msg): | |
94 if part==0: | |
95 hd=header | |
96 att=att_header | |
97 max=self.rWidth-len(header) | |
98 else: | |
99 hd="" | |
100 att=0 | |
101 max=self.rWidth | |
102 | |
103 LF = msg.find('\n') #we look for Line Feed | |
104 if LF != -1 and LF < max: | |
105 max = LF | |
106 next = max + 1 #we skip the LF | |
107 else: | |
108 next = max | |
109 | |
110 content.insert(part,[att,hd, msg[:max]]) | |
111 msg=msg[next:] #we erase treated part | |
112 part=part+1 | |
113 | |
114 if len(content)>=self.rHeight+self.__scollIdx: | |
115 #all the screen is filled, we can continue | |
116 break | |
117 | |
118 if self.__scollIdx>0 and len(content)<self.rHeight+self.__scollIdx: | |
119 self.__scollIdx=abs(len(content)-self.rHeight) #all the log fit on the screen, we must stop here | |
120 | |
121 idx=0 | |
122 for line in content[-self.rHeight-self.__scollIdx : -self.__scollIdx or None]: | |
123 self.addYXStr(idx, 0, line[1], line[0]) | |
124 self.addYXStr(idx, len(line[1]), line[2]) | |
125 idx=idx+1 | |
126 | |
127 self.noutrefresh() | |
128 | |
129 def scrollIdxUp(self): | |
130 """increment scroll index""" | |
131 self.__scollIdx = self.__scollIdx + 1 | |
132 self.update() | |
133 | |
134 def scrollIdxDown(self): | |
135 """decrement scroll index""" | |
136 if self.__scollIdx > 0: | |
137 self.__scollIdx = self.__scollIdx - 1 | |
138 self.update() | |
139 | |
67
0e50dd3a234a
message sending bug fixes + sortilege update
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
140 def printMessage(self, jid, msg, profile, timestamp=""): |
0 | 141 if timestamp=="": |
142 current_time=time() | |
143 timestamp=str(current_time) | |
144 if self.last_history and current_time - float(self.last_history) < 5: #FIXME: Q&D fix to avoid double print on new chat window | |
145 return | |
146 self.content.append([timestamp,jid.short,msg]) | |
147 self.update() | |
148 | |
149 def handleKey(self, k): | |
150 if k == C('p'): | |
151 self.scrollIdxUp() | |
152 elif k == C('n'): | |
153 self.scrollIdxDown() | |
154 |