<WarningLevel>4</WarningLevel>
<NoWin32Manifest>False</NoWin32Manifest>
<SignAssembly>true</SignAssembly>
- <DelaySign>False</DelaySign>
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<Description>C# Rapid Open Widget</Description>
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{74289092-9F70-4941-AFCB-DFD7BE2140B6}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Crow.Test", "Crow.Test\Crow.Test.csproj", "{42C73BD8-51F5-4BB7-8EE9-9F0BE2D80A2C}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
{C2980F9B-4798-4C05-99E2-E174810F7C7B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C2980F9B-4798-4C05-99E2-E174810F7C7B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C2980F9B-4798-4C05-99E2-E174810F7C7B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {42C73BD8-51F5-4BB7-8EE9-9F0BE2D80A2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {42C73BD8-51F5-4BB7-8EE9-9F0BE2D80A2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {42C73BD8-51F5-4BB7-8EE9-9F0BE2D80A2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {42C73BD8-51F5-4BB7-8EE9-9F0BE2D80A2C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0
$0.StandardHeader = $1
$1.Text = @\n${FileName}\n \nAuthor:\n ${AuthorName} <${AuthorEmail}>\n\nCopyright (c) 2013-2017 Jean-Philippe Bruyère\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.
- $1.IncludeInNewFiles = True
$0.DotNetNamingPolicy = $2
- $2.DirectoryNamespaceAssociation = None
- $2.ResourceNamePolicy = FileFormatDefault
$0.TextStylePolicy = $3
- $3.FileWidth = 120
- $3.TabsToSpaces = False
$3.EolMarker = Unix
- $3.inheritsSet = VisualStudio
- $3.inheritsScope = text/plain
$3.scope = text/x-csharp
$0.CSharpFormattingPolicy = $4
$4.AfterDelegateDeclarationParameterComma = True
- $4.inheritsSet = Mono
- $4.inheritsScope = text/x-csharp
$4.scope = text/x-csharp
+ $4.IndentSwitchSection = False
+ $4.NewLinesForBracesInProperties = False
+ $4.NewLinesForBracesInAccessors = False
+ $4.NewLinesForBracesInAnonymousMethods = False
+ $4.NewLinesForBracesInControlBlocks = False
+ $4.NewLinesForBracesInAnonymousTypes = False
+ $4.NewLinesForBracesInObjectCollectionArrayInitializers = False
+ $4.NewLinesForBracesInLambdaExpressionBody = False
+ $4.NewLineForElse = False
+ $4.NewLineForCatch = False
+ $4.NewLineForFinally = False
+ $4.NewLineForMembersInObjectInit = False
+ $4.NewLineForMembersInAnonymousTypes = False
+ $4.NewLineForClausesInQuery = False
+ $4.SpacingAfterMethodDeclarationName = True
+ $4.SpaceAfterMethodCallName = True
+ $4.SpaceBeforeOpenSquareBracket = True
$0.VersionControlPolicy = $5
$5.CommitMessageStyle = $6
$6.Indent = @\t
$6.FileSeparator = ", "
$6.LastFilePostfix = "@:\n "
$6.Wrap = False
- $5.inheritsSet = Mono
description = @C.R.O.W. c# Rapid Open Widgets\n\nCrow is a pure c# widget toolkit with XML definition of interface, bindings, styling...\n
version = 0.5
EndGlobalSection
## Getting Start
### Requirements
-- [mono > 4.5](http://www.mono-project.com/download/)
+- [mono > 5.0](http://www.mono-project.com/download/)
- [Cairo Graphic Library](https://cairographics.org/) >= 1.10
- [rsvg library](https://developer.gnome.org/rsvg/) for svg rendering
- [nuget](https://www.nuget.org/).
Width="128" Height="128"/>
<HueSelector Hue="{²./H}" Focusable="true" Name="hueSelector" Margin="0" Width="128" Height="20"/>
</VerticalStack>
- <VerticalStack Margin="2" Spacing="0">
- <HorizontalStack Height="Fit" Width="Stretched" Spacing="2">
- <GraphicObject Width="34" Height="21" Background="{./SelectedColor}"/>
- <Label Focusable="true" Selectable="true" Width="Stretched" Text="{./HexColor}" />
- </HorizontalStack>
+ <VerticalStack Margin="5" Spacing="0">
+ <GraphicObject Width="34" Height="21" Background="{./SelectedColor}"/>
+ <Label Focusable="true" Selectable="true" Width="Stretched" Text="{./HexColor}" />
<HorizontalStack Height="Fit">
- <Label Text="Red:" Width="40"/>
- <Spinner Style="ColorSpinner" Value="{²./R}" Width="60" />
+ <Label Text="R" Width="Fit"/>
+ <Spinner Style="ColorSpinner" Value="{²./R}" Width="40" />
</HorizontalStack>
<HorizontalStack Height="Fit">
- <Label Text="Green:" Width="40"/>
- <Spinner Style="ColorSpinner" Value="{²./G}" Width="60" />
+ <Label Text="G" Width="Fit"/>
+ <Spinner Style="ColorSpinner" Value="{²./G}" Width="40" />
</HorizontalStack>
<HorizontalStack Height="Fit">
- <Label Text="Blue:" Width="40"/>
- <Spinner Style="ColorSpinner" Value="{²./B}" Width="60" />
+ <Label Text="B" Width="Fit"/>
+ <Spinner Style="ColorSpinner" Value="{²./B}" Width="40" />
</HorizontalStack>
<HorizontalStack Height="Fit">
- <Label Text="Alpha:" Width="40"/>
- <Spinner Style="ColorSpinner" Value="{²./A}" Width="60" />
+ <Label Text="A" Width="Fit"/>
+ <Spinner Style="ColorSpinner" Value="{²./A}" Width="40" />
</HorizontalStack>
<HorizontalStack Height="Fit">
- <Label Text="Hue:" Width="40"/>
- <Spinner Style="HSVSpinner" Value="{²./H}" Width="60" />
+ <Label Text="H" Width="Fit"/>
+ <Spinner Style="HSVSpinner" Value="{²./H}" Width="40" />
</HorizontalStack>
<HorizontalStack Height="Fit">
- <Label Text="Sat:" Width="40"/>
- <Spinner Style="HSVSpinner" Value="{²./S}" Width="60" />
+ <Label Text="S" Width="Fit"/>
+ <Spinner Style="HSVSpinner" Value="{²./S}" Width="40" />
</HorizontalStack>
<HorizontalStack Height="Fit">
- <Label Text="Val:" Width="40"/>
- <Spinner Style="HSVSpinner" Value="{²./V}" Width="60" />
+ <Label Text="V" Width="Fit"/>
+ <Spinner Style="HSVSpinner" Value="{²./V}" Width="40" />
</HorizontalStack>
</VerticalStack>
</HorizontalStack>
<HorizontalStack MinimumSize="40,10" Name="hstack" Margin="0" Spacing="0">
<Border BorderWidth="1" Width="80%" Background="White"
Foreground="{./Foreground}" Margin="0">
- <Label Foreground="{./Foreground}" Font="{./Font}" Width="Stretched"
- Text="{./Value}" TextAlignment="Right" Margin="0"/>
+ <TextBox Foreground="{./Foreground}" Font="{./Font}" Width="Stretched"
+ Text="{²./Value}" TextAlignment="Right" Margin="0"/>
</Border>
<VerticalStack MinimumSize="8,10" Width="20%" Height="Stretched" Spacing="0" Margin="0" Background="Red">
<Button MouseRepeat="true" Width="Stretched" Height="50%" Margin="0" MouseClick="./onUp"
public void DeleteWidget (GraphicObject g, int interfaceIdx = 0){
ifaceControl [interfaceIdx].CrowInterface.DeleteWidget (g);
}
- public GraphicObject Load (string path, int interfaceIdx = 0){
+ /// <summary>
+ /// check if a default interface exists, create one if not
+ /// </summary>
+ void checkDefaultIFace (){
if (ifaceControl.Count == 0)//create default orthogonal interface
addInterfaceControler (new InterfaceControler (
- new Rectangle (0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height)));
+ new Rectangle (0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height)));
+ }
+ /// <summary>
+ /// Load the content of the IML file pointed by path and add it to the current interface
+ /// graphic tree.
+ /// </summary>
+ /// <param name="path">the path of the IML file to load</param>
+ /// <param name="interfaceIdx">interface index to bind to, a default one is created if none exists</param>
+ public GraphicObject Load (string path, int interfaceIdx = 0){
+ checkDefaultIFace();
return ifaceControl [interfaceIdx].CrowInterface.LoadInterface (path);
}
+ /// <summary>
+ /// Load the content of the IML string passed as first argument and add it to the current interface
+ /// graphic tree.
+ /// </summary>
+ /// <param name="path">a valid IML string</param>
+ /// <param name="interfaceIdx">interface index to bind to, a default one is created if none exists</param>
+ public void LoadIMLFragment (string imlFragment, int interfaceIdx = 0){
+ checkDefaultIFace();
+ ifaceControl [interfaceIdx].CrowInterface.LoadIMLFragment (imlFragment);
+ }
+
public GraphicObject FindByName (string nameToFind){
for (int i = 0; i < ifaceControl.Count; i++) {
GraphicObject tmp = ifaceControl [i].CrowInterface.FindByName (nameToFind);
--- /dev/null
+//
+// TestCairoPatch.cs
+//
+// Author:
+// jp <>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Cairo;
+using Crow;
+
+namespace Test
+{
+ public class ColorCircleSelector : GraphicObject
+ {
+ void computeControlPoints (
+ double xc, double yc,
+ double x1, double y1,
+ out double x2, out double y2,
+ out double x3, out double y3,
+ double x4, double y4){
+ double ax = x1 - xc;
+ double ay = y1 - yc;
+ double bx = x4 - xc;
+ double byy = y4 - yc;
+ double q1 = ax * ax + ay * ay;
+ double q2 = q1 + ax * bx + ay * byy;
+ double k2 = 4.0/3.0 * (Math.Sqrt(2.0 * q1 * q2) - q2) / (ax * byy - ay * bx);
+
+
+ x2 = xc + ax - k2 * ay;
+ y2 = yc + ay + k2 * ax;
+ x3 = xc + bx + k2 * byy;
+ y3 = yc + byy - k2 * bx;
+ }
+ protected override void onDraw (Context gr)
+ {
+ base.onDraw (gr);
+
+ double radius = 100;
+
+ double pi3 = Math.PI / 3.0;
+
+ MeshPattern mp = new MeshPattern ();
+
+ double x1 = radius,y1 = 0,
+ x2 = 0, y2 = 0, x3 = 0, y3 = 0, x4 = 0, y4 = 0,
+ xc = radius,yc = radius;
+
+ double dx = Math.Sin (pi3) * radius;
+ double dy = Math.Cos (pi3) * radius;
+
+ mp.BeginPatch ();
+ mp.MoveTo (xc, yc);
+ mp.LineTo (x1, y1);
+ x4 = xc + dx;
+ y4 = yc - dy;
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (0, 1, 1, 1);
+ mp.SetCornerColorRGB (1, 1, 0, 0);
+ mp.SetCornerColorRGB (2, 1, 1, 0);
+
+ x1 = x4;
+ y1 = y4;
+ y4 = yc + dy;
+
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (3, 0, 1, 0);
+ mp.EndPatch ();
+
+ x1 = x4;
+ y1 = y4;
+ x4 = xc;
+ y4 = yc * 2.0;
+
+ mp.BeginPatch ();
+ mp.MoveTo (xc, yc);
+ mp.LineTo (x1, y1);
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (0, 1, 1, 1);
+ mp.SetCornerColorRGB (1, 0, 1, 0);
+ mp.SetCornerColorRGB (2, 0, 1, 1);
+
+ x1 = x4;
+ y1 = y4;
+ x4 = xc-dx;
+ y4 = yc+dy;
+
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (3, 0, 0, 1);
+ mp.EndPatch ();
+
+ x1 = x4;
+ y1 = y4;
+ y4 = yc - dy;
+
+ mp.BeginPatch ();
+ mp.MoveTo (xc, yc);
+ mp.LineTo (x1, y1);
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (0, 1, 1, 1);
+ mp.SetCornerColorRGB (1, 0, 0, 1);
+ mp.SetCornerColorRGB (2, 1, 0, 1);
+
+ x1 = x4;
+ y1 = y4;
+ x4 = radius;
+ y4 = 0;
+
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (3, 1, 0, 0);
+ mp.EndPatch ();
+
+ gr.SetSource (mp);
+ gr.Paint ();
+ }
+ }
+}
+
--- /dev/null
+//
+// SimpleGauge.cs
+//
+// Author:
+// jp <>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow;
+using System.ComponentModel;
+using Cairo;
+
+namespace Tutorials
+{
+ public class SimpleGauge : GraphicObject
+ {
+ public SimpleGauge () : base() {}
+ public SimpleGauge (Interface iface): base (iface){}
+
+ int level;
+
+ [DefaultValue(0)]
+ public int Level
+ {
+ get { return level; }
+ set {
+ if (level == value)
+ return;
+ level = value;
+ NotifyValueChanged ("Level", level);
+ }
+ }
+
+ protected override void onDraw (Context gr)
+ {
+ base.onDraw (gr);
+
+ Rectangle r = ClientRectangle;
+ int height = r.Height / 100 * level;
+ r.Y += r.Height - height;
+ r.Height = height;
+ Foreground.SetAsSource (gr);
+ gr.Rectangle (r);
+ gr.Fill ();
+ }
+ }
+}
+
+++ /dev/null
-//
-// HelloCube.cs
-//
-// Author:
-// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
-//
-// Copyright (c) 2013-2017 Jean-Philippe Bruyère
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using OpenTK;
-using OpenTK.Graphics.OpenGL;
-using Crow;
-
-namespace Tests
-{
- class HelloCube : CrowWindow
- {
- [STAThread]
- static void Main ()
- {
- HelloCube win = new HelloCube ();
- win.Run (30);
- }
-
- public HelloCube ()
- : base(800, 600,"Crow Test with OpenTK")
- {
- }
-
- vaoMesh cube;
- Texture texture;
- Matrix4 projection, modelview;
-
- void initGL(){
- GL.Enable (EnableCap.CullFace);
- GL.Enable (EnableCap.Blend);
- GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
-
- cube = vaoMesh.CreateCube ();
- texture = new Texture ("image/textest.png");
-
- projection =
- Matrix4.CreatePerspectiveFieldOfView (
- MathHelper.PiOver4,
- ClientRectangle.Width / (float)ClientRectangle.Height, 1.0f, 10.0f);
- modelview = Matrix4.LookAt(new Vector3(5,5,5), Vector3.Zero, Vector3.UnitZ);
- }
-
- protected override void OnLoad (EventArgs e)
- {
- base.OnLoad (e);
-
- AddWidget(
- new Window (this.CurrentInterface)
- {
- Caption = "Hello World"
- }
- );
- initGL ();
- }
- public override void OnRender (FrameEventArgs e)
- {
- base.OnRender (e);
-
- shader.SetMVP(modelview * projection);
-
- GL.BindTexture (TextureTarget.Texture2D, texture);
- cube.Render (BeginMode.Triangles);
- GL.BindTexture (TextureTarget.Texture2D, 0);
- }
- }
-}
\ No newline at end of file
using System.Reflection;
using System.Linq;
using System.Text;
+using Crow.IML;
namespace Tests
{
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<DefineConstants>DEBUG;TRACE;MEASURE_TIME</DefineConstants>
- <IntermediateOutputPath>$(SolutionDir)build\obj\$(Configuration)</IntermediateOutputPath>
- <OutputPath>$(SolutionDir)build\$(Configuration)</OutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<WarningLevel>0</WarningLevel>
<ConsolePause>false</ConsolePause>
- <IntermediateOutputPath>$(SolutionDir)build\obj\$(Configuration)</IntermediateOutputPath>
- <OutputPath>$(SolutionDir)build\$(Configuration)</OutputPath>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(RunConfiguration)' == 'Default' ">
+ <StartAction>Program</StartAction>
+ <StartProgram>%24{TargetName}</StartProgram>
+ <StartWorkingDirectory>%24{SolutionDir}\build\%24{ProjectConfigName}</StartWorkingDirectory>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(RunConfiguration)' == 'Custom Command' ">
+ <StartAction>Program</StartAction>
+ <StartProgram>%24{TargetName}</StartProgram>
+ <StartWorkingDirectory>%24{SolutionDir}\build\%24{ProjectConfigName}</StartWorkingDirectory>
+ <ConsolePause>false</ConsolePause>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Compile Include="OpenGL\vaoMesh.cs" />
<Compile Include="OpenGL\Texture.cs" />
<Compile Include="HelloWorld.cs" />
- <Compile Include="HelloCube.cs" />
<Compile Include="CrowWindow.cs" />
<Compile Include="Hello3D.cs" />
<Compile Include="OpenGL\Extensions.cs" />
<Compile Include="InterfaceControler.cs" />
<Compile Include="Showcase.cs" />
+ <Compile Include="GraphicObjects\ColorCircleSelector.cs" />
+ <Compile Include="GraphicObjects\SimpleGauge.cs" />
+ <Compile Include="Tutorials\T1_HelloWorld.cs" />
+ <Compile Include="Tutorials\T3_OpenGLCube.cs" />
+ <Compile Include="Tutorials\T4_Gauge.cs" />
+ <Compile Include="Tutorials\T2_IML.cs" />
</ItemGroup>
<ItemGroup>
<None Include="image\u.svg">
<Folder Include="Interfaces\TemplatedControl\" />
<Folder Include="Interfaces\TemplatedContainer\" />
<Folder Include="Interfaces\TemplatedGroup\" />
+ <Folder Include="GraphicObjects\" />
+ <Folder Include="Tutorials\" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="image\tetra.png">
<EmbeddedResource Include="Interfaces\CheckBox2.imlt" />
<EmbeddedResource Include="Interfaces\perfMsr.crow" />
<EmbeddedResource Include="ui\showcase.crow" />
+ <EmbeddedResource Include="Tutorials\test.crow">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Crow.csproj">
--- /dev/null
+//
+// HelloWorld.cs
+//
+// Author:
+// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using Crow;
+
+namespace Tutorials
+{
+ class T1_HelloWorld : CrowWindow
+ {
+ public T1_HelloWorld ()
+ : base(800, 600,"Hello World")
+ {
+ }
+
+ protected override void OnLoad (EventArgs e)
+ {
+ base.OnLoad (e);
+ AddWidget (new Label (CurrentInterface) { Text = "Hello World" });
+ }
+
+ [STAThread]
+ static void Main ()
+ {
+ T1_HelloWorld win = new T1_HelloWorld ();
+ win.Run (30);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+//
+// HelloWorld.cs
+//
+// Author:
+// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using Crow;
+
+namespace Tutorials
+{
+ class T2_IML : CrowWindow
+ {
+ public T2_IML ()
+ : base(800, 600,"First app with OpenTK")
+ {
+ }
+
+ protected override void OnLoad (EventArgs e)
+ {
+ base.OnLoad (e);
+ Load ("#Tests.Tutorials.test.crow");
+ }
+
+ [STAThread]
+ static void Main ()
+ {
+ T2_IML win = new T2_IML ();
+ win.Run (30);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+//
+// HelloCube.cs
+//
+// Author:
+// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using OpenTK;
+using OpenTK.Graphics.OpenGL;
+using Crow;
+
+namespace Tutorials
+{
+ class T3_OpenGLCube : CrowWindow
+ {
+ [STAThread]
+ static void Main ()
+ {
+ T3_OpenGLCube win = new T3_OpenGLCube ();
+ win.Run (30);
+ }
+
+ public T3_OpenGLCube ()
+ : base(800, 600,"Crow Test with OpenTK")
+ {
+ }
+
+ vaoMesh cube;
+ Texture texture;
+ Matrix4 projection, modelview;
+
+ protected override void OnLoad (EventArgs e)
+ {
+ base.OnLoad (e);
+
+ GL.Enable (EnableCap.CullFace);
+ GL.Enable (EnableCap.Blend);
+ GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
+
+ cube = vaoMesh.CreateCube ();
+ texture = new Texture ("image/textest.png");
+
+ projection =
+ Matrix4.CreatePerspectiveFieldOfView (
+ MathHelper.PiOver4,
+ ClientRectangle.Width / (float)ClientRectangle.Height, 1.0f, 10.0f);
+ modelview = Matrix4.LookAt(new Vector3(5,5,5), Vector3.Zero, Vector3.UnitZ);
+
+ AddWidget(
+ new Window (this.CurrentInterface)
+ {
+ Caption = "Hello World"
+ }
+ );
+ }
+ public override void OnRender (FrameEventArgs e)
+ {
+ base.OnRender (e);
+
+ shader.SetMVP(modelview * projection);
+
+ GL.BindTexture (TextureTarget.Texture2D, texture);
+ cube.Render (BeginMode.Triangles);
+ GL.BindTexture (TextureTarget.Texture2D, 0);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+//
+// HelloWorld.cs
+//
+// Author:
+// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using Crow;
+
+namespace Tutorials
+{
+ class T4_Gauge : CrowWindow
+ {
+ public T4_Gauge ()
+ : base(800, 600,"Simple Gauge Tutorial")
+ {
+ }
+
+ protected override void OnLoad (EventArgs e)
+ {
+ base.OnLoad (e);
+ AddWidget (new SimpleGauge (CurrentInterface) {
+ Level = 40,
+ Width = 30, Height = "50%",
+ Foreground = Color.UnitedNationsBlue, Background = Color.Jet
+ });
+ }
+
+ [STAThread]
+ static void Main ()
+ {
+ T4_Gauge win = new T4_Gauge ();
+ win.Run (30);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+<Window Height="400" Width="50%" Caption="My first Window">
+ <Label Text="Hello World"/>
+</Window>
\ No newline at end of file
}
using (ImageSurface tmp = new ImageSurface (Format.Argb32, bounds.Width, bounds.Height)) {
- using (Cairo.Context gr = new Context (tmp)) {
+ using (Context gr = new Context (tmp)) {
gr.Translate (bounds.Left, bounds.Top);
gr.Scale (widthRatio, heightRatio);
gr.Translate ((bounds.Width/widthRatio - Dimensions.Width)/2, (bounds.Height/heightRatio - Dimensions.Height)/2);
/// <param name="gr">drawing Backend context</param>
/// <param name="rect">bounds of the target surface to paint</param>
/// <param name="subPart">used for svg only</param>
- public override void Paint (Cairo.Context gr, Rectangle rect, string subPart = "")
+ public override void Paint (Context gr, Rectangle rect, string subPart = "")
{
float widthRatio = 1f;
float heightRatio = 1f;
using System;
using System.Collections.Generic;
+using Cairo;
namespace Crow
{
/// set content of fill as source for drawing operations on the backend context
/// </summary>
/// <param name="ctx">backend context</param>
- /// <param name="bounds">drawing operation bounding box</param>
- public abstract void SetAsSource (Cairo.Context ctx, Rectangle bounds = default(Rectangle));
+ /// <param name="bounds">paint operation bounding box, unused for SolidColor</param>
+ public abstract void SetAsSource (Context ctx, Rectangle bounds = default(Rectangle));
public static object Parse (string s){
if (string.IsNullOrEmpty (s))
return null;
using System;
using System.Collections.Generic;
+using Cairo;
namespace Crow
{
#region implemented abstract members of Fill
- public override void SetAsSource (Cairo.Context ctx, Rectangle bounds = default(Rectangle))
+ public override void SetAsSource (Context ctx, Rectangle bounds = default(Rectangle))
{
Cairo.Gradient grad = null;
switch (GradientType) {
using System.Xml.Serialization;
using System.ComponentModel;
using System.Diagnostics;
+using Cairo;
namespace Crow
{
int tmp = base.measureRawSize (lt);
return tmp < 0 ? tmp : tmp + 2 * BorderWidth;
}
- protected override void onDraw (Cairo.Context gr)
+ protected override void onDraw (Context gr)
{
drawborder2 (gr);
child.Paint (ref gr);
gr.Restore ();
}
- void drawborder2(Cairo.Context gr){
+ void drawborder2(Context gr){
Rectangle rBack = new Rectangle (Slot.Size);
//rBack.Inflate (-Margin);
}
}
}
- void drawborder1(Cairo.Context gr){
+ void drawborder1(Context gr){
Rectangle rBack = new Rectangle (Slot.Size);
//rBack.Inflate (-Margin);
namespace Crow
{
/// <summary>
- /// This is the base class for all the graphic trees elements
+ /// The base class for all the graphic tree elements.
/// </summary>
public class GraphicObject : ILayoutable, IValueChange, IDisposable
{
#region Rendering
/// <summary> This is the common overridable drawing routine to create new widget </summary>
- protected virtual void onDraw(Cairo.Context gr)
+ protected virtual void onDraw(Context gr)
{
#if DEBUG_UPDATE
Debug.WriteLine (string.Format("OnDraw -> {0}", this.ToString ()));
if (bmp != null)
bmp.Dispose ();
bmp = new ImageSurface (Format.Argb32, Slot.Width, Slot.Height);
- using (Cairo.Context gr = new Cairo.Context (bmp)) {
+ using (Context gr = new Context (bmp)) {
gr.Antialias = Interface.Antialias;
onDraw (gr);
}
bmp.Flush ();
}
- protected virtual void UpdateCache(Cairo.Context ctx){
+ protected virtual void UpdateCache(Context ctx){
#if DEBUG_UPDATE
Debug.WriteLine (string.Format("UpdateCache -> {0}", this.ToString ()));
#endif
}
/// <summary> Chained painting routine on the parent context of the actual cached version
/// of the widget </summary>
- public virtual void Paint (ref Cairo.Context ctx)
+ public virtual void Paint (ref Context ctx)
{
#if DEBUG_UPDATE
Debug.WriteLine (string.Format("Paint -> {0}", this.ToString ()));
LastPaintedSlot = Slot;
}
}
- void paintDisabled(Cairo.Context gr, Rectangle rb){
+ void paintDisabled(Context gr, Rectangle rb){
gr.Operator = Operator.Xor;
gr.SetSourceRGBA (0.6, 0.6, 0.6, 0.3);
gr.Rectangle (rb);
RegisterForRedraw ();
}
}
- protected override void onDraw (Cairo.Context gr)
+ protected override void onDraw (Context gr)
{
base.onDraw (gr);
Rectangle r = ClientRectangle;
+ r.Height -= 4;
+ r.Y += 2;
Gradient.Type gt = Gradient.Type.Horizontal;
if (Orientation == Orientation.Vertical)
r.Y = mousePos.Y - 2;
}
- CairoHelpers.CairoRectangle (ctx, r, 2);
+ CairoHelpers.CairoRectangle (ctx, r, 1);
ctx.SetSourceColor (Color.White);
- ctx.LineWidth = 2.0;
+ ctx.LineWidth = 1.0;
ctx.Stroke();
ctx.Restore ();
}
RegisterForRedraw ();
}
}
- [XmlAttributeAttribute][DefaultValue(0.0)]
+ [DefaultValue(0.0)]
public double Value
{
get { return _actualValue; }
RegisterForRedraw ();
}
}
- protected override void onDraw (Cairo.Context gr)
+ protected override void onDraw (Context gr)
{
base.onDraw (gr);
using System.Xml.Serialization;
using System.ComponentModel;
using System.Diagnostics;
+using Cairo;
namespace Crow
{
NotifyValueChanged ("IsSelected", isSelected);
}
}
- protected override void onDraw (Cairo.Context gr)
+ protected override void onDraw (Context gr)
{
gr.Save ();
using System.Collections.Generic;
using System.Text;
using System.Reflection;
+using Cairo;
namespace Crow
{
///this allow applying root background to random template's component
/// </summary>
/// <param name="gr">Backend context</param>
- protected override void onDraw (Cairo.Context gr)
+ protected override void onDraw (Context gr)
{
gr.Save ();
--- /dev/null
+//
+// TestCairoPatch.cs
+//
+// Author:
+// jp <>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Cairo;
+
+namespace Crow
+{
+ public class TestCairoPatch : GraphicObject
+ {
+ void computeControlPoints (
+ double xc, double yc,
+ double x1, double y1,
+ out double x2, out double y2,
+ out double x3, out double y3,
+ double x4, double y4){
+ double ax = x1 - xc;
+ double ay = y1 - yc;
+ double bx = x4 - xc;
+ double byy = y4 - yc;
+ double q1 = ax * ax + ay * ay;
+ double q2 = q1 + ax * bx + ay * byy;
+ double k2 = 4.0/3.0 * (Math.Sqrt(2.0 * q1 * q2) - q2) / (ax * byy - ay * bx);
+
+
+ x2 = xc + ax - k2 * ay;
+ y2 = yc + ay + k2 * ax;
+ x3 = xc + bx + k2 * byy;
+ y3 = yc + byy - k2 * bx;
+ }
+ protected override void onDraw (Context gr)
+ {
+ base.onDraw (gr);
+
+ double radius = 100;
+
+ double pi3 = Math.PI / 3.0;
+
+ MeshPattern mp = new MeshPattern ();
+
+ double x1 = radius,y1 = 0,
+ x2 = 0, y2 = 0, x3 = 0, y3 = 0, x4 = 0, y4 = 0,
+ xc = radius,yc = radius;
+
+ double dx = Math.Sin (pi3) * radius;
+ double dy = Math.Cos (pi3) * radius;
+
+ mp.BeginPatch ();
+ mp.MoveTo (xc, yc);
+ mp.LineTo (x1, y1);
+ x4 = xc + dx;
+ y4 = yc - dy;
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (0, 1, 1, 1);
+ mp.SetCornerColorRGB (1, 1, 0, 0);
+ mp.SetCornerColorRGB (2, 1, 1, 0);
+
+ x1 = x4;
+ y1 = y4;
+ y4 = yc + dy;
+
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (3, 0, 1, 0);
+ mp.EndPatch ();
+
+ x1 = x4;
+ y1 = y4;
+ x4 = xc;
+ y4 = yc * 2.0;
+
+ mp.BeginPatch ();
+ mp.MoveTo (xc, yc);
+ mp.LineTo (x1, y1);
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (0, 1, 1, 1);
+ mp.SetCornerColorRGB (1, 0, 1, 0);
+ mp.SetCornerColorRGB (2, 0, 1, 1);
+
+ x1 = x4;
+ y1 = y4;
+ x4 = xc-dx;
+ y4 = yc+dy;
+
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (3, 0, 0, 1);
+ mp.EndPatch ();
+
+ x1 = x4;
+ y1 = y4;
+ y4 = yc - dy;
+
+ mp.BeginPatch ();
+ mp.MoveTo (xc, yc);
+ mp.LineTo (x1, y1);
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (0, 1, 1, 1);
+ mp.SetCornerColorRGB (1, 0, 0, 1);
+ mp.SetCornerColorRGB (2, 1, 0, 1);
+
+ x1 = x4;
+ y1 = y4;
+ x4 = radius;
+ y4 = 0;
+
+ computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+ mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+ mp.SetCornerColorRGB (3, 1, 0, 0);
+ mp.EndPatch ();
+
+ gr.SetSource (mp);
+ gr.Paint ();
+ }
+ }
+}
+
using System.Collections.Generic;
using System.Xml.Serialization;
using System.ComponentModel;
+using Cairo;
namespace Crow
{
RegisterForRedraw ();
}
}
- protected override void onDraw (Cairo.Context gr)
+ protected override void onDraw (Context gr)
{
base.onDraw (gr);
using System.Linq;
using Crow.IML;
-namespace Crow
+namespace Crow.IML
{
public delegate object InstanciatorInvoker(Interface iface);
public GraphicObject CreateInstance(Interface iface){
return loader (iface) as GraphicObject;
}
-
+ /// <summary>
+ /// Creates a new instance of T compiled in the instantiator
+ /// and bind it the an interface
+ /// </summary>
+ /// <returns>The new T instance</returns>
+ /// <param name="iface">The interface to bind to</param>
+ public T CreateInstance<T>(Interface iface){
+ return (T)loader (iface);
+ }
List<DynamicMethod> dsValueChangedDynMeths = new List<DynamicMethod>();
List<Delegate> cachedDelegates = new List<Delegate>();
/// <summary>
using System.Xml.Serialization;
using Cairo;
using System.Globalization;
+using Crow.IML;
namespace Crow
{
}
/// <summary> Search for .style resources in assembly </summary>
static void loadStylingFromAssembly (Assembly assembly) {
+ if (assembly == null)
+ return;
foreach (string s in assembly
.GetManifestResourceNames ()
.Where (r => r.EndsWith (".style", StringComparison.OrdinalIgnoreCase))) {
}
static void loadCursors(){
//Load cursors
- XCursor.Cross = XCursorFile.Load("#Crow.Images.Icons.Cursors.cross").Cursors[0];
- XCursor.Default = XCursorFile.Load("#Crow.Images.Icons.Cursors.arrow").Cursors[0];
- XCursor.NW = XCursorFile.Load("#Crow.Images.Icons.Cursors.top_left_corner").Cursors[0];
+ XCursor.Cross = XCursorFile.Load("#Crow.Images.Icons.Cursors.cross").Cursors[3];
+ XCursor.Default = XCursorFile.Load("#Crow.Images.Icons.Cursors.arrow").Cursors[3];
+ XCursor.NW = XCursorFile.Load("#Crow.Images.Icons.Cursors.top_left_corner").Cursors[3];
XCursor.NE = XCursorFile.Load("#Crow.Images.Icons.Cursors.top_right_corner").Cursors[0];
XCursor.SW = XCursorFile.Load("#Crow.Images.Icons.Cursors.bottom_left_corner").Cursors[0];
XCursor.SE = XCursorFile.Load("#Crow.Images.Icons.Cursors.bottom_right_corner").Cursors[0];
}
}
static void searchTemplatesIn(Assembly assembly){
+ if (assembly == null)
+ return;
foreach (string resId in assembly
.GetManifestResourceNames ()
.Where (r => r.EndsWith (".template", StringComparison.OrdinalIgnoreCase))) {
}
return stream;
}
-
+ /// <summary>
+ /// Add the content of the IML fragment to the graphic tree of this interface
+ /// </summary>
+ /// <returns>return the new instance for convenience, may be ignored</returns>
+ /// <param name="imlFragment">a valid IML string</param>
+ public GraphicObject LoadIMLFragment (string imlFragment) {
+ lock (UpdateMutex) {
+ GraphicObject tmp = Instantiator.CreateFromImlFragment (imlFragment).CreateInstance(this);
+ AddWidget (tmp);
+ return tmp;
+ }
+ }
/// <summary>Create an instance of a GraphicObject and add it to the GraphicTree
/// of this Interface</summary>
public GraphicObject LoadInterface (string path)
lock (UpdateMutex) {
GraphicObject tmp = Load (path);
AddWidget (tmp);
-
return tmp;
}
}
NativeMethods.cairo_arc_negative (handle, xc, yc, radius, angle1, angle2);
}
- public void Rectangle (Rectangle rectangle)
+ public void Rectangle (Crow.Rectangle rectangle)
{
Rectangle (rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
}
NativeMethods.cairo_stroke_preserve (handle);
}
- public Rectangle StrokeExtents ()
+ public Crow.Rectangle StrokeExtents ()
{
double x1, y1, x2, y2;
NativeMethods.cairo_stroke_extents (handle, out x1, out y1, out x2, out y2);
- return new Rectangle (x1, y1, x2 - x1, y2 - y1);
+ return new Crow.Rectangle ((int)x1, (int)y1, (int)(x2 - x1), (int)(y2 - y1));
}
public void Fill ()
NativeMethods.cairo_fill (handle);
}
- public Rectangle FillExtents ()
+ public Crow.Rectangle FillExtents ()
{
double x1, y1, x2, y2;
NativeMethods.cairo_fill_extents (handle, out x1, out y1, out x2, out y2);
- return new Rectangle (x1, y1, x2 - x1, y2 - y1);
+ return new Crow.Rectangle ((int)x1, (int)y1, (int)(x2 - x1), (int)(y2 - y1));
}
public void FillPreserve ()
namespace Cairo
{
- public struct Rectangle
- {
- double x;
- double y;
- double width;
- double height;
-
- public Rectangle (double x, double y, double width, double height)
- {
- this.x = x;
- this.y = y;
- this.width = width;
- this.height = height;
- }
-
- public Rectangle (Point point, double width, double height)
- {
- x = point.X;
- y = point.Y;
- this.width = width;
- this.height = height;
- }
-
- public double X {
- get { return x; }
- }
-
- public double Y {
- get { return y; }
- }
-
- public double Width {
- get { return width; }
- }
-
- public double Height {
- get { return height; }
- }
-
- public override bool Equals (object obj)
- {
- if (obj is Rectangle)
- return this == (Rectangle)obj;
- return false;
- }
-
- public override int GetHashCode ()
- {
- return (int) (x + y + width + height);
- }
-
- public override string ToString ()
- {
- return String.Format ("x:{0} y:{1} w:{2} h:{3}", x, y, width, height);
- }
-
- public static bool operator == (Rectangle rectangle, Rectangle other)
- {
- return rectangle.X == other.X && rectangle.Y == other.Y && rectangle.Width == other.Width && rectangle.Height == other.Height;
- }
-
- public static bool operator != (Rectangle rectangle, Rectangle other)
- {
- return !(rectangle == other);
- }
- }
+// public struct Rectangle
+// {
+// double x;
+// double y;
+// double width;
+// double height;
+//
+// public Rectangle (double x, double y, double width, double height)
+// {
+// this.x = x;
+// this.y = y;
+// this.width = width;
+// this.height = height;
+// }
+//
+// public Rectangle (Point point, double width, double height)
+// {
+// x = point.X;
+// y = point.Y;
+// this.width = width;
+// this.height = height;
+// }
+//
+// public double X {
+// get { return x; }
+// }
+//
+// public double Y {
+// get { return y; }
+// }
+//
+// public double Width {
+// get { return width; }
+// }
+//
+// public double Height {
+// get { return height; }
+// }
+//
+// public override bool Equals (object obj)
+// {
+// if (obj is Rectangle)
+// return this == (Rectangle)obj;
+// return false;
+// }
+//
+// public override int GetHashCode ()
+// {
+// return (int) (x + y + width + height);
+// }
+//
+// public override string ToString ()
+// {
+// return String.Format ("x:{0} y:{1} w:{2} h:{3}", x, y, width, height);
+// }
+//
+// public static bool operator == (Rectangle rectangle, Rectangle other)
+// {
+// return rectangle.X == other.X && rectangle.Y == other.Y && rectangle.Width == other.Width && rectangle.Height == other.Height;
+// }
+//
+// public static bool operator != (Rectangle rectangle, Rectangle other)
+// {
+// return !(rectangle == other);
+// }
+// }
}
NativeMethods.cairo_surface_mark_dirty (Handle);
}
- public void MarkDirty (Rectangle rectangle)
+ public void MarkDirty (Crow.Rectangle rectangle)
{
- NativeMethods.cairo_surface_mark_dirty_rectangle (Handle, (int)rectangle.X, (int)rectangle.Y, (int)rectangle.Width, (int)rectangle.Height);
+ NativeMethods.cairo_surface_mark_dirty_rectangle (Handle, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
}
public IntPtr Handle {
using System.Xml.Serialization;
using System.Reflection;
using System.Diagnostics;
+using Cairo;
#region implemented abstract members of Fill
- public override void SetAsSource (Cairo.Context ctx, Rectangle bounds = default(Rectangle))
+ public override void SetAsSource (Context ctx, Rectangle bounds = default(Rectangle))
{
ctx.SetSourceRGBA (color.R, color.G, color.B, color.A);
}
}
using (ImageSurface tmp = new ImageSurface (Format.Argb32, bounds.Width, bounds.Height)) {
- using (Cairo.Context gr = new Context (tmp)) {
+ using (Context gr = new Context (tmp)) {
gr.Translate (bounds.Left, bounds.Top);
gr.Scale (widthRatio, heightRatio);
gr.Translate ((bounds.Width/widthRatio - Dimensions.Width)/2, (bounds.Height/heightRatio - Dimensions.Height)/2);
/// <param name="gr">drawing Backend context</param>
/// <param name="rect">bounds of the target surface to paint</param>
/// <param name="subPart">limit rendering to svg part named 'subPart'</param>
- public override void Paint (Cairo.Context gr, Rectangle rect, string subPart = "")
+ public override void Paint (Context gr, Rectangle rect, string subPart = "")
{
float widthRatio = 1f;
float heightRatio = 1f;
//Copyright GPL2
+using Cairo;
+
+
namespace Rsvg {
using System;
[DllImport("rsvg-2")]
static extern void rsvg_handle_render_cairo(IntPtr raw, IntPtr cr);
- public void RenderCairo(Cairo.Context cr) {
+ public void RenderCairo(Context cr) {
unsafe{
rsvg_handle_render_cairo (Raw, cr == null ? IntPtr.Zero : cr.Handle);
}