Range.hx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package hide.comp;
  2. class Range extends Component {
  3. var original : Null<Float>;
  4. public var value(get, set) : Float;
  5. var current : Float;
  6. var originMin : Float;
  7. var originMax : Float;
  8. var curMin : Float;
  9. var curMax : Float;
  10. var f : Element;
  11. var inputView : Element;
  12. var scale : Float;
  13. public function new(?parent:Element,?root:Element) {
  14. if( root == null )
  15. root = new Element('<input type="range">');
  16. super(parent,root);
  17. this.f = root;
  18. root = root.wrap('<div class="hide-range"/>').parent();
  19. if( f.attr("step") == null )
  20. f.attr("step", "any");
  21. scale = Std.parseFloat(f.attr("scale"));
  22. if( Math.isNaN(scale) ) scale = 1.;
  23. inputView = new Element('<input type="text">').appendTo(root);
  24. originMin = Std.parseFloat(f.attr("min"));
  25. originMax = Std.parseFloat(f.attr("max"));
  26. if( originMin == null || Math.isNaN(originMin) ) originMin = 0;
  27. if( originMax == null || Math.isNaN(originMax) ) originMax = 1;
  28. curMin = originMin;
  29. curMax = originMax;
  30. current = Std.parseFloat(f.attr("value"));
  31. if(current != null && !Math.isNaN(current))
  32. original = current;
  33. else
  34. current = 0;
  35. root.parent().prev("dt").contextmenu(function(e) {
  36. e.preventDefault();
  37. new ContextMenu([
  38. { label : "Reset", click : reset },
  39. { label : "Cancel", click : function() {} },
  40. ]);
  41. return false;
  42. });
  43. f.on("input", function(_) {
  44. var v = Math.round(Std.parseFloat(f.val()) * 100 * scale) / 100;
  45. setInner(v,true);
  46. inputView.val(current / scale);
  47. f.val(current / scale);
  48. onChange(true);
  49. });
  50. inputView.keyup(function(e) {
  51. if( e.keyCode == 13 || e.keyCode == 27 ) {
  52. inputView.blur();
  53. inputView.val(current / scale);
  54. return;
  55. }
  56. var v = Std.parseFloat(inputView.val()) * scale;
  57. if( Math.isNaN(v) ) return;
  58. setInner(v,true);
  59. f.val(v / scale);
  60. onChange(true);
  61. });
  62. inputView.change(function(e) {
  63. var v = Std.parseFloat(inputView.val()) * scale;
  64. if( Math.isNaN(v) ) return;
  65. setInner(v,false);
  66. f.val(v / scale);
  67. onChange(false);
  68. });
  69. f.val(current / scale);
  70. inputView.val(current / scale);
  71. f.change(function(e) {
  72. var v = Math.round(Std.parseFloat(f.val()) * 100 * scale) / 100;
  73. setInner(v,false);
  74. inputView.val(current / scale);
  75. onChange(false);
  76. });
  77. }
  78. public function reset() {
  79. value = original;
  80. onChange(false);
  81. }
  82. function set_value(v) {
  83. if( original == null ) original = v;
  84. setInner(v,true);
  85. current = v;
  86. inputView.val(current / scale);
  87. f.val(current / scale);
  88. return v;
  89. }
  90. function get_value() {
  91. return current;
  92. }
  93. function setInner(v:Float,tempChange:Bool) {
  94. current = v;
  95. if( v < curMin ) {
  96. curMin = Math.floor(v);
  97. f.attr("min", curMin);
  98. }
  99. if( v > curMax ) {
  100. curMax = Math.ceil(v);
  101. f.attr("max", curMax);
  102. }
  103. if( v >= originMin && v <= originMax && !tempChange ) {
  104. f.attr("min", originMin);
  105. f.attr("max", originMax);
  106. curMin = originMin;
  107. curMax = originMax;
  108. }
  109. }
  110. public dynamic function onChange( tempChange : Bool ) {
  111. }
  112. }