/GOLib.userprefs
/Tests/obj/*
/Tests/bin/*
+MonoDevelop.GOLib/bin/
+MonoDevelop.GOLib/build/
+MonoDevelop.GOLib/obj/
+Tests/Tests.sln
+Tests/Tests.userprefs
+src/GraphicObjects/Panel.cs
+src/GraphicObjects/VerticalWrappingWidget.cs
+src/GraphicObjects/HorizontalWrappingWidget.cs
<LogicalName>\r
</LogicalName>\r
</Compile>\r
+ <Compile Include="src\GraphicObjects\ListBox.cs">\r
+ <LogicalName>\r
+ </LogicalName>\r
+ </Compile>\r
+ <Compile Include="src\ExtensionsMethods.cs">\r
+ <LogicalName>\r
+ </LogicalName>\r
+ </Compile>\r
</ItemGroup>\r
<ItemGroup>\r
<Reference Include="System" />\r
</Reference>\r
<Reference Include="Microsoft.CSharp" />\r
<Reference Include="Mono.Cairo" />\r
- <Reference Include="OpenTK">\r
- <HintPath>..\..\src\opentk-git\Binaries\OpenTK\Release\OpenTK.dll</HintPath>\r
- </Reference>\r
</ItemGroup>\r
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
<LogicalName>go.image.icons.question_mark</LogicalName>\r
</EmbeddedResource>\r
</ItemGroup>\r
+ <ItemGroup>\r
+ <ProjectReference Include="..\..\..\data\Developpements\Magic3D\OpenTK\Source\OpenTK\OpenTK.csproj">\r
+ <Project>{A37A7E14-0000-0000-0000-000000000000}</Project>\r
+ <Name>OpenTK</Name>\r
+ </ProjectReference>\r
+ </ItemGroup>\r
</Project>\r
--- /dev/null
+//
+// ExtensionsMethods.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;
+
+namespace go
+{
+ public static class ExtensionsMethods
+ {
+ public static void Raise(this EventHandler handler, object sender, EventArgs e)
+ {
+ if(handler != null)
+ {
+ handler(sender, e);
+ }
+ }
+ public static void Raise<T>(this EventHandler<T> handler, object sender, T e)
+ {
+ if(handler != null)
+ {
+ handler(sender, e);
+ }
+ }
+ }
+}
+
#endregion\r
\r
#region EVENT HANDLERS\r
- public event EventHandler<MouseWheelEventArgs> MouseWheelChanged = delegate { };\r
- public event EventHandler<MouseButtonEventArgs> MouseButtonUp = delegate { };\r
- public event EventHandler<MouseButtonEventArgs> MouseButtonDown = delegate { };\r
- public event EventHandler<MouseButtonEventArgs> MouseClick = delegate { };\r
- public event EventHandler<MouseMoveEventArgs> MouseMove = delegate { };\r
- public event EventHandler<MouseMoveEventArgs> MouseEnter = delegate { };\r
- public event EventHandler<MouseMoveEventArgs> MouseLeave = delegate { };\r
- public event EventHandler<KeyboardKeyEventArgs> KeyDown = delegate { };\r
- public event EventHandler<KeyboardKeyEventArgs> KeyUp = delegate { };\r
- public event EventHandler Focused = delegate { };\r
- public event EventHandler Unfocused = delegate { };\r
+ public event EventHandler<MouseWheelEventArgs> MouseWheelChanged;\r
+ public event EventHandler<MouseButtonEventArgs> MouseButtonUp;\r
+ public event EventHandler<MouseButtonEventArgs> MouseButtonDown;\r
+ public event EventHandler<MouseButtonEventArgs> MouseClick;\r
+ public event EventHandler<MouseMoveEventArgs> MouseMove;\r
+ public event EventHandler<MouseMoveEventArgs> MouseEnter;\r
+ public event EventHandler<MouseMoveEventArgs> MouseLeave;\r
+ public event EventHandler<KeyboardKeyEventArgs> KeyDown;\r
+ public event EventHandler<KeyboardKeyEventArgs> KeyUp;\r
+ public event EventHandler Focused;\r
+ public event EventHandler Unfocused;\r
#endregion\r
\r
#region public properties\r
onMouseEnter (sender, e);\r
}\r
\r
- MouseMove (this, e);\r
+ MouseMove.Raise (this, e);\r
}\r
public virtual void onMouseButtonUp(object sender, MouseButtonEventArgs e){\r
if (MouseIsIn (e.Position))\r
onMouseClick (sender, e);\r
\r
- MouseButtonUp (this, e);\r
+ MouseButtonUp.Raise (this, e);\r
}\r
public virtual void onMouseButtonDown(object sender, MouseButtonEventArgs e){\r
TopContainer.FocusedWidget = this;\r
\r
- MouseButtonDown (this, e);\r
+ MouseButtonDown.Raise (this, e);\r
}\r
public virtual void onMouseClick(object sender, MouseButtonEventArgs e){ \r
- MouseClick(this,e);\r
+ MouseClick.Raise (this,e);\r
}\r
public virtual void onMouseWheel(object sender, MouseWheelEventArgs e){\r
GraphicObject p = Parent as GraphicObject;\r
if (p != null)\r
p.onMouseWheel(this,e);\r
\r
- MouseWheelChanged (this, e);\r
+ MouseWheelChanged.Raise (this, e);\r
}\r
public virtual void onFocused(object sender, EventArgs e){\r
- Focused (this, e);\r
+ Focused.Raise (this, e);\r
this.HasFocus = true;\r
}\r
public virtual void onUnfocused(object sender, EventArgs e){\r
- Unfocused (this, e);\r
+ Unfocused.Raise (this, e);\r
this.HasFocus = false;\r
}\r
public virtual void onMouseEnter(object sender, MouseMoveEventArgs e)\r
{\r
Debug.WriteLine ("Mouse enter: " + this.Name);\r
- MouseEnter (this, e);\r
+ MouseEnter.Raise (this, e);\r
}\r
public virtual void onMouseLeave(object sender, MouseMoveEventArgs e)\r
{\r
Debug.WriteLine ("Mouse leave: " + this.Name);\r
- MouseLeave (this, e);\r
+ MouseLeave.Raise (this, e);\r
}\r
#endregion\r
\r
--- /dev/null
+//
+// ListBox.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.Collections;
+
+namespace go
+{
+ public class ListBox : GraphicObject
+ {
+ IEnumerable data;
+
+ public IEnumerable Data {
+ get {
+ return data;
+ }
+ set {
+ if (data == value)
+ return;
+
+ data = value;
+
+ foreach (var item in data) {
+
+ }
+ }
+ }
+
+ public ListBox ()
+ {
+ }
+ }
+}
+
public EventHandler<ValueChangeEventArgs> ValueChanged;
public virtual void onValueChanged(object sender, ValueChangeEventArgs e)
- {
- if (ValueChanged != null)
- ValueChanged (sender, e);
+ {
+ ValueChanged.Raise (sender, e);
}
#endregion
}\r
#endregion\r
\r
- public event EventHandler<TextChangeEventArgs> TextChanged = delegate { };\r
+ public event EventHandler<TextChangeEventArgs> TextChanged;\r
\r
public virtual void onTextChanged(Object sender, TextChangeEventArgs e)\r
{\r
- TextChanged (this, e);\r
+ TextChanged.Raise (this, e);\r
}\r
\r
#region Keyboard handling\r
--- /dev/null
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+using System.Drawing;\r
+using OpenTK.Graphics.OpenGL;\r
+using System.Diagnostics;\r
+\r
+namespace go\r
+{\r
+ public class WrappedWidgetGroup : Group\r
+ {\r
+\r
+ public int widgetSpacing = 2;\r
+\r
+ public Orientation Orientation = Orientation.Horizontal;\r
+\r
+\r
+ public WrappedWidgetGroup()\r
+ : base()\r
+ {\r
+ BorderWidth = 0;\r
+ }\r
+\r
+ int currentXForWidget = 0;\r
+ int currentYForWidget = 0;\r
+\r
+ int highestWidget = 0;\r
+ int largestWidget = 0;\r
+\r
+\r
+ public override void UpdateLayout()\r
+ {\r
+ //while (!layoutIsValid)\r
+ //{\r
+ //if (!(sizeIsValid && positionIsValid))\r
+ base.UpdateLayout();\r
+\r
+ //if (!base.layoutIsValid)\r
+ // return;\r
+\r
+ currentXForWidget = ClientRectangle.X;\r
+ currentYForWidget = ClientRectangle.Y;\r
+\r
+ highestWidget = 0;\r
+ largestWidget = 0;\r
+\r
+ Rectangle contentBounds = Rectangle.Zero;\r
+\r
+ GraphicObject[] widgets = new GraphicObject[Children.Count];\r
+ Children.CopyTo(widgets);\r
+ foreach (GraphicObject w in widgets)\r
+ {\r
+ if (w.renderBounds.Width > largestWidget)\r
+ largestWidget = w.renderBounds.Width;\r
+ if (w.renderBounds.Height > highestWidget)\r
+ highestWidget = w.renderBounds.Height;\r
+\r
+ if (!enoughtSpaceForWidget(w))\r
+ advance(w);\r
+\r
+ if (enoughtSpaceForWidget(w))\r
+ {\r
+ w.renderBounds.X = currentXForWidget;\r
+ w.renderBounds.Y = currentYForWidget;\r
+\r
+ w.positionIsValid = true;\r
+\r
+ contentBounds += w.renderBounds;\r
+\r
+ advance(w);\r
+ }\r
+ else\r
+ break;\r
+ }\r
+\r
+ contentBounds.Width += BorderWidth + Margin;\r
+ contentBounds.Height += BorderWidth + Margin;\r
+\r
+ if (SizeToContent)\r
+ renderBounds.Size = contentBounds.Size;\r
+ else if (VerticalScrolling)\r
+ renderBounds.Size = new Size(renderBounds.Size.Width, contentBounds.Size.Height);\r
+ else if (HorizontalScrolling)\r
+ renderBounds.Size = new Size(contentBounds.Size.Width, renderBounds.Size.Height);\r
+\r
+ if (layoutIsValid)\r
+ registerForRedraw();\r
+ }\r
+\r
+\r
+ bool enoughtSpaceForWidget(GraphicObject w)\r
+ {\r
+ int nextXForWidget = 0;\r
+ int nextYForWidget = 0;\r
+\r
+ if (Orientation == Orientation.Horizontal)\r
+ nextXForWidget = currentXForWidget + w.renderBounds.Width;\r
+ else\r
+ nextYForWidget = nextYForWidget + w.renderBounds.Height;\r
+\r
+ if (!SizeToContent)\r
+ {\r
+ if (nextXForWidget > ClientRectangle.Right && !HorizontalScrolling)\r
+ return false;\r
+ if (currentYForWidget > ClientRectangle.Bottom && !VerticalScrolling)\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+ void advance(GraphicObject w)\r
+ {\r
+ if (Orientation == Orientation.Horizontal)\r
+ {\r
+ //if (w is LabelWidget)\r
+ // Debugger.Break();\r
+ currentXForWidget = currentXForWidget + widgetSpacing + w.renderBounds.Width;\r
+ }\r
+ else\r
+ currentYForWidget = currentYForWidget + widgetSpacing + w.renderBounds.Height;\r
+\r
+ if (!SizeToContent)\r
+ {\r
+ if (currentXForWidget > ClientRectangle.Right && !HorizontalScrolling)\r
+ {\r
+ if (Orientation == Orientation.Vertical)\r
+ {\r
+ //not scrolling\r
+ }\r
+ else\r
+ {\r
+ currentXForWidget = ClientRectangle.X;\r
+ currentYForWidget += widgetSpacing + highestWidget;\r
+ highestWidget = 0;\r
+ }\r
+ }\r
+ if (currentYForWidget > ClientRectangle.Bottom && !VerticalScrolling)\r
+ {\r
+ if (Orientation == Orientation.Horizontal)\r
+ {\r
+ //not scrolling\r
+ }\r
+ else\r
+ {\r
+ currentXForWidget += widgetSpacing + largestWidget;\r
+ currentYForWidget = ClientRectangle.Y;\r
+ largestWidget = 0;\r
+ }\r
+\r
+ }\r
+ }\r
+ }\r
+ }\r
+}\r
\r
#region Events\r
//those events are raised only if mouse isn't in a graphic object\r
- public event EventHandler<MouseWheelEventArgs> MouseWheelChanged = delegate { };\r
- public event EventHandler<MouseButtonEventArgs> MouseButtonUp = delegate { };\r
- public event EventHandler<MouseButtonEventArgs> MouseButtonDown = delegate { };\r
- public event EventHandler<MouseButtonEventArgs> MouseClick = delegate { };\r
- public event EventHandler<MouseMoveEventArgs> MouseMove = delegate { };\r
+ public event EventHandler<MouseWheelEventArgs> MouseWheelChanged;\r
+ public event EventHandler<MouseButtonEventArgs> MouseButtonUp;\r
+ public event EventHandler<MouseButtonEventArgs> MouseButtonDown;\r
+ public event EventHandler<MouseButtonEventArgs> MouseClick;\r
+ public event EventHandler<MouseMoveEventArgs> MouseMove;\r
#endregion\r
\r
#region focus\r
}\r
}\r
_hoverWidget = null;\r
- MouseMove (this, e);\r
+ MouseMove.Raise (this, e);\r
}\r
void Mouse_ButtonUp(object sender, MouseButtonEventArgs e)\r
{\r
\r
_activeWidget.onMouseButtonUp (this, e);\r
_activeWidget = null;\r
- MouseButtonUp (this, e);\r
+ MouseButtonUp.Raise (this, e);\r
}\r
void Mouse_ButtonDown(object sender, MouseButtonEventArgs e)\r
{\r
if (_hoverWidget == null) {\r
- MouseButtonDown (this, e);\r
+ MouseButtonDown.Raise (this, e);\r
return;\r
}\r
\r
void Mouse_WheelChanged(object sender, MouseWheelEventArgs e)\r
{\r
if (_hoverWidget == null) {\r
- MouseWheelChanged (this, e);\r
+ MouseWheelChanged.Raise (this, e);\r
return;\r
}\r
_hoverWidget.onMouseWheel (this, e);\r