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 CodeContextGenerator.Interfaces;
using CodeContextGenerator.Services;
using CodeContextGenerator.ViewModels;
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;
namespace CodeContextGenerator.Services;
public interface IContextFileGenerator
{
Task GenerateContextFileAsync(List<string> selectedFiles, string outputPath, string projectRootPath, IProgress<int> progress, CancellationToken cancellationToken);
}
public class ContextFileGenerator : IContextFileGenerator
{
private readonly IFileProcessorService _fileProcessorService;

View File

@@ -1,13 +1,9 @@
using System.Text;
using CodeContextGenerator.Interfaces;
using System.Text;
using System.Text.RegularExpressions;
namespace CodeContextGenerator.Services;
public interface IFileProcessorService
{
string ProcessFileContent(string content, string fileName);
}
public class FileProcessorService : IFileProcessorService
{
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;
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
{
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.Windows;
namespace CodeContextGenerator.Services;
public interface IProjectLoaderService
{
Task<FileItem> LoadProjectFromPathAsync(string projectPath, IProgress<int> progress, CancellationToken cancellationToken);
string GetDefaultOutputFileName(string projectPath);
}
public class ProjectLoaderService : IProjectLoaderService
{
private readonly IFileScannerService _fileScannerService;

View File

@@ -1,14 +1,10 @@
using System.IO;
using CodeContextGenerator.Models;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Threading;
using CodeContextGenerator.Models;
using System.IO;
namespace CodeContextGenerator.Services
namespace CodeContextGenerator.Services;
public static class ProjectScannerService
{
public static class ProjectScannerService
{
private static readonly string[] ExcludedDirectories = {
"bin", "obj", ".git", "packages", ".vs", "Properties",
"node_modules", ".vscode", ".idea", ".vs", "Debug", "Release"
@@ -92,5 +88,4 @@ namespace CodeContextGenerator.Services
// Игнорируем ошибки доступа
}
}
}
}

View File

@@ -1,14 +1,9 @@
using System.IO;
using CodeContextGenerator.Interfaces;
using System.IO;
using System.Text.Json;
namespace CodeContextGenerator.Services;
public interface ISettingsService
{
string GetLastProjectPath();
void SaveLastProjectPath(string path);
}
public class SettingsService : ISettingsService
{
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.Windows;
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 string ShowFolderBrowserDialog(string initialDirectory = null)

View File

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

View File

@@ -1,68 +1,93 @@
<Window x:Class="CodeContextGenerator.Views.MainWindow"
<Window
x:Class="CodeContextGenerator.Views.MainWindow"
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:CodeContextGenerator.Views"
mc:Ignorable="d"
Title="Code Context Generator" Height="600" Width="800"
WindowStartupLocation="CenterScreen">
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="Code Context Generator"
Width="800"
Height="600"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Window.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="IsExpanded" Value="True" />
<Setter Property="Focusable" Value="False" />
</Style>
<Style TargetType="Button">
<Setter Property="Padding" Value="10,5"/>
<Setter Property="Margin" Value="5,0"/>
<Setter Property="Padding" Value="10,5" />
<Setter Property="Margin" Value="5,0" />
</Style>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</Window.Resources>
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</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">
<Button Content="Выбрать..."
<StackPanel
Grid.Row="1"
Margin="0,0,0,10"
Orientation="Horizontal">
<Button
Width="100"
Command="{Binding SelectProjectCommand}"
IsEnabled="{Binding CanSelectProject}"
Width="100"/>
<TextBlock Text="{Binding SelectedProjectPath}"
VerticalAlignment="Center"
TextWrapping="Wrap"
Content="Выбрать..."
IsEnabled="{Binding CanSelectProject}" />
<TextBlock
MaxWidth="600"
Margin="10,0,0,0"/>
Margin="10,0,0,0"
VerticalAlignment="Center"
Text="{Binding SelectedProjectPath}"
TextWrapping="Wrap" />
</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}}">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
PreviewMouseWheel="ScrollViewer_PreviewMouseWheel">
<TreeView x:Name="ProjectTree" ItemsSource="{Binding RootDirectory.Children}"
<ScrollViewer
HorizontalScrollBarVisibility="Auto"
PreviewMouseWheel="ScrollViewer_PreviewMouseWheel"
VerticalScrollBarVisibility="Auto">
<TreeView
x:Name="ProjectTree"
ItemsSource="{Binding RootDirectory.Children}"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal" MinHeight="24">
<CheckBox IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}"
IsThreeState="True"
VerticalAlignment="Center" Margin="2,0,5,0"
Click="CheckBox_Click"/>
<TextBlock Text="{Binding Name}" VerticalAlignment="Center"
ToolTip="{Binding FullName}"/>
<StackPanel MinHeight="24" Orientation="Horizontal">
<CheckBox
Margin="2,0,5,0"
VerticalAlignment="Center"
Click="CheckBox_Click"
IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}"
IsThreeState="True" />
<TextBlock
VerticalAlignment="Center"
Text="{Binding Name}"
ToolTip="{Binding FullName}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
@@ -70,27 +95,49 @@
</ScrollViewer>
</Border>
<TextBlock Grid.Row="2" Text="Проект еще не загружен. Выберите файл решения или проекта."
HorizontalAlignment="Center" VerticalAlignment="Center"
Foreground="Gray" FontSize="14"
Visibility="{Binding IsProjectLoaded, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=Collapsed}"/>
<TextBlock
Grid.Row="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="14"
Foreground="Gray"
Text="Проект еще не загружен. Выберите файл решения или проекта."
Visibility="{Binding IsProjectLoaded, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=Collapsed}" />
<ProgressBar Grid.Row="3" Value="{Binding ProgressValue}" Height="20" Margin="0,10,0,10"
Visibility="{Binding IsProcessing, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<TextBlock Grid.Row="3" Text="{Binding ProgressText}" HorizontalAlignment="Center"
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}"
<ProgressBar
Grid.Row="3"
Height="20"
Margin="0,10,0,10"
Visibility="{Binding IsProcessing, Converter={StaticResource BooleanToVisibilityConverter}}"
Background="#FFDC3545" Foreground="White"/>
<Button Content="Закрыть" Command="{Binding ExitApplicationCommand}"/>
<Button Content="Сформировать" Command="{Binding GenerateContextFileCommand}"
Value="{Binding ProgressValue}" />
<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}"
Background="#FF28A745" Foreground="White"
Visibility="{Binding IsProjectLoaded, Converter={StaticResource BooleanToVisibilityConverter}}"/>
Visibility="{Binding IsProjectLoaded, Converter={StaticResource BooleanToVisibilityConverter}}" />
</StackPanel>
</Grid>
</Window>