1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
//
// SaturationValueSelector.cs
//
// Author:
// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
//
// Copyright (c) 2016 jp
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using Cairo;
using System.Xml.Serialization;
namespace Crow
{
public class SaturationValueSelector : ColorSelector
{
public SaturationValueSelector () : base()
{
}
double v, s;
[XmlAttributeAttribute()]
public virtual double V {
get { return v; }
set {
if (v == value)
return;
v = value;
NotifyValueChanged ("V", v);
mousePos.Y = (int)Math.Floor((1.0-v) * (double)ClientRectangle.Height);
CurrentInterface.EnqueueForRepaint (this);
}
}
[XmlAttributeAttribute()]
public virtual double S {
get { return s; }
set {
if (s == value)
return;
s = value;
NotifyValueChanged ("S", s);
mousePos.X = (int)Math.Floor(s * (double)ClientRectangle.Width);
CurrentInterface.EnqueueForRepaint (this);
}
}
protected override void onDraw (Cairo.Context gr)
{
base.onDraw (gr);
Rectangle r = ClientRectangle;
Rectangle rGrad = r;
rGrad.Inflate (-1);
if (Foreground != null) {//TODO:test if null should be removed
Foreground.SetAsSource (gr, r);
CairoHelpers.CairoRectangle (gr, r, CornerRadius);
gr.Fill ();
}
Crow.Gradient grad = new Gradient (Gradient.Type.Horizontal);
grad.Stops.Add (new Gradient.ColorStop (0, new Color (1, 1, 1, 1)));
grad.Stops.Add (new Gradient.ColorStop (1, new Color (1, 1, 1, 0)));
grad.SetAsSource (gr, rGrad);
CairoHelpers.CairoRectangle (gr, r, CornerRadius);
gr.Fill();
grad = new Gradient (Gradient.Type.Vertical);
grad.Stops.Add (new Gradient.ColorStop (0, new Color (0, 0, 0, 0)));
grad.Stops.Add (new Gradient.ColorStop (1, new Color (0, 0, 0, 1)));
grad.SetAsSource (gr, rGrad);
CairoHelpers.CairoRectangle (gr, r, CornerRadius);
gr.Fill();
}
public override void Paint (ref Context ctx)
{
base.Paint (ref ctx);
Rectangle rb = Slot + Parent.ClientRectangle.Position;
ctx.Save ();
ctx.Translate (rb.X, rb.Y);
ctx.SetSourceColor (Color.White);
ctx.Arc (mousePos.X, mousePos.Y, 3.0, 0, Math.PI * 2.0);
ctx.LineWidth = 1.0;
ctx.Stroke ();
ctx.Restore ();
}
protected override void updateMouseLocalPos (Point mPos)
{
base.updateMouseLocalPos (mPos);
Rectangle cb = ClientRectangle;
s = (double)mousePos.X / (double)cb.Width;
v = 1.0 - (double)mousePos.Y / (double)cb.Height;
NotifyValueChanged ("S", s);
NotifyValueChanged ("V", v);
}
public override void OnLayoutChanges (LayoutingType layoutType)
{
base.OnLayoutChanges (layoutType);
switch (layoutType) {
case LayoutingType.Width:
mousePos.X = (int)Math.Floor(s * (double)ClientRectangle.Width);
break;
case LayoutingType.Height:
mousePos.Y = (int)Math.Floor((1.0-v) * (double)ClientRectangle.Height);
break;
}
}
}
}
|