]> O.S.I.I.S - jp/crow.git/commitdiff
Basic color picker widget
authorjpbruyere <jp.bruyere@hotmail.com>
Wed, 19 Oct 2016 16:22:30 +0000 (18:22 +0200)
committerjpbruyere <jp.bruyere@hotmail.com>
Wed, 19 Oct 2016 16:22:30 +0000 (18:22 +0200)
modifié :         Crow.csproj
modifié :         CrowIDE/CrowIDE.csproj
nouveau fichier : CrowIDE/Default.style
modifié :         Default.style
nouveau fichier : Templates/ColorPicker.template
nouveau fichier : Tests/Interfaces/Divers/colorPicker.crow
nouveau fichier : src/GraphicObjects/ColorPicker.cs
nouveau fichier : src/GraphicObjects/ColorSelector.cs
modifié :         Tests/Tests.csproj
modifié :         src/CompilerServices/CompilerServices.cs
modifié :         src/SolidColor.cs
simplify Alignment
modifié :         src/Enums.cs
prevent null background fill
modifié :         src/GraphicObjects/GraphicObject.cs

13 files changed:
Crow.csproj
CrowIDE/CrowIDE.csproj
CrowIDE/Default.style [new file with mode: 0644]
Default.style
Templates/ColorPicker.template [new file with mode: 0755]
Tests/Interfaces/Divers/colorPicker.crow [new file with mode: 0755]
Tests/Tests.csproj
src/CompilerServices/CompilerServices.cs
src/Enums.cs
src/GraphicObjects/ColorPicker.cs [new file with mode: 0644]
src/GraphicObjects/ColorSelector.cs [new file with mode: 0644]
src/GraphicObjects/GraphicObject.cs
src/SolidColor.cs

index 5eba59f870b8182145f9078b6ae9dc54ff47731d..d34bcc3684612375366d13f8e7e0667ba087dc03 100644 (file)
     <Compile Include="src\GraphicObjects\Menu.cs" />
     <Compile Include="src\Command.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="src\GraphicObjects\ColorPicker.cs" />
+    <Compile Include="src\GraphicObjects\ColorSelector.cs" />
   </ItemGroup>
   <ItemGroup>
     <Reference Include="System" />
     <EmbeddedResource Include="Templates\Menu.template">
       <LogicalName>Crow.Menu.template</LogicalName>
     </EmbeddedResource>
+    <EmbeddedResource Include="Templates\ColorPicker.template">
+      <LogicalName>Crow.ColorPicker.template</LogicalName>
+    </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
     <None Include="README.md" />
index 0320b3437cbb979f96f4eee24f3a58af8a921a07..d4990c503a77dcca33ef49cc090851b35b98c84c 100644 (file)
@@ -93,6 +93,7 @@
     <EmbeddedResource Include="ui\bindingExplorer.crow" />
     <EmbeddedResource Include="ui\bindingExpITemp.crow" />
     <EmbeddedResource Include="ui\LQIsExplorer.crow" />
+    <EmbeddedResource Include="Default.style" />
   </ItemGroup>
   <ItemGroup>
     <None Include="ui\test.crow">
diff --git a/CrowIDE/Default.style b/CrowIDE/Default.style
new file mode 100644 (file)
index 0000000..19be18b
--- /dev/null
@@ -0,0 +1,3 @@
+TextBox {
+       Margin = 1;
+}
\ No newline at end of file
index 933f89fea790969ea9c31f80c03e03d0ea71588d..42e09598f1bb94152a1c059e1bab6b6251ec4607 100644 (file)
@@ -55,6 +55,7 @@ TextBox {
        Foreground = Black;
        Selectable = True;
        Text = TextBox;
+       Margin = 1;
 }
 Window {
        Focusable = true;
@@ -80,4 +81,9 @@ Icon {
 Control {
        Margin=0;
        Spacing=3;
+}
+ColorSpinner {
+       Minimum = 0;
+       Maximum = 255;
+       SmallIncrement = 1;
 }
\ No newline at end of file
diff --git a/Templates/ColorPicker.template b/Templates/ColorPicker.template
new file mode 100755 (executable)
index 0000000..ececc7a
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<Border Background="{./Background}"    Foreground="{./Foreground}"
+               CornerRadius="{./CornerRadius}" BorderWidth="1">
+               <HorizontalStack Spacing="0">
+                       <VerticalStack Margin="5">
+                               <ColorSelector Focusable="true" Name="colorSelector" Margin="1" Width="200" Height="200" Background="DimGray"/>
+                       </VerticalStack>
+                       <VerticalStack Margin="5">
+                               <HorizontalStack>
+                                       <Label Text="Red:" Width="50"/>
+                                       <Spinner Style="ColorSpinner" Value="{²../../../colorSelector.R}" Width="50"  />
+                               </HorizontalStack>
+                               <HorizontalStack>
+                                       <Label Text="Green:" Width="50"/>
+                                       <Spinner Style="ColorSpinner" Value="{²../../../colorSelector.G}" Width="50"  />
+                               </HorizontalStack>
+                               <HorizontalStack>
+                                       <Label Text="Blue:" Width="50"/>
+                                       <Spinner Style="ColorSpinner" Value="{²../../../colorSelector.B}" Width="50"  />
+                               </HorizontalStack>
+                               <HorizontalStack>
+                                       <Label Text="Alpha:" Width="50"/>
+                                       <Spinner Style="ColorSpinner" Value="{²../../../colorSelector.A}" Width="50"  />
+                               </HorizontalStack>
+                               <GraphicObject Width="30" Height="20" Background="{../../colorSelector.PointedColor}"/>
+                               <Label Background="Jet" Text="{../../colorSelector.PointedColorName}"/>
+                               <GraphicObject Width="30" Height="20" Background="{../../colorSelector.SelectedColor}"/>
+                               <Label Background="Jet" Text="{../../colorSelector.SelectedColorName}"/>
+                       </VerticalStack>
+               </HorizontalStack>
+</Border>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/colorPicker.crow b/Tests/Interfaces/Divers/colorPicker.crow
new file mode 100755 (executable)
index 0000000..724ca4d
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<ColorPicker Background="Onyx" Margin="5" Fit="True" Foreground="White"/>
\ No newline at end of file
index 771c8b4ad200e70352ad86a687bb1c904b5aa82d..e1b8e182cf4061bc624e5950a010c9d8fa86aa2c 100644 (file)
     <None Include="Interfaces\TemplatedControl\testSpinner.crow">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Include="Interfaces\Divers\colorPicker.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <Folder Include="Interfaces\" />
index 305c9a5f4f8c9c3dd31f8e41b9c6b1d520f3ed9a..77666af28b59d6ab14022cf67d37ddc3506ce987 100644 (file)
@@ -308,7 +308,7 @@ namespace Crow
                                        if (b.Target.Member != null)
                                                il.Emit (OpCodes.Ldstr, b.Target.Member.Name);
                                        else
-                                               il.Emit (OpCodes.Ldstr, b.Expression.Split ('/').LastOrDefault ());
+                                               il.Emit (OpCodes.Ldstr, b.Expression.Split ('/').LastOrDefault ().Split('.').LastOrDefault());
                                        il.Emit (OpCodes.Ldc_I4_4);//StringComparison.Ordinal
                                        il.Emit (OpCodes.Callvirt, stringEquals);
                                        il.Emit (OpCodes.Brtrue, jumpTable [i]);
index aac12e16c2dfb9f73d9c965851c5d06ea51f6f82..46f8cdab6d0ce7056305fe45f717a6cf5abb5d41 100644 (file)
@@ -11,7 +11,7 @@ namespace Crow
         Vertical
     }
 
-       public enum Alignment : byte
+       public enum Alignment 
     {
         Top = 0x01,
         Left = 0x02,
diff --git a/src/GraphicObjects/ColorPicker.cs b/src/GraphicObjects/ColorPicker.cs
new file mode 100644 (file)
index 0000000..1272914
--- /dev/null
@@ -0,0 +1,96 @@
+//
+//  ColorPicker.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 System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       public class ColorPicker : TemplatedControl
+       {
+               public ColorPicker () : base ()
+               {
+               }
+
+               Color selectedColor;
+               float _red, _green, _blue, _alpha;
+
+               [XmlAttributeAttribute()]
+               public virtual double Red {
+                       get { return selectedColor.R; }
+                       set {
+                               if (selectedColor.R == value)
+                                       return;
+                               selectedColor.R = value; 
+                               NotifyValueChanged ("Red", selectedColor.R);
+                               NotifyValueChanged ("SelectedColor", new SolidColor(selectedColor));
+                       }
+               }
+               [XmlAttributeAttribute()]
+               public virtual double Green {
+                       get { return selectedColor.G; }
+                       set {
+                               if (selectedColor.G == value)
+                                       return;
+                               selectedColor.G = value;
+                               NotifyValueChanged ("Green", selectedColor.G);
+                               NotifyValueChanged ("SelectedColor", new SolidColor(selectedColor));
+                       }
+               }
+               [XmlAttributeAttribute()]
+               public virtual double Blue {
+                       get { return selectedColor.B; }
+                       set {
+                               if (selectedColor.B == value)
+                                       return;
+                               selectedColor.B = value;
+                               NotifyValueChanged ("Blue", selectedColor.B);
+                               NotifyValueChanged ("SelectedColor", new SolidColor(selectedColor));
+                       }
+               }
+               [XmlAttributeAttribute()]
+               public virtual double Alpha {
+                       get { return selectedColor.A; }
+                       set {
+                               if (selectedColor.A == value)
+                                       return;
+                               selectedColor.A = value;
+                               NotifyValueChanged ("Alpha", selectedColor.A);
+                               NotifyValueChanged ("SelectedColor", new SolidColor(selectedColor));
+                       }
+               }
+               [XmlAttributeAttribute()][DefaultValue("White")]
+               public virtual SolidColor SelectedColor {
+                       get { return selectedColor; }
+                       set {                           
+                               if (selectedColor.Equals(value))
+                                       return;
+                               selectedColor = value; 
+                               NotifyValueChanged ("SelectedColor", new SolidColor(selectedColor));
+                               NotifyValueChanged ("Alpha", selectedColor.A);
+                               NotifyValueChanged ("Blue", selectedColor.B);
+                               NotifyValueChanged ("Green", selectedColor.G);
+                               NotifyValueChanged ("Red", selectedColor.R);
+                       }
+               }
+       }
+}
+
diff --git a/src/GraphicObjects/ColorSelector.cs b/src/GraphicObjects/ColorSelector.cs
new file mode 100644 (file)
index 0000000..a5b9d04
--- /dev/null
@@ -0,0 +1,184 @@
+//
+//  ColorPicker.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 System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       public class ColorSelector : GraphicObject
+       {
+               const double colDiv = 1.0 / 255.0;
+
+               public ColorSelector ():base()
+               {
+               }
+               protected override void onDraw (Cairo.Context gr)
+               {
+                       base.onDraw (gr);
+
+                       Rectangle r = ClientRectangle;
+
+//                     if (r.Width > r.Height) {
+//                             int diff = r.Width - r.Height;
+//                             r.Width = r.Height;
+//                             r.X -= diff / 2;
+//                     } else if (r.Height > r.Width) {
+//                             int diff = r.Height - r.Width;
+//                             r.Height = r.Width;
+//                             r.Y += diff / 2;
+//                     }
+
+                       Crow.Gradient grad = new Gradient (Gradient.Type.Horizontal);
+
+                       grad.Stops.Add (new Gradient.ColorStop (0, new Color (1, 0, 0, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (0.2, new Color (1, 1, 0, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (0.4, new Color (0, 1, 0, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (0.6, new Color (0, 1, 1, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (0.8, new Color (0, 0, 1, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (1, new Color (1, 0, 0, 1)));
+
+                       grad.SetAsSource (gr, r);
+                       CairoHelpers.CairoRectangle (gr, r, CornerRadius);
+                       gr.Fill();
+
+                       grad = new Gradient (Gradient.Type.Vertical);
+                       grad.Stops.Add (new Gradient.ColorStop (0, new Color (1, 1, 1, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (0.5, new Color (0, 0, 0, 0)));
+                       grad.Stops.Add (new Gradient.ColorStop (1, new Color (0, 0, 0, 1)));
+
+                       grad.SetAsSource (gr, r);
+                       CairoHelpers.CairoRectangle (gr, r, CornerRadius);
+                       gr.Fill();
+               }
+               [XmlAttributeAttribute()]
+               public virtual double R {
+                       get { return Math.Ceiling((selectedColor as SolidColor).color.R * 255.0); }
+                       set {
+                               if (R == value)
+                                       return;
+                               Color c = (SelectedColor as SolidColor).color;
+                               SelectedColor = new SolidColor (new Color (value * colDiv, c.G, c.B, c.A));
+                       }
+               }
+               [XmlAttributeAttribute()]
+               public virtual double G {
+                       get { return Math.Ceiling((selectedColor as SolidColor).color.G * 255.0); }
+                       set {
+                               if (G == value)
+                                       return;
+                               Color c = (SelectedColor as SolidColor).color;
+                               SelectedColor = new SolidColor (new Color (c.R, value * colDiv, c.B, c.A));
+                       }
+               }
+               [XmlAttributeAttribute()]
+               public virtual double B {
+                       get { return Math.Ceiling((selectedColor as SolidColor).color.B * 255.0); }
+                       set {
+                               if (B == value)
+                                       return;
+                               Color c = (SelectedColor as SolidColor).color;
+                               SelectedColor = new SolidColor (new Color (c.R, c.G, value * colDiv, c.A));
+                       }
+               }
+               [XmlAttributeAttribute()]
+               public virtual double A {
+                       get { return Math.Ceiling((selectedColor as SolidColor).color.A * 255.0); }
+                       set {
+                               if (A == value)
+                                       return;
+                               Color c = (SelectedColor as SolidColor).color;
+                               SelectedColor = new SolidColor (new Color (c.R, c.G, c.B, value * colDiv));
+                       }
+               }
+
+               Fill pointedColor, selectedColor;
+               [XmlAttributeAttribute()][DefaultValue("White")]
+               public virtual Fill PointedColor {
+                       get { return pointedColor; }
+                       set {
+                               if (pointedColor == value)
+                                       return;
+                               pointedColor = value; 
+                               NotifyValueChanged ("PointedColor", pointedColor);
+                               string n = (pointedColor as SolidColor).color.ToString ();
+                               if (char.IsLetter(n[0]))
+                                       NotifyValueChanged ("PointedColorName", n);
+                               else
+                                       NotifyValueChanged ("PointedColorName", "-");
+                       }
+               }
+               [XmlAttributeAttribute()][DefaultValue("White")]
+               public virtual Fill SelectedColor {
+                       get { return selectedColor; }
+                       set {
+                               if (selectedColor == value)
+                                       return;
+                               selectedColor = value;
+                               NotifyValueChanged ("SelectedColor", selectedColor);
+                               string n = (selectedColor as SolidColor).color.ToString ();
+                               if (char.IsLetter(n[0]))
+                                       NotifyValueChanged ("SelectedColorName", n);
+                               else
+                                       NotifyValueChanged ("SelectedColorName", "-");
+                               NotifyValueChanged ("R", R);
+                               NotifyValueChanged ("G", G);
+                               NotifyValueChanged ("B", B);
+                               NotifyValueChanged ("A", A);
+                               //NotifyValueChanged ("A", sc.color.A);
+                       }
+               } 
+
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseMove (sender, e);
+                       Rectangle r = ScreenCoordinates (Slot);
+                       Point pos = e.Position - r.Position;
+                       //System.Diagnostics.Debug.WriteLine ("{0} {1}", pos.X, pos.Y);
+                       if (bmp == null)
+                               return;
+                       PointedColor = new SolidColor(getPixelAt(pos.X, pos.Y));
+               }
+
+               Color getPixelAt(int x, int y){                 
+                       int ptr = y * Slot.Width * 4 + x * 4;
+
+                       return new Color(
+                               (double)bmp[ptr + 2] * colDiv,
+                               (double)bmp[ptr + 1] * colDiv,
+                               (double)bmp[ptr] * colDiv,
+                               (double)bmp[ptr + 3] * colDiv);
+
+//                     return new Color(
+//                             1.0 / (double)bmp[ptr + 1],
+//                             1.0 / (double)bmp[ptr + 2],
+//                             1.0 / (double)bmp[ptr + 3],
+//                             1.0 / (double)bmp[ptr]);
+               }
+
+               public override void onMouseClick (object sender, MouseButtonEventArgs e)
+               {                       
+                       base.onMouseClick (sender, e);
+                       SelectedColor = PointedColor;
+               }
+       }
+}
+
index b58bf7eb2aa409ad5847edaa968d226b1b5a9f8d..d182f54ae15385444fefd55e64832d9210046e2c 100644 (file)
@@ -404,6 +404,8 @@ namespace Crow
                        set {
                                if (background == value)
                                        return;
+                               if (value == null)
+                                       return;
                                background = value;
                                NotifyValueChanged ("Background", background);
                                RegisterForRedraw ();
index 2b6f7e71b52797545cac0ffb36ff11ace918623d..d214f592fc05311e1db5eefdf150926c63c86bfd 100644 (file)
@@ -12,7 +12,7 @@ namespace Crow
 {
        public class SolidColor : Fill
     {
-               Color color = Color.Transparent;
+               public Color color = Color.Transparent;
                #region CTOR
                public SolidColor(Color c)
                {