@@ -169,355 +169,6 @@ namespace cycfi::elements
169
169
init_value
170
170
};
171
171
}
172
-
173
- // //////////////////////////////////////////////////////////////////////////
174
- // Basic Thumb (You can use this as the slider's thumb)
175
- // //////////////////////////////////////////////////////////////////////////
176
- template <unsigned _size>
177
- class basic_thumb_element : public element
178
- {
179
- public:
180
-
181
- static unsigned const size = _size;
182
-
183
- basic_thumb_element (color c = colors::black)
184
- : _color(c)
185
- {}
186
-
187
- view_limits limits (basic_context const & ctx) const override ;
188
- void draw (context const & ctx) override ;
189
-
190
- private:
191
-
192
- color _color;
193
- };
194
-
195
- template <unsigned size>
196
- inline view_limits basic_thumb_element<size>
197
- ::limits (basic_context const & /* ctx */ ) const
198
- {
199
- auto pt = point{float (size), float (size)};
200
- return view_limits{pt, pt};
201
- }
202
-
203
- template <unsigned size>
204
- inline void basic_thumb_element<size>::draw(context const & ctx)
205
- {
206
- auto & thm = get_theme ();
207
- auto & cnv = ctx.canvas ;
208
- auto indicator_color = thm.indicator_color .level (1.5 );
209
- auto cp = circle{center_point (ctx.bounds ), size/2 .0f };
210
-
211
- draw_thumb (cnv, cp, _color, indicator_color);
212
- }
213
-
214
- template <unsigned size>
215
- inline basic_thumb_element<size> basic_thumb (color c = colors::black)
216
- {
217
- return {c};
218
- }
219
-
220
- // //////////////////////////////////////////////////////////////////////////
221
- // Basic Track (You can use this as the slider's track)
222
- // //////////////////////////////////////////////////////////////////////////
223
- template <unsigned _size, bool _vertical = false >
224
- class basic_track_element : public element
225
- {
226
- public:
227
-
228
- static unsigned const size = _size;
229
- static bool const vertical = _vertical;
230
- static unsigned const min_length = 64 ;
231
-
232
- basic_track_element (color c = colors::black)
233
- : _color(c)
234
- {}
235
-
236
- view_limits limits (basic_context const & ctx) const override ;
237
- void draw (context const & ctx) override ;
238
-
239
- private:
240
-
241
- color _color;
242
- };
243
-
244
- template <unsigned size, bool vertical>
245
- inline view_limits basic_track_element<size, vertical>
246
- ::limits (basic_context const & /* ctx */ ) const
247
- {
248
- auto sz = float (size);
249
- auto min_length_ = float (min_length);
250
- auto p1 = vertical ? point{sz, min_length} : point{ min_length_, sz};
251
- auto p2 = vertical ? point{sz, full_extent} : point{ full_extent, sz};
252
- return view_limits{p1, p2};
253
- }
254
-
255
- template <unsigned size, bool vertical>
256
- inline void basic_track_element<size, vertical>
257
- ::draw (context const & ctx)
258
- {
259
- draw_track (ctx.canvas , ctx.bounds );
260
- }
261
-
262
- template <unsigned size, bool vertical = false >
263
- inline basic_track_element<size, vertical>
264
- basic_track (color c = colors::black)
265
- {
266
- return {c};
267
- }
268
-
269
- // //////////////////////////////////////////////////////////////////////////
270
- // Slider Element Base (common base class for slider elements)
271
- // //////////////////////////////////////////////////////////////////////////
272
- template <int _size, concepts::Element Subject>
273
- class slider_element_base : public proxy <Subject>
274
- {
275
- public:
276
-
277
- static unsigned const size = _size;
278
- using base_type = proxy<Subject>;
279
- using base_type::base_type;
280
-
281
- view_limits limits (basic_context const & ctx) const override ;
282
- void prepare_subject (context& ctx) override ;
283
- };
284
-
285
- template <int size, concepts::Element Subject>
286
- inline view_limits
287
- slider_element_base<size, Subject>::limits(basic_context const & ctx) const
288
- {
289
- auto sl = this ->subject ().limits (ctx);
290
- if (sl.min .x < sl.min .y ) // is vertical?
291
- {
292
- sl.min .x += size;
293
- sl.max .x += size;
294
- clamp_max (sl.max .x , full_extent);
295
- }
296
- else
297
- {
298
- sl.min .y += size;
299
- sl.max .y += size;
300
- clamp_max (sl.max .y , full_extent);
301
- }
302
- return sl;
303
- }
304
-
305
- template <int size, concepts::Element Subject>
306
- inline void
307
- slider_element_base<size, Subject>::prepare_subject(context& ctx)
308
- {
309
- if (ctx.bounds .width () < ctx.bounds .height ()) // is vertical?
310
- {
311
- ctx.bounds .left += size/2 ;
312
- ctx.bounds .right -= size/2 ;
313
- }
314
- else
315
- {
316
- ctx.bounds .top += size/2 ;
317
- ctx.bounds .bottom -= size/2 ;
318
- }
319
- }
320
-
321
- // //////////////////////////////////////////////////////////////////////////
322
- // Slider Marks (You can use this to place tick marks on slider)
323
- // //////////////////////////////////////////////////////////////////////////
324
-
325
- // //////////////////////////////////////////////////////////////////////////
326
- // deprecated
327
- // //////////////////////////////////////////////////////////////////////////
328
- template <
329
- std::size_t _size, std::size_t _num_divs
330
- , std::size_t _major_divs, concepts::Element Subject>
331
- class slider_marks_element : public slider_element_base <_size, Subject>
332
- {
333
- public:
334
-
335
- static_assert (_major_divs > 0 , " Major divisions must be greater than zero" );
336
-
337
- using base_type = slider_element_base<_size, Subject>;
338
- using base_type::base_type;
339
-
340
- void draw (context const & ctx) override ;
341
- };
342
-
343
- void draw_slider_marks (
344
- canvas& cnv, rect bounds, float size, std::size_t major_divs
345
- , std::size_t minor_divs, color c);
346
-
347
- template <
348
- std::size_t _size, std::size_t _num_divs
349
- , std::size_t _major_divs, concepts::Element Subject>
350
- inline void
351
- slider_marks_element<_size, _num_divs, _major_divs, Subject>
352
- ::draw (context const & ctx)
353
- {
354
- // Draw linear lines
355
- draw_slider_marks (
356
- ctx.canvas , ctx.bounds , _size, _num_divs
357
- , _major_divs, colors::light_gray);
358
-
359
- // Draw the subject
360
- base_type::draw (ctx);
361
- }
362
-
363
- template <
364
- std::size_t _size, std::size_t _num_divs = 50
365
- , std::size_t _major_divs = 10 , concepts::Element Subject>
366
- [[deprecated(" Use slider_marks_lin instead" )]]
367
- inline slider_marks_element<_size, _num_divs, _major_divs, remove_cvref_t <Subject>>
368
- slider_marks (Subject&& subject)
369
- {
370
- return {std::forward<Subject>(subject)};
371
- }
372
- // //////////////////////////////////////////////////////////////////////////
373
-
374
- template <
375
- std::size_t _size, std::size_t _major_divs
376
- , std::size_t _minor_divs, concepts::Element Subject>
377
- class slider_marks_lin_element : public slider_element_base <_size, Subject>
378
- {
379
- public:
380
-
381
- static_assert (_major_divs > 0 , " Major divisions must be greater than zero" );
382
-
383
- using base_type = slider_element_base<_size, Subject>;
384
- using base_type::base_type;
385
-
386
- void draw (context const & ctx) override ;
387
- };
388
-
389
- void draw_slider_marks_lin (
390
- canvas& cnv, rect bounds, float size, std::size_t major_divs
391
- , std::size_t minor_divs, color c);
392
-
393
- template <
394
- std::size_t _size, std::size_t _major_divs
395
- , std::size_t _minor_divs, concepts::Element Subject>
396
- inline void
397
- slider_marks_lin_element<_size, _major_divs, _minor_divs, Subject>
398
- ::draw (context const & ctx)
399
- {
400
- // Draw linear lines
401
- draw_slider_marks_lin (
402
- ctx.canvas , ctx.bounds , _size, _major_divs
403
- , _minor_divs, colors::light_gray);
404
-
405
- // Draw the subject
406
- base_type::draw (ctx);
407
- }
408
-
409
- template <
410
- std::size_t _size, std::size_t _major_divs = 10
411
- , std::size_t _minor_divs = 5 , concepts::Element Subject>
412
- inline slider_marks_lin_element<_size, _major_divs, _minor_divs, remove_cvref_t <Subject>>
413
- slider_marks_lin (Subject&& subject)
414
- {
415
- return {std::forward<Subject>(subject)};
416
- }
417
-
418
- template <
419
- std::size_t _size, std::size_t _major_divs
420
- , std::size_t _minor_divs, concepts::Element Subject>
421
- class slider_marks_log_element : public slider_element_base <_size, Subject>
422
- {
423
-
424
- public:
425
-
426
- static_assert (_major_divs > 0 , " Major divisions must be greater than zero" );
427
-
428
- using base_type = slider_element_base<_size, Subject>;
429
- using base_type::base_type;
430
-
431
- void draw (context const & ctx) override ;
432
- };
433
-
434
- void draw_slider_marks_log (
435
- canvas& cnv, rect bounds, float size, std::size_t major_divs
436
- , std::size_t minor_divs, color c);
437
-
438
- template <
439
- std::size_t _size, std::size_t _major_divs
440
- , std::size_t _minor_divs, concepts::Element Subject>
441
- inline void
442
- slider_marks_log_element<_size, _major_divs, _minor_divs, Subject>
443
- ::draw (context const & ctx)
444
- {
445
- // Draw logarithmic lines
446
- draw_slider_marks_log (
447
- ctx.canvas , ctx.bounds , _size, _major_divs
448
- , _minor_divs, colors::light_gray);
449
-
450
- // Draw the subject
451
- base_type::draw (ctx);
452
- }
453
-
454
- template <
455
- std::size_t _size, std::size_t _major_divs = 5
456
- , std::size_t _minor_divs = 10 , concepts::Element Subject>
457
- inline slider_marks_log_element<_size, _major_divs, _minor_divs, remove_cvref_t <Subject>>
458
- slider_marks_log (Subject&& subject)
459
- {
460
- return {std::forward<Subject>(subject)};
461
- }
462
-
463
- // //////////////////////////////////////////////////////////////////////////
464
- // Slider Labels (You can use this to place slider labels with sliders)
465
- // //////////////////////////////////////////////////////////////////////////
466
- template <int _size, concepts::Element Subject, std::size_t num_labels>
467
- class slider_labels_element
468
- : public slider_element_base<abs(_size), Subject>
469
- {
470
- public:
471
-
472
- constexpr static int const size = _size;
473
- using base_type = slider_element_base<abs(_size), Subject>;
474
- using string_array = std::array<std::string, num_labels>;
475
-
476
- slider_labels_element (
477
- Subject subject
478
- , float font_size
479
- )
480
- : base_type(std::move(subject))
481
- , _font_size(font_size)
482
- {}
483
-
484
- void draw (context const & ctx) override ;
485
-
486
- string_array _labels;
487
- float _font_size;
488
- };
489
-
490
- void draw_slider_labels (
491
- canvas& cnv
492
- , rect bounds
493
- , float size
494
- , float font_size
495
- , std::string const labels[]
496
- , std::size_t _num_labels
497
- );
498
-
499
- template <int size, concepts::Element Subject, std::size_t num_labels>
500
- inline void
501
- slider_labels_element<size, Subject, num_labels>::draw(context const & ctx)
502
- {
503
- // Draw the subject
504
- base_type::draw (ctx);
505
-
506
- // Draw the labels
507
- draw_slider_labels (
508
- ctx.canvas , ctx.bounds , size
509
- , _font_size, _labels.data (), num_labels);
510
- }
511
-
512
- template <int size, concepts::Element Subject, typename ... S>
513
- inline slider_labels_element<size, remove_cvref_t <Subject>, sizeof ...(S)>
514
- slider_labels (Subject&& subject, float font_size, S&&... s)
515
- {
516
- auto r = slider_labels_element<size, remove_cvref_t <Subject>, sizeof ...(S)>
517
- {std::forward<Subject>(subject), font_size};
518
- r._labels = {{std::move (s)...}};
519
- return r;
520
- }
521
172
}
522
173
523
174
#endif
0 commit comments