Browse Source

Added GTK support for common dialogs

pull/189/head
Nikita Tsukanov 11 years ago
parent
commit
be3ab98ef4
  1. 57
      src/Gtk/Perspex.Gtk/CommonDialogImpl.cs
  2. 2
      src/Gtk/Perspex.Gtk/GtkPlatform.cs
  3. 1
      src/Gtk/Perspex.Gtk/Perspex.Gtk.csproj

57
src/Gtk/Perspex.Gtk/CommonDialogImpl.cs

@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Perspex.Controls;
using Perspex.Controls.Platform;
using Perspex.Platform;
namespace Perspex.Gtk
{
using global::Gtk;
class CommonDialogImpl : ICommonDialogImpl
{
public Task<string[]> ShowAsync(CommonDialog dialog, IWindowImpl parent)
{
var tcs = new TaskCompletionSource<string[]>();
var dlg = new global::Gtk.FileChooserDialog(dialog.Title, ((WindowImpl) parent),
dialog.Action == CommonDialogAction.OpenFile
? FileChooserAction.Open
: FileChooserAction.Save,
"Cancel", ResponseType.Cancel,
"Open", ResponseType.Accept)
{
SelectMultiple = dialog.AllowMultiple,
};
foreach (var filter in dialog.Filters)
{
var ffilter = new FileFilter()
{
Name = filter.Name + " (" + string.Join(";", filter.Extensions.Select(e => "*." + e)) + ")"
};
foreach (var ext in filter.Extensions)
ffilter.AddPattern("*." + ext);
dlg.AddFilter(ffilter);
}
dlg.SetFilename(dialog.InitialFileName);
dlg.Modal = true;
dlg.Response += (_, args) =>
{
if (args.ResponseId == ResponseType.Accept)
tcs.TrySetResult(dlg.Filenames);
dlg.Hide();
dlg.Dispose();
};
dlg.Close += delegate
{
tcs.TrySetResult(null);
dlg.Dispose();
};
dlg.Show();
return tcs.Task;
}
}
}

2
src/Gtk/Perspex.Gtk/GtkPlatform.cs

@ -3,6 +3,7 @@
using System;
using System.Reactive.Disposables;
using Perspex.Controls.Platform;
using Perspex.Input.Platform;
using Perspex.Input;
using Perspex.Platform;
@ -36,6 +37,7 @@ namespace Perspex.Gtk
locator.Register(() => GtkKeyboardDevice.Instance, typeof(IKeyboardDevice));
locator.Register(() => s_instance, typeof(IPlatformSettings));
locator.Register(() => s_instance, typeof(IPlatformThreadingInterface));
locator.Register(() => new CommonDialogImpl(), typeof (ICommonDialogImpl));
SharedPlatform.Register();
}

1
src/Gtk/Perspex.Gtk/Perspex.Gtk.csproj

@ -50,6 +50,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="ClipboardImpl.cs" />
<Compile Include="CommonDialogImpl.cs" />
<Compile Include="CursorFactory.cs" />
<Compile Include="GtkExtensions.cs" />
<Compile Include="PopupImpl.cs" />

Loading…
Cancel
Save