From ce9cf26313921a9780beda7b6592481be8ba87e7 Mon Sep 17 00:00:00 2001 From: jpbruyere Date: Mon, 15 Aug 2016 16:34:17 +0200 Subject: [PATCH] * Crow.sln, test.crow, CrowIDE.csproj, CrowIDE.cs, imlEditor.crow, TreeView.cs, DirectoryView.cs: basic IML loading into imlVE interface * ImlVisualEditor.cs: basic IML loading into veIface * CompilerServices.cs: CurrentInterface as public * GraphicObject.cs: RegisterForRedraw as virtual --- CrowIDE/src/CrowIDE.cs | 4 +- CrowIDE/src/ImlVisualEditor.cs | 73 ++++++++++++++++++++++++++--- CrowIDE/ui/imlEditor.crow | 54 +++++++++++---------- CrowIDE/ui/test.crow | 4 +- src/GraphicObjects/DirectoryView.cs | 2 + src/GraphicObjects/GraphicObject.cs | 2 +- src/GraphicObjects/TreeView.cs | 2 + 7 files changed, 106 insertions(+), 35 deletions(-) diff --git a/CrowIDE/src/CrowIDE.cs b/CrowIDE/src/CrowIDE.cs index f873ad4c..221de0e5 100644 --- a/CrowIDE/src/CrowIDE.cs +++ b/CrowIDE/src/CrowIDE.cs @@ -45,9 +45,9 @@ namespace CrowIDE base.OnLoad (e); //this.CrowInterface.LoadInterface ("#CrowIDE.ui.imlEditor.crow").DataSource = this; - GraphicObject go = this.CrowInterface.LoadInterface (@"ui/test.crow"); + //GraphicObject go = this.CrowInterface.LoadInterface (@"ui/test.crow"); + GraphicObject go = this.CrowInterface.LoadInterface (@"#CrowIDE.ui.imlEditor.crow"); go.DataSource = this; - Interface i = go.CurrentInterface; } } } \ No newline at end of file diff --git a/CrowIDE/src/ImlVisualEditor.cs b/CrowIDE/src/ImlVisualEditor.cs index 9229d8af..80d325a1 100644 --- a/CrowIDE/src/ImlVisualEditor.cs +++ b/CrowIDE/src/ImlVisualEditor.cs @@ -23,6 +23,7 @@ using Crow; using System.Threading; using System.Xml.Serialization; using System.ComponentModel; +using System.IO; namespace CrowIDE { @@ -37,8 +38,12 @@ namespace CrowIDE set { if (imlPath == value) return; + if (!File.Exists (value)) + return; imlPath = value; NotifyValueChanged ("ImlPath", imlPath); + imlVE.ClearInterface (); + imlVE.LoadInterface (imlPath); } } bool drawGrid; @@ -68,7 +73,44 @@ namespace CrowIDE public ImlVisualEditor () : base() { imlVE = new Interface (); + Thread t = new Thread (interfaceThread); + t.IsBackground = true; + t.Start (); + } + + void interfaceThread() + { + while (true) { + imlVE.Update (); + + bool isDirty = false; + lock (imlVE.RenderMutex) + isDirty = imlVE.IsDirty; + + if (imlVE.IsDirty) { + lock (CurrentInterface.UpdateMutex) + RegisterForRedraw (); + } + + Thread.Sleep (5); + } + } + public override void OnLayoutChanges (LayoutingType layoutType) + { + base.OnLayoutChanges (layoutType); + switch (layoutType) { + case LayoutingType.Width: + case LayoutingType.Height: + imlVE.ProcessResize (this.ClientRectangle.Size); + break; + } + } + public override void RegisterForRedraw () + { + base.RegisterForRedraw (); + lock(imlVE.UpdateMutex) + imlVE.clipping.AddRectangle (imlVE.ClientRectangle); } protected override void onDraw (Cairo.Context gr) { @@ -78,17 +120,36 @@ namespace CrowIDE Rectangle cb = ClientRectangle; - + const double gridLineWidth = 0.1; + double glhw = gridLineWidth / 2.0; int nbLines = cb.Width / gridSpacing ; - double x = gridSpacing + cb.Center.X - nbLines * gridSpacing; + double d = cb.Left + gridSpacing; for (int i = 0; i < nbLines; i++) { - gr.MoveTo (x-0.5, cb.Y); - gr.LineTo (x-0.5, cb.Y); + gr.MoveTo (d-glhw, cb.Y); + gr.LineTo (d-glhw, cb.Bottom); + d += gridSpacing; } - - gr.LineWidth = 1.0; + nbLines = cb.Height / gridSpacing; + d = cb.Top + gridSpacing; + for (int i = 0; i < nbLines; i++) { + gr.MoveTo (cb.X, d - glhw); + gr.LineTo (cb.Right, d -glhw); + d += gridSpacing; + } + gr.LineWidth = gridLineWidth; Foreground.SetAsSource (gr, cb); gr.Stroke (); + + lock (imlVE.RenderMutex) { + if (imlVE.IsDirty) { + using (Cairo.Surface surf = new Cairo.ImageSurface (imlVE.dirtyBmp, Cairo.Format.Argb32, + imlVE.DirtyRect.Width, imlVE.DirtyRect.Height, imlVE.DirtyRect.Width * 4)) { + gr.SetSourceSurface (surf, imlVE.DirtyRect.Left, imlVE.DirtyRect.Top); + gr.Paint (); + } + imlVE.IsDirty = false; + } + } } } } diff --git a/CrowIDE/ui/imlEditor.crow b/CrowIDE/ui/imlEditor.crow index d1aa315c..3a8e5204 100644 --- a/CrowIDE/ui/imlEditor.crow +++ b/CrowIDE/ui/imlEditor.crow @@ -1,27 +1,33 @@  - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + diff --git a/CrowIDE/ui/test.crow b/CrowIDE/ui/test.crow index 4036b729..87bc4513 100644 --- a/CrowIDE/ui/test.crow +++ b/CrowIDE/ui/test.crow @@ -1,4 +1,4 @@  - + diff --git a/src/GraphicObjects/DirectoryView.cs b/src/GraphicObjects/DirectoryView.cs index 586b1b26..dbb0c212 100644 --- a/src/GraphicObjects/DirectoryView.cs +++ b/src/GraphicObjects/DirectoryView.cs @@ -77,6 +77,8 @@ namespace Crow get { return new DirectoryInfo (Root).GetFileSystemInfos (); } } public void onSelectedItemChanged (object sender, SelectionChangeEventArgs e){ + if (e.NewValue == SelectedItem) + return; SelectedItem = e.NewValue; SelectedItemChanged.Raise (this, e); } diff --git a/src/GraphicObjects/GraphicObject.cs b/src/GraphicObjects/GraphicObject.cs index 6572ba52..b82a77cc 100644 --- a/src/GraphicObjects/GraphicObject.cs +++ b/src/GraphicObjects/GraphicObject.cs @@ -727,7 +727,7 @@ namespace Crow } /// query an update of the content, a redraw [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void RegisterForRedraw () + public virtual void RegisterForRedraw () { bmp = null; if (RegisteredLayoutings == LayoutingType.None) diff --git a/src/GraphicObjects/TreeView.cs b/src/GraphicObjects/TreeView.cs index ef228260..78786cd7 100644 --- a/src/GraphicObjects/TreeView.cs +++ b/src/GraphicObjects/TreeView.cs @@ -95,6 +95,8 @@ namespace Crow internal override void itemClick (object sender, MouseButtonEventArgs e) { GraphicObject tmp = sender as GraphicObject; + if (!tmp.HasFocus) + return; if (selectedItemContainer != null) { selectedItemContainer.Foreground = Color.Transparent; selectedItemContainer.Background = Color.Transparent; -- 2.47.3