2 from ui
.utils
import human_unit
, short_string
4 # A character is composed of 9 positions
12 # '+' = 1, 3, 4, 5, 7 = (1<<1) + (1<<3) + (1<<4) + (1<<5) + (1<<7) = 186
14 HLINE_START
= (1<<4) + (1<<5)
15 HLINE_END
= (1<<3) + (1<<4)
16 HLINE
= HLINE_START | HLINE_END
18 VLINE_START
= (1<<4) + (1<<7)
19 VLINE_END
= (1<<1) + (1<<4)
20 VLINE
= VLINE_START | VLINE_END
26 """A 2D array of characters."""
27 def __init__(self
, width
, height
, tree
, selected_node
=None):
31 self
.selected_node
= selected_node
32 self
.matrix
= [[0 for i
in xrange(width
)] for j
in xrange(height
)]
33 self
._horizontal
_line
(0, 0, width
)
34 self
._horizontal
_line
(0, height
- 1, width
)
35 self
._vertical
_line
(0, 0, height
)
36 self
._vertical
_line
(width
- 1, 0, height
)
42 total_size
= tree
.root
.size
43 for child
in tree
.root
.get_children():
44 offset
+= self
._draw
_boxes
(child
, 0, offset
,
45 self
.height
- 1 - offset
, total_size
)
46 total_size
-= child
.size
48 def _compose_point(self
, x
, y
, new
):
49 self
.matrix
[y
][x
] |
= new
51 def _horizontal_line(self
, x
, y
, length
, mask
=0):
52 self
._compose
_point
(x
, y
, HLINE_START | mask
)
53 for i
in xrange(x
+ 1, x
+ length
- 1):
54 self
._compose
_point
(i
, y
, HLINE | mask
)
55 self
._compose
_point
(x
+ length
- 1, y
, HLINE_END | mask
)
57 def _vertical_line(self
, x
, y
, length
, mask
=0):
58 self
._compose
_point
(x
, y
, VLINE_START | mask
)
59 for i
in xrange(y
+ 1, y
+ length
- 1):
60 self
._compose
_point
(x
, i
, VLINE | mask
)
61 self
._compose
_point
(x
, y
+ length
- 1, VLINE_END | mask
)
63 def _draw_string(self
, x
, y
, length
, string
):
65 decoded
= string
.decode('UTF-8')
66 except UnicodeDecodeError:
68 print_string
= short_string(decoded
, length
)
69 self
.matrix
[y
][x
:x
+len(print_string
)] = print_string
71 def _draw_box(self
, x0
, x1
, y0
, y1
, node
, mask
):
72 node
.rectangle
= (x0
, x1
, y0
, y1
)
75 self
._horizontal
_line
(x0
, y0
, length
+ 1, mask
)
76 self
._horizontal
_line
(x0
, y1
, length
+ 1, mask
)
77 self
._vertical
_line
(x0
, y0
, y1
- y0
+ 1, mask
)
78 self
._vertical
_line
(x1
, y0
, y1
- y0
+ 1, mask
)
82 self
._draw
_string
(x0
+1, (y0
+y1
)/2, length
- 2,
85 self
._draw
_string
(x0
+1, (y0
+y1
)/2 + 1, length
- 2,
86 human_unit(node
.size
))
88 # For the 'remaining' node, the size is more important than
89 # the dumy name, so we print it instead of the name when there is
90 # room for a single line
91 size_string_y
= (y0
+y1
)/2 + 1
93 self
._draw
_string
(x0
+1, (y0
+y1
)/2, length
- 2,
98 self
._draw
_string
(x0
+ 1, size_string_y
, length
- 2,
99 human_unit(node
.size
))
101 def _draw_boxes(self
, node
, depth
, offset
, length
, total_size
):
102 x0
= depth
* (self
.width
- 1) / self
.tree
.height
103 x1
= (depth
+ 1) * (self
.width
- 1) / self
.tree
.height
105 y1
= offset
+ min(length
, int(math
.ceil(float(node
.size
) * length
/
108 if node
== self
.selected_node
:
113 self
._draw
_box
(x0
, x1
, y0
, y1
, node
, mask
)
116 total_size
= node
.size
117 for child
in node
.get_children():
118 child_offset
+= self
._draw
_boxes
(child
, depth
,
119 offset
+ child_offset
,
120 y1
- y0
- child_offset
,
122 total_size
-= child
.size