source: trunk/CrypPlugins/QuadraticSieve/ProgressYields.xaml.cs @ 1648

Last change on this file since 1648 was 1648, checked in by Sven Rech, 12 years ago

better quadratic sieve p2p representation

File size: 5.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Windows;
6using System.Windows.Controls;
7using System.Windows.Data;
8using System.Windows.Documents;
9using System.Windows.Input;
10using System.Windows.Media;
11using System.Windows.Media.Imaging;
12using System.Windows.Navigation;
13using System.Windows.Shapes;
14
15namespace Cryptool.Plugins.QuadraticSieve
16{
17    /// <summary>
18    /// Interaction logic for ProgressYields.xaml
19    /// </summary>
20    public partial class ProgressYields : UserControl
21    {
22        private int ourID;
23
24        public void Set(int i, int id, string name)
25        {
26            if (root.Children.Count <= i)   //if no shape exists for this yield yet
27            {
28                //Create some shapes to fill the gap:
29                for (int c = root.Children.Count; c < i; c++)
30                    CreateYieldShape(c, 0, name);
31                //create the rect:
32                CreateYieldShape(i, id, name);
33            }
34            else
35            {
36                SetShapeToStatus(i, id, name);
37            }
38        }
39
40        public void Clear()
41        {
42            root.Children.Clear();
43        }
44
45        public void setOurID(int id)
46        {
47            ourID = id;
48        }
49
50        private void SetShapeToStatus(int index, int uploaderID, string uploaderName)
51        {
52            ToolTip tooltip = new ToolTip();
53            Shape shape = root.Children[index] as Shape;
54
55            if (uploaderID == ourID)
56            {
57                if (!(shape is Ellipse))
58                {
59                    root.Children.Remove(shape);
60                    shape = GetYieldShape(uploaderID);                   
61                    root.Children.Insert(index, shape);
62                }
63                shape.Fill = GetColor(uploaderID);
64                tooltip.Content = "This yield was sieved by us";
65            }
66            else if (uploaderID == 0)
67            {
68                shape.Fill = Brushes.Black;
69                tooltip.Content = "This yield was sieved by an unknown user and we didn't load it yet";
70            }
71            else if (uploaderID == -1)
72            {
73                if (!(shape is Path))
74                {
75                    root.Children.Remove(shape);
76                    shape = GetYieldShape(-1);
77                    root.Children.Insert(index, shape);
78                }
79                shape.Fill = Brushes.Black;
80                tooltip.Content = "This yield got lost";
81            }
82            else
83            {
84                shape.Fill = GetColor(uploaderID);
85                if (uploaderName == null)
86                    uploaderName = "other user";
87                tooltip.Content = "This yield was sieved by " + uploaderName + " but we loaded it";
88            }           
89            shape.ToolTip = tooltip;
90        }
91
92        private Brush GetColor(int uploaderID)
93        {           
94            SolidColorBrush color = new SolidColorBrush();
95            Random random = new Random(uploaderID);
96
97            bool ok;
98            do
99            {
100                ok = true;
101                color.Color = Color.FromRgb((byte)random.Next(256), (byte)random.Next(256), (byte)random.Next(256));
102
103                if (SimilarColors(color.Color, Color.FromRgb(0, 0, 0)))             //Check Black similarity
104                    ok = false;
105                else if (SimilarColors(color.Color, Color.FromRgb(255, 255, 255)))  //Check White similarity
106                    ok = false;
107
108            } while (!ok);
109
110            return color;       
111        }
112
113        private bool SimilarColors(Color col1, Color col2)
114        {
115            const int toleratedDifference = 20;
116            int diffR = Math.Abs(col1.R - col2.R);
117            int diffG = Math.Abs(col1.G - col2.G);
118            int diffB = Math.Abs(col1.B - col2.B);
119            return (diffR < toleratedDifference) && (diffG < toleratedDifference) && (diffB < toleratedDifference);
120        }
121
122        private void CreateYieldShape(int c, int id, string name)
123        {
124            Shape shape = GetYieldShape(id);           
125            root.Children.Add(shape);
126            SetShapeToStatus(root.Children.Count-1, id, name);
127        }
128
129        private Shape GetYieldShape(int id)
130        {
131            Shape shape;
132            if (id == ourID)
133                shape = new Ellipse();
134            else if (id == -1)
135                shape = new Path();
136            else
137                shape = new Rectangle();
138
139            shape.Width = 10;
140            shape.Height = shape.Width;
141            shape.Stroke = Brushes.White;
142            shape.StrokeThickness = 0.1;
143
144            if (id == -1)       //Draw the null shape
145            {
146                Path path = shape as Path;
147                RectangleGeometry rect = new RectangleGeometry();
148                rect.Rect = new Rect(0, 0, 10, 10);
149                LineGeometry line1 = new LineGeometry();
150                line1.StartPoint = new Point(0, 0);
151                line1.EndPoint = new Point(shape.Width, shape.Height);
152                LineGeometry line2 = new LineGeometry();
153                line2.StartPoint = new Point(shape.Width, 0);
154                line2.EndPoint = new Point(0, shape.Height);
155                GeometryGroup group = new GeometryGroup();
156                group.Children.Add(rect);
157                group.Children.Add(line1);
158                group.Children.Add(line2);
159                path.StrokeThickness = 1;
160                path.Data = group;
161            }
162
163            return shape;
164        }
165
166        public ProgressYields()
167        {
168            InitializeComponent();
169            root.Children.Clear();
170        }
171    }
172}
Note: See TracBrowser for help on using the repository browser.