Mercurial > libervia-backend
annotate frontends/src/primitivus/chat.py @ 610:c8c07c920e30
Primitivus: fixed xmlui/chat bad contents change
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 10 Mar 2013 20:54:45 +0100 |
parents | 84a6e83157c2 |
children | 3b02554d4c8b |
rev | line source |
---|---|
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/python |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
4 # Primitivus: a SAT frontend |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
5 # Copyright (C) 2009, 2010, 2011, 2012, 2013 Jérôme Poisson (goffi@goffi.org) |
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
10 # (at your option) any later version. |
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
15 # GNU Affero General Public License for more details. |
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
607
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 import urwid |
222
3198bfd66daa
primitivus: refactoring to use urwid-satext which is now a separate project
Goffi <goffi@goffi.org>
parents:
202
diff
changeset
|
21 from urwid_satext import sat_widgets |
225
fd9b7834d98a
distutils installation script, draft
Goffi <goffi@goffi.org>
parents:
223
diff
changeset
|
22 from urwid_satext.files_management import FileDialog |
fd9b7834d98a
distutils installation script, draft
Goffi <goffi@goffi.org>
parents:
223
diff
changeset
|
23 from sat_frontends.quick_frontend.quick_chat import QuickChat |
fd9b7834d98a
distutils installation script, draft
Goffi <goffi@goffi.org>
parents:
223
diff
changeset
|
24 from sat_frontends.primitivus.card_game import CardGame |
511
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
25 from sat_frontends.quick_frontend.quick_utils import escapePrivate, unescapePrivate |
124 | 26 import time |
225
fd9b7834d98a
distutils installation script, draft
Goffi <goffi@goffi.org>
parents:
223
diff
changeset
|
27 from sat.tools.jid import JID |
124 | 28 |
29 | |
30 class ChatText(urwid.FlowWidget): | |
31 """Manage the printing of chat message""" | |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
32 |
531
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
33 def __init__(self, parent, timestamp, nick, my_mess, message, align='left', is_info=False): |
124 | 34 self.parent = parent |
35 self.timestamp = time.localtime(timestamp) | |
190
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
36 self.nick = nick |
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
37 self.my_mess = my_mess |
124 | 38 self.message = unicode(message) |
39 self.align = align | |
531
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
40 self.is_info = is_info |
124 | 41 |
42 def selectable(self): | |
43 return True | |
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 |
124 | 45 def keypress(self, size, key): |
46 return key | |
47 | |
48 def rows(self,size,focus=False): | |
49 return self.display_widget(size, focus).rows(size, focus) | |
50 | |
51 def render(self, size, focus=False): | |
125
8d611eb9ae48
primitivus: contact list enhancement
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
52 canvas = urwid.CompositeCanvas(self.display_widget(size, focus).render(size, focus)) |
8d611eb9ae48
primitivus: contact list enhancement
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
53 if focus: |
8d611eb9ae48
primitivus: contact list enhancement
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
54 canvas.set_cursor(self.get_cursor_coords(size)) |
8d611eb9ae48
primitivus: contact list enhancement
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
55 return canvas |
8d611eb9ae48
primitivus: contact list enhancement
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
56 |
8d611eb9ae48
primitivus: contact list enhancement
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
57 def get_cursor_coords(self, size): |
8d611eb9ae48
primitivus: contact list enhancement
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
58 #(maxcol,) = size |
8d611eb9ae48
primitivus: contact list enhancement
Goffi <goffi@goffi.org>
parents:
124
diff
changeset
|
59 return 0, 0 |
124 | 60 |
61 def display_widget(self, size, focus): | |
62 render_txt = [] | |
531
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
63 if not self.is_info: |
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
64 if self.parent.show_timestamp: |
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
65 time_format = "%c" if self.timestamp < self.parent.day_change else "%H:%M" #if the message was sent before today, we print the full date |
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
66 render_txt.append(('date',"[%s]" % time.strftime(time_format, self.timestamp).decode('utf-8'))) |
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
67 if self.parent.show_short_nick: |
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
68 render_txt.append(('my_nick' if self.my_mess else 'other_nick',"**" if self.my_mess else "*")) |
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
69 else: |
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
70 render_txt.append(('my_nick' if self.my_mess else 'other_nick',"[%s] " % self.nick)) |
124 | 71 render_txt.append(self.message) |
72 return urwid.Text(render_txt, align=self.align) | |
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 class Chat(urwid.WidgetWrap, QuickChat): |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 def __init__(self, target, host, type='one2one'): |
124 | 77 self.target = target |
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 QuickChat.__init__(self, target, host, type) |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
79 self.content = urwid.SimpleListWalker([]) |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 self.text_list = urwid.ListBox(self.content) |
124 | 81 self.chat_widget = urwid.Frame(self.text_list) |
144
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
82 self.chat_colums = urwid.Columns([('weight', 8, self.chat_widget)]) |
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
83 self.chat_colums = urwid.Columns([('weight', 8, self.chat_widget)]) |
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
84 self.pile = urwid.Pile([self.chat_colums]) |
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
85 urwid.WidgetWrap.__init__(self, self.__getDecoration(self.pile)) |
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 self.setType(type) |
124 | 87 self.day_change = time.strptime(time.strftime("%a %b %d 00:00:00 %Y")) #struct_time of day changing time |
88 self.show_timestamp = True | |
89 self.show_short_nick = False | |
130
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
90 self.show_title = 1 #0: clip title; 1: full title; 2: no title |
124 | 91 self.subject = None |
92 | |
93 def keypress(self, size, key): | |
94 if key == "meta p": #user wants to (un)hide the presents panel | |
95 if self.type == 'group': | |
607
c123dddaea6b
primitivus: fixed urwid issues with recent urwid versions
Goffi <goffi@goffi.org>
parents:
587
diff
changeset
|
96 widgets = [widget for (widget, options) in self.chat_colums.contents] |
124 | 97 if self.present_panel in widgets: |
98 self.__removePresentPanel() | |
99 else: | |
100 self.__appendPresentPanel() | |
101 elif key == "meta t": #user wants to (un)hide timestamp | |
102 self.show_timestamp = not self.show_timestamp | |
103 for wid in self.content: | |
104 wid._invalidate() | |
105 elif key == "meta n": #user wants to (not) use short nick | |
106 self.show_short_nick = not self.show_short_nick | |
107 for wid in self.content: | |
108 wid._invalidate() | |
109 elif key == "meta l": #user wants to (un)hide widget decoration | |
222
3198bfd66daa
primitivus: refactoring to use urwid-satext which is now a separate project
Goffi <goffi@goffi.org>
parents:
202
diff
changeset
|
110 show = not isinstance(self._w, sat_widgets.LabelLine) |
124 | 111 self.showDecoration(show) |
112 self._invalidate() | |
181 | 113 elif key == "meta s": #user wants to (un)hide group's subject or change its apperance |
124 | 114 if self.subject: |
130
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
115 self.show_title = (self.show_title + 1) % 3 |
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
116 if self.show_title == 0: |
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
117 self.setSubject(self.subject,'clip') |
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
118 elif self.show_title == 1: |
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
119 self.setSubject(self.subject,'space') |
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
120 elif self.show_title == 2: |
124 | 121 self.chat_widget.header = None |
122 self._invalidate() | |
123 | |
124 | |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
125 return super(Chat, self).keypress(size, key) |
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
126 |
137
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
127 def getMenu(self): |
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
128 """Return Menu bar""" |
222
3198bfd66daa
primitivus: refactoring to use urwid-satext which is now a separate project
Goffi <goffi@goffi.org>
parents:
202
diff
changeset
|
129 menu = sat_widgets.Menu(self.host.loop) |
137
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
130 if self.type == 'group': |
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
131 game = _("Game") |
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
132 menu.addMenu(game, "Tarot", self.onTarotRequest) |
176 | 133 elif self.type == 'one2one': |
134 menu.addMenu(_("Action"), _("Send file"), self.onSendFileRequest) | |
137
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
135 return menu |
124 | 136 |
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 def setType(self, type): |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 QuickChat.setType(self, type) |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 if type == 'one2one': |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 self.historyPrint(profile=self.host.profile) |
124 | 141 elif type == 'group': |
607
c123dddaea6b
primitivus: fixed urwid issues with recent urwid versions
Goffi <goffi@goffi.org>
parents:
587
diff
changeset
|
142 if len(self.chat_colums.contents) == 1: |
124 | 143 present_widget = self.__buildPresentList() |
222
3198bfd66daa
primitivus: refactoring to use urwid-satext which is now a separate project
Goffi <goffi@goffi.org>
parents:
202
diff
changeset
|
144 self.present_panel = sat_widgets.VerticalSeparator(present_widget) |
124 | 145 self.__appendPresentPanel() |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
146 |
124 | 147 def __getDecoration(self, widget): |
510
886754295efe
quick frontend, primitivus, wix: MUC private messages management
Goffi <goffi@goffi.org>
parents:
507
diff
changeset
|
148 return sat_widgets.LabelLine(widget, sat_widgets.SurroundedText(unicode(unescapePrivate(self.target)))) |
124 | 149 |
150 def showDecoration(self, show=True): | |
144
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
151 """Show/Hide the decoration around the chat window""" |
124 | 152 if show: |
144
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
153 main_widget = self.__getDecoration(self.pile) |
124 | 154 else: |
144
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
155 main_widget = self.pile |
124 | 156 self._w = main_widget |
157 | |
511
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
158 def _presentClicked(self, list_wid, clicked_wid): |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
159 assert(self.type == 'group') |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
160 nick = clicked_wid.getValue() |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
161 if nick == self.getUserNick(): |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
162 #We ignore click on our own nick |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
163 return |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
164 #we have a click on a nick, we add the private conversation to the contact_list |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
165 full_jid = JID("%s/%s" % (self.target.short, nick)) |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
166 new_jid = escapePrivate(full_jid) |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
167 if new_jid not in self.host.contact_list: |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
168 self.host.contact_list.add(new_jid) |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
169 |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
170 #now we select the new window |
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
171 self.host.contact_list.setFocus(full_jid, True) |
124 | 172 |
173 def __buildPresentList(self): | |
511
62f7f2403093
Primitivus: present contacts in groups chat can now be clicked
Goffi <goffi@goffi.org>
parents:
510
diff
changeset
|
174 self.present_wid = sat_widgets.GenericList([],option_type = sat_widgets.ClickableText, on_click=self._presentClicked) |
124 | 175 return self.present_wid |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
176 |
124 | 177 def __appendPresentPanel(self): |
607
c123dddaea6b
primitivus: fixed urwid issues with recent urwid versions
Goffi <goffi@goffi.org>
parents:
587
diff
changeset
|
178 self.chat_colums.contents.append((self.present_panel,('weight', 2, False))) |
124 | 179 |
180 def __removePresentPanel(self): | |
607
c123dddaea6b
primitivus: fixed urwid issues with recent urwid versions
Goffi <goffi@goffi.org>
parents:
587
diff
changeset
|
181 for widget, options in self.chat_colums.contents: |
c123dddaea6b
primitivus: fixed urwid issues with recent urwid versions
Goffi <goffi@goffi.org>
parents:
587
diff
changeset
|
182 if widget is self.present_panel: |
c123dddaea6b
primitivus: fixed urwid issues with recent urwid versions
Goffi <goffi@goffi.org>
parents:
587
diff
changeset
|
183 self.chat_colums.contents.remove((widget, options)) |
c123dddaea6b
primitivus: fixed urwid issues with recent urwid versions
Goffi <goffi@goffi.org>
parents:
587
diff
changeset
|
184 break |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
185 |
144
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
186 def __appendGamePanel(self, widget): |
607
c123dddaea6b
primitivus: fixed urwid issues with recent urwid versions
Goffi <goffi@goffi.org>
parents:
587
diff
changeset
|
187 assert (len(self.pile.contents) == 1) |
610
c8c07c920e30
Primitivus: fixed xmlui/chat bad contents change
Goffi <goffi@goffi.org>
parents:
609
diff
changeset
|
188 self.pile.contents.insert(0,(widget,('weight', 1))) |
607
c123dddaea6b
primitivus: fixed urwid issues with recent urwid versions
Goffi <goffi@goffi.org>
parents:
587
diff
changeset
|
189 self.pile.contents.insert(1,(urwid.Filler(urwid.Divider('-'),('fixed', 1)))) |
144
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
190 self.host.redraw() |
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
191 |
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
192 def __removeGamePanel(self): |
607
c123dddaea6b
primitivus: fixed urwid issues with recent urwid versions
Goffi <goffi@goffi.org>
parents:
587
diff
changeset
|
193 assert (len(self.pile.contents) == 3) |
c123dddaea6b
primitivus: fixed urwid issues with recent urwid versions
Goffi <goffi@goffi.org>
parents:
587
diff
changeset
|
194 del self.pile.contents[0] |
144
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
195 self.host.redraw() |
124 | 196 |
130
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
197 def setSubject(self, subject, wrap='space'): |
120 | 198 """Set title for a group chat""" |
199 QuickChat.setSubject(self, subject) | |
124 | 200 self.subject = subject |
130
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
201 self.subj_wid = urwid.Text(unicode(subject.replace('\n','|') if wrap == 'clip' else subject ), |
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
202 align='left' if wrap=='clip' else 'center',wrap=wrap) |
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
203 self.chat_widget.header = urwid.AttrMap(self.subj_wid,'title') |
5a88ad24ccc0
Primitivus: subject in group chat can now be shown in 3 ways: clip, full, or hidden
Goffi <goffi@goffi.org>
parents:
126
diff
changeset
|
204 self.host.redraw() |
124 | 205 |
206 def setPresents(self, param_nicks): | |
207 """Set the users presents in the contact list for a group chat | |
208 @param nicks: list of nicknames | |
209 """ | |
210 nicks = [unicode(nick) for nick in param_nicks] #FIXME: should be done in DBus bridge | |
211 nicks.sort() | |
212 QuickChat.setPresents(self, nicks) | |
213 self.present_wid.changeValues(nicks) | |
214 self.host.redraw() | |
120 | 215 |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
216 def replaceUser(self, param_nick, show_info=True): |
124 | 217 """Add user if it is not in the group list""" |
218 nick = unicode(param_nick) #FIXME: should be done in DBus bridge | |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
219 QuickChat.replaceUser(self, nick, show_info) |
124 | 220 presents = self.present_wid.getAllValues() |
221 if nick not in presents: | |
222 presents.append(nick) | |
223 presents.sort() | |
224 self.present_wid.changeValues(presents) | |
225 self.host.redraw() | |
226 | |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
227 def removeUser(self, param_nick, show_info=True): |
124 | 228 """Remove a user from the group list""" |
229 nick = unicode(param_nick) #FIXME: should be done in DBus bridge | |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
230 QuickChat.removeUser(self, nick, show_info) |
124 | 231 self.present_wid.deleteValue(nick) |
232 self.host.redraw() | |
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
233 |
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
234 def printMessage(self, from_jid, msg, profile, timestamp=""): |
153
f197b52796ee
Primitivus: begining of management for actionResult
Goffi <goffi@goffi.org>
parents:
144
diff
changeset
|
235 assert isinstance(from_jid, JID) |
190
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
236 try: |
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
237 jid,nick,mymess = QuickChat.printMessage(self, from_jid, msg, profile, timestamp) |
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
238 except TypeError: |
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
239 return |
520
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
240 |
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
241 new_text = ChatText(self, timestamp or None, nick, mymess, msg) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
242 |
520
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
243 if timestamp and self.content: |
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
244 for idx in range(len(self.content)-1,-1,-1): |
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
245 current_text = self.content[idx] |
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
246 if new_text.timestamp < current_text.timestamp and idx > 0: |
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
247 continue #the new message is older, we need to insert it upper |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
248 |
520
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
249 #we discard double messages, to avoid backlog / history conflict |
521
3f8c2a0f20e5
primitivus: fixed double messages discarding
Goffi <goffi@goffi.org>
parents:
520
diff
changeset
|
250 if ((idx and self.content[idx-1].message == msg) or |
3f8c2a0f20e5
primitivus: fixed double messages discarding
Goffi <goffi@goffi.org>
parents:
520
diff
changeset
|
251 (self.content[idx].message == msg) or |
3f8c2a0f20e5
primitivus: fixed double messages discarding
Goffi <goffi@goffi.org>
parents:
520
diff
changeset
|
252 (idx<len(self.content)-2 and self.content[idx+1].message)): |
520
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
253 return |
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
254 |
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
255 self.content.insert(idx+1, new_text) |
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
256 break |
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
257 else: |
4d7248f4c577
primitivus: better chat text insertion in chat window
Goffi <goffi@goffi.org>
parents:
518
diff
changeset
|
258 self.content.append(new_text) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
259 |
430
7c7ec2347b56
primitivus: chat window is not scrolled anymore when user is watching history and a new message is received
Goffi <goffi@goffi.org>
parents:
387
diff
changeset
|
260 if self.text_list.get_focus()[1] == len(self.content)-2: |
7c7ec2347b56
primitivus: chat window is not scrolled anymore when user is watching history and a new message is received
Goffi <goffi@goffi.org>
parents:
387
diff
changeset
|
261 #we don't change focus if user is not at the bottom |
7c7ec2347b56
primitivus: chat window is not scrolled anymore when user is watching history and a new message is received
Goffi <goffi@goffi.org>
parents:
387
diff
changeset
|
262 #as that mean that he is probably watching discussion history |
7c7ec2347b56
primitivus: chat window is not scrolled anymore when user is watching history and a new message is received
Goffi <goffi@goffi.org>
parents:
387
diff
changeset
|
263 self.text_list.set_focus(len(self.content)-1) |
190
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
264 self.host.redraw() |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
265 if not self.host.x_notify.hasFocus(): |
380
ede26abf6ca1
primitivus: freedesktop notifications (if available) when somebody is talking to us and we have not focus, or our nick is pinged and we have not focus.
Goffi <goffi@goffi.org>
parents:
325
diff
changeset
|
266 if self.type=="one2one": |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
267 self.host.x_notify.sendNotification(_("Primitivus: %s is talking to you") % from_jid) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
268 elif self.getUserNick().lower() in msg.lower(): |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
269 self.host.x_notify.sendNotification(_("Primitivus: Somebody pinged your name in %s room") % self.target) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
270 |
531
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
271 def printInfo(self, msg, type='normal', timestamp=""): |
190
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
272 """Print general info |
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
273 @param msg: message to print |
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
274 @type: one of: |
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
275 normal: general info like "toto has joined the room" |
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
276 me: "/me" information like "/me clenches his fist" ==> "toto clenches his fist" |
31632472e857
quick_frontend, wix, primitivus: informations in chat window
Goffi <goffi@goffi.org>
parents:
181
diff
changeset
|
277 """ |
531
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
278 #FIXME: duplicated code, this must be refactored |
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
279 _widget = ChatText(self, timestamp or None, None, False, msg, is_info=True) |
3bd8f84f920d
primitivus: fixed info messages timestamp
Goffi <goffi@goffi.org>
parents:
521
diff
changeset
|
280 self.content.append(_widget) |
430
7c7ec2347b56
primitivus: chat window is not scrolled anymore when user is watching history and a new message is received
Goffi <goffi@goffi.org>
parents:
387
diff
changeset
|
281 if self.text_list.get_focus()[1] == len(self.content)-2: |
7c7ec2347b56
primitivus: chat window is not scrolled anymore when user is watching history and a new message is received
Goffi <goffi@goffi.org>
parents:
387
diff
changeset
|
282 #we don't change focus if user is not at the bottom |
7c7ec2347b56
primitivus: chat window is not scrolled anymore when user is watching history and a new message is received
Goffi <goffi@goffi.org>
parents:
387
diff
changeset
|
283 #as that mean that he is probably watching discussion history |
7c7ec2347b56
primitivus: chat window is not scrolled anymore when user is watching history and a new message is received
Goffi <goffi@goffi.org>
parents:
387
diff
changeset
|
284 self.text_list.set_focus(len(self.content)-1) |
119
ded2431cea5a
Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
285 self.host.redraw() |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
286 if not self.host.x_notify.hasFocus(): |
380
ede26abf6ca1
primitivus: freedesktop notifications (if available) when somebody is talking to us and we have not focus, or our nick is pinged and we have not focus.
Goffi <goffi@goffi.org>
parents:
325
diff
changeset
|
287 if self.type=="one2one": |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
288 self.host.x_notify.sendNotification(_("Primitivus: there is a message about you")) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
289 elif self.getUserNick().lower() in msg.lower(): |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
501
diff
changeset
|
290 self.host.x_notify.sendNotification(_("Primitivus: Somebody is talking about you in %s room") % self.target) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
291 |
144
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
292 def startGame(self, game_type, referee, players): |
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
293 """Configure the chat window to start a game""" |
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
294 if game_type=="Tarot": |
501
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
295 self.tarot_wid = CardGame(self, referee, players, self.nick) |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
296 self.__appendGamePanel(self.tarot_wid) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
297 |
144
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
298 def getGame(self, game_type): |
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
299 """Return class managing the game type""" |
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
300 #TODO: check that the game is launched, and manage errors |
80661755ea8d
Primitivus: Tarot card game implementation
Goffi <goffi@goffi.org>
parents:
137
diff
changeset
|
301 if game_type=="Tarot": |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
302 return self.tarot_wid |
137
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
303 |
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
304 #MENU EVENTS# |
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
305 def onTarotRequest(self, menu): |
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
306 if len(self.occupants) != 4: |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
307 self.host.showPopUp(sat_widgets.Alert(_("Can't start game"), _("You need to be exactly 4 peoples in the room to start a Tarot game"), ok_cb=self.host.removePopUp)) |
137
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
308 else: |
227394eb080c
Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents:
130
diff
changeset
|
309 self.host.bridge.tarotGameCreate(self.id, list(self.occupants), self.host.profile) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
310 |
176 | 311 def onSendFileRequest(self, menu): |
180
fdb961f27ae9
Primitivus: file sending and progress management
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
312 dialog = FileDialog(ok_cb=self.onFileSelected, cancel_cb=self.host.removePopUp) |
176 | 313 self.host.showPopUp(dialog, 80, 80) |
314 | |
180
fdb961f27ae9
Primitivus: file sending and progress management
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
315 #MISC EVENTS# |
fdb961f27ae9
Primitivus: file sending and progress management
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
316 def onFileSelected(self, filepath): |
fdb961f27ae9
Primitivus: file sending and progress management
Goffi <goffi@goffi.org>
parents:
176
diff
changeset
|
317 self.host.removePopUp() |
501
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
318 #FIXME: check last_resource: what if self.target.resource exists ? |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
319 last_resource = self.host.bridge.getLastResource(unicode(self.target.short), self.host.profile) |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
320 if last_resource: |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
321 full_jid = JID("%s/%s" % (self.target.short, last_resource)) |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
322 else: |
e9634d2e7b38
core, quick_frontend, primitivus, wix: Contacts List refactoring phase 1:
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
323 full_jid = self.target |
542
3eeb6c865e4d
frontends: incoming files transfer management:
Goffi <goffi@goffi.org>
parents:
531
diff
changeset
|
324 progress_id = self.host.bridge.sendFile(full_jid, filepath, {}, self.host.profile) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
325 self.host.addProgress(progress_id,filepath) |