[javafxset~master:35] RadialColorPicker

  • From: Nailman@kenai.com
  • To: commits@javafxset.kenai.com
  • Subject: [javafxset~master:35] RadialColorPicker
  • Date: Wed, 14 Apr 2010 10:46:43 +0000

Project:    javafxset
Repository: master
Revision:   35
Author:     Nailman
Date:       2010-04-14 10:46:34 UTC
Link:       

Log Message:
------------
RadialColorPicker


Revisions:
----------
35


Modified Paths:
---------------
JavaFXSet/src/javafxset/paint/Configuration.fx
JavaFXSet
JavaFXSet/nbproject/private/private.properties


Added Paths:
------------
JavaFXSet/src/javafxset/paint/RadialColorPicker.fx
JavaFXSet/src/javafxset/paint/FXRadialColorPicker.fx


Diffs:
------
Index: JavaFXSet/nbproject/private/private.properties
===================================================================
--- JavaFXSet/nbproject/private/private.properties      (revision 34)
+++ JavaFXSet/nbproject/private/private.properties      (revision 35)
@@ -1,2 +1,2 @@
 jaxws.endorsed.dir=C:\\Program Files\\NetBeans 
6.7.1\\java2\\modules\\ext\\jaxws21\\api
-user.properties.file=C:\\Documents and 
Settings\\andromeda\\.netbeans\\6.7\\build.properties
+user.properties.file=C:\\Documents and 
Settings\\Nail\\.netbeans\\6.8\\build.properties
Index: JavaFXSet/src/javafxset/paint/Configuration.fx
===================================================================
--- JavaFXSet/src/javafxset/paint/Configuration.fx      (revision 34)
+++ JavaFXSet/src/javafxset/paint/Configuration.fx      (revision 35)
@@ -22,6 +22,10 @@
             name: "Picker"
             className: "javafxset.paint.FXColorPicker"
         },
+        Sample{
+            name: "Radial Picker"
+            className: "javafxset.paint.FXRadialColorPicker"
+        },
     ]
 }
 
Index: JavaFXSet/src/javafxset/paint/FXRadialColorPicker.fx
===================================================================
--- JavaFXSet/src/javafxset/paint/FXRadialColorPicker.fx        (revision 0)
+++ JavaFXSet/src/javafxset/paint/FXRadialColorPicker.fx        (revision 35)
@@ -0,0 +1,61 @@
+package javafxset.paint;
+
+import javafx.stage.Stage;
+import javafx.scene.Scene;
+import javafx.scene.paint.Color;
+import javafx.scene.shape.Polygon;
+import javafx.util.Math;
+import javafx.scene.shape.Line;
+import javafx.scene.shape.StrokeLineCap;
+
+var picker: RadialColorPicker;
+
+Stage {
+    title: "RadialColorPicker"
+    scene: Scene {
+        width: 600
+        height: 600
+        content: [
+            picker = RadialColorPicker {
+                layoutX: 130.0,
+                layoutY: 150.0,
+                r: 100.0
+            }
+            Polygon {
+                points : [
+                    550 + 80.0*Math.cos(Math.toRadians(90.0)), 150 + 
80.0*Math.sin(Math.toRadians(90.0)),
+                    550 + 80.0*Math.cos(Math.toRadians(210.0)), 150 + 
80.0*Math.sin(Math.toRadians(210.0)),
+                    550 + 80.0*Math.cos(Math.toRadians(330.0)), 150 + 
80.0*Math.sin(Math.toRadians(330.0)),
+                ]
+                fill: bind Color.color(picker.red, picker.green, picker.blue)
+            }
+            Line {
+                startX: 550 + 85.0*Math.cos(Math.toRadians(90.0))
+                startY: 150 + 85.0*Math.sin(Math.toRadians(90.0))
+                endX: 550 + 85.0*Math.cos(Math.toRadians(210.0))
+                endY: 150 + 85.0*Math.sin(Math.toRadians(210.0))
+                strokeWidth: 10.0
+                stroke: bind Color.color(picker.red, 0.0, 0.0)
+                strokeLineCap: StrokeLineCap.ROUND
+            }
+            Line {
+                startX: 550 + 85.0*Math.cos(Math.toRadians(210.0))
+                startY: 150 + 85.0*Math.sin(Math.toRadians(210.0))
+                endX: 550 + 85.0*Math.cos(Math.toRadians(330.0))
+                endY: 150 + 85.0*Math.sin(Math.toRadians(330.0))
+                strokeWidth: 10.0
+                stroke: bind Color.color(0.0, picker.green, 0.0)
+                strokeLineCap: StrokeLineCap.ROUND
+            }
+            Line {
+                startX: 550 + 85.0*Math.cos(Math.toRadians(330.0))
+                startY: 150 + 85.0*Math.sin(Math.toRadians(330.0))
+                endX: 550 + 85.0*Math.cos(Math.toRadians(90.0))
+                endY: 150 + 85.0*Math.sin(Math.toRadians(90.0))
+                strokeWidth: 10.0
+                stroke: bind Color.color(0.0, 0.0, picker.blue)
+                strokeLineCap: StrokeLineCap.ROUND
+            }
+        ]
+    }
+}
Index: JavaFXSet/src/javafxset/paint/RadialColorPicker.fx
===================================================================
--- JavaFXSet/src/javafxset/paint/RadialColorPicker.fx  (revision 0)
+++ JavaFXSet/src/javafxset/paint/RadialColorPicker.fx  (revision 35)
@@ -0,0 +1,463 @@
+package javafxset.paint;
+
+import javafx.scene.CustomNode;
+import javafx.scene.Group;
+import javafx.scene.Node;
+import javafx.scene.shape.Polygon;
+import javafx.util.Math;
+import javafx.scene.paint.Color;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.transform.Rotate;
+import javafx.scene.shape.Line;
+import javafx.scene.paint.Stop;
+import javafx.scene.shape.Circle;
+import javafx.scene.paint.RadialGradient;
+import javafx.scene.Cursor;
+import javafx.scene.shape.Rectangle;
+import javafx.scene.transform.Translate;
+import javafx.scene.paint.LinearGradient;
+import javafx.scene.control.TextBox;
+
+def N: Integer = 10;
+
+public class RadialColorPicker extends CustomNode {
+
+    public-init var r: Number = 128.0;
+    public-init var dr: Number = 16.0;
+    public-init var discretus: Integer = 360;
+    public-read var red: Number;
+    public-read var green: Number;
+    public-read var blue: Number;
+    var color: Color;
+    def pf: Number = 360.0 / discretus;
+    def DF: Number = pf / N;
+    var alpha: Number = 0.0;
+    var circle: Group;
+    var circleX: Number = 0.0;
+    var circleY: Number = 0.5 * r;
+    var oldX: Number;
+    var oldY: Number;
+    var R: Number = 1.0;
+    var G: Number = 0.0;
+    var B: Number = 0.0;
+    var redTon: TonIndicator;
+    var greenTon: TonIndicator;
+    var blueTon: TonIndicator;
+
+    public override function create(): Node {
+        var piece: Polygon[];
+        var i: Integer = 0;
+        var x: Number = dr + r;
+        var y: Number = dr + r;
+        x = 0.0;
+        y = 0.0;
+        while (i < discretus) {
+            var a: Number[];
+            var k: Integer = 0;
+            var fi: Number = pf * i;
+            var f: Number = 0;
+
+            var alpha: Number = -0.8;
+            while (f <= pf) {
+                f = f + DF;
+                a[k++] = x + r * Math.cos(Math.toRadians(f + fi + alpha));
+                a[k++] = y + r * Math.sin(Math.toRadians(f + fi + alpha));
+                alpha = -alpha;
+            }
+            while (f > 0) {
+                a[k++] = x + (dr + r) * Math.cos(Math.toRadians(f + fi + 
alpha));
+                a[k++] = y + (dr + r) * Math.sin(Math.toRadians(f + fi + 
alpha));
+                f = f - DF;
+                alpha = -alpha;
+            }
+            piece[i] = Polygon {
+                points: a
+                fill: getColor(fi);
+            }
+            i++;
+        }
+        redTon = TonIndicator {
+            height: r * 2.0
+            width: 16.0
+            layoutX: r + dr + 50.0
+            layoutY: -r + dr
+            ar: 1.0
+            colorPicker: this
+        };
+        greenTon = TonIndicator {
+            height: r * 2.0
+            width: 16.0
+            layoutX: r + dr + 100.0
+            layoutY: -r + dr
+            ag: 1.0
+            colorPicker: this
+        };
+        blueTon = TonIndicator {
+            height: r * 2.0
+            width: 16.0
+            layoutX: r + dr + 150.0
+            layoutY: -r + dr
+            ab: 1.0
+            colorPicker: this
+        };
+        updateCircle();
+        return Group {
+                    content: [
+                        Group {
+                            content: piece
+                            cache: true
+                            onMousePressed: function (e: MouseEvent): Void {
+                                alpha = Math.toDegrees(Math.atan2(e.y, e.x));
+                                updateCircle();
+                            }
+                            onMouseDragged: function (e: MouseEvent): Void {
+                                alpha = Math.toDegrees(Math.atan2(e.y, e.x));
+                                updateCircle()
+                            }
+                        }
+                        Group {
+                            transforms: Rotate {
+                                pivotX: 0.0, pivotY: 0.0, angle: bind alpha
+                            }
+                            content: [
+                                Line {
+                                    startX: r
+                                    startY: 0.0
+                                    endX: dr + r
+                                    endY: 0.0
+                                    strokeWidth: 2.5
+                                    stroke: Color.WHITE
+                                }
+                                Polygon {
+                                    points: [
+                                        r + dr,
+                                        0.0,
+                                        r + dr + 20.0,
+                                        9.0,
+                                        r + dr + 20.0,
+                                        -9.0
+                                    ]
+                                    fill: bind color
+                                }
+                            ]
+                        }
+                        Group {
+                            content: bind circle
+                        }
+                        redTon,
+                        greenTon,
+                        blueTon,
+                        Rectangle {
+                            x: -(r + dr), y: r + dr + 25.0
+                            width: r + dr + 100, height: 50
+                            stroke: Color.WHITE
+                            strokeWidth: 10.0
+                            fill: bind Color.color(red, green, blue)
+                        }
+                        Rectangle {
+                            x: 110, y: r + dr + 25.0
+                            width: r + dr + 100, height: 50
+                            stroke: Color.BLACK
+                            strokeWidth: 10.0
+                            fill: bind Color.color(red, green, blue)
+                        }
+                    ]
+                    onMousePressed: function (e: MouseEvent): Void {
+                        this.cursor = Cursor.CROSSHAIR
+                    }
+                    onMouseReleased: function (e: MouseEvent): Void {
+                        this.cursor = Cursor.DEFAULT
+                    }
+                }
+    }
+
+    function getColor(a: Number): Color {
+        R = getTon(a);
+        G = getTon(a + 120.0);
+        B = getTon(a - 120.0);
+        return Color.color(R, G, B);
+    }
+
+    function getTon(a: Number): Number {
+        var angel = getAngel(a);
+        var ton: Number;
+        if (angel > 30.0 and angel <= 150.0) {
+            ton = 1.0;
+        } else if (angel > 150.0 and angel <= 210.0) {
+            ton = (210 - angel) / 60.0;
+        } else if (angel > 210.0 and angel <= 330.0) {
+            ton = 0.0;
+        } else {
+            var q: Number;
+            if (angel > 30.0) {
+                q = angel - 330;
+            } else {
+                q = angel + 30.0;
+            }
+            ton = q / 60.0001;
+        }
+        return ton;
+    }
+
+    function getAngel(a: Number): Number {
+        var angel: Number = a;
+        while (angel < 0) {
+            angel = angel + 360.0;
+        }
+        while (angel > 360) {
+            angel = angel - 360.0;
+        }
+        return angel;
+    }
+
+    function updateCircle(): Void {
+        color = getColor(alpha);
+        circle = Group {
+            content: [
+                Circle {
+                    centerX: 0.0, centerY: 0.0
+                    radius: r
+                    fill: RadialGradient {
+                        proportional: false
+                        centerX: 0.0
+                        centerY: 0.0
+                        focusX: 0.0
+                        focusY: 0.0
+                        radius: r
+                        stops: [
+                            Stop {
+                                color: Color.WHITE
+                                offset: 0.0
+                            },
+                            Stop {
+                                color: color
+                                offset: 0.5
+                            },
+                            Stop {
+                                color: Color.BLACK
+                                offset: 1.0
+                            }
+                        ]
+                    }
+                    onMousePressed: function (e: MouseEvent): Void {
+                        circleX = e.x;
+                        circleY = e.y;
+                        oldX = circleX;
+                        oldY = circleY;
+                        updateColor();
+                    }
+                    onMouseReleased: function (e: MouseEvent): Void {
+                    }
+                    onMouseDragged: function (e: MouseEvent): Void {
+                        var x: Number = oldX + e.dragX;
+                        var y: Number = oldY + e.dragY;
+                        if (Math.sqrt(x * x + y * y) > r) {
+                            var alpha: Number = Math.atan2(e.y, e.x);
+                            x = r * Math.cos(alpha);
+                            y = r * Math.sin(alpha);
+                        }
+                        circleX = x;
+                        circleY = y;
+                        updateColor();
+                    }
+                }
+                Circle {
+                    centerX: bind circleX, centerY: bind circleY
+                    radius: 9.0
+                    stroke: color.BLACK
+                    strokeWidth: 2.0
+                    fill: null
+                }
+            ]
+        }
+        updateColor();
+    }
+
+    package function setTon(): Void {
+        R = redTon.r;
+        G = greenTon.g;
+        B = blueTon.b;
+        color = Color.color(R, G, B);
+        circle = Group {
+            content: [
+                Circle {
+                    centerX: 0.0, centerY: 0.0
+                    radius: r
+                    fill: RadialGradient {
+                        proportional: false
+                        centerX: 0.0
+                        centerY: 0.0
+                        focusX: 0.0
+                        focusY: 0.0
+                        radius: r
+                        stops: [
+                            Stop {
+                                color: Color.WHITE
+                                offset: 0.0
+                            },
+                            Stop {
+                                color: color
+                                offset: 0.5
+                            },
+                            Stop {
+                                color: Color.BLACK
+                                offset: 1.0
+                            }
+                        ]
+                    }
+                    onMousePressed: function (e: MouseEvent): Void {
+                        circleX = e.x;
+                        circleY = e.y;
+                        oldX = circleX;
+                        oldY = circleY;
+                        updateColor();
+                    }
+                    onMouseReleased: function (e: MouseEvent): Void {
+                    }
+                    onMouseDragged: function (e: MouseEvent): Void {
+                        var x: Number = oldX + e.dragX;
+                        var y: Number = oldY + e.dragY;
+                        if (Math.sqrt(x * x + y * y) > r) {
+                            var alpha: Number = Math.atan2(e.y, e.x);
+                            x = r * Math.cos(alpha);
+                            y = r * Math.sin(alpha);
+                        }
+                        circleX = x;
+                        circleY = y;
+                        updateColor();
+                    }
+                }
+                Circle {
+                    centerX: bind circleX, centerY: bind circleY
+                    radius: 9.0
+                    stroke: color.BLACK
+                    strokeWidth: 2.0
+                    fill: null
+                }
+            ]
+        }
+        var radius: Number = Math.sqrt(circleX * circleX + circleY * 
circleY);
+        var k: Number = radius / r;
+        if (k <= 0.5) {
+            k = 2.0 * k;
+            red = 1.0 - (1.0 - R) * k;
+            green = 1.0 - (1.0 - G) * k;
+            blue = 1.0 - (1.0 - B) * k;
+        } else {
+            k = 1.0001 - 2.0 * (k - 0.5);
+            red = k * R;
+            green = k * G;
+            blue = k * B;
+        }
+    }
+
+    function updateColor(): Void {
+        var radius: Number = Math.sqrt(circleX * circleX + circleY * 
circleY);
+        var k: Number = radius / r;
+        if (k <= 0.5) {
+            k = 2.0 * k;
+            red = 1.0 - (1.0 - R) * k;
+            green = 1.0 - (1.0 - G) * k;
+            blue = 1.0 - (1.0 - B) * k;
+        } else {
+            k = 1.0001 - 2.0 * (k - 0.5);
+            red = k * R;
+            green = k * G;
+            blue = k * B;
+        }
+        redTon.setColor(red, 0.0, 0.0);
+        greenTon.setColor(0.0, green, 0.0);
+        blueTon.setColor(0.0, 0.0, blue);
+    }
+
+}
+
+package class TonIndicator extends CustomNode {
+
+    public-init var height: Number = 100.0;
+    public-init var width: Number = 20.0;
+    public-init var ar: Number = 0.0;
+    public-init var ag: Number = 0.0;
+    public-init var ab: Number = 0.0;
+    public-init var colorPicker: RadialColorPicker;
+    public-read var r: Number = ar;
+    public-read var g: Number = ag;
+    public-read var b: Number = ab;
+    var y: Number = 0.0;
+    var color: Color;
+
+    public override function create(): Node {
+        color = Color.color(ar, ag, ab);
+        return Group {
+                    content: [
+                        TextBox {
+                            text: bind "{Math.round(255 * Math.sqrt(r * r + 
g * g + b * b))}"
+                            layoutX: -10
+                            layoutY: -30
+                            editable: false
+                            focusTraversable: false
+                            selectOnFocus: false
+                            columns: 2
+                        }
+                        Rectangle {
+                            x: 0.0, y: 0.0
+                            width: width, height: height
+                            fill: LinearGradient {
+                                startX: 0.0
+                                startY: 0.0
+                                endX: 0.0
+                                endY: 1.0
+                                stops: [
+                                    Stop {
+                                        color: color
+                                        offset: 0.0
+                                    },
+                                    Stop {
+                                        color: Color.BLACK
+                                        offset: 1.0
+                                    }
+                                ]
+                            }
+                            onMousePressed: function (e: MouseEvent): Void {
+                                y = e.y;
+                                var a: Number = 1.0 - y / height;
+                                r = a * ar;
+                                g = a * ag;
+                                b = a * ab;
+                                color = Color.color(r, g, b);
+                                colorPicker.setTon();
+                            }
+                            onMouseDragged: function (e: MouseEvent): Void {
+                                if (e.y <= height and e.y >= 0.0) {
+                                    y = e.y;
+                                    var a: Number = 1.0 - y / height;
+                                    r = a * ar;
+                                    g = a * ag;
+                                    b = a * ab;
+                                    color = Color.color(r, g, b);
+                                    colorPicker.setTon();
+                                }
+                            }
+                        }
+                        Polygon {
+                            transforms: Translate { x: 0, y: bind y }
+                            points: [
+                                width, 0.0,
+                                width + 20.0, 9.0,
+                                width + 20.0, -9.0
+                            ]
+                            fill: bind color
+                        }
+                    ]
+                };
+    }
+
+    package function setColor(r: Number, g: Number, b: Number): Void {
+        this.r = r;
+        this.g = g;
+        this.b = b;
+        y = height * (1.0 - Math.sqrt(r * r + g * g + b * b));
+        color = Color.color(r, g, b);
+    }
+
+}

Property changes on: JavaFXSet
___________________________________________________________________
Added: svn:ignore
   + build
dist







[javafxset~master:35] RadialColorPicker

Nailman 04/14/2010
  • Mysql
  • Glassfish
  • Jruby
  • Rails
  • Nblogo
Terms of Use; Privacy Policy;
© 2010, Oracle Corporation and/or its affiliates
(revision 20120518.3c65429)
 
 
Close
loading
Please Confirm
Close