<Compile Include="src\GraphicObjects\Popper.cs" />\r
<Compile Include="src\GraphicObjects\Scrollbar.cs" />\r
<Compile Include="src\TextChangeEventArgs.cs" />\r
- <Compile Include="src\ValueChangeEventArgs.cs" />\r
<Compile Include="src\LayoutChangeEventArgs.cs" />\r
<Compile Include="src\ReflexionExtensions.cs" />\r
<Compile Include="src\XCursor.cs" />\r
<Compile Include="src\GraphicObjects\TextRun.cs" />\r
<Compile Include="src\GraphicObjects\MessageBox.cs" />\r
<Compile Include="src\GraphicObjects\Groupbox.cs" />\r
+ <Compile Include="src\GraphicObjects\Combobox.cs" />\r
+ <Compile Include="src\SelectionChangeEventArgs.cs" />\r
+ <Compile Include="src\ValueChangeEventArgs.cs" />\r
</ItemGroup>\r
<ItemGroup>\r
<Reference Include="System" />\r
<EmbeddedResource Include="Templates\Spinner.goml" />\r
<EmbeddedResource Include="Templates\Spinner %28copier%29.goml" />\r
<EmbeddedResource Include="Templates\ItemTemplate.goml" />\r
- <EmbeddedResource Include="Templates\ComboListOverlay.goml" />\r
<EmbeddedResource Include="Templates\Expandable.goml" />\r
<EmbeddedResource Include="Images\Icons\expandable.svg" />\r
<EmbeddedResource Include="Templates\Checkbox2.goml" />\r
<EmbeddedResource Include="Templates\MessageBox.goml" />\r
<EmbeddedResource Include="Images\Icons\iconInfo.svg" />\r
<EmbeddedResource Include="Templates\Groupbox.goml" />\r
+ <EmbeddedResource Include="Templates\Combobox.goml" />\r
+ <EmbeddedResource Include="Templates\ComboboxOverlay.goml" />\r
</ItemGroup>\r
<ItemGroup>\r
<None Include="Images\Icons\Cursors\hand" />\r
+++ /dev/null
-<?xml version="1.0"?>\r
-<Border MaximumSize="0;100" Fit="True" Background="Gray">\r
- <Scroller Height="0" MaximumSize="0;100" Background="DimGray" Margin="0" VerticalScrolling="true">\r
- <VerticalStack Name="List" Margin="0" VerticalAlignment="Top"/>\r
- </Scroller>\r
-</Border>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0"?>\r
+<Border CornerRadius="0" BorderColor="LightGray" Height="{TemplatedHeight}" Width="{TemplatedWidth}">\r
+ <HorizontalStack Margin="1" Spacing="1" Height="{TemplatedHeight}" Width="{TemplatedWidth}">\r
+ <Label Margin="1" Foreground="Black" Background="White" Text="{Text}" \r
+ Height="{TemplatedHeight}" Width="{TemplatedWidth}"/>\r
+ <Button Width="14" Height="14" >\r
+ <Image Margin="0" Path="#go.Images.Icons.updown.svg" SvgSub="down"/>\r
+ </Button>\r
+ </HorizontalStack>\r
+</Border>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0"?>\r
+<Border BorderWidth="1" Margin="1" MinimumSize="20;20" Height="{TemplatedHeight}" Width="{TemplatedWidth}" >\r
+ <Scroller Name="scroller1" Margin="1" VerticalScrolling="true"\r
+ Height="{TemplatedHeight}" Width="{TemplatedWidth}">\r
+ <VerticalStack Height="-1" Width="{TemplatedWidth}" Name="List" Margin="0" VerticalAlignment="Top"/>\r
+ </Scroller>\r
+</Border>
\ No newline at end of file
// new ClsItem("string 2"),\r
// new ClsItem("string 3")\r
// });\r
- public List<string> TestList;\r
-// string[] TestList = new string[] \r
-// {\r
-// "string 1",\r
-// "string 2",\r
-// "string 3"\r
-// }; \r
+ public List<string> TestList = new List<string>( new string[] \r
+ {\r
+ "string 1",\r
+ "string 2",\r
+ "string 3"\r
+ }); \r
\r
protected override void OnLoad (EventArgs e)\r
{\r
base.OnLoad (e);\r
\r
- TestList = Directory.GetFileSystemEntries("/mnt/data/MagicCardDataBase/a/", "*.txt",SearchOption.AllDirectories).ToList();\r
+ //TestList = Directory.GetFileSystemEntries("/mnt/data/MagicCardDataBase/a/", "*.txt",SearchOption.AllDirectories).ToList();\r
LoadInterface("Interfaces/test_Listbox.goml");\r
\r
// TestList [1].Field = "test string";\r
//using GGL;\r
using go;\r
using System.Threading;\r
+using System.Collections.Generic;\r
\r
\r
namespace test\r
int frameCpt = 0;\r
int idx = 0;\r
string[] testFiles = {\r
+ "testCombobox.goml",\r
"testBorder.goml",\r
"testContainer.goml",\r
"testLabel.goml",\r
public string update = "";\r
#endregion\r
\r
+ public List<String> TestList = new List<string>( new string[] \r
+ {\r
+ "string 1",\r
+ "string 2",\r
+ "string 3"\r
+ }); \r
+\r
protected override void OnLoad (EventArgs e)\r
{\r
base.OnLoad (e);\r
--- /dev/null
+<?xml version="1.0"?>\r
+<Combobox Height="-1" Data="{TestList}"/>
\ No newline at end of file
<None Include="Interfaces\testBorder.goml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
+ <None Include="Interfaces\testCombobox.goml">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
</ItemGroup>
<ItemGroup>
<Folder Include="Interfaces\" />
--- /dev/null
+using System;\r
+\r
+\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+//using OpenTK.Graphics.OpenGL;\r
+\r
+using Cairo;\r
+\r
+using winColors = System.Drawing.Color;\r
+using System.Diagnostics;\r
+using System.Xml.Serialization;\r
+using OpenTK.Input;\r
+using System.ComponentModel;\r
+using System.Xml;\r
+using System.IO;\r
+using System.Collections;\r
+\r
+namespace go\r
+{\r
+ [DefaultTemplate("#go.Templates.Combobox.goml")]\r
+ [DefaultOverlayTemplate("#go.Templates.ComboboxOverlay.goml")]\r
+ public class Combobox : TemplatedContainer\r
+ { \r
+ #region CTOR\r
+ public Combobox() : base(){ } \r
+ #endregion\r
+\r
+ bool _isPopped;\r
+ string text;\r
+ GraphicObject _overlay;\r
+ Group _list;\r
+ IList data;\r
+ int _selectedIndex;\r
+ object _selectedItem;\r
+ string _itemTemplate;\r
+ string _overlayTemplate;\r
+\r
+ public event EventHandler<SelectionChangeEventArgs> SelectedItemChanged;\r
+\r
+ #region implemented abstract members of TemplatedControl\r
+ protected override void loadTemplate (GraphicObject template)\r
+ {\r
+ base.loadTemplate (template);\r
+ loadOverlayTemplate (null);\r
+ }\r
+ public override GraphicObject Content {\r
+ get {\r
+ throw new NotImplementedException ();\r
+ }\r
+ set {\r
+ throw new NotImplementedException ();\r
+ }\r
+ }\r
+ #endregion\r
+\r
+ protected virtual void loadOverlayTemplate(GraphicObject overlayTemplate)\r
+ {\r
+ if (overlayTemplate == null) {\r
+ DefaultOverlayTemplate dt = (DefaultOverlayTemplate)this.GetType ().GetCustomAttributes (typeof(DefaultOverlayTemplate), true).FirstOrDefault ();\r
+ Overlay = Interface.Load (dt.Path, this, !Interface.DontResoveGOML);\r
+ } else\r
+ Overlay = overlayTemplate;\r
+ _list = Overlay.FindByName ("List") as Group;\r
+ }\r
+\r
+ [XmlAttributeAttribute][DefaultValue("#go.Templates.ItemTemplate.goml")]\r
+ public string ItemTemplate {\r
+ get { return _itemTemplate; }\r
+ set { \r
+ //TODO:reload list with new template?\r
+ _itemTemplate = value; \r
+ }\r
+ }\r
+ [XmlAttributeAttribute][DefaultValue("#go.Templates.ComboboxOverlay.goml")]\r
+ public string OverlayTemplate {\r
+ get { return _overlayTemplate; }\r
+ set { \r
+ //TODO:reload list with new template?\r
+ _overlayTemplate = value; \r
+\r
+ Overlay = Interface.Load (_overlayTemplate, this, !Interface.DontResoveGOML);\r
+ _list = Overlay.FindByName ("List") as Group;\r
+ }\r
+ }\r
+ [XmlAttributeAttribute][DefaultValue(-1)]\r
+ public int SelectedIndex{\r
+ get { return _selectedIndex; }\r
+ set { _selectedIndex = value; }\r
+ }\r
+ public object SelectedItem{\r
+ set { \r
+ _selectedItem = value;\r
+\r
+// NotifyValueChanged ("SelectedItem", _selectedItem);\r
+//\r
+ if (SelectedItem == null)\r
+ Text = "";\r
+ else\r
+ Text = _selectedItem.ToString ();\r
+ }\r
+ \r
+ get { return _selectedItem; }\r
+ }\r
+ [XmlAttributeAttribute][DefaultValue(null)]\r
+ public IList Data {\r
+ get {\r
+ return data;\r
+ }\r
+ set { \r
+ data = value;\r
+ if (_list == null)\r
+ return;\r
+\r
+ foreach (GraphicObject c in _list.Children) {\r
+ c.ClearBinding ();\r
+ }\r
+ _list.Children.Clear ();\r
+ _list.registerForGraphicUpdate ();\r
+ if (data == null)\r
+ return;\r
+\r
+ #if DEBUG\r
+ Stopwatch loadingTime = new Stopwatch ();\r
+ loadingTime.Start ();\r
+ #endif\r
+\r
+ MemoryStream ms = new MemoryStream ();\r
+ using (Stream stream = Interface.GetStreamFromPath (ItemTemplate)) \r
+ stream.CopyTo (ms);\r
+\r
+ Type t = Interface.GetTopContainerOfGOMLStream (ms);\r
+\r
+ foreach (var item in data) {\r
+ ms.Seek(0,SeekOrigin.Begin);\r
+ GraphicObject g = Interface.Load (ms, t, item);\r
+ g.MouseClick += itemClick;\r
+ _list.addChild(g);\r
+ }\r
+\r
+ ms.Dispose ();\r
+\r
+ #if DEBUG\r
+ loadingTime.Stop ();\r
+ Debug.WriteLine("Listbox Loading: {0} ticks \t, {1} ms",\r
+ loadingTime.ElapsedTicks,\r
+ loadingTime.ElapsedMilliseconds);\r
+ #endif\r
+ }\r
+ }\r
+\r
+ void itemClick(object sender, OpenTK.Input.MouseButtonEventArgs e){\r
+ object datasource = (sender as GraphicObject).DataSource;\r
+ SelectedItem = datasource;\r
+ SelectedItemChanged.Raise (sender, new SelectionChangeEventArgs(datasource));\r
+ IsPopped = false;\r
+\r
+ //Debug.WriteLine ((sender as GraphicObject).DataSource);\r
+ }\r
+\r
+ public event EventHandler Pop;\r
+ public event EventHandler Unpop;\r
+\r
+ public GraphicObject Overlay {\r
+ get { return _overlay; }\r
+ set { \r
+ if (_overlay != null) {\r
+ _overlay.LayoutChanged -= _overlay_LayoutChanged;\r
+ _overlay.MouseLeave -= _content_MouseLeave;\r
+ }\r
+ \r
+ _overlay = value; \r
+\r
+ if (_overlay == null)\r
+ return;\r
+\r
+ _overlay.Focusable = true;\r
+ _overlay.LayoutChanged += _overlay_LayoutChanged;\r
+ _overlay.MouseLeave += _content_MouseLeave;\r
+ }\r
+ }\r
+\r
+ void _content_MouseLeave (object sender, MouseMoveEventArgs e)\r
+ {\r
+ IsPopped = false;\r
+ }\r
+\r
+ void _overlay_LayoutChanged (object sender, LayoutChangeEventArgs e)\r
+ {\r
+ ILayoutable tc = Overlay.Parent as ILayoutable;\r
+ if (tc == null)\r
+ return;\r
+ Rectangle r = this.ScreenCoordinates (this.Slot);\r
+ if (e.LayoutType == LayoutingType.Width) {\r
+ if (Overlay.Slot.Width < tc.ClientRectangle.Width) {\r
+ if (r.Left + Overlay.Slot.Width > tc.ClientRectangle.Right)\r
+ Overlay.Left = tc.ClientRectangle.Right - Overlay.Slot.Width;\r
+ else\r
+ Overlay.Left = r.Left;\r
+ }else\r
+ Overlay.Left = 0;\r
+ }else if (e.LayoutType == LayoutingType.Height) {\r
+ if (Overlay.Slot.Height < tc.ClientRectangle.Height) {\r
+ if (r.Bottom + Overlay.Slot.Height > tc.ClientRectangle.Bottom)\r
+ Overlay.Top = r.Top - Overlay.Slot.Height;\r
+ else\r
+ Overlay.Top = r.Bottom;\r
+ }else\r
+ Overlay.Top = 0;\r
+ }\r
+ }\r
+ public override void ClearBinding ()\r
+ {\r
+ //ensure popped window is cleared\r
+ if (Overlay != null) {\r
+ if (Overlay.Parent != null) {\r
+ IGOLibHost tc = Overlay.Parent as IGOLibHost;\r
+ if (tc != null)\r
+ tc.DeleteWidget (Overlay);\r
+ }\r
+ }\r
+ base.ClearBinding ();\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("Combobox")]\r
+ public string Text {\r
+ get { return text; } \r
+ set {\r
+ if (text == value)\r
+ return;\r
+ text = value; \r
+ NotifyValueChanged ("Text", text);\r
+ }\r
+ } \r
+\r
+ [XmlAttributeAttribute()][DefaultValue(false)]\r
+ public bool IsPopped\r
+ {\r
+ get { return _isPopped; }\r
+ set\r
+ {\r
+ _isPopped = value;\r
+\r
+ if (_isPopped) {\r
+ onPop (this, null);\r
+ NotifyValueChanged ("SvgSub", "expanded");\r
+ return;\r
+ }\r
+\r
+ onUnpop (this, null);\r
+ NotifyValueChanged ("SvgSub", "collapsed");\r
+ }\r
+ }\r
+ \r
+ public virtual void onPop(object sender, EventArgs e)\r
+ {\r
+ IGOLibHost tc = TopContainer;\r
+ if (tc == null)\r
+ return;\r
+ if (Overlay != null) {\r
+ Overlay.Visible = true;\r
+ if (Overlay.Parent == null)\r
+ tc.AddWidget (Overlay);\r
+ (tc as OpenTKGameWindow).PutOnTop (Overlay);\r
+ }\r
+ Pop.Raise (this, e);\r
+ }\r
+ public virtual void onUnpop(object sender, EventArgs e)\r
+ {\r
+ IGOLibHost tc = TopContainer;\r
+ if (tc == null)\r
+ return;\r
+ Overlay.Visible = false;\r
+ Unpop.Raise (this, e);\r
+ }\r
+ \r
+ public override void onMouseClick (object sender, MouseButtonEventArgs e)\r
+ {\r
+ IsPopped = !IsPopped;\r
+ base.onMouseClick (sender, e);\r
+ }\r
+\r
+ }\r
+}\r
get { return _font; }\r
set { _font = value; }\r
}\r
- [XmlAttributeAttribute()][DefaultValue(2.0)]\r
+ [XmlAttributeAttribute()][DefaultValue(0.0)]\r
public virtual double CornerRadius {\r
get { return _cornerRadius; }\r
set {\r
//TODO: implement ItemTemplate node in xml
using System.IO;
using System.Diagnostics;
+using System.Xml;
namespace go
{
[DefaultTemplate("#go.Templates.Listbox.goml")]
//[DefaultTemplate("#go.Templates.ItemTemplate.goml")]
- public class ListBox : TemplatedControl
+ public class ListBox : TemplatedControl, IXmlSerializable
{
+ #region CTOR
+ public ListBox () : base() {}
+ #endregion
+
Group _list;
+ IList data;
+ int _selectedIndex;
+ string _itemTemplate;
- public ListBox () : base()
- {
- }
+ public event EventHandler<SelectionChangeEventArgs> SelectedItemChanged;
#region implemented abstract members of TemplatedControl
protected override void loadTemplate (GraphicObject template = null)
}
#endregion
- IList data;
- int _selectedIndex;
- string _itemTemplate;
-
[XmlAttributeAttribute][DefaultValue("#go.Templates.ItemTemplate.goml")]
public string ItemTemplate {
get { return _itemTemplate; }
- set { _itemTemplate = value; }
+ set {
+ //TODO:reload list with new template?
+ _itemTemplate = value;
+ }
}
+ [XmlAttributeAttribute][DefaultValue(-1)]
public int SelectedIndex{
get { return _selectedIndex; }
set { _selectedIndex = value; }
}
public object SelectedItem{
- get { return data[_selectedIndex]; }
+ get { return data == null ? null : data[_selectedIndex]; }
}
[XmlAttributeAttribute][DefaultValue(null)]
public IList Data {
#endif
MemoryStream ms = new MemoryStream ();
- using (Stream stream = Interface.GetStreamFromPath (ItemTemplate)) {
-
+ using (Stream stream = Interface.GetStreamFromPath (ItemTemplate))
stream.CopyTo (ms);
- }
Type t = Interface.GetTopContainerOfGOMLStream (ms);
GraphicObject g = Interface.Load (ms, t, item);
g.MouseClick += itemClick;
_list.addChild(g);
-
}
+
ms.Dispose ();
#if DEBUG
#endif
}
}
+
void itemClick(object sender, OpenTK.Input.MouseButtonEventArgs e){
+ SelectedItemChanged.Raise (sender, new SelectionChangeEventArgs((sender as GraphicObject).DataSource));
NotifyValueChanged ("SelectedItem", (sender as GraphicObject).DataSource);
//Debug.WriteLine ((sender as GraphicObject).DataSource);
}
+
+ #region IXmlSerializable
+ public override System.Xml.Schema.XmlSchema GetSchema(){ return null; }
+ public override void ReadXml(System.Xml.XmlReader reader)
+ {
+ //Template could be either an attribute containing path or expressed inlined
+ //as a Template Element
+ using (System.Xml.XmlReader subTree = reader.ReadSubtree())
+ {
+ subTree.Read ();
+
+ string template = reader.GetAttribute ("Template");
+ string tmp = subTree.ReadOuterXml ();
+
+ //Load template from path set as attribute in templated control
+ if (string.IsNullOrEmpty (template)) {
+ //seek for template tag first
+ using (XmlReader xr = new XmlTextReader (tmp, XmlNodeType.Element, null)) {
+ //load template first if inlined
+
+ xr.Read (); //skip current node
+
+ while (!xr.EOF) {
+ xr.Read (); //read first child
+ if (!xr.IsStartElement ())
+ continue;
+ if (xr.Name == "Template") {
+ xr.Read ();
+
+ Type t = Type.GetType ("go." + xr.Name);
+ GraphicObject go = (GraphicObject)Activator.CreateInstance (t);
+ (go as IXmlSerializable).ReadXml (xr);
+
+ loadTemplate (go);
+
+ xr.Read ();//go close tag
+ xr.Read ();//Template close tag
+ break;
+ } else {
+ xr.ReadInnerXml ();
+ }
+ }
+ }
+ } else
+ loadTemplate (Interface.Load (template, this, !Interface.DontResoveGOML));
+
+
+ //normal xml read
+ using (XmlReader xr = new XmlTextReader (tmp, XmlNodeType.Element, null)) {
+ xr.Read ();
+ base.ReadXml(xr);
+ }
+ }
+ }
+ public override void WriteXml(System.Xml.XmlWriter writer)
+ {
+ //TODO:
+ throw new NotImplementedException();
+ }
+ #endregion
}
}
namespace go
{
- [AttributeUsage(AttributeTargets.Class)]
- public class DefaultTemplate : Attribute
+// [AttributeUsage(AttributeTargets.Class)]
+ public class TemplateAttribute : Attribute
{
public string Path = "";
- public DefaultTemplate(string path)
+ public TemplateAttribute(string path)
{
Path = path;
}
}
[AttributeUsage(AttributeTargets.Class)]
- public class DefaultItemTemplate : Attribute
+ public class DefaultTemplate : TemplateAttribute
{
- public string Path = "";
- public DefaultItemTemplate(string path)
- {
- Path = path;
- }
+ public DefaultTemplate(string path) : base(path){}
+ }
+ [AttributeUsage(AttributeTargets.Class)]
+ public class DefaultOverlayTemplate : TemplateAttribute
+ {
+ public DefaultOverlayTemplate(string path) : base(path){}
+ }
+ [AttributeUsage(AttributeTargets.Class)]
+ public class DefaultItemTemplate : TemplateAttribute
+ {
+ public DefaultItemTemplate(string path) : base(path){}
}
public abstract class TemplatedControl : PrivateContainer, IXmlSerializable
{
- public TemplatedControl () : base()
- {
- }
+ #region CTOR
+ public TemplatedControl () : base() {}
+ #endregion
+
+ string _template;
-// string _templatePath;
-// [XmlAttributeAttribute()]
-// public virtual string Template {
-// get { return _templatePath; }
-// set { _templatePath = value; }
-// }
+ [XmlAttributeAttribute][DefaultValue("#go.Templates.Template.goml")]
+ public string Template {
+ get { return _template; }
+ set { _template = value; }
+ }
#region GraphicObject overrides
[XmlAttributeAttribute()][DefaultValue(-1)]
}
#region IXmlSerializable
-
public override System.Xml.Schema.XmlSchema GetSchema(){ return null; }
public override void ReadXml(System.Xml.XmlReader reader)
{
}
public override void WriteXml(System.Xml.XmlWriter writer)
{
- base.WriteXml(writer);
-//
-// if (child == null)
-// return;
-//
-// writer.WriteStartElement(child.GetType().Name);
-// (child as IXmlSerializable).WriteXml(writer);
-// writer.WriteEndElement();
+ //TODO:
+ throw new NotImplementedException();
}
-
#endregion
}
}
if (dstIdx < 0) {
if (FreeRefIndices.Count == 0) {
- dstIdx = Interface.References.Count;
+ dstIdx = Interface.References.Count();
Interface.References.Add (o);
} else {
dstIdx = FreeRefIndices.Dequeue ();
--- /dev/null
+using System;
+
+namespace go
+{
+ public class SelectionChangeEventArgs: EventArgs
+ {
+ public object NewValue;
+
+
+ public SelectionChangeEventArgs (object _newValue) : base()
+ {
+ NewValue = _newValue;
+ }
+ }
+}
+