Skip to content
This repository was archived by the owner on Nov 27, 2024. It is now read-only.

Commit c370dd3

Browse files
committed
GUI Image Inpaint process added
1 parent 61b13a3 commit c370dd3

File tree

6 files changed

+539
-15
lines changed

6 files changed

+539
-15
lines changed

OnnxStack.UI/MainWindow.xaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,21 @@
5151
<views:ImageToImage />
5252
</TabItem>
5353

54+
<!--Image Inpaint-->
55+
<TabItem>
56+
<TabItem.Header>
57+
<StackPanel Orientation="Horizontal" Margin="5">
58+
<StackPanel Orientation="Horizontal">
59+
<userControls:FontAwesome Icon="&#xf1fc;" IconStyle="Light"/>
60+
<userControls:FontAwesome Icon="&#xf054;" IconStyle="Regular" Size="8" Margin="3"/>
61+
<userControls:FontAwesome Icon="&#xf1c5;" IconStyle="Light"/>
62+
</StackPanel>
63+
<TextBlock Text="Image Inpaint" Margin="5,0,0,0"/>
64+
</StackPanel>
65+
</TabItem.Header>
66+
<views:ImageInpaint />
67+
</TabItem>
68+
5469
</TabControl>
5570
</Grid>
5671
</Window>

OnnxStack.UI/UserControls/ImageInputControl.xaml

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,22 @@
1414
<Style TargetType="{x:Type Label}">
1515
<Setter Property="Margin" Value="-4,0,0,-4"/>
1616
</Style>
17+
<SolidColorBrush x:Key="RedHighlight" Color="Red" Opacity="0.5" />
1718
</UserControl.Resources>
1819

1920
<Border DataContext="{Binding ElementName=UI}" BorderBrush="LightGray" BorderThickness="2" >
2021
<StackPanel Margin="2" >
21-
<Canvas MinHeight="512" MinWidth="512">
22+
<Canvas MinHeight="512" MinWidth="512" >
2223
<Image Source="{Binding Result.Image, FallbackValue={StaticResource PlaceholderImage}, TargetNullValue={StaticResource PlaceholderImage}}" Width="{Binding SchedulerOptions.Width}" Height="{Binding SchedulerOptions.Height}" MinHeight="512" MinWidth="512"/>
23-
<InkCanvas x:Name="MaskCanvas" Background="Transparent" ForceCursor="True" Cursor="Pen" MinHeight="512" MinWidth="512"
24+
<InkCanvas x:Name="MaskCanvas" Background="Transparent" ForceCursor="True" Cursor="Pen" MinHeight="512" MinWidth="512" PreviewMouseLeftButtonDown="MaskCanvas_MouseLeftButtonDown"
2425
IsEnabled="{Binding HasResult}"
2526
EditingMode="{Binding MaskEditingMode}"
2627
Width="{Binding SchedulerOptions.Width}"
2728
Height="{Binding SchedulerOptions.Height}"
2829
DefaultDrawingAttributes="{Binding MaskAttributes}"
2930
Visibility="{Binding IsMaskEnabled, Converter={StaticResource BooleanToVisibilityConverter}}"/>
3031
</Canvas>
31-
32+
3233
<UniformGrid Columns="1" Height="30" Visibility="{Binding HasResult, Converter={StaticResource BooleanToHiddenConverter}}">
3334
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,3">
3435
<TextBlock Text="Image File:" Margin="5,0,0,0" FontSize="10" Opacity=".6" VerticalAlignment="Center" FontStyle="Italic"/>
@@ -50,6 +51,15 @@
5051
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal" IsEnabled="{Binding HasResult}" Visibility="{Binding IsMaskEnabled, Converter={StaticResource BooleanToVisibilityConverter}}">
5152
<Button DockPanel.Dock="Right" Command="{Binding SaveMaskCommand}" Width="50" BorderThickness="1,1,0,1">
5253
<userControls:FontAwesome Icon="&#xf0c7;" IconStyle="Light" />
54+
<Button.Style>
55+
<Style TargetType="{x:Type Button}">
56+
<Style.Triggers>
57+
<DataTrigger Binding="{Binding Path=HasMaskChanged}" Value="True">
58+
<Setter Property="Background" Value="{StaticResource RedHighlight}" />
59+
</DataTrigger>
60+
</Style.Triggers>
61+
</Style>
62+
</Button.Style>
5363
</Button>
5464
<Button DockPanel.Dock="Right" Command="{Binding MaskModeCommand}" Width="50" Visibility="{Binding IsMaskEraserEnabled, Converter={StaticResource BooleanToVisibilityConverter}}">
5565
<userControls:FontAwesome Icon="&#xf304;" IconStyle="Light" />

OnnxStack.UI/UserControls/ImageInputControl.xaml.cs

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ public partial class ImageInputControl : UserControl, INotifyPropertyChanged
1717
{
1818
private readonly IDialogService _dialogService;
1919

20-
private int _maskDrawSize = 20;
20+
private int _maskDrawSize;
21+
private bool _hasMaskChanged;
2122
private bool _isMaskEraserEnabled;
2223
private DrawingAttributes _maskAttributes;
2324
private InkCanvasEditingMode _maskEditingMode = InkCanvasEditingMode.Ink;
@@ -30,6 +31,7 @@ public ImageInputControl()
3031
if (!DesignerProperties.GetIsInDesignMode(this))
3132
_dialogService = App.GetService<IDialogService>();
3233

34+
MaskDrawSize = 20;
3335
LoadImageCommand = new AsyncRelayCommand(LoadImage);
3436
ClearImageCommand = new AsyncRelayCommand(ClearImage);
3537
MaskModeCommand = new AsyncRelayCommand(MaskMode);
@@ -58,7 +60,11 @@ public ImageInput MaskResult
5860
}
5961

6062
public static readonly DependencyProperty MaskResultProperty =
61-
DependencyProperty.Register("MaskResult", typeof(ImageInput), typeof(ImageInputControl));
63+
DependencyProperty.Register("MaskResult", typeof(ImageInput), typeof(ImageInputControl), new PropertyMetadata((s, e) =>
64+
{
65+
if (e.NewValue is null && s is ImageInputControl control)
66+
control.ClearMask();
67+
}));
6268

6369
public SchedulerOptionsModel SchedulerOptions
6470
{
@@ -116,6 +122,12 @@ public bool IsMaskEraserEnabled
116122
set { _isMaskEraserEnabled = value; NotifyPropertyChanged(); }
117123
}
118124

125+
public bool HasMaskChanged
126+
{
127+
get { return _hasMaskChanged; }
128+
set { _hasMaskChanged = value; NotifyPropertyChanged(); }
129+
}
130+
119131
public int MaskDrawSize
120132
{
121133
get { return _maskDrawSize; }
@@ -138,6 +150,7 @@ private Task LoadImage()
138150
loadImageDialog.Initialize(SchedulerOptions.Width, SchedulerOptions.Height);
139151
if (loadImageDialog.ShowDialog() == true)
140152
{
153+
ClearImage();
141154
Result = new ImageInput
142155
{
143156
Image = loadImageDialog.GetImageResult(),
@@ -158,11 +171,21 @@ private Task ClearImage()
158171
Result = null;
159172
MaskResult = null;
160173
HasResult = false;
174+
ClearMask();
175+
return Task.CompletedTask;
176+
}
177+
178+
179+
/// <summary>
180+
/// Clears the mask.
181+
/// </summary>
182+
private void ClearMask()
183+
{
161184
HasMaskResult = false;
185+
HasMaskChanged = false;
162186
MaskCanvas.Strokes.Clear();
163187
IsMaskEraserEnabled = false;
164188
MaskEditingMode = InkCanvasEditingMode.Ink;
165-
return Task.CompletedTask;
166189
}
167190

168191

@@ -178,6 +201,7 @@ private Task SaveMask()
178201
FileName = "OnnxStack Generated Mask",
179202
};
180203
HasMaskResult = true;
204+
HasMaskChanged = false;
181205
return Task.CompletedTask;
182206
}
183207

@@ -236,12 +260,27 @@ public BitmapSource CreateMaskImage()
236260
return renderBitmap;
237261
}
238262

263+
264+
/// <summary>
265+
/// Handles the MouseLeftButtonDown event of the MaskCanvas control.
266+
/// </summary>
267+
/// <param name="sender">The source of the event.</param>
268+
/// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>
269+
private void MaskCanvas_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
270+
{
271+
HasMaskResult = false;
272+
HasMaskChanged = true;
273+
}
274+
239275
#region INotifyPropertyChanged
240276
public event PropertyChangedEventHandler PropertyChanged;
241277
public void NotifyPropertyChanged([CallerMemberName] string property = "")
242278
{
243279
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
244280
}
281+
245282
#endregion
283+
284+
246285
}
247286
}

OnnxStack.UI/UserControls/SchedulerControl.xaml

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,7 @@
7373
</UniformGrid>
7474

7575
<UniformGrid Columns="2" Margin="0,10,0,10">
76-
<UniformGrid.Style>
77-
<Style TargetType="{x:Type UniformGrid}">
78-
<Style.Triggers>
79-
<DataTrigger Binding="{Binding Path=ProcessType}" Value="TextToImage">
80-
<Setter Property="Visibility" Value="Collapsed" />
81-
</DataTrigger>
82-
</Style.Triggers>
83-
</Style>
84-
</UniformGrid.Style>
76+
8577

8678
<StackPanel Margin="0,0,5,0">
8779
<DockPanel>
@@ -93,6 +85,15 @@
9385
<behaviors:SliderMouseWheelBehavior />
9486
</i:Interaction.Behaviors>
9587
</Slider>
88+
<StackPanel.Style>
89+
<Style TargetType="{x:Type StackPanel}">
90+
<Style.Triggers>
91+
<DataTrigger Binding="{Binding Path=ProcessType}" Value="TextToImage">
92+
<Setter Property="Visibility" Value="Collapsed" />
93+
</DataTrigger>
94+
</Style.Triggers>
95+
</Style>
96+
</StackPanel.Style>
9697
</StackPanel>
9798

9899
<StackPanel Margin="5,0,0,0">
@@ -105,6 +106,18 @@
105106
<behaviors:SliderMouseWheelBehavior />
106107
</i:Interaction.Behaviors>
107108
</Slider>
109+
<StackPanel.Style>
110+
<Style TargetType="{x:Type StackPanel}">
111+
<Style.Triggers>
112+
<DataTrigger Binding="{Binding Path=ProcessType}" Value="TextToImage">
113+
<Setter Property="Visibility" Value="Collapsed" />
114+
</DataTrigger>
115+
<DataTrigger Binding="{Binding Path=ProcessType}" Value="ImageInpaint">
116+
<Setter Property="Visibility" Value="Collapsed" />
117+
</DataTrigger>
118+
</Style.Triggers>
119+
</Style>
120+
</StackPanel.Style>
108121
</StackPanel>
109122
</UniformGrid>
110123

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<UserControl x:Class="OnnxStack.UI.Views.ImageInpaint"
2+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6+
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
7+
xmlns:userControls="clr-namespace:OnnxStack.UI.UserControls"
8+
Name="UI" mc:Ignorable="d" d:DesignWidth="1000" d:DesignHeight="800" >
9+
<Grid DataContext="{Binding ElementName=UI}" >
10+
<Grid.ColumnDefinitions>
11+
<ColumnDefinition Width="340" />
12+
<ColumnDefinition Width="10" />
13+
<ColumnDefinition Width="*" />
14+
</Grid.ColumnDefinitions>
15+
16+
<!--Control Panel-->
17+
<DockPanel Grid.Column="0" DataContext="{Binding ElementName=UI}" Margin="3">
18+
<UniformGrid DockPanel.Dock="Bottom" Columns="2" Height="30">
19+
<Button Content="Cancel" Command="{Binding CancelCommand}" BorderThickness="1,1,0,1"/>
20+
<Button Content="Generate" Command="{Binding GenerateCommand}" />
21+
</UniformGrid>
22+
<DockPanel>
23+
<StackPanel IsEnabled="{Binding IsGenerating, Converter={StaticResource InverseBoolConverter}}">
24+
<userControls:PromptControl PromptOptions="{Binding PromptOptions}" />
25+
<userControls:SchedulerControl SchedulerOptions="{Binding SchedulerOptions, Mode=TwoWay}" ProcessType="ImageInpaint" Margin="0, 10, 0 ,0"/>
26+
</StackPanel>
27+
</DockPanel>
28+
</DockPanel>
29+
30+
<GridSplitter Grid.Column="1" Width="4" HorizontalAlignment="Stretch" />
31+
32+
<!--Content Panel-->
33+
<DockPanel Grid.Column="2" >
34+
35+
<!--Generate Tab-->
36+
<TabControl SelectedIndex="{Binding SelectedTabIndex}">
37+
<TabItem>
38+
<TabItem.Header>
39+
<StackPanel Orientation="Horizontal" Margin="15,5">
40+
<userControls:FontAwesome Icon="&#xf0d0;" IconStyle="Light"/>
41+
<TextBlock Text="Generate" Margin="5,0,0,0"/>
42+
</StackPanel>
43+
</TabItem.Header>
44+
<UniformGrid Columns="2" VerticalAlignment="Center" HorizontalAlignment="Center">
45+
<Viewbox Margin="40,40,20,40" >
46+
<userControls:ImageInputControl
47+
Result="{Binding InputImage, Mode=TwoWay}"
48+
HasResult="{Binding HasInputResult, Mode=TwoWay}"
49+
MaskResult="{Binding InputImageMask, Mode=TwoWay}"
50+
HasMaskResult="{Binding HasInputMaskResult, Mode=TwoWay}"
51+
SchedulerOptions="{Binding SchedulerOptions}"
52+
IsMaskEnabled="True"/>
53+
</Viewbox>
54+
<Viewbox Margin="20,40,40,40" >
55+
<userControls:ImageResultControl
56+
Result="{Binding ResultImage}"
57+
HasResult="{Binding HasResult}"
58+
ProgressMax="{Binding ProgressMax}"
59+
ProgressValue="{Binding ProgressValue}"
60+
SchedulerOptions="{Binding SchedulerOptions, Mode=TwoWay}" />
61+
</Viewbox>
62+
</UniformGrid>
63+
</TabItem>
64+
65+
<!--History Tab-->
66+
<TabItem>
67+
<TabItem.Header>
68+
<StackPanel Orientation="Horizontal" Margin="15,5">
69+
<userControls:FontAwesome Icon="&#xf03a;" IconStyle="Light"/>
70+
<TextBlock Text="History" Margin="5,0,0,0"/>
71+
</StackPanel>
72+
</TabItem.Header>
73+
<DockPanel>
74+
<DockPanel DockPanel.Dock="Bottom" HorizontalAlignment="Right">
75+
<StackPanel Orientation="Horizontal" Margin="0,4,0,0">
76+
<Button Command="{Binding ClearHistoryCommand}" Padding="10,3" Height="30">
77+
<userControls:FontAwesome Icon="&#xf2ed;" IconStyle="Light"/>
78+
</Button>
79+
</StackPanel>
80+
</DockPanel>
81+
<ListBox ItemsSource="{Binding}" ItemContainerStyle="{StaticResource ImageResultListBoxItem}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
82+
<ListBox.DataContext>
83+
<CollectionViewSource Source="{Binding ImageResults, ElementName=UI}">
84+
<CollectionViewSource.SortDescriptions>
85+
<scm:SortDescription PropertyName="Timestamp" Direction="Descending" />
86+
</CollectionViewSource.SortDescriptions>
87+
</CollectionViewSource>
88+
</ListBox.DataContext>
89+
<ListBox.ItemsPanel>
90+
<ItemsPanelTemplate>
91+
<WrapPanel />
92+
</ItemsPanelTemplate>
93+
</ListBox.ItemsPanel>
94+
</ListBox>
95+
</DockPanel>
96+
</TabItem>
97+
98+
</TabControl>
99+
</DockPanel>
100+
</Grid>
101+
</UserControl>

0 commit comments

Comments
 (0)