WPFWindows/MainWindow.xaml
<Window
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:PSChiaPlotter" Title="PSChiaPlotter" Height="600" Width="800"> <Window.Resources> <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> <Style x:Key="JobQueueTB" TargetType="TextBlock"> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=JobQueues_ListBox, Path=HasItems}" Value="True"> <Setter Property="Visibility" Value="Collapsed" /> </DataTrigger> <DataTrigger Binding="{Binding ElementName=JobQueues_ListBox, Path=HasItems}" Value="False"> <Setter Property="Visibility" Value="Visible" /> </DataTrigger> </Style.Triggers> </Style> <Style TargetType="GroupBox"> <Setter Property="BorderBrush" Value="ForestGreen" /> <Setter Property="BorderThickness" Value="2" /> <Setter Property="FontWeight" Value="Bold" /> </Style> <Style x:Key="HighlightRow" TargetType="{x:Type DataGridRow}"> <Style.Triggers> <DataTrigger Binding="{Binding Status}" Value="Finished"> <Setter Property="Background"> <Setter.Value> <SolidColorBrush Color="LightGreen" Opacity=".2" /> </Setter.Value> </Setter> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Completed"> <Setter Property="Background"> <Setter.Value> <SolidColorBrush Color="LightGreen" Opacity=".2" /> </Setter.Value> </Setter> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Running"> <Setter Property="Background"> <Setter.Value> <SolidColorBrush Color="LightBlue" Opacity=".4" /> </Setter.Value> </Setter> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Failed"> <Setter Property="Background"> <Setter.Value> <SolidColorBrush Color="Pink" Opacity=".4" /> </Setter.Value> </Setter> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Waiting"> <Setter Property="Background"> <Setter.Value> <SolidColorBrush Color="LightYellow" Opacity=".4" /> </Setter.Value> </Setter> </DataTrigger> <DataTrigger Binding="{Binding Status}" Value="Paused"> <Setter Property="Background"> <Setter.Value> <SolidColorBrush Color="Orange" Opacity=".2" /> </Setter.Value> </Setter> </DataTrigger> </Style.Triggers> </Style> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="5" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="5" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="5" /> <RowDefinition Height="auto" MaxHeight="200"/> <RowDefinition Height="auto"/> <RowDefinition Height="1.25*" MinHeight="125"/> <RowDefinition Height="*" /> <RowDefinition Height="5" /> </Grid.RowDefinitions> <GroupBox Header="Jobs" Name="Jobs_GroupBox" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" MaxHeight="200"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="5" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="100" /> <ColumnDefinition Width="5" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="5" /> <RowDefinition Height="auto" /> <RowDefinition Height="auto" /> <RowDefinition Height="5" /> </Grid.RowDefinitions> <DataGrid x:Name="Jobs_DataGrid" Grid.Row="1" Grid.RowSpan="2" Grid.Column="1" Margin="5" AutoGenerateColumns="False" MinHeight="50" IsReadOnly="True" ItemsSource="{Binding Path=AllJobs}"> <DataGrid.Columns> <DataGridTextColumn Header="Job #" Binding="{Binding Path=JobNumber}" /> <DataGridTextColumn Header="Job Name" Binding="{Binding Path=JobName}" Width="80"/> <DataGridTextColumn Header="Queue Count" Binding="{Binding Path=QueueCount}" /> <DataGridTextColumn Header="Total Plots" Binding="{Binding Path=TotalPlotCount}" /> <DataGridTextColumn Header="Plots in Progress" Binding="{Binding Path=RunsInProgress.Count}" /> <DataGridTextColumn Header="Plots Completed" Binding="{Binding Path=CompletedPlotCount}" /> <DataGridTextColumn Header="Plots Failed" Binding="{Binding Path=FailedPlotCount}" /> <DataGridTextColumn Header="Ignore Max Parallel" Binding="{Binding Path=IgnoreMaxParallel}" /> <DataGridTextColumn Header="Queue Delay" Binding="{Binding Path=DelayInMinutes}" /> <DataGridTextColumn Header="Status" Binding="{Binding Path=Status}" /> <DataGridTextColumn Header="Start Time" Binding="{Binding Path=StartTime}" /> </DataGrid.Columns> </DataGrid> <Button x:Name="AddJob_Button" Content="New Job" Grid.Row="1" Grid.Column="2" Margin="5" VerticalAlignment="Top"/> </Grid> </GroupBox> <GroupBox Header="Job Queues" x:Name="JobQueues_GroupBox" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="5" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="5" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="5" /> <RowDefinition Height="*" /> <RowDefinition Height="5" /> </Grid.RowDefinitions> <DataGrid x:Name="Queues_DataGrid" Grid.Row="1" Grid.Column="1" ItemsSource="{Binding Path=AllQueues}" AutoGenerateColumns="False" IsReadOnly="True" RowStyle="{StaticResource HighlightRow}" MaxHeight="100"> <DataGrid.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightBlue"/> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="LightGray" Opacity=".2"/> </DataGrid.Resources> <DataGrid.CellStyle> <Style TargetType="DataGridCell"> <Setter Property="BorderThickness" Value="0"/> <Setter Property="FocusVisualStyle" Value="{x:Null}"/> </Style> </DataGrid.CellStyle> <DataGrid.Columns> <DataGridTextColumn Header="Job #" Binding="{Binding Path=JobNumber}"/> <DataGridTextColumn Header="Job Name" Binding="{Binding Path=ParentJob.JobName}" Width="80"/> <DataGridTextColumn Header="Queue #" Binding="{Binding Path=QueueNumber}" /> <DataGridTextColumn Header="Current Run #" Binding="{Binding Path=CurrentRun.RunNumber}" /> <DataGridTextColumn Header="Plots Completed" Binding="{Binding Path=CompletedPlotCount}" /> <DataGridTextColumn Header="Plots Failed" Binding="{Binding Path=FailedPlotCount}" /> <DataGridTextColumn Header="Status" Binding="{Binding Path=Status}" /> <DataGridTextColumn Header="Run Time" Binding="{Binding Path=RunTime, StringFormat={}{0:hh} hrs {0:mm} mins}" /> <DataGridTemplateColumn Header="Pause/Resume"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="{Binding Path=ButtonContent}" Command="{Binding Path=PauseResumeCommand}" BorderThickness="0" IsEnabled="{Binding Path=ButtonEnabled}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </Grid> </GroupBox> <GroupBox Header="Queued Plots" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="3"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="5" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="5" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="5" /> <RowDefinition Height="*" /> <RowDefinition Height="5" /> </Grid.RowDefinitions> <TabControl TabStripPlacement="Top" Grid.Row="1" Grid.Column="1"> <TabItem Header="Current Runs"> <DataGrid x:Name="Runs_DataGrid" Grid.Row="1" Grid.Column="1" ItemsSource="{Binding Path=CurrentRuns}" IsReadOnly="True" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Job" Binding="{Binding Path=JobNumber}" /> <DataGridTextColumn Header="Job Name" Binding="{Binding Path=ParentQueue.ParentJob.JobName}" Width="80"/> <DataGridTextColumn Header="Queue" Binding="{Binding Path=QueueNumber}" /> <DataGridTextColumn Header="Run" Binding="{Binding Path=RunNumber}" /> <DataGridTextColumn Header="Phase" Binding="{Binding Path=Phase}" /> <DataGridTemplateColumn Width="150" Header="Progress" SortMemberPath="Progress" CanUserSort="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid> <ProgressBar x:Name="ProgressBar" Value="{Binding Progress}"/> <TextBlock Text="{Binding ElementName=ProgressBar, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="EstTimeRemaining" Binding="{Binding Path=EstTimeRemaining, StringFormat={}{0:hh} hrs {0:mm} mins {0:ss} sec}" /> <DataGridTextColumn Header="Run Time" Binding="{Binding Path=RunTime, StringFormat={}{0:hh} hrs {0:mm} mins}" /> <DataGridTextColumn Header="TempSize" Binding="{Binding Path=TempSize}" /> <DataGridTextColumn Header="TempDir" Binding="{Binding Path=PlottingParameters.TempVolume.DirectoryPath}" /> <DataGridTextColumn Header="FinalDir" Binding="{Binding Path=PlottingParameters.FinalVolume.DirectoryPath}" /> <DataGridTemplateColumn Header="Logs"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="Open Log" Command="{Binding Path=OpenLogFileCommand}" BorderBrush="DarkGray" ToolTip="{Binding Path=LogPath}" BorderThickness="1"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTemplateColumn Header="Logs Stats"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="Log Stats" Command="{Binding Path=OpenLogStatsCommand}" BorderBrush="Blue" ToolTip="{Binding Path=LogPath}" BorderThickness="1"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="PID" Binding="{Binding Path=ProcessID}" /> <DataGridTemplateColumn Header="Abort"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="Kill Process" Command="{Binding Path=KillProcessCommand}" BorderThickness="1" BorderBrush="Red"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="Threads" Binding="{Binding Path=PlottingParameters.Threads}" /> <DataGridTextColumn Header="RAM" Binding="{Binding Path=PlottingParameters.RAM}" /> </DataGrid.Columns> </DataGrid> </TabItem> <TabItem Header="All Runs"> <DataGrid x:Name="AllRuns_DataGrid" Grid.Row="1" Grid.Column="1" AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding Path=AllRuns}" RowStyle="{StaticResource HighlightRow}" > <DataGrid.Columns> <DataGridTextColumn Header="Job" Binding="{Binding Path=JobNumber}" /> <DataGridTextColumn Header="Queue" Binding="{Binding Path=QueueNumber}" /> <DataGridTextColumn Header="Run" Binding="{Binding Path=RunNumber}" /> <DataGridTextColumn Header="Start Time" Binding="{Binding Path=ChiaProcess.StartTime}" /> <DataGridTextColumn Header="End Time" Binding="{Binding Path=ExitTime}" /> <DataGridTextColumn Header="Run Time" Binding="{Binding Path=RunTime, StringFormat={}{0:hh} hrs {0:mm} mins}" /> <DataGridTextColumn Header="Status" Binding="{Binding Path=Status}" /> <DataGridTextColumn Header="Exit Code" Binding="{Binding Path=ExitCode}" /> <DataGridTextColumn Header="PID" Binding="{Binding Path=ProcessID}" /> <DataGridTemplateColumn Header="Logs"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="Open Log" Command="{Binding Path=OpenLogFileCommand}" ToolTip="{Binding Path=LogPath}" BorderThickness="0"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="Threads" Binding="{Binding Path=PlottingParameters.Threads}" /> <DataGridTextColumn Header="RAM" Binding="{Binding Path=PlottingParameters.RAM}" /> <DataGridTemplateColumn Header="Logs Stats"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="Log Stats" Command="{Binding Path=OpenLogStatsCommand}" ToolTip="{Binding Path=LogPath}" BorderThickness="0"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </TabItem> <TabItem Header="Completed Runs"> <DataGrid x:Name="CompletetedRuns_DataGrid" Grid.Row="1" Grid.Column="1" AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding Path=CompletedRuns}" RowStyle="{StaticResource HighlightRow}" > <DataGrid.Columns> <DataGridTextColumn Header="Job" Binding="{Binding Path=JobNumber}" /> <DataGridTextColumn Header="Queue" Binding="{Binding Path=QueueNumber}" /> <DataGridTextColumn Header="Run" Binding="{Binding Path=RunNumber}" /> <DataGridTextColumn Header="Run Time" Binding="{Binding Path=RunTime, StringFormat={}{0:hh} hrs {0:mm} mins}" /> <DataGridTextColumn Header="Status" Binding="{Binding Path=Status}" /> <DataGridTextColumn Header="Temp Directory" Binding="{Binding Path=PlottingParameters.TempVolume.DirectoryPath}" /> <DataGridTextColumn Header="Final Directory" Binding="{Binding Path=PlottingParameters.FinalVolume.DirectoryPath}" /> <DataGridTemplateColumn Header="Logs Stats"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="Log Stats" Command="{Binding Path=OpenLogStatsCommand}" ToolTip="{Binding Path=LogPath}" BorderThickness="0"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="PID" Binding="{Binding Path=ProcessID}" /> <DataGridTemplateColumn Header="Logs"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="Open Log" Command="{Binding Path=OpenLogFileCommand}" ToolTip="{Binding Path=LogPath}" BorderThickness="0"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="Threads" Binding="{Binding Path=PlottingParameters.Threads}" /> <DataGridTextColumn Header="RAM" Binding="{Binding Path=PlottingParameters.RAM}" /> </DataGrid.Columns> </DataGrid> </TabItem> <TabItem Header="Failed Runs"> <DataGrid x:Name="FailedRuns_DataGrid" Grid.Row="1" Grid.Column="1" AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding Path=FailedRuns}" RowStyle="{StaticResource HighlightRow}" > <DataGrid.Columns> <DataGridTextColumn Header="Job" Binding="{Binding Path=JobNumber}" /> <DataGridTextColumn Header="Queue" Binding="{Binding Path=QueueNumber}" /> <DataGridTextColumn Header="Run" Binding="{Binding Path=RunNumber}" /> <DataGridTextColumn Header="Start Time" Binding="{Binding Path=ChiaProcess.StartTime}" /> <DataGridTextColumn Header="End Time" Binding="{Binding Path=ChiaProcess.ExitTime}" /> <DataGridTextColumn Header="Run Time" Binding="{Binding Path=RunTime, StringFormat={}{0:hh} hrs {0:mm} mins}" /> <DataGridTextColumn Header="Status" Binding="{Binding Path=Status}" /> <DataGridTextColumn Header="Exit Code" Binding="{Binding Path=ChiaProcess.ExitCode}" /> <DataGridTextColumn Header="PID" Binding="{Binding Path=ProcessID}" /> <DataGridTemplateColumn Header="Logs"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="Open Log" Command="{Binding Path=OpenLogFileCommand}" ToolTip="{Binding Path=LogPath}" BorderThickness="0"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="Threads" Binding="{Binding Path=PlottingParameters.Threads}" /> <DataGridTextColumn Header="RAM" Binding="{Binding Path=PlottingParameters.RAM}" /> </DataGrid.Columns> </DataGrid> </TabItem> </TabControl> </Grid> </GroupBox> <GroupBox Header="Summary" Grid.Row="4" Grid.Column="1"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="5" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="5" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="5" /> <RowDefinition Height="*" /> <RowDefinition Height="5" /> </Grid.RowDefinitions> <UniformGrid Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" Rows="2" Columns="2"> <StackPanel Orientation="Vertical" Margin="2,0,2,0"> <StackPanel Orientation="Horizontal" Grid.Row="1" Grid.Column="1"> <Label Content="Plots Created: " /> <TextBlock Text="{Binding Path=CompletedRuns.Count}" VerticalAlignment="Center"/> </StackPanel> <StackPanel Orientation="Horizontal" Grid.Row="2" Grid.Column="1"> <Label Content="Failed Plots: " /> <TextBlock Text="{Binding Path=FailedRuns.Count}" VerticalAlignment="Center"/> </StackPanel> </StackPanel> <StackPanel Orientation="Vertical" Margin="2,0,2,0"> <StackPanel Orientation="Horizontal"> <Label Content="TB Per Day:" /> <TextBlock Text="{Binding Path=TBPlottedPerDay}" VerticalAlignment="Center"/> </StackPanel> <StackPanel Orientation="Horizontal"> <Label Content="Plots Per Day:" /> <TextBlock Text="{Binding Path=PlotPlottedPerDay}" VerticalAlignment="Center"/> </StackPanel> </StackPanel> <StackPanel Orientation="Vertical" Margin="2,0,2,0"> <StackPanel Orientation="Horizontal"> <Label Content="Best Time:" /> <TextBlock Text="{Binding Path=FastestRun, StringFormat={}{0:hh} hrs {0:mm} mins {0:ss} sec}" VerticalAlignment="Center"/> </StackPanel> <StackPanel Orientation="Horizontal"> <Label Content="Worst Time:" /> <TextBlock Text="{Binding Path=SlowestRun, StringFormat={}{0:hh} hrs {0:mm} mins {0:ss} sec}" VerticalAlignment="Center"/> </StackPanel> <StackPanel Orientation="Horizontal"> <Label Content="Average Time:" /> <TextBlock Text="{Binding Path=AverageTime, StringFormat={}{0:hh} hrs {0:mm} mins {0:ss} sec}" VerticalAlignment="Center"/> </StackPanel> </StackPanel> </UniformGrid> </Grid> </GroupBox> <GroupBox Grid.Row="4" Grid.Column="2"> <GroupBox.Header> <StackPanel Orientation="Horizontal"> <Label Content="Plotting and Farming Drives - " FontSize="10"/> <Button x:Name="RefreshdrivesButton" Content="Refresh" FontSize="10" Margin="0,5,5,0" MaxHeight="15" VerticalAlignment="Top" Foreground="DarkBlue" BorderThickness="0" Background="Transparent"/> </StackPanel> </GroupBox.Header> <DataGrid ItemsSource="{Binding Path=AllVolumes}" AutoGenerateColumns="False" CanUserReorderColumns="True" IsReadOnly="True" SelectionMode="Single" RowStyle="{StaticResource HighlightRow}"> <DataGrid.Columns> <DataGridTextColumn Header="DriveLetter" Binding="{Binding Path=DriveLetter}" /> <DataGridTextColumn Header="FreeSpace (GB)" Binding="{Binding Path=FreeSpaceInGB}" /> <DataGridTemplateColumn Width="150" Header="PercentFree %" SortMemberPath="PercentFree" CanUserSort="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid> <ProgressBar x:Name="FreeSpaceBar" Value="{Binding Path=PercentFree}" Background="Pink"/> <TextBlock Text="{Binding ElementName=FreeSpaceBar, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="Size (GB)" Binding="{Binding Path=SizeInGB}" /> <DataGridTextColumn Header="# Runs" Binding="{Binding Path=CurrentChiaRuns.Count}" /> <DataGridTextColumn Header="Pending Final Plots" Binding="{Binding Path=PendingFinalRuns.Count}" /> <DataGridTextColumn Header="Bus Type" Binding="{Binding Path=BusType}" /> <DataGridTextColumn Header="Media Type" Binding="{Binding Path=MediaType}" /> <DataGridTextColumn Header="Label" Binding="{Binding Path=Label}" /> </DataGrid.Columns> </DataGrid> </GroupBox> </Grid> </Window> |