UI Updates + context menu + popup for tray.

This commit is contained in:
Patrick Fic
2020-01-30 21:31:20 -08:00
parent fc52804362
commit 06b516a5b8
8 changed files with 326 additions and 80 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -342,6 +342,7 @@
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<Resource Include="favicon.ico" />
<Resource Include="Assets\logo1024.png" />
<Content Include="NLog.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

View File

@@ -105,6 +105,33 @@ namespace BodyshopUploader.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Actions.
/// </summary>
public static string Label_Actions {
get {
return ResourceManager.GetString("Label_Actions", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Active Shop.
/// </summary>
public static string Label_ActiveShop {
get {
return ResourceManager.GetString("Label_ActiveShop", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Add _Folder.
/// </summary>
public static string Label_AddFolder {
get {
return ResourceManager.GetString("Label_AddFolder", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Add Path.
/// </summary>
@@ -132,6 +159,33 @@ namespace BodyshopUploader.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Monitor Status.
/// </summary>
public static string Label_MonitorStatus {
get {
return ResourceManager.GetString("Label_MonitorStatus", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Re_move.
/// </summary>
public static string Label_Remove {
get {
return ResourceManager.GetString("Label_Remove", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Restart.
/// </summary>
public static string Label_Restart {
get {
return ResourceManager.GetString("Label_Restart", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Source System.
/// </summary>
@@ -142,7 +196,7 @@ namespace BodyshopUploader.Properties {
}
/// <summary>
/// Looks up a localized string similar to Start All Monitors.
/// Looks up a localized string similar to Start _All Monitors.
/// </summary>
public static string Label_StartAllMonitors {
get {
@@ -151,7 +205,34 @@ namespace BodyshopUploader.Properties {
}
/// <summary>
/// Looks up a localized string similar to Stop All Monitors.
/// Looks up a localized string similar to Status.
/// </summary>
public static string Label_Status {
get {
return ResourceManager.GetString("Label_Status", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Started.
/// </summary>
public static string Label_Status_Started {
get {
return ResourceManager.GetString("Label_Status_Started", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Stopped.
/// </summary>
public static string Label_Status_Stopped {
get {
return ResourceManager.GetString("Label_Status_Stopped", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to _Stop All Monitors.
/// </summary>
public static string Label_StopAllMonitors {
get {
@@ -204,6 +285,24 @@ namespace BodyshopUploader.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Bodyshop Partner by ImEX Systems Inc..
/// </summary>
public static string Title_Login_Header {
get {
return ResourceManager.GetString("Title_Login_Header", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Bodyshop Partner | ImEX Systems Inc..
/// </summary>
public static string Title_Main {
get {
return ResourceManager.GetString("Title_Main", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Username.
/// </summary>

View File

@@ -132,6 +132,15 @@
<data name="Exit" xml:space="preserve">
<value>Exit</value>
</data>
<data name="Label_Actions" xml:space="preserve">
<value>Actions</value>
</data>
<data name="Label_ActiveShop" xml:space="preserve">
<value>Active Shop</value>
</data>
<data name="Label_AddFolder" xml:space="preserve">
<value>Add _Folder</value>
</data>
<data name="Label_AddMonitoringPath" xml:space="preserve">
<value>Add Path</value>
</data>
@@ -141,14 +150,32 @@
<data name="Label_FilePath" xml:space="preserve">
<value>File Path</value>
</data>
<data name="Label_MonitorStatus" xml:space="preserve">
<value>Monitor Status</value>
</data>
<data name="Label_Remove" xml:space="preserve">
<value>Re_move</value>
</data>
<data name="Label_Restart" xml:space="preserve">
<value>_Restart</value>
</data>
<data name="Label_SourceSystem" xml:space="preserve">
<value>Source System</value>
</data>
<data name="Label_StartAllMonitors" xml:space="preserve">
<value>Start All Monitors</value>
<value>Start _All Monitors</value>
</data>
<data name="Label_Status" xml:space="preserve">
<value>Status</value>
</data>
<data name="Label_Status_Started" xml:space="preserve">
<value>Started</value>
</data>
<data name="Label_Status_Stopped" xml:space="preserve">
<value>Stopped</value>
</data>
<data name="Label_StopAllMonitors" xml:space="preserve">
<value>Stop All Monitors</value>
<value>_Stop All Monitors</value>
</data>
<data name="Login" xml:space="preserve">
<value>Login</value>
@@ -165,6 +192,12 @@
<data name="Title_Login" xml:space="preserve">
<value>Login - Bodyshop Uploader</value>
</data>
<data name="Title_Login_Header" xml:space="preserve">
<value>Bodyshop Partner by ImEX Systems Inc.</value>
</data>
<data name="Title_Main" xml:space="preserve">
<value>Bodyshop Partner | ImEX Systems Inc.</value>
</data>
<data name="Username" xml:space="preserve">
<value>Username</value>
</data>

View File

@@ -41,4 +41,20 @@ namespace BodyshopUploader.Utils
}
}
public class MonitorStatusConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((bool)value == true)
return Properties.Resources.Label_Status_Started;
else
return Properties.Resources.Label_Status_Stopped;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException("Two-way binding not supported by MonitorStatusConverter");
}
}
}

View File

@@ -87,6 +87,22 @@ namespace BodyshopUploader.ViewModels
}
}
private ICommand _restartMonitoringPathCommand;
public ICommand RestartMonitoringPathCommand
{
get
{
if (_restartMonitoringPathCommand == null)
{
_restartMonitoringPathCommand = new RelayCommand(
p => true,
p => ((Models.Monitor)p).StartMonitor()
);
}
return _restartMonitoringPathCommand;
}
}
private ICommand _stopFolderMonitorsCommand;
public ICommand StopFolderMonitorsCommand
{

View File

@@ -7,8 +7,8 @@
xmlns:vm="clr-namespace:BodyshopUploader.ViewModels"
mc:Ignorable="d"
Title="{x:Static p:Resources.Title_Login}"
Height="169.084"
Width="389.618"
Height="300"
Width="475"
xmlns:p="clr-namespace:BodyshopUploader.Properties"
xmlns:util="clr-namespace:BodyshopUploader.Utils"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
@@ -19,15 +19,46 @@
TextOptions.TextRenderingMode="Auto"
Background="{DynamicResource MaterialDesignPaper}"
FontFamily="{DynamicResource MaterialDesignFont}"
Closing="Window_Closing">
Closing="Window_Closing"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen">
<Window.DataContext>
<vm:LoginViewModel />
</Window.DataContext>
<Window.Resources>
<util:NullVisibilityConverter x:Key="NullVisibilityConverter" />
<Style TargetType="StackPanel">
<Setter Property="Margin"
Value="8" />
</Style>
<Style TargetType="TextBox"
BasedOn="{StaticResource MaterialDesignFloatingHintTextBox}">
<Setter Property="Margin"
Value="8" />
</Style>
<Style TargetType="materialDesign:PackIcon">
<Setter Property="Margin"
Value="8" />
</Style>
<Style TargetType="Image">
<Setter Property="Margin"
Value="8" />
</Style>
</Window.Resources>
<StackPanel>
<StackPanel Orientation="Horizontal">
<Image Source="/Assets/logo1024.png"
Height="48"
Width="48"
VerticalAlignment="Center" />
<TextBlock Text="{x:Static p:Resources.Title_Login_Header}"
Style="{StaticResource MaterialDesignHeadline6TextBlock}"
VerticalAlignment="Center" />
</StackPanel>
<StackPanel Orientation="Vertical"
HorizontalAlignment="Center">
<StackPanel Orientation="Horizontal">
@@ -35,8 +66,6 @@
VerticalAlignment="Center" />
<TextBox materialDesign:HintAssist.Hint="{x:Static p:Resources.Username}"
Width="300"
materialDesign:TextFieldAssist.HasClearButton="True"
Style="{StaticResource MaterialDesignFloatingHintTextBox}"
Text="{Binding UserName}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
@@ -45,9 +74,7 @@
<PasswordBox materialDesign:HintAssist.Hint="{x:Static p:Resources.Password}"
KeyDown="PasswordBox_KeyDown"
PasswordChanged="PasswordBox_PasswordChanged"
Width="300"
materialDesign:TextFieldAssist.HasClearButton="True"
Style="{StaticResource MaterialDesignFloatingHintPasswordBox}" />
Width="300" />
</StackPanel>
</StackPanel>

View File

@@ -5,7 +5,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:BodyshopUploader.Views"
mc:Ignorable="d"
Title="Main"
Title="{x:Static p:Resources.Title_Main}"
Height="450"
xmlns:vm="clr-namespace:BodyshopUploader.ViewModels"
Width="800"
@@ -27,12 +27,31 @@
</Window.DataContext>
<Window.Resources>
<util:OpenMainWindowCommand x:Key="OpenMainWindowCommand" />
<util:MonitorStatusConverter x:Key="MonitorStatusConverter" />
<Style TargetType="StackPanel">
<Setter Property="Margin"
Value="8" />
</Style>
<Style TargetType="TextBox"
BasedOn="{StaticResource MaterialDesignFloatingHintTextBox}">
<Setter Property="Margin"
Value="8" />
</Style>
<Style TargetType="materialDesign:PackIcon">
<Setter Property="Margin"
Value="8" />
</Style>
<Style TargetType="Image">
<Setter Property="Margin"
Value="8" />
</Style>
</Window.Resources>
<DockPanel>
<ProgressBar DockPanel.Dock="Bottom"
Value="{Binding Progress}"
IsIndeterminate="{Binding IndeterminateLoading}"
Height="10" />
Height="8" />
<tb:TaskbarIcon DockPanel.Dock="Top"
IconSource="../favicon.ico"
@@ -41,38 +60,59 @@
MenuActivation="RightClick"
ToolTipText="Bodyshop Uploader">
<tb:TaskbarIcon.TrayPopup>
<Border Background="White"
BorderBrush="Orange"
BorderThickness="2"
Width="160"
Height="40">
<Button Content="Click Me!"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
<Border Background="{DynamicResource MaterialDesignPaper}"
BorderBrush="Black"
BorderThickness="2">
<DockPanel Margin="12">
<TextBlock DockPanel.Dock="Top"
Style="{StaticResource MaterialDesignHeadline5TextBlock}"
Text="{x:Static p:Resources.Label_MonitorStatus}" />
<ItemsControl ItemsSource="{Binding MonitoringPaths}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Style="{StaticResource MaterialDesignBody2TextBlock}"
Margin="8"
Text="{Binding FilePath}" />
<TextBlock Grid.Column="1"
Style="{StaticResource MaterialDesignBody2TextBlock}"
Margin="8"
Text="{Binding FolderMonitor.EnableRaisingEvents,
Converter={StaticResource MonitorStatusConverter}}" />
</Grid>
<Separator Margin="2"
Width="150" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DockPanel>
</Border>
</tb:TaskbarIcon.TrayPopup>
<tb:TaskbarIcon.ContextMenu>
<ContextMenu>
<MenuItem Header="Exit" Command="{Binding QuitCommand}" />
<MenuItem Header="{x:Static p:Resources.Label_Restart}"
Command="{Binding StartFolderMonitorsCommand}" />
<MenuItem Header="{x:Static p:Resources.Label_StopAllMonitors}"
Command="{Binding StopFolderMonitorsCommand}" />
<MenuItem Header="Exit"
Command="{Binding QuitCommand}" />
</ContextMenu>
</tb:TaskbarIcon.ContextMenu>
</tb:TaskbarIcon>
<Button DockPanel.Dock="Top"
Command="{Binding TestCommand}"
Content="Test Command" />
<Button Style="{StaticResource MaterialDesignFloatingActionMiniDarkButton}"
Command="{Binding AddMonitoringPathCommand}"
ToolTip="{x:Static p:Resources.Label_AddMonitoringPath}">
<materialDesign:PackIcon Kind="Add"
Height="24"
Width="24" />
</Button>
<StackPanel DockPanel.Dock="Right">
<ComboBox ItemsSource="{Binding ShopData}"
Margin="8"
SelectedItem="{Binding ActiveShop}"
Style="{StaticResource MaterialDesignFloatingHintComboBox}"
materialDesign:HintAssist.Hint="{x:Static p:Resources.Label_ActiveShop}"
DisplayMemberPath="ShopName">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
@@ -81,70 +121,84 @@
</ComboBox.ItemsPanel>
</ComboBox>
<Button Command="{Binding StartFolderMonitorsCommand}"
<Button Command="{Binding AddMonitoringPathCommand, UpdateSourceTrigger=PropertyChanged}"
Margin="8"
ToolTip="{x:Static p:Resources.Label_AddMonitoringPath}"
Content="{x:Static p:Resources.Label_AddFolder}" />
<Button Command="{Binding StartFolderMonitorsCommand, UpdateSourceTrigger=PropertyChanged}"
Margin="8"
Content="{x:Static p:Resources.Label_StartAllMonitors}" />
<Button Command="{Binding StopFolderMonitorsCommand}"
<Button Command="{Binding StopFolderMonitorsCommand, UpdateSourceTrigger=PropertyChanged}"
Margin="8"
Content="{x:Static p:Resources.Label_StopAllMonitors}" />
<CheckBox IsChecked="{Binding Source={x:Static p:Settings.Default}, Path=AutoStartMonitor}"
Content="{x:Static p:Resources.Label_AutoStartMonitor}"/>
Margin="8"
Content="{x:Static p:Resources.Label_AutoStartMonitor}" />
<Button DockPanel.Dock="Top"
Margin="8"
Command="{Binding TestCommand}"
Content="_TEST" />
</StackPanel>
<DataGrid ItemsSource="{Binding MonitoringPaths}"
AutoGenerateColumns="False"
CanUserAddRows="False">
VerticalContentAlignment="Center"
IsReadOnly="True"
HorizontalContentAlignment="Center"
Margin="8"
CanUserAddRows="False"
CanUserSortColumns="True"
materialDesign:DataGridAssist.CellPadding="4 2 2 2"
materialDesign:DataGridAssist.ColumnHeaderPadding="4 2 2 2">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding FilePath}"
Header="{x:Static p:Resources.Label_FilePath}" />
<DataGridTextColumn Binding="{Binding Source}"
<!--<DataGridTextColumn Binding="{Binding Source}"
Header="{x:Static p:Resources.Label_SourceSystem}" />
<DataGridTextColumn Binding="{Binding FolderMonitor.EnableRaisingEvents}"
Header="XX_RUNNING?"/>
<DataGridTemplateColumn Header="1">
<DataGridTemplateColumn Header="{x:Static p:Resources.Label_SourceSystem}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Style="{StaticResource MaterialDesignFloatingActionMiniAccentButton}"
Command="{Binding DataContext.RemoveMonitoringPathCommand,
<ComboBox Margin="8"
SelectedItem="{Binding Source}">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
<ComboBoxItem>Mitchell</ComboBoxItem>
<ComboBoxItem>Audatex</ComboBoxItem>
<ComboBoxItem>CCC</ComboBoxItem>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>-->
<DataGridTextColumn Binding="{Binding FolderMonitor.EnableRaisingEvents, Converter={StaticResource MonitorStatusConverter}}"
Header="{x:Static p:Resources.Label_Status}" />
<DataGridTemplateColumn Header="{x:Static p:Resources.Label_Actions}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Command="{Binding DataContext.RemoveMonitoringPathCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
CommandParameter="{Binding .}">
<materialDesign:PackIcon Kind="RemoveCircle"
Height="24"
Width="24" />
</Button>
CommandParameter="{Binding .}"
Style="{StaticResource MaterialDesignOutlinedButton}"
Margin="4"
Content="{x:Static p:Resources.Label_Remove}" />
<Button Command="{Binding DataContext.RestartMonitoringPathCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
CommandParameter="{Binding .}"
Style="{StaticResource MaterialDesignOutlinedButton}"
Margin="4"
Content="{x:Static p:Resources.Label_Restart}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<!--<ItemsControl ItemsSource="{Binding MonitoringPaths}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="{Binding .}" />
<materialDesign:PackIcon Kind="RemoveCircle"
Grid.Column="1"
Height="16"
Width="16">
<materialDesign:PackIcon.InputBindings>
<MouseBinding Gesture="LeftClick"
Command="{Binding DataContext.RemoveMonitoringPathCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
CommandParameter="{Binding .}" />
</materialDesign:PackIcon.InputBindings>
</materialDesign:PackIcon>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>-->
</DockPanel>
</Window>