feat(ui): add inline conflict resolver view and localization
This commit is contained in:
@@ -358,6 +358,20 @@
|
|||||||
"loading": "Wird geladen…"
|
"loading": "Wird geladen…"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"conflictResolver": {
|
||||||
|
"windowTitle": "Merge-Konflikte lösen",
|
||||||
|
"modalTitle": "KONFLIKTE LÖSEN",
|
||||||
|
"loading": "Konflikte werden geladen…",
|
||||||
|
"current": "Aktuell (unsere)",
|
||||||
|
"incoming": "Eingehend (ihre)",
|
||||||
|
"mergedResult": "Zusammengeführtes Ergebnis",
|
||||||
|
"acceptCurrent": "Aktuelle übernehmen",
|
||||||
|
"acceptIncoming": "Eingehende übernehmen",
|
||||||
|
"acceptBoth": "Beide übernehmen",
|
||||||
|
"editManually": "Manuell bearbeiten",
|
||||||
|
"continue": "Lösen & fortfahren",
|
||||||
|
"abort": "Merge abbrechen"
|
||||||
|
},
|
||||||
"controls": {
|
"controls": {
|
||||||
"datePicker": {
|
"datePicker": {
|
||||||
"today": "Heute",
|
"today": "Heute",
|
||||||
|
|||||||
@@ -358,6 +358,20 @@
|
|||||||
"loading": "Loading…"
|
"loading": "Loading…"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"conflictResolver": {
|
||||||
|
"windowTitle": "Resolve merge conflicts",
|
||||||
|
"modalTitle": "RESOLVE CONFLICTS",
|
||||||
|
"loading": "Loading conflicts…",
|
||||||
|
"current": "Current (ours)",
|
||||||
|
"incoming": "Incoming (theirs)",
|
||||||
|
"mergedResult": "Merged result",
|
||||||
|
"acceptCurrent": "Accept Current",
|
||||||
|
"acceptIncoming": "Accept Incoming",
|
||||||
|
"acceptBoth": "Accept Both",
|
||||||
|
"editManually": "Edit manually",
|
||||||
|
"continue": "Resolve & continue",
|
||||||
|
"abort": "Abort merge"
|
||||||
|
},
|
||||||
"controls": {
|
"controls": {
|
||||||
"datePicker": {
|
"datePicker": {
|
||||||
"today": "Today",
|
"today": "Today",
|
||||||
|
|||||||
82
src/ClaudeDo.Ui/Views/Conflicts/ConflictResolverView.axaml
Normal file
82
src/ClaudeDo.Ui/Views/Conflicts/ConflictResolverView.axaml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<Window xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Conflicts"
|
||||||
|
xmlns:ctl="using:ClaudeDo.Ui.Views.Controls"
|
||||||
|
xmlns:loc="using:ClaudeDo.Ui.Localization"
|
||||||
|
x:DataType="vm:ConflictResolverViewModel"
|
||||||
|
x:Class="ClaudeDo.Ui.Views.Conflicts.ConflictResolverView"
|
||||||
|
Title="{loc:Tr conflictResolver.windowTitle}"
|
||||||
|
Width="760" Height="640" MinWidth="560" MinHeight="420"
|
||||||
|
CanResize="True"
|
||||||
|
WindowDecorations="BorderOnly"
|
||||||
|
ExtendClientAreaToDecorationsHint="True"
|
||||||
|
ExtendClientAreaTitleBarHeightHint="-1"
|
||||||
|
WindowStartupLocation="CenterOwner"
|
||||||
|
Background="{DynamicResource SurfaceBrush}">
|
||||||
|
|
||||||
|
<Window.KeyBindings>
|
||||||
|
<KeyBinding Gesture="Escape" Command="{Binding AbortCommand}"/>
|
||||||
|
</Window.KeyBindings>
|
||||||
|
|
||||||
|
<ctl:ModalShell Title="{loc:Tr conflictResolver.modalTitle}" CloseCommand="{Binding AbortCommand}">
|
||||||
|
<ctl:ModalShell.Footer>
|
||||||
|
<StackPanel Orientation="Horizontal" Spacing="8"
|
||||||
|
HorizontalAlignment="Right" VerticalAlignment="Center">
|
||||||
|
<Button Classes="btn" Content="{loc:Tr conflictResolver.continue}"
|
||||||
|
Command="{Binding ContinueCommand}" IsEnabled="{Binding CanContinue}"/>
|
||||||
|
<Button Classes="btn" Content="{loc:Tr conflictResolver.abort}" Command="{Binding AbortCommand}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</ctl:ModalShell.Footer>
|
||||||
|
|
||||||
|
<Grid RowDefinitions="Auto,*" Margin="16,12">
|
||||||
|
<TextBlock Grid.Row="0" Classes="meta" Margin="0,0,0,8"
|
||||||
|
Text="{loc:Tr conflictResolver.loading}"
|
||||||
|
IsVisible="{Binding IsBusy}"/>
|
||||||
|
<TextBlock Grid.Row="0" Classes="meta" Foreground="{DynamicResource BloodBrush}"
|
||||||
|
Text="{Binding Error}" TextWrapping="Wrap"
|
||||||
|
IsVisible="{Binding Error, Converter={x:Static ObjectConverters.IsNotNull}}"/>
|
||||||
|
|
||||||
|
<ScrollViewer Grid.Row="1">
|
||||||
|
<ItemsControl ItemsSource="{Binding Files}">
|
||||||
|
<ItemsControl.ItemTemplate>
|
||||||
|
<DataTemplate x:DataType="vm:ConflictFile">
|
||||||
|
<StackPanel Spacing="8" Margin="0,0,0,16">
|
||||||
|
<TextBlock Classes="path-mono heading" Text="{Binding Path}"/>
|
||||||
|
<ItemsControl ItemsSource="{Binding Hunks}">
|
||||||
|
<ItemsControl.ItemTemplate>
|
||||||
|
<DataTemplate x:DataType="vm:ConflictHunk">
|
||||||
|
<Border BorderBrush="{DynamicResource LineBrush}" BorderThickness="1"
|
||||||
|
CornerRadius="6" Padding="10" Margin="0,0,0,8">
|
||||||
|
<StackPanel Spacing="6">
|
||||||
|
<TextBlock Classes="meta" Text="{loc:Tr conflictResolver.current}"/>
|
||||||
|
<TextBox Text="{Binding Ours, Mode=OneWay}" IsReadOnly="True"
|
||||||
|
AcceptsReturn="True" MaxHeight="120"/>
|
||||||
|
<TextBlock Classes="meta" Text="{loc:Tr conflictResolver.incoming}"/>
|
||||||
|
<TextBox Text="{Binding Theirs, Mode=OneWay}" IsReadOnly="True"
|
||||||
|
AcceptsReturn="True" MaxHeight="120"/>
|
||||||
|
<StackPanel Orientation="Horizontal" Spacing="6">
|
||||||
|
<Button Classes="btn" Content="{loc:Tr conflictResolver.acceptCurrent}"
|
||||||
|
Command="{Binding AcceptCurrentCommand}"/>
|
||||||
|
<Button Classes="btn" Content="{loc:Tr conflictResolver.acceptIncoming}"
|
||||||
|
Command="{Binding AcceptIncomingCommand}"/>
|
||||||
|
<Button Classes="btn" Content="{loc:Tr conflictResolver.acceptBoth}"
|
||||||
|
Command="{Binding AcceptBothCommand}"/>
|
||||||
|
<Button Classes="btn" Content="{loc:Tr conflictResolver.editManually}"
|
||||||
|
Command="{Binding EditManuallyCommand}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<TextBlock Classes="meta" Text="{loc:Tr conflictResolver.mergedResult}"/>
|
||||||
|
<TextBox Text="{Binding Resolution, Mode=TwoWay}"
|
||||||
|
AcceptsReturn="True" MinHeight="80" MaxHeight="200"/>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
</DataTemplate>
|
||||||
|
</ItemsControl.ItemTemplate>
|
||||||
|
</ItemsControl>
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</ItemsControl.ItemTemplate>
|
||||||
|
</ItemsControl>
|
||||||
|
</ScrollViewer>
|
||||||
|
</Grid>
|
||||||
|
</ctl:ModalShell>
|
||||||
|
</Window>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
|
using ClaudeDo.Ui.ViewModels.Conflicts;
|
||||||
|
|
||||||
|
namespace ClaudeDo.Ui.Views.Conflicts;
|
||||||
|
|
||||||
|
public partial class ConflictResolverView : Window
|
||||||
|
{
|
||||||
|
public ConflictResolverView()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnDataContextChanged(System.EventArgs e)
|
||||||
|
{
|
||||||
|
base.OnDataContextChanged(e);
|
||||||
|
if (DataContext is ConflictResolverViewModel vm)
|
||||||
|
vm.CloseRequested = Close;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user