fresnel.demoslider.pas 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. unit Fresnel.DemoSlider;
  2. {$mode ObjFPC}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, math, System.UITypes, Fresnel.DOM, Fresnel.Controls,
  6. Fresnel.Classes, FCL.Events, Fresnel.Events, fpCSSTree;
  7. type
  8. { TDemoSlider }
  9. TDemoSlider = class(TDiv)
  10. private
  11. FMaxPosition: TFresnelLength;
  12. FMinPosition: TFresnelLength;
  13. FOnChange: TNotifyEvent;
  14. FSliderPosition: TFresnelLength;
  15. FValueFormat: string;
  16. function GetCaption: TFresnelCaption;
  17. procedure OnSliderDivMouse(Event: TAbstractEvent);
  18. procedure OnSliderPointMouse(Event: TAbstractEvent);
  19. procedure SetCaption(const AValue: TFresnelCaption);
  20. procedure SetMaxPosition(const AValue: TFresnelLength);
  21. procedure SetMinPosition(const AValue: TFresnelLength);
  22. procedure SetSliderPosition(AValue: TFresnelLength);
  23. procedure SetValueFormat(const AValue: string);
  24. procedure UpdateValueLabel;
  25. procedure UpdateSliderPosition;
  26. public
  27. const
  28. cStyle = ''
  29. +'.SliderCaptionDiv {'+LineEnding
  30. +' margin-bottom: 0.3em;'+LineEnding
  31. +' width: 100%;'+LineEnding
  32. +'}'+LineEnding
  33. +'.SliderLabel {'+LineEnding
  34. +'}'+LineEnding
  35. +'.SliderValue {'+LineEnding
  36. +' margin-left: 0.4em;'+LineEnding
  37. +' font-weight: 700;'+LineEnding
  38. +' color: #f66020;'+LineEnding
  39. +'}'+LineEnding
  40. +'.SliderDiv {'+LineEnding
  41. +' margin: 0.5em 0 0.4em;'+LineEnding
  42. +' position: relative;'+LineEnding
  43. +' border: 1px solid #5080e0;'+LineEnding
  44. +' background-color: #b6d6f0;'+LineEnding
  45. +' height: 0.8em;'+LineEnding
  46. +' border-radius: 5px;'+LineEnding
  47. +' width: 100%;'+LineEnding
  48. +'}'+LineEnding
  49. +'.SliderRange {'+LineEnding
  50. +' display: block;'+LineEnding
  51. +' position: absolute;'+LineEnding
  52. +' z-index: 1;'+LineEnding
  53. +' font-size: .7em;'+LineEnding
  54. +' border: 0;'+LineEnding
  55. +' background-color: #5ca0cc;'+LineEnding
  56. +' top: 1px;'+LineEnding
  57. +' left: 1px;'+LineEnding
  58. +' height: 100%;'+LineEnding
  59. +'}'+LineEnding
  60. +'.SliderPoint {'+LineEnding
  61. +' position: absolute;'+LineEnding
  62. +' z-index: 2;'+LineEnding
  63. +' width: 1.3em;'+LineEnding
  64. +' height: 1.3em;'+LineEnding
  65. +' border: 1px solid #385590;'+LineEnding
  66. +' background-color: #fff;'+LineEnding
  67. +' border-radius: 50%;'+LineEnding
  68. +' cursor: pointer;'+LineEnding
  69. +' top: -0.3em;'+LineEnding
  70. +' margin-left: -0.5em;'+LineEnding
  71. +'}'+LineEnding;
  72. var
  73. CaptionDiv: TDiv;
  74. SliderLabel: TLabel; // inside CaptionDiv
  75. SliderValue: TLabel; // inside CaptionDiv
  76. SliderDiv: TDiv;
  77. SliderRange: TDiv; // inside SliderDiv
  78. SliderPoint: TDiv; // inside SliderDiv
  79. constructor Create(AOwner: TComponent); override;
  80. class function GetCSSTypeStyle: TCSSString; override;
  81. property MinPosition: TFresnelLength read FMinPosition write SetMinPosition;
  82. property MaxPosition: TFresnelLength read FMaxPosition write SetMaxPosition;
  83. property SliderPosition: TFresnelLength read FSliderPosition write SetSliderPosition;
  84. property Caption: TFresnelCaption read GetCaption write SetCaption;
  85. property ValueFormat: string read FValueFormat write SetValueFormat;
  86. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  87. end;
  88. implementation
  89. { TDemoSlider }
  90. function TDemoSlider.GetCaption: TFresnelCaption;
  91. begin
  92. Result:=SliderLabel.Caption;
  93. end;
  94. procedure TDemoSlider.OnSliderDivMouse(Event: TAbstractEvent);
  95. var
  96. Evt: TFresnelMouseEvent;
  97. w: TFresnelLength;
  98. begin
  99. if Event is TFresnelMouseEvent then
  100. begin
  101. Evt:=TFresnelMouseDownEvent(Event);
  102. if Evt.Buttons=[mbLeft] then
  103. begin
  104. w:=SliderDiv.UsedBorderBox.Width;
  105. if w<1 then exit;
  106. SliderPosition:=Evt.X/w * (MaxPosition-MinPosition) + MinPosition;
  107. end;
  108. end;
  109. end;
  110. procedure TDemoSlider.OnSliderPointMouse(Event: TAbstractEvent);
  111. var
  112. Evt: TFresnelMouseEvent;
  113. w, x: TFresnelLength;
  114. begin
  115. if Event is TFresnelMouseEvent then
  116. begin
  117. Evt:=TFresnelMouseEvent(Event);
  118. if Evt.Buttons=[mbLeft] then
  119. begin
  120. // compute X on SliderDiv
  121. w:=SliderDiv.UsedBorderBox.Width;
  122. if w<1 then exit;
  123. x:=Evt.X + SliderPoint.UsedContentBox.Left;
  124. SliderPosition:=x/w * (MaxPosition-MinPosition) + MinPosition;
  125. end;
  126. end;
  127. end;
  128. procedure TDemoSlider.SetCaption(const AValue: TFresnelCaption);
  129. begin
  130. SliderLabel.Caption:=AValue;
  131. end;
  132. procedure TDemoSlider.SetMaxPosition(const AValue: TFresnelLength);
  133. begin
  134. if FMaxPosition=AValue then Exit;
  135. FMaxPosition:=AValue;
  136. FMinPosition:=Min(MinPosition,MaxPosition);
  137. FSliderPosition:=Min(MaxPosition,Max(MinPosition,SliderPosition));
  138. UpdateSliderPosition;
  139. end;
  140. procedure TDemoSlider.SetMinPosition(const AValue: TFresnelLength);
  141. begin
  142. if FMinPosition=AValue then Exit;
  143. FMinPosition:=AValue;
  144. FMaxPosition:=Max(MinPosition,MaxPosition);
  145. FSliderPosition:=Min(MaxPosition,Max(MinPosition,SliderPosition));
  146. UpdateSliderPosition;
  147. end;
  148. procedure TDemoSlider.SetSliderPosition(AValue: TFresnelLength);
  149. begin
  150. AValue:=Min(MaxPosition,Max(MinPosition,AValue));
  151. if AValue=FSliderPosition then exit;
  152. FSliderPosition:=AValue;
  153. UpdateSliderPosition;
  154. if Assigned(OnChange) then OnChange(Self);
  155. end;
  156. procedure TDemoSlider.SetValueFormat(const AValue: string);
  157. begin
  158. if FValueFormat=AValue then Exit;
  159. FValueFormat:=AValue;
  160. UpdateValueLabel;
  161. end;
  162. procedure TDemoSlider.UpdateValueLabel;
  163. var
  164. s: String;
  165. begin
  166. s:=Format(ValueFormat,[SliderPosition]);
  167. SliderValue.Caption:=s;
  168. end;
  169. procedure TDemoSlider.UpdateSliderPosition;
  170. var
  171. p: TFresnelLength;
  172. s: String;
  173. begin
  174. p:=(SliderPosition-MinPosition)/(MaxPosition-MinPosition);
  175. s:=FloatToCSSStr(p*100)+'%';
  176. SliderRange.Style:='width: '+s;
  177. SliderPoint.Style:='left: '+s;
  178. UpdateValueLabel;
  179. end;
  180. constructor TDemoSlider.Create(AOwner: TComponent);
  181. begin
  182. inherited Create(AOwner);
  183. FMinPosition:=0;
  184. FMaxPosition:=100;
  185. FValueFormat:='%fpx';
  186. CSSClasses.Add('Slider');
  187. CaptionDiv:=TDiv.Create(Self);
  188. with CaptionDiv do begin
  189. Name:='CaptionDiv';
  190. CSSClasses.Add('SliderCaptionDiv');
  191. Parent:=Self;
  192. end;
  193. SliderLabel:=TLabel.Create(Self);
  194. with SliderLabel do begin
  195. Name:='SliderLabel';
  196. CSSClasses.Add('SliderLabel');
  197. Caption:='Position';
  198. Parent:=CaptionDiv;
  199. end;
  200. SliderValue:=TLabel.Create(Self);
  201. with SliderValue do begin
  202. Name:='ValueLabel';
  203. CSSClasses.Add('SliderValue');
  204. Parent:=CaptionDiv;
  205. end;
  206. SliderDiv:=TDiv.Create(Self);
  207. with SliderDiv do begin
  208. Name:='SliderDiv';
  209. CSSClasses.Add('SliderDiv');
  210. Parent:=Self;
  211. AddEventListener(evtMouseDown,@OnSliderDivMouse);
  212. AddEventListener(evtMouseMove,@OnSliderDivMouse);
  213. end;
  214. SliderRange:=TDiv.Create(Self);
  215. with SliderRange do begin
  216. Name:='SliderRangeDiv';
  217. CSSClasses.Add('SliderRange');
  218. Parent:=SliderDiv;
  219. AddEventListener(evtMouseDown,@OnSliderDivMouse);
  220. AddEventListener(evtMouseMove,@OnSliderDivMouse);
  221. end;
  222. SliderPoint:=TDiv.Create(Self);
  223. with SliderPoint do begin
  224. Name:='SliderPointDiv';
  225. CSSClasses.Add('SliderPoint');
  226. AddEventListener(evtMouseDown,@OnSliderPointMouse);
  227. AddEventListener(evtMouseMove,@OnSliderPointMouse);
  228. Parent:=SliderDiv;
  229. end;
  230. end;
  231. class function TDemoSlider.GetCSSTypeStyle: TCSSString;
  232. begin
  233. Result:=cStyle;
  234. end;
  235. end.