From a40e204a4b49731852e2617d306ccf3b2b5cfb80 Mon Sep 17 00:00:00 2001 From: "VKMTHD\\franzjosefkober" <franz.josef.kober@ivt.tugraz.at> Date: Thu, 9 Apr 2020 18:27:44 +0200 Subject: [PATCH] started to implement vecto gui for completed xml --- VECTO3GUI/App.config | 4 + VECTO3GUI/App.xaml | 13 + VECTO3GUI/Helper/FileDialogHelper.cs | 54 ++++ VECTO3GUI/MainWindow.xaml | 71 ++++- VECTO3GUI/MainWindow.xaml.cs | 3 +- VECTO3GUI/Resources/ViewModelMappings.xaml | 24 +- VECTO3GUI/VECTO3GUI.csproj | 94 +++++++ .../ViewModel/Impl/AuxiliariesViewModel.cs | 2 +- .../Impl/CompleteVehicleBusViewModel.cs | 3 + VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs | 259 ++++++++++-------- .../ViewModel/Impl/MainWindowViewModel.cs | 10 +- .../ViewModel/Interfaces/IJoblistViewModel.cs | 1 + VECTO3GUI/Views/JoblistTabView.xaml | 45 +++ VECTO3GUI/Views/JoblistTabView.xaml.cs | 36 +++ VECTO3GUI/Views/JoblistView.xaml | 66 ++++- VECTO3GUI/Views/JoblistView.xaml.cs | 28 +- VECTO3GUI/packages.config | 6 + 17 files changed, 566 insertions(+), 153 deletions(-) create mode 100644 VECTO3GUI/Helper/FileDialogHelper.cs create mode 100644 VECTO3GUI/Views/JoblistTabView.xaml create mode 100644 VECTO3GUI/Views/JoblistTabView.xaml.cs diff --git a/VECTO3GUI/App.config b/VECTO3GUI/App.config index c6ccae7ec4..865e48c442 100644 --- a/VECTO3GUI/App.config +++ b/VECTO3GUI/App.config @@ -9,6 +9,10 @@ <assemblyIdentity name="Ninject" publicKeyToken="c7192dc5380945e7" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-3.3.4.0" newVersion="3.3.4.0" /> </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Windows.Interactivity" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="4.5.0.0" /> + </dependentAssembly> </assemblyBinding> </runtime> </configuration> \ No newline at end of file diff --git a/VECTO3GUI/App.xaml b/VECTO3GUI/App.xaml index fb5901ef6c..01e1e46fcc 100644 --- a/VECTO3GUI/App.xaml +++ b/VECTO3GUI/App.xaml @@ -33,6 +33,19 @@ </Style.Triggers> </Style> </ResourceDictionary> + + + <!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! --> + <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" /> + <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" /> + <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" /> + <!-- Accent and AppTheme setting --> + <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/steel.xaml" /> + <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/baselight.xaml" /> + + + + </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> diff --git a/VECTO3GUI/Helper/FileDialogHelper.cs b/VECTO3GUI/Helper/FileDialogHelper.cs new file mode 100644 index 0000000000..47e066ef55 --- /dev/null +++ b/VECTO3GUI/Helper/FileDialogHelper.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Microsoft.WindowsAPICodePack.Dialogs; +using OpenFileDialog = System.Windows.Forms.OpenFileDialog; +using SaveFileDialog = Microsoft.Win32.SaveFileDialog; + + +namespace VECTO3GUI.Helper +{ + public static class FileDialogHelper + { + + public static string[] ShowSelectFilesDialog(bool multiselect, string initialDirectory = null) + { + using (var openFileDialog = new OpenFileDialog()) + { + openFileDialog.InitialDirectory = initialDirectory; + openFileDialog.Multiselect = multiselect; + var result = openFileDialog.ShowDialog(); + + if (result == DialogResult.OK) + { + return openFileDialog.FileNames; + } + } + + return null; + } + + + public static string ShowSelectDirectoryDialog(string initialDirectory = null) + { + using (var dialog = new CommonOpenFileDialog()) + { + dialog.InitialDirectory = initialDirectory; + dialog.IsFolderPicker = true; + + var result = dialog.ShowDialog(); + if (result == CommonFileDialogResult.Ok) + { + return dialog.FileName; + } + } + + return null; + } + + + } +} diff --git a/VECTO3GUI/MainWindow.xaml b/VECTO3GUI/MainWindow.xaml index 27fafbb837..ca19680d18 100644 --- a/VECTO3GUI/MainWindow.xaml +++ b/VECTO3GUI/MainWindow.xaml @@ -1,27 +1,76 @@ -<Window x:Class="VECTO3GUI.MainWindow" +<mah:MetroWindow x:Class="VECTO3GUI.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:VECTO3GUI" xmlns:interfaces="clr-namespace:VECTO3GUI.ViewModel.Interfaces" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:impl="clr-namespace:VECTO3GUI.ViewModel.Impl" mc:Ignorable="d" - Title="VECTO 3" Height="515.36" Width="972.48" > - - <!--<d:MainWindow.DataContext> - <x:Type Type="interfaces:IMainWindowViewModel"/> - </d:MainWindow.DataContext>--> + Title="VECTO 3" Height="515.36" Width="972.48" + d:DataContext="{d:DesignInstance Type=impl:MainWindowViewModel, IsDesignTimeCreatable=False}"> <Grid> - <Grid.ColumnDefinitions> + <Grid.RowDefinitions> + <RowDefinition Height="50"/> + <RowDefinition/> + <RowDefinition Height="20"/> + </Grid.RowDefinitions> + + <Grid Grid.Row="0"> + <StackPanel Orientation="Vertical"> + + <Menu IsMainMenu="True" Style="{DynamicResource MetroMenu}"> + <MenuItem Header="File"> + <MenuItem Header="New" Style="{DynamicResource MetroMenuItem}" Margin="0"/> + <MenuItem Header="Edit" Style="{DynamicResource MetroMenuItem}" Margin="0" Command="{Binding CurrentViewModel.EditJob}"/> + <Separator HorizontalAlignment="Stretch" Background="Gray"/> + <MenuItem Header="Open" Command="{Binding CurrentViewModel.CreateNewJob}"/> + <MenuItem Header="Open Folder"/> + <Separator HorizontalAlignment="Stretch" Background="Gray"/> + <MenuItem Header="Exit"/> + </MenuItem> + + <MenuItem Header="Settings"> + <!--<MenuItem Header="New"/>--> + </MenuItem> + + <MenuItem Header="Help"> + <MenuItem Header="User Manual"/> + <MenuItem Header="About Vecto"/> + <MenuItem Header="Relase Notes"/> + </MenuItem> + </Menu> + + <Separator HorizontalAlignment="Stretch" Background="Gray"/> + + + </StackPanel> + </Grid> + + <Grid Grid.Row="1"> + <ContentControl x:Name="bu" Content="{Binding CurrentViewModel}" /> + </Grid> + + + <Grid Grid.Row="2"> + <StatusBar/> + + </Grid> + + + <!--<Grid.ColumnDefinitions> <ColumnDefinition Width="150"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <StackPanel Orientation="Vertical" Background="Gray" Grid.Column="0"> - <Button Name="BtnHome" Background="Gray" Foreground="White" FontSize="16pt" Margin="0,20,0,0" BorderBrush="Gray" Width="150" Padding="10,0,0,0">Home</Button> + <Button mah:ControlsHelper.ContentCharacterCasing="Normal" Name="BtnHome" Background="Gray" Foreground="White" FontSize="16pt" Margin="0,20,0,0" BorderBrush="Gray" Width="150" Padding="10,0,0,0">Home</Button> <Button Name="BtnSettings" Width="150" Background="Gray" Foreground="White" FontSize="16pt" Margin="0,5,0,0" BorderBrush="Gray" HorizontalAlignment="Left" Padding="10,0,0,0">Settings</Button> <Button Name="BtnHelp" Width="150" Background="Gray" Foreground="White" FontSize="16pt" Margin="0,5,0,0" BorderBrush="Gray" HorizontalAlignment="Left" Padding="10,0,0,0">Help</Button> - </StackPanel> - <ContentControl Content="{Binding CurrentViewModel}" Grid.Column="1"/> + </StackPanel>--> </Grid> -</Window> + + + +</mah:MetroWindow> diff --git a/VECTO3GUI/MainWindow.xaml.cs b/VECTO3GUI/MainWindow.xaml.cs index b7ca5628d6..7d38b7a9a3 100644 --- a/VECTO3GUI/MainWindow.xaml.cs +++ b/VECTO3GUI/MainWindow.xaml.cs @@ -12,6 +12,7 @@ using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; +using MahApps.Metro.Controls; using VECTO3GUI.ViewModel.Interfaces; namespace VECTO3GUI @@ -19,7 +20,7 @@ namespace VECTO3GUI /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> - public partial class MainWindow : Window + public partial class MainWindow : MetroWindow { public MainWindow() diff --git a/VECTO3GUI/Resources/ViewModelMappings.xaml b/VECTO3GUI/Resources/ViewModelMappings.xaml index 1c8d3385d0..11c9572804 100644 --- a/VECTO3GUI/Resources/ViewModelMappings.xaml +++ b/VECTO3GUI/Resources/ViewModelMappings.xaml @@ -9,9 +9,18 @@ <DataTemplate DataType="{x:Type impl:JoblistViewModel}"> <views:JoblistView /> </DataTemplate> + <DataTemplate DataType="{x:Type impl:DeclarationJobViewModel}"> <views:JobEditView/> </DataTemplate> + + + + + + + + <DataTemplate DataType="{x:Type impl:EngineOnlyJobViewModel}"> <views:JobEditView/> </DataTemplate> @@ -26,10 +35,23 @@ <views:JobEditView/> </DataTemplate> - <DataTemplate DataType="{x:Type impl:CompleteVehicleBusJobViewModel}"> + <!--<DataTemplate DataType="{x:Type impl:CompleteVehicleBusJobViewModel}"> <views:JobEditView/> + </DataTemplate>--> + +<!--some test--> + + + <DataTemplate DataType="{x:Type impl:CompleteVehicleBusJobViewModel}"> + <views:JoblistTabView/> </DataTemplate> + +<!--end test--> + + + + <DataTemplate DataType="{x:Type impl:PrimaryVehicleBusViewModel}"> <declaration:PrimaryVehicleBusView/> </DataTemplate> diff --git a/VECTO3GUI/VECTO3GUI.csproj b/VECTO3GUI/VECTO3GUI.csproj index 365a400f8b..81a82ea874 100644 --- a/VECTO3GUI/VECTO3GUI.csproj +++ b/VECTO3GUI/VECTO3GUI.csproj @@ -39,6 +39,87 @@ <HintPath>..\packages\Castle.Core.4.2.0\lib\net45\Castle.Core.dll</HintPath> <Private>True</Private> </Reference> + <Reference Include="ControlzEx, Version=3.0.2.4, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>..\packages\ControlzEx.3.0.2.4\lib\net45\ControlzEx.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro, Version=1.6.5.1, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.1.6.5\lib\net45\MahApps.Metro.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.BoxIcons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.BoxIcons.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.Core, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.Core.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.Entypo, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.Entypo.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.EvaIcons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.EvaIcons.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.FeatherIcons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.FeatherIcons.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.FontAwesome, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.FontAwesome.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.Ionicons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.Ionicons.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.JamIcons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.JamIcons.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.Material, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.Material.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.MaterialDesign, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.MaterialDesign.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.MaterialLight, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.MaterialLight.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.Microns, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.Microns.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.Modern, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.Modern.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.Octicons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.Octicons.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.PicolIcons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.PicolIcons.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.RPGAwesome, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.RPGAwesome.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.SimpleIcons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.SimpleIcons.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.Typicons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.Typicons.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.Unicons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.Unicons.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.WeatherIcons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.WeatherIcons.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro.IconPacks.Zondicons, Version=3.0.0.0, Culture=neutral, PublicKeyToken=0c0d510f9915137a, processorArchitecture=MSIL"> + <HintPath>..\packages\MahApps.Metro.IconPacks.3.7.0\lib\net45\MahApps.Metro.IconPacks.Zondicons.dll</HintPath> + </Reference> + <Reference Include="Microsoft.Expression.Interactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>..\packages\System.Windows.Interactivity.WPF.2.0.20525\lib\net40\Microsoft.Expression.Interactions.dll</HintPath> + </Reference> + <Reference Include="Microsoft.WindowsAPICodePack, Version=1.1.2.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>..\packages\WindowsAPICodePack-Core.1.1.2\lib\Microsoft.WindowsAPICodePack.dll</HintPath> + </Reference> + <Reference Include="Microsoft.WindowsAPICodePack.Shell, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>..\packages\WindowsAPICodePack-Shell.1.1.1\lib\Microsoft.WindowsAPICodePack.Shell.dll</HintPath> + </Reference> <Reference Include="Ninject, Version=3.3.4.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL"> <HintPath>..\packages\Ninject.3.3.4\lib\net45\Ninject.dll</HintPath> <Private>True</Private> @@ -51,6 +132,10 @@ <Reference Include="System.ComponentModel.DataAnnotations" /> <Reference Include="System.Configuration" /> <Reference Include="System.Data" /> + <Reference Include="System.Windows.Forms" /> + <Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>..\packages\ControlzEx.3.0.2.4\lib\net45\System.Windows.Interactivity.dll</HintPath> + </Reference> <Reference Include="System.Xml" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="System.Core" /> @@ -69,6 +154,7 @@ <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> </ApplicationDefinition> + <Compile Include="Helper\FileDialogHelper.cs" /> <Compile Include="Model\InterfacesImpl.cs" /> <Compile Include="Util\AllowedEntry.cs" /> <Compile Include="Util\Component.cs" /> @@ -254,6 +340,9 @@ <Compile Include="Views\JobEditView.xaml.cs"> <DependentUpon>JobEditView.xaml</DependentUpon> </Compile> + <Compile Include="Views\JoblistTabView.xaml.cs"> + <DependentUpon>JoblistTabView.xaml</DependentUpon> + </Compile> <Compile Include="Views\JoblistView.xaml.cs"> <DependentUpon>JoblistView.xaml</DependentUpon> </Compile> @@ -422,6 +511,10 @@ <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> </Page> + <Page Include="Views\JoblistTabView.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> <Page Include="Views\JoblistView.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> @@ -469,6 +562,7 @@ <Name>VectoCore</Name> </ProjectReference> </ItemGroup> + <ItemGroup /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. diff --git a/VECTO3GUI/ViewModel/Impl/AuxiliariesViewModel.cs b/VECTO3GUI/ViewModel/Impl/AuxiliariesViewModel.cs index 9c7d0be1ae..b7922c03eb 100644 --- a/VECTO3GUI/ViewModel/Impl/AuxiliariesViewModel.cs +++ b/VECTO3GUI/ViewModel/Impl/AuxiliariesViewModel.cs @@ -217,7 +217,7 @@ namespace VECTO3GUI.ViewModel.Impl // .If<IDeclarationInputDataProvider>(d => SetValues(d.JobInputData.Vehicle.Components.AuxiliaryInputData())) // .If<IEngineeringInputDataProvider>(e => SetValues(e.JobInputData.Vehicle.Components.AuxiliaryInputData())); - if (inputData.JobInputData.Vehicle.Components.BusAuxiliaries != null) + if (inputData?.JobInputData?.Vehicle?.Components?.BusAuxiliaries != null) SetValues(inputData.JobInputData.Vehicle.Components.BusAuxiliaries); ConnectAxleViewModel(); diff --git a/VECTO3GUI/ViewModel/Impl/CompleteVehicleBusViewModel.cs b/VECTO3GUI/ViewModel/Impl/CompleteVehicleBusViewModel.cs index 5165e46254..41c2eff719 100644 --- a/VECTO3GUI/ViewModel/Impl/CompleteVehicleBusViewModel.cs +++ b/VECTO3GUI/ViewModel/Impl/CompleteVehicleBusViewModel.cs @@ -155,6 +155,9 @@ namespace VECTO3GUI.ViewModel.Impl private void SetVehicleData(IVehicleDeclarationInputData vehicle) { + if (vehicle == null) + return; + Manufacturer = vehicle.Manufacturer; ManufacturerAddress = vehicle.ManufacturerAddress; Model = vehicle.Model; diff --git a/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs b/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs index aabaa11bb2..c01f5a4389 100644 --- a/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs +++ b/VECTO3GUI/ViewModel/Impl/JoblistViewModel.cs @@ -19,18 +19,49 @@ using TUGraz.VectoCore.InputData.FileIO.XML.Engineering; using TUGraz.VectoCore.Utils; using VECTO3GUI.Util; using VECTO3GUI.ViewModel.Interfaces; -using System.Collections.Generic; using System.Xml; using System.Xml.Linq; using TUGraz.VectoCommon.Resources; -using VECTO3GUI.ViewModel.Impl; + namespace VECTO3GUI.ViewModel.Impl { public class JoblistViewModel : ObservableObject, IJoblistViewModel { + #region Members + protected readonly ObservableCollection<JobEntry> _jobs = new ObservableCollection<JobEntry>(); + private JobEntry _selectedJobEntry; + + #endregion + + + #region Commands + + private ICommand _newJobCommand; + private ICommand _editJobCommand; + private ICommand _removeJobCommand; + + + #endregion + + #region Properties + + public JobEntry SelectedJobEntry + { + get { return _selectedJobEntry; } + set { SetProperty(ref _selectedJobEntry, value); } + } + + public ObservableCollection<JobEntry> Jobs + { + get { return _jobs; } + } + + #endregion + + public JoblistViewModel() { @@ -46,130 +77,105 @@ namespace VECTO3GUI.ViewModel.Impl private void AddJobEntry(string jobFile) { - _jobs.Add(new JobEntry() { + _jobs.Add(new JobEntry() + { Filename = jobFile, Selected = false, Sorting = _jobs.Count }); } - public ObservableCollection<JobEntry> Jobs - { - get { return _jobs; } - } - public ICommand AddJob { get { return new RelayCommand(() => {}, () => false); } } - - - public ICommand RemoveJob { get { return new RelayCommand<object>(DoRemoveJob, CanRemoveJob);} } + #region Implementation IJoblistViewModel + + public ICommand RemoveJob { get { return _removeJobCommand ?? new RelayCommand(DoRemoveJob, CanRemoveJob); } } - private void DoRemoveJob(object selected) + private void DoRemoveJob() { - var jobEntry = selected as JobEntry; - if(jobEntry == null) - return; - - _jobs.Remove(jobEntry); + _jobs.Remove(SelectedJobEntry); + SelectedJobEntry = null; } - private bool CanRemoveJob(object selected) + private bool CanRemoveJob() { - var jobEntry = selected as JobEntry; - return jobEntry != null; + return SelectedJobEntry != null; } - public ICommand MoveJobUp { get { return new RelayCommand(() => { }, () => false); } } - - - public ICommand MoveJobDown { get { return new RelayCommand(() => { }, () => false); } } - - - public ICommand StartSimulation { get { return new RelayCommand(DoStartSimulation, CanStartSimulation); } } + public ICommand EditJob { get { return _editJobCommand ?? new RelayCommand(DoEditJob, CanEditJob); } } - private void DoStartSimulation() + private void DoEditJob() { - + var entry = SelectedJobEntry; + try + { + var jobEditView = ReadJob(entry.Filename); //Kernel.Get<IJobEditViewModel>(); + var wnd = new Window { Content = jobEditView }; + wnd.Show(); + } + catch (Exception e) + { + MessageBox.Show( + "Failed to read selected job: " + Environment.NewLine + Environment.NewLine + e.Message, "Failed reading Job", + MessageBoxButton.OK); + } } - private bool CanStartSimulation() + + private bool CanEditJob() { - return false; + return SelectedJobEntry != null; } - public ICommand EditJob { get { return new RelayCommand<object>(DoEditJob, CanEditJob);} } + public ICommand CreateNewJob { get { return _newJobCommand ?? new RelayCommand(DoNewJobCommand); } } - public ICommand JobEntrySetActive { get {return new RelayCommand<object>(DoJobEntrySetActive);} } - - private void DoJobEntrySetActive(object obj) + private void DoNewJobCommand() { - var jobEntry = (JobEntry)((ListViewItem)obj).Content; - jobEntry.Selected = !jobEntry.Selected; + var jobEditView = new CompleteVehicleBusJobViewModel(Kernel, null); + var wnd = new Window { Content = jobEditView }; + wnd.Show(); } - private void DoEditJob(object selected) - { - var entry = selected as JobEntry; - if (entry == null) { - return; - } - try { - var jobEditView = ReadJob(entry.Filename); //Kernel.Get<IJobEditViewModel>(); - var wnd = new Window { Content = jobEditView }; - wnd.Show(); - } catch (Exception e) { - MessageBox.Show( - "Failed to read selected job: " + Environment.NewLine + Environment.NewLine + e.Message, "Failed reading Job", - MessageBoxButton.OK); - } - } + public ICommand AddJob { get { return new RelayCommand(() => {}, () => false); } } + public ICommand MoveJobUp { get { return new RelayCommand(() => {}, () => false); } } + public ICommand MoveJobDown { get { return new RelayCommand(() => {}, () => false); } } + public ICommand StartSimulation { get { return new RelayCommand(() => {}, () => false); } } + public ICommand JobEntrySetActive { get { return new RelayCommand(() => {}, () => false); } } + + #endregion + + private IJobEditViewModel ReadJob(string jobFile) { if (jobFile == null) return null; var ext = Path.GetExtension(jobFile); - if (ext == Constants.FileExtensions.VectoXMLDeclarationFile) { + if (ext == Constants.FileExtensions.VectoXMLDeclarationFile) + { var localName = GetLocalName(jobFile); var xmlInputReader = Kernel.Get<IXMLInputDataReader>(); - - using (var reader = XmlReader.Create(jobFile)) { - if (localName == XMLNames.VectoPrimaryVehicleReport) { + using (var reader = XmlReader.Create(jobFile)) + { + + if (localName == XMLNames.VectoPrimaryVehicleReport) + { return CreatePrimaryBusVehicleViewModel(xmlInputReader.Create(reader)); } - if (localName == XMLNames.VectoInputDeclaration) { + if (localName == XMLNames.VectoInputDeclaration) + { return CreateCompleteBusVehicleViewModel(xmlInputReader.CreateDeclaration(reader)); } } } return null; - - - //IInputDataProvider inputData = null; - //var ext = Path.GetExtension(jobFile); - //switch (ext) { - // case Constants.FileExtensions.VectoJobFile: - // inputData = JSONInputDataFactory.ReadJsonJob(jobFile); - // break; - // case Constants.FileExtensions.VectoXMLDeclarationFile: - // //ToDo - // //case Constants.FileExtensions.VectoXMLJobFile: - // inputData = Kernel.Get<IXMLInputDataReader>().CreateDeclaration(jobFile); - // break; - // default: - // throw new UnsupportedFileVersionException(jobFile); - //} - - //var retVal = CreateJobEditViewModel(inputData); - - //if (retVal == null) { - // throw new Exception("Unsupported job type"); - //} - //return retVal; + + + } private string GetLocalName(string jobFilePath) @@ -178,12 +184,14 @@ namespace VECTO3GUI.ViewModel.Impl return doc.Root?.Name.LocalName; } + //ToDo FJ + //Start from here!! private IJobEditViewModel CreateCompleteBusVehicleViewModel(IInputDataProvider inputDataProvider) { var dataProvider = inputDataProvider as IDeclarationInputDataProvider; return dataProvider == null ? null : new CompleteVehicleBusJobViewModel(Kernel, dataProvider); } - + private IJobEditViewModel CreatePrimaryBusVehicleViewModel(IInputDataProvider inputData) { @@ -191,33 +199,64 @@ namespace VECTO3GUI.ViewModel.Impl return dataProvider == null ? null : new PrimaryVehicleBusJobViewModel(Kernel, dataProvider); } - //private IJobEditViewModel CreateJobEditViewModel(IInputDataProvider inputData) - //{ - // IJobEditViewModel retVal = null; - // if (inputData is JSONInputDataV2) { - // var jsoninputData = inputData as JSONInputDataV2; - // if (jsoninputData.SavedInDeclarationMode) { - // retVal = new DeclarationJobViewModel(Kernel, jsoninputData); - // } else { - // if (jsoninputData.EngineOnlyMode) { - // retVal = new EngineOnlyJobViewModel(Kernel, jsoninputData); - // } else { - // // TODO! - // } - // } - // } - // //ToDo - // //if (inputData is XMLDeclarationInputDataProvider) { - // // var declInput = inputData as IDeclarationInputDataProvider; - // // retVal = new DeclarationJobViewModel(Kernel, declInput); - // //} - // return retVal; - //} - - private bool CanEditJob(object selected) - { - var jobEntry = selected as JobEntry; - return jobEntry != null; - } + + + } + + + + #region Legacy + + //IInputDataProvider inputData = null; + //var ext = Path.GetExtension(jobFile); + //switch (ext) { + // case Constants.FileExtensions.VectoJobFile: + // inputData = JSONInputDataFactory.ReadJsonJob(jobFile); + // break; + // case Constants.FileExtensions.VectoXMLDeclarationFile: + // //ToDo + // //case Constants.FileExtensions.VectoXMLJobFile: + // inputData = Kernel.Get<IXMLInputDataReader>().CreateDeclaration(jobFile); + // break; + // default: + // throw new UnsupportedFileVersionException(jobFile); + //} + + //var retVal = CreateJobEditViewModel(inputData); + + //if (retVal == null) { + // throw new Exception("Unsupported job type"); + //} + //return retVal; + + + + //private IJobEditViewModel CreateJobEditViewModel(IInputDataProvider inputData) + //{ + // IJobEditViewModel retVal = null; + // if (inputData is JSONInputDataV2) { + // var jsoninputData = inputData as JSONInputDataV2; + // if (jsoninputData.SavedInDeclarationMode) { + // retVal = new DeclarationJobViewModel(Kernel, jsoninputData); + // } else { + // if (jsoninputData.EngineOnlyMode) { + // retVal = new EngineOnlyJobViewModel(Kernel, jsoninputData); + // } else { + // // TODO! + // } + // } + // } + // //ToDo + // //if (inputData is XMLDeclarationInputDataProvider) { + // // var declInput = inputData as IDeclarationInputDataProvider; + // // retVal = new DeclarationJobViewModel(Kernel, declInput); + // //} + // return retVal; + //} + + + #endregion + + } diff --git a/VECTO3GUI/ViewModel/Impl/MainWindowViewModel.cs b/VECTO3GUI/ViewModel/Impl/MainWindowViewModel.cs index 3a7c3d2903..ba6a82a500 100644 --- a/VECTO3GUI/ViewModel/Impl/MainWindowViewModel.cs +++ b/VECTO3GUI/ViewModel/Impl/MainWindowViewModel.cs @@ -1,12 +1,13 @@ -using Ninject; +using System.Windows.Input; +using Ninject; +using VECTO3GUI.Util; using VECTO3GUI.ViewModel.Interfaces; using VECTO3GUI.Views; namespace VECTO3GUI.ViewModel.Impl { public class MainWindowViewModel : ObservableObject, IMainWindowViewModel - { - + { private IMainView _currentViewModel; public MainWindowViewModel(IKernel kernel) @@ -14,7 +15,6 @@ namespace VECTO3GUI.ViewModel.Impl Kernel = kernel; CurrentViewModel = Kernel.Get<IJoblistViewModel>(); } - public IMainView CurrentViewModel @@ -22,7 +22,5 @@ namespace VECTO3GUI.ViewModel.Impl get { return _currentViewModel; } set { SetProperty(ref _currentViewModel, value); } } - - } } diff --git a/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs b/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs index 38b0821943..9c5e5051c2 100644 --- a/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs +++ b/VECTO3GUI/ViewModel/Interfaces/IJoblistViewModel.cs @@ -14,5 +14,6 @@ namespace VECTO3GUI.ViewModel.Interfaces ICommand StartSimulation { get; } ICommand EditJob { get; } ICommand JobEntrySetActive { get; } + ICommand CreateNewJob { get; } } } diff --git a/VECTO3GUI/Views/JoblistTabView.xaml b/VECTO3GUI/Views/JoblistTabView.xaml new file mode 100644 index 0000000000..a337df4e4e --- /dev/null +++ b/VECTO3GUI/Views/JoblistTabView.xaml @@ -0,0 +1,45 @@ +<UserControl x:Class="VECTO3GUI.Views.JoblistTabView" + 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:local="clr-namespace:VECTO3GUI.Views" + xmlns:interfaces="clr-namespace:VECTO3GUI.ViewModel.Interfaces" + xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" + xmlns:impl="clr-namespace:VECTO3GUI.ViewModel.Impl" + mc:Ignorable="d" + d:DesignHeight="450" d:DesignWidth="800"> + + + <!--<d:JoblistTabView.DataContext> + <x:Type Type="interfaces:IJobEditViewModel"/> + </d:JoblistTabView.DataContext>--> + + <TabControl ItemsSource="{Binding Components}" x:Name="ComponentsTab" SelectedIndex="0"> + + <i:Interaction.Triggers> + <i:EventTrigger EventName="SelectionChanged"> + <i:InvokeCommandAction + Command="{Binding EditComponent}" + CommandParameter="{Binding ElementName=ComponentsTab, Path=SelectedItem}"> + </i:InvokeCommandAction> + </i:EventTrigger> + </i:Interaction.Triggers> + + <TabControl.ItemTemplate> + <DataTemplate> + <TextBlock Text="{Binding}"/> + </DataTemplate> + </TabControl.ItemTemplate> + + <TabControl.ContentTemplate> + <DataTemplate> + <ScrollViewer DockPanel.Dock="Top"> + <ContentControl Content="{Binding DataContext.CurrentComponent, + RelativeSource={RelativeSource AncestorType=local:JoblistTabView}}" MinHeight="100"/> + </ScrollViewer> + </DataTemplate> + </TabControl.ContentTemplate> + + </TabControl> +</UserControl> diff --git a/VECTO3GUI/Views/JoblistTabView.xaml.cs b/VECTO3GUI/Views/JoblistTabView.xaml.cs new file mode 100644 index 0000000000..f0b449735c --- /dev/null +++ b/VECTO3GUI/Views/JoblistTabView.xaml.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +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 VECTO3GUI.ViewModel.Interfaces; + +namespace VECTO3GUI.Views +{ + /// <summary> + /// Interaction logic for JoblistTabView.xaml + /// </summary> + public partial class JoblistTabView : UserControl + { + public JoblistTabView() + { + InitializeComponent(); + } + + + public JoblistTabView(IJobEditViewModel viewModel) + { + InitializeComponent(); + DataContext = viewModel; + } + } +} diff --git a/VECTO3GUI/Views/JoblistView.xaml b/VECTO3GUI/Views/JoblistView.xaml index 2645a64e8c..0bf44e0b7b 100644 --- a/VECTO3GUI/Views/JoblistView.xaml +++ b/VECTO3GUI/Views/JoblistView.xaml @@ -7,16 +7,64 @@ xmlns:helper="clr-namespace:VECTO3GUI.Helper" xmlns:impl="clr-namespace:VECTO3GUI.ViewModel.Impl" xmlns:interfaces="clr-namespace:VECTO3GUI.ViewModel.Interfaces" + xmlns:views="clr-namespace:VECTO3GUI.Views" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" mc:Ignorable="d" - d:DesignHeight="300" d:DesignWidth="600"> + d:DesignHeight="300" d:DesignWidth="600" + d:DataContext="{d:DesignInstance Type=impl:JoblistViewModel, IsDesignTimeCreatable=False}"> + + + <d:JoblistView.DataContext> <x:Type Type="interfaces:IJoblistViewModel"/> </d:JoblistView.DataContext> - <UserControl.Resources> + + <!--<UserControl.Resources> <helper:JobEntrySelectedConverter x:Key="JobEntrySelectedConverter" /> + </UserControl.Resources>--> + + + <Grid> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="30"/> + <ColumnDefinition/> + <ColumnDefinition Width="80"/> + </Grid.ColumnDefinitions> + <Grid.RowDefinitions> + <RowDefinition Height="30"/> + <RowDefinition/> + <RowDefinition Height="30"/> + </Grid.RowDefinitions> + + + <Grid Grid.Row="1" Grid.Column="1" Margin="10"> + <DataGrid ItemsSource="{Binding Jobs}" mah:ControlsHelper.ContentCharacterCasing="Normal" + SelectedValue="{Binding DataContext.SelectedJobEntry, RelativeSource={RelativeSource AncestorType=views:JoblistView}}" + Style="{DynamicResource AzureDataGrid}" BorderThickness="1" CanUserAddRows="False" AutoGenerateColumns="False" SelectionUnit="FullRow" + IsReadOnly="True" HeadersVisibility="All" RowHeaderWidth="5" ColumnWidth="*" > + + + <DataGrid.Columns> + <DataGridTextColumn Header="File Path" Binding="{Binding Filename}" MinWidth="150"/> + </DataGrid.Columns> + </DataGrid> + </Grid> - </UserControl.Resources> - <Grid Margin="0,0,10,0"> + <Grid Grid.Row="1" Grid.Column="2" Margin="0,0,10,0"> + <StackPanel Orientation="Vertical" Margin="0,30,0,0"> + <Button Margin="0,5,0,0" Command="{Binding EditJob}" Content="Edit" mah:ControlsHelper.ContentCharacterCasing="Normal"/> + <Button Margin="0,5,0,0" Command="{Binding CreateNewJob}" Content="New File" mah:ControlsHelper.ContentCharacterCasing="Normal" /> + <Button Margin="0,5,0,0" Command="{Binding RemoveJob}" Content="Remove File" mah:ControlsHelper.ContentCharacterCasing="Normal" /> + </StackPanel> + + </Grid> + </Grid> + + + + + + <!--<Grid Margin="0,0,10,0"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="70"/> @@ -40,11 +88,11 @@ </ListView> <StackPanel Grid.Column="1"> <Button Margin="0,20,0,0" Command="{Binding EditJob}" CommandParameter="{Binding ElementName=Joblisting, Path=SelectedItem}">Edit</Button> - <Button Margin="0,15,0,0" Command="{Binding AddJob}">Add</Button> + <Button Margin="0,15,0,0" Command="{Binding AddJob}">New File</Button> <Button Margin="0,5,0,0" Command="{Binding RemoveJob}" CommandParameter="{Binding ElementName=Joblisting, Path=SelectedItem}">Remove</Button> - <Button Margin="0,5,0,0" Command="{Binding MoveJobUp}">Up</Button> - <Button Margin="0,5,0,0" Command="{Binding MoveJobDown}">Down</Button> - <Button Margin="0,20,0,0" Command="{Binding StartSimulation}">Start</Button> + --><!--<Button Margin="0,5,0,0" Command="{Binding MoveJobUp}">Up</Button>--> + <!--<Button Margin="0,5,0,0" Command="{Binding MoveJobDown}">Down</Button>--> + <!--<Button Margin="0,20,0,0" Command="{Binding StartSimulation}">Start</Button>--><!-- </StackPanel> - </Grid> + </Grid>--> </UserControl> diff --git a/VECTO3GUI/Views/JoblistView.xaml.cs b/VECTO3GUI/Views/JoblistView.xaml.cs index c5e90f2517..7cea923207 100644 --- a/VECTO3GUI/Views/JoblistView.xaml.cs +++ b/VECTO3GUI/Views/JoblistView.xaml.cs @@ -29,21 +29,21 @@ namespace VECTO3GUI.Views InitializeComponent(); } - public JoblistView(IJoblistViewModel viewModel) - { - InitializeComponent(); - DataContext = viewModel; - } + //public JoblistView(IJoblistViewModel viewModel) + //{ + // InitializeComponent(); + // DataContext = viewModel; + //} - private void Joblisting_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - var listView = (ListView)sender; - if (listView.SelectedItems.Count == 0) { - return; - } + //private void Joblisting_MouseDoubleClick(object sender, MouseButtonEventArgs e) + //{ + // var listView = (ListView)sender; + // if (listView.SelectedItems.Count == 0) { + // return; + // } - var model = (IJoblistViewModel)DataContext; - model.EditJob.Execute(listView.SelectedItem); - } + // var model = (IJoblistViewModel)DataContext; + // model.EditJob.Execute(listView.SelectedItem); + //} } } diff --git a/VECTO3GUI/packages.config b/VECTO3GUI/packages.config index 43303bc4c0..2027e5bd77 100644 --- a/VECTO3GUI/packages.config +++ b/VECTO3GUI/packages.config @@ -1,6 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <packages> <package id="Castle.Core" version="4.2.0" targetFramework="net452" /> + <package id="ControlzEx" version="3.0.2.4" targetFramework="net452" /> + <package id="MahApps.Metro" version="1.6.5" targetFramework="net452" /> + <package id="MahApps.Metro.IconPacks" version="3.7.0" targetFramework="net452" /> <package id="Ninject" version="3.3.4" targetFramework="net452" /> <package id="Ninject.Extensions.Factory" version="3.3.2" targetFramework="net452" /> + <package id="System.Windows.Interactivity.WPF" version="2.0.20525" targetFramework="net452" /> + <package id="WindowsAPICodePack-Core" version="1.1.2" targetFramework="net452" /> + <package id="WindowsAPICodePack-Shell" version="1.1.1" targetFramework="net452" /> </packages> \ No newline at end of file -- GitLab