move interfaces to separate folder

This commit is contained in:
2025-12-10 22:32:48 +05:00
parent 30256a86c2
commit b1d4f3693b
16 changed files with 244 additions and 183 deletions

View File

@@ -1,4 +1,5 @@
using System.Windows; using System.Windows;
using CodeContextGenerator.Interfaces;
using CodeContextGenerator.Services; using CodeContextGenerator.Services;
using CodeContextGenerator.ViewModels; using CodeContextGenerator.ViewModels;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;

View File

@@ -0,0 +1,6 @@
namespace CodeContextGenerator.Interfaces;
public interface IContextFileGenerator
{
Task GenerateContextFileAsync(List<string> selectedFiles, string outputPath, string projectRootPath, IProgress<int> progress, CancellationToken cancellationToken);
}

View File

@@ -0,0 +1,6 @@
namespace CodeContextGenerator.Interfaces;
public interface IFileProcessorService
{
string ProcessFileContent(string content, string fileName);
}

View File

@@ -0,0 +1,9 @@
using CodeContextGenerator.Models;
namespace CodeContextGenerator.Interfaces;
public interface IFileScannerService
{
Task BuildDirectoryTreeAsync(string path, FileItem parentItem, IProgress<int> progress = null, CancellationToken cancellationToken = default);
List<string> GetSelectedFiles(FileItem rootItem);
}

View File

@@ -0,0 +1,9 @@
using CodeContextGenerator.Models;
namespace CodeContextGenerator.Interfaces;
public interface IProjectLoaderService
{
Task<FileItem> LoadProjectFromPathAsync(string projectPath, IProgress<int> progress, CancellationToken cancellationToken);
string GetDefaultOutputFileName(string projectPath);
}

View File

@@ -0,0 +1,7 @@
namespace CodeContextGenerator.Interfaces;
public interface ISettingsService
{
string GetLastProjectPath();
void SaveLastProjectPath(string path);
}

View File

@@ -0,0 +1,11 @@
using System.Windows;
namespace CodeContextGenerator.Interfaces;
public interface IUIService
{
string ShowFolderBrowserDialog(string initialDirectory = null);
bool ShowOpenProjectFileDialog(out string selectedPath);
bool ShowSaveFileDialog(string defaultFileName, string initialDirectory, out string savePath);
void ShowMessage(string message, string title, MessageBoxImage icon = MessageBoxImage.Information);
}

View File

@@ -1,13 +1,9 @@
using System.IO; using CodeContextGenerator.Interfaces;
using System.IO;
using System.Text; using System.Text;
namespace CodeContextGenerator.Services; namespace CodeContextGenerator.Services;
public interface IContextFileGenerator
{
Task GenerateContextFileAsync(List<string> selectedFiles, string outputPath, string projectRootPath, IProgress<int> progress, CancellationToken cancellationToken);
}
public class ContextFileGenerator : IContextFileGenerator public class ContextFileGenerator : IContextFileGenerator
{ {
private readonly IFileProcessorService _fileProcessorService; private readonly IFileProcessorService _fileProcessorService;

View File

@@ -1,13 +1,9 @@
using System.Text; using CodeContextGenerator.Interfaces;
using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace CodeContextGenerator.Services; namespace CodeContextGenerator.Services;
public interface IFileProcessorService
{
string ProcessFileContent(string content, string fileName);
}
public class FileProcessorService : IFileProcessorService public class FileProcessorService : IFileProcessorService
{ {
public string ProcessFileContent(string content, string fileName) public string ProcessFileContent(string content, string fileName)

View File

@@ -1,14 +1,9 @@
using CodeContextGenerator.Models; using CodeContextGenerator.Interfaces;
using CodeContextGenerator.Models;
using System.IO; using System.IO;
namespace CodeContextGenerator.Services; namespace CodeContextGenerator.Services;
public interface IFileScannerService
{
Task BuildDirectoryTreeAsync(string path, FileItem parentItem, IProgress<int> progress = null, CancellationToken cancellationToken = default);
List<string> GetSelectedFiles(FileItem rootItem);
}
public class FileScannerService : IFileScannerService public class FileScannerService : IFileScannerService
{ {
private static readonly string[] ExcludedDirectories = { private static readonly string[] ExcludedDirectories = {

View File

@@ -1,15 +1,10 @@
using CodeContextGenerator.Models; using CodeContextGenerator.Interfaces;
using CodeContextGenerator.Models;
using System.IO; using System.IO;
using System.Windows; using System.Windows;
namespace CodeContextGenerator.Services; namespace CodeContextGenerator.Services;
public interface IProjectLoaderService
{
Task<FileItem> LoadProjectFromPathAsync(string projectPath, IProgress<int> progress, CancellationToken cancellationToken);
string GetDefaultOutputFileName(string projectPath);
}
public class ProjectLoaderService : IProjectLoaderService public class ProjectLoaderService : IProjectLoaderService
{ {
private readonly IFileScannerService _fileScannerService; private readonly IFileScannerService _fileScannerService;

View File

@@ -1,12 +1,8 @@
using System.IO; using CodeContextGenerator.Models;
using CodeContextGenerator.Models; using System.IO;
using System.Collections.Generic;
using System.Linq; namespace CodeContextGenerator.Services;
using System.Threading.Tasks;
using System.Threading;
namespace CodeContextGenerator.Services
{
public static class ProjectScannerService public static class ProjectScannerService
{ {
private static readonly string[] ExcludedDirectories = { private static readonly string[] ExcludedDirectories = {
@@ -93,4 +89,3 @@ namespace CodeContextGenerator.Services
} }
} }
} }
}

View File

@@ -1,14 +1,9 @@
using System.IO; using CodeContextGenerator.Interfaces;
using System.IO;
using System.Text.Json; using System.Text.Json;
namespace CodeContextGenerator.Services; namespace CodeContextGenerator.Services;
public interface ISettingsService
{
string GetLastProjectPath();
void SaveLastProjectPath(string path);
}
public class SettingsService : ISettingsService public class SettingsService : ISettingsService
{ {
private const string SettingsFileName = "app_settings.json"; private const string SettingsFileName = "app_settings.json";

View File

@@ -1,17 +1,10 @@
using Microsoft.Win32; using CodeContextGenerator.Interfaces;
using Microsoft.Win32;
using System.IO; using System.IO;
using System.Windows; using System.Windows;
namespace CodeContextGenerator.Services; namespace CodeContextGenerator.Services;
public interface IUIService
{
string ShowFolderBrowserDialog(string initialDirectory = null);
bool ShowOpenProjectFileDialog(out string selectedPath);
bool ShowSaveFileDialog(string defaultFileName, string initialDirectory, out string savePath);
void ShowMessage(string message, string title, MessageBoxImage icon = MessageBoxImage.Information);
}
public class UIService : IUIService public class UIService : IUIService
{ {
public string ShowFolderBrowserDialog(string initialDirectory = null) public string ShowFolderBrowserDialog(string initialDirectory = null)

View File

@@ -1,5 +1,5 @@
using CodeContextGenerator.Models; using CodeContextGenerator.Interfaces;
using CodeContextGenerator.Services; using CodeContextGenerator.Models;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using System.IO; using System.IO;

View File

@@ -1,12 +1,15 @@
<Window x:Class="CodeContextGenerator.Views.MainWindow" <Window
x:Class="CodeContextGenerator.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CodeContextGenerator.Views" xmlns:local="clr-namespace:CodeContextGenerator.Views"
mc:Ignorable="d" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="Code Context Generator" Height="600" Width="800" Title="Code Context Generator"
WindowStartupLocation="CenterScreen"> Width="800"
Height="600"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Window.Resources> <Window.Resources>
<Style TargetType="TreeViewItem"> <Style TargetType="TreeViewItem">
@@ -33,35 +36,57 @@
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="Выберите файл решения, проекта или папку:" FontWeight="Bold" Margin="0,0,0,5"/> <TextBlock
Grid.Row="0"
Margin="0,0,0,5"
FontWeight="Bold"
Text="Выберите файл решения, проекта или папку:" />
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="0,0,0,10"> <StackPanel
<Button Content="Выбрать..." Grid.Row="1"
Margin="0,0,0,10"
Orientation="Horizontal">
<Button
Width="100"
Command="{Binding SelectProjectCommand}" Command="{Binding SelectProjectCommand}"
IsEnabled="{Binding CanSelectProject}" Content="Выбрать..."
Width="100"/> IsEnabled="{Binding CanSelectProject}" />
<TextBlock Text="{Binding SelectedProjectPath}" <TextBlock
VerticalAlignment="Center"
TextWrapping="Wrap"
MaxWidth="600" MaxWidth="600"
Margin="10,0,0,0"/> Margin="10,0,0,0"
VerticalAlignment="Center"
Text="{Binding SelectedProjectPath}"
TextWrapping="Wrap" />
</StackPanel> </StackPanel>
<Border Grid.Row="2" BorderBrush="Gray" BorderThickness="1" CornerRadius="4" Padding="5" <Border
Grid.Row="2"
Padding="5"
BorderBrush="Gray"
BorderThickness="1"
CornerRadius="4"
Visibility="{Binding IsProjectLoaded, Converter={StaticResource BooleanToVisibilityConverter}}"> Visibility="{Binding IsProjectLoaded, Converter={StaticResource BooleanToVisibilityConverter}}">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" <ScrollViewer
PreviewMouseWheel="ScrollViewer_PreviewMouseWheel"> HorizontalScrollBarVisibility="Auto"
<TreeView x:Name="ProjectTree" ItemsSource="{Binding RootDirectory.Children}" PreviewMouseWheel="ScrollViewer_PreviewMouseWheel"
VerticalScrollBarVisibility="Auto">
<TreeView
x:Name="ProjectTree"
ItemsSource="{Binding RootDirectory.Children}"
VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"> VirtualizingPanel.VirtualizationMode="Recycling">
<TreeView.ItemTemplate> <TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}"> <HierarchicalDataTemplate ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal" MinHeight="24"> <StackPanel MinHeight="24" Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" <CheckBox
IsThreeState="True" Margin="2,0,5,0"
VerticalAlignment="Center" Margin="2,0,5,0" VerticalAlignment="Center"
Click="CheckBox_Click"/> Click="CheckBox_Click"
<TextBlock Text="{Binding Name}" VerticalAlignment="Center" IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}"
IsThreeState="True" />
<TextBlock
VerticalAlignment="Center"
Text="{Binding Name}"
ToolTip="{Binding FullName}" /> ToolTip="{Binding FullName}" />
</StackPanel> </StackPanel>
</HierarchicalDataTemplate> </HierarchicalDataTemplate>
@@ -70,26 +95,48 @@
</ScrollViewer> </ScrollViewer>
</Border> </Border>
<TextBlock Grid.Row="2" Text="Проект еще не загружен. Выберите файл решения или проекта." <TextBlock
HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="2"
Foreground="Gray" FontSize="14" HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="14"
Foreground="Gray"
Text="Проект еще не загружен. Выберите файл решения или проекта."
Visibility="{Binding IsProjectLoaded, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=Collapsed}" /> Visibility="{Binding IsProjectLoaded, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=Collapsed}" />
<ProgressBar Grid.Row="3" Value="{Binding ProgressValue}" Height="20" Margin="0,10,0,10" <ProgressBar
Visibility="{Binding IsProcessing, Converter={StaticResource BooleanToVisibilityConverter}}"/> Grid.Row="3"
Height="20"
<TextBlock Grid.Row="3" Text="{Binding ProgressText}" HorizontalAlignment="Center" Margin="0,10,0,10"
VerticalAlignment="Center" FontWeight="Bold"
Visibility="{Binding IsProcessing, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<StackPanel Grid.Row="4" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10,0,0">
<Button Content="Отмена" Command="{Binding CancelProcessingCommand}"
Visibility="{Binding IsProcessing, Converter={StaticResource BooleanToVisibilityConverter}}" Visibility="{Binding IsProcessing, Converter={StaticResource BooleanToVisibilityConverter}}"
Background="#FFDC3545" Foreground="White"/> Value="{Binding ProgressValue}" />
<Button Content="Закрыть" Command="{Binding ExitApplicationCommand}"/>
<Button Content="Сформировать" Command="{Binding GenerateContextFileCommand}" <TextBlock
Grid.Row="3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="Bold"
Text="{Binding ProgressText}"
Visibility="{Binding IsProcessing, Converter={StaticResource BooleanToVisibilityConverter}}" />
<StackPanel
Grid.Row="4"
Margin="0,10,0,0"
HorizontalAlignment="Right"
Orientation="Horizontal">
<Button
Background="#FFDC3545"
Command="{Binding CancelProcessingCommand}"
Content="Отмена"
Foreground="White"
Visibility="{Binding IsProcessing, Converter={StaticResource BooleanToVisibilityConverter}}" />
<Button Command="{Binding ExitApplicationCommand}" Content="Закрыть" />
<Button
Background="#FF28A745"
Command="{Binding GenerateContextFileCommand}"
Content="Сформировать"
Foreground="White"
IsEnabled="{Binding CanGenerate}" IsEnabled="{Binding CanGenerate}"
Background="#FF28A745" Foreground="White"
Visibility="{Binding IsProjectLoaded, Converter={StaticResource BooleanToVisibilityConverter}}" /> Visibility="{Binding IsProjectLoaded, Converter={StaticResource BooleanToVisibilityConverter}}" />
</StackPanel> </StackPanel>
</Grid> </Grid>