mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
Rewrote references
This commit is contained in:
@ -90,7 +90,7 @@ namespace RainmeterStudio.UI.Controller
|
||||
// Set the reference
|
||||
var name = dialog.SelectedName;
|
||||
|
||||
string folder = OwnerWindow.ProjectPanel.ActiveItem.Data.StoragePath;
|
||||
string folder = OwnerWindow.ProjectPanel.ActiveItem.StoragePath;
|
||||
if (!Directory.Exists(folder))
|
||||
folder = Path.GetDirectoryName(folder);
|
||||
|
||||
|
@ -32,12 +32,23 @@ namespace RainmeterStudio.UI.Controller
|
||||
// Resource name
|
||||
string key = "ProjectItem";
|
||||
|
||||
if (Directory.Exists(item.StoragePath))
|
||||
// Is a file?
|
||||
if (File.Exists(item.StoragePath))
|
||||
{
|
||||
if (String.IsNullOrEmpty(Path.GetExtension(item.StoragePath)))
|
||||
key += "Unknown";
|
||||
|
||||
else
|
||||
key += "_" + Path.GetExtension(item.StoragePath).Substring(1);
|
||||
}
|
||||
|
||||
// Not a file, try to figure out if a directory
|
||||
else if (item.Count > 0 || Directory.Exists(item.StoragePath))
|
||||
{
|
||||
key += "Directory";
|
||||
}
|
||||
|
||||
else if (File.Exists(item.StoragePath))
|
||||
key += "_" + Path.GetExtension(item.StoragePath).Substring(1);
|
||||
|
||||
// None
|
||||
else key += "None";
|
||||
|
||||
// Get icon
|
||||
|
@ -13,6 +13,7 @@ using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using RainmeterStudio.Business;
|
||||
using RainmeterStudio.Core.Documents;
|
||||
using RainmeterStudio.Core.Model;
|
||||
using RainmeterStudio.Core.Model.Events;
|
||||
using RainmeterStudio.Storage;
|
||||
using RainmeterStudio.UI.Controller;
|
||||
@ -70,22 +71,24 @@ namespace RainmeterStudio.UI
|
||||
e.Document.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler((obj, args) =>
|
||||
{
|
||||
string documentName;
|
||||
|
||||
if (!e.Document.Reference.IsInProject())
|
||||
|
||||
// Get title
|
||||
if (!ProjectController.ActiveProject.Contains(e.Document.Reference))
|
||||
{
|
||||
documentName = e.Document.Reference.StoragePath;
|
||||
|
||||
if (documentName == null)
|
||||
documentName = "New document";
|
||||
documentName = e.Document.Reference.StoragePath ?? "New document";
|
||||
}
|
||||
else
|
||||
{
|
||||
documentName = e.Document.Reference.Name;
|
||||
}
|
||||
|
||||
// Is document dirty? Append star
|
||||
if (e.Document.IsDirty)
|
||||
{
|
||||
documentName += "*";
|
||||
}
|
||||
|
||||
// Set document title
|
||||
document.Title = documentName;
|
||||
});
|
||||
}
|
||||
|
@ -46,8 +46,8 @@
|
||||
<TreeView Grid.Row="2" Name="treeProjectItems">
|
||||
<TreeView.ItemContainerStyle>
|
||||
<Style TargetType="{x:Type TreeViewItem}">
|
||||
<Setter Property="IsExpanded" Value="{Binding Data.IsExpanded, Mode=TwoWay}" />
|
||||
<Setter Property="IsSelected" Value="{Binding Data.IsSelected, Mode=TwoWay}" />
|
||||
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
|
||||
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
|
||||
<EventSetter Event="Expanded" Handler="TreeViewItem_ExpandedOrCollapsed" />
|
||||
<EventSetter Event="Collapsed" Handler="TreeViewItem_ExpandedOrCollapsed" />
|
||||
</Style>
|
||||
@ -55,8 +55,8 @@
|
||||
<TreeView.ItemTemplate>
|
||||
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
|
||||
<DockPanel LastChildFill="True">
|
||||
<Image DockPanel.Dock="Left" Width="16" Height="16" Source="{Binding Data.Reference.Data, Converter={StaticResource IconConverter}}" />
|
||||
<TextBlock Text="{Binding Data.Name}" />
|
||||
<Image DockPanel.Dock="Left" Width="16" Height="16" Source="{Binding Reference, Converter={StaticResource IconConverter}}" />
|
||||
<TextBlock Text="{Binding Name}" />
|
||||
</DockPanel>
|
||||
</HierarchicalDataTemplate>
|
||||
</TreeView.ItemTemplate>
|
||||
|
@ -67,7 +67,7 @@ namespace RainmeterStudio.UI.Panels
|
||||
/// <summary>
|
||||
/// Gets the selected tree view item
|
||||
/// </summary>
|
||||
public Tree<Reference> ActiveItem
|
||||
public Reference ActiveItem
|
||||
{
|
||||
get
|
||||
{
|
||||
@ -136,57 +136,36 @@ namespace RainmeterStudio.UI.Panels
|
||||
this.IsEnabled = true;
|
||||
|
||||
// Get tree
|
||||
Tree<ReferenceViewModel> tree;
|
||||
Reference refTree;
|
||||
|
||||
if (toggleShowAllFiles.IsChecked.HasValue && toggleShowAllFiles.IsChecked.Value)
|
||||
{
|
||||
tree = GetAllFiles();
|
||||
// Get directory name
|
||||
string projectFolder = System.IO.Path.GetDirectoryName(Controller.ActiveProjectPath);
|
||||
|
||||
// Get folder tree
|
||||
refTree = DirectoryHelper.GetFolderTree(projectFolder);
|
||||
}
|
||||
else
|
||||
{
|
||||
tree = GetProjectItems();
|
||||
refTree = Controller.ActiveProject.Root;
|
||||
}
|
||||
|
||||
// Add tree to tree view
|
||||
treeProjectItems.Items.Clear();
|
||||
treeProjectItems.Items.Add(tree);
|
||||
treeProjectItems.Items.Add(new ReferenceViewModel(refTree));
|
||||
}
|
||||
}
|
||||
|
||||
private Tree<ReferenceViewModel> GetAllFiles()
|
||||
{
|
||||
// Get directory name
|
||||
string projectFolder = System.IO.Path.GetDirectoryName(Controller.ActiveProjectPath);
|
||||
|
||||
// Get folder tree
|
||||
Tree<Reference> refTree = DirectoryHelper.GetFolderTree(projectFolder);
|
||||
refTree.Data = Controller.ActiveProject.Root.Data;
|
||||
|
||||
// Remove the project file from the list
|
||||
Tree<Reference> project = refTree.First(x => DirectoryHelper.PathsEqual(x.Data.StoragePath, Controller.ActiveProjectPath));
|
||||
refTree.Remove(project);
|
||||
|
||||
// Transform to reference view model and return
|
||||
return refTree.Transform<Reference, ReferenceViewModel>((node) => new Tree<ReferenceViewModel>(new ReferenceViewModel(node)));
|
||||
}
|
||||
|
||||
private Tree<ReferenceViewModel> GetProjectItems()
|
||||
{
|
||||
// Get project items
|
||||
Tree<Reference> refTree = Controller.ActiveProject.Root;
|
||||
|
||||
// Transform to reference view model and return
|
||||
return refTree.Transform<Reference, ReferenceViewModel>((node) => new Tree<ReferenceViewModel>(new ReferenceViewModel(node)));
|
||||
}
|
||||
|
||||
private void ExpandAll()
|
||||
{
|
||||
// Get tree
|
||||
var tree = treeProjectItems.Items[0] as Tree<ReferenceViewModel>;
|
||||
var tree = treeProjectItems.Items[0] as ReferenceViewModel;
|
||||
if (tree == null)
|
||||
return;
|
||||
|
||||
// Expand all
|
||||
tree.Apply((node) => node.Data.IsExpanded = true);
|
||||
tree.TreeExpand(true);
|
||||
|
||||
// Set can expand property
|
||||
CanExpand = false;
|
||||
@ -195,12 +174,12 @@ namespace RainmeterStudio.UI.Panels
|
||||
private void CollapseAll()
|
||||
{
|
||||
// Get tree
|
||||
var tree = treeProjectItems.Items[0] as Tree<ReferenceViewModel>;
|
||||
var tree = treeProjectItems.Items[0] as ReferenceViewModel;
|
||||
if (tree == null)
|
||||
return;
|
||||
|
||||
// Expand all
|
||||
tree.Apply((node) => node.Data.IsExpanded = false);
|
||||
tree.TreeExpand(false);
|
||||
|
||||
// Set can expand property
|
||||
CanExpand = true;
|
||||
@ -209,12 +188,12 @@ namespace RainmeterStudio.UI.Panels
|
||||
void TreeViewItem_ExpandedOrCollapsed(object sender, RoutedEventArgs e)
|
||||
{
|
||||
// Get tree
|
||||
var tree = treeProjectItems.Items[0] as Tree<ReferenceViewModel>;
|
||||
var tree = treeProjectItems.Items[0] as ReferenceViewModel;
|
||||
if (tree == null)
|
||||
return;
|
||||
|
||||
// We can expand if the root is not expanded
|
||||
CanExpand = (!tree.Data.IsExpanded);
|
||||
CanExpand = (!tree.IsExpanded);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
@ -10,14 +11,16 @@ namespace RainmeterStudio.UI.ViewModel
|
||||
/// <summary>
|
||||
/// Contains the view model of a reference
|
||||
/// </summary>
|
||||
public class ReferenceViewModel : INotifyPropertyChanged
|
||||
public class ReferenceViewModel : INotifyPropertyChanged, INotifyCollectionChanged
|
||||
{
|
||||
private List<ReferenceViewModel> _children = null;
|
||||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// Gets the linked reference
|
||||
/// </summary>
|
||||
public Tree<Reference> Reference { get; private set; }
|
||||
public Reference Reference { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the name
|
||||
@ -26,7 +29,7 @@ namespace RainmeterStudio.UI.ViewModel
|
||||
{
|
||||
get
|
||||
{
|
||||
return Reference.Data.Name;
|
||||
return Reference.Name;
|
||||
}
|
||||
}
|
||||
|
||||
@ -37,10 +40,20 @@ namespace RainmeterStudio.UI.ViewModel
|
||||
{
|
||||
get
|
||||
{
|
||||
return Reference.Data.StoragePath;
|
||||
return Reference.StoragePath;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets an enumerable of this object's children
|
||||
/// </summary>
|
||||
public IEnumerable<ReferenceViewModel> Children
|
||||
{
|
||||
get
|
||||
{
|
||||
return _children;
|
||||
}
|
||||
}
|
||||
|
||||
private bool _isExpanded = true;
|
||||
|
||||
@ -101,11 +114,70 @@ namespace RainmeterStudio.UI.ViewModel
|
||||
/// Creates a new instance of reference view model
|
||||
/// </summary>
|
||||
/// <param name="reference">Reference</param>
|
||||
public ReferenceViewModel(Tree<Reference> reference)
|
||||
public ReferenceViewModel(Reference reference)
|
||||
{
|
||||
Reference = reference;
|
||||
Reference.CollectionChanged += Reference_CollectionChanged;
|
||||
UpdateChildren();
|
||||
}
|
||||
|
||||
void Reference_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
|
||||
{
|
||||
List<ReferenceViewModel> newItems = new List<ReferenceViewModel>();
|
||||
List<ReferenceViewModel> oldItems = new List<ReferenceViewModel>();
|
||||
|
||||
// Update collection
|
||||
switch (e.Action)
|
||||
{
|
||||
case NotifyCollectionChangedAction.Add:
|
||||
newItems = e.NewItems.Cast<Reference>().Select(x => new ReferenceViewModel(x)).ToList();
|
||||
break;
|
||||
|
||||
case NotifyCollectionChangedAction.Remove:
|
||||
oldItems = _children.Where(x => e.OldItems.Contains(x.Reference)).ToList();
|
||||
break;
|
||||
|
||||
case NotifyCollectionChangedAction.Replace:
|
||||
newItems = e.NewItems.Cast<Reference>().Select(x => new ReferenceViewModel(x)).ToList();
|
||||
oldItems = _children.Where(x => e.OldItems.Contains(x.Reference)).ToList();
|
||||
break;
|
||||
|
||||
default:
|
||||
UpdateChildren();
|
||||
break;
|
||||
}
|
||||
|
||||
_children.RemoveAll(oldItems.Contains);
|
||||
_children.AddRange(newItems);
|
||||
|
||||
// Pass event
|
||||
if (CollectionChanged != null)
|
||||
CollectionChanged(this, new NotifyCollectionChangedEventArgs(e.Action, newItems, oldItems));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Operations
|
||||
|
||||
/// <summary>
|
||||
/// Sets the 'IsExpanded' property for the entire subtree
|
||||
/// </summary>
|
||||
/// <param name="value">Value to set</param>
|
||||
public void TreeExpand(bool value)
|
||||
{
|
||||
IsExpanded = value;
|
||||
}
|
||||
|
||||
private void UpdateChildren()
|
||||
{
|
||||
_children = Reference.Children.Select(x => new ReferenceViewModel(x)).ToList();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Triggered when the linked reference collection changes
|
||||
/// </summary>
|
||||
public event NotifyCollectionChangedEventHandler CollectionChanged;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user