Rev 7941 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7921 | leency | 1 | struct SELECTION { |
2 | dword start_x, start_y, start_offset; |
||
3 | dword end_x, end_y, end_offset; |
||
4 | dword color; |
||
5 | bool is_active(); |
||
6 | void set_start(); |
||
7 | void set_end(); |
||
8 | void draw(); |
||
9 | void draw_line(); |
||
10 | void cancel(); |
||
11 | bool swap_start_end(); |
||
12 | void normalize(); |
||
13 | void select_all(); |
||
7941 | leency | 14 | void debug(); |
7921 | leency | 15 | } selection; |
16 | |||
17 | bool SELECTION::is_active() |
||
18 | { |
||
19 | if (start_offset) && (end_offset) && (start_offset != end_offset) { |
||
20 | return true; |
||
21 | } else { |
||
22 | return false; |
||
23 | } |
||
24 | } |
||
25 | |||
26 | void SELECTION::draw_line(dword x,y,w) |
||
27 | { |
||
8439 | leency | 28 | canvas.DrawBar(x, y - list.first * list.item_h, w, list.item_h, color); |
7921 | leency | 29 | } |
30 | |||
31 | void SELECTION::draw(int i) |
||
32 | { |
||
33 | if (is_active()) { |
||
7924 | leency | 34 | if (start_y == i) && (end_y == i) draw_line(start_x * list.font_w+2, start_y, end_x - start_x * list.font_w); |
35 | else if (start_y == i) draw_line(start_x * list.font_w+2, start_y, list.w -2- calc(start_x * list.font_w)); |
||
36 | else if (end_y == i) draw_line(0, end_y, end_x * list.font_w+2); |
||
7941 | leency | 37 | //only for debug: |
8439 | leency | 38 | //canvas.DrawBar(start_x * list.font_w + 2, start_y * list.item_h, 2, list.item_h, 0x00FF00); |
39 | //canvas.DrawBar(end_x * list.font_w + 0, end_y * list.item_h, 2, list.item_h, 0xFF00FF); |
||
7921 | leency | 40 | } |
7924 | leency | 41 | //DrawCursor |
42 | if (list.cur_y >= list.first) && (list.cur_y <= list.first+list.visible) { |
||
8439 | leency | 43 | canvas.DrawBar(list.cur_x * list.font_w + 2, list.cur_y - list.first * list.item_h, 2, list.item_h, theme.cursor); |
7924 | leency | 44 | } |
7921 | leency | 45 | } |
46 | |||
47 | void SELECTION::cancel() |
||
48 | { |
||
49 | start_offset = end_offset = lines.get(list.cur_y) + list.cur_x; |
||
50 | start_x = end_x = list.cur_x; |
||
51 | start_y = end_y = list.cur_y; |
||
52 | normalize(); |
||
53 | } |
||
54 | |||
55 | void SELECTION::set_start() |
||
56 | { |
||
7924 | leency | 57 | if (selection.is_active()) return; |
7921 | leency | 58 | start_x = list.cur_x; |
59 | start_y = list.cur_y; |
||
60 | normalize(); |
||
61 | start_offset = lines.get(start_y) + start_x; |
||
62 | } |
||
63 | |||
7941 | leency | 64 | :void SELECTION::debug() |
65 | { |
||
66 | char rez[256]; |
||
67 | sprintf(#rez, "start_x: %d start_y: %d end_x: %d end_y: %d", start_x, start_y, end_x, end_y); |
||
68 | debugln(#rez); |
||
69 | } |
||
70 | |||
7921 | leency | 71 | void SELECTION::set_end() |
72 | { |
||
73 | end_x = list.cur_x; |
||
74 | end_y = list.cur_y; |
||
75 | normalize(); |
||
76 | end_offset = lines.get(end_y) + end_x; |
||
77 | } |
||
78 | |||
79 | |||
80 | void SELECTION::normalize() |
||
81 | { |
||
82 | start_x = math.min(start_x, lines.get(start_y+1) - lines.get(start_y)); |
||
83 | end_x = math.min(end_x, lines.get(end_y+1) - lines.get(end_y)); |
||
84 | } |
||
85 | |||
86 | void SELECTION::select_all() |
||
87 | { |
||
88 | start_y = 0; |
||
89 | start_x = 0; |
||
90 | end_y = lines.count-2; |
||
91 | end_x = lines.get(end_y+1) - lines.get(end_y); |
||
92 | start_offset = lines.get(start_y) + start_x; |
||
93 | end_offset = lines.get(end_y) + end_x; |
||
94 | } |
||
95 | |||
96 | bool SELECTION::swap_start_end() |
||
97 | { |
||
98 | start_offset >< end_offset; |
||
99 | start_x >< end_x; |
||
100 | start_y >< end_y; |
||
101 | return true; |
||
102 | }>>>=> |