diff --git a/Library/Interfaces/ILibraryItem.cs b/Library/Interfaces/ILibraryItem.cs index c2ebde7cb..dfcc180dc 100644 --- a/Library/Interfaces/ILibraryItem.cs +++ b/Library/Interfaces/ILibraryItem.cs @@ -39,6 +39,8 @@ namespace MatterHackers.MatterControl.Library string Name { get; } bool IsProtected { get; } bool IsVisible { get; } + DateTime DateModified { get; } + DateTime DateCreated { get; } } public interface ILibraryObject3D : ILibraryAsset diff --git a/Library/Providers/CreateFolderItem.cs b/Library/Providers/CreateFolderItem.cs index eb3559199..9ab57de6d 100644 --- a/Library/Providers/CreateFolderItem.cs +++ b/Library/Providers/CreateFolderItem.cs @@ -40,5 +40,9 @@ namespace MatterHackers.MatterControl.Library public bool IsProtected => false; public bool IsVisible => true; + + public DateTime DateCreated { get; } = DateTime.Now; + + public DateTime DateModified { get; } = DateTime.Now; } } diff --git a/Library/Providers/DynamicContainerLink.cs b/Library/Providers/DynamicContainerLink.cs index 183170a9a..ebe7f1a16 100644 --- a/Library/Providers/DynamicContainerLink.cs +++ b/Library/Providers/DynamicContainerLink.cs @@ -42,6 +42,10 @@ namespace MatterHackers.MatterControl.Library public bool IsReadOnly { get; set; } = false; + public DateTime DateCreated { get; } = DateTime.Now; + + public DateTime DateModified { get; } = DateTime.Now; + private ImageBuffer thumbnail; private Func containerCreator; private Func visibilityResolver; diff --git a/Library/Providers/FileSystem/FileSystemContainer.cs b/Library/Providers/FileSystem/FileSystemContainer.cs index bb00fcf6d..e9591a37f 100644 --- a/Library/Providers/FileSystem/FileSystemContainer.cs +++ b/Library/Providers/FileSystem/FileSystemContainer.cs @@ -159,10 +159,11 @@ namespace MatterHackers.MatterControl.Library containers = new List(); } - var matchedFiles = (filter == "") ? nonZipFiles : nonZipFiles.Where(filePath => + var matchedFiles = nonZipFiles.Where(filePath => { string fileName = Path.GetFileName(filePath); - return FileNameContainsFilter(filePath, filter) + + return (filter == "" || FileNameContainsFilter(filePath, filter)) && ApplicationController.Instance.Library.IsContentFileType(fileName); }); diff --git a/Library/Providers/FileSystem/FileSystemItem.cs b/Library/Providers/FileSystem/FileSystemItem.cs index 7419c89ab..e0ddf937d 100644 --- a/Library/Providers/FileSystem/FileSystemItem.cs +++ b/Library/Providers/FileSystem/FileSystemItem.cs @@ -27,6 +27,7 @@ of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project. */ +using System; using System.IO; namespace MatterHackers.MatterControl.Library @@ -48,10 +49,39 @@ namespace MatterHackers.MatterControl.Library public FileSystemItem(string path) { this.Path = path; + + var type = GetType(); + + try + { + if (type == typeof(FileSystemFileItem)) + { + var fileInfo = new FileInfo(path); + + this.DateCreated = fileInfo.CreationTime; + this.DateModified = fileInfo.LastWriteTime; + } + else + { + var directoryInfo = new DirectoryInfo(path); + + this.DateCreated = directoryInfo.CreationTime; + this.DateModified = directoryInfo.LastWriteTime; + } + } + catch + { + this.DateCreated = DateTime.Now; + this.DateModified = DateTime.Now; + } } public virtual string ID => this.Path.GetHashCode().ToString(); + public DateTime DateCreated { get; } + + public DateTime DateModified { get; } + public virtual string Name { get @@ -79,5 +109,9 @@ namespace MatterHackers.MatterControl.Library public bool IsProtected => true; public bool IsVisible => true; + + public DateTime DateCreated { get; } = DateTime.Now; + + public DateTime DateModified { get; } = DateTime.Now; } } diff --git a/Library/Providers/GeneratorItem.cs b/Library/Providers/GeneratorItem.cs index 358456bf3..fc87c68c9 100644 --- a/Library/Providers/GeneratorItem.cs +++ b/Library/Providers/GeneratorItem.cs @@ -100,6 +100,10 @@ namespace MatterHackers.MatterControl.Library public bool IsProtected { get; set; } public bool IsVisible => true; + public DateTime DateCreated { get; } = DateTime.Now; + + public DateTime DateModified { get; } = DateTime.Now; + public Color Color { get; set; } public long FileSize => 0; diff --git a/Library/Providers/MatterControl/PrintHistoryItem.cs b/Library/Providers/MatterControl/PrintHistoryItem.cs index aa22bdd87..ffe4bc3a5 100644 --- a/Library/Providers/MatterControl/PrintHistoryItem.cs +++ b/Library/Providers/MatterControl/PrintHistoryItem.cs @@ -58,6 +58,10 @@ namespace MatterHackers.MatterControl.Library public bool IsVisible => true; + public DateTime DateCreated => this.PrintTask.PrintStart; + + public DateTime DateModified => this.PrintTask.PrintEnd; + public bool LocalContentExists => true; public string Category => "General"; diff --git a/Library/Providers/MatterControl/SqliteLibraryContainer.cs b/Library/Providers/MatterControl/SqliteLibraryContainer.cs index e102d1085..143f599af 100644 --- a/Library/Providers/MatterControl/SqliteLibraryContainer.cs +++ b/Library/Providers/MatterControl/SqliteLibraryContainer.cs @@ -31,16 +31,10 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; -using System.Threading; using System.Threading.Tasks; -using MatterHackers.Agg.UI; -using MatterHackers.DataConverters3D; using MatterHackers.Localizations; using MatterHackers.MatterControl.DataStorage; using MatterHackers.MatterControl.PrintQueue; -using MatterHackers.PolygonMesh; -using MatterHackers.PolygonMesh.Processors; namespace MatterHackers.MatterControl.Library { @@ -148,7 +142,7 @@ namespace MatterHackers.MatterControl.Library case ILibraryAssetStream streamItem: - var fileName = (streamItem as ILibraryAssetStream)?.FileName; + var fileName = (streamItem as ILibraryAssetStream)?.FileName; using (var streamInfo = await streamItem.GetStream(null)) { @@ -225,7 +219,7 @@ namespace MatterHackers.MatterControl.Library } /// - /// Creates a database PrintItem entity, copies the source file to a new library + /// Creates a database PrintItem entity, copies the source file to a new library /// path and updates the PrintItem to point at the new target /// private void AddItem(Stream stream, string extension, string displayName) @@ -270,6 +264,10 @@ namespace MatterHackers.MatterControl.Library public bool IsVisible { get; set; } = true; + public DateTime DateCreated { get; } = DateTime.Now; + + public DateTime DateModified { get; } = DateTime.Now; + public Task GetContainer(Action reportProgress) { return Task.FromResult( diff --git a/Library/Providers/MessageItem.cs b/Library/Providers/MessageItem.cs index 9d901ca23..39d74e7b6 100644 --- a/Library/Providers/MessageItem.cs +++ b/Library/Providers/MessageItem.cs @@ -27,6 +27,7 @@ of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project. */ +using System; using System.Threading.Tasks; using MatterHackers.Agg.Image; using MatterHackers.Agg.Platform; @@ -55,6 +56,10 @@ namespace MatterHackers.MatterControl.Library public bool IsVisible { get; set; } = true; + public DateTime DateCreated { get; } = DateTime.Now; + + public DateTime DateModified { get; } = DateTime.Now; + public ImageBuffer Thumbnail { get; set; } public MessageItem(string name) diff --git a/Library/Providers/SDCard/SDCardFileItem.cs b/Library/Providers/SDCard/SDCardFileItem.cs index 0bb190204..ef179b4a9 100644 --- a/Library/Providers/SDCard/SDCardFileItem.cs +++ b/Library/Providers/SDCard/SDCardFileItem.cs @@ -42,5 +42,9 @@ namespace MatterHackers.MatterControl.Library public bool IsProtected { get; } = true; public bool IsVisible { get; } = true; + + public DateTime DateCreated { get; } = DateTime.Now; + + public DateTime DateModified { get; } = DateTime.Now; } } diff --git a/Library/Widgets/ListView/ListView.cs b/Library/Widgets/ListView/ListView.cs index 55a79850f..3217ea911 100644 --- a/Library/Widgets/ListView/ListView.cs +++ b/Library/Widgets/ListView/ListView.cs @@ -142,7 +142,38 @@ namespace MatterHackers.MatterControl.CustomWidgets ModifiedDate } - public SortKey ActiveSort { get; set; } = SortKey.Name; + private SortKey _activeSort = SortKey.Name; + public SortKey ActiveSort + { + get => _activeSort; + set + { + if (_activeSort != value) + { + _activeSort = value; + this.ApplySort(); + } + } + } + + private bool _ascending = true; + public bool Ascending + { + get => _ascending; + set + { + if (_ascending != value) + { + _ascending = value; + this.ApplySort(); + } + } + } + + private void ApplySort() + { + this.Reload().ConfigureAwait(false); + } /// /// Empties the list children and repopulates the list with the source container content @@ -175,14 +206,15 @@ namespace MatterHackers.MatterControl.CustomWidgets itemsContentView.BeginReload(); - var containerItems = from item in sourceContainer.ChildContainers + IEnumerable containerItems = from item in sourceContainer.ChildContainers where item.IsVisible && this.ContainerFilter(item) - orderby item.Name select item; // Folder items - foreach (var childContainer in containerItems) + foreach (var childContainer in this.SortItems(containerItems)) { + Console.WriteLine($"{childContainer.Name}:{childContainer.DateCreated}"); + var listViewItem = new ListViewItem(childContainer, this); listViewItem.DoubleClick += listViewItem_DoubleClick; items.Add(listViewItem); @@ -200,20 +232,9 @@ namespace MatterHackers.MatterControl.CustomWidgets && this.ItemFilter(item) select item; - filteredResults = filteredResults.OrderBy(item => - { - switch (ActiveSort) - { - case SortKey.Name: - return item.Name; - - default: - return item.Name; - } - }); - - foreach (var item in filteredResults) + foreach (var item in this.SortItems(filteredResults)) { + Console.WriteLine($"{item.Name}:{item.DateCreated}"); var listViewItem = new ListViewItem(item, this); listViewItem.DoubleClick += listViewItem_DoubleClick; items.Add(listViewItem); @@ -223,7 +244,6 @@ namespace MatterHackers.MatterControl.CustomWidgets } itemsContentView.EndReload(); - } if (sourceContainer is ILibraryWritableContainer writableContainer) @@ -236,6 +256,30 @@ namespace MatterHackers.MatterControl.CustomWidgets this.ContentReloaded?.Invoke(this, null); } + private IEnumerable SortItems(IEnumerable items) + { + switch (ActiveSort) + { + case SortKey.CreatedDate when this.Ascending: + return items.OrderBy(item => item.DateCreated); + + case SortKey.CreatedDate when !this.Ascending: + return items.OrderByDescending(item => item.DateCreated); + + case SortKey.ModifiedDate when this.Ascending: + return items.OrderBy(item => item.DateModified); + + case SortKey.ModifiedDate when !this.Ascending: + return items.OrderByDescending(item => item.DateModified); + + case SortKey.Name when !this.Ascending: + return items.OrderByDescending(item => item.Name); + + default: + return items.OrderBy(item => item.Name); + } + } + private void WritableContainer_ItemContentChanged(object sender, ItemChangedEventArgs e) { var firstItem = items.Where(i => i.Model.ID == e.LibraryItem.ID).FirstOrDefault(); diff --git a/Library/Widgets/PrintLibraryWidget.cs b/Library/Widgets/PrintLibraryWidget.cs index a3b2954d4..608839983 100644 --- a/Library/Widgets/PrintLibraryWidget.cs +++ b/Library/Widgets/PrintLibraryWidget.cs @@ -109,69 +109,37 @@ namespace MatterHackers.MatterControl.PrintLibrary toolbar.OverflowButton.Name = "Print Library View Options"; toolbar.ExtendOverflowMenu = (popupMenu) => { - var sortActions = new List() - { - new PrintItemAction() - { - Title = "Date Created", - Action = (items, listview) => - { - } - }, - new PrintItemAction() - { - Title = "Date Modified", - Action = (items, listview) => - { - } - }, - new PrintItemAction() - { - Title = "Name", - Action = (items, listview) => - { - } - }, - new MenuSeparator(""), - new PrintItemAction() - { - Title = "Ascending", - Action = (items, listview) => - { - } - }, - new PrintItemAction() - { - Title = "Descending", - Action = (items, listview) => - { - } - } - }; + popupMenu.CreateBoolMenuItem( + "Date Created".Localize(), + () => libraryView.ActiveSort == ListView.SortKey.CreatedDate, + (v) => libraryView.ActiveSort = ListView.SortKey.CreatedDate, + useRadioStyle: true); - // Create menu items in the DropList for each element in this.menuActions - foreach (var menuAction in sortActions) - { - if (menuAction is MenuSeparator) - { - popupMenu.CreateHorizontalLine(); - } - else - { - var menuItem = popupMenu.CreateMenuItem(menuAction.Title); - menuItem.Name = $"{menuAction.Title} Menu Item"; + popupMenu.CreateBoolMenuItem( + "Date Modified".Localize(), + () => libraryView.ActiveSort == ListView.SortKey.ModifiedDate, + (v) => libraryView.ActiveSort = ListView.SortKey.ModifiedDate, + useRadioStyle: true); - menuItem.Enabled = menuAction.Action != null; - menuItem.ClearRemovedFlag(); - menuItem.Click += (s, e) => - { - menuAction.Action?.Invoke(libraryView.SelectedItems.Select(i => i.Model), libraryView); - }; + popupMenu.CreateBoolMenuItem( + "Name".Localize(), + () => libraryView.ActiveSort == ListView.SortKey.Name, + (v) => libraryView.ActiveSort = ListView.SortKey.Name, + useRadioStyle: true); - // Store a reference to the newly created MenuItem back on the MenuAction definition - menuAction.MenuItem = menuItem; - } - } + popupMenu.CreateHorizontalLine(); + + popupMenu.CreateBoolMenuItem( + "Ascending".Localize(), + () => libraryView.Ascending, + (v) => libraryView.Ascending = true, + useRadioStyle: true); + + popupMenu.CreateBoolMenuItem( + "Descending".Localize(), + () => !libraryView.Ascending, + (v) => libraryView.Ascending = false, + useRadioStyle: true); }; toolbar.Padding = theme.ToolbarPadding; diff --git a/PartPreviewWindow/SelectedObjectPanel.cs b/PartPreviewWindow/SelectedObjectPanel.cs index 213afd59a..c0f352318 100644 --- a/PartPreviewWindow/SelectedObjectPanel.cs +++ b/PartPreviewWindow/SelectedObjectPanel.cs @@ -468,6 +468,10 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public bool IsVisible => existingItem.Visible; + public DateTime DateCreated { get; } = DateTime.Now; + + public DateTime DateModified { get; } = DateTime.Now; + public string ContentType => "mcx"; public string Category => "General"; diff --git a/PartPreviewWindow/View3D/View3DWidget.cs b/PartPreviewWindow/View3D/View3DWidget.cs index 8d2e23bff..5a2907fdf 100644 --- a/PartPreviewWindow/View3D/View3DWidget.cs +++ b/PartPreviewWindow/View3D/View3DWidget.cs @@ -1395,6 +1395,10 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public bool IsVisible { get; set; } + public DateTime DateCreated { get; } = DateTime.Now; + + public DateTime DateModified { get; } = DateTime.Now; + public long FileSize => 0; public string AssetPath => "";