<Compile Include="src\ValueChangeEventArgs.cs" />\r
<Compile Include="src\LayoutChangeEventArgs.cs" />\r
<Compile Include="src\ReflexionExtensions.cs" />\r
+ <Compile Include="src\XCursor.cs" />\r
</ItemGroup>\r
<ItemGroup>\r
<Reference Include="System" />\r
<EmbeddedResource Include="Templates\AnalogMeter0.goml" />\r
<EmbeddedResource Include="Images\meter.svg" />\r
<EmbeddedResource Include="Images\Icons\member.svg" />\r
+ <EmbeddedResource Include="Images\Icons\Cursors\cross" />\r
+ <EmbeddedResource Include="Images\Icons\Cursors\bottom_left_corner" />\r
+ <EmbeddedResource Include="Images\Icons\Cursors\bottom_right_corner" />\r
+ <EmbeddedResource Include="Images\Icons\Cursors\top_left_corner" />\r
+ <EmbeddedResource Include="Images\Icons\Cursors\top_right_corner" />\r
+ <EmbeddedResource Include="Images\Icons\Cursors\arrow" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <None Include="Images\Icons\Cursors\hand" />\r
+ <None Include="Images\Icons\Cursors\help" />\r
+ <None Include="Images\Icons\Cursors\move" />\r
</ItemGroup>\r
</Project>\r
<?xml version="1.0"?>\r
-<HorizontalStack Margin="0" Spacing="1" Focusable="false">\r
+<HorizontalStack Margin="0" Spacing="1">\r
<Image Name="Image" Width="16" Height="16" Path="#go.Images.Icons.checkbox.svg"/>\r
<Label Name="Caption"/>\r
</HorizontalStack>
\ No newline at end of file
<?xml version="1.0"?>\r
-<Border BorderWidth="1" BorderColor="LightGray" MouseClick="onMouseClick" Margin="0" Focusable="true">\r
- <VerticalStack MouseClick="onMouseClick" Height="0" Width="0" Margin="0" Focusable="true">\r
- <Border BorderWidth="1" BorderColor="LightGray" Height="-1" Width="0" MouseClick="onMouseClick" Background="BlueCrayola" Focusable="true"\r
- MouseMove="Window_MouseMove">\r
- <HorizontalStack Margin="1" Spacing="1" Height="-1" Width="0" Focusable="true" MouseMove="Window_MouseMove">\r
+<Border BorderWidth="1" BorderColor="LightGray" Margin="0">\r
+ <VerticalStack Height="0" Width="0" Margin="0">\r
+ <Border BorderWidth="1" BorderColor="LightGray" Height="-1" Width="0" Background="BlueCrayola">\r
+ <HorizontalStack Name="hs" Margin="1" Spacing="1" Height="-1" Width="0" Focusable="false" >\r
<Image Name="Image" Margin="1" Width="16" Height="16" Path="#go.Images.Icons.tetra.png"/>\r
- <Label Width="0" Focusable="true" Name="Title" MouseMove="Window_MouseMove" Margin="5" />\r
+ <Label Width="0" Name="Title" Margin="5" />\r
<Image Focusable="true" Name="Image" Margin="1" Width="16" Height="16" Path="#go.Images.Icons.exit.svg"\r
MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}" MouseClick="butQuitPress"/>\r
</HorizontalStack>\r
Image _image;\r
\r
public Checkbox() : base()\r
- {\r
+ { \r
} \r
\r
protected override void loadTemplate(GraphicObject template = null)\r
}\r
}\r
\r
+ [XmlAttributeAttribute()][DefaultValue(true)]//overiden to get default to true\r
+ public override bool Focusable\r
+ {\r
+ get { return base.Focusable; }\r
+ set { base.Focusable = value; }\r
+ }\r
public override void onMouseClick (object sender, MouseButtonEventArgs e)\r
{\r
IsChecked = !IsChecked;\r
// this.Collapse += (object sender, EventArgs e) => {};\r
\r
}\r
- \r
+ [XmlAttributeAttribute()][DefaultValue(true)]//overiden to get default to true\r
+ public override bool Focusable\r
+ {\r
+ get { return base.Focusable; }\r
+ set { base.Focusable = value; }\r
+ }\r
\r
[XmlAttributeAttribute()][DefaultValue("Expandable")]\r
public string Title {\r
#region Mouse handling\r
public virtual bool MouseIsIn(Point m)\r
{\r
- return Visible & Focusable ? ScreenCoordinates(Slot).ContainsOrIsEqual (m) : false; \r
+ return Visible ? ScreenCoordinates(Slot).ContainsOrIsEqual (m) : false; \r
+ }\r
+ internal virtual void checkHoverWidget(Point m)\r
+ {\r
+ \r
}\r
public virtual void onMouseMove(object sender, MouseMoveEventArgs e)\r
{\r
}\r
\r
#region GraphicObject overrides\r
- [XmlAttributeAttribute()][DefaultValue(true)]//overiden to get default to true\r
- public override bool Focusable\r
- {\r
- get { return base.Focusable; }\r
- set { base.Focusable = value; }\r
- }\r
[XmlIgnore]public override bool DrawingIsValid {\r
get {\r
if (!base.DrawingIsValid)\r
this.Unpop += (object sender, EventArgs e) => {_image.SvgSub = "collapsed";};\r
\r
}\r
- \r
+ [XmlAttributeAttribute()][DefaultValue(true)]//overiden to get default to true\r
+ public override bool Focusable\r
+ {\r
+ get { return base.Focusable; }\r
+ set { base.Focusable = value; }\r
+ }\r
\r
[XmlAttributeAttribute()][DefaultValue("Popper")]\r
public string Title {\r
}
#region GraphicObject Overrides
- //check if not causing problems
- [XmlAttributeAttribute()][DefaultValue(true)]
- public override bool Focusable
- {
- get { return base.Focusable; }
- set { base.Focusable = value; }
- }
-
public override GraphicObject FindByName (string nameToFind)
{
if (Name == nameToFind)
_image.SvgSub = "unchecked";\r
}\r
\r
+ [XmlAttributeAttribute()][DefaultValue(true)]//overiden to get default to true\r
+ public override bool Focusable\r
+ {\r
+ get { return base.Focusable; }\r
+ set { base.Focusable = value; }\r
+ }\r
\r
[XmlAttributeAttribute][DefaultValue("RadioButton")]\r
public string Caption {\r
if (child == null)//trigger loading of default template if child is empty
loadTemplate ();
base.loadDefaultValues ();
- this.Focusable = true;
}
public override GraphicObject FindByName (string nameToFind)
void Window_MouseMove (object sender, OpenTK.Input.MouseMoveEventArgs e)
{
-
-// if ((e.Position - this.Slot.TopLeft).Length < 3)
-// System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.SizeNWSE;
-// else
-// System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
-
- if (!e.Mouse.IsButtonDown (MouseButton.Left))
- return;
-
- //
- System.Windows.Forms.Cursor.Show();// = System.Windows.Forms.Cursors.SizeAll;
+ }
+ public override void onMouseMove (object sender, MouseMoveEventArgs e)
+ {
+ base.onMouseMove (sender, e);
+
+
+ OpenTKGameWindow otkgw = TopContainer as OpenTKGameWindow;
+
+ if ((e.Position - this.Slot.TopLeft).Length < 5)
+ otkgw.Cursor = XCursor.NW;
+ else
+ otkgw.Cursor = XCursor.Cross;
+
+
+ if (TopContainer.activeWidget != this)
+ return;
+
this.TopContainer.redrawClip.AddRectangle (this.ScreenCoordinates(this.Slot));
this.Left += e.XDelta;
this.Top += e.YDelta;
this.registerForGraphicUpdate ();
+
+
+ }
+ public override void onMouseLeave (object sender, MouseMoveEventArgs e)
+ {
+ base.onMouseLeave (sender, e);
+ OpenTKGameWindow otkgw = TopContainer as OpenTKGameWindow;
+ otkgw.Cursor = XCursor.Default;
}
protected override void loadTemplate(GraphicObject template = null)
// : base(_width, _height, new OpenTK.Graphics.GraphicsMode(32, 24, 0, 8), _title)\r
{\r
//VSync = VSyncMode.On;\r
+\r
+ //Load cursors\r
+ XCursor.Cross = XCursorFile.Load("#go.Images.Icons.Cursors.cross").Cursors[0];\r
+ XCursor.Default = XCursorFile.Load("#go.Images.Icons.Cursors.arrow").Cursors[0];\r
+ XCursor.NW = XCursorFile.Load("#go.Images.Icons.Cursors.top_left_corner").Cursors[0];\r
+ XCursor.NE = XCursorFile.Load("#go.Images.Icons.Cursors.top_right_corner").Cursors[0];\r
+ XCursor.SW = XCursorFile.Load("#go.Images.Icons.Cursors.bottom_left_corner").Cursors[0];\r
+ XCursor.SE = XCursorFile.Load("#go.Images.Icons.Cursors.bottom_right_corner").Cursors[0];\r
+\r
+\r
} \r
#endregion\r
\r
// Debug.WriteLine("UPDATE: {0} ticks \t, {1} ms",\r
// updateTime.ElapsedTicks,\r
// updateTime.ElapsedMilliseconds);\r
-\r
+ //update Mouse cursor\r
+ if (_hoverWidget is Window) {\r
+ \r
+ }\r
} \r
#endregion\r
\r
}\r
\r
GraphicObject g = _hoverWidget;\r
- while (!g.Focusable) {\r
+ while (!g.Focusable) { \r
g = g.Parent as GraphicObject;\r
if (g == null) { \r
return;\r
_activeWidget = g;\r
_activeWidget.onMouseButtonDown (this, e);\r
}\r
+\r
void Mouse_WheelChanged(object sender, MouseWheelEventArgs e)\r
{\r
if (_hoverWidget == null) {\r
--- /dev/null
+//
+// XCursor.cs
+//
+// Author:
+// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2015 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.IO;
+using System.Diagnostics;
+using OpenTK;
+using System.Collections.Generic;
+
+namespace go
+{
+ public class XCursorFile
+ {
+ const uint XC_TYPE_IMG = 0xfffd0002;
+
+ class toc
+ {
+ public uint type;
+ public uint subtype;
+ public uint pos;
+
+ public toc(BinaryReader sr)
+ {
+ type = sr.ReadUInt32();
+ subtype = sr.ReadUInt32();
+ pos = sr.ReadUInt32();
+ }
+ }
+
+ public List<XCursor> Cursors = new List<XCursor>();
+
+ static XCursorFile loadFromRessource (string resId)
+ {
+ Stream stream = null;
+
+ //first, search for ressource in main executable assembly
+ stream = System.Reflection.Assembly.GetEntryAssembly().GetManifestResourceStream(resId);
+ if (stream == null)//try to find ressource in golib assembly
+ stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resId);
+ if (stream == null) {
+ Debug.WriteLine ("Ressource not found: " + resId);
+ return null;
+ }
+
+ using (MemoryStream ms = new MemoryStream ()) {
+ stream.CopyTo (ms);
+ ms.Seek (0, SeekOrigin.Begin);
+ return loadFromStream (ms);
+ }
+ }
+ static XCursorFile loadFromFile (string path)
+ {
+ using (Stream s = new FileStream (path,
+ FileMode.Open, FileAccess.Read)) {
+ return loadFromStream (s);
+ }
+ }
+ static XCursorFile loadFromStream(Stream s)
+ {
+ List<toc> tocList = new List<toc> ();
+ XCursorFile tmp = new XCursorFile ();
+
+ using (BinaryReader sr = new BinaryReader (s)) {
+ byte[] data;
+ //magic: CARD32 ’Xcur’ (0x58, 0x63, 0x75, 0x72)
+ if (new string (sr.ReadChars (4)) != "Xcur") {
+ Debug.WriteLine ("XCursor Load error: Wrong magic");
+ return null;
+ }
+ //header: CARD32 bytes in this header
+ uint headerLength = sr.ReadUInt32 ();
+ //version: CARD32 file version number
+ uint version = sr.ReadUInt32 ();
+ //ntoc: CARD32 number of toc entries
+ uint nbToc = sr.ReadUInt32 ();
+ //toc: LISTofTOC table of contents
+ for (uint i = 0; i < nbToc; i++) {
+ tocList.Add (new toc (sr));
+ }
+
+ foreach (toc t in tocList) {
+ if (t.type != XC_TYPE_IMG)
+ continue;
+
+ sr.BaseStream.Seek (t.pos, SeekOrigin.Begin);
+ tmp.Cursors.Add(imageLoad (sr));
+ }
+ }
+ return tmp;
+ }
+
+ public static XCursorFile Load(string path)
+ {
+ if (path.StartsWith ("#"))
+ return loadFromRessource (path.Substring(1));
+ else
+ return loadFromFile (path);
+ }
+
+ static XCursor imageLoad(BinaryReader sr)
+ {
+ XCursor tmp = new XCursor();
+ // header: 36 Image headers are 36 bytes
+ uint header = sr.ReadUInt32();
+ // type: 0xfffd0002 Image type is 0xfffd0002
+ uint type = sr.ReadUInt32();
+ // subtype: CARD32 Image subtype is the nominal size
+ uint subtype = sr.ReadUInt32();
+ // version: 1
+ uint version = sr.ReadUInt32();
+ // width: CARD32 Must be less than or equal to 0x7fff
+ tmp.Width = sr.ReadUInt32();
+ // height: CARD32 Must be less than or equal to 0x7fff
+ tmp.Height = sr.ReadUInt32();
+ // xhot: CARD32 Must be less than or equal to width
+ tmp.Xhot = sr.ReadUInt32();
+ // yhot: CARD32 Must be less than or equal to height
+ tmp.Yhot = sr.ReadUInt32();
+ // delay: CARD32 Delay between animation frames in milliseconds
+ tmp.Delay = sr.ReadUInt32();
+ // pixels: LISTofCARD32 Packed ARGB format pixels
+ tmp.data = sr.ReadBytes((int)(tmp.Width * tmp.Height * 4));
+ return tmp;
+ }
+ }
+ public class XCursor
+ {
+ public static XCursor Default;
+ public static XCursor Cross;
+ public static XCursor Arrow;
+ public static XCursor SW;
+ public static XCursor SE;
+ public static XCursor NW;
+ public static XCursor NE;
+ public static XCursor N;
+ public static XCursor S;
+
+
+
+ public uint Width;
+ public uint Height;
+ public uint Xhot;
+ public uint Yhot;
+ public uint Delay;
+ public byte[] data;
+
+ public XCursor ()
+ {
+ }
+ public static implicit operator MouseCursor(XCursor xc)
+ {
+ return new MouseCursor((int)xc.Xhot, (int)xc.Yhot, (int)xc.Width, (int)xc.Height,xc.data);
+ }
+ }
+}
+