3 changed files with 60 additions and 0 deletions
@ -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; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue