Browse Source

First rework of AddInManager UI showing all views and repositories VS-like in a tree view rather than in a TabControl and ComboBoxes.

pull/32/head
Andreas Weizel 13 years ago
parent
commit
57eed77d5b
  1. 143
      src/AddIns/Misc/AddInManager2/Project/Src/View/AddInManagerView.xaml
  2. 4
      src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml
  3. 60
      src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AddInManagerViewModel.cs
  4. 32
      src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AddInsViewModelBase.cs

143
src/AddIns/Misc/AddInManager2/Project/Src/View/AddInManagerView.xaml

@ -1,9 +1,10 @@ @@ -1,9 +1,10 @@
<Window
<Window
x:Class="ICSharpCode.AddInManager2.View.AddInManagerView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:core="clr-namespace:ICSharpCode.Core.Presentation;assembly=ICSharpCode.Core.Presentation"
xmlns:aimview="clr-namespace:ICSharpCode.AddInManager2.View"
xmlns:aimvm="clr-namespace:ICSharpCode.AddInManager2.ViewModel"
xmlns:model="clr-namespace:ICSharpCode.AddInManager2.Model"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="480"
Width="640"
@ -39,24 +40,56 @@ @@ -39,24 +40,56 @@
</Style.Triggers>
</Style>
<Style x:Key="tabHeaderTextStyle" TargetType="{x:Type TextBlock}">
<Style x:Key="expanderHeaderTextStyle" TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding DataContext.HasHighlightCount}" Value="True">
<DataTrigger Binding="{Binding IsExpandedInView}" Value="True">
<Setter Property="Background" Value="{x:Static SystemColors.HighlightBrush}" />
<Setter Property="Foreground" Value="{x:Static SystemColors.HighlightTextBrush}" />
</DataTrigger>
<DataTrigger Binding="{Binding HasHighlightCount}" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</DataTrigger>
</Style.Triggers>
<Setter Property="Text" Value="{Binding DataContext.TitleWithHighlight}" />
<Setter Property="Text" Value="{Binding TitleWithHighlight}" />
</Style>
<DataTemplate x:Key="tabItemHeaderTemplate">
<DataTemplate x:Key="expanderHeaderTemplate">
<Grid>
<TextBlock Style="{StaticResource tabHeaderTextStyle}" />
<TextBlock Style="{StaticResource expanderHeaderTextStyle}" />
</Grid>
</DataTemplate>
<Style TargetType="{x:Type TabItem}">
<Setter Property="HeaderTemplate" Value="{Binding Source={StaticResource tabItemHeaderTemplate}}" />
</Style>
<DataTemplate x:Key="packageRepositoryItemTemplate" DataType="{x:Type model:PackageRepository}">
<TextBlock Text="{Binding Path=NameWithHighlight}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding HasHighlightCount}" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
<DataTemplate x:Key="viewModelExpanderItemTemplate" DataType="{x:Type aimvm:AddInsViewModelBase}">
<Expander
Header="{Binding}"
HeaderTemplate="{StaticResource expanderHeaderTemplate}"
IsExpanded="{Binding IsExpandedInView}"
Margin="0,0,0,10">
<ListBox
ItemsSource="{Binding PackageRepositories}"
ItemTemplate="{StaticResource packageRepositoryItemTemplate}"
SelectedItem="{Binding Path=SelectedPackageSource}"
BorderThickness="0"
Background="Transparent"
Margin="3,0,0,0"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
/>
</Expander>
</DataTemplate>
</Window.Resources>
<Window.DataContext>
@ -67,55 +100,59 @@ @@ -67,55 +100,59 @@
<Binding Path="Title"/>
</Window.Title>
<DockPanel x:Name="MainPanel">
<Grid
DockPanel.Dock="Bottom"
Margin="4, 4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel>
<Image
<Grid x:Name="MainPanel">
<Grid.ColumnDefinitions>
<ColumnDefinition Width=".3*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ItemsControl
x:Name="viewNavigationList"
Grid.Column="0"
ItemsSource="{Binding ViewModels}"
ItemTemplate="{StaticResource viewModelExpanderItemTemplate}"
Margin="3,3,3,3">
</ItemsControl>
<DockPanel x:Name="ContentPanel" Grid.Column="1">
<Grid
DockPanel.Dock="Bottom"
Margin="4, 4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel>
<Image
Margin="4, 4"
Style="{StaticResource errorImageStyle}" />
</StackPanel>
<TextBlock
Grid.Column="1"
Margin="4, 4"
Style="{StaticResource errorImageStyle}" />
</StackPanel>
<TextBlock
Grid.Column="1"
Margin="4, 4"
TextTrimming="CharacterEllipsis"
Text="{Binding Path=Message}"/>
<Button
Grid.Column="2"
Content="{core:Localize Global.CloseButtonText}"
IsCancel="True"/>
</Grid>
<TabControl>
<TabItem>
<TabItem.Header>
<TextBlock Style="{StaticResource tabHeaderTextStyle}" DataContext="{Binding InstalledAddInsViewModel}" />
</TabItem.Header>
TextTrimming="CharacterEllipsis"
Text="{Binding Path=Message}"/>
<Button
Grid.Column="2"
Content="{core:Localize Global.CloseButtonText}"
IsCancel="True"/>
</Grid>
<Grid x:Name="contentAreaGrid">
<aimview:AddInsView
x:Name="InstalledPackagesView"
DataContext="{Binding InstalledAddInsViewModel}" />
</TabItem>
<TabItem>
<TabItem.Header>
<TextBlock Style="{StaticResource tabHeaderTextStyle}" DataContext="{Binding UpdatedAddInsViewModel}" />
</TabItem.Header>
DataContext="{Binding InstalledAddInsViewModel}"
Visibility="{Binding IsExpandedInView, Converter={StaticResource BoolToVisibility}}" />
<aimview:AddInsView
x:Name="PackageUpdatesView"
DataContext="{Binding UpdatedAddInsViewModel}" />
</TabItem>
<TabItem>
<TabItem.Header>
<TextBlock Style="{StaticResource tabHeaderTextStyle}" DataContext="{Binding AvailableAddInsViewModel}" />
</TabItem.Header>
DataContext="{Binding UpdatedAddInsViewModel}"
Visibility="{Binding IsExpandedInView, Converter={StaticResource BoolToVisibility}}" />
<aimview:AddInsView
x:Name="AvailablePackagesView"
DataContext="{Binding AvailableAddInsViewModel}" />
</TabItem>
</TabControl>
</DockPanel>
DataContext="{Binding AvailableAddInsViewModel}"
Visibility="{Binding IsExpandedInView, Converter={StaticResource BoolToVisibility}}" />
</Grid>
</DockPanel>
</Grid>
</Window>

4
src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml

@ -491,7 +491,7 @@ @@ -491,7 +491,7 @@
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock
<!-- <TextBlock
Grid.Row="0"
Grid.Column="0"
VerticalAlignment="Center"
@ -507,7 +507,7 @@ @@ -507,7 +507,7 @@
SelectedItem="{Binding Path=SelectedPackageSource}"
ItemsSource="{Binding Path=PackageRepositories}"
ItemTemplate="{StaticResource PackageSourceComboBoxItemTemplate}"
Visibility="{Binding Path=ShowPackageRepositories, Converter={StaticResource BoolToVisibility}}"/>
Visibility="{Binding Path=ShowPackageRepositories, Converter={StaticResource BoolToVisibility}}"/>-->
<TextBlock
Grid.Row="1"

60
src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AddInManagerViewModel.cs

@ -4,8 +4,10 @@ @@ -4,8 +4,10 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using ICSharpCode.AddInManager2.Model;
using ICSharpCode.AddInManager2.View;
using ICSharpCode.Core;
@ -20,6 +22,8 @@ namespace ICSharpCode.AddInManager2.ViewModel @@ -20,6 +22,8 @@ namespace ICSharpCode.AddInManager2.ViewModel
private string _message;
private bool _hasError;
private ObservableCollection<AddInsViewModelBase> _viewModels;
public AddInManagerViewModel()
: base()
{
@ -42,10 +46,25 @@ namespace ICSharpCode.AddInManager2.ViewModel @@ -42,10 +46,25 @@ namespace ICSharpCode.AddInManager2.ViewModel
AddInManager.Events.AddInOperationError += AddInManager_Events_AddInOperationError;
AddInManager.Events.AcceptLicenses += AddInManager_Events_AcceptLicenses;
AvailableAddInsViewModel = new AvailableAddInsViewModel();
_viewModels = new ObservableCollection<AddInsViewModelBase>();
// Create and collect the models
InstalledAddInsViewModel = new InstalledAddInsViewModel();
AvailableAddInsViewModel = new AvailableAddInsViewModel();
UpdatedAddInsViewModel = new UpdatedAddInsViewModel();
_viewModels.Add(InstalledAddInsViewModel);
_viewModels.Add(AvailableAddInsViewModel);
_viewModels.Add(UpdatedAddInsViewModel);
foreach (var viewModel in _viewModels)
{
viewModel.PropertyChanged += ViewModel_PropertyChanged;
}
// Expand the first view
InstalledAddInsViewModel.IsExpandedInView = true;
// Read the packages
AvailableAddInsViewModel.ReadPackages();
InstalledAddInsViewModel.ReadPackages();
@ -70,6 +89,14 @@ namespace ICSharpCode.AddInManager2.ViewModel @@ -70,6 +89,14 @@ namespace ICSharpCode.AddInManager2.ViewModel
private set;
}
public ObservableCollection<AddInsViewModelBase> ViewModels
{
get
{
return _viewModels;
}
}
public string Title
{
// get { return viewTitle.Title; }
@ -82,6 +109,10 @@ namespace ICSharpCode.AddInManager2.ViewModel @@ -82,6 +109,10 @@ namespace ICSharpCode.AddInManager2.ViewModel
AddInManager.Events.OperationStarted -= AddInManager_Events_OperationStarted;
AddInManager.Events.AddInOperationError -= AddInManager_Events_AddInOperationError;
AddInManager.Events.AcceptLicenses -= AddInManager_Events_AcceptLicenses;
foreach (var viewModel in _viewModels)
{
viewModel.PropertyChanged -= ViewModel_PropertyChanged;
}
}
private void ShowErrorMessage(string message)
@ -153,5 +184,32 @@ namespace ICSharpCode.AddInManager2.ViewModel @@ -153,5 +184,32 @@ namespace ICSharpCode.AddInManager2.ViewModel
view.Owner = SD.Workbench.MainWindow;
return view.ShowDialog() ?? false;
}
private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "IsExpandedInView")
{
AddInsViewModelBase expandedViewModel = sender as AddInsViewModelBase;
if (expandedViewModel != null)
{
if (expandedViewModel.IsExpandedInView)
{
// Unexpand all view models besides this one
foreach (var viewModel in _viewModels)
{
if (viewModel != expandedViewModel)
{
viewModel.IsExpandedInView = false;
}
}
}
else if (!expandedViewModel.IsExpandedInView && (_viewModels.Count(v => v.IsExpandedInView) == 0))
{
// This is the last unexpanded view => leave it open
expandedViewModel.IsExpandedInView = true;
}
}
}
}
}
}

32
src/AddIns/Misc/AddInManager2/Project/Src/ViewModel/AddInsViewModelBase.cs

@ -22,6 +22,8 @@ namespace ICSharpCode.AddInManager2.ViewModel @@ -22,6 +22,8 @@ namespace ICSharpCode.AddInManager2.ViewModel
private PackageRepository _activePackageSource;
private IPackageRepository _activePackageRepository;
private bool _isReadingPackages;
private bool _isExpandedinView;
private bool _showPackageSources;
private ObservableCollection<PackageRepository> _packageRepositories;
@ -43,6 +45,7 @@ namespace ICSharpCode.AddInManager2.ViewModel @@ -43,6 +45,7 @@ namespace ICSharpCode.AddInManager2.ViewModel
{
_activePackageRepository = null;
_isReadingPackages = false;
_isExpandedinView = false;
// Initialization of internal lists
_pages = new Pages();
@ -235,6 +238,19 @@ namespace ICSharpCode.AddInManager2.ViewModel @@ -235,6 +238,19 @@ namespace ICSharpCode.AddInManager2.ViewModel
}
}
public bool IsExpandedInView
{
get
{
return _isExpandedinView;
}
set
{
_isExpandedinView = value;
OnPropertyChanged(m => m.IsExpandedInView);
}
}
public virtual void ReadPackages()
{
_pages.SelectedPageNumber = 1;
@ -424,8 +440,15 @@ namespace ICSharpCode.AddInManager2.ViewModel @@ -424,8 +440,15 @@ namespace ICSharpCode.AddInManager2.ViewModel
public bool ShowPackageSources
{
get;
set;
get
{
return _showPackageSources;
}
set
{
_showPackageSources = value;
UpdatePackageSources();
}
}
public ObservableCollection<PackageRepository> PackageRepositories
@ -438,6 +461,11 @@ namespace ICSharpCode.AddInManager2.ViewModel @@ -438,6 +461,11 @@ namespace ICSharpCode.AddInManager2.ViewModel
private void UpdatePackageSources()
{
if (!ShowPackageSources)
{
return;
}
PackageRepository oldValue = SelectedPackageSource;
// Refill package sources list

Loading…
Cancel
Save