21 private Builder _builder;
23#pragma warning disable 649
25 private TreeView roiView;
27 private SpinButton xBox;
29 private SpinButton yBox;
31 private SpinButton wBox;
33 private SpinButton hBox;
35 private SpinButton zBox;
37 private SpinButton cBox;
39 private SpinButton tBox;
41 private SpinButton widthBox;
43 private SpinButton rBox;
45 private SpinButton gBox;
47 private SpinButton bBox;
49 private Label typeLabel;
51 private Entry textBox;
55 private SpinButton pointBox;
57 private SpinButton pointXBox;
59 private SpinButton pointYBox;
61 private SpinButton selBox;
63 private FontButton fontBut;
65 private CheckButton boundsBox;
67 private CheckButton showTextBox;
69 private CheckButton showRBox;
71 private CheckButton showGBox;
73 private CheckButton showBBox;
75 private Label imageNameLabel;
77 private CheckButton showMasksBox;
81 private MenuItem menuDelete;
83 private MenuItem menuCopy;
85 private MenuItem menuPaste;
86#pragma warning restore 649
89 private static Random rng =
new Random(DateTime.Now.Millisecond);
90 #region Constructors / Destructors
91 public BioImage image;
92 private static Dictionary<string, ROI> rts =
new Dictionary<string, ROI>();
93 public static Dictionary<string, ROI> rois
97 ROI[] selectedAnnotations =
ImageView.SelectedImage?.Annotations?.ToArray() ?? Array.Empty<ROI>();
98 foreach (var item
in selectedAnnotations)
102 if(!rts.ContainsKey(item.id))
104 if (item.id ==
"" || item.id ==
null)
105 item.id = rng.Next(0,999999999).ToString();
106 rts.Add(item.id, item);
109 if (App.viewer !=
null &&
ImageView.SelectedImage !=
null)
111 ROI[] overlays = App.viewer.GetZarrLabelOverlaysForImage(
ImageView.SelectedImage).ToArray();
112 foreach (var item
in overlays)
116 if (!rts.ContainsKey(item.id))
118 if (item.id ==
"" || item.id ==
null)
119 item.id = rng.Next(0, 999999999).ToString();
120 rts.Add(item.id, item);
133 Builder builder =
new Builder(
new FileStream(System.IO.Path.GetDirectoryName(Environment.ProcessPath) +
"/" +
"Glade/ROIManager.glade", FileMode.Open));
134 return new ROIManager(builder, builder.GetObject(
"roiManager").Handle);
137 protected ROIManager(Builder builder, IntPtr handle) : base(handle)
140 builder.Autoconnect(
this);
141 xBox.ValueChanged += xBox_ValueChanged;
142 yBox.ValueChanged += yBox_ValueChanged;
143 wBox.ValueChanged += wBox_ValueChanged;
144 hBox.ValueChanged += hBox_ValueChanged;
145 rBox.ValueChanged += rBox_ValueChanged;
146 gBox.ValueChanged += gBox_ValueChanged;
147 bBox.ValueChanged += bBox_ValueChanged;
148 zBox.ValueChanged += zBox_ValueChanged;
149 cBox.ValueChanged += cBox_ValueChanged;
150 tBox.ValueChanged += tBox_ValueChanged;
151 widthBox.ValueChanged += strokeWBox_ValueChanged;
152 pointXBox.ValueChanged += pointXBox_ValueChanged;
153 pointYBox.ValueChanged += pointYBox_ValueChanged;
154 pointBox.ValueChanged += pointBox_ValueChanged;
155 selBox.ValueChanged += selectBoxSize_ValueChanged;
156 widthBox.ValueChanged += strokeWBox_ValueChanged;
157 textBox.Changed += textBox_TextChanged;
158 idBox.Changed += idBox_TextChanged;
159 boundsBox.Clicked += showBoundsBox_ActiveChanged;
160 showTextBox.Clicked += showTextBox_ActiveChanged;
161 showRBox.Clicked += showRBox_ActiveChanged;
162 showGBox.Clicked += showGBox_ActiveChanged;
163 showBBox.Clicked += showBBox_ActiveChanged;
164 showMasksBox.Clicked += ShowMasksBox_Clicked;
165 this.DeleteEvent += ROIManager_DeleteEvent;
166 menuDelete.ButtonPressEvent += MenuDelete_ButtonPressEvent;
167 menuCopy.ButtonPressEvent += MenuCopy_ButtonPressEvent;
168 menuPaste.ButtonPressEvent += MenuPaste_ButtonPressEvent;
171 roiView.RowActivated += RoiView_RowActivated;
172 this.FocusInEvent += ROIManager_FocusInEvent;
173 this.FocusActivated += ROIManager_Activated;
174 roiView.ButtonPressEvent += RoiView_ButtonPressEvent;
176 xBox.Adjustment.Upper = PointD.MaxX;
177 xBox.Adjustment.StepIncrement= 0.1;
178 xBox.Adjustment.PageIncrement= 1;
179 yBox.Adjustment.Upper = PointD.MaxY;
180 yBox.Adjustment.StepIncrement = 0.1;
181 yBox.Adjustment.PageIncrement = 1;
182 wBox.Adjustment.Upper = PointD.MaxX;
183 wBox.Adjustment.StepIncrement = 0.1;
184 wBox.Adjustment.PageIncrement = 1;
185 hBox.Adjustment.Upper = PointD.MaxY;
186 xBox.Adjustment.StepIncrement = 0.1;
187 xBox.Adjustment.PageIncrement = 1;
188 rBox.Adjustment.Upper =
byte.MaxValue;
189 rBox.Adjustment.StepIncrement = 1;
190 rBox.Adjustment.PageIncrement = 1;
191 gBox.Adjustment.Upper =
byte.MaxValue;
192 gBox.Adjustment.StepIncrement = 1;
193 gBox.Adjustment.PageIncrement = 1;
194 bBox.Adjustment.Upper =
byte.MaxValue;
195 bBox.Adjustment.StepIncrement = 1;
196 bBox.Adjustment.PageIncrement = 1;
197 zBox.Adjustment.Upper = 10000;
198 zBox.Adjustment.StepIncrement = 1;
199 zBox.Adjustment.PageIncrement = 1;
200 cBox.Adjustment.Upper = 10000;
201 cBox.Adjustment.StepIncrement = 1;
202 cBox.Adjustment.PageIncrement = 1;
203 tBox.Adjustment.Upper = 10000;
204 tBox.Adjustment.StepIncrement = 1;
205 tBox.Adjustment.PageIncrement = 1;
206 widthBox.Adjustment.Upper = 100;
207 widthBox.Adjustment.StepIncrement = 1;
208 widthBox.Adjustment.PageIncrement = 1;
209 pointBox.Adjustment.Upper = 100000;
210 pointBox.Adjustment.StepIncrement = 1;
211 pointBox.Adjustment.PageIncrement = 1;
212 pointXBox.Adjustment.Upper = PointD.MaxX;
213 pointXBox.Adjustment.StepIncrement = 0.1;
214 pointXBox.Adjustment.PageIncrement = 1;
215 pointYBox.Adjustment.Upper = PointD.MaxY;
216 pointYBox.Adjustment.StepIncrement = 0.1;
217 pointYBox.Adjustment.PageIncrement = 1;
218 selBox.Value = ROI.selectBoxSize;
219 selBox.Adjustment.Upper = 100;
220 selBox.Adjustment.StepIncrement = 1;
221 roiView.ActivateOnSingleClick =
true;
225 App.ApplyStyles(
this);
228 private void RoiView_ButtonPressEvent(
object o, ButtonPressEventArgs args)
230 if (args.Event.Button == 3)
234 private List<ROI> copys =
new List<ROI>();
240 List<ROI> rois =
new List<ROI>();
241 rois.AddRange(
ImageView.SelectedImage.AnnotationsR);
242 rois.AddRange(
ImageView.SelectedImage.AnnotationsG);
243 rois.AddRange(
ImageView.SelectedImage.AnnotationsB);
244 foreach (ROI item
in rois)
249 s += BioImage.ROIToString(item);
252 Clipboard clipboard = Clipboard.Get(Gdk.Selection.Clipboard);
259 Clipboard clipboard = Clipboard.Get(Gdk.Selection.Clipboard);
260 string text = clipboard.WaitForText();
261 string[] sts = text.Split(BioImage.NewLine);
262 foreach (
string line
in sts)
266 ROI an = BioImage.StringToROI(line);
268 an.coord = App.viewer.GetCoordinate();
269 ImageView.SelectedImage.Annotations.Add(an);
276 private void MenuPaste_ButtonPressEvent(
object o, ButtonPressEventArgs args)
281 private void MenuCopy_ButtonPressEvent(
object o, ButtonPressEventArgs args)
286 private void MenuDelete_ButtonPressEvent(
object o, ButtonPressEventArgs args)
288 if (anno !=
null &&
ImageView.SelectedImage !=
null)
291 ImageView.SelectedImage.Annotations.Remove(anno);
296 private void ShowMasksBox_Clicked(
object sender, EventArgs e)
298 App.viewer.ShowMasks = showMasksBox.Active;
302 private void ROIManager_DeleteEvent(
object o, DeleteEventArgs args)
313 private void ROIManager_FocusInEvent(
object o, FocusInEventArgs args)
321 public ROI anno =
new ROI();
331 private void RoiView_RowActivated(
object o, RowActivatedArgs args)
334 if (roiView.Model.GetIter(out iter, args.Path))
336 string type = (string)roiView.Model.GetValue(iter, 0);
338 if (Enum.TryParse<ROI.Type>(type,out t))
340 string id = (string)roiView.Model.GetValue(iter, 1);
341 string text = (string)roiView.Model.GetValue(iter, 2);
342 string bounds = (string)roiView.Model.GetValue(iter, 3);
343 if (rois.ContainsKey(
id))
346 if (App.viewer !=
null)
347 App.viewer.SetCoordinate(anno.coord.Z, anno.coord.C, anno.coord.T);
352 zBox.Value = anno.coord.Z;
353 cBox.Value = anno.coord.C;
354 tBox.Value = anno.coord.T;
355 rBox.Value = anno.strokeColor.R;
356 gBox.Value = anno.strokeColor.G;
357 bBox.Value = anno.strokeColor.B;
358 widthBox.Value = anno.strokeWidth;
359 idBox.Text = anno.id;
360 textBox.Text = anno.Text;
361 typeLabel.Text = anno.type.ToString();
362 imageNameLabel.Text =
ImageView.SelectedImage.Filename;
366 App.viewer.PyramidalOrigin =
new PointD((
int)(anno.X), (
int)(anno.Y));
367 App.viewer.UpdateView(
true);
381 Gtk.TreeViewColumn typeCol =
new Gtk.TreeViewColumn();
382 typeCol.Title =
"Type";
383 Gtk.CellRendererText typeCell =
new Gtk.CellRendererText();
384 typeCol.PackStart(typeCell,
true);
386 Gtk.TreeViewColumn idCol =
new Gtk.TreeViewColumn();
388 Gtk.CellRendererText idCell =
new Gtk.CellRendererText();
389 idCol.PackStart(idCell,
true);
391 Gtk.TreeViewColumn textCol =
new Gtk.TreeViewColumn();
392 textCol.Title =
"Text";
393 Gtk.CellRendererText textCell =
new Gtk.CellRendererText();
394 textCol.PackStart(textCell,
true);
396 Gtk.TreeViewColumn rectCol =
new Gtk.TreeViewColumn();
397 rectCol.Title =
"Bounds";
398 Gtk.CellRendererText rectCell =
new Gtk.CellRendererText();
399 rectCol.PackStart(rectCell,
true);
402 roiView.AppendColumn(typeCol);
403 roiView.AppendColumn(idCol);
404 roiView.AppendColumn(textCol);
405 roiView.AppendColumn(rectCol);
407 typeCol.AddAttribute(typeCell,
"text", 0);
408 idCol.AddAttribute(idCell,
"text", 1);
409 textCol.AddAttribute(textCell,
"text", 2);
410 rectCol.AddAttribute(rectCell,
"text", 3);
412 Gtk.TreeStore store =
new Gtk.TreeStore(typeof(
string), typeof(
string), typeof(
string), typeof(
string));
414 foreach (BioImage b
in Images.images)
416 Gtk.TreeIter iter = store.AppendValues(System.IO.Path.GetFileName(b.Filename));
417 foreach (ROI r
in b.Annotations)
419 store.AppendValues(iter, r.type.ToString(), r.id, r.Text, r.BoundingBox.ToString());
421 if (App.viewer !=
null)
423 foreach (ROI r
in App.viewer.GetZarrLabelOverlaysForImage(b))
425 if (r ==
null || b.Annotations.Contains(r))
427 store.AppendValues(iter, r.type.ToString(), r.id, r.Text, r.BoundingBox.ToString());
431 roiView.Model = store;
440 Gtk.TreeStore store =
new Gtk.TreeStore(typeof(
string), typeof(
string), typeof(
string), typeof(
string));
441 List<BioImage> sourceImages =
new List<BioImage>(Images.images);
442 if (
ImageView.SelectedImage !=
null && !sourceImages.Contains(
ImageView.SelectedImage))
443 sourceImages.Insert(0,
ImageView.SelectedImage);
445 foreach (BioImage b
in sourceImages)
447 Gtk.TreeIter iter = store.AppendValues(System.IO.Path.GetFileName(b.Filename));
448 ROI[] annotations = b.Annotations?.ToArray() ?? Array.Empty<ROI>();
449 HashSet<ROI> annotationSet =
new HashSet<ROI>(annotations.Where(r => r !=
null));
450 foreach (ROI r
in annotations)
456 store.AppendValues(iter, r.type.ToString(), rng.Next(), r.Text, r.BoundingBox.ToString());
460 if(!rois.ContainsKey(r.id))
462 store.AppendValues(iter, r.type.ToString(), r.id, r.Text, r.BoundingBox.ToString());
465 if (App.viewer !=
null)
467 ROI[] overlays = App.viewer.GetZarrLabelOverlaysForImage(b).ToArray();
468 foreach (ROI r
in overlays)
470 if (r ==
null || annotationSet.Contains(r))
474 store.AppendValues(iter, r.type.ToString(), rng.Next(), r.Text, r.BoundingBox.ToString());
478 if (!rois.ContainsKey(r.id))
480 store.AppendValues(iter, r.type.ToString(), r.id, r.Text, r.BoundingBox.ToString());
485 roiView.Model = store;
489 private void UpdateView()
491 App.viewer.UpdateView();
503 ImageView.SelectedImage.Annotations[index] = an;
512 private void xBox_ValueChanged(
object sender, EventArgs e)
516 anno.BoundingBox =
new RectangleD(xBox.Value, anno.Y, anno.W, anno.H);
526 private void yBox_ValueChanged(
object sender, EventArgs e)
530 anno.BoundingBox =
new RectangleD(anno.X, yBox.Value, anno.W, anno.H);
539 private void wBox_ValueChanged(
object sender, EventArgs e)
543 if(anno.type == ROI.Type.Rectangle || anno.type == ROI.Type.Ellipse)
544 anno.BoundingBox =
new RectangleD(anno.X, anno.Y, wBox.Value, anno.H);
553 private void hBox_ValueChanged(
object sender, EventArgs e)
557 if (anno.type == ROI.Type.Rectangle || anno.type == ROI.Type.Ellipse)
558 anno.BoundingBox =
new RectangleD(anno.X, anno.Y, anno.W, hBox.Value);
567 private void sBox_ValueChanged(
object sender, EventArgs e)
581 private void zBox_ValueChanged(
object sender, EventArgs e)
585 anno.coord.Z = (int)zBox.Value;
595 private void cBox_ValueChanged(
object sender, EventArgs e)
599 anno.coord.C = (int)cBox.Value;
609 private void tBox_ValueChanged(
object sender, EventArgs e)
613 anno.coord.T = (int)cBox.Value;
623 private void rBox_ValueChanged(
object sender, EventArgs e)
627 anno.strokeColor = Color.FromArgb((
byte)rBox.Value, anno.strokeColor.G, anno.strokeColor.B);
637 private void gBox_ValueChanged(
object sender, EventArgs e)
641 anno.strokeColor = Color.FromArgb(anno.strokeColor.R, (
byte)gBox.Value, anno.strokeColor.B);
651 private void bBox_ValueChanged(
object sender, EventArgs e)
655 anno.strokeColor = Color.FromArgb(anno.strokeColor.R, anno.strokeColor.G, (
byte)bBox.Value);
665 private void textBox_TextChanged(
object sender, EventArgs e)
669 anno.Text = textBox.Text;
679 private void idBox_TextChanged(
object sender, EventArgs e)
683 anno.id = idBox.Text;
693 private void ROIManager_Activated(
object sender, EventArgs e)
697 string n = System.IO.Path.GetFileName(
ImageView.SelectedImage.ID);
698 if (imageNameLabel.Text != n)
699 imageNameLabel.Text = n;
707 private void addButton_Click(
object sender, EventArgs e)
709 ImageView.SelectedImage.Annotations.Add(anno);
712 public static bool showBounds =
true;
713 public static bool showText =
false;
714 public static bool showR =
true;
715 public static bool showG =
true;
716 public static bool showB =
true;
721 private void showBoundsBox_ActiveChanged(
object sender, EventArgs e)
723 showBounds = boundsBox.Active;
730 private void showTextBox_ActiveChanged(
object sender, EventArgs e)
732 showText = showTextBox.Active;
743 private void pointXBox_ValueChanged(
object sender, EventArgs e)
747 if (anno.type == ROI.Type.Rectangle || anno.type == ROI.Type.Ellipse)
749 anno.UpdatePoint(
new PointD((
double)pointXBox.Value, (
double)pointYBox.Value),(
int)pointBox.Value);
759 private void pointYBox_ValueChanged(
object sender, EventArgs e)
763 if (anno.type == ROI.Type.Rectangle || anno.type == ROI.Type.Ellipse)
765 anno.UpdatePoint(
new PointD((
double)pointXBox.Value, (
double)pointYBox.Value), (
int)pointBox.Value);
768 public bool autoUpdate =
true;
776 PointD d = anno.GetPoint((
int)pointBox.Value);
777 pointXBox.Value = (int)d.X;
778 pointYBox.Value = (int)d.Y;
784 private void pointBox_ValueChanged(
object sender, EventArgs e)
795 private void strokeWBox_ValueChanged(
object sender, EventArgs e)
799 anno.strokeWidth = (int)widthBox.Value;
807 private void selectBoxSize_ValueChanged(
object sender, EventArgs e)
809 ROI.selectBoxSize = (int)widthBox.Value;
818 private void showRBox_ActiveChanged(
object sender, EventArgs e)
820 if (App.viewer ==
null)
822 App.viewer.showRROIs = showRBox.Active;
831 private void showGBox_ActiveChanged(
object sender, EventArgs e)
833 if (App.viewer ==
null)
835 App.viewer.showGROIs = showGBox.Active;
845 private void showBBox_ActiveChanged(
object sender, EventArgs e)
847 if (App.viewer ==
null)
849 App.viewer.showBROIs = showBBox.Active;
857 private void saveToolStripMenuItem_Click(
object sender, EventArgs e)