1 from ui
.utils
import human_unit
, short_string
11 # '+' = 1, 3, 4, 5, 7 = (1<<1) + (1<<3) + (1<<4) + (1<<5) + (1<<7) = 186
13 HLINE_START
= (1<<4) + (1<<5)
14 HLINE_END
= (1<<3) + (1<<4)
15 HLINE
= HLINE_START | HLINE_END
17 VLINE_START
= (1<<4) + (1<<7)
18 VLINE_END
= (1<<1) + (1<<4)
19 VLINE
= VLINE_START | VLINE_END
25 def __init__(self
, width
, height
, tree
, selected_item
=None):
29 self
.selected_item
= selected_item
30 self
.matrix
= [[0 for i
in xrange(width
)] for j
in xrange(height
)]
31 self
._horizontal
_line
(0, 0, width
)
32 self
._horizontal
_line
(0, height
- 1, width
)
33 self
._vertical
_line
(0, 0, height
)
34 self
._vertical
_line
(width
- 1, 0, height
)
40 for child
in tree
.root
.get_children():
41 self
._draw
_boxes
(child
, 0, offset
)
44 def _compose_point(self
, x
, y
, new
):
45 self
.matrix
[y
][x
] |
= new
47 def _horizontal_line(self
, x
, y
, length
, mask
=0):
48 self
._compose
_point
(x
, y
, HLINE_START | mask
)
49 for i
in xrange(x
+ 1, x
+ length
- 1):
50 self
._compose
_point
(i
, y
, HLINE | mask
)
51 self
._compose
_point
(x
+ length
- 1, y
, HLINE_END | mask
)
53 def _vertical_line(self
, x
, y
, length
, mask
=0):
54 self
._compose
_point
(x
, y
, VLINE_START | mask
)
55 for i
in xrange(y
+ 1, y
+ length
- 1):
56 self
._compose
_point
(x
, i
, VLINE | mask
)
57 self
._compose
_point
(x
, y
+ length
- 1, VLINE_END | mask
)
59 def _draw_string(self
, x
, y
, length
, string
):
60 print_string
= short_string(string
.decode('UTF-8'), length
)
61 self
.matrix
[y
][x
:x
+len(print_string
)] = print_string
63 def _draw_box(self
, x0
, x1
, y0
, y1
, item
, mask
):
64 item
.rectangle
= (x0
, x1
, y0
, y1
)
67 self
._horizontal
_line
(x0
, y0
, length
+ 1, mask
)
68 self
._horizontal
_line
(x0
, y1
, length
+ 1, mask
)
69 self
._vertical
_line
(x0
, y0
, y1
- y0
+ 1, mask
)
70 self
._vertical
_line
(x1
, y0
, y1
- y0
+ 1, mask
)
74 self
._draw
_string
(x0
+1, (y0
+y1
)/2, length
- 2,
77 self
._draw
_string
(x0
+1, (y0
+y1
)/2 + 1, length
- 2,
78 human_unit(item
.size
))
80 # For the 'remaining' item, the size is more important than
81 # the dumy name, so we print it instead of the name when there is
82 # room for a single line
83 size_string_y
= (y0
+y1
)/2 + 1
85 self
._draw
_string
(x0
+1, (y0
+y1
)/2, length
- 2,
90 self
._draw
_string
(x0
+ 1, size_string_y
, length
- 2,
91 human_unit(item
.size
))
93 def _draw_boxes(self
, item
, depth
, offset
):
94 x0
= depth
* (self
.width
- 1) / self
.tree
.height
95 x1
= (depth
+ 1) * (self
.width
- 1) / self
.tree
.height
96 y0
= (self
.height
- 1) * offset
/ self
.tree
.root
.size
97 y1
= (self
.height
- 1) * (offset
+ item
.size
) / self
.tree
.root
.size
99 if item
== self
.selected_item
:
104 self
._draw
_box
(x0
, x1
, y0
, y1
, item
, mask
)
106 for child
in item
.get_children():
107 self
._draw
_boxes
(child
, depth
, offset
)