aboutsummaryrefslogtreecommitdiffstatsci
path: root/src/GraphicObjects/SaturationValueSelector.cs
blob: b71fa7ef8dc4fae19fe77beed7a37e292ff8cd68 (plain)
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;
			}
		}
	}
}