Rev 2012 | Rev 2297 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
964 | jag | 1 | /* |
2 | * levels.cc |
||
2097 | jag | 3 | * DIN Is Noise is copyright (c) 2006-2024 Jagannathan Sampath |
1713 | jag | 4 | * DIN Is Noise is released under GNU Public License 2.0 |
1479 | jag | 5 | * For more information, please visit https://dinisnoise.org/ |
964 | jag | 6 | */ |
7 | |||
8 | |||
9 | #include "main.h" |
||
10 | #include "levels.h" |
||
11 | #include "viewwin.h" |
||
12 | #include "input.h" |
||
13 | #include "console.h" |
||
14 | #include "utils.h" |
||
15 | #include "font.h" |
||
16 | #include "log.h" |
||
17 | |||
18 | using namespace std; |
||
19 | |||
20 | extern string user_data_dir; |
||
1263 | jag | 21 | extern int mousex, mousey, wheel, mouseyy, prev_mousey; |
964 | jag | 22 | extern char BUFFER []; |
23 | extern int line_height; |
||
24 | |||
1584 | jag | 25 | levels::levels (const string& s) { |
26 | name = s; |
||
1263 | jag | 27 | editing = lmb_clicked = paint = nsel = 0; |
28 | selection = 0; |
||
1585 | jag | 29 | chgl = 0; |
30 | shftl = 0; |
||
31 | paintl = 0; |
||
1625 | jag | 32 | load (); |
33 | |||
34 | if (editable) { |
||
1588 | jag | 35 | const char* bt [] = {"Wrap", "Slide", "<<", ">>", "All", "None", "Invert", "+", "-", "x"}; |
1625 | jag | 36 | button* b[] = {&cbwrap, &bslide, &blshift, &brshift, &ball, &bnone, &binvert, &plus, &minus, &cross}; |
1588 | jag | 37 | click_listener* cl [] = {&cbwrap, &sll, &lsl, &rsl, &alll, &nonl, &invl, &pll, &mil, &crol}; |
38 | for (int i = 0; i < 10; ++i) { |
||
1584 | jag | 39 | button* pbi = b[i]; |
40 | click_listener* pcl = cl[i]; |
||
41 | pbi->set_text (bt[i]); |
||
42 | pbi->set_listener (pcl); |
||
43 | pcl->data = this; |
||
44 | this->add_child (pbi); |
||
45 | } |
||
1587 | jag | 46 | |
1586 | jag | 47 | this->add_child (&szr); |
1587 | jag | 48 | |
49 | MOVE (szr); |
||
1625 | jag | 50 | szr.movlis = this; |
1587 | jag | 51 | |
1584 | jag | 52 | blshift.click_repeat = brshift.click_repeat = 1; |
1587 | jag | 53 | |
54 | bml.data = this; |
||
1584 | jag | 55 | } |
964 | jag | 56 | } |
57 | |||
58 | levels::~levels () { |
||
59 | save (); |
||
1588 | jag | 60 | removeallbookmarks (); |
1263 | jag | 61 | if (selection) delete[] selection; |
964 | jag | 62 | } |
63 | |||
64 | void levels::load () { |
||
65 | |||
66 | string ignore; |
||
67 | int left, bottom; |
||
68 | |||
69 | ifstream file ((user_data_dir + name).c_str(), ios::in); |
||
1587 | jag | 70 | file >> ignore >> n; |
71 | last = n - 1; |
||
72 | file >> ignore >> left >> bottom; |
||
73 | file >> ignore >> elem; |
||
74 | file >> ignore >> height; |
||
75 | file >> ignore >> editable; |
||
76 | file >> ignore >> saveable; |
||
1584 | jag | 77 | |
1587 | jag | 78 | int w; |
79 | file >> ignore >> w; |
||
80 | cbwrap.set_state (w,0); |
||
1584 | jag | 81 | |
964 | jag | 82 | a = 0.7; |
83 | a0 = a / 4; |
||
1584 | jag | 84 | extents (left, bottom, left + n * elem, bottom + height); |
1585 | jag | 85 | set_pos (left, bottom); |
86 | |||
1584 | jag | 87 | values.resize (n); |
88 | heights.resize (n); |
||
89 | |||
90 | selection = new bool [n]; |
||
91 | sel_sz = sizeof (bool) * n; |
||
1263 | jag | 92 | memset (selection, 0, sel_sz); |
93 | |||
964 | jag | 94 | if (saveable) { |
95 | int savings; |
||
96 | file >> ignore >> savings; |
||
97 | for (int i = 0; i < savings; ++i) { |
||
1266 | jag | 98 | float h; file >> h >> selection[i]; |
964 | jag | 99 | heights[i] = h; |
100 | values[i] = h * extents.height_1; |
||
101 | } |
||
1331 | jag | 102 | file >> nsel; |
964 | jag | 103 | } |
104 | |||
1587 | jag | 105 | int nb; |
106 | file >> ignore >> nb; |
||
107 | if (nb) { |
||
108 | bmk.resize (nb); |
||
109 | for (int i = 0, y = minus.extents.bottom - state_button::SIZE2; i < nb; ++i) { |
||
110 | bookmark* b = new bookmark (); |
||
111 | b->set_pos (minus.extents.left, y); |
||
112 | y -= state_button::SIZE2; |
||
113 | b->set_listener (&bml); |
||
114 | this->add_child (b); |
||
115 | bmk[i] = b; |
||
116 | int nid; |
||
117 | file >> nid; |
||
118 | vector<int>& ids = b->ids; |
||
119 | ids.resize (nid); |
||
120 | for (int m = 0; m < nid; ++m) file >> ids[m]; |
||
121 | } |
||
122 | } |
||
964 | jag | 123 | |
1587 | jag | 124 | editing = 0; |
125 | |||
964 | jag | 126 | } |
127 | |||
128 | void levels::save () { |
||
129 | ofstream file ((user_data_dir+name).c_str(), ios::out); |
||
130 | if (file) { |
||
1584 | jag | 131 | file << "num_levels " << n << endl; |
1695 | jag | 132 | file << "lower_corner " << extents.left << spc << extents.bottom << endl; |
1584 | jag | 133 | file << "element_width " << elem << endl; |
964 | jag | 134 | file << "height " << height << endl; |
135 | file << "editable " << editable << endl; |
||
136 | file << "saveable " << saveable << endl; |
||
1584 | jag | 137 | file << "wrap " << cbwrap.state << endl; |
964 | jag | 138 | if (saveable) { |
1695 | jag | 139 | file << "savings " << n << spc; |
140 | for (int i = 0; i < n; ++i) file << heights[i] << spc << selection[i] << spc; |
||
1331 | jag | 141 | file << nsel << endl; |
964 | jag | 142 | } else { |
143 | file << "savings 0" << endl; |
||
144 | } |
||
1587 | jag | 145 | |
146 | int j = bmk.size (); |
||
1695 | jag | 147 | file << "bookmarks " << j << spc; |
1625 | jag | 148 | if (j) { |
149 | for (int i = 0; i < j; ++i) { |
||
150 | bookmark* bi = bmk[i]; |
||
151 | vector<int>& ids = bi->ids; |
||
152 | int n = ids.size (); |
||
1695 | jag | 153 | file << n << spc; |
154 | for (int m = 0; m < n; ++m) file << ids[m] << spc; |
||
1625 | jag | 155 | } |
1587 | jag | 156 | } |
964 | jag | 157 | } else dlog << "!!! couldnt save levels !!!" << endl; |
158 | } |
||
159 | |||
160 | int levels::stop_editing () { |
||
161 | if (editing == FINISH) { |
||
162 | editing = 0; |
||
163 | return 1; |
||
164 | } |
||
165 | return 0; |
||
166 | } |
||
167 | |||
168 | int levels::handle_input () { |
||
169 | |||
1263 | jag | 170 | prev_mousey = mousey; |
171 | |||
964 | jag | 172 | widget::handle_input (); |
173 | |||
174 | int hne = hover && !editing; |
||
175 | if (hne) calc_lev (); |
||
176 | |||
1562 | jag | 177 | if (keypressed (SDLK_f)) { |
178 | paint = !paint; |
||
1585 | jag | 179 | if (paintl) paintl->paint (*this); |
1562 | jag | 180 | } |
181 | |||
964 | jag | 182 | if (editable) { |
1584 | jag | 183 | |
1587 | jag | 184 | for (int i = 0, j = children.size(); i < j; ++i) { |
185 | if (children[i]->handle_input ()) return 1; |
||
1584 | jag | 186 | } |
187 | |||
964 | jag | 188 | if (lmb) { |
189 | if (lmb_clicked == 0) { |
||
190 | if (stop_editing () == 0) { |
||
191 | if (hne) { |
||
1449 | jag | 192 | if (SHIFT) { |
1263 | jag | 193 | bool& k = selection [lev]; |
194 | k = !k; |
||
195 | if (k) ++nsel; else --nsel; |
||
196 | } else { |
||
964 | jag | 197 | editing = STARTED; |
198 | widget::focus = this; |
||
1263 | jag | 199 | } |
964 | jag | 200 | } |
201 | } |
||
202 | } |
||
203 | lmb_clicked = 1; |
||
204 | } else { |
||
1587 | jag | 205 | |
964 | jag | 206 | lmb_clicked = 0; |
1587 | jag | 207 | if (editing) { |
1263 | jag | 208 | |
964 | jag | 209 | if (wheel) { |
210 | mousey -= wheel; |
||
211 | warp_mouse (mousex, mousey); |
||
212 | } |
||
1263 | jag | 213 | |
964 | jag | 214 | if (paint) calc_lev (); |
1263 | jag | 215 | |
964 | jag | 216 | calc_hgt_val (); |
1263 | jag | 217 | |
218 | int dh = set (lev, val, hgt); |
||
1266 | jag | 219 | int uml = 0; |
1449 | jag | 220 | if (selection[lev] && !SHIFT ) uml = update_mul_lev (dh); |
1585 | jag | 221 | if (chgl && (dh || uml)) chgl->changed (*this); |
1263 | jag | 222 | |
964 | jag | 223 | editing = FINISH; |
1263 | jag | 224 | |
1107 | jag | 225 | } else { |
226 | if (widget::focus == this) widget::focus = 0; |
||
964 | jag | 227 | } |
228 | } |
||
229 | } |
||
230 | |||
1587 | jag | 231 | return 1; |
964 | jag | 232 | |
233 | } |
||
234 | |||
1266 | jag | 235 | int levels::update_mul_lev (int dh) { |
1263 | jag | 236 | float dv = dh * extents.height_1; |
1294 | jag | 237 | int ret = 0; |
1584 | jag | 238 | for (int i = 0; i < n; ++i) { |
1266 | jag | 239 | if ((i != lev) && selection[i]) { |
1263 | jag | 240 | int& hi = heights[i]; |
241 | float& vi = values[i]; |
||
242 | int hji = hi + dh; |
||
243 | float vji = vi + dv; |
||
1266 | jag | 244 | |
1295 | jag | 245 | if (hji < 0) hji = 0; else if (hji > extents.height) hji = extents.height; |
246 | if (vji < 0.0f) vji = 0.0f; else if (vji > 1.0f) vji = 1.0f; |
||
1263 | jag | 247 | hi = hji; |
248 | vi = vji; |
||
1266 | jag | 249 | ret = 1; |
1263 | jag | 250 | } |
251 | } |
||
1266 | jag | 252 | return ret; |
1263 | jag | 253 | } |
254 | |||
964 | jag | 255 | void levels::calc_lev () { |
1584 | jag | 256 | lev = (mousex - extents.left) / elem; |
257 | if (lev > last || lev < 0) lev = -1; |
||
964 | jag | 258 | } |
259 | |||
260 | void levels::calc_hgt_val () { |
||
261 | hgt = mouseyy - extents.bottom; |
||
262 | clamp<int> (0, hgt, extents.height); |
||
263 | val = hgt * extents.height_1; |
||
264 | } |
||
265 | |||
266 | void levels::clear_hgt_val () { |
||
1584 | jag | 267 | for (int i = 0; i < n; ++i) values[i] = heights[i] = 0; |
964 | jag | 268 | } |
269 | |||
270 | void levels::draw () { |
||
271 | |||
2012 | jag | 272 | if (editing) { |
273 | glColor3f (.5f, .5f, .5f); |
||
274 | int ybh = extents.bottom + hgt; |
||
275 | glBegin (GL_LINES); |
||
276 | glVertex2i (extents.left, ybh); |
||
277 | glVertex2i (extents.right, ybh); |
||
278 | glEnd (); |
||
279 | } |
||
280 | |||
964 | jag | 281 | glEnable (GL_BLEND); |
282 | glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
||
1584 | jag | 283 | int i = 0, x = extents.left, ds = elem - 2; |
964 | jag | 284 | if (extents.left < 0) { |
1584 | jag | 285 | i = -extents.left / elem; |
964 | jag | 286 | x = 0; |
287 | } |
||
1584 | jag | 288 | for (;i < n; ++i) { |
964 | jag | 289 | int l = x + 1, r = x + ds; |
290 | glColor4f (clr.r, clr.g, clr.b, a0); |
||
291 | glRecti (l, extents.bottom, r, extents.top); |
||
1265 | jag | 292 | |
1587 | jag | 293 | float dc = selection[i] * 0.4; |
1586 | jag | 294 | glColor4f (clr.r + dc * clr.r, clr.g + dc * clr.g, clr.b + dc * clr.b, a); |
964 | jag | 295 | glRecti (l, extents.bottom, r, extents.bottom + heights[i]); |
1584 | jag | 296 | x += elem; |
964 | jag | 297 | extern viewport view; |
298 | if (x > view.xmax) break; |
||
299 | } |
||
300 | glDisable (GL_BLEND); |
||
301 | |||
302 | sprintf (BUFFER, "%d/%.3f", lev+1, lev > -1? values[lev]:-1); |
||
303 | draw_string (BUFFER, extents.left, extents.bottom - line_height, 0); |
||
1584 | jag | 304 | |
1587 | jag | 305 | if (editable) for (int i = 0, j = children.size(); i < j; ++i) children[i]->draw (); |
306 | |||
964 | jag | 307 | } |
308 | |||
309 | int levels::change (int i, float dv) { |
||
1584 | jag | 310 | if (i > -1 && i < n) { |
964 | jag | 311 | float& vi = values[i]; |
312 | vi += dv; |
||
313 | int result = clamp<float> (0, vi, 1); |
||
314 | heights[i] = (int) (vi * extents.height + 0.5); |
||
315 | return result; |
||
316 | } |
||
317 | return 0; |
||
318 | } |
||
319 | |||
320 | void levels::set_only (int i, float v) { |
||
1584 | jag | 321 | if (i > -1 && i < n) { |
964 | jag | 322 | clamp<float> (0, v, 1); |
323 | values[i] = v; |
||
324 | heights[i] = (int)(v * extents.height + 0.5); |
||
325 | } |
||
326 | } |
||
327 | |||
1263 | jag | 328 | int levels::set (int i, float v, int h) { // from ui |
1584 | jag | 329 | if (i > -1 && i < n) { |
1263 | jag | 330 | int& hi = heights[i]; |
331 | int dh = h - hi; |
||
332 | hi = h; |
||
964 | jag | 333 | float& vi = values[i]; |
334 | if (vi != v) { // bcos from ui |
||
335 | vi = v; |
||
336 | } |
||
1263 | jag | 337 | return dh; |
964 | jag | 338 | } |
1263 | jag | 339 | return 0; |
964 | jag | 340 | } |
341 | |||
342 | void levels::update () { |
||
1585 | jag | 343 | if (chgl) chgl->changed (*this); |
964 | jag | 344 | } |
345 | |||
346 | void levels::chkpos () { |
||
347 | extern viewport view; |
||
348 | if (!view.inside (extents.left, extents.bottom)) extents.lower_corner (0, 0); |
||
349 | } |
||
350 | |||
351 | void levels::reheight () { |
||
1584 | jag | 352 | for (int i = 0; i < n; ++i) { |
964 | jag | 353 | float v = values[i]; |
354 | int h = v * height + 0.5; |
||
355 | heights[i] = h; |
||
356 | } |
||
357 | } |
||
358 | |||
1080 | jag | 359 | int levels::lshift () { |
1023 | jag | 360 | |
964 | jag | 361 | float v0 = values[0]; |
362 | int h0 = heights[0]; |
||
1023 | jag | 363 | |
1584 | jag | 364 | int wrap = cbwrap.state; |
365 | |||
1023 | jag | 366 | if (wrap == 0) { |
1584 | jag | 367 | if (h0) return 0; |
1023 | jag | 368 | } |
369 | |||
1584 | jag | 370 | for (int i = 0, j = 1; i < last; ++i, ++j) { |
964 | jag | 371 | values[i] = values[j]; |
372 | heights[i] = heights[j]; |
||
373 | } |
||
1023 | jag | 374 | |
1584 | jag | 375 | float& vl = values[last]; |
376 | int& hl = heights[last]; |
||
964 | jag | 377 | if (wrap) { |
1584 | jag | 378 | vl = v0; |
379 | hl = h0; |
||
1023 | jag | 380 | } else { |
1584 | jag | 381 | vl = 0; |
382 | hl = 0; |
||
964 | jag | 383 | } |
1023 | jag | 384 | |
1585 | jag | 385 | if (shftl) shftl->shifted (*this); |
1584 | jag | 386 | |
1080 | jag | 387 | return 1; |
388 | |||
964 | jag | 389 | } |
390 | |||
1080 | jag | 391 | int levels::rshift () { |
1584 | jag | 392 | float vl = values[last]; |
393 | int hl = heights[last]; |
||
1023 | jag | 394 | |
1584 | jag | 395 | int wrap = cbwrap.state; |
1023 | jag | 396 | if (wrap == 0) { |
1080 | jag | 397 | if (hl) return 0; |
1023 | jag | 398 | } |
399 | |||
1584 | jag | 400 | for (int j = last, i = last - 1; j > 0; --j, --i) { |
964 | jag | 401 | values[j]=values[i]; |
402 | heights[j]=heights[i]; |
||
403 | } |
||
1023 | jag | 404 | |
1584 | jag | 405 | float& v0 = values[0]; |
406 | int& h0 = heights[0]; |
||
407 | |||
964 | jag | 408 | if (wrap) { |
1584 | jag | 409 | v0 = vl; |
410 | h0 = hl; |
||
1023 | jag | 411 | } else { |
1584 | jag | 412 | v0 = 0; |
413 | h0 = 0; |
||
964 | jag | 414 | } |
1023 | jag | 415 | |
1585 | jag | 416 | if (shftl) shftl->shifted (*this); |
1584 | jag | 417 | |
1080 | jag | 418 | return 1; |
419 | |||
964 | jag | 420 | } |
1584 | jag | 421 | |
422 | void levels::selall () { |
||
1587 | jag | 423 | nsel = 0; |
1584 | jag | 424 | for (int i = 0; i < n; ++i) { |
1587 | jag | 425 | if (heights[i]) { |
426 | selection[i] = 1; |
||
427 | ++nsel; |
||
428 | } |
||
1584 | jag | 429 | } |
1587 | jag | 430 | clearbookmarks (); |
1584 | jag | 431 | } |
432 | |||
433 | void levels::selnon () { |
||
434 | for (int i = 0; i < n; ++i) selection[i] = 0; |
||
435 | nsel = 0; |
||
1587 | jag | 436 | clearbookmarks (); |
1584 | jag | 437 | } |
438 | |||
439 | void levels::invsel () { |
||
440 | for (int i = 0; i < n; ++i) { |
||
441 | bool& si = selection[i]; |
||
442 | if (si) { |
||
443 | si = 0; |
||
444 | --nsel; |
||
445 | } |
||
446 | else if (heights[i]) { |
||
447 | si = 1; |
||
448 | ++nsel; |
||
449 | } |
||
450 | } |
||
1587 | jag | 451 | clearbookmarks (); |
1584 | jag | 452 | } |
453 | |||
454 | CLICKED_BUTTON (levels, alllis) { |
||
455 | levels* l = (levels*) data; |
||
456 | l->selall(); |
||
457 | } |
||
458 | |||
459 | CLICKED_BUTTON (levels, nonlis) { |
||
460 | levels* l = (levels*) data; |
||
461 | l->selnon(); |
||
462 | } |
||
463 | |||
464 | |||
465 | CLICKED_BUTTON (levels, invlis) { |
||
466 | levels* l = (levels*) data; |
||
467 | l->invsel(); |
||
468 | } |
||
469 | |||
470 | CLICKED_BUTTON (levels, lshiftlis) { |
||
471 | levels* l = (levels*) data; |
||
472 | l->lshift (); |
||
473 | } |
||
474 | |||
475 | CLICKED_BUTTON (levels, rshiftlis) { |
||
476 | levels* l = (levels*) data; |
||
477 | l->rshift (); |
||
478 | } |
||
479 | |||
1587 | jag | 480 | CLICKED_BUTTON (levels, pluslis) { |
481 | levels* l = (levels*) data; |
||
482 | l->addbookmark (); |
||
483 | } |
||
484 | |||
1584 | jag | 485 | void levels::slide::clicked (button& b) { |
486 | if (!mouse_slider0.active) { |
||
487 | mouse_slider0.add (this); |
||
488 | activate_mouse_slider (); |
||
489 | } |
||
490 | } |
||
491 | |||
492 | void levels::slide::moused (int dir, double scl) { |
||
493 | levels* l = (levels*) data; |
||
494 | if (dir > 0) l->rshift (); else l->lshift (); |
||
495 | } |
||
1585 | jag | 496 | |
497 | void levels::set_pos (int x, int y) { |
||
498 | widget::set_pos (x, y); |
||
499 | extern int line_height; |
||
500 | int bx = extents.right + 3, by = extents.top - line_height; |
||
501 | blshift.set_pos (bx, by); |
||
502 | brshift.set_pos (bx + 28, by); |
||
503 | by -= line_height; |
||
504 | { |
||
505 | button* b[] = {&cbwrap, &bslide, &ball, &bnone, &binvert}; |
||
506 | for (int i = 0; i < 5; ++i) { |
||
507 | button& bi = *b[i]; |
||
508 | bi.set_pos (bx, by); |
||
509 | by -= line_height; |
||
510 | } |
||
511 | } |
||
512 | { |
||
513 | button* b[] = {&plus, &minus, &cross}; |
||
514 | for (int i = 0; i < 3; ++i) { |
||
515 | b[i]->set_pos (bx, by); |
||
516 | bx += 20; |
||
517 | } |
||
518 | } |
||
1586 | jag | 519 | szr.set_pos (extents.right + elem, extents.bottom); |
1585 | jag | 520 | } |
1586 | jag | 521 | |
1587 | jag | 522 | void levels::addbookmark () { |
1588 | jag | 523 | |
1587 | jag | 524 | if (nsel) { |
525 | bookmark* bm = new bookmark (); |
||
526 | int bs = bmk.size (); |
||
527 | if (bs) { |
||
528 | int lb = bs - 1; |
||
529 | bookmark* plb = bmk [lb]; |
||
530 | bm->set_pos (minus.extents.left, plb->extents.bottom - state_button::SIZE2); |
||
531 | } else { |
||
532 | bm->set_pos (minus.extents.left, minus.extents.bottom - state_button::SIZE2); |
||
533 | } |
||
534 | |||
535 | for (int i = 0; i < n; ++i) if (selection[i]) bm->ids.push_back (i); |
||
536 | |||
537 | clearbookmarks (); |
||
538 | |||
539 | bm->set_state (1, 0); |
||
540 | bm->set_listener (&bml); |
||
541 | |||
542 | bmk.push_back (bm); |
||
543 | this->add_child (bm); |
||
544 | |||
1695 | jag | 545 | cons << GREEN << "Bookmarked " << nsel << spc << name << eol; |
1587 | jag | 546 | |
547 | } else { |
||
548 | cons << RED << "No " << name << " selected to bookmark. SHIFT+click " << name << " to select." << eol; |
||
549 | } |
||
1588 | jag | 550 | |
1587 | jag | 551 | } |
552 | |||
1588 | jag | 553 | void levels::removebookmark () { |
554 | for (vector<bookmark*>::iterator i = bmk.begin (), j = bmk.end (); i != j; ) { |
||
555 | bookmark* b = *i; |
||
556 | if (b->state) { |
||
557 | i = bmk.erase (i); |
||
558 | j = bmk.end (); |
||
559 | this->remove_child (b); |
||
560 | delete b; |
||
561 | } else { |
||
562 | ++i; |
||
563 | } |
||
564 | } |
||
565 | } |
||
566 | |||
1587 | jag | 567 | void levels::removeallbookmarks () { |
568 | for (int i = 0, j = bmk.size (); i < j; ++i) { |
||
569 | bookmark* pbi = bmk[i]; |
||
570 | this->remove_child (pbi); |
||
571 | delete pbi; |
||
572 | } |
||
573 | bmk.clear (); |
||
574 | } |
||
575 | |||
576 | void levels::clearbookmarks () { |
||
577 | for (int i = 0, j = bmk.size (); i < j; ++i) bmk[i]->set_state (0,0); |
||
578 | } |
||
579 | |||
580 | CLICKED_CHECKBUTTON (levels, bmlis) { |
||
581 | bookmark& b = dynamic_cast<bookmark&>(cb); |
||
582 | int s = b.state; |
||
583 | levels& l = *( (levels*) data); |
||
584 | if (SHIFT) |
||
585 | ; |
||
586 | else { |
||
587 | l.selnon (); |
||
588 | if (s == 0) s = 1; |
||
589 | b.set_state (s, 0); |
||
590 | } |
||
1588 | jag | 591 | |
592 | int sl [] = {-1, 1}; |
||
1587 | jag | 593 | for (int i = 0, j = l.bmk.size (); i < j; ++i) { |
594 | if (&b == l.bmk[i]) { |
||
595 | vector<int>& ids = b.ids; |
||
596 | int n = ids.size (); |
||
597 | for (int m = 0; m < n; ++m) l.selection[ids[m]] = s; |
||
1588 | jag | 598 | l.nsel += (n * sl[s]); |
1587 | jag | 599 | } |
600 | } |
||
601 | } |
||
602 | |||
1588 | jag | 603 | CLICKED_BUTTON (levels, minuslis) { |
604 | ((levels*) data)->removebookmark (); |
||
605 | } |
||
606 | |||
1587 | jag | 607 | CLICKED_BUTTON (levels, crosslis) { |
608 | ((levels*) data)->removeallbookmarks (); |
||
609 | } |
||
1588 | jag | 610 | |
1625 | jag | 611 | /*MOVED (levels,szrlis) { |
612 | levels* pl = (levels *) data; |
||
613 | l->sized (); |
||
614 | }*/ |
||
1588 | jag | 615 | |
1625 | jag | 616 | void levels::moved () { |
1588 | jag | 617 | if (extents.top > szr.extents.bottom) { |
618 | height = extents.height = extents.top - szr.extents.bottom; |
||
619 | set_pos (posx, szr.posy); |
||
620 | reheight (); |
||
621 | } |
||
622 | } |