Can now add new items to project.

This commit is contained in:
2014-08-16 15:40:08 +03:00
parent fb2929e02a
commit 7f525d0d86
10 changed files with 75 additions and 29 deletions

View File

@ -0,0 +1,65 @@
<UserControl x:Class="RainmeterStudio.UI.Panels.ProjectPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ctrl="clr-namespace:RainmeterStudio.UI.Controller"
xmlns:ui="clr-namespace:RainmeterStudio.UI"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<ctrl:IconProviderConverter x:Key="IconConverter" />
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<!-- Toolbar -->
<ToolBar Grid.Row="0" ToolBarTray.IsLocked="True">
<Button DataContext="{Binding SyncWithActiveViewCommand}"
Style="{StaticResource CommandButtonStyle}">
<Image Width="16" Height="16" Source="{Binding Icon}" />
</Button>
<Button DataContext="{Binding RefreshCommand}"
Style="{StaticResource CommandButtonStyle}">
<Image Width="16" Height="16" Source="{Binding Icon}" />
</Button>
<Button DataContext="{Binding CollapseAllCommand}"
Style="{StaticResource CommandAutoHideButtonStyle}">
<Image Width="16" Height="16" Source="{Binding Icon}" />
</Button>
<Button DataContext="{Binding ExpandAllCommand}"
Style="{StaticResource CommandAutoHideButtonStyle}">
<Image Width="16" Height="16" Source="{Binding Icon}" />
</Button>
<ToggleButton Name="toggleShowAllFiles"
DataContext="{Binding ShowAllFilesCommand}"
Style="{StaticResource CommandButtonStyle}">
<Image Width="16" Height="16" Source="{Binding Icon}" />
</ToggleButton>
</ToolBar>
<!-- Project item tree -->
<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}" />
<EventSetter Event="Expanded" Handler="TreeViewItem_ExpandedOrCollapsed" />
<EventSetter Event="Collapsed" Handler="TreeViewItem_ExpandedOrCollapsed" />
</Style>
</TreeView.ItemContainerStyle>
<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}" />
</DockPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</UserControl>

View File

@ -0,0 +1,220 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using RainmeterStudio.Core.Model;
using RainmeterStudio.Core.Utils;
using RainmeterStudio.Interop;
using RainmeterStudio.Storage;
using RainmeterStudio.UI.Controller;
using RainmeterStudio.UI.ViewModel;
namespace RainmeterStudio.UI.Panels
{
/// <summary>
/// Interaction logic for SkinsPanel.xaml
/// </summary>
public partial class ProjectPanel : UserControl
{
private ProjectController _controller;
public ProjectController Controller
{
get
{
return _controller;
}
set
{
// Unsubscribe from old controller
if (_controller != null)
{
Controller.ActiveProjectChanged -= Controller_ActiveProjectChanged;
}
// Set new project
_controller = value;
_controller.ActiveProjectChanged += Controller_ActiveProjectChanged;
Refresh();
}
}
#region Commands
public Command SyncWithActiveViewCommand { get; private set; }
public Command RefreshCommand { get; private set; }
public Command ExpandAllCommand { get; private set; }
public Command CollapseAllCommand { get; private set; }
public Command ShowAllFilesCommand { get; private set; }
#endregion
/// <summary>
/// Gets the selected tree view item
/// </summary>
public Tree<Reference> ActiveItem
{
get
{
var selected = treeProjectItems.SelectedItem as Tree<ReferenceViewModel>;
if (selected == null)
{
return Controller.ActiveProject.Root;
}
else
{
return selected.Data.Reference;
}
}
}
private bool _canExpand = false;
private bool CanExpand
{
get
{
return _canExpand;
}
set
{
_canExpand = value;
ExpandAllCommand.NotifyCanExecuteChanged();
CollapseAllCommand.NotifyCanExecuteChanged();
}
}
public ProjectPanel()
{
InitializeComponent();
SyncWithActiveViewCommand = new Command("ProjectPanel_SyncWithActiveViewCommand", SyncWithActiveView);
RefreshCommand = new Command("ProjectPanel_RefreshCommand", Refresh);
ExpandAllCommand = new Command("ProjectPanel_ExpandAllCommand", ExpandAll, () => _canExpand);
CollapseAllCommand = new Command("ProjectPanel_CollapseAllCommand", CollapseAll, () => !_canExpand);
ShowAllFilesCommand = new Command("ProjectPanel_ShowAllFilesCommand", Refresh);
this.DataContext = this;
Refresh();
}
void Controller_ActiveProjectChanged(object sender, EventArgs e)
{
Refresh();
}
private void SyncWithActiveView()
{
// TODO: implement
}
private void Refresh()
{
if (Controller == null || Controller.ActiveProject == null)
{
this.IsEnabled = false;
}
else
{
this.IsEnabled = true;
// Get tree
Tree<ReferenceViewModel> tree;
if (toggleShowAllFiles.IsChecked.HasValue && toggleShowAllFiles.IsChecked.Value)
{
tree = GetAllFiles();
}
else
{
tree = GetProjectItems();
}
// Add tree to tree view
treeProjectItems.Items.Clear();
treeProjectItems.Items.Add(tree);
}
}
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.Path, 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>;
if (tree == null)
return;
// Expand all
tree.Apply((node) => node.Data.IsExpanded = true);
// Set can expand property
CanExpand = false;
}
private void CollapseAll()
{
// Get tree
var tree = treeProjectItems.Items[0] as Tree<ReferenceViewModel>;
if (tree == null)
return;
// Expand all
tree.Apply((node) => node.Data.IsExpanded = false);
// Set can expand property
CanExpand = true;
}
void TreeViewItem_ExpandedOrCollapsed(object sender, RoutedEventArgs e)
{
// Get tree
var tree = treeProjectItems.Items[0] as Tree<ReferenceViewModel>;
if (tree == null)
return;
// We can expand if the root is not expanded
CanExpand = (!tree.Data.IsExpanded);
}
}
}