{
   "ancestor_list" : [],
   "description" : "Custom unidimensionnal slider GUI I made for my touchscreen instrument. Presented here as a tuner, but can serve any control purpose.",
   "name" : "DiamondSlider : custom unidimensionnal slider GUI.",
   "author" : "Dindoléon",
   "is_private" : null,
   "id" : "1-5b1",
   "code" : "(\r\n// Custom unidimensionnal horizontal slider, licensed under GNU GPL v3 (<https://www.gnu.org/licenses/>).\r\n// Written by Simon Deplat (aka Dindoleon).\r\n// This is lovely with a touchscreen.\r\n\r\nvar synth, win, window_size, margin = 3, slider, value, label, diamond_size, stroke_size, diamond_outline_size, diamond_color, font;\r\n\r\nwindow_size = [300, 50];\r\ndiamond_size = 10;\r\ndiamond_outline_size = 15;\r\nstroke_size = 2;\r\nmargin = 3;\r\ndiamond_color = Color.new(0.2,0.5,0.9);\r\nfont = Font.new( Font.availableFonts.choose, window_size[1]/2 );\r\n\r\nvalue = 0;\r\n\r\nwin = Window(\"Diamond Slider\", Rect(0, 0, window_size[0], window_size[1]), false);\r\nwin.background_( Color.black );\r\n\r\nslider = UserView( win, Rect( margin, margin, window_size[0] - (margin*2), window_size[1] - (margin*2)));\r\n\r\nsynth = {arg freq=110; SinOsc.ar(freq!2)}.play;\r\n\r\nslider.drawFunc = {\r\n\tPen.width = stroke_size;\r\n\r\n\tPen.strokeColor = Color.white;\r\n\tPen.fillColor = Color.black;\r\n\tPen.addRect(Rect(0,0, slider.bounds.width,slider.bounds.height));\r\n\tPen.draw(3);\r\n\r\n\tPen.moveTo(((slider.bounds.width*value)-diamond_size) @ (slider.bounds.height/2));\r\n\tPen.lineTo(((slider.bounds.width*value)) @ ((slider.bounds.height/2)+diamond_size));\r\n\tPen.lineTo(((slider.bounds.width*value)+diamond_size) @ (slider.bounds.height/2));\r\n\tPen.lineTo(((slider.bounds.width*value)) @ ((slider.bounds.height/2)-diamond_size));\r\n\tPen.lineTo(((slider.bounds.width*value)-diamond_size) @ (slider.bounds.height/2));\r\n\tPen.fillColor = diamond_color;\r\n\tPen.fill;\r\n\r\n\tPen.moveTo( (0) @ (slider.bounds.height/2));\r\n\tPen.lineTo(((slider.bounds.width*value)-diamond_outline_size) @ ((slider.bounds.height/2)));\r\n\tPen.moveTo(((slider.bounds.width*value)+diamond_outline_size) @ (slider.bounds.height/2));\r\n\tPen.lineTo(((slider.bounds.width)) @ ((slider.bounds.height/2)));\r\n\tPen.moveTo(((slider.bounds.width*value)-diamond_outline_size) @ (slider.bounds.height/2));\r\n\tPen.lineTo(((slider.bounds.width*value)) @ ((slider.bounds.height/2)+diamond_outline_size));\r\n\tPen.lineTo(((slider.bounds.width*value)+diamond_outline_size) @ (slider.bounds.height/2));\r\n\tPen.lineTo(((slider.bounds.width*value)) @ ((slider.bounds.height/2)-diamond_outline_size));\r\n\tPen.lineTo(((slider.bounds.width*value)-diamond_outline_size) @ (slider.bounds.height/2));\r\n\tPen.strokeColor = diamond_color;\r\n\tPen.stroke;\r\n};\r\n\r\nlabel = StaticText(slider, Rect(50, 0, slider.bounds.width-50, slider.bounds.height));\r\nlabel.background_(Color.new(0,0,0,0));\r\nlabel.stringColor = Color.new(1,1,1,0.75);\r\nlabel.string = \"Frequency: 110.0\";\r\nlabel.align(\\center);\r\nlabel.font = font;\r\n\r\nslider.mouseDownAction = { |slider, x|\r\n\tvalue =  (x).linlin(0,slider.bounds.width,0,1);\r\n\tsynth.set(\\freq, value.linexp( 0, 1, 110, 220));\r\n\tlabel.string = \"Frequency: \" + value.linexp(0,1,110,220).trunc(0.01);\r\n\tslider.refresh\r\n};\r\nslider.mouseMoveAction = slider.mouseDownAction;\r\n\r\nwin.front;\r\nCmdPeriod.doOnce({Window.closeAll}); // Kill GUI and server sounds on < Ctrl + ^ + . > .\r\nwin.onClose = {\r\n\ts.freeAll;\r\n\tWindow.closeAll;\r\n};\r\n)",
   "labels" : [
      "gui",
      "slider"
   ]
}
