annotate urwid_satext/sat_widgets.py @ 96:44fc94b0fe18

new FocusPile widget: a Pile which manage FOCUS_KEYS
author Goffi <goffi@goffi.org>
date Mon, 08 Sep 2014 15:42:25 +0200
parents ca9a77f3b53e
children 8f5afab948a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/python
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
3
64
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
4 # Urwid SàT extensions
71
eddb8369ba06 dates udpate
Goffi <goffi@goffi.org>
parents: 70
diff changeset
5 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org)
64
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
6 #
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
7 # This program is free software: you can redistribute it and/or modify
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
8 # it under the terms of the GNU Lesser General Public License as published by
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
10 # (at your option) any later version.
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
11 #
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
12 # This program is distributed in the hope that it will be useful,
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
15 # GNU Lesser General Public License for more details.
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
16 #
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
17 # You should have received a copy of the GNU Lesser General Public License
5cef69971f23 headers fixes
Goffi <goffi@goffi.org>
parents: 59
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
19
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
20 import urwid
89
2141f07b5fdd primitivus: no more direct error/warning methods for logging
Goffi <goffi@goffi.org>
parents: 88
diff changeset
21 import logging as log
44
9fc778aab7f5 fix for urwid 1.0.0
Goffi <goffi@goffi.org>
parents: 30
diff changeset
22 import encodings
9fc778aab7f5 fix for urwid 1.0.0
Goffi <goffi@goffi.org>
parents: 30
diff changeset
23 utf8decode = lambda s: encodings.codecs.utf_8_decode(s)[0]
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
24
59
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
25 from urwid.util import is_mouse_press #XXX: is_mouse_press is not included in urwid in 1.0.0
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
26 from .keys import action_key_map as a_key
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
27
90
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
28 FOCUS_KEYS = (a_key['FOCUS_SWITCH'], a_key['FOCUS_UP'], a_key['FOCUS_DOWN'])
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
29
10
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
30
94
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
31 def getFocusDirection(key, inversed=False):
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
32 """Return direction and rotate boolean depending on key
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
33 @param key: one of FOCUS_KEYS
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
34 @param inversed: inverse directions if True
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
35 @return (tuple): (direction, rotate) where
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
36 - direction is 1 or -1
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
37 - rotate is False if we should stop at the begin/end of the widgets list
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
38 """
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
39 if not inversed:
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
40 direction = 1 if key in (a_key['FOCUS_SWITCH'], a_key['FOCUS_UP']) else -1
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
41 else:
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
42 direction = -1 if key in (a_key['FOCUS_SWITCH'], a_key['FOCUS_DOWN']) else 1
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
43 rotate = key == a_key['FOCUS_SWITCH']
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
44 return direction, rotate
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
45
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
46
4
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
47 class AdvancedEdit(urwid.Edit):
7
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
48 """Edit box with some custom improvments
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
49 new chars:
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
50 - C-a: like 'home'
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
51 - C-e: like 'end'
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
52 - C-k: remove everything on the right of the cursor
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
53 - C-w: remove the word on the back
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
54 new behaviour: emit a 'click' signal when enter is pressed"""
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
55 signals = urwid.Edit.signals + ['click']
4
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
56
22
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
57 def setCompletionMethod(self, callback):
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
58 """Define method called when completion is asked
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
59 @callback: method with 2 arguments:
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
60 - the text to complete
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
61 - if there was already a completion, a dict with
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
62 - 'completed':last completion
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
63 - 'completion_pos': cursor position where the completion starts
22
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
64 - 'position': last completion cursor position
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
65 this dict must be used (and can be filled) to find next completion)
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
66 and which return the full text completed"""
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
67 self.completion_cb = callback
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
68 self.completion_data = {}
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
69
4
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
70 def keypress(self, size, key):
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
71 #TODO: insert mode is not managed yet
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
72 if key == a_key['EDIT_HOME']:
4
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
73 key = 'home'
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
74 elif key == a_key['EDIT_END']:
4
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
75 key = 'end'
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
76 elif key == a_key['EDIT_DELETE_TO_END']:
4
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
77 self._delete_highlighted()
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
78 self.set_edit_text(self.edit_text[:self.edit_pos])
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
79 elif key == a_key['EDIT_DELETE_LAST_WORD']:
4
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
80 before = self.edit_text[:self.edit_pos]
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
81 pos = before.rstrip().rfind(" ")+1
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
82 self.set_edit_text(before[:pos] + self.edit_text[self.edit_pos:])
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
83 self.set_edit_pos(pos)
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
84 elif key == a_key['EDIT_ENTER']:
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
85 self._emit('click')
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
86 elif key == a_key['EDIT_COMPLETE']:
22
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
87 try:
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
88 before = self.edit_text[:self.edit_pos]
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
89 if self.completion_data:
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
90 if (not self.completion_data['completed']
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
91 or self.completion_data['position'] != self.edit_pos
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
92 or not before.endswith(self.completion_data['completed'])):
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
93 self.completion_data.clear()
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
94 else:
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
95 before = before[:-len(self.completion_data['completed'])]
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
96 complet = self.completion_cb(before, self.completion_data)
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
97 self.completion_data['completed'] = complet[len(before):]
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
98 self.set_edit_text(complet+self.edit_text[self.edit_pos:])
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
99 self.set_edit_pos(len(complet))
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
100 self.completion_data['position'] = self.edit_pos
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
101 return
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
102 except AttributeError:
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
103 #No completion method defined
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
104 pass
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
105 return super(AdvancedEdit, self).keypress(size, key)
59
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
106
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
107
59
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
108 class Password(AdvancedEdit):
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
109 """Edit box which doesn't show what is entered (show '*' or other char instead)"""
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
110
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
111 def __init__(self, *args, **kwargs):
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
112 """Same args than Edit.__init__ with an additional keyword arg 'hidden_char'
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
113 @param hidden_char: char to show instead of what is actually entered: default '*'
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
114 """
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
115 self.hidden_char=kwargs['hidden_char'] if kwargs.has_key('hidden_char') else '*'
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
116 self.__real_text=''
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
117 super(Password, self).__init__(*args, **kwargs)
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
118
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
119 def set_edit_text(self, text):
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
120 self.__real_text = text
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
121 hidden_txt = len(text)*'*'
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
122 super(Password, self).set_edit_text(hidden_txt)
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
123
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
124 def get_edit_text(self):
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
125 return self.__real_text
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
126
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
127 def insert_text(self, text):
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
128 self._edit_text = self.__real_text
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
129 super(Password,self).insert_text(text)
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
130
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
131 def render(self, size, focus=False):
a99951c9ce2a Password now use AdvancedEdit to take advantage of shortcuts
Goffi <goffi@goffi.org>
parents: 57
diff changeset
132 return super(Password, self).render(size, focus)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
133
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
134
57
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
135 class ModalEdit(AdvancedEdit):
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
136 """AdvancedEdit with vi-like mode management
68
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
137 - there is a new 'mode' property which can be changed with properties
57
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
138 specified during init
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
139 - completion callback received a new 'mode' argument
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
140 """
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
141
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
142 def __init__(self, modes, *args, **kwargs):
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
143 """ first argument is "modes", others are the same paramaters as AdvancedEdit
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
144 @param modes: dictionnary in the form:
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
145 'key_to_change_mode': ('Mode', caption)
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
146 e.g.: 'i': ('INSERTION', '> ')
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
147 There *MUST* be a None key (for NORMAL mode)"""
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
148 assert(isinstance(modes, dict) and None in modes)
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
149 self._modes = modes
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
150 super(ModalEdit, self).__init__(*args, **kwargs)
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
151 self.mode = self._modes[None][0]
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
152
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
153 @property
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
154 def mode(self):
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
155 return self._mode
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
156
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
157 @mode.setter
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
158 def mode(self, value):
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
159 mode_key = None
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
160 for key in self._modes:
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
161 if self._modes[key][0] == value:
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
162 mode_key = key
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
163 break
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
164
57
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
165 mode, caption = self._modes[mode_key]
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
166 self._mode = mode
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
167 self.set_caption(caption)
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
168 if not mode_key: #we are in NORMAL mode
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
169 self.set_edit_text('')
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
170
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
171 def setCompletionMethod(self, callback):
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
172 """ Same as AdvancedEdit.setCompletionMethod, but with a third argument: current mode"""
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
173 super(ModalEdit, self).setCompletionMethod(lambda text,data: callback(text, data, self._mode))
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
174
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
175 def keypress(self, size, key):
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
176 if key == a_key['MODAL_ESCAPE']:
57
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
177 self.mode = "NORMAL"
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
178 return
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
179 if self._mode == 'NORMAL' and key in self._modes:
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
180 self.mode = self._modes[key][0]
d493f95724a7 new ModalEdit for vi-like bahaviour
Goffi <goffi@goffi.org>
parents: 56
diff changeset
181 return
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
182 return super(ModalEdit, self).keypress(size, key)
4
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
183
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
184
67
c270867a80f9 updated deprecated FlowWidget use
Goffi <goffi@goffi.org>
parents: 66
diff changeset
185 class SurroundedText(urwid.Widget):
7
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
186 """Text centered on a repeated character (like a Divider, but with a text in the center)"""
67
c270867a80f9 updated deprecated FlowWidget use
Goffi <goffi@goffi.org>
parents: 66
diff changeset
187 _sizing = frozenset(['flow'])
6
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
188
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
189 def __init__(self,text,car=utf8decode('─')):
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
190 self.text=text
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
191 self.car=car
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
192
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
193 def rows(self,size,focus=False):
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
194 return self.display_widget(size, focus).rows(size, focus)
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
195
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
196 def render(self, size, focus=False):
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
197 return self.display_widget(size, focus).render(size, focus)
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
198
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
199 def display_widget(self, size, focus):
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
200 (maxcol,) = size
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
201 middle = (maxcol-len(self.text))/2
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
202 render_text = middle * self.car + self.text + (maxcol - len(self.text) - middle) * self.car
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
203 return urwid.Text(render_text)
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
204
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
205
95
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
206 class AlwaysSelectableText(urwid.WidgetWrap):
6
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
207 """Text which can be selected with space"""
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
208 signals = ['change']
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
209
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
210 def __init__(self, text, align='left', header='', focus_attr='default_focus', selected_text=None, selected=False, data=None):
95
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
211 """
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
212 @param text: same as urwid.Text's text parameter
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
213 @param align: same as urwid.Text's align parameter
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
214 @select_attr: attrbute to use when selected
95
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
215 @param selected: is the text selected ?
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
216 """
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
217 self.focus_attr = focus_attr
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
218 self.__selected = False
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
219 self.__was_focused = False
69
b39c81cdd863 removed __valid_text: urwid now manage basestring subclasses, it's not necessary anymore
Goffi <goffi@goffi.org>
parents: 68
diff changeset
220 self.header = header
95
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
221 self.text = text
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
222 urwid.WidgetWrap.__init__(self, urwid.Text("",align=align))
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
223 self.setSelectedText(selected_text)
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
224 self.setState(selected)
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
225
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
226 def getValue(self):
95
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
227 if isinstance(self.text,basestring):
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
228 return self.text
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
229 list_attr = self.text if isinstance(self.text, list) else [self.text]
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
230 txt = ""
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
231 for attr in list_attr:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
232 if isinstance(attr,tuple):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
233 txt+=attr[1]
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
234 else:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
235 txt+=attr
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
236 return txt
9
6650747dfdcb primitivus: contact list enhancement
Goffi <goffi@goffi.org>
parents: 8
diff changeset
237
16
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
238 def get_text(self):
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
239 """for compatibility with urwid.Text"""
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
240 return self.getValue()
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
241
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
242 def set_text(self, text):
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
243 """/!\ set_text doesn't change self.selected_txt !"""
95
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
244 self.text = text
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
245 self.setState(self.__selected,invisible=True)
16
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
246
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
247 def setSelectedText(self, text=None):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
248 """Text to display when selected
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
249 @text: text as in urwid.Text or None for default value"""
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
250 if text == None:
27
d8def22e429a version change before release
Goffi <goffi@goffi.org>
parents: 26
diff changeset
251 text = ('selected',self.getValue())
69
b39c81cdd863 removed __valid_text: urwid now manage basestring subclasses, it's not necessary anymore
Goffi <goffi@goffi.org>
parents: 68
diff changeset
252 self.selected_txt = text
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
253 if self.__selected:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
254 self.setState(self.__selected)
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
255
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
256 def __set_txt(self):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
257 txt_list = [self.header]
95
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
258 txt = self.selected_txt if self.__selected else self.text
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
259 if isinstance(txt,list):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
260 txt_list.extend(txt)
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
261 else:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
262 txt_list.append(txt)
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
263 self._w.base_widget.set_text(txt_list)
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
264
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
265
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
266 def setState(self, selected, invisible=False):
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
267 """Change state
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
268 @param selected: boolean state value
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
269 @param invisible: don't emit change signal if True"""
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
270 assert(type(selected)==bool)
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
271 self.__selected=selected
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
272 self.__set_txt()
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
273 self.__was_focused = False
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
274 self._invalidate()
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
275 if not invisible:
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
276 self._emit("change", self.__selected)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
277
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
278 def getState(self):
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
279 return self.__selected
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
280
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
281 def selectable(self):
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
282 return True
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
283
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
284 def keypress(self, size, key):
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
285 if key in (a_key['TEXT_SELECT'], a_key['TEXT_SELECT2']):
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
286 self.setState(not self.__selected)
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
287 else:
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
288 return key
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
289
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
290 def mouse_event(self, size, event, button, x, y, focus):
53
d34f2b0f68d3 urwid 1.0.0 update: fixed missing is_mouse_press
Goffi <goffi@goffi.org>
parents: 44
diff changeset
291 if is_mouse_press(event) and button == 1:
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
292 self.setState(not self.__selected)
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
293 return True
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
294
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
295 return False
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
296
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
297 def render(self, size, focus=False):
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
298 attr_list = self._w.base_widget._attrib
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
299 if not focus:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
300 if self.__was_focused:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
301 self.__set_txt()
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
302 self.__was_focused = False
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
303 else:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
304 if not self.__was_focused:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
305 if not attr_list:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
306 attr_list.append((self.focus_attr,len(self._w.base_widget.text)))
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
307 else:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
308 for idx in range(len(attr_list)):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
309 attr,attr_len = attr_list[idx]
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
310 if attr == None:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
311 attr = self.focus_attr
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
312 attr_list[idx] = (attr,attr_len)
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
313 else:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
314 if not attr.endswith('_focus'):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
315 attr+="_focus"
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
316 attr_list[idx] = (attr,attr_len)
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
317 self._w.base_widget._invalidate()
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
318 self.__was_focused = True #bloody ugly hack :)
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
319 return self._w.render(size, focus)
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
320
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
321
95
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
322 class SelectableText(AlwaysSelectableText):
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
323 """Like AlwaysSelectableText but not selectable when text is empty"""
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
324
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
325 def selectable(self):
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
326 return bool(self.text)
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
327
ca9a77f3b53e SelectableText is now unselectable if its text is empty, AlwaysSelectable class has the former behaviour.
Goffi <goffi@goffi.org>
parents: 94
diff changeset
328
9
6650747dfdcb primitivus: contact list enhancement
Goffi <goffi@goffi.org>
parents: 8
diff changeset
329 class ClickableText(SelectableText):
6650747dfdcb primitivus: contact list enhancement
Goffi <goffi@goffi.org>
parents: 8
diff changeset
330 signals = SelectableText.signals + ['click']
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
331
8
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
332 def setState(self, selected, invisible=False):
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
333 super(ClickableText,self).setState(False,True)
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
334 if not invisible:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
335 self._emit('click')
8
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
336
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
337
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
338 class CustomButton(ClickableText):
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
339
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
340 def __init__(self, label, on_press=None, user_data=None, left_border = "[ ", right_border = " ]"):
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
341 self.label = label
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
342 self.left_border = left_border
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
343 self.right_border = right_border
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
344 super(CustomButton, self).__init__([left_border, label, right_border])
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
345 self.size = len(self.get_text())
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
346 if on_press:
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
347 urwid.connect_signal(self, 'click', on_press, user_data)
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
348
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
349 def getSize(self):
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
350 """Return representation size of the button"""
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
351 return self.size
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
352
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
353 def get_label(self):
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
354 return self.label[1] if isinstance(self.label,tuple) else self.label
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
355
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
356 def set_label(self, label):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
357 self.label = label
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
358 self.set_text([self.left_border, label, self.right_border])
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
359
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
360
68
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
361 class ListOption(unicode):
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
362 """ Class similar to unicode, but which make the difference between value and label
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
363 label is show when use as unicode, the .value attribute contain the actual value
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
364 Can be initialised with:
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
365 - basestring (label = value = given string)
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
366 - a tuple with (value, label)
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
367 XXX: comparaison is made against value, not the label which is the one displayed
68
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
368
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
369 """
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
370
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
371 def __new__(cls, option):
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
372 if (isinstance(option, cls)):
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
373 return option
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
374 elif isinstance(option, basestring):
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
375 value = label = option
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
376 elif (isinstance(option, tuple) and len(option) == 2):
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
377 value, label = option
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
378 else:
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
379 raise NotImplementedError
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
380 if not label:
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
381 label = value
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
382 instance = super(ListOption, cls).__new__(cls, label)
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
383 instance._value = value
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
384 return instance
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
385
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
386 def __eq__(self, other):
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
387 # XXX: try to compare values, if other has no value
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
388 # (e.g. unicode string) try to compare to other itself
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
389 try:
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
390 return self._value == other._value
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
391 except AttributeError:
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
392 return self._value == other
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
393
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
394 def __ne__(self, other):
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
395 # XXX: see __eq__
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
396 try:
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
397 return self._value != other._value
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
398 except AttributeError:
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
399 return self._value != other
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
400
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
401 @property
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
402 def value(self):
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
403 """ return option value """
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
404 return self._value
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
405
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
406 @value.setter
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
407 def value(self, value):
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
408 self._value = value
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
409
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
410 @staticmethod
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
411 def fromOptions(options):
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
412 """ convert a list of string/tuple options to a list of listOption
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
413 @param options: list of managed option type (basestring, tuple)
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
414 return: list of ListOption
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
415 """
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
416 return [(ListOption(option)) for option in options]
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
417
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
418
91
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
419 class UnselectableListBox(urwid.ListBox):
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
420 """List box that can be unselectable if all widget are unselectable and visible"""
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
421
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
422 def __init__(self, body):
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
423 super(UnselectableListBox, self).__init__(body)
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
424 self.__size_cache = None
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
425
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
426 def selectable(self):
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
427 """Selectable that return False if everything is visible and nothing is selectable"""
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
428 if self.__size_cache is None:
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
429 return self._selectable
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
430 middle, top, bottom = self.calculate_visible(self.__size_cache, self.__focus_cache)
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
431 if top is None or bottom is None:
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
432 return True
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
433 if top[0] or bottom[0]:
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
434 # if not everything is visible, we can select
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
435 return True
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
436 for wid in self.body:
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
437 # if any widget is selectable, we can select
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
438 if wid.selectable():
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
439 return True
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
440 return False
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
441
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
442 def render(self, size, focus=False):
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
443 """Call ListBox render, but keep size and focus in cache"""
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
444 self.__size_cache = size
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
445 self.__focus_cache = focus
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
446 return super(UnselectableListBox, self).render(size, focus)
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
447
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
448
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
449 class GenericList(urwid.WidgetWrap):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
450 signals = ['click','change']
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
451
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
452 def __init__(self, options, style=None, align='left', option_type = SelectableText, on_click=None, on_change=None, user_data=None):
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
453 """
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
454 Widget managing list of string and their selection
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
455 @param options: list of strings used for options
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
456 @param style: list of string:
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
457 - 'single' if only one must be selected
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
458 - 'no_first_select' nothing selected when list is first displayed
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
459 - 'can_select_none' if we can select nothing
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
460 @param align: alignement of text inside the list
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
461 @param on_click: method called when click signal is emited
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
462 @param user_data: data sent to the callback for click signal
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
463 """
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
464 if style is None:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
465 style = []
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
466 self.single = 'single' in style
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
467 self.no_first_select = 'no_first_select' in style
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
468 self.can_select_none = 'can_select_none' in style
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
469 self.align = align
8
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
470 self.option_type = option_type
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
471 self.first_display = True
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
472
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
473 if on_click:
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
474 urwid.connect_signal(self, 'click', on_click, user_data)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
475
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
476 if on_change:
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
477 urwid.connect_signal(self, 'change', on_change, user_data)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
478
1
a5c9603dac37 primitivus: added Alert widget
Goffi <goffi@goffi.org>
parents: 0
diff changeset
479 self.content = urwid.SimpleListWalker([])
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
480 self.list_box = urwid.ListBox(self.content)
4
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
481 urwid.WidgetWrap.__init__(self, self.list_box)
1
a5c9603dac37 primitivus: added Alert widget
Goffi <goffi@goffi.org>
parents: 0
diff changeset
482 self.changeValues(options)
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
483
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
484 def __onStateChange(self, widget, selected):
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
485 if self.single:
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
486 if not selected and not self.can_select_none:
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
487 #if in single mode, it's forbidden to unselect a value
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
488 widget.setState(True, invisible=True)
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
489 return
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
490 if selected:
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
491 self.unselectAll(invisible=True)
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
492 widget.setState(True, invisible=True)
56
22ab98a06492 GenericList: click/change signals fix
Goffi <goffi@goffi.org>
parents: 53
diff changeset
493 self._emit("change")
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
494
56
22ab98a06492 GenericList: click/change signals fix
Goffi <goffi@goffi.org>
parents: 53
diff changeset
495 def __onClick(self, widget):
22ab98a06492 GenericList: click/change signals fix
Goffi <goffi@goffi.org>
parents: 53
diff changeset
496 self._emit("click", widget)
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
497
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
498 def unselectAll(self, invisible=False):
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
499 for widget in self.content:
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
500 if widget.getState():
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
501 widget.setState(False, invisible)
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
502 widget._invalidate()
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
503
2
07b7dcd314ff primitivus: basic contact list, connexion now work \o/
Goffi <goffi@goffi.org>
parents: 1
diff changeset
504 def deleteValue(self, value):
07b7dcd314ff primitivus: basic contact list, connexion now work \o/
Goffi <goffi@goffi.org>
parents: 1
diff changeset
505 """Delete the first value equal to the param given"""
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
506 for widget in self.content:
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
507 if widget.getValue() == value:
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
508 self.content.remove(widget)
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
509 self._emit('change')
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
510 return
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
511 raise ValueError("%s ==> %s" % (str(value),str(self.content)))
2
07b7dcd314ff primitivus: basic contact list, connexion now work \o/
Goffi <goffi@goffi.org>
parents: 1
diff changeset
512
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
513 def getSelectedValue(self):
1
a5c9603dac37 primitivus: added Alert widget
Goffi <goffi@goffi.org>
parents: 0
diff changeset
514 """Convenience method to get the value selected as a string in single mode, or None"""
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
515 values = self.getSelectedValues()
1
a5c9603dac37 primitivus: added Alert widget
Goffi <goffi@goffi.org>
parents: 0
diff changeset
516 return values[0] if values else None
a5c9603dac37 primitivus: added Alert widget
Goffi <goffi@goffi.org>
parents: 0
diff changeset
517
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
518 def getAllValues(self):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
519 """Return values of all items"""
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
520 return [widget.getValue() for widget in self.content]
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
521
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
522 def getSelectedValues(self):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
523 """Return values of selected items"""
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
524 result = []
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
525 for widget in self.content:
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
526 if widget.getState():
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
527 result.append(widget.getValue())
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
528 return result
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
529
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
530 def getDisplayWidget(self):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
531 return self.list_box
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
532
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
533 def changeValues(self, new_values):
68
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
534 """Change all values in one shot"""
5c28bb50ae0d new ListOption class which work like unicode, but make the difference between value and label, so the displayed text can be different from the actual value.
Goffi <goffi@goffi.org>
parents: 67
diff changeset
535 new_values = ListOption.fromOptions(new_values)
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
536 if not self.first_display:
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
537 old_selected = self.getSelectedValues()
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
538 widgets = []
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
539 for option in new_values:
8
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
540 widget = self.option_type(option, self.align)
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
541 if not self.first_display and option in old_selected:
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
542 widget.setState(True)
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
543 widgets.append(widget)
56
22ab98a06492 GenericList: click/change signals fix
Goffi <goffi@goffi.org>
parents: 53
diff changeset
544 for signal, callback in (('change', self.__onStateChange), ('click', self.__onClick)):
22ab98a06492 GenericList: click/change signals fix
Goffi <goffi@goffi.org>
parents: 53
diff changeset
545 try:
22ab98a06492 GenericList: click/change signals fix
Goffi <goffi@goffi.org>
parents: 53
diff changeset
546 urwid.connect_signal(widget, signal, callback)
22ab98a06492 GenericList: click/change signals fix
Goffi <goffi@goffi.org>
parents: 53
diff changeset
547 except NameError:
22ab98a06492 GenericList: click/change signals fix
Goffi <goffi@goffi.org>
parents: 53
diff changeset
548 pass #the widget given doesn't support the signal
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
549 self.content[:] = widgets
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
550 if self.first_display and self.single and new_values and not self.no_first_select:
1
a5c9603dac37 primitivus: added Alert widget
Goffi <goffi@goffi.org>
parents: 0
diff changeset
551 self.content[0].setState(True)
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
552 display_widget = self.getDisplayWidget()
4
c94cdbfdf3e8 primitivus: added edition zone at the bottom
Goffi <goffi@goffi.org>
parents: 3
diff changeset
553 self._set_w(display_widget)
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
554 self._emit('change')
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
555 self.first_display = False
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
556
80
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
557 def selectValue(self, value, move_focus=True):
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
558 """Select the first item which has the given value.
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
559
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
560 @param value
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
561 @param move_focus (boolean): True to move the focus on the selected value,
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
562 False to leave the focus position unchanged.
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
563 """
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
564 self.unselectAll()
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
565 idx = 0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
566 for widget in self.content:
28
654d31983f19 primitivus: fixed misnamed method in custom widget
Goffi <goffi@goffi.org>
parents: 27
diff changeset
567 if widget.getValue() == value:
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
568 widget.setState(True)
80
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
569 if move_focus:
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
570 self.list_box.focus_position = idx
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
571 return
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
572 idx+=1
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
573
80
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
574 def selectValues(self, values, move_focus=True):
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
575 """Select all the given values.
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
576
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
577 @param values [set, list]
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
578 @param move_focus (boolean): True to move the focus on the last selected value,
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
579 False to leave the focus position unchanged.
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
580 """
78
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
581 if self.single:
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
582 if values:
80
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
583 self.selectValue(values[-1], move_focus)
78
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
584 return
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
585 self.unselectAll()
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
586 for value in values:
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
587 idx = 0
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
588 for widget in self.content:
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
589 if widget.getValue() == value:
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
590 widget.setState(True)
80
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
591 if move_focus:
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
592 self.list_box.focus_position = idx
78
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
593 idx += 1
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
594
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
595
67
c270867a80f9 updated deprecated FlowWidget use
Goffi <goffi@goffi.org>
parents: 66
diff changeset
596 class List(urwid.Widget):
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
597 """FlowWidget list, same arguments as GenericList, with an additional one 'max_height'"""
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
598 signals = ['click','change']
67
c270867a80f9 updated deprecated FlowWidget use
Goffi <goffi@goffi.org>
parents: 66
diff changeset
599 _sizing = frozenset(['flow'])
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
600
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
601 def __init__(self, options, style=None, max_height=5, align='left', option_type = SelectableText, on_click=None, on_change=None, user_data=None):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
602 if style is None:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
603 style = []
8
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
604 self.genericList = GenericList(options, style, align, option_type, on_click, on_change, user_data)
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
605 urwid.connect_signal(self.genericList, 'change', self._onChange)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
606 urwid.connect_signal(self.genericList, 'click', self._onClick)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
607 self.max_height = max_height
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
608
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
609 def _onChange(self, widget):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
610 self._emit('change')
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
611
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
612 def _onClick(self, widget):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
613 self._emit('click')
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
614
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
615 def selectable(self):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
616 return True
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
617
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
618 def keypress(self, size, key):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
619 return self.displayWidget(size,True).keypress(size, key)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
620
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
621 def unselectAll(self, invisible=False):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
622 return self.genericList.unselectAll(invisible)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
623
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
624 def deleteValue(self, value):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
625 return self.genericList.deleteValue(value)
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
626
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
627 def getSelectedValue(self):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
628 return self.genericList.getSelectedValue()
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
629
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
630 def getAllValues(self):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
631 return self.genericList.getAllValues()
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
632
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
633 def getSelectedValues(self):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
634 return self.genericList.getSelectedValues()
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
635
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
636 def changeValues(self, new_values):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
637 return self.genericList.changeValues(new_values)
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
638
81
0ebd13729039 fixes default values for methods selectValue(s) of class List
souliane <souliane@mailoo.org>
parents: 80
diff changeset
639 def selectValue(self, value, move_focus=True):
80
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
640 return self.genericList.selectValue(value, move_focus)
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
641
81
0ebd13729039 fixes default values for methods selectValue(s) of class List
souliane <souliane@mailoo.org>
parents: 80
diff changeset
642 def selectValues(self, values, move_focus=True):
80
2d66ac0f4d75 add move_focus parameter to the methods selectValue(s) of list widgets
souliane <souliane@mailoo.org>
parents: 79
diff changeset
643 return self.genericList.selectValues(values, move_focus)
78
56c02f4731f9 added selectValues for lists widgets that support multi-selection
souliane <souliane@mailoo.org>
parents: 77
diff changeset
644
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
645 def render(self, size, focus=False):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
646 return self.displayWidget(size, focus).render(size, focus)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
647
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
648 def rows(self, size, focus=False):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
649 return self.displayWidget(size, focus).rows(size, focus)
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
650
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
651 def displayWidget(self, size, focus):
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
652 list_size = sum([wid.rows(size, focus) for wid in self.genericList.content])
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
653 height = min(list_size,self.max_height) or 1
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
654 return urwid.BoxAdapter(self.genericList, height)
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
655
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
656
10
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
657 ## MISC ##
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
658
16
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
659 class NotificationBar(urwid.WidgetWrap):
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
660 """Bar used to show misc information to user"""
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
661 signals = ['change']
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
662
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
663 def __init__(self):
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
664 self.waitNotifs = urwid.Text('')
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
665 self.message = ClickableText('')
16
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
666 urwid.connect_signal(self.message, 'click', lambda wid: self.showNext())
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
667 self.progress = ClickableText('')
22
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
668 self.columns = urwid.Columns([('fixed',6,self.waitNotifs),self.message,('fixed',4,self.progress)])
16
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
669 urwid.WidgetWrap.__init__(self, urwid.AttrMap(self.columns,'notifs'))
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
670 self.notifs = []
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
671
16
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
672 def __modQueue(self):
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
673 """must be called each time the notifications queue is changed"""
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
674 self.waitNotifs.set_text(('notifs',"(%i)" % len(self.notifs) if self.notifs else ''))
16
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
675 self._emit('change')
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
676
22
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
677 def setProgress(self,percentage):
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
678 """Define the progression to show on the right side of the bar"""
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
679 if percentage == None:
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
680 self.progress.set_text('')
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
681 else:
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
682 self.progress.set_text(('notifs','%02i%%' % percentage))
22
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
683 self._emit('change')
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
684
16
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
685 def addPopUp(self, pop_up_widget):
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
686 """Add a popup to the waiting queue"""
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
687 self.notifs.append(('popup',pop_up_widget))
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
688 self.__modQueue()
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
689
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
690 def addMessage(self, message):
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
691 "Add a message to the notificatio bar"
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
692 if not self.message.get_text():
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
693 self.message.set_text(('notifs',message))
16
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
694 self._invalidate()
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
695 self._emit('change')
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
696 else:
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
697 self.notifs.append(('message',message))
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
698 self.__modQueue()
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
699
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
700 def showNext(self):
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
701 """Show next message if any, else delete current message"""
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
702 found = None
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
703 for notif in self.notifs:
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
704 if notif[0] == "message":
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
705 found = notif
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
706 break
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
707 if found:
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
708 self.notifs.remove(found)
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
709 self.message.set_text(('notifs',found[1]))
16
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
710 self.__modQueue()
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
711 else:
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
712 self.message.set_text('')
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
713 self._emit('change')
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
714
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
715 def getNextPopup(self):
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
716 """Return next pop-up and remove it from the queue
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
717 @return: pop-up or None if there is no more in the queue"""
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
718 ret = None
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
719 for notif in self.notifs:
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
720 if notif[0] == 'popup':
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
721 ret = notif[1]
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
722 break
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
723 if ret:
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
724 self.notifs.remove(notif)
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
725 self.__modQueue()
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
726 return ret
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
727
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
728 def isQueueEmpty(self):
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
729 return not bool(self.notifs)
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
730
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
731 def canHide(self):
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
732 """Return True if there is now important information to show"""
22
dfabea6f73b5 Primitivus: AdvancedEdit and Notification bar improved
Goffi <goffi@goffi.org>
parents: 21
diff changeset
733 return self.isQueueEmpty() and not self.message.get_text() and not self.progress.get_text()
16
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
734
263fe4d067ad Primitivus: notification bar, first draft
Goffi <goffi@goffi.org>
parents: 15
diff changeset
735
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
736 class MenuBox(urwid.WidgetWrap):
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
737 """Show menu items of a category in a box"""
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
738 signals = ['click']
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
739
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
740 def __init__(self,parent,items):
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
741 self.parent = parent
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
742 self.selected = None
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
743 content = urwid.SimpleListWalker([ClickableText(('menuitem',text)) for text in items])
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
744 for wid in content:
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
745 urwid.connect_signal(wid, 'click', self.onClick)
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
746
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
747 self.listBox = urwid.ListBox(content)
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
748 menubox = urwid.LineBox(urwid.BoxAdapter(self.listBox,len(items)))
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
749 urwid.WidgetWrap.__init__(self,menubox)
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
750
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
751 def getValue(self):
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
752 return self.selected
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
753
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
754 def keypress(self, size, key):
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
755 if key==a_key['MENU_BOX_UP']:
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
756 if self.listBox.get_focus()[1] == 0:
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
757 self.parent.keypress(size, key)
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
758 elif key in (a_key['MENU_BOX_LEFT'], a_key['MENU_BOX_RIGHT']):
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
759 self.parent.keypress(size,'up')
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
760 self.parent.keypress(size,key)
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
761 return super(MenuBox,self).keypress(size,key)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
762
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
763 def mouse_event(self, size, event, button, x, y, focus):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
764 if button == 3:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
765 self.parent.keypress(size,'up')
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
766 return True
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
767 return super(MenuBox,self).mouse_event(size, event, button, x, y, focus)
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
768
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
769 def onClick(self, wid):
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
770 self.selected = wid.getValue()
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
771 self._emit('click')
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
772
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
773
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
774 class Menu(urwid.WidgetWrap):
10
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
775
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
776 def __init__(self,loop, x_orig=0):
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
777 """Menu widget
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
778 @param loop: main loop of urwid
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
779 @param x_orig: absolute start of the abscissa
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
780 """
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
781 self.loop = loop
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
782 self.menu_keys = []
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
783 self.menu = {}
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
784 self.x_orig = x_orig
10
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
785 self.shortcuts = {} #keyboard shortcuts
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
786 self.save_bottom = None
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
787 col_rol = ColumnsRoller()
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
788 urwid.WidgetWrap.__init__(self, urwid.AttrMap(col_rol,'menubar'))
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
789
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
790 def selectable(self):
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
791 return True
13
8cccbaadb9c5 Primitivus: menu roller doesn't go anymore on a menu if it's empty
Goffi <goffi@goffi.org>
parents: 12
diff changeset
792
8cccbaadb9c5 Primitivus: menu roller doesn't go anymore on a menu if it's empty
Goffi <goffi@goffi.org>
parents: 12
diff changeset
793 def getMenuSize(self):
8cccbaadb9c5 Primitivus: menu roller doesn't go anymore on a menu if it's empty
Goffi <goffi@goffi.org>
parents: 12
diff changeset
794 """return the current number of categories in this menu"""
8cccbaadb9c5 Primitivus: menu roller doesn't go anymore on a menu if it's empty
Goffi <goffi@goffi.org>
parents: 12
diff changeset
795 return len(self.menu_keys)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
796
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
797 def setOrigX(self, orig_x):
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
798 self.x_orig = orig_x
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
799
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
800 def __buildOverlay(self, menu_key, columns):
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
801 """Build the overlay menu which show menuitems
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
802 @param menu_key: name of the category
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
803 @param columns: column number where the menubox must be displayed"""
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
804 max_len = 0
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
805 for item in self.menu[menu_key]:
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
806 if len(item[0]) > max_len:
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
807 max_len = len(item[0])
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
808
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
809 self.save_bottom = self.loop.widget
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
810 menu_box = MenuBox(self,[item[0] for item in self.menu[menu_key]])
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
811 urwid.connect_signal(menu_box, 'click', self.onItemClick)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
812
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
813 self.loop.widget = urwid.Overlay(urwid.AttrMap(menu_box,'menubar'),self.save_bottom,('fixed left', columns),max_len+2,('fixed top',1),None)
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
814
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
815 def keypress(self, size, key):
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
816 if key == a_key['MENU_DOWN']:
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
817 key = 'enter'
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
818 elif key == a_key['MENU_UP']:
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
819 if self.save_bottom:
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
820 self.loop.widget = self.save_bottom
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
821 self.save_bottom = None
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
822
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
823 return self._w.base_widget.keypress(size, key)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
824
10
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
825 def checkShortcuts(self, key):
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
826 for shortcut in self.shortcuts.keys():
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
827 if key == shortcut:
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
828 category, item, callback = self.shortcuts[shortcut]
10
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
829 callback((category, item))
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
830 return key
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
831
79
33677d99ebdf addMenu allows to add a new category without adding an item
souliane <souliane@mailoo.org>
parents: 78
diff changeset
832 def addMenu(self, category, item=None, callback=None, shortcut=None):
33677d99ebdf addMenu allows to add a new category without adding an item
souliane <souliane@mailoo.org>
parents: 78
diff changeset
833 """Create the category if new and add a menu item (if item is not None).
33677d99ebdf addMenu allows to add a new category without adding an item
souliane <souliane@mailoo.org>
parents: 78
diff changeset
834
10
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
835 @param category: category of the menu (e.g. File/Edit)
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
836 @param item: menu item (e.g. new/close/about)
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
837 @callback: method to call when item is selected"""
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
838 if not category in self.menu.keys():
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
839 self.menu_keys.append(category)
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
840 self.menu[category] = []
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
841 button = CustomButton(('menubar',category), self.onCategoryClick,
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
842 left_border = ('menubar',"[ "),
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
843 right_border = ('menubar'," ]"))
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
844 self._w.base_widget.addWidget(button,button.getSize())
79
33677d99ebdf addMenu allows to add a new category without adding an item
souliane <souliane@mailoo.org>
parents: 78
diff changeset
845 if not item:
33677d99ebdf addMenu allows to add a new category without adding an item
souliane <souliane@mailoo.org>
parents: 78
diff changeset
846 return
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
847 self.menu[category].append((item, callback))
10
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
848 if shortcut:
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
849 assert(shortcut not in self.shortcuts.keys())
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
850 self.shortcuts[shortcut] = (category, item, callback)
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
851
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
852 def onItemClick(self, widget):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
853 category = self._w.base_widget.getSelected().get_label()
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
854 item = widget.getValue()
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
855 callback = None
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
856 for menu_item in self.menu[category]:
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
857 if item == menu_item[0]:
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
858 callback = menu_item[1]
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
859 break
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
860 if callback:
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
861 self.keypress(None, a_key['MENU_UP'])
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
862 callback((category, item))
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
863
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
864 def onCategoryClick(self, button):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
865 self.__buildOverlay(button.get_label(),
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
866 self.x_orig + self._w.base_widget.getStartCol(button))
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
867
11
983840425a55 Primitivus: menu is now working
Goffi <goffi@goffi.org>
parents: 10
diff changeset
868
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
869 class MenuRoller(urwid.WidgetWrap):
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
870
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
871 def __init__(self,menus_list):
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
872 """Create a MenuRoller
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
873 @param menus_list: list of tuple with (name, Menu_instance), name can be None
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
874 """
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
875 assert (menus_list)
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
876 self.selected = 0
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
877 self.name_list = []
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
878 self.menus = {}
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
879
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
880 self.columns = urwid.Columns([urwid.Text(''),urwid.Text('')])
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
881 urwid.WidgetWrap.__init__(self, self.columns)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
882
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
883 for menu_tuple in menus_list:
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
884 name,menu = menu_tuple
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
885 self.addMenu(name, menu)
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
886
77
e1655ba45fae MenuRoller doesn't propagate key pressed anymore if it manage a 'up' or 'down' event
Goffi <goffi@goffi.org>
parents: 76
diff changeset
887 def _showSelected(self):
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
888 """show menu selected"""
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
889 name_txt = u'\u21c9 '+self.name_list[self.selected]+u' \u21c7 '
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
890 current_name = ClickableText(name_txt)
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
891 name_len = len(name_txt)
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
892 current_menu = self.menus[self.name_list[self.selected]]
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
893 current_menu.setOrigX(name_len)
65
090f3e0754d3 fix for recent urwid versions (> 1.1.0)
Goffi <goffi@goffi.org>
parents: 64
diff changeset
894 self.columns.contents[0] = (current_name, ('given', name_len, False))
090f3e0754d3 fix for recent urwid versions (> 1.1.0)
Goffi <goffi@goffi.org>
parents: 64
diff changeset
895 self.columns.contents[1] = (current_menu, ('weight', 1, False))
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
896
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
897 def keypress(self, size, key):
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
898 if key==a_key['MENU_ROLLER_UP']:
88
c95462c21966 primitivus (menu): MENU_ROLLER_(UP,DOWN) are not transmitted to next widget anymore
Goffi <goffi@goffi.org>
parents: 84
diff changeset
899 if self.columns.get_focus_column()==0:
c95462c21966 primitivus (menu): MENU_ROLLER_(UP,DOWN) are not transmitted to next widget anymore
Goffi <goffi@goffi.org>
parents: 84
diff changeset
900 if self.selected > 0:
c95462c21966 primitivus (menu): MENU_ROLLER_(UP,DOWN) are not transmitted to next widget anymore
Goffi <goffi@goffi.org>
parents: 84
diff changeset
901 self.selected -= 1
c95462c21966 primitivus (menu): MENU_ROLLER_(UP,DOWN) are not transmitted to next widget anymore
Goffi <goffi@goffi.org>
parents: 84
diff changeset
902 self._showSelected()
77
e1655ba45fae MenuRoller doesn't propagate key pressed anymore if it manage a 'up' or 'down' event
Goffi <goffi@goffi.org>
parents: 76
diff changeset
903 return
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
904 elif key==a_key['MENU_ROLLER_DOWN']:
88
c95462c21966 primitivus (menu): MENU_ROLLER_(UP,DOWN) are not transmitted to next widget anymore
Goffi <goffi@goffi.org>
parents: 84
diff changeset
905 if self.columns.get_focus_column()==0:
c95462c21966 primitivus (menu): MENU_ROLLER_(UP,DOWN) are not transmitted to next widget anymore
Goffi <goffi@goffi.org>
parents: 84
diff changeset
906 if self.selected < len(self.name_list)-1:
c95462c21966 primitivus (menu): MENU_ROLLER_(UP,DOWN) are not transmitted to next widget anymore
Goffi <goffi@goffi.org>
parents: 84
diff changeset
907 self.selected += 1
c95462c21966 primitivus (menu): MENU_ROLLER_(UP,DOWN) are not transmitted to next widget anymore
Goffi <goffi@goffi.org>
parents: 84
diff changeset
908 self._showSelected()
77
e1655ba45fae MenuRoller doesn't propagate key pressed anymore if it manage a 'up' or 'down' event
Goffi <goffi@goffi.org>
parents: 76
diff changeset
909 return
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
910 elif key==a_key['MENU_ROLLER_RIGHT']:
13
8cccbaadb9c5 Primitivus: menu roller doesn't go anymore on a menu if it's empty
Goffi <goffi@goffi.org>
parents: 12
diff changeset
911 if self.columns.get_focus_column()==0 and \
65
090f3e0754d3 fix for recent urwid versions (> 1.1.0)
Goffi <goffi@goffi.org>
parents: 64
diff changeset
912 (isinstance(self.columns.contents[1][0], urwid.Text) or \
13
8cccbaadb9c5 Primitivus: menu roller doesn't go anymore on a menu if it's empty
Goffi <goffi@goffi.org>
parents: 12
diff changeset
913 self.menus[self.name_list[self.selected]].getMenuSize()==0):
8cccbaadb9c5 Primitivus: menu roller doesn't go anymore on a menu if it's empty
Goffi <goffi@goffi.org>
parents: 12
diff changeset
914 return #if we have no menu or the menu is empty, we don't go the right column
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
915
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
916 return super(MenuRoller, self).keypress(size, key)
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
917
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
918 def addMenu(self, name_param, menu):
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
919 name = name_param or ''
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
920 if name not in self.name_list:
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
921 self.name_list.append(name)
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
922 self.menus[name] = menu
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
923 if self.name_list[self.selected] == name:
77
e1655ba45fae MenuRoller doesn't propagate key pressed anymore if it manage a 'up' or 'down' event
Goffi <goffi@goffi.org>
parents: 76
diff changeset
924 self._showSelected() #if we are on the menu, we update it
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
925
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
926 def removeMenu(self, name):
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
927 if name in self.name_list:
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
928 self.name_list.remove(name)
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
929 if name in self.menus.keys():
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
930 del self.menus[name]
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
931 self.selected = 0
77
e1655ba45fae MenuRoller doesn't propagate key pressed anymore if it manage a 'up' or 'down' event
Goffi <goffi@goffi.org>
parents: 76
diff changeset
932 self._showSelected()
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
933
12
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
934 def checkShortcuts(self, key):
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
935 for menu in self.name_list:
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
936 key = self.menus[menu].checkShortcuts(key)
7e63429cc929 Primitivus: menu are now managed and fully working
Goffi <goffi@goffi.org>
parents: 11
diff changeset
937 return key
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
938
10
024b79b61a31 Primitivus: misc fixes + menubar first draft
Goffi <goffi@goffi.org>
parents: 9
diff changeset
939
6
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
940 ## DIALOGS ##
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
941
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
942 class GenericDialog(urwid.WidgetWrap):
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
943
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
944 def __init__(self, widgets_lst, title, style=None, **kwargs):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
945 if style is None:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
946 style = []
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
947 frame_header = urwid.AttrMap(urwid.Text(title,'center'),'title')
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
948
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
949 buttons = None
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
950
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
951 if "OK/CANCEL" in style:
24
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
952 cancel_arg = [kwargs['cancel_value']] if kwargs.has_key('cancel_value') else []
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
953 ok_arg = [kwargs['ok_value']] if kwargs.has_key('ok_value') else []
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
954 buttons = [urwid.Button(_("Cancel"), kwargs['cancel_cb'], *cancel_arg),
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
955 urwid.Button(_("Ok"), kwargs['ok_cb'], *ok_arg)]
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
956 elif "YES/NO" in style:
24
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
957 yes_arg = [kwargs['yes_value']] if kwargs.has_key('yes_value') else []
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
958 no_arg = [kwargs['no_value']] if kwargs.has_key('no_value') else []
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
959 buttons = [urwid.Button(_("Yes"), kwargs['yes_cb'], *yes_arg),
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
960 urwid.Button(_("No"), kwargs['no_cb'], *no_arg)]
1
a5c9603dac37 primitivus: added Alert widget
Goffi <goffi@goffi.org>
parents: 0
diff changeset
961 if "OK" in style:
24
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
962 ok_arg = [kwargs['ok_value']] if kwargs.has_key('ok_value') else []
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
963 buttons = [urwid.Button(_("Ok"), kwargs['ok_cb'], *ok_arg)]
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
964 if buttons:
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
965 buttons_flow = urwid.GridFlow(buttons, max([len(button.get_label()) for button in buttons])+4, 1, 1, 'center')
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
966 body_content = urwid.SimpleListWalker(widgets_lst)
91
b447a9c6f1d3 added UnselectableListBox which is a ListBox which can be unselectable when everything is not selectable and visible. Its is used in dialogs
Goffi <goffi@goffi.org>
parents: 90
diff changeset
967 frame_body = UnselectableListBox(body_content)
24
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
968 frame = FocusFrame(frame_body, frame_header, buttons_flow if buttons else None, 'footer' if buttons else 'body')
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
969 decorated_frame = urwid.LineBox(frame)
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
970 urwid.WidgetWrap.__init__(self, decorated_frame)
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
971
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
972
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
973 class InputDialog(GenericDialog):
7
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
974 """Dialog with an edit box"""
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
975
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
976 def __init__(self, title, instrucions, style=None, default_txt = '', **kwargs):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
977 if style is None:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
978 style = ['OK/CANCEL']
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
979 instr_wid = urwid.Text(instrucions+':')
24
67a19cfeab8f Primitivus now implement showDialog + new "newAlert" bridge method to show a dialog from core
Goffi <goffi@goffi.org>
parents: 22
diff changeset
980 edit_box = AdvancedEdit(edit_text=default_txt)
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
981 GenericDialog.__init__(self, [instr_wid,edit_box], title, style, ok_value=edit_box, **kwargs)
74
0afff3c54b6e replaced deprecated set_focus by focus_position
Goffi <goffi@goffi.org>
parents: 71
diff changeset
982 self._w.base_widget.focusposition = 'body'
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
983
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
984
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
985 class ConfirmDialog(GenericDialog):
7
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
986 """Dialog with buttons for confirm or cancel an action"""
0
cb72fb2bfa0d Primitivus: profile manager
Goffi <goffi@goffi.org>
parents:
diff changeset
987
82
c456beff1779 ConfirmDialog now manage a body message
Goffi <goffi@goffi.org>
parents: 81
diff changeset
988 def __init__(self, title, message=None, style=None, **kwargs):
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
989 if style is None:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
990 style = ['YES/NO']
82
c456beff1779 ConfirmDialog now manage a body message
Goffi <goffi@goffi.org>
parents: 81
diff changeset
991 GenericDialog.__init__(self,
c456beff1779 ConfirmDialog now manage a body message
Goffi <goffi@goffi.org>
parents: 81
diff changeset
992 [urwid.Text(message, 'center')] if message is not None else [],
c456beff1779 ConfirmDialog now manage a body message
Goffi <goffi@goffi.org>
parents: 81
diff changeset
993 title,
c456beff1779 ConfirmDialog now manage a body message
Goffi <goffi@goffi.org>
parents: 81
diff changeset
994 style,
c456beff1779 ConfirmDialog now manage a body message
Goffi <goffi@goffi.org>
parents: 81
diff changeset
995 **kwargs)
1
a5c9603dac37 primitivus: added Alert widget
Goffi <goffi@goffi.org>
parents: 0
diff changeset
996
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
997
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
998 class Alert(GenericDialog):
7
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
999 """Dialog with just a message and a OK button"""
1
a5c9603dac37 primitivus: added Alert widget
Goffi <goffi@goffi.org>
parents: 0
diff changeset
1000
a5c9603dac37 primitivus: added Alert widget
Goffi <goffi@goffi.org>
parents: 0
diff changeset
1001 def __init__(self, title, message, style=['OK'], **kwargs):
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
1002 GenericDialog.__init__(self, [urwid.Text(message, 'center')], title, style, ok_value=None, **kwargs)
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
1003
6
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
1004 ## CONTAINERS ##
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
1005
67
c270867a80f9 updated deprecated FlowWidget use
Goffi <goffi@goffi.org>
parents: 66
diff changeset
1006 class ColumnsRoller(urwid.Widget):
c270867a80f9 updated deprecated FlowWidget use
Goffi <goffi@goffi.org>
parents: 66
diff changeset
1007 _sizing = frozenset(['flow'])
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1008
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1009 def __init__(self, widget_list = None, focus_column=0):
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1010 self.widget_list = widget_list or []
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1011 self.focus_column = focus_column
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1012 self.__start = 0
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1013 self.__next = False
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1014
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1015 def addWidget(self, widget, width):
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1016 self.widget_list.append((width,widget))
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1017 if len(self.widget_list) == 1:
74
0afff3c54b6e replaced deprecated set_focus by focus_position
Goffi <goffi@goffi.org>
parents: 71
diff changeset
1018 self.focus_position = 0
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1019
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1020 def getStartCol(self, widget):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1021 """Return the column of the left corner of the widget"""
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1022 start_col = 0
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1023 for wid in self.widget_list[self.__start:]:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1024 if wid[1] == widget:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1025 return start_col
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1026 start_col+=wid[0]
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1027 return None
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1028
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1029 def selectable(self):
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1030 try:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1031 return self.widget_list[self.focus_column][1].selectable()
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1032 except IndexError:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1033 return False
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1034
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1035 def keypress(self, size, key):
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
1036 if key==a_key['COLUMNS_ROLLER_LEFT']:
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1037 if self.focus_column>0:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1038 self.focus_column-=1
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1039 self._invalidate()
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1040 return
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
1041 if key==a_key['COLUMNS_ROLLER_RIGHT']:
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1042 if self.focus_column<len(self.widget_list)-1:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1043 self.focus_column+=1
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1044 self._invalidate()
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1045 return
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1046 if self.focus_column<len(self.widget_list):
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1047 return self.widget_list[self.focus_column][1].keypress(size,key)
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1048 return key
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1049
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1050 def getSelected(self):
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1051 """Return selected widget"""
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1052 return self.widget_list[self.focus_column][1]
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1053
74
0afff3c54b6e replaced deprecated set_focus by focus_position
Goffi <goffi@goffi.org>
parents: 71
diff changeset
1054 @property
0afff3c54b6e replaced deprecated set_focus by focus_position
Goffi <goffi@goffi.org>
parents: 71
diff changeset
1055 def focus_position(self):
0afff3c54b6e replaced deprecated set_focus by focus_position
Goffi <goffi@goffi.org>
parents: 71
diff changeset
1056 return self.focus_column
0afff3c54b6e replaced deprecated set_focus by focus_position
Goffi <goffi@goffi.org>
parents: 71
diff changeset
1057
0afff3c54b6e replaced deprecated set_focus by focus_position
Goffi <goffi@goffi.org>
parents: 71
diff changeset
1058 @focus_position.setter
0afff3c54b6e replaced deprecated set_focus by focus_position
Goffi <goffi@goffi.org>
parents: 71
diff changeset
1059 def focus_position(self, idx):
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1060 if idx>len(self.widget_list)-1:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1061 idx = len(self.widget_list)-1
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1062 self.focus_column = idx
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1063
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1064 def rows(self,size,focus=False):
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1065 return 1
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1066
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1067 def __calculate_limits(self, size):
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1068 (maxcol,) = size
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1069 _prev = _next = False
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1070 start_wid = 0
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1071 end_wid = len(self.widget_list)-1
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1072
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1073 total_wid = sum([w[0] for w in self.widget_list])
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1074 while total_wid > maxcol:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1075 if self.focus_column == end_wid:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1076 if not _prev:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1077 total_wid+=1
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1078 _prev = True
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1079 total_wid-=self.widget_list[start_wid][0]
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1080 start_wid+=1
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1081 else:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1082 if not _next:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1083 total_wid+=1
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1084 _next = True
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1085 total_wid-=self.widget_list[end_wid][0]
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1086 end_wid-=1
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1087
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1088 cols_left = maxcol - total_wid
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1089 self.__start = start_wid #we need to keep it for getStartCol
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1090 return _prev,_next,start_wid,end_wid,cols_left
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1091
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1092
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1093 def mouse_event(self, size, event, button, x, y, focus):
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1094 (maxcol,)=size
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1095
53
d34f2b0f68d3 urwid 1.0.0 update: fixed missing is_mouse_press
Goffi <goffi@goffi.org>
parents: 44
diff changeset
1096 if is_mouse_press(event) and button == 1:
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1097 _prev,_next,start_wid,end_wid,cols_left = self.__calculate_limits(size)
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1098 if x==0 and _prev:
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
1099 self.keypress(size, a_key['COLUMNS_ROLLER_LEFT'])
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1100 return True
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1101 if x==maxcol-1 and _next:
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
1102 self.keypress(size, a_key['COLUMNS_ROLLER_RIGHT'])
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1103 return True
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1104
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1105 current_pos = 1 if _prev else 0
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1106 idx = 0
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1107 while current_pos<x and idx<len(self.widget_list):
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1108 width,widget = self.widget_list[idx]
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1109 if x<=current_pos+width:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1110 self.focus_column = idx
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1111 self._invalidate()
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1112 if not hasattr(widget,'mouse_event'):
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1113 return False
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1114 return widget.mouse_event((width,0), event, button,
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1115 x-current_pos, 0, focus)
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1116
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1117 current_pos+=self.widget_list[idx][0]
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1118 idx+=1
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1119
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1120 return False
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1121
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1122 def render(self, size, focus=False):
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1123 if not self.widget_list:
84
9f683df69a4c shortcut keys are now managed in separate module, with a class checking for conflicts
Goffi <goffi@goffi.org>
parents: 82
diff changeset
1124 return urwid.SolidCanvas(" ", size[0], 1)
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1125
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1126 _prev,_next,start_wid,end_wid,cols_left = self.__calculate_limits(size)
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1127
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1128 idx=start_wid
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1129 render = []
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1130
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1131 for width,widget in self.widget_list[start_wid:end_wid+1]:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1132 _focus = idx == self.focus_column and focus
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1133 render.append((widget.render((width,),_focus),False,_focus,width))
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1134 idx+=1
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1135 if _prev:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1136 render.insert(0,(urwid.Text([u"◀"]).render((1,),False),False,False,1))
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1137 if _next:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1138 render.append((urwid.Text([u"▶"],align='right').render((1+cols_left,),False),False,False,1+cols_left))
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1139 else:
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1140 render.append((urwid.SolidCanvas(" "*cols_left, size[0], 1),False,False,cols_left))
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1141
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1142 return urwid.CanvasJoin(render)
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1143
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1144
96
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1145 class FocusPile(urwid.Pile):
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1146 """A Pile Widget which manage SàT Focus keys"""
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1147 _focus_inversed = False
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1148
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1149 def keypress(self, size, key):
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1150 ret = super(FocusPile, self).keypress(size, key)
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1151 if not ret:
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1152 return
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1153
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1154 if key in FOCUS_KEYS:
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1155 direction, rotate = getFocusDirection(key, inversed = self._focus_inversed)
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1156 max_pos = len(self.contents) - 1
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1157 new_pos = self.focus_position + direction
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1158 if rotate:
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1159 if new_pos > max_pos:
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1160 new_pos = 0
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1161 elif new_pos < 0:
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1162 new_pos = max_pos
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1163 try:
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1164 self.focus_position = new_pos
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1165 except IndexError:
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1166 pass
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1167
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1168 return key
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1169
44fc94b0fe18 new FocusPile widget: a Pile which manage FOCUS_KEYS
Goffi <goffi@goffi.org>
parents: 95
diff changeset
1170
90
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1171 class FocusFrame(urwid.Frame):
94
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
1172 """Frame-like which manage SàT Focus Keys"""
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
1173
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
1174 def keypress(self, size, key):
75
8ff563825080 FocusFrame is now based on Pile instead of Frame, header, body and footer attributes can be used to change part at any time
Goffi <goffi@goffi.org>
parents: 74
diff changeset
1175 ret = super(FocusFrame, self).keypress(size, key)
19
0b83dd2b15d1 Primitivus: misc improvments on TabsContainer/FocusFrame
Goffi <goffi@goffi.org>
parents: 18
diff changeset
1176 if not ret:
0b83dd2b15d1 Primitivus: misc improvments on TabsContainer/FocusFrame
Goffi <goffi@goffi.org>
parents: 18
diff changeset
1177 return
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1178
90
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1179 if key in FOCUS_KEYS:
94
66b65ed9baf2 focus direction and rotate boolean are now gotten from getFocusDirection
Goffi <goffi@goffi.org>
parents: 91
diff changeset
1180 direction, rotate = getFocusDirection(key, inversed=True)
90
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1181
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1182 selectables = [] # keep positions which exists and have a selectable widget
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1183 for position in reversed(self):
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1184 if self.contents[position][0].selectable():
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1185 selectables.append(position)
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1186 if not selectables:
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1187 # no widget is selectable, we just return
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1188 return
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1189 idx = selectables.index(self.focus_position) + direction
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1190 if not rotate and (idx < 0 or idx >= len(selectables)):
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1191 # if we don't rotate, we stay where we are on the first and last position
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1192 return
75
8ff563825080 FocusFrame is now based on Pile instead of Frame, header, body and footer attributes can be used to change part at any time
Goffi <goffi@goffi.org>
parents: 74
diff changeset
1193 try:
90
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1194 self.focus_position = selectables[idx]
75
8ff563825080 FocusFrame is now based on Pile instead of Frame, header, body and footer attributes can be used to change part at any time
Goffi <goffi@goffi.org>
parents: 74
diff changeset
1195 except IndexError:
90
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1196 # happen if idx > len(selectables)
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1197 self.focus_position = selectables[0]
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1198 return
5
592cd64933dd Primitivus: chat window / text sending.
Goffi <goffi@goffi.org>
parents: 4
diff changeset
1199
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1200 return ret
6
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
1201
90
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1202 def get_cursor_coords(self, size):
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1203 """Return the cursor coordinates of the focus widget."""
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1204 if not self.selectable():
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1205 return None
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1206 if not hasattr(self.focus, 'get_cursor_coords'):
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1207 return None
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1208 maxcol, maxrow = size
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1209 try:
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1210 if self.focus_position != 'body':
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1211 # only body is a box widget
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1212 size = (maxcol,)
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1213 col, row = self.focus.get_cursor_coords(size)
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1214 except TypeError:
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1215 return None
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1216 if self.focus_position == 'header':
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1217 return (col, row)
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1218 if self.focus_position == 'body':
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1219 header_rows = self.header.rows((maxcol,))
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1220 return (col, row + header_rows)
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1221 if self.focus_position == 'footer':
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1222 footer_rows = self.footer.rows((maxcol,))
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1223 return (col, row + (maxrow - footer_rows))
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1224 raise Exception('This line should not be reached')
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1225
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1226
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1227 class TabsContainer(urwid.WidgetWrap):
76
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1228 """ Container which can contain multiple box widgets associated to named tabs """
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1229 signals = ['click']
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1230
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1231 def __init__(self):
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1232 self._current_tab = None
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1233 self._buttons_cont = ColumnsRoller()
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1234 self.tabs = []
90
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1235 self._frame = FocusFrame(urwid.Filler(urwid.Text('')),urwid.Pile([self._buttons_cont,urwid.Divider(u"─")]))
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1236 urwid.WidgetWrap.__init__(self, self._frame)
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1237
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1238 def keypress(self, size, key):
19
0b83dd2b15d1 Primitivus: misc improvments on TabsContainer/FocusFrame
Goffi <goffi@goffi.org>
parents: 18
diff changeset
1239 return self._w.keypress(size,key)
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1240
76
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1241 def _buttonClicked(self, button, invisible=False):
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1242 """Called when a button on the tab is changed,
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1243 change the page
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1244 @param button: button clicked
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1245 @param invisible: emit signal only if False"""
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1246 tab_name = button.get_label()
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1247 for tab in self.tabs:
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1248 if tab[0] == tab_name:
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1249 break
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1250 if tab[0] != tab_name:
89
2141f07b5fdd primitivus: no more direct error/warning methods for logging
Goffi <goffi@goffi.org>
parents: 88
diff changeset
1251 log.error(_("INTERNAL ERROR: Tab not found"))
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1252 assert(False)
90
f5992b2a0dbf FocusFrame refactoring:
Goffi <goffi@goffi.org>
parents: 89
diff changeset
1253 self._frame.body = tab[1]
26
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1254 button.set_label(('title',button.get_label()))
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1255 if self._current_tab:
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1256 self._current_tab.set_label(self._current_tab.get_label())
fcc20ac7b68a Primitivus: major changes in SelectableText, menu can now be used with mouse, TabsContainer show wich tab is selected
Goffi <goffi@goffi.org>
parents: 25
diff changeset
1257 self._current_tab = button
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1258 if not invisible:
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1259 self._emit('click')
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1260
76
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1261 def _appendButton(self, name):
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1262 """Append a button to the frame header,
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1263 and link it to the page change method"""
76
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1264 button = CustomButton(name, self._buttonClicked, left_border = '', right_border=' | ')
18
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1265 self._buttons_cont.addWidget(button, button.getSize())
bdc83e857093 Primitivus: new widget ColumnsRoller which show FlowWidgets on the same row, and can roll between them if there is not enough space
Goffi <goffi@goffi.org>
parents: 17
diff changeset
1266 if len(self._buttons_cont.widget_list) == 1:
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1267 #first button: we set the focus and the body
76
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1268 self._buttons_cont.focus_position = 0
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1269 self._buttonClicked(button,True)
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1270
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1271 def addTab(self,name,content=None):
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1272 """Add a page to the container
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1273 @param name: name of the page (what appear on the tab)
76
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1274 @param content: content of the page:
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1275 - if None create and empty Listbox
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1276 - if it is a list instance, create a ListBox with the list in a body
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1277 - else it must be a box widget which will be used instead of the ListBox
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1278 @return: ListBox (content of the page)"""
76
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1279 if content is None or isinstance(content, list):
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1280 tab = urwid.ListBox(urwid.SimpleListWalker(content or []))
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1281 else:
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1282 tab = content
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1283
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1284 self.tabs.append([name, tab])
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1285 self._appendButton(name)
6c2a1b349416 TabsContainer now accept any box widget as tab content
Goffi <goffi@goffi.org>
parents: 75
diff changeset
1286 return tab
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1287
19
0b83dd2b15d1 Primitivus: misc improvments on TabsContainer/FocusFrame
Goffi <goffi@goffi.org>
parents: 18
diff changeset
1288 def addFooter(self, widget):
0b83dd2b15d1 Primitivus: misc improvments on TabsContainer/FocusFrame
Goffi <goffi@goffi.org>
parents: 18
diff changeset
1289 """Add a widget on the bottom of the tab (will be displayed on all pages)
0b83dd2b15d1 Primitivus: misc improvments on TabsContainer/FocusFrame
Goffi <goffi@goffi.org>
parents: 18
diff changeset
1290 @param widget: FlowWidget"""
0b83dd2b15d1 Primitivus: misc improvments on TabsContainer/FocusFrame
Goffi <goffi@goffi.org>
parents: 18
diff changeset
1291 self._w.footer = widget
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1292
19
0b83dd2b15d1 Primitivus: misc improvments on TabsContainer/FocusFrame
Goffi <goffi@goffi.org>
parents: 18
diff changeset
1293
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1294 class HighlightColumns(urwid.AttrMap):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1295 """ Decorated columns which highlight all or some columns """
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1296
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1297 def __init__(self, highlight_cols, highlight_attr, *args, **kwargs):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1298 """ Create the HighlightColumns
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1299 @param highlight_cols: tuple of columns to highlight, () to highlight to whole row
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1300 @param highlight_attr: name of the attribute to use when focused
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1301 other parameter are passed to urwid Columns
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1302
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1303 """
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1304 columns = urwid.Columns(*args, **kwargs)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1305 self.highlight_cols = highlight_cols
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1306 self.highlight_attr = highlight_attr
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1307 self.has_focus = False
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1308 if highlight_cols == ():
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1309 super(HighlightColumns, self).__init__(columns, None, highlight_attr)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1310 self.highlight_cols = None
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1311 else:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1312 super(HighlightColumns, self).__init__(columns, None)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1313
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1314 @property
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1315 def options(self):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1316 return self.base_widget.options
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1317
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1318 @property
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1319 def contents(self):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1320 return self.base_widget.contents
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1321
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1322 @property
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1323 def focus_position(self):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1324 return self.base_widget.focus_position
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1325
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1326 @focus_position.setter
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1327 def focus_position(self, value):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1328 self.base_widget.focus_position = value
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1329
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1330 def addWidget(self, wid, options):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1331 """ Add a widget to the columns
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1332 Widget is wrapped with AttrMap, that's why Columns.contents should not be used directly for appending new widgets
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1333 @param wid: widget to add
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1334 @param options: result of Columns.options(...)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1335
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1336 """
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1337 wrapper = urwid.AttrMap(wid, None)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1338 self.base_widget.contents.append((wrapper, options))
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1339
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1340
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1341 def render(self, size, focus=False):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1342 if self.highlight_cols and focus != self.has_focus:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1343 self.has_focus = focus
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1344 for idx in self.highlight_cols:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1345 wid = self.base_widget.contents[idx][0]
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1346 wid.set_attr_map({None: self.highlight_attr if focus else None})
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1347
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1348 return super(HighlightColumns, self).render(size, focus)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1349
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1350
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1351 class TableContainer(urwid.WidgetWrap):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1352 """ Widgets are disposed in row and columns """
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1353 signals = ['click']
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1354
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1355 def __init__(self, items=None, columns=None, dividechars=1, row_selectable=False, select_key='enter', options=None):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1356 """ Create a TableContainer
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1357 @param items: iterable of widgets to add to this container
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1358 @param columns: nb of columns of this table
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1359 @param dividechars: same as dividechars param for urwid.Columns
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1360 @param row_selectable: if True, row are always selectable, even if they don't contain any selectable widget
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1361 @param options: dictionnary with the following keys:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1362 - ADAPT: tuple of columns for which the size must be adapted to its contents,
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1363 empty tuple for all columns
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1364 - HIGHLIGHT: tuple of columns which must be higlighted on focus,
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1365 empty tuple for the whole row
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1366 - FOCUS_ATTR: Attribute name to use when focused (see HIGHLIGHT). Default is "table_selected"
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1367
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1368 """
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1369 pile = urwid.Pile([])
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1370 super(TableContainer, self).__init__(pile)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1371 if items is None:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1372 items = []
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1373 if columns is None: # if columns is None, we suppose only one row is given in items
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1374 columns = len(items)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1375 assert columns
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1376 self._columns = columns
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1377 self._row_selectable = row_selectable
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1378 self.select_key = select_key
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1379 if options is None:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1380 options = {}
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1381 for opt in ['ADAPT', 'HIGHLIGHT']:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1382 if opt in options:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1383 try:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1384 options[opt] = tuple(options[opt])
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1385 except TypeError:
89
2141f07b5fdd primitivus: no more direct error/warning methods for logging
Goffi <goffi@goffi.org>
parents: 88
diff changeset
1386 log.warning('[%s] option is not a tuple' % opt)
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1387 options[opt] = ()
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1388 self._options = options
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1389 self._dividechars = dividechars
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1390 self._idx = 0
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1391 self._longuest = self._columns * [0]
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1392 self._next_row_idx = None
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1393 for item in items:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1394 self.addWidget(item)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1395
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1396 def _getIdealSize(self, widget):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1397 """ return preferred size for widget, or 0 if we can't find it """
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1398 try:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1399 return len(widget.text)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1400 except AttributeError:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1401 return 0
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1402
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1403 def keypress(self, size, key):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1404 if key == self.select_key and self._row_selectable:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1405 self._emit('click')
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1406 else:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1407 return super(TableContainer, self).keypress(size, key)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1408
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1409
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1410 def addWidget(self, widget):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1411 # TODO: use a contents property ?
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1412 pile = self._w
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1413 col_idx = self._idx % self._columns
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1414
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1415 options = None
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1416
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1417 if col_idx == 0:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1418 # we have a new row
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1419 columns = HighlightColumns(self._options.get('HIGHLIGHT'), self._options.get('FOCUS_ATTR', 'table_selected'), [], dividechars=self._dividechars)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1420 columns.row_idx = self._next_row_idx
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1421 pile.contents.append((columns, pile.options()))
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1422 else:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1423 columns = pile.contents[-1][0]
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1424
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1425 if 'ADAPT' in self._options and (col_idx in self._options['ADAPT']
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1426 or self._options['ADAPT'] == ()):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1427 current_len = self._getIdealSize(widget)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1428 longuest = self._longuest[col_idx]
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1429 max_len = max(longuest, current_len)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1430 if max_len > longuest:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1431 self._longuest[col_idx] = max_len
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1432 for wid,_ in pile.contents[:-1]:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1433 col = wid.base_widget
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1434 col.contents[col_idx] = (col.contents[col_idx][0], col.options('given', max_len))
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1435 options = columns.options('given', max_len) if max_len else columns.options()
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1436
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1437 columns.addWidget(widget, options or columns.options())
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1438
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1439 if self._row_selectable and col_idx == self._columns - 1:
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1440 columns.addWidget(urwid.SelectableIcon(''), columns.options('given', 0))
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1441
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1442 if not columns.selectable() and columns.contents[-1][0].base_widget.selectable():
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1443 columns.focus_position = len(columns.contents)-1
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1444 self._idx += 1
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1445
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1446 def setRowIndex(self, idx):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1447 self._next_row_idx = idx
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1448
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1449 def getSelectedWidgets(self):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1450 columns = self._w.focus
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1451 return (wid for wid, _ in columns.contents)
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1452
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1453 def getSelectedIndex(self):
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1454 columns = self._w.focus
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1455 return columns.row_idx
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1456
6
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
1457 ## DECORATORS ##
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
1458 class LabelLine(urwid.LineBox):
7
94868f58850b misc documentation
Goffi <goffi@goffi.org>
parents: 6
diff changeset
1459 """Like LineBox, but with a Label centered in the top line"""
6
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
1460
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
1461 def __init__(self, original_widget, label_widget):
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
1462 urwid.LineBox.__init__(self, original_widget)
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
1463 top_columns = self._w.widget_list[0]
d586d06a9d8f primitivus group chat & misc
Goffi <goffi@goffi.org>
parents: 5
diff changeset
1464 top_columns.widget_list[1] = label_widget
8
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
1465
70
24d49f1d735f added TableContainer + some bug fixes (bad default parameters)
Goffi <goffi@goffi.org>
parents: 69
diff changeset
1466
8
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
1467 class VerticalSeparator(urwid.WidgetDecoration, urwid.WidgetWrap):
21
96a2c5904e35 Primitivus: send_file first draft
Goffi <goffi@goffi.org>
parents: 20
diff changeset
1468 def __init__(self, original_widget, left_char = u"│", right_char = ''):
15
8241b3157699 Primitivus: custom_widgets imrpovments
Goffi <goffi@goffi.org>
parents: 14
diff changeset
1469 """Draw a separator on left and/or right of original_widget."""
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1470
8
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
1471 widgets = [original_widget]
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
1472 if left_char:
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
1473 widgets.insert(0, ('fixed', 1, urwid.SolidFill(left_char)))
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
1474 if right_char:
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
1475 widgets.append(('fixed', 1, urwid.SolidFill(right_char)))
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
1476 columns = urwid.Columns(widgets, box_columns = [0,2], focus_column = 1)
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
1477 urwid.WidgetDecoration.__init__(self, original_widget)
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
1478 urwid.WidgetWrap.__init__(self, columns)
ec01505ec109 primitivus chat window
Goffi <goffi@goffi.org>
parents: 7
diff changeset
1479
66
287ff3e1edd1 removed trailing spaces
Goffi <goffi@goffi.org>
parents: 65
diff changeset
1480