Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/Resources/Locales/en_US.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -708,12 +708,14 @@
<x:String x:Key="Text.Repository.CleanTips" xml:space="preserve">Run `git gc` command for this repository.</x:String>
<x:String x:Key="Text.Repository.ClearAllCommitsFilter" xml:space="preserve">Clear all</x:String>
<x:String x:Key="Text.Repository.ClearStashes" xml:space="preserve">Clear</x:String>
<x:String x:Key="Text.Repository.CollapseAll" xml:space="preserve">Collapse All</x:String>
<x:String x:Key="Text.Repository.Configure" xml:space="preserve">Configure this repository</x:String>
<x:String x:Key="Text.Repository.Continue" xml:space="preserve">CONTINUE</x:String>
<x:String x:Key="Text.Repository.CustomActions" xml:space="preserve">Custom Actions</x:String>
<x:String x:Key="Text.Repository.CustomActions.Empty" xml:space="preserve">No Custom Actions</x:String>
<x:String x:Key="Text.Repository.Dashboard" xml:space="preserve">Dashboard</x:String>
<x:String x:Key="Text.Repository.DiscardAll" xml:space="preserve">Discard all changes</x:String>
<x:String x:Key="Text.Repository.ExpandAll" xml:space="preserve">Expand All</x:String>
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">Open in File Browser</x:String>
<x:String x:Key="Text.Repository.Filter" xml:space="preserve">Search Branches/Tags/Submodules</x:String>
<x:String x:Key="Text.Repository.FilterCommits" xml:space="preserve">Visibility in Graph</x:String>
Expand Down
2 changes: 2 additions & 0 deletions src/Resources/Locales/es_ES.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -703,12 +703,14 @@
<x:String x:Key="Text.Repository.CleanTips" xml:space="preserve">Ejecutar comando `git gc` para este repositorio.</x:String>
<x:String x:Key="Text.Repository.ClearAllCommitsFilter" xml:space="preserve">Limpiar todo</x:String>
<x:String x:Key="Text.Repository.ClearStashes" xml:space="preserve">Limpiar</x:String>
<x:String x:Key="Text.Repository.CollapseAll" xml:space="preserve">Contraer Todo</x:String>
<x:String x:Key="Text.Repository.Configure" xml:space="preserve">Configurar este repositorio</x:String>
<x:String x:Key="Text.Repository.Continue" xml:space="preserve">CONTINUAR</x:String>
<x:String x:Key="Text.Repository.CustomActions" xml:space="preserve">Acciones Personalizadas</x:String>
<x:String x:Key="Text.Repository.CustomActions.Empty" xml:space="preserve">No hay ninguna Acción Personalizada</x:String>
<x:String x:Key="Text.Repository.Dashboard" xml:space="preserve">Dashboard</x:String>
<x:String x:Key="Text.Repository.DiscardAll" xml:space="preserve">Descartar todos los cambios</x:String>
<x:String x:Key="Text.Repository.ExpandAll" xml:space="preserve">Expandir Todo</x:String>
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">Abrir en el Explorador</x:String>
<x:String x:Key="Text.Repository.Filter" xml:space="preserve">Buscar Ramas/Etiquetas/Submódulos</x:String>
<x:String x:Key="Text.Repository.FilterCommits" xml:space="preserve">Visibilidad en el Gráfico</x:String>
Expand Down
2 changes: 2 additions & 0 deletions src/Resources/Locales/fr_FR.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -688,12 +688,14 @@
<x:String x:Key="Text.Repository.CleanTips" xml:space="preserve">Lancer `git gc` pour ce repository.</x:String>
<x:String x:Key="Text.Repository.ClearAllCommitsFilter" xml:space="preserve">Tout effacer</x:String>
<x:String x:Key="Text.Repository.ClearStashes" xml:space="preserve">Nettoyer</x:String>
<x:String x:Key="Text.Repository.CollapseAll" xml:space="preserve">Tout Réduire</x:String>
<x:String x:Key="Text.Repository.Configure" xml:space="preserve">Configurer ce repository</x:String>
<x:String x:Key="Text.Repository.Continue" xml:space="preserve">CONTINUER</x:String>
<x:String x:Key="Text.Repository.CustomActions" xml:space="preserve">Actions personnalisées</x:String>
<x:String x:Key="Text.Repository.CustomActions.Empty" xml:space="preserve">Pas d'actions personnalisées</x:String>
<x:String x:Key="Text.Repository.Dashboard" xml:space="preserve">Tableau de bord</x:String>
<x:String x:Key="Text.Repository.DiscardAll" xml:space="preserve">Rejeter tous les changements</x:String>
<x:String x:Key="Text.Repository.ExpandAll" xml:space="preserve">Tout Développer</x:String>
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">Ouvrir dans l'explorateur de fichiers</x:String>
<x:String x:Key="Text.Repository.Filter" xml:space="preserve">Rechercher Branches/Tags/Submodules</x:String>
<x:String x:Key="Text.Repository.FilterCommits" xml:space="preserve">Visibilité dans le graphique</x:String>
Expand Down
2 changes: 2 additions & 0 deletions src/Resources/Locales/it_IT.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -642,12 +642,14 @@
<x:String x:Key="Text.Repository.CleanTips" xml:space="preserve">Esegui il comando `git gc` per questo repository.</x:String>
<x:String x:Key="Text.Repository.ClearAllCommitsFilter" xml:space="preserve">Cancella tutto</x:String>
<x:String x:Key="Text.Repository.ClearStashes" xml:space="preserve">Cancella</x:String>
<x:String x:Key="Text.Repository.CollapseAll" xml:space="preserve">Comprimi Tutto</x:String>
<x:String x:Key="Text.Repository.Configure" xml:space="preserve">Configura questo repository</x:String>
<x:String x:Key="Text.Repository.Continue" xml:space="preserve">CONTINUA</x:String>
<x:String x:Key="Text.Repository.CustomActions" xml:space="preserve">Azioni Personalizzate</x:String>
<x:String x:Key="Text.Repository.CustomActions.Empty" xml:space="preserve">Nessuna Azione Personalizzata</x:String>
<x:String x:Key="Text.Repository.Dashboard" xml:space="preserve">Dashboard</x:String>
<x:String x:Key="Text.Repository.DiscardAll" xml:space="preserve">Scarta tutte le modifiche</x:String>
<x:String x:Key="Text.Repository.ExpandAll" xml:space="preserve">Espandi Tutto</x:String>
<x:String x:Key="Text.Repository.Explore" xml:space="preserve">Apri nell'Esplora File</x:String>
<x:String x:Key="Text.Repository.Filter" xml:space="preserve">Cerca Branch/Tag/Sottomodulo</x:String>
<x:String x:Key="Text.Repository.FilterCommits" xml:space="preserve">Visibilità nel grafico</x:String>
Expand Down
78 changes: 78 additions & 0 deletions src/Views/BranchTree.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,84 @@ public void ToggleNodeIsExpanded(ViewModels.BranchTreeNode node)
_disableSelectionChangingEvent = false;
}

public void ExpandAll()
{
if (Nodes == null || Nodes.Count == 0)
return;

_disableSelectionChangingEvent = true;

// Set IsExpanded = true on all folder nodes recursively
SetExpandedRecursive(Nodes, true);

// Rebuild rows
var rows = Rows;
rows.Clear();
var newRows = new List<ViewModels.BranchTreeNode>();
MakeRows(newRows, Nodes, 0);
rows.AddRange(newRows);

// Persist state for all nodes
var repo = DataContext as ViewModels.Repository;
if (repo != null)
PersistExpandedState(Nodes, repo);

RaiseEvent(new RoutedEventArgs(RowsChangedEvent));
_disableSelectionChangingEvent = false;
}

public void CollapseAll()
{
if (Nodes == null || Nodes.Count == 0)
return;

_disableSelectionChangingEvent = true;

// Set IsExpanded = false on all folder nodes recursively
SetExpandedRecursive(Nodes, false);

// Rebuild rows (only root nodes visible)
var rows = Rows;
rows.Clear();
var newRows = new List<ViewModels.BranchTreeNode>();
MakeRows(newRows, Nodes, 0);
rows.AddRange(newRows);

// Persist state for all nodes
var repo = DataContext as ViewModels.Repository;
if (repo != null)
PersistExpandedState(Nodes, repo);

RaiseEvent(new RoutedEventArgs(RowsChangedEvent));
_disableSelectionChangingEvent = false;
}

private void SetExpandedRecursive(List<ViewModels.BranchTreeNode> nodes, bool expanded)
{
foreach (var node in nodes)
{
// Only set IsExpanded for folder nodes (not branch leaves)
if (node.Backend is not Models.Branch)
node.IsExpanded = expanded;

// Recurse into children
if (node.Children != null && node.Children.Count > 0)
SetExpandedRecursive(node.Children, expanded);
}
}

private void PersistExpandedState(List<ViewModels.BranchTreeNode> nodes, ViewModels.Repository repo)
{
foreach (var node in nodes)
{
if (node.Backend is not Models.Branch)
repo.UpdateBranchNodeIsExpanded(node);

if (node.Children != null && node.Children.Count > 0)
PersistExpandedState(node.Children, repo);
}
}

protected override void OnSizeChanged(SizeChangedEventArgs e)
{
base.OnSizeChanged(e);
Expand Down
82 changes: 53 additions & 29 deletions src/Views/Repository.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -192,36 +192,60 @@
</Border>

<!-- Filter Branches/Tags/Submodules -->
<TextBox Grid.Row="1"
Height="26"
Margin="8,6,4,0"
BorderThickness="1"
CornerRadius="4"
BorderBrush="{DynamicResource Brush.Border2}"
Watermark="{DynamicResource Text.Repository.Filter}"
Text="{Binding Filter, Mode=TwoWay}"
VerticalContentAlignment="Center">
<TextBox.InnerLeftContent>
<Path Width="14" Height="14"
Margin="6,0,0,0"
Fill="{DynamicResource Brush.FG2}"
Data="{StaticResource Icons.Search}"/>
</TextBox.InnerLeftContent>

<TextBox.InnerRightContent>
<Button Classes="icon_button"
Width="16"
Margin="0,0,6,0"
Command="{Binding ClearFilter}"
IsVisible="{Binding Filter, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
HorizontalAlignment="Right">
<Grid Grid.Row="1" Height="26" Margin="8,6,4,0" ColumnDefinitions="*,Auto,Auto">
<TextBox Grid.Column="0"
BorderThickness="1"
CornerRadius="4"
BorderBrush="{DynamicResource Brush.Border2}"
Watermark="{DynamicResource Text.Repository.Filter}"
Text="{Binding Filter, Mode=TwoWay}"
VerticalContentAlignment="Center">
<TextBox.InnerLeftContent>
<Path Width="14" Height="14"
Margin="0,1,0,0"
Fill="{DynamicResource Brush.FG1}"
Data="{StaticResource Icons.Clear}"/>
</Button>
</TextBox.InnerRightContent>
</TextBox>
Margin="6,0,0,0"
Fill="{DynamicResource Brush.FG2}"
Data="{StaticResource Icons.Search}"/>
</TextBox.InnerLeftContent>

<TextBox.InnerRightContent>
<Button Classes="icon_button"
Width="16"
Margin="0,0,6,0"
Command="{Binding ClearFilter}"
IsVisible="{Binding Filter, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
HorizontalAlignment="Right">
<Path Width="14" Height="14"
Margin="0,1,0,0"
Fill="{DynamicResource Brush.FG1}"
Data="{StaticResource Icons.Clear}"/>
</Button>
</TextBox.InnerRightContent>
</TextBox>

<!-- Expand All Button -->
<Button Grid.Column="1"
Classes="icon_button"
Width="14"
Margin="4,0,0,0"
Click="OnExpandAllNodes"
ToolTip.Tip="{DynamicResource Text.Repository.ExpandAll}">
<Path Width="12" Height="12"
Fill="{DynamicResource Brush.FG1}"
Data="{StaticResource Icons.DoubleDown}"/>
</Button>

<!-- Collapse All Button -->
<Button Grid.Column="2"
Classes="icon_button"
Width="14"
Margin="4,0,0,0"
Click="OnCollapseAllNodes"
ToolTip.Tip="{DynamicResource Text.Repository.CollapseAll}">
<Path Width="12" Height="12"
Fill="{DynamicResource Brush.FG1}"
Data="{StaticResource Icons.DoubleUp}"/>
</Button>
</Grid>

<Grid Grid.Row="2" x:Name="LeftSidebarGroups" Margin="0,4,0,0" RowDefinitions="28,Auto,28,Auto,28,Auto,28,Auto,28,Auto" SizeChanged="OnLeftSidebarSizeChanged">
<!-- Local Branches -->
Expand Down
36 changes: 36 additions & 0 deletions src/Views/Repository.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -598,5 +598,41 @@ private async void OnBisectCommand(object sender, RoutedEventArgs e)

e.Handled = true;
}

private void OnExpandAllNodes(object sender, RoutedEventArgs e)
{
if (DataContext is ViewModels.Repository repo)
{
repo.IsLocalBranchGroupExpanded = true;
repo.IsRemoteGroupExpanded = true;
repo.IsTagGroupExpanded = true;
repo.IsSubmoduleGroupExpanded = true;
repo.IsWorktreeGroupExpanded = true;
}

LocalBranchTree?.ExpandAll();
RemoteBranchTree?.ExpandAll();
TagsList?.ExpandAll();
SubmoduleList?.ExpandAll();
e.Handled = true;
}

private void OnCollapseAllNodes(object sender, RoutedEventArgs e)
{
if (DataContext is ViewModels.Repository repo)
{
repo.IsLocalBranchGroupExpanded = false;
repo.IsRemoteGroupExpanded = false;
repo.IsTagGroupExpanded = false;
repo.IsSubmoduleGroupExpanded = false;
repo.IsWorktreeGroupExpanded = false;
}

LocalBranchTree?.CollapseAll();
RemoteBranchTree?.CollapseAll();
TagsList?.CollapseAll();
SubmoduleList?.CollapseAll();
e.Handled = true;
}
}
}
56 changes: 56 additions & 0 deletions src/Views/SubmodulesView.axaml.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;

using Avalonia;
using Avalonia.Controls;
Expand Down Expand Up @@ -118,6 +119,61 @@ public void ToggleNodeIsExpanded(ViewModels.SubmoduleTreeNode node)
}
}

public void ExpandAll()
{
if (Content is ViewModels.SubmoduleCollectionAsTree tree)
{
SetExpandedRecursive(tree.Tree, true);

// Rebuild rows manually
tree.Rows.Clear();
MakeTreeRows(tree.Rows, tree.Tree);

Rows = tree.Rows.Count;
RaiseEvent(new RoutedEventArgs(RowsChangedEvent));
}
}

public void CollapseAll()
{
if (Content is ViewModels.SubmoduleCollectionAsTree tree)
{
SetExpandedRecursive(tree.Tree, false);

// Rebuild rows manually
tree.Rows.Clear();
MakeTreeRows(tree.Rows, tree.Tree);

Rows = tree.Rows.Count;
RaiseEvent(new RoutedEventArgs(RowsChangedEvent));
}
}

private void MakeTreeRows(Avalonia.Collections.AvaloniaList<ViewModels.SubmoduleTreeNode> rows, List<ViewModels.SubmoduleTreeNode> nodes)
{
foreach (var node in nodes)
{
rows.Add(node);

if (!node.IsExpanded || !node.IsFolder)
continue;

MakeTreeRows(rows, node.Children);
}
}

private void SetExpandedRecursive(List<ViewModels.SubmoduleTreeNode> nodes, bool expanded)
{
foreach (var node in nodes)
{
if (node.IsFolder)
node.IsExpanded = expanded;

if (node.Children != null && node.Children.Count > 0)
SetExpandedRecursive(node.Children, expanded);
}
}

protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
base.OnPropertyChanged(change);
Expand Down
Loading