@@ -308,7 +308,19 @@ void Slider::_notification(int p_what) {
308
308
continue ;
309
309
}
310
310
int ofs = (i * areasize / (ticks - 1 )) + grabber_offset - grabber_shift;
311
- tick->draw (ci, Point2i ((size.width - widget_width) / 2 , ofs));
311
+
312
+ if (ticks_position == BOTTOM_RIGHT || ticks_position == BOTH) {
313
+ tick->draw (ci, Point2i (widget_width + (size.width - widget_width) / 2 + theme_cache.tick_offset , ofs));
314
+ }
315
+
316
+ if (ticks_position == TOP_LEFT || ticks_position == BOTH) {
317
+ Point2i pos = Point2i ((size.width - widget_width) / 2 - tick->get_width () - theme_cache.tick_offset , ofs);
318
+ tick->draw_rect (ci, Rect2i (pos, Size2i (-tick->get_width (), tick->get_height ())));
319
+ }
320
+
321
+ if (ticks_position == CENTER) {
322
+ tick->draw (ci, Point2i ((size.width - tick->get_width ()) / 2 + theme_cache.tick_offset , ofs));
323
+ }
312
324
}
313
325
}
314
326
grabber->draw (ci, Point2i (size.width / 2 - grabber->get_width () / 2 + theme_cache.grabber_offset , size.height - ratio * areasize - grabber->get_height () + grabber_shift));
@@ -333,7 +345,19 @@ void Slider::_notification(int p_what) {
333
345
continue ;
334
346
}
335
347
int ofs = (i * areasize / (ticks - 1 )) + grabber_offset + grabber_shift;
336
- tick->draw (ci, Point2i (ofs, (size.height - widget_height) / 2 ));
348
+
349
+ if (ticks_position == BOTTOM_RIGHT || ticks_position == BOTH) {
350
+ tick->draw (ci, Point2i (ofs, widget_height + (size.height - widget_height) / 2 + theme_cache.tick_offset ));
351
+ }
352
+
353
+ if (ticks_position == TOP_LEFT || ticks_position == BOTH) {
354
+ Point2i pos = Point2i (ofs, (size.height - widget_height) / 2 - tick->get_height () - theme_cache.tick_offset );
355
+ tick->draw_rect (ci, Rect2i (pos, Size2i (tick->get_width (), -tick->get_height ())));
356
+ }
357
+
358
+ if (ticks_position == CENTER) {
359
+ tick->draw (ci, Point2i (ofs, (size.height - tick->get_height ()) / 2 + theme_cache.tick_offset ));
360
+ }
337
361
}
338
362
}
339
363
grabber->draw (ci, Point2i ((rtl ? 1 - ratio : ratio) * areasize + grabber_shift, size.height / 2 - grabber->get_height () / 2 + theme_cache.grabber_offset ));
@@ -342,6 +366,12 @@ void Slider::_notification(int p_what) {
342
366
}
343
367
}
344
368
369
+ void Slider::_validate_property (PropertyInfo &p_property) const {
370
+ if (p_property.name == " ticks_position" ) {
371
+ p_property.hint_string = orientation == VERTICAL ? " Right,Left,Both,Center" : " Bottom,Top,Both,Center" ;
372
+ }
373
+ }
374
+
345
375
void Slider::set_custom_step (double p_custom_step) {
346
376
custom_step = p_custom_step;
347
377
}
@@ -367,6 +397,10 @@ bool Slider::get_ticks_on_borders() const {
367
397
return ticks_on_borders;
368
398
}
369
399
400
+ Slider::TickPosition Slider::get_ticks_position () const {
401
+ return ticks_position;
402
+ }
403
+
370
404
void Slider::set_ticks_on_borders (bool _tob) {
371
405
if (ticks_on_borders == _tob) {
372
406
return ;
@@ -376,6 +410,15 @@ void Slider::set_ticks_on_borders(bool _tob) {
376
410
queue_redraw ();
377
411
}
378
412
413
+ void Slider::set_ticks_position (TickPosition p_ticks_position) {
414
+ if (ticks_position == p_ticks_position) {
415
+ return ;
416
+ }
417
+
418
+ ticks_position = p_ticks_position;
419
+ queue_redraw ();
420
+ }
421
+
379
422
void Slider::set_editable (bool p_editable) {
380
423
if (editable == p_editable) {
381
424
return ;
@@ -405,6 +448,9 @@ void Slider::_bind_methods() {
405
448
ClassDB::bind_method (D_METHOD (" get_ticks_on_borders" ), &Slider::get_ticks_on_borders);
406
449
ClassDB::bind_method (D_METHOD (" set_ticks_on_borders" , " ticks_on_border" ), &Slider::set_ticks_on_borders);
407
450
451
+ ClassDB::bind_method (D_METHOD (" get_ticks_position" ), &Slider::get_ticks_position);
452
+ ClassDB::bind_method (D_METHOD (" set_ticks_position" , " ticks_on_border" ), &Slider::set_ticks_position);
453
+
408
454
ClassDB::bind_method (D_METHOD (" set_editable" , " editable" ), &Slider::set_editable);
409
455
ClassDB::bind_method (D_METHOD (" is_editable" ), &Slider::is_editable);
410
456
ClassDB::bind_method (D_METHOD (" set_scrollable" , " scrollable" ), &Slider::set_scrollable);
@@ -417,6 +463,12 @@ void Slider::_bind_methods() {
417
463
ADD_PROPERTY (PropertyInfo (Variant::BOOL, " scrollable" ), " set_scrollable" , " is_scrollable" );
418
464
ADD_PROPERTY (PropertyInfo (Variant::INT, " tick_count" , PROPERTY_HINT_RANGE, " 0,4096,1" ), " set_ticks" , " get_ticks" );
419
465
ADD_PROPERTY (PropertyInfo (Variant::BOOL, " ticks_on_borders" ), " set_ticks_on_borders" , " get_ticks_on_borders" );
466
+ ADD_PROPERTY (PropertyInfo (Variant::INT, " ticks_position" , PROPERTY_HINT_ENUM), " set_ticks_position" , " get_ticks_position" );
467
+
468
+ BIND_ENUM_CONSTANT (BOTTOM_RIGHT);
469
+ BIND_ENUM_CONSTANT (TOP_LEFT);
470
+ BIND_ENUM_CONSTANT (BOTH);
471
+ BIND_ENUM_CONSTANT (CENTER);
420
472
421
473
BIND_THEME_ITEM_CUSTOM (Theme::DATA_TYPE_STYLEBOX, Slider, slider_style, " slider" );
422
474
BIND_THEME_ITEM_CUSTOM (Theme::DATA_TYPE_STYLEBOX, Slider, grabber_area_style, " grabber_area" );
@@ -429,6 +481,7 @@ void Slider::_bind_methods() {
429
481
430
482
BIND_THEME_ITEM (Theme::DATA_TYPE_CONSTANT, Slider, center_grabber);
431
483
BIND_THEME_ITEM (Theme::DATA_TYPE_CONSTANT, Slider, grabber_offset);
484
+ BIND_THEME_ITEM (Theme::DATA_TYPE_CONSTANT, Slider, tick_offset);
432
485
}
433
486
434
487
Slider::Slider (Orientation p_orientation) {
0 commit comments