Code Monkey home page Code Monkey logo

eto's People

Contributors

acormier avatar allsorts46 avatar bchavez avatar carlokok avatar commonloon102 avatar cwensley avatar cyanfish avatar danrigby avatar derbyw avatar e673 avatar eng-myousif avatar ermshiperete avatar firdacz avatar fredrikhr avatar halid-durakovic avatar harry-cpp avatar ievgen-baida avatar jaedog avatar keepwn avatar lubos avatar manuelhu avatar martinrothschink avatar miepee avatar panzerfather avatar piersdeseilligny avatar rafntor avatar slowlogicboy avatar smoothdeveloper avatar stevegilham avatar wjk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

eto's Issues

MAC: Problem with ImageTextCell in TreeGridView

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
//var generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");
var generator = Generator.GetGenerator("Eto.Platform.Mac.Generator, Eto.Platform.Mac");
var app = new TestApplication(generator);
app.Run(args);
}
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }
}

public class MyTreeGridItem : TreeGridItem
{ 
   public Icon MyImage  { get; set; }
   public String MyCaption { get; set; }
}

public class MainForm : Form
{
    int[] arr = new int[] { 5, 5 };
    TreeGridView tv;
    TreeGridItem it;
    Icon ic;

    void CreateItem(TreeGridItem aParent, string aBaseName, int aLevel)
    {
        var lName = "[" + aLevel + "]" + aBaseName;
        var lItem = new MyTreeGridItem { MyImage = ic, MyCaption = lName };
        //lItem.MyImage = ic;
        //lItem.MyCaption = lName;   
        lItem.Expanded = true;

        if (lName == "[1]Name1") { it = lItem; };
        aParent.Children.Add(lItem);
        if (aLevel < arr.Length)
            for (int i = 0; i < arr[aLevel]; i++)
                CreateItem(lItem, aBaseName + i.ToString(), aLevel + 1);
    }


    void CreateTree()
    {
        TreeGridItem lRoot = new TreeGridItem();
        CreateItem(lRoot, "Name", 0);


        Application.Instance.Invoke(delegate
        {
            tv.DataStore = lRoot;
        });
    }

    public MainForm()
    {
        ic = new Icon("black.ico");
        Size = new Size(900, 800);
        var lp = new Panel();
        this.AddDockedControl(lp, new Padding(5));
        var lPanelLayout = new TableLayout(lp, 1, 1);
        lPanelLayout.Padding = new Padding(0);


        tv = new TreeGridView();
        tv.Columns.Add(new GridColumn { DataCell = new ImageTextCell("MyImage", "MyCaption") });
        lPanelLayout.Add(tv, 0, 0, true, true);
        CreateTree();
    }
}

}

windows: http://screencast.com/t/J6joIgg613o
macosx: http://screencast.com/t/2ZAvzEW6MX

TreeGridView.SelectedItem doesn't work

testcase:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
var generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");

        var app = new TestApplication(generator);
        app.Run(args);
    }
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }

}

public class MainForm : Form
{
    int[] arr = new int[] { 5, 5 };
    TreeGridView tv;
    TreeGridItem it;

    void CreateItem(TreeGridItem aParent, string aBaseName, int aLevel)
    {
        var lName = "[" + aLevel + "]" + aBaseName;
        var lItem = new TreeGridItem(lName);
        lItem.Expanded = true;
        if (lName == "[2]Name12") { it = lItem; };
        aParent.Children.Add(lItem);
        if (aLevel < arr.Length)
            for (int i = 0; i < arr[aLevel]; i++)
                CreateItem(lItem, aBaseName + i.ToString(), aLevel + 1);
    }


    void CreateTree()
    {
        TreeGridItem lRoot = new TreeGridItem();
        CreateItem(lRoot, "Name", 0);


        Application.Instance.Invoke(delegate
        {
            tv.DataStore = lRoot;
        });
    }

    public MainForm()
    {
        Size = new Size(900, 800);
        var lp = new Panel();
        this.AddDockedControl(lp, new Padding(5));
        var lPanelLayout = new TableLayout(lp, 1, 2);
        lPanelLayout.Padding = new Padding(0);
        var lButton = new Button();
        lButton.Text = "Select Item";
        lButton.Click += but_Click;

        lPanelLayout.Add(lButton, 0, 0);

        tv = new TreeGridView();
        tv.Columns.Add(new GridColumn { DataCell = new TextBoxCell(0) });
        lPanelLayout.Add(tv, 0, 1, true, true);
        CreateTree();
    }

    void but_Click(object sender, EventArgs e)
    {
        MessageBox.Show( "'"+it.Values[0]+"' item should be selected");
        tv.SelectedItem = it;
    }

}

}

TreeGridView.SelectedItem should reveal item

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.IO;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Generator generator;
if (EtoEnvironment.Platform.IsWindows) {
generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");
}
else if (EtoEnvironment.Platform.IsMac)
{
generator = Generator.GetGenerator("Eto.Platform.Mac.Generator, Eto.Platform.Mac");
}
else
{
generator = Generator.GetGenerator("Eto.Platform.GtkSharp.Generator, Eto.Platform.Gtk");
}

        var app = new TestApplication(generator);
        app.Run(args);
    }
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }

}

public class MyTreeGridItem : TreeGridItem
{ 
   public Icon MyImage  { get; set; }
   public String MyCaption { get; set; }

}

public class MainForm : Form
{
    int[] arr = new int[] { 5, 5,5 };
    TreeGridView tv;
    TreeGridItem it;
    Icon ic;


    void CreateItem(TreeGridItem aParent, string aBaseName, int aLevel)
    {
        var lName = "[" + aLevel + "]" + aBaseName;
        var lItem = new MyTreeGridItem { MyImage = ic, MyCaption = lName };
        lItem.Expanded = aLevel == 0;
        if (lName == "[3]Name202") { it = lItem; };
        aParent.Children.Add(lItem);
        if (aLevel < arr.Length)
            for (int i = 0; i < arr[aLevel]; i++)
                CreateItem(lItem, aBaseName + i.ToString(), aLevel + 1);
    }


    void CreateTree()
    {
        TreeGridItem lRoot = new TreeGridItem();
        CreateItem(lRoot, "Name", 0);
        lRoot.Expanded = true;

        Application.Instance.Invoke(delegate
        {
            tv.DataStore = lRoot;
        });
    }

    public MainForm()
    {
        // black.ico is added into project as "Embedded resource"
        ic = Icon.FromResource("DocsEditor.black.ico");
        Size = new Size(500, 600);
        var fMainSplitter = new Splitter { Orientation = SplitterOrientation.Horizontal, FixedPanel = SplitterFixedPanel.Panel1 };
        this.AddDockedControl(fMainSplitter, new Padding(5));
        fMainSplitter.Panel1 = new Panel();
        var lPanelLayout = new TableLayout(fMainSplitter.Panel1 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);

        tv = new TreeGridView();
        tv.Columns.Add(new GridColumn { DataCell = new ImageTextCell("MyImage", "MyCaption") });
        lPanelLayout.Add(tv, 0, 0, true, true);

        fMainSplitter.Panel2 = new Panel();
        lPanelLayout = new TableLayout(fMainSplitter.Panel2 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);
        var btn = new Button { Text = "Set SelectedItem" };
        lPanelLayout.Add(btn, 0, 0, false, false);
        btn.Click += (sender, e) => { tv.SelectedItem = it; };

        fMainSplitter.Position = 250;
        CreateTree();
    }
}

}

Could not detect platform

Hi,

I just checked out Eto and tried the tutorial, but it fails to start up with this error message:

Eto.EtoException: Could not detect platform. Are you missing a platform assembly?
at Eto.Generator.get_Detect () [0x00091] in /Users/ash/Projekte/MonoDevelop/Eto/Source/Eto/Generator.cs:88
at Eto.Forms.Application..ctor () [0x00000] in :0
at Tutorial1.MainClass.Main (System.String[] args) [0x00006] in /Users/ash/Projekte/MonoDevelop/Eto/Tutorials/Tutorial1 - Hello World/Main.cs:21

I'm running MacOS X 107.4, Mono 10.9 and MonoDevelop 3.0

Create test application to test all controls

Should have sections for each type of control.

Each section should test the various modes, attributes, etc of the control.

Optionally include sections with sliders/check boxes to change options at runtime.

Mac: Problem with TabControl and multiline tabs

all tabs are put in one line


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var generator = Generator.GetGenerator("Eto.Platform.Mac.Generator, Eto.Platform.Mac");

            var app = new TestApplication(generator);
            app.Run(args);
        }
    }

    public class TestApplication : Application
    {
        public TestApplication(Generator generator)
            : base(generator)
        {
            this.Name = "Test Application";
        }

        public override void OnInitialized(EventArgs e)
        {
            this.MainForm = new MainForm();
            HandleEvent(Application.TerminatingEvent);

            base.OnInitialized(e);

            // show the main form
            this.MainForm.Show();
        }

    }


    public class MainForm : Form
    {
        TabControl pg;


        public MainForm()
        {
            Size = new Size(900, 800);
            var lp = new Panel();
            this.AddDockedControl(lp, new Padding(5));
            var lPanelLayout = new TableLayout(lp, 1, 2);
            lPanelLayout.Padding = new Padding(0);

            pg = new TabControl();
            lPanelLayout.Add(pg, 0, 1, true, true);
            for (int i = 0; i < 20; i++) {
                var p = new TabPage();
                p.Text =  "page " + i.ToString();
                pg.TabPages.Add(p);
            };            
        }

    }
}

Graphics.DrawText() on WPF not working.

When executing the following code, while the Generator is set to Eto.Platform.Wpf text does not get drawn.

var Screen = new Drawable();
Screen.Paint += (sender, e) =>
{
    e.Graphics.DrawRectangle(Color.Red, new Rectangle(0, 0, 320, 240));
    e.Graphics.DrawText(new Font(SystemFont.Default), Color.Blue, 10, 10, "Hello World!");
};

While the Generator is set to Eto.Platform.Windows (I cannot test the others now) it works as expected and draws a "Hello World!" into the Drawable.

Looking into the source code I see its commented out/not implemented.

Tutorials don't work on MacOS X 10.7.4

Unfortunately, the tutorials from git don't work for me.

Either an error message pops up saying that the platform could not be detected, or the program simply quits without ever showing a gui.

Could you please provide a step by step guide for MacOS X with Monodevelop 3.0 or at least provide a working tutorial.

Implement Windows RT platform

It would be nice at some point if this project implemented windows rt back end. This would be similar to the iOS (#3) and Android (#4) back ends.

raise exception if incorrect resource name is specified

    public class Icon : Image
    {

..
public static Icon FromResource (Assembly asm, string resourceName)
{
if (asm == null)
asm = Assembly.GetCallingAssembly ();
using (var stream = Resources.GetResource (resourceName, asm)) {
return new Icon (stream);
}
}

Horizontal scaling doesn't work correctly

it works only if WPF generator is set : http://screencast.com/t/rQntzuvM0d3
and doesn't work for windows/mac generator: http://screencast.com/t/sAb8Ryd8Ix

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.IO;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Generator generator;
if (EtoEnvironment.Platform.IsWindows)
{
//generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");
generator = Generator.GetGenerator("Eto.Platform.Windows.Generator, Eto.Platform.Windows");
}
else if (EtoEnvironment.Platform.IsMac)
{
generator = Generator.GetGenerator("Eto.Platform.Mac.Generator, Eto.Platform.Mac");
}
else
{
generator = Generator.GetGenerator("Eto.Platform.GtkSharp.Generator, Eto.Platform.Gtk");
}

        var app = new TestApplication(generator);
        app.Run(args);
    }
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }

}


public class MainForm : Form
{

    public MainForm()
    {
        Title = "Generator = " + Generator.ID;
        Size = new Size(500, 100);
        var p = new Panel();            
        this.AddDockedControl(p, new Padding(5));            
        var lPanelLayout = new TableLayout(p as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);

        var btn = new Button { Text = "btn" };
        lPanelLayout.Add(btn, 0, 0, false, false);
    }
}

}

using of virtual property causes System.Reflection.TargetInvocationException

A first chance exception of type 'System.Reflection.TargetException' occurred in mscorlib.dll
A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in System.dll
An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in System.dll

Additional information: Property accessor 'MyImage' on object 'etotest.MyTreeGridItem' threw the following exception:'Object does not match target type.'

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.IO;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Generator generator;
if (EtoEnvironment.Platform.IsWindows) {
generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");
}
else if (EtoEnvironment.Platform.IsMac)
{
generator = Generator.GetGenerator("Eto.Platform.Mac.Generator, Eto.Platform.Mac");
}
else
{
generator = Generator.GetGenerator("Eto.Platform.GtkSharp.Generator, Eto.Platform.Gtk");
}

        var app = new TestApplication(generator);
        app.Run(args);
    }
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }

}

public class MyTreeGridItem : TreeGridItem
{ 
   public virtual Icon MyImage  { get; set; }
   public String MyCaption { get; set; }
}

public class MyTreeGridItem1 : MyTreeGridItem
{
    public override Icon MyImage { get; set; }
}


public class MainForm : Form
{
    int[] arr = new int[] { 5, 5 };
    TreeGridView tv;
    TreeGridItem it;
    Icon ic;


    void CreateItem1(TreeGridItem aParent, string aBaseName, int aLevel)
    {
        var lName = "[" + aLevel + "]" + aBaseName;
        var lItem = new MyTreeGridItem { MyImage = ic, MyCaption = lName };
        lItem.Expanded = false;

        aParent.Children.Add(lItem);
    }


    void CreateItem(TreeGridItem aParent, string aBaseName, int aLevel)
    {
        var lName = "[" + aLevel + "]" + aBaseName;
        var lItem = new MyTreeGridItem1 { MyImage = ic, MyCaption = lName };
        lItem.Expanded = true;

        aParent.Children.Add(lItem);
        if (aLevel < arr.Length)
            for (int i = 0; i < arr[aLevel]; i++)
                CreateItem1(lItem, aBaseName + i.ToString(), aLevel + 1);
    }


    void CreateTree()
    {
        TreeGridItem lRoot = new TreeGridItem();
        CreateItem(lRoot, "Name", 0);
        lRoot.Expanded = true;

        Application.Instance.Invoke(delegate
        {
            tv.DataStore = lRoot;
        });
    }

    public MainForm()
    {
        // black.ico is added into project as "Embedded resource"
        ic = Icon.FromResource("DocsEditor.black.ico");
        Size = new Size(350, 600);
        var fMainSplitter = new Splitter { Orientation = SplitterOrientation.Horizontal, FixedPanel = SplitterFixedPanel.Panel1 };
        this.AddDockedControl(fMainSplitter, new Padding(5));
        fMainSplitter.Panel1 = new Panel();
        var lPanelLayout = new TableLayout(fMainSplitter.Panel1 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);

        tv = new TreeGridView();
        tv.Columns.Add(new GridColumn { DataCell = new ImageTextCell("MyImage", "MyCaption") });
        lPanelLayout.Add(tv, 0, 0, true, true);

        fMainSplitter.Panel2 = new Panel();
        lPanelLayout = new TableLayout(fMainSplitter.Panel2 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);
        var btn = new Button { Text = "create tree" };
        lPanelLayout.Add(btn, 0, 0, false, false);
        btn.Click += (sender, e) => { CreateTree(); };

        fMainSplitter.Position = 150;

    }
}

}

TreeGridView.Invalidate doesn't work

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
var generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");

        var app = new TestApplication(generator);
        app.Run(args);
    }
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }

}

public class MainForm : Form
{
    int[] arr = new int[] { 5, 5 };
    TreeGridView tv;
    TreeGridItem it;

    void CreateItem(TreeGridItem aParent, string aBaseName, int aLevel)
    {
        var lName = "[" + aLevel + "]" + aBaseName;
        var lItem = new TreeGridItem(lName);
        lItem.Expanded = true;
        if (lName == "[1]Name1") { it = lItem; };
        aParent.Children.Add(lItem);
        if (aLevel < arr.Length)
            for (int i = 0; i < arr[aLevel]; i++)
                CreateItem(lItem, aBaseName + i.ToString(), aLevel + 1);
    }


    void CreateTree()
    {
        TreeGridItem lRoot = new TreeGridItem();
        CreateItem(lRoot, "Name", 0);


        Application.Instance.Invoke(delegate
        {
            tv.DataStore = lRoot;
        });
    }

    public MainForm()
    {
        Size = new Size(900, 800);
        var lp = new Panel();
        this.AddDockedControl(lp, new Padding(5));
        var lPanelLayout = new TableLayout(lp, 1, 2);
        lPanelLayout.Padding = new Padding(0);
        var lButton = new Button();
        lButton.Text = "Select Item";
        lButton.Click += but_Click;

        lPanelLayout.Add(lButton, 0, 0);

        tv = new TreeGridView();
        tv.Columns.Add(new GridColumn { DataCell = new TextBoxCell(0) });
        lPanelLayout.Add(tv, 0, 1, true, true);
        CreateTree();
    }

    void but_Click(object sender, EventArgs e)
    {
        MessageBox.Show( "'"+it.Values[0]+"' item will be renamed to 'test'");
        it.Values[0] = "test";
        tv.Invalidate();           
    }
}

}

Note: probably this code should work without tv.Invalidate()

Implement iOS platform

Partially written. Will require that the other Mobile-specific controls, events, etc be implemented.

WebView - required basic features

Ok I finally had some time to work on my current open source project and played around with the webview control. The rendering is nice and fast, the basic functions of the control are working flawlessly on OSX Lion. However the events are missing completely, so I took some time to write together the most basic features the webview control would need in order to be ready to be used.

  • event: started loading a page (should be called on pretty much every click of a button or link)
  • event: progress changed (not as important as the other ones but people will need that one sooner or later)
  • event: finished loading a page (for obvious reasons, maybe even add a separate domready event)
  • event: page popup request (to be able to handle the popup by either creating a new webview instance or blocking it)
  • event: page title changed (to update the form title or something if necessary)
  • fuction: sending JavaScript to the page

Those would be the most basic things for the control to be ready to be used in a project, DOM interaction and things like that aren't quite as important, but basic JavaScript functionality should be possible. It might be possible to inject JavaScript by changing the URL of the browser, but I don't know in how far that works on the different platforms.

Provide a UI designer

What bugs me a little bit about this new (and really cool!) UI toolkit is the fact, that there is no designer available.

I really like WinForms designer and to minor extent the Xcode Interface Builder.

It makes life so much easier in many cases, if you simply can drag widgets to a form and change their properties in a property panel.

I see these options:

  • Implement a new designer app
  • Create a converter, e.g to convert XIB files, WinForms Designer code etc
  • Use existing designers, eg wxFormBuilder or Stetic GTK Designer

This would greatly improve productivity

Problems with TreeGridView.SelectedItem

  1. start testcase, collapse [2]Name20 item. press button. [3]Name202 will be shown but without selection mark
  2. I think, that when parent is collapsed, it should be set as selected (Windows has the same behavior)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.IO;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Generator generator;
if (EtoEnvironment.Platform.IsWindows)
{
generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");
}
else if (EtoEnvironment.Platform.IsMac)
{
generator = Generator.GetGenerator("Eto.Platform.Mac.Generator, Eto.Platform.Mac");
}
else
{
generator = Generator.GetGenerator("Eto.Platform.GtkSharp.Generator, Eto.Platform.Gtk");
}

        var app = new TestApplication(generator);
        app.Run(args);
    }
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }

}

public class MyTreeGridItem : TreeGridItem
{
    public Icon MyImage { get; set; }
    public String MyCaption { get; set; }

}

public class MainForm : Form
{
    int[] arr = new int[] { 5, 5, 5 };
    TreeGridView tv;
    TreeGridItem it;
    Icon ic;


    void CreateItem(TreeGridItem aParent, string aBaseName, int aLevel)
    {
        var lName = "[" + aLevel + "]" + aBaseName;
        var lItem = new MyTreeGridItem { MyImage = ic, MyCaption = lName };
        lItem.Expanded = aLevel == 0;
        if (lName == "[3]Name202") { it = lItem; };
        aParent.Children.Add(lItem);
        if (aLevel < arr.Length)
            for (int i = 0; i < arr[aLevel]; i++)
                CreateItem(lItem, aBaseName + i.ToString(), aLevel + 1);
    }


    void CreateTree()
    {
        TreeGridItem lRoot = new TreeGridItem();
        CreateItem(lRoot, "Name", 0);
        lRoot.Expanded = true;

        Application.Instance.Invoke(delegate
        {
            tv.DataStore = lRoot;
        });
    }

    public MainForm()
    {
        // black.ico is added into project as "Embedded resource"
        ic = Icon.FromResource("DocsEditor.black.ico");
        Size = new Size(500, 600);
        var fMainSplitter = new Splitter { Orientation = SplitterOrientation.Horizontal, FixedPanel = SplitterFixedPanel.Panel1 };
        this.AddDockedControl(fMainSplitter, new Padding(5));
        fMainSplitter.Panel1 = new Panel();
        var lPanelLayout = new TableLayout(fMainSplitter.Panel1 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);

        tv = new TreeGridView();
        tv.Columns.Add(new GridColumn { DataCell = new ImageTextCell("MyImage", "MyCaption") });
        lPanelLayout.Add(tv, 0, 0, true, true);

        fMainSplitter.Panel2 = new Panel();
        lPanelLayout = new TableLayout(fMainSplitter.Panel2 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);
        var btn = new Button { Text = "Set SelectedItem" };
        lPanelLayout.Add(btn, 0, 0, false, false);
        btn.Click += (sender, e) => { tv.SelectedItem = it; };

        fMainSplitter.Position = 250;
        CreateTree();
        tv.SelectedItem = it;
    }
}

}

Commenting

Should provide descriptive comments for all (public facing) code

Implement Android platform

Should use Mono for Android or wait for Xamarin's version when released. Probably will be very compatible with each other so work would not be wasted as such.

new TreeGridView has wrong level items

Using the code below creates a tree like:
http://i.imgur.com/2P7XL.png

which has level1 and level2 items between level3 (which shouldn't be possible with this logic)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");

            var app = new TestApplication(generator);
            app.Run(args);
        }
    }

    public class TestApplication : Application
    {
        public TestApplication(Generator generator)
            : base(generator)
        {
            this.Name = "Test Application";
        }

        public override void OnInitialized(EventArgs e)
        {
            this.MainForm = new MainForm();
            HandleEvent(Application.TerminatingEvent);

            base.OnInitialized(e);

            // show the main form
            this.MainForm.Show();
        }

    }

    public class MainForm : Form
    {
        TreeGridView tv;

        TreeGridItem CreateTree()
        {
            Random rv = new Random();
            TreeGridItem res = new TreeGridItem("root");
            for (int i = 0; i < 1000; i++)
            {
                var item = new TreeGridItem( "level1_"+i);
                item.Expanded = true;
                res.Children.Add(item);

                for (int j = 0; j < 15; j++)
                {
                    var lItem = new TreeGridItem(Enumerable.Range(0, rv.Next(0, 100)).Select(a => new TreeGridItem("level3_" + a)), "level2_" + j);
                    item.Children.Add(lItem);
                    lItem.Expanded = true;
                }
            }
            return res;
        }

        public MainForm()
        {
            this.Title = "Test Application";
            this.Style = "main";
            this.ClientSize = new Size(900, 650);

            tv = new TreeGridView();
            var col = new GridColumn { DataCell = new TextBoxCell(0) };
            tv.Columns.Add(col);

            this.AddDockedControl(tv);
            var tree = CreateTree();
            tv.DataStore = tree;
            tv.Expanding += Expanding;
        }
        int expanding; 
        void Expanding(object o, EventArgs e)
        {
            expanding++;
            Title = "Expanded " + expanding;
        }
    }
}

Mac: incorrect column width in TreeGridView

http://screencast.com/t/cl2IyRC3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.IO;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Generator generator;
if (EtoEnvironment.Platform.IsWindows) {
generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");
}
else if (EtoEnvironment.Platform.IsMac)
{
generator = Generator.GetGenerator("Eto.Platform.Mac.Generator, Eto.Platform.Mac");
}
else
{
generator = Generator.GetGenerator("Eto.Platform.GtkSharp.Generator, Eto.Platform.Gtk");
}

        var app = new TestApplication(generator);
        app.Run(args);
    }
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }

}

public class MyTreeGridItem : TreeGridItem
{ 
   public Icon MyImage  { get; set; }
   public String MyCaption { get; set; }
}

public class MainForm : Form
{
    int[] arr = new int[] { 5, 5 };
    TreeGridView tv;
    TreeGridItem it;
    Icon ic;

    void CreateItem(TreeGridItem aParent, string aBaseName, int aLevel)
    {
        var lName = "[" + aLevel + "]" + aBaseName;
        var lItem = new MyTreeGridItem { MyImage = ic, MyCaption = lName };
        lItem.Expanded = true;

        if (lName == "[1]Name1") { it = lItem; };
        aParent.Children.Add(lItem);
        if (aLevel < arr.Length)
            for (int i = 0; i < arr[aLevel]; i++)
                CreateItem(lItem, aBaseName + i.ToString(), aLevel + 1);
    }


    void CreateTree()
    {
        TreeGridItem lRoot = new TreeGridItem();
        CreateItem(lRoot, "Name", 0);
        lRoot.Expanded = true;

        Application.Instance.Invoke(delegate
        {
            tv.DataStore = lRoot;
        });
    }

    public MainForm()
    {
        // black.ico is added into project as "Embedded resource"
        ic = Icon.FromResource("DocsEditor.black.ico");
        Size = new Size(350, 600);
        var fMainSplitter = new Splitter { Orientation = SplitterOrientation.Horizontal, FixedPanel = SplitterFixedPanel.Panel1 };
        this.AddDockedControl(fMainSplitter, new Padding(5));
        fMainSplitter.Panel1 = new Panel();
        var lPanelLayout = new TableLayout(fMainSplitter.Panel1 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);

        tv = new TreeGridView();
        tv.Columns.Add(new GridColumn { DataCell = new ImageTextCell("MyImage", "MyCaption") });
        lPanelLayout.Add(tv, 0, 0, true, true);

        fMainSplitter.Panel2 = new Panel();
        lPanelLayout = new TableLayout(fMainSplitter.Panel2 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);
        var btn = new Button { Text = "create tree" };
        lPanelLayout.Add(btn, 0, 0, false, false);
        btn.Click += (sender, e) => { CreateTree(); };

        fMainSplitter.Position = 150;

    }
}

}

Implement mobile-centric events and controls

Current controls should be updated to include mobile-centric events and controls.

This includes things like OnRotationChanged, Navigation Controller, etc. Need to think of a common metaphor across platforms.

Use late binding of data

Currently the items are added to collections for drop downs, listbox, etc. These should be late bound by events or a data source object.

The API should be super simple to use.

Use Cairo as drawing backend

GTK platform uses GDK for drawing lines, rects, etc. Drawback with this is there is not antialiasing support.

Should use Cairo for drawing for better quality drawing of primitives.

Implement a Binding System

A very welcomed addition would be the implementation of a Binding System so we can develop our Applications using fancy design patterns like Model-View-ViewModel. This would significantly increase the speed at which we could develop our UIs and also would lower the amount of code required for GUI heavy applications.

Bitmap vs PNG resource files sizing differently on Mac

When loading a BMP or PNG file on windows into an image view, the correct size is displayed for both types of images. On mac, the BMP will show up as it's actual size (450px by 450px), but the PNG will show up as a samller size (337,337).

Add easier layouts

The TableLayout is a little cumbersome to use, and should be much easier. Key pain point is having to know the size of the table up front and having to change it each time more controls are added.

Should perhaps have a vertical/horizontal layout as well, or make it easier to use.

Current code (as an example):

var layout = new TableLayout(this, 1, 2);
layout.Add(new MyControl(), 0, 0);
layout.Add(new MyControl(), 0, 1);
layout.Add(new MyControl(), 0, 2);
layout.Add(new MyControl(), 0, 3);
layout.Add(new MyControl(), 0, 4);

Maybe something like:

var layout = new VerticalLayout(this);
layout.Add(new MyControl());
layout.Add(new MyControl());
layout.Add(new MyControl());
layout.Add(new MyControl());
layout.Add(new MyControl());

TreeGridView doesn't update items after Expanding/Collapsing event

windows/wpf

launch testcase and "play" with tree - expand and collapse some nodes

testcase:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
var generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");

        var app = new TestApplication(generator);
        app.Run(args);
    }
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }

}

public interface IMyTreeGridItem : ITreeGridItem
{
    String Name { get; set; }
}

public class MyTreeGridItem : TreeGridItem, IMyTreeGridItem
{
    public String Name { get; set; }
}

public class MainForm : Form
{
    int[] arr = new int[] { 5, 5, 5, 5 };
    TreeGridView tv;

    void CreateItem(TreeGridItem aParent, string aBaseName, int aLevel)
    {
        var lName = "[" + aLevel + "]" + aBaseName;
        var lItem = new MyTreeGridItem();
        lItem.Name = lName;
        aParent.Children.Add(lItem);
        if (aLevel < arr.Length)
            for (int i = 0; i < arr[aLevel]; i++)
                CreateItem(lItem, aBaseName + i.ToString(), aLevel + 1);
    }


    void CreateTree()
    {
        TreeGridItem lRoot = new MyTreeGridItem();
        CreateItem(lRoot, "Name", 0);

        Application.Instance.Invoke(delegate
        {
            tv.DataStore = lRoot;

            tv.Expanding += (sender, e) =>
            {
                (e.Item as IMyTreeGridItem).Name = "Expanded";
            };

            tv.Collapsing += (sender, e) =>
            {
                (e.Item as IMyTreeGridItem).Name = "Collapsed";
            };
        });


    }

    public MainForm()
    {
        Size = new Size(900, 800);
        var lp = new Panel();
        this.AddDockedControl(lp, new Padding(5));
        var lPanelLayout = new TableLayout(lp, 1, 2);
        lPanelLayout.Padding = new Padding(0);

        tv = new TreeGridView();
        tv.Columns.Add(new GridColumn { DataCell = new TextBoxCell("Name") });
        lPanelLayout.Add(tv, 0, 1, true, true);
        CreateTree();
    }

}

}

Expanded property isn't updated after expanding/collapsing of node

http://screencast.com/t/oBKAXAUIq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.IO;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Generator generator;
if (EtoEnvironment.Platform.IsWindows) {
generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");
}
else if (EtoEnvironment.Platform.IsMac)
{
generator = Generator.GetGenerator("Eto.Platform.Mac.Generator, Eto.Platform.Mac");
}
else
{
generator = Generator.GetGenerator("Eto.Platform.GtkSharp.Generator, Eto.Platform.Gtk");
}

        var app = new TestApplication(generator);
        app.Run(args);
    }
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }

}

public class MyTreeGridItem : TreeGridItem
{ 
   String fcaption;
   public Icon MyImage  { get; set; }
   public String MyCaption { get {if (this.Expanded) {return  fcaption+" [Expanded]";} else {return  fcaption;}} set {fcaption = value;} }

}

public class MainForm : Form
{
    int[] arr = new int[] { 5, 5,5 };
    TreeGridView tv;
    TreeGridItem it;
    Icon ic;

    void CreateItem(TreeGridItem aParent, string aBaseName, int aLevel)
    {
        var lName = "[" + aLevel + "]" + aBaseName;
        var lItem = new MyTreeGridItem { MyImage = ic, MyCaption = lName };
        lItem.Expanded = aLevel == 0;

        aParent.Children.Add(lItem);
        if (aLevel < arr.Length)
            for (int i = 0; i < arr[aLevel]; i++)
                CreateItem(lItem, aBaseName + i.ToString(), aLevel + 1);
    }


    void CreateTree()
    {
        TreeGridItem lRoot = new TreeGridItem();
        CreateItem(lRoot, "Name", 0);
        lRoot.Expanded = true;

        Application.Instance.Invoke(delegate
        {
            tv.DataStore = lRoot;
        });
    }

    public MainForm()
    {
        // black.ico is added into project as "Embedded resource"
        ic = Icon.FromResource("DocsEditor.black.ico");
        Size = new Size(500, 600);
        var fMainSplitter = new Splitter { Orientation = SplitterOrientation.Horizontal, FixedPanel = SplitterFixedPanel.Panel1 };
        this.AddDockedControl(fMainSplitter, new Padding(5));
        fMainSplitter.Panel1 = new Panel();
        var lPanelLayout = new TableLayout(fMainSplitter.Panel1 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);

        tv = new TreeGridView();
        tv.Columns.Add(new GridColumn { DataCell = new ImageTextCell("MyImage", "MyCaption") });
        lPanelLayout.Add(tv, 0, 0, true, true);

        fMainSplitter.Panel2 = new Panel();
        lPanelLayout = new TableLayout(fMainSplitter.Panel2 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);
        var btn = new Button { Text = "check expanded" };
        lPanelLayout.Add(btn, 0, 0, false, false);
        btn.Click += (sender, e) => { if (tv.SelectedItem != null) { MessageBox.Show("Expanded = " + tv.SelectedItem.Expanded.ToString()); } };

        fMainSplitter.Position = 250;
        CreateTree();
    }
}

}

Printing Support

Should add mechanisms to support printing. Should support print dialog, and specify what to print either through a graphics context or a window of controls.

Need to ensure WebView supports printing as well through javascript.

Problems with collapsing of node in TreeGridView

http://screencast.com/t/au5x2iGOq1w

2 problems:

  1. at expanding, node loses selection mark
  2. at collansing, it produces error:
    An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll

Additional information: Index was out of range. Must be non-negative and less than the size of the collection.

testcase is below:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.IO;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Generator generator;
if (EtoEnvironment.Platform.IsWindows)
{
generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");
}
else if (EtoEnvironment.Platform.IsMac)
{
generator = Generator.GetGenerator("Eto.Platform.Mac.Generator, Eto.Platform.Mac");
}
else
{
generator = Generator.GetGenerator("Eto.Platform.GtkSharp.Generator, Eto.Platform.Gtk");
}

        var app = new TestApplication(generator);
        app.Run(args);
    }
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }

}


public class MainForm : Form
{
    int[] arr = new int[] { 5, 5, 5 };
    TreeGridView tv;
    TreeGridItem it;
    public Icon ic, ic1;
    public Boolean lstate;


    public class MyTreeGridItem : TreeGridItem
    {
        public Icon MyImage { get 
            {
                if ((Application.Instance.MainForm as MainForm).lstate)
                { return (Application.Instance.MainForm as MainForm).ic;  }
                else
                { return (Application.Instance.MainForm as MainForm).ic1; }
            } 
        }
        public String MyCaption { get; set; }

    }

    void CreateItem(TreeGridItem aParent, string aBaseName, int aLevel)
    {
        var lName = "[" + aLevel + "]" + aBaseName;
        var lItem = new MyTreeGridItem { MyCaption = lName };
        lItem.Expanded = aLevel == 0;
        if (lName == "[2]Name20") { it = lItem; };
        aParent.Children.Add(lItem);
        if (aLevel < arr.Length)
            for (int i = 0; i < arr[aLevel]; i++)
                CreateItem(lItem, aBaseName + i.ToString(), aLevel + 1);
    }


    void CreateTree()
    {
        TreeGridItem lRoot = new TreeGridItem();
        CreateItem(lRoot, "Name", 0);
        lRoot.Expanded = true;

        Application.Instance.Invoke(delegate
        {
            tv.DataStore = lRoot;
        });
    }

    public MainForm()
    {
        // icos are added into project as "Embedded resource"
        ic = Icon.FromResource("DocsEditor.black.ico");
        ic1 = Icon.FromResource("DocsEditor.green.ico");
        Size = new Size(500, 600);
        var fMainSplitter = new Splitter { Orientation = SplitterOrientation.Horizontal, FixedPanel = SplitterFixedPanel.Panel1 };
        this.AddDockedControl(fMainSplitter, new Padding(5));
        fMainSplitter.Panel1 = new Panel();
        var lPanelLayout = new TableLayout(fMainSplitter.Panel1 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);

        tv = new TreeGridView();
        tv.Columns.Add(new GridColumn { DataCell = new ImageTextCell("MyImage", "MyCaption") });
        lPanelLayout.Add(tv, 0, 0, true, true);

        fMainSplitter.Panel2 = new Panel();
        lPanelLayout = new TableLayout(fMainSplitter.Panel2 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);
        var btn = new Button { Text = "Set SelectedItem" };
        lPanelLayout.Add(btn, 0, 0, false, false);
        btn.Click += (sender, e) => { 
                lstate = !lstate;
                tv.Focus();
                (tv.SelectedItem as MyTreeGridItem).MyCaption = (tv.SelectedItem as MyTreeGridItem).MyCaption + '*';
                tv.Invalidate();
        };

        fMainSplitter.Position = 250;
        CreateTree();
        tv.SelectedItem = it;
    }
}

}

Problem with resizing of Combobox

try ro move splitter: combobox isn't resized correctly

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Eto;
using Eto.IO;
using Eto.Forms;
using Eto.Drawing;
using System.Threading;

namespace etotest
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Generator generator;
if (EtoEnvironment.Platform.IsWindows) {
generator = Generator.GetGenerator("Eto.Platform.Wpf.Generator, Eto.Platform.Wpf");
}
else if (EtoEnvironment.Platform.IsMac)
{
generator = Generator.GetGenerator("Eto.Platform.Mac.Generator, Eto.Platform.Mac");
}
else
{
generator = Generator.GetGenerator("Eto.Platform.GtkSharp.Generator, Eto.Platform.Gtk");
}

        var app = new TestApplication(generator);
        app.Run(args);
    }
}

public class TestApplication : Application
{
    public TestApplication(Generator generator)
        : base(generator)
    {
        this.Name = "Test Application";
    }

    public override void OnInitialized(EventArgs e)
    {
        this.MainForm = new MainForm();
        HandleEvent(Application.TerminatingEvent);

        base.OnInitialized(e);

        // show the main form
        this.MainForm.Show();
    }

}


public class MainForm : Form
{
    ComboBox cb;

    public MainForm()
    {
        Size = new Size(500, 200);
        var fMainSplitter = new Splitter { Orientation = SplitterOrientation.Horizontal, FixedPanel = SplitterFixedPanel.Panel1 };
        fMainSplitter.BackgroundColor = Colors.Gray;
        this.AddDockedControl(fMainSplitter, new Padding(5));
        fMainSplitter.Panel1 = new Panel();
        var lPanelLayout = new TableLayout(fMainSplitter.Panel1 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);

        cb = new ComboBox();
        cb.Items.Add("1");
        cb.Items.Add("2");
        cb.Items.Add("3");
        cb.SelectedIndex =0;
        lPanelLayout.Add(cb, 0, 0, true, false);

        fMainSplitter.Panel2 = new Panel();


        lPanelLayout = new TableLayout(fMainSplitter.Panel2 as Panel, 1, 1);
        lPanelLayout.Padding = new Padding(0);


        fMainSplitter.Position = 100;

    }
}

}

Tabbed MDI interface

It would be great if the tab pages could support a "close button" and ways to deal with closing tabs with it; this would be a very nice base for a tabbed MDI interface written with Eto.

TreeGridView: Collapsing of selected node shouln't produce SelectionChanged event

Eto\Source\Eto.Test\Eto.Test.WinForms\bin\Debug\Eto.Test.WinForms.exe

[12:39:45] Sender: Eto.Forms.TreeGridView, Collapsing, Item: Eto.Forms.TreeGridItem
[12:39:45] Sender: Eto.Forms.TreeGridView, Collapsed, Item: Eto.Forms.TreeGridItem
[12:39:45] Sender: Eto.Forms.TreeGridView, SelectionChanged, Item: Eto.Forms.TreeGridItem
[12:39:45] Sender: Eto.Forms.TreeGridView, SelectionChanged, Item: Eto.Forms.TreeGridItem

Add support for adding generic widgets to the toolbar

Currently I'm trying to add a textbox (searchbox like in many other MacOS X apps) to the toolbar. So far I haven't managed to do so.

Additionally, it would be nice to the be able to set the style (e.g. rounded corners for textboxes, button look for toolbar buttons etc)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.