WWW-www.enlightenment.org pushed a commit to branch master. http://git.enlightenment.org/website/www-content.git/commit/?id=b6fb55ca6e88b3b70e1e8fecbe0e9e25febc8063
commit b6fb55ca6e88b3b70e1e8fecbe0e9e25febc8063 Author: Jean Rene Dawin <hi...@gmx.de> Date: Wed Feb 22 15:40:19 2017 -0800 Wiki page knob_example changed with summary [] by Jean Rene Dawin --- pages/themes/knob_example.txt | 144 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/pages/themes/knob_example.txt b/pages/themes/knob_example.txt index b7ed9f6..4a5577b 100644 --- a/pages/themes/knob_example.txt +++ b/pages/themes/knob_example.txt @@ -107,4 +107,148 @@ Here each state is associated with one image (position) of the knob. image.normal: "0060.png"; } } +</code> +The following ''part'' is needed so we can set the value of the knob from the C source via elm_slider_value_set. +<code> + part{ + //The real slider for elm_slider + name: "elm.dragable.slider"; + scale: 1; + dragable.x: 1 1 0; + dragable.y: 1 1 0; + type: RECT; + description{ + state: "default" 0.0; + visible: 0; + } + dragable{ + x: 1 1 0; + y: 1 1 0; + } + } +</code> +This ''part'' named "dragger" is the actually draggable part of the slider. +It's invisible but will measure how much the knob has been turned (or dragged). +<code> + part{ + name: "dragger"; + type: RECT; + description{ + state: "default" 0.0; + rel1.to: "knob"; + rel2.to: "knob"; + color: 0 0 0 0; + } + description{ + state: "hoki" 0.0; + rel1.to: "knob"; + rel2.to: "knob"; + color: 0 0 0 0; + } + dragable{ + x: 0 0 0; + y: 1 1 0; + } + } + } +</code> +Now the ''parts'' block is finished and we continue with the ''programs'' block which contains small scripts which control the behaviour of our knob. The programs are called when a certain signal +from a certain source is received. Signals can be emitted from inside this edje +or from outside (C source). +<code> + programs{ +</code> +The script part of the ''program'' named "on_drag_move" runs when the +signal "drag" from source "dragger" (the part defined above) is received. +<code> + program{ + name: "on_drag_move"; + signal: "drag"; + source: "dragger"; + script{ + new Float:p1; + new Float:p2; + + //The drag value is subtracted from the last knob position + //because a drag upwards yields negative values. + + get_drag(PART:"dragger", p1, p2); + set_float(knob_pos, get_float(knob_last) - p2); + + new px, py, pw, ph; + get_geometry(PART:"knob", px, py, pw, ph); + if(get_float(knob_pos) > ph) set_float(knob_pos, ph); + if(get_float(knob_pos) < 0) set_float(knob_pos, 0); + + update_knob_state(get_float(knob_pos)); + new Float:sl_val = get_float(knob_pos)/ph; + + set_int(signal_from_dragger, 1); + set_drag(PART:"elm.dragable.slider", sl_val , sl_val); + } + } +</code> +The variable "signal_from_dragger" is used as a guard to distinguish if calls of set_drag for "elm.dragable.slider" are made from within the edje theme (then it is 1), ore from outside, e.g. C source, (then it is 0). + +Next are some more programs +<code> + program{ + name: "on_drag_stop"; + signal: "drag,stop"; + source: "dragger"; + script{ + set_float(knob_last, get_float(knob_pos)); + reset_dragger(); + } + } + program{ + name: "on_wheel"; + signal: "mouse,wheel*"; + source: "dragger"; + //after: "on_slider_set"; + } + program{ + signal: "elm,state,enabled"; + source: "elm"; + script { + set_int(signal_from_dragger, 0); + } + } +</code> +The following ''program'' is called when set_drag for elm.dragable.slider is called. +<code> + program{ + + signal: "drag,set"; + source: "elm.dragable.slider"; + script { +</code> +If we were called because the part "dragger" was dragged, "signal_from_dragger" is 1 and nothing else +will happen here except that "signal_from_dragger" will be set to 0. +<code> + if(get_int(signal_from_dragger) == 0){ + new Float:p1; + new Float:p2; + get_drag(PART:"elm.dragable.slider", p1, p2); + + new px, py, pw, ph; + get_geometry(PART:"knob", px, py, pw, ph); + set_float(knob_pos, ph*p1); + + if(get_float(knob_pos) > ph) set_float(knob_pos, ph); + if(get_float(knob_pos) < 0) set_float(knob_pos, 0); + + set_float(knob_last, get_float(knob_pos)); + + update_knob_state(get_float(knob_pos)); + + new Float:sl_val = get_float(knob_pos)/ph; + set_drag(PART:"elm.dragable.slider", sl_val , sl_val); + + }else{ + set_int(signal_from_dragger, 0); + } + } + } + } </code> \ No newline at end of file --