82 lines
2.4 KiB
C#
82 lines
2.4 KiB
C#
using bts.spark;
|
|
using mbts.spark;
|
|
using mbts.ui;
|
|
using mbts.ui.settings;
|
|
using mbts.ui.shell;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel.Composition;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Media;
|
|
|
|
namespace bts.ui {
|
|
[Export(typeof(IShellModule))]
|
|
public class BookmarkShellModule : ILazyMenuModule {
|
|
readonly WindowManager _wm;
|
|
readonly IBookmarks _bookmarks;
|
|
readonly ISavedWindowFactory _window_factory;
|
|
readonly WorkspacesModel _workspaces;
|
|
|
|
[ImportingConstructor]
|
|
public BookmarkShellModule(
|
|
WorkspacesModel workspaces,
|
|
WindowManager wm,
|
|
IBookmarks bm,
|
|
ISavedWindowFactory swf) {
|
|
_workspaces = workspaces;
|
|
_wm = wm;
|
|
_bookmarks = bm;
|
|
_window_factory = swf;
|
|
}
|
|
|
|
public ImageSource icon => Icons.Bookmarks;
|
|
|
|
public string name => "My Windows";
|
|
|
|
public int priority => 35;
|
|
|
|
public IEnumerable<SparkCommand> actions {
|
|
get {
|
|
// The windows that are open
|
|
var open =
|
|
_wm.list_documents()
|
|
.Select(td => td.ViewModel)
|
|
.Where(vm => vm.HasCustomTitle)
|
|
.Select(vm =>
|
|
SparkCommand.create(vm.Title, vm.Icon, SparkTags.ActivateWindow, () => vm.Model))
|
|
.Cast<SparkCommand>();
|
|
|
|
var open_set = new HashSet<string>(open.Select(c => c.title));
|
|
|
|
// The windows that are not open
|
|
var closed =
|
|
_bookmarks.bookmarks
|
|
.Where(state => !open_set.Contains(state.title))
|
|
.Select(state =>
|
|
SparkCommand.create(state.title, Icons.Bookmarks, SparkTags.ShowWindowAsync,
|
|
() => {
|
|
_bookmarks.remove(state);
|
|
return _window_factory.restore(state);
|
|
}))
|
|
.Cast<SparkCommand>();
|
|
|
|
// todo: The windows that are closed
|
|
foreach (var w in open.Concat(closed).OrderBy(w => w.title)) {
|
|
yield return w;
|
|
}
|
|
}
|
|
}
|
|
|
|
public Task<IShellWindow> create(Stream load_stream) {
|
|
// This module shouldn't have any windows
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public void Dispose() { }
|
|
|
|
}
|
|
}
|