Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / SCClassLibrary / QtCollider / QKnob.sc
blob7797d4664d428c21f3616e6a206f87737894c870
1 // blackrain at realizedsound dot net - 05/2006
2 //  fix key modidiers bug by Stephan Wittwer 08/2006 - thanks!
3 //  Knob updates only on value changes - 10/2006
4 //  GUI.cocoa changes - 04/2007
5 //
6 //  03.10.2008 - new implementation:
7 //    - Knob now is a subclass of SCViewHolder
8 //    - Relative origin
9 //
10 //  01.20.2009 - SCKnob
11 //    - a subclass of SCUserView again.
12 //    - isSquare option
14 //  08.03.2010 - QKnob = SCKnob adjusted for GUI.qt scheme (by Jakob Leben)
16 QKnob : QAbstractStepValue {
17   classvar <>defaultMode = \round;
19   var <>keystep = 0.01;
21   *qtClass {^'QcKnob'}
23   *new { arg parent, bounds;
24     var me = super.new(parent,bounds);
25     me.mode = defaultMode;
26     ^me;
27   }
29   value { ^this.getProperty(\value) }
30   value_ { arg val; this.setProperty(\value, val) }
31   valueAction_ { arg val; this.value = val; this.doAction }
33   mode {
34     var m = this.getProperty(\mode);
35     ^ #[\round, \horiz, \vert].at(m);
36   }
38   mode_ { arg inputMode;
39     var iMode;
40     switch ( inputMode,
41       \round, { iMode = 0},
42       \horiz, { iMode = 1},
43       \vert, { iMode = 2 },
44       { ^this }
45     );
46     this.setProperty( \mode, iMode );
47   }
49   centered_ { arg bool; this.setProperty( \centered, bool ); }
50   centered { ^this.getProperty( \centered ); }
52   // FIXME: find better alternatives to set colors separately.
53   color_ { arg colors;
54     var p;
55     p = this.palette;
56     p.button = colors[0];
57     p.windowText = colors[1];
58     p.window = colors[2];
59     p.buttonText = colors[3];
60     this.palette = p;
61   }
63   color {
64     var p;
65     p = this.palette;
66     ^[p.button, p.windowText, p.window, p.buttonText];
67   }
69   getScale { |modifiers|
70     ^case
71       { modifiers.isShift } { this.shift_scale }
72       { modifiers.isCtrl } { this.ctrl_scale }
73       { modifiers.isAlt } { this.alt_scale }
74       { 1 };
75   }
77   defaultKeyDownAction { arg char, modifiers, unicode, keycode, key;
78     var zoom = this.getScale(modifiers);
80     // standard keydown
81     switch( char,
82       $r, { this.valueAction = 1.0.rand },
83       $n, { this.valueAction = 0.0 },
84       $x, { this.valueAction = 1.0 },
85       $c, { this.valueAction = 0.5 },
87       {
88         switch( key,
89           16r5b, { this.decrement(zoom) },
90           16r5d, { this.increment(zoom) },
91           16r1000013, { this.increment(zoom) },
92           16r1000014, { this.increment(zoom) },
93           16r1000015, { this.decrement(zoom) },
94           16r1000012, { this.decrement(zoom) },
95           {^this} // propagate on if the key is a no-op
96         )
97       }
98     );
99     ^true;
100   }
102   increment { |zoom=1| ^this.valueAction = (this.value + (keystep * zoom)) }
104   decrement { |zoom=1| ^this.valueAction = (this.value - (keystep * zoom)) }
106   defaultGetDrag { ^this.value }
107   defaultCanReceiveDrag { ^QView.currentDrag.isNumber }
108   defaultReceiveDrag { this.valueAction = QView.currentDrag }