Skip to content

Commit e65b384

Browse files
committed
Force dark theme, finished implementing fallback copy, allow multiple instances
1 parent ec60d8d commit e65b384

28 files changed

+441
-128
lines changed

FastCopy/AcrylicHelper.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ bool AcrylicHelper::trySetAcrylicBackdrop(AcrylicParameter const& parameter)
4545
m_window.Activated(activatedToken);
4646
}
4747
);
48+
49+
m_window.Content().as<winrt::Microsoft::UI::Xaml::FrameworkElement>().ActualThemeChanged([this](auto, auto)
50+
{
51+
if(m_configurationSource)
52+
setConfigurationSourceTheme();
53+
});
54+
4855
m_configurationSource.IsInputActive(true);
4956
setConfigurationSourceTheme();
5057
auto pt = m_window.try_as<winrt::Microsoft::UI::Composition::ICompositionSupportsSystemBackdrop>();
@@ -110,6 +117,13 @@ bool MicaHelper::trySetMicaBackdrop(MicaParameter const& parameter)
110117
m_configurationSource = nullptr;
111118
m_window.Activated(activatedToken);
112119
});
120+
121+
m_window.Content().as<winrt::Microsoft::UI::Xaml::FrameworkElement>().ActualThemeChanged([this](auto, auto)
122+
{
123+
if (m_configurationSource)
124+
setConfigurationSourceTheme();
125+
});
126+
113127
m_configurationSource.IsInputActive(true);
114128
setConfigurationSourceTheme();
115129
auto pt = m_window.try_as<winrt::Microsoft::UI::Composition::ICompositionSupportsSystemBackdrop>();

FastCopy/App.xaml.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ void App::OnLaunched(LaunchActivatedEventArgs const&)
106106
auto const destination = Command::Get().GetDestination();
107107
if (destination.empty())
108108
return;
109+
#ifndef _DEBUG
110+
if (recordFile.empty())
111+
return;
112+
#endif // !_DEBUG
113+
109114
//MessageBox(NULL, destination.data(), L"", 0);
110115
viewModel.Destination(destination);
111116
viewModel.RecordFile(recordFile);
@@ -122,6 +127,6 @@ void App::OnLaunched(LaunchActivatedEventArgs const&)
122127
window = make<CopyDialogWindow>();
123128
window.Activate();
124129
m_helper.emplace(window);
125-
130+
viewModel.Start();
126131

127132
}

FastCopy/Assets/FileDefault.ico

43.2 KB
Binary file not shown.

FastCopy/CommandLine.cpp

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <ranges>
44
#include <ShlObj_core.h>
55
#include <filesystem>
6+
#pragma comment(lib, "Shell32.lib")
67

78
static std::vector<std::wstring> const& GetCommandArgs()
89
{
@@ -32,35 +33,38 @@ winrt::hstring Command::GetDestination()
3233
auto& args = GetCommandArgs();
3334
constexpr static std::wstring_view protocol = L"fastcopy://";
3435

35-
return args.size() == 1 ? winrt::hstring{
36+
return args.size() == 1 ? winrt::hstring{
3637
#ifdef _DEBUG
37-
LR"(E:\test\Intel Unison/)"
38+
LR"(E:\test\Intel Unison)"
3839
#endif
39-
} : winrt::hstring{ args[1].substr(protocol.size()) };
40+
} : winrt::hstring{ args[1].substr(protocol.size(), args[1].find(L"|") - protocol.size()) };
4041

4142
}
4243

4344
static auto GetLocalDataFolder()
4445
{
45-
//static std::wstring ret = []
46-
//{
47-
// wchar_t* ptr;
48-
// SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &ptr);
49-
// std::wstring result{ ptr };
50-
// CoTaskMemFree(ptr);
51-
// return result;
52-
//}();
53-
//return ret;
5446
static auto ret = winrt::Windows::Storage::ApplicationData::Current().LocalCacheFolder().Path() + L"\\Local";
5547
std::filesystem::remove_all((ret + L"\\Microsoft").data());
5648
return ret;
5749
}
58-
#include <filesystem>
59-
#pragma comment(lib, "Shell32.lib")
50+
6051
std::wstring Command::RecordFile()
6152
{
62-
if (std::filesystem::is_empty(GetLocalDataFolder().data()))
63-
return L"";
64-
65-
return std::filesystem::directory_iterator{ GetLocalDataFolder().data()}->path().wstring();
53+
auto& args = GetCommandArgs();
54+
if (args.size() == 1)
55+
{
56+
return std::filesystem::is_empty(GetLocalDataFolder().data()) ?
57+
L"" :
58+
std::filesystem::directory_iterator{ GetLocalDataFolder().data() }->path().wstring();
59+
}
60+
else
61+
{
62+
auto result = args[1].substr(args[1].find(L"|") + 1);
63+
for (int i = 2; i < args.size(); ++i)
64+
{
65+
result += L" ";
66+
result += args[i];
67+
}
68+
return result.substr(0, result.find_last_not_of(L"/\\ ") + 1);
69+
}
6670
}

FastCopy/CopyDialog.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ namespace winrt::FastCopy::implementation
2424
{
2525
if (ProgressBar().ActualWidth() != 0 && !std::isnan(ProgressBar().ActualWidth()))
2626
{
27+
2728
WidthAnimation().To(ProgressBar().ActualWidth());
2829
ProgressBarEntranceAnimation().Begin();
2930
}
@@ -55,6 +56,39 @@ namespace winrt::FastCopy::implementation
5556
}
5657
}
5758

59+
CopyDialog::CopyDialog()
60+
{
61+
InitializeComponent();
62+
ViewModel().DuplicateFiles().VectorChanged(
63+
[this](winrt::Windows::Foundation::Collections::IObservableVector<winrt::FastCopy::FileCompareViewModel> original, auto)
64+
{
65+
if (original.Size() == 0)
66+
{
67+
UnloadObject(DuplicateFileInfoGrid());
68+
UnloadObject(ContinueButton());
69+
}
70+
else
71+
{
72+
DispatcherQueue().TryEnqueue([this]
73+
{
74+
FindName(L"ContinueButton");
75+
FindName(L"DuplicateFileItems");
76+
FindName(L"DuplicateFileInfoGrid");
77+
});
78+
}
79+
}
80+
);
81+
}
82+
83+
void CopyDialog::MainPanel_SizeChanged(winrt::Windows::Foundation::IInspectable const&, winrt::Microsoft::UI::Xaml::SizeChangedEventArgs const& e)
84+
{
85+
//The width will not automatically resized after applying storyboard animation
86+
//need this function to set it manually
87+
auto width = e.NewSize().Width;
88+
if (width != 0 && !std::isnan(width))
89+
ProgressBar().Width(width);
90+
}
91+
5892
}
5993

6094

@@ -66,6 +100,7 @@ void winrt::FastCopy::implementation::CopyDialog::CheckBox_Checked(winrt::Window
66100

67101
void winrt::FastCopy::implementation::CopyDialog::Button_Loaded(winrt::Windows::Foundation::IInspectable const& sender, winrt::Microsoft::UI::Xaml::RoutedEventArgs const& e)
68102
{
103+
69104
//winrt::Microsoft::UI::Xaml::Media::Animation::DoubleAnimation animation;
70105
//animation.From(0.0);
71106
//animation.To(100.0);
@@ -84,3 +119,5 @@ void winrt::FastCopy::implementation::CopyDialog::Button_Loaded(winrt::Windows::
84119
//MyAnimation().SetTargetProperty(MyAnimation(), L"Value");
85120
//MyAnimation().Begin();
86121
}
122+
123+

FastCopy/CopyDialog.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,15 @@ namespace winrt::FastCopy::implementation
77
{
88
struct CopyDialog : CopyDialogT<CopyDialog>
99
{
10-
CopyDialog()
11-
{
12-
// Xaml objects should not call InitializeComponent during construction.
13-
// See https://github.com/microsoft/cppwinrt/tree/master/nuget#initializecomponent
14-
InitializeComponent();
15-
}
10+
CopyDialog();
1611

1712
winrt::FastCopy::RobocopyViewModel ViewModel();
1813
void ProgressBar_Loaded(winrt::Windows::Foundation::IInspectable const& sender, winrt::Microsoft::UI::Xaml::RoutedEventArgs const& e);
1914
void HyperlinkButton_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Microsoft::UI::Xaml::RoutedEventArgs const& e);
2015
void PauseButton_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Microsoft::UI::Xaml::RoutedEventArgs const& e);
2116
void CheckBox_Checked(winrt::Windows::Foundation::IInspectable const& sender, winrt::Microsoft::UI::Xaml::RoutedEventArgs const& e);
2217
void Button_Loaded(winrt::Windows::Foundation::IInspectable const& sender, winrt::Microsoft::UI::Xaml::RoutedEventArgs const& e);
23-
18+
void MainPanel_SizeChanged(winrt::Windows::Foundation::IInspectable const& sender, winrt::Microsoft::UI::Xaml::SizeChangedEventArgs const& e);
2419
private:
2520
winrt::FastCopy::AnimatedValue m_height;
2621
};

FastCopy/CopyDialog.xaml

Lines changed: 68 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
xmlns:local="using:FastCopy"
66
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
77
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
8-
mc:Ignorable="d">
8+
mc:Ignorable="d"
9+
RequestedTheme="Dark">
910

1011
<Page.Resources>
1112
<Style x:Key="HeaderTextStyle" TargetType="TextBlock">
@@ -54,18 +55,18 @@
5455
<x:Double x:Key="SeperatorLineOpacity">0.1</x:Double>
5556
</Page.Resources>
5657

57-
<Grid Margin="15" x:Name="MainPanel">
58+
<Grid Margin="15" x:Name="MainPanel" SizeChanged="MainPanel_SizeChanged">
5859
<Grid.RowDefinitions>
5960
<RowDefinition Height="Auto"/>
6061
<RowDefinition Height="Auto"/>
6162
<RowDefinition Height="Auto"/>
6263
<RowDefinition Height="Auto"/>
63-
<RowDefinition Height="Auto"/>
64+
<RowDefinition Height="*"/>
6465
<RowDefinition Height="Auto"/>
6566
</Grid.RowDefinitions>
6667

6768
<TextBlock Style="{StaticResource HeaderTextStyle}">
68-
<Run Text="{x:Bind ViewModel.Percent,Converter={StaticResource NumberToStringConverter}, ConverterParameter=2, Mode=OneWay}"/>% Complete
69+
<Run Text="{x:Bind ViewModel.Percent,Converter={StaticResource NumberToStringConverter}, ConverterParameter=2, Mode=OneWay}"/>%
6970
</TextBlock>
7071

7172
<TextBlock x:Name="SpeedText" Text="{x:Bind ViewModel.SpeedText,Mode=OneWay}" Style="{StaticResource StatusTextStyle}" HorizontalAlignment="Right" VerticalAlignment="Bottom"/>
@@ -99,12 +100,12 @@
99100
</Button>
100101
</StackPanel>
101102

102-
<local:ProgressBarEx x:Name="ProgressBar" Loaded="ProgressBar_Loaded" Margin="0,10,0,0" HorizontalAlignment="Stretch"
103+
<local:ProgressBarEx x:Name="ProgressBar" Loaded="ProgressBar_Loaded" Margin="0,10,0,0" HorizontalAlignment="Stretch"
103104
Percent="{x:Bind ViewModel.Percent, Mode=OneWay}" Height="5" Color="Green" Grid.Row="2"/>
104-
105+
105106
<!---Red: BB0000 -->
106107
<!--Duplicate files area-->
107-
<Grid Grid.Row="3">
108+
<Grid Grid.Row="3" x:Name="DuplicateFileInfoGrid" x:Load="False">
108109
<Grid.ColumnDefinitions>
109110
<ColumnDefinition Width="*"/>
110111
<ColumnDefinition Width="*"/>
@@ -126,55 +127,67 @@
126127
<Line Margin="0,0,0,0" Grid.Row="1" Grid.ColumnSpan="2" X1="0" X2="500" Y1="45" Y2="45" Stroke="{StaticResource SeperatorLineColor}" Opacity="{StaticResource SeperatorLineOpacity}"/>
127128
</Grid>
128129

129-
<ItemsRepeater Grid.Row="4" Margin="0,24,0,0" ItemsSource="{x:Bind ViewModel.DuplicateFiles}">
130-
<ItemsRepeater.Layout>
131-
<StackLayout Orientation="Vertical"/>
132-
</ItemsRepeater.Layout>
133-
<ItemsRepeater.ItemTemplate>
134-
<DataTemplate x:DataType="local:FileCompareViewModel">
135-
<Grid>
136-
<Grid.RowDefinitions>
137-
<RowDefinition Height="Auto"/>
138-
<RowDefinition Height="Auto"/>
139-
<RowDefinition Height="Auto"/>
140-
</Grid.RowDefinitions>
141-
<Grid.ColumnDefinitions>
142-
<ColumnDefinition Width="*"/>
143-
<ColumnDefinition Width="*"/>
144-
</Grid.ColumnDefinitions>
145-
146-
<StackPanel Grid.ColumnSpan="2" HorizontalAlignment="Left" CornerRadius="3">
147-
<StackPanel.Background>
148-
<SolidColorBrush Color="{StaticResource DuplicateFilenameColor}" Opacity="{StaticResource DuplicateFilenameBackgroundOpacity}"/>
149-
</StackPanel.Background>
150-
<TextBlock Padding="4,0,4,4" Text="{x:Bind File1.Filename}" Foreground="{StaticResource DuplicateFilenameColor}"/>
151-
</StackPanel>
152-
<CheckBox Grid.Row="1" Margin="0,5,0,0" IsChecked="{x:Bind File1.Selected, Mode=TwoWay}">
153-
<StackPanel Orientation="Horizontal" Margin="11,0,0,0">
154-
<Image Source="{x:Bind File1.Bitmap}" Width="48" Height="48" Stretch="Uniform"/>
155-
<StackPanel Margin="10,0,0,0" Orientation="Vertical">
156-
<TextBlock Text="{x:Bind File1.CreationDate,Converter={StaticResource DateTimeToStringConverter}}"/>
157-
<TextBlock Text="{x:Bind File1.Bytes, Converter={StaticResource ReadableSizeConverter}}"/>
158-
</StackPanel>
130+
<ScrollViewer Grid.Row="4" Margin="0,24,0,0">
131+
<ItemsRepeater x:Load="False" Grid.Row="4" ItemsSource="{x:Bind ViewModel.DuplicateFiles}" x:Name="DuplicateFileItems">
132+
<ItemsRepeater.Layout>
133+
<StackLayout Orientation="Vertical"/>
134+
</ItemsRepeater.Layout>
135+
<ItemsRepeater.ItemTemplate>
136+
<DataTemplate x:DataType="local:FileCompareViewModel">
137+
<Grid>
138+
<Grid.RowDefinitions>
139+
<RowDefinition Height="Auto"/>
140+
<RowDefinition Height="Auto"/>
141+
<RowDefinition Height="Auto"/>
142+
</Grid.RowDefinitions>
143+
<Grid.ColumnDefinitions>
144+
<ColumnDefinition Width="*"/>
145+
<ColumnDefinition Width="*"/>
146+
</Grid.ColumnDefinitions>
147+
148+
<StackPanel Grid.ColumnSpan="2" HorizontalAlignment="Left" CornerRadius="3">
149+
<StackPanel.Background>
150+
<SolidColorBrush Color="{StaticResource DuplicateFilenameColor}" Opacity="{StaticResource DuplicateFilenameBackgroundOpacity}"/>
151+
</StackPanel.Background>
152+
<TextBlock Padding="4,0,4,4" Text="{x:Bind File1.Filename}" Foreground="{StaticResource DuplicateFilenameColor}"/>
159153
</StackPanel>
160-
</CheckBox>
161-
162-
<CheckBox Grid.Row="1" Grid.Column="1" IsChecked="{x:Bind File2.Selected, Mode=TwoWay}">
163-
<StackPanel Orientation="Horizontal" Margin="11,0,0,0">
164-
<Image Source="{x:Bind File2.Bitmap}" Width="48" Height="48" Stretch="Uniform"/>
165-
<StackPanel Margin="10,0,0,0" Orientation="Vertical">
166-
<TextBlock Text="{x:Bind File2.CreationDate, Converter={StaticResource DateTimeToStringConverter}}"/>
167-
<TextBlock Text="{x:Bind File2.Bytes,Converter={StaticResource ReadableSizeConverter}}"/>
154+
<CheckBox Grid.Row="1" Margin="0,5,0,0" IsChecked="{x:Bind File1.Selected, Mode=TwoWay}">
155+
<StackPanel Orientation="Horizontal" Margin="11,0,0,0">
156+
<Image Source="{x:Bind File1.Bitmap}" Width="48" Height="48" Stretch="Uniform"/>
157+
<StackPanel Margin="10,0,0,0" Orientation="Vertical">
158+
<TextBlock Text="{x:Bind File1.CreationDate,Converter={StaticResource DateTimeToStringConverter}}"/>
159+
<TextBlock Text="{x:Bind File1.Bytes, Converter={StaticResource ReadableSizeConverter}}"/>
160+
</StackPanel>
168161
</StackPanel>
169-
</StackPanel>
170-
</CheckBox>
171-
172-
<Line Margin="0,22,0,0" Grid.Row="2" Grid.ColumnSpan="2" X1="0" X2="500" Stroke="{StaticResource SeperatorLineColor}" Opacity="{StaticResource SeperatorLineOpacity}"/>
173-
</Grid>
174-
</DataTemplate>
175-
</ItemsRepeater.ItemTemplate>
176-
</ItemsRepeater>
177-
178-
<Button x:Uid="ContinueButton" HorizontalAlignment="Right" Grid.Row="5" Style="{StaticResource AccentButtonStyle}" Loaded="Button_Loaded"/>
162+
</CheckBox>
163+
164+
<CheckBox Grid.Row="1" Grid.Column="1" IsChecked="{x:Bind File2.Selected, Mode=TwoWay}">
165+
<StackPanel Orientation="Horizontal" Margin="11,0,0,0">
166+
<Image Source="{x:Bind File2.Bitmap}" Width="48" Height="48" Stretch="Uniform"/>
167+
<StackPanel Margin="10,0,0,0" Orientation="Vertical">
168+
<TextBlock Text="{x:Bind File2.CreationDate, Converter={StaticResource DateTimeToStringConverter}}"/>
169+
<TextBlock Text="{x:Bind File2.Bytes,Converter={StaticResource ReadableSizeConverter}}"/>
170+
</StackPanel>
171+
</StackPanel>
172+
</CheckBox>
173+
174+
<Line Margin="0,18,0,5" Grid.Row="2" Grid.ColumnSpan="2" X1="0" X2="500" Stroke="{StaticResource SeperatorLineColor}" Opacity="{StaticResource SeperatorLineOpacity}"/>
175+
</Grid>
176+
</DataTemplate>
177+
</ItemsRepeater.ItemTemplate>
178+
</ItemsRepeater>
179+
</ScrollViewer>
180+
181+
<Button x:Load="False"
182+
x:Name="ContinueButton"
183+
x:Uid="ContinueButton"
184+
Margin="0,10,0,0"
185+
HorizontalAlignment="Right"
186+
Grid.Row="5"
187+
Style="{StaticResource AccentButtonStyle}"
188+
Loaded="Button_Loaded"
189+
Click="{x:Bind ViewModel.ConfirmDuplicates}"
190+
IsEnabled="{x:Bind ViewModel.CanContinue,Mode=OneWay}"
191+
/>
179192
</Grid>
180193
</Page>

0 commit comments

Comments
 (0)