annotate getan/view.py @ 488:463894654d77 3.0

Prepares for release 3.0 rename getan-eval.py to getan-report. rename getan-report.py to getan-day-report installed getan-report as script. installed getan-day-report as script. set python_requires to >=3.4
author Magnus Schieder <mschieder@intevation.de>
date Fri, 29 Jun 2018 19:47:01 +0200
parents 1855b1ef2834
children
rev   line source
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
2 #
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
3 # (c) 2010 by Ingo Weinzierl <ingo.weinzierl@intevation.de>
138
bb6ddef4f88f Update copyright and add my name
Björn Ricks <bjoern.ricks@intevation.de>
parents: 137
diff changeset
4 # (c) 2012 by Björn Ricks <bjoern.ricks@intevation.de>
488
463894654d77 Prepares for release 3.0
Magnus Schieder <mschieder@intevation.de>
parents: 475
diff changeset
5 # (c) 2017, 2018 Intevation GmbH
463894654d77 Prepares for release 3.0
Magnus Schieder <mschieder@intevation.de>
parents: 475
diff changeset
6 # Authors:
463894654d77 Prepares for release 3.0
Magnus Schieder <mschieder@intevation.de>
parents: 475
diff changeset
7 # * Magnus Schieder <magnus.schieder@intevation.de>
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
8 #
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
9 # This is Free Software licensed under the terms of GPLv3 or later.
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
10 # For details see LICENSE coming with the source of 'getan'.
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
11 #
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
12
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
13 import logging
43
39d845d3fec4 Fix for #1638
Sascha L. Teichmann <teichmann@intevation.de>
parents: 41
diff changeset
14 import locale
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
15
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
16 import urwid
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
17 import urwid.raw_display
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
18
252
8be9c557e4b5 Show version number in getan header
Björn Ricks <bjoern.ricks@intevation.de>
parents: 245
diff changeset
19 import getan
8be9c557e4b5 Show version number in getan header
Björn Ricks <bjoern.ricks@intevation.de>
parents: 245
diff changeset
20
212
9badfbb04ac9 Add set_focus method to GetanView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 211
diff changeset
21 from getan.nodes import ProjectNode, EntryNode
36
e6f81aa329b1 Introduced i18n support; german and english translation available.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents: 34
diff changeset
22 from getan.resources import gettext as _
224
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
23 from getan.utils import human_time
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
24 from getan.walker import ListWalker
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
25
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
26 logger = logging.getLogger()
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
27
299
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
28
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
29 class ListWidget(urwid.BoxWidget):
62
2b600cccf95e Add scrolling in entry list to be able to select all entries
Björn Ricks <bjoern.ricks@intevation.de>
parents: 43
diff changeset
30
224
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
31 node_class = None
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
32
224
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
33 def __init__(self, title, rows, header=None, footer=None):
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
34 self.title = title
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
35 self.rows = [self.node_class(x) for x in rows]
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
36 self.header = header
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
37 self.footer = footer or urwid.Text("")
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
38 self.selection = []
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
39 self.set_node_rows(self.rows)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
40 self.set_focus(0)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
41
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
42 def set_title(self, title):
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
43 self.title = title
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
44 self.body.set_title(self.title)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
45
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
46 def set_header(self, header):
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
47 self.header = header
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
48 self.frame.set_header(header)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
49
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
50 def set_footer(self, footer):
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
51 self.footer = footer
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
52 self.frame.set_footer(footer)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
53
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
54 def set_body(self, body):
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
55 self.body = body
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
56 self.frame.set_body(body)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
57
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
58 def set_focus(self, idx):
285
983c4279e08d Only set focus in ListBox if rows are available
Björn Ricks <bjoern.ricks@intevation.de>
parents: 275
diff changeset
59 if not idx:
983c4279e08d Only set focus in ListBox if rows are available
Björn Ricks <bjoern.ricks@intevation.de>
parents: 275
diff changeset
60 idx = 0
983c4279e08d Only set focus in ListBox if rows are available
Björn Ricks <bjoern.ricks@intevation.de>
parents: 275
diff changeset
61
224
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
62 self.frame.set_focus("body")
285
983c4279e08d Only set focus in ListBox if rows are available
Björn Ricks <bjoern.ricks@intevation.de>
parents: 275
diff changeset
63
983c4279e08d Only set focus in ListBox if rows are available
Björn Ricks <bjoern.ricks@intevation.de>
parents: 275
diff changeset
64 if self.rows:
983c4279e08d Only set focus in ListBox if rows are available
Björn Ricks <bjoern.ricks@intevation.de>
parents: 275
diff changeset
65 self.listbox.set_focus(idx)
983c4279e08d Only set focus in ListBox if rows are available
Björn Ricks <bjoern.ricks@intevation.de>
parents: 275
diff changeset
66
224
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
67 self._invalidate()
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
68
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
69 def keypress(self, size, key):
230
8e9e894552e8 Lower debug output
Björn Ricks <bjoern.ricks@intevation.de>
parents: 228
diff changeset
70 logger.debug("Handling keypres for %r" % self)
224
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
71 return self.frame.keypress(size, key)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
72
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
73 def set_rows(self, rows):
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
74 logger.info("ListView setting rows %s" % rows)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
75 if rows:
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
76 self.rows = [self.node_class(x) for x in rows]
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
77 else:
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
78 self.rows = []
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
79 self.set_node_rows(self.rows)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
80
469
050ffdec60d9 Fix the orientation problem
Magnus Schieder <mschieder@intevation.de>
parents: 379
diff changeset
81 def set_node_rows(self, rows, position=None):
224
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
82 """ Sets node_class rows in the walker """
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
83 self.walker = ListWalker(self.rows, self)
469
050ffdec60d9 Fix the orientation problem
Magnus Schieder <mschieder@intevation.de>
parents: 379
diff changeset
84 # Set the position of the walker in the project list.
050ffdec60d9 Fix the orientation problem
Magnus Schieder <mschieder@intevation.de>
parents: 379
diff changeset
85 if position:
050ffdec60d9 Fix the orientation problem
Magnus Schieder <mschieder@intevation.de>
parents: 379
diff changeset
86 self.walker.set_focus(position)
224
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
87 self.listbox = urwid.ListBox(self.walker)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
88 self.body = urwid.LineBox(self.listbox, title=self.title)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
89 self.frame = urwid.Frame(self.body, header=self.header,
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
90 footer=self.footer)
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
91 self._invalidate()
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
92
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
93 def render(self, size, focus=False):
217
7d6615ac2453 Shorten code
Björn Ricks <bjoern.ricks@intevation.de>
parents: 216
diff changeset
94 return self.frame.render(size, focus)
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
95
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
96 def set_footer_text(self, text, attr, edit=False):
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
97 if edit:
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
98 logger.debug("ListWidget: set footer text (edit) = '%s'" % text)
214
6d5c8e205872 Fix coding style
Björn Ricks <bjoern.ricks@intevation.de>
parents: 213
diff changeset
99 self.footer = urwid.AttrWrap(urwid.Edit(text), attr)
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
100 else:
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
101 logger.debug("ListWidget: set footer text = '%s'" % text)
218
29e1a68589a0 Update code to set the current footer
Björn Ricks <bjoern.ricks@intevation.de>
parents: 217
diff changeset
102 self.footer = urwid.AttrWrap(urwid.Text(text), attr)
29e1a68589a0 Update code to set the current footer
Björn Ricks <bjoern.ricks@intevation.de>
parents: 217
diff changeset
103 self.frame.set_footer(self.footer)
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
104
469
050ffdec60d9 Fix the orientation problem
Magnus Schieder <mschieder@intevation.de>
parents: 379
diff changeset
105 def highlight_open_project(self):
050ffdec60d9 Fix the orientation problem
Magnus Schieder <mschieder@intevation.de>
parents: 379
diff changeset
106 item = self.item_in_focus()
050ffdec60d9 Fix the orientation problem
Magnus Schieder <mschieder@intevation.de>
parents: 379
diff changeset
107 if item:
050ffdec60d9 Fix the orientation problem
Magnus Schieder <mschieder@intevation.de>
parents: 379
diff changeset
108 item.open = True
050ffdec60d9 Fix the orientation problem
Magnus Schieder <mschieder@intevation.de>
parents: 379
diff changeset
109
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
110 def row_count(self):
135
ce707fbb9666 Change coding style of if clauses
Björn Ricks <bjoern.ricks@intevation.de>
parents: 132
diff changeset
111 if not self.rows:
ce707fbb9666 Change coding style of if clauses
Björn Ricks <bjoern.ricks@intevation.de>
parents: 132
diff changeset
112 return 0
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
113 return len(self.rows)
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
114
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
115 def item_in_focus(self):
215
a16c2c42d998 Use node_in_focus to get item_in_focus
Björn Ricks <bjoern.ricks@intevation.de>
parents: 214
diff changeset
116 node = self.node_in_focus()
a16c2c42d998 Use node_in_focus to get item_in_focus
Björn Ricks <bjoern.ricks@intevation.de>
parents: 214
diff changeset
117 if node:
a16c2c42d998 Use node_in_focus to get item_in_focus
Björn Ricks <bjoern.ricks@intevation.de>
parents: 214
diff changeset
118 return node.get_item()
41
f44f808e7d47 Make getan runnable if there is no project in database.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 36
diff changeset
119 return None
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
120
86
c9684f6d54ea Add new method in ListWidget to get the current node element
Björn Ricks <bjoern.ricks@intevation.de>
parents: 71
diff changeset
121 def node_in_focus(self):
c9684f6d54ea Add new method in ListWidget to get the current node element
Björn Ricks <bjoern.ricks@intevation.de>
parents: 71
diff changeset
122 if self.rows:
224
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
123 return self.listbox.get_focus()[0]
86
c9684f6d54ea Add new method in ListWidget to get the current node element
Björn Ricks <bjoern.ricks@intevation.de>
parents: 71
diff changeset
124 return None
c9684f6d54ea Add new method in ListWidget to get the current node element
Björn Ricks <bjoern.ricks@intevation.de>
parents: 71
diff changeset
125
233
68fa56dacbcd Add new get_focus_pos method to ListView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 230
diff changeset
126 def get_focus_pos(self):
68fa56dacbcd Add new get_focus_pos method to ListView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 230
diff changeset
127 return self.listbox.get_focus()[1]
68fa56dacbcd Add new get_focus_pos method to ListView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 230
diff changeset
128
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
129 def select(self):
135
ce707fbb9666 Change coding style of if clauses
Björn Ricks <bjoern.ricks@intevation.de>
parents: 132
diff changeset
130 if not self.rows:
ce707fbb9666 Change coding style of if clauses
Björn Ricks <bjoern.ricks@intevation.de>
parents: 132
diff changeset
131 return None
219
71638dcc5a0f Remove self.focused usage
Björn Ricks <bjoern.ricks@intevation.de>
parents: 218
diff changeset
132 node = self.node_in_focus()
71638dcc5a0f Remove self.focused usage
Björn Ricks <bjoern.ricks@intevation.de>
parents: 218
diff changeset
133 logger.info("ListWidget: select row '%s'" % node)
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
134 if node.selected:
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
135 self.selection.append(node)
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
136 else:
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
137 if node in self.selection:
475
1855b1ef2834 Multiple selection, Removes the selected entry, not the last one added.
Magnus Schieder <mschieder@intevation.de>
parents: 474
diff changeset
138 self.selection.remove(node)
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
139 logger.debug("ListWidget: all selected rows: %r" % self.selection)
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
140 return node
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
141
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
142 def clear(self):
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
143 logger.debug("EntryList: clear focus and selection of all entries.")
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
144 for node in self.selection:
135
ce707fbb9666 Change coding style of if clauses
Björn Ricks <bjoern.ricks@intevation.de>
parents: 132
diff changeset
145 if node.selected:
ce707fbb9666 Change coding style of if clauses
Björn Ricks <bjoern.ricks@intevation.de>
parents: 132
diff changeset
146 node.select()
474
0d831a9f547b Better multi-selection bugfix. Solves mistakes from the old fix. (ca6d11781e2f)
Magnus Schieder <mschieder@intevation.de>
parents: 469
diff changeset
147 self.selection = []
219
71638dcc5a0f Remove self.focused usage
Björn Ricks <bjoern.ricks@intevation.de>
parents: 218
diff changeset
148 self.set_focus(0)
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
149
224
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
150 def content_focus_changed(self):
c8f85809607b Implement a more generalized ListWidget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 223
diff changeset
151 pass
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
152
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
153
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
154 class ProjectList(ListWidget):
141
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
155
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
156 PROJECT_MODES = {
299
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
157 0: "id",
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
158 1: "key",
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
159 2: "desc",
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
160 3: "tree",
141
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
161 }
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
162
227
1b29cc99f457 Use ListWidget for EntryList and ProjectList
Björn Ricks <bjoern.ricks@intevation.de>
parents: 226
diff changeset
163 node_class = ProjectNode
1b29cc99f457 Use ListWidget for EntryList and ProjectList
Björn Ricks <bjoern.ricks@intevation.de>
parents: 226
diff changeset
164
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
165 def __init__(self, controller, rows):
220
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
166 self.selection = []
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
167 self.size = ()
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
168 self.top = 0
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
169 self.controller = controller
141
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
170 self.project_mode = 0
306
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
171 self.selection_deactivated = False
220
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
172 self.set_raw_rows(rows)
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
173 super(ProjectList, self).__init__("Projects", rows)
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
174 self.create_node_rows()
263
077c2ce02f93 Refactor ProjectList setting the total_time
Björn Ricks <bjoern.ricks@intevation.de>
parents: 260
diff changeset
175 self.show_total_time()
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
176
107
a23e8191c6bc Update project list when a new project was created
Björn Ricks <bjoern.ricks@intevation.de>
parents: 86
diff changeset
177 def load_rows(self, rows):
220
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
178 self.set_raw_rows(rows)
141
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
179 self.update_rows()
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
180
220
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
181 def set_raw_rows(self, rows):
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
182 self.raw_rows = rows
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
183
141
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
184 def update_rows(self):
220
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
185 self.create_node_rows()
469
050ffdec60d9 Fix the orientation problem
Magnus Schieder <mschieder@intevation.de>
parents: 379
diff changeset
186 self.set_node_rows(self.rows, position=self.get_focus_pos())
220
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
187
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
188 def create_node_rows(self):
54e8b355164c Refactor ProjecList node initialisation
Björn Ricks <bjoern.ricks@intevation.de>
parents: 219
diff changeset
189 """ Sets self.rows to node_class rows depending on the project_mode """
163
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
190 if self.project_mode == 3:
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
191 self.rows = self.create_project_tree()
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
192 else:
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
193 self.rows = self.create_project_list()
107
a23e8191c6bc Update project list when a new project was created
Björn Ricks <bjoern.ricks@intevation.de>
parents: 86
diff changeset
194
163
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
195 def create_project_list(self):
299
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
196 return [ProjectNode(x) for x in sorted(
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
197 self.raw_rows, key=lambda row: self._get_project_sort_key(row))]
163
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
198
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
199 def create_project_tree(self):
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
200 # create a simple one child tree until now
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
201 # this should be extended and improved in future
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
202 nodes = []
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
203 keys = []
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
204 for proj in sorted(self.raw_rows, key=lambda proj: proj.key):
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
205 k = proj.key[0]
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
206 if k in keys:
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
207 nodes.append(ProjectNode(proj, indent=3))
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
208 else:
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
209 keys.append(k)
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
210 nodes.append(ProjectNode(proj))
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
211 return nodes
1c01c061dfb3 Add new project mode to display a project tree
Björn Ricks <bjoern.ricks@intevation.de>
parents: 162
diff changeset
212
141
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
213 def _get_project_sort_key(self, proj):
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
214 return getattr(proj, self.PROJECT_MODES[self.project_mode])
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
215
263
077c2ce02f93 Refactor ProjectList setting the total_time
Björn Ricks <bjoern.ricks@intevation.de>
parents: 260
diff changeset
216 def show_total_time(self):
077c2ce02f93 Refactor ProjectList setting the total_time
Björn Ricks <bjoern.ricks@intevation.de>
parents: 260
diff changeset
217 self.total_time()
077c2ce02f93 Refactor ProjectList setting the total_time
Björn Ricks <bjoern.ricks@intevation.de>
parents: 260
diff changeset
218 self.reset_footer()
077c2ce02f93 Refactor ProjectList setting the total_time
Björn Ricks <bjoern.ricks@intevation.de>
parents: 260
diff changeset
219
077c2ce02f93 Refactor ProjectList setting the total_time
Björn Ricks <bjoern.ricks@intevation.de>
parents: 260
diff changeset
220 def total_time(self):
129
c8ae4ec4ba61 Put return statement on the next line
Björn Ricks <bjoern.ricks@intevation.de>
parents: 107
diff changeset
221 if not self.rows:
260
e206ab753a26 Set empty project_footer if no projects are available
Björn Ricks <bjoern.ricks@intevation.de>
parents: 257
diff changeset
222 self.set_footer_text("", "project_footer")
129
c8ae4ec4ba61 Put return statement on the next line
Björn Ricks <bjoern.ricks@intevation.de>
parents: 107
diff changeset
223 return
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
224 logger.debug("ProjectList: update projects total time.")
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
225 total = 0
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
226 for proj in self.rows:
34
a9f2e8fd8970 'NoneType' time values don't break getan while switching time mode anymore (issue1575).
Ingo Weinzierl <ingo_weinzierl@web.de>
parents: 28
diff changeset
227 tmp = proj._get_time()
379
47890f38e558 Let getan crash if entry _get_time doesn't return an int
Björn Ricks <bjoern.ricks@intevation.de>
parents: 322
diff changeset
228 if tmp:
34
a9f2e8fd8970 'NoneType' time values don't break getan while switching time mode anymore (issue1575).
Ingo Weinzierl <ingo_weinzierl@web.de>
parents: 28
diff changeset
229 total += tmp
131
3d5232dad59a Add methods to reset the ProjectList footer
Björn Ricks <bjoern.ricks@intevation.de>
parents: 129
diff changeset
230 self.set_footer_info("All projects: %s %s"
64
94c2c3eeac9a Use set_footer_text method to set the footer text instead of
Björn Ricks <bjoern.ricks@intevation.de>
parents: 63
diff changeset
231 % (proj.mode[1], human_time(total)),
94c2c3eeac9a Use set_footer_text method to set the footer text instead of
Björn Ricks <bjoern.ricks@intevation.de>
parents: 63
diff changeset
232 "project_footer")
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
233
131
3d5232dad59a Add methods to reset the ProjectList footer
Björn Ricks <bjoern.ricks@intevation.de>
parents: 129
diff changeset
234 def set_footer_info(self, text, attr):
3d5232dad59a Add methods to reset the ProjectList footer
Björn Ricks <bjoern.ricks@intevation.de>
parents: 129
diff changeset
235 logger.debug("ProjectList: set_footer_info to '%s'" % text)
3d5232dad59a Add methods to reset the ProjectList footer
Björn Ricks <bjoern.ricks@intevation.de>
parents: 129
diff changeset
236 self._footer_info = (text, attr)
3d5232dad59a Add methods to reset the ProjectList footer
Björn Ricks <bjoern.ricks@intevation.de>
parents: 129
diff changeset
237
3d5232dad59a Add methods to reset the ProjectList footer
Björn Ricks <bjoern.ricks@intevation.de>
parents: 129
diff changeset
238 def reset_footer(self):
260
e206ab753a26 Set empty project_footer if no projects are available
Björn Ricks <bjoern.ricks@intevation.de>
parents: 257
diff changeset
239 if not self.rows:
e206ab753a26 Set empty project_footer if no projects are available
Björn Ricks <bjoern.ricks@intevation.de>
parents: 257
diff changeset
240 self.set_footer_text("", "project_footer")
e206ab753a26 Set empty project_footer if no projects are available
Björn Ricks <bjoern.ricks@intevation.de>
parents: 257
diff changeset
241 return
299
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
242 logger.debug("ProjectList: reset_footer to '%s'" %
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
243 self._footer_info[0])
131
3d5232dad59a Add methods to reset the ProjectList footer
Björn Ricks <bjoern.ricks@intevation.de>
parents: 129
diff changeset
244 self.set_footer_text(*self._footer_info)
3d5232dad59a Add methods to reset the ProjectList footer
Björn Ricks <bjoern.ricks@intevation.de>
parents: 129
diff changeset
245
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
246 def switch_time_mode(self):
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
247 logger.debug("ProjectList: switch time mode now.")
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
248 for proj in self.rows:
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
249 proj.switch_time_mode()
274
1477a5fbf0cd Fix showing the total time
Björn Ricks <bjoern.ricks@intevation.de>
parents: 264
diff changeset
250 self.show_total_time()
194
cf98dc7f9354 Move mainloop related code to GetanController
Björn Ricks <bjoern.ricks@intevation.de>
parents: 168
diff changeset
251 self.controller.loop.draw_screen()
228
37010cd332d9 Invalidate view to redraw it when time is changed
Björn Ricks <bjoern.ricks@intevation.de>
parents: 227
diff changeset
252 self._invalidate()
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
253
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
254 def unhandled_keypress(self, key):
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
255 logger.debug("ProjectList: unhandled keypress '%r'" % key)
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
256
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
257 def select_project(self, project):
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
258 for proj_node in self.rows:
27
1a90a126c415 Bugfix: fixed wrong attribute name while accessing raw projects of a ProjectNode.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 25
diff changeset
259 if proj_node.item.key == project.key:
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
260 idx = self.rows.index(proj_node)
223
aa7b1efb7689 Fix setting the focus in the ProjectList
Björn Ricks <bjoern.ricks@intevation.de>
parents: 222
diff changeset
261 self.set_focus(idx)
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
262 self.select()
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
263 break
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
264
141
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
265 def switch_project_order(self):
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
266 self.project_mode += 1
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
267 if self.project_mode >= len(self.PROJECT_MODES):
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
268 self.project_mode = 0
162
7e6f92773b03 Log when switching the project mode
Björn Ricks <bjoern.ricks@intevation.de>
parents: 161
diff changeset
269 logger.debug("Switching project mode to %s" % self.project_mode)
141
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
270 self.update_rows()
223
aa7b1efb7689 Fix setting the focus in the ProjectList
Björn Ricks <bjoern.ricks@intevation.de>
parents: 222
diff changeset
271 self.set_focus(0)
141
dafff6c3fa12 Add code to be able to sort the project list
Björn Ricks <bjoern.ricks@intevation.de>
parents: 140
diff changeset
272
226
f8571308abef Move ProjectNode and EntryNode to its own module
Björn Ricks <bjoern.ricks@intevation.de>
parents: 224
diff changeset
273 def content_focus_changed(self):
f8571308abef Move ProjectNode and EntryNode to its own module
Björn Ricks <bjoern.ricks@intevation.de>
parents: 224
diff changeset
274 item = self.item_in_focus()
230
8e9e894552e8 Lower debug output
Björn Ricks <bjoern.ricks@intevation.de>
parents: 228
diff changeset
275 logger.debug("Conten in focus changed %s" % item)
226
f8571308abef Move ProjectNode and EntryNode to its own module
Björn Ricks <bjoern.ricks@intevation.de>
parents: 224
diff changeset
276 if item:
f8571308abef Move ProjectNode and EntryNode to its own module
Björn Ricks <bjoern.ricks@intevation.de>
parents: 224
diff changeset
277 self.controller.update_entries(item)
71
c1664ea5a83b Add get_item method also for EntryNode to be able to receive an entry
Björn Ricks <bjoern.ricks@intevation.de>
parents: 70
diff changeset
278
306
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
279 def keypress(self, size, key):
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
280 if key == "enter" and self.is_selection_deactivated():
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
281 return
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
282 else:
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
283 return super(ProjectList, self).keypress(size, key)
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
284
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
285 def is_selection_deactivated(self):
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
286 return self.selection_deactivated
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
287
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
288 def deactivate_selection(self):
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
289 self.selection_deactivated = True
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
290
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
291 def enable_selection(self):
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
292 self.selection_deactivated = False
afe36c18417f Allow to deactivate the selection of projects
Björn Ricks <bjoern.ricks@intevation.de>
parents: 299
diff changeset
293
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
294
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
295 class EntryList(ListWidget):
137
5a4946fd9e6d Update whitespace
Björn Ricks <bjoern.ricks@intevation.de>
parents: 135
diff changeset
296
227
1b29cc99f457 Use ListWidget for EntryList and ProjectList
Björn Ricks <bjoern.ricks@intevation.de>
parents: 226
diff changeset
297 node_class = EntryNode
1b29cc99f457 Use ListWidget for EntryList and ProjectList
Björn Ricks <bjoern.ricks@intevation.de>
parents: 226
diff changeset
298
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
299 def __init__(self, rows):
227
1b29cc99f457 Use ListWidget for EntryList and ProjectList
Björn Ricks <bjoern.ricks@intevation.de>
parents: 226
diff changeset
300 logger.debug("Init EntryList %s" % id(self))
1b29cc99f457 Use ListWidget for EntryList and ProjectList
Björn Ricks <bjoern.ricks@intevation.de>
parents: 226
diff changeset
301 super(EntryList, self).__init__("Entries", rows)
1b29cc99f457 Use ListWidget for EntryList and ProjectList
Björn Ricks <bjoern.ricks@intevation.de>
parents: 226
diff changeset
302 self.set_footer_text("", "entry_footer")
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
303
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
304
210
43e8befd5dd9 Convert GetanView into a urwid widget
Björn Ricks <bjoern.ricks@intevation.de>
parents: 209
diff changeset
305 class GetanView(urwid.WidgetWrap):
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
306
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
307 def __init__(self, controller, proj_list, entr_list):
43
39d845d3fec4 Fix for #1638
Sascha L. Teichmann <teichmann@intevation.de>
parents: 41
diff changeset
308 encoding = locale.getpreferredencoding()
39d845d3fec4 Fix for #1638
Sascha L. Teichmann <teichmann@intevation.de>
parents: 41
diff changeset
309 urwid.set_encoding(encoding)
39d845d3fec4 Fix for #1638
Sascha L. Teichmann <teichmann@intevation.de>
parents: 41
diff changeset
310 logger.debug("used encoding: %s" % encoding)
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
311 self.controller = controller
209
bffca92237b8 Update coding style in GetanView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 208
diff changeset
312 self.proj_list = proj_list
bffca92237b8 Update coding style in GetanView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 208
diff changeset
313 self.entr_list = entr_list
bffca92237b8 Update coding style in GetanView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 208
diff changeset
314 self.columns = urwid.Columns([
299
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
315 urwid.Padding(
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
316 self.proj_list, ('fixed left', 0), ('fixed right', 1)),
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
317 self.entr_list], 0)
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
318
252
8be9c557e4b5 Show version number in getan header
Björn Ricks <bjoern.ricks@intevation.de>
parents: 245
diff changeset
319 getan_header = urwid.AttrWrap(urwid.Text('%s' % _('.: getan :.')),
8be9c557e4b5 Show version number in getan header
Björn Ricks <bjoern.ricks@intevation.de>
parents: 245
diff changeset
320 'header')
299
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
321 version_header = urwid.AttrWrap(urwid.Text(
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
322 "Version %s" % getan.__version__, align="right"), "header")
252
8be9c557e4b5 Show version number in getan header
Björn Ricks <bjoern.ricks@intevation.de>
parents: 245
diff changeset
323
8be9c557e4b5 Show version number in getan header
Björn Ricks <bjoern.ricks@intevation.de>
parents: 245
diff changeset
324 self.header = urwid.Columns([getan_header, version_header])
209
bffca92237b8 Update coding style in GetanView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 208
diff changeset
325 self.footer = urwid.AttrWrap(urwid.Text(_('Choose a project:')),
299
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
326 'question')
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
327 self.col_list = self.columns.widget_list
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
328 view = urwid.AttrWrap(self.columns, 'body')
299
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
329 self.frame = urwid.Frame(view, header=self.header, footer=self.footer)
244
6aed37250c35 Rename GetanView member variable view to frame
Björn Ricks <bjoern.ricks@intevation.de>
parents: 241
diff changeset
330 self._w = self.frame
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
331
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
332 def get_frame(self):
244
6aed37250c35 Rename GetanView member variable view to frame
Björn Ricks <bjoern.ricks@intevation.de>
parents: 241
diff changeset
333 return self.frame
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
334
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
335 def set_footer_text(self, text, attr, edit=False):
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
336 if edit:
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
337 logger.debug("GetanView: set footer text (edit): '%s'" % text)
244
6aed37250c35 Rename GetanView member variable view to frame
Björn Ricks <bjoern.ricks@intevation.de>
parents: 241
diff changeset
338 self.frame.set_footer(urwid.AttrWrap(urwid.Edit(text), attr))
6aed37250c35 Rename GetanView member variable view to frame
Björn Ricks <bjoern.ricks@intevation.de>
parents: 241
diff changeset
339 self.frame.set_focus("footer")
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
340 else:
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
341 logger.debug("GetanView: set footer text: '%s'" % text)
299
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
342 self.frame.set_footer(urwid.AttrWrap(urwid.Text(text), attr))
23
9c4e8ba3c4fa Added a new implementation of 'getan' based on urwid, a python console user interface library.
Ingo Weinzierl <ingo_weinzierl@web.de>
parents:
diff changeset
343
208
e1e885b88baf Implement keypress in GetanView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 194
diff changeset
344 def keypress(self, size, key):
e1e885b88baf Implement keypress in GetanView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 194
diff changeset
345 self.controller.state.keypress(size, key)
211
b71dc50fbd51 Add GetanView update_entries method
Björn Ricks <bjoern.ricks@intevation.de>
parents: 210
diff changeset
346
254
70e4f59f991c Ignore mouse events for the moment
Björn Ricks <bjoern.ricks@intevation.de>
parents: 252
diff changeset
347 def mouse_event(self, size, event, button, col, row, focus):
299
a437bbc507a9 Fix codingstyle for pep8
Björn Ricks <bjoern.ricks@intevation.de>
parents: 298
diff changeset
348 # TODO currently ignore mouse events
254
70e4f59f991c Ignore mouse events for the moment
Björn Ricks <bjoern.ricks@intevation.de>
parents: 252
diff changeset
349 return True
70e4f59f991c Ignore mouse events for the moment
Björn Ricks <bjoern.ricks@intevation.de>
parents: 252
diff changeset
350
211
b71dc50fbd51 Add GetanView update_entries method
Björn Ricks <bjoern.ricks@intevation.de>
parents: 210
diff changeset
351 def update_entries(self, entries):
b71dc50fbd51 Add GetanView update_entries method
Björn Ricks <bjoern.ricks@intevation.de>
parents: 210
diff changeset
352 self.entr_list.set_rows(entries)
212
9badfbb04ac9 Add set_focus method to GetanView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 211
diff changeset
353
245
4ecc6bdf0698 Allow to set focus on column or frame element in GetanView set_focus
Björn Ricks <bjoern.ricks@intevation.de>
parents: 244
diff changeset
354 def set_focus(self, elem):
4ecc6bdf0698 Allow to set focus on column or frame element in GetanView set_focus
Björn Ricks <bjoern.ricks@intevation.de>
parents: 244
diff changeset
355 if elem in [0, 1]:
4ecc6bdf0698 Allow to set focus on column or frame element in GetanView set_focus
Björn Ricks <bjoern.ricks@intevation.de>
parents: 244
diff changeset
356 self.columns.set_focus_column(elem)
257
2df167b07763 Allow to set focus to the project or entry list in getan view via strings
Björn Ricks <bjoern.ricks@intevation.de>
parents: 254
diff changeset
357 elif elem == "projects":
275
822c4facbb65 Set focus of the frame to body when set_focus in GetanView is called to set the
Björn Ricks <bjoern.ricks@intevation.de>
parents: 274
diff changeset
358 self.frame.set_focus("body")
264
915456b53f34 Fix typo
Björn Ricks <bjoern.ricks@intevation.de>
parents: 263
diff changeset
359 self.columns.set_focus_column(0)
257
2df167b07763 Allow to set focus to the project or entry list in getan view via strings
Björn Ricks <bjoern.ricks@intevation.de>
parents: 254
diff changeset
360 elif elem == "entries":
275
822c4facbb65 Set focus of the frame to body when set_focus in GetanView is called to set the
Björn Ricks <bjoern.ricks@intevation.de>
parents: 274
diff changeset
361 self.frame.set_focus("body")
264
915456b53f34 Fix typo
Björn Ricks <bjoern.ricks@intevation.de>
parents: 263
diff changeset
362 self.columns.set_focus_column(1)
245
4ecc6bdf0698 Allow to set focus on column or frame element in GetanView set_focus
Björn Ricks <bjoern.ricks@intevation.de>
parents: 244
diff changeset
363 else:
4ecc6bdf0698 Allow to set focus on column or frame element in GetanView set_focus
Björn Ricks <bjoern.ricks@intevation.de>
parents: 244
diff changeset
364 self.frame.set_focus(elem)
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)