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
42 changes: 42 additions & 0 deletions src/Models/RepositoryUIStates.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,18 @@

namespace SourceGit.Models
{
public enum RepositoryWorkspaceOrientation
{
SideBySide,
Stacked,
}

public enum RepositoryNavigationPlacement
{
Sidebar,
Top,
}

public class RepositoryUIStates
{
public HistoryShowFlags HistoryShowFlags
Expand Down Expand Up @@ -45,6 +57,36 @@ public double AuthorColumnWidth
set;
} = 120;

public int SplitPrimaryViewIndex
{
get;
set;
} = -1;

public int SecondaryViewIndex
{
get;
set;
} = -1;

public RepositoryWorkspaceOrientation WorkspaceOrientation
{
get;
set;
} = RepositoryWorkspaceOrientation.SideBySide;

public double WorkspaceSplitRatio
{
get;
set;
} = 0.5;

public RepositoryNavigationPlacement NavigationPlacement
{
get;
set;
} = RepositoryNavigationPlacement.Sidebar;

public bool EnableTopoOrderInHistory
{
get;
Expand Down
9 changes: 9 additions & 0 deletions src/Resources/Locales/en_US.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -798,6 +798,7 @@
<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.CloseSecondaryView" xml:space="preserve">Close Secondary View</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>
Expand All @@ -822,10 +823,15 @@
<x:String x:Key="Text.Repository.LocalBranches" xml:space="preserve">LOCAL BRANCHES</x:String>
<x:String x:Key="Text.Repository.MoreOptions" xml:space="preserve">More options...</x:String>
<x:String x:Key="Text.Repository.NavigateToCurrentHead" xml:space="preserve">Navigate to HEAD</x:String>
<x:String x:Key="Text.Repository.Navigation" xml:space="preserve">Repository navigation</x:String>
<x:String x:Key="Text.Repository.NavigationPlacement" xml:space="preserve">VIEW NAVIGATION</x:String>
<x:String x:Key="Text.Repository.NavigationPlacement.Sidebar" xml:space="preserve">Sidebar</x:String>
<x:String x:Key="Text.Repository.NavigationPlacement.Top" xml:space="preserve">Top</x:String>
<x:String x:Key="Text.Repository.NewBranch" xml:space="preserve">Create Branch</x:String>
<x:String x:Key="Text.Repository.Notifications.Clear" xml:space="preserve">CLEAR NOTIFICATIONS</x:String>
<x:String x:Key="Text.Repository.OpenAsFolder" xml:space="preserve">Open as Folder</x:String>
<x:String x:Key="Text.Repository.OpenIn" xml:space="preserve">Open in {0}</x:String>
<x:String x:Key="Text.Repository.OpenInSecondary" xml:space="preserve">Open in Secondary Pane</x:String>
<x:String x:Key="Text.Repository.OpenWithExternalTools" xml:space="preserve">Open in External Tools</x:String>
<x:String x:Key="Text.Repository.Remotes" xml:space="preserve">REMOTES</x:String>
<x:String x:Key="Text.Repository.Remotes.Add" xml:space="preserve">Add Remote</x:String>
Expand All @@ -844,7 +850,10 @@
<x:String x:Key="Text.Repository.ShowSubmodulesAsTree" xml:space="preserve">Show Submodules as Tree</x:String>
<x:String x:Key="Text.Repository.ShowTagsAsTree" xml:space="preserve">Show Tags as Tree</x:String>
<x:String x:Key="Text.Repository.Skip" xml:space="preserve">SKIP</x:String>
<x:String x:Key="Text.Repository.SplitSideBySide" xml:space="preserve">Split Side by Side</x:String>
<x:String x:Key="Text.Repository.SplitStacked" xml:space="preserve">Split Stacked</x:String>
<x:String x:Key="Text.Repository.Statistics" xml:space="preserve">Statistics</x:String>
<x:String x:Key="Text.Repository.SwapViews" xml:space="preserve">Swap Views</x:String>
<x:String x:Key="Text.Repository.Submodules" xml:space="preserve">SUBMODULES</x:String>
<x:String x:Key="Text.Repository.Submodules.Add" xml:space="preserve">Add Submodule</x:String>
<x:String x:Key="Text.Repository.Submodules.Update" xml:space="preserve">Update Submodule</x:String>
Expand Down
170 changes: 163 additions & 7 deletions src/ViewModels/Repository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,89 @@ public int SelectedViewIndex
get => _selectedViewIndex;
set
{
if (!IsValidWorkspaceView(value))
return;

if (IsSplitViewEnabled && value == SecondaryViewIndex)
{
SwapWorkspaceViews();
return;
}

if (SetProperty(ref _selectedViewIndex, value))
{
OnPropertyChanged(nameof(IsHistoriesVisible));
OnPropertyChanged(nameof(IsWorkingCopyVisible));
OnPropertyChanged(nameof(IsStashesVisible));
if (IsSplitViewEnabled)
_uiStates.SplitPrimaryViewIndex = value;
NotifyWorkspaceVisibilityChanged();
}
}
}

public int SecondaryViewIndex
{
get => _uiStates.SecondaryViewIndex;
private set
{
if (_uiStates.SecondaryViewIndex != value)
{
_uiStates.SecondaryViewIndex = value;
OnPropertyChanged();
OnPropertyChanged(nameof(IsSplitViewEnabled));
NotifyWorkspaceVisibilityChanged();
}
}
}

public bool IsSplitViewEnabled
{
get => SecondaryViewIndex >= 0;
}

public Models.RepositoryWorkspaceOrientation WorkspaceOrientation
{
get => _uiStates.WorkspaceOrientation;
private set
{
if (_uiStates.WorkspaceOrientation != value)
{
_uiStates.WorkspaceOrientation = value;
OnPropertyChanged();
}
}
}

public double WorkspaceSplitRatio
{
get => double.IsFinite(_uiStates.WorkspaceSplitRatio) ? Math.Clamp(_uiStates.WorkspaceSplitRatio, 0.2, 0.8) : 0.5;
set
{
var ratio = double.IsFinite(value) ? Math.Clamp(value, 0.2, 0.8) : 0.5;
if (Math.Abs(_uiStates.WorkspaceSplitRatio - ratio) > 0.001)
{
_uiStates.WorkspaceSplitRatio = ratio;
OnPropertyChanged();
}
}
}

public Models.RepositoryNavigationPlacement NavigationPlacement
{
get => _uiStates.NavigationPlacement;
private set
{
if (_uiStates.NavigationPlacement != value)
{
_uiStates.NavigationPlacement = value;
OnPropertyChanged();
}
}
}

public void SetNavigationPlacement(Models.RepositoryNavigationPlacement placement)
{
NavigationPlacement = placement;
}

public Histories Histories
{
get => _histories;
Expand All @@ -100,17 +174,70 @@ public StashesPage StashesPage

public bool IsHistoriesVisible
{
get => SelectedViewIndex == 0;
get => SelectedViewIndex == 0 || SecondaryViewIndex == 0;
}

public bool IsWorkingCopyVisible
{
get => SelectedViewIndex == 1;
get => SelectedViewIndex == 1 || SecondaryViewIndex == 1;
}

public bool IsStashesVisible
{
get => SelectedViewIndex == 2;
get => SelectedViewIndex == 2 || SecondaryViewIndex == 2;
}

public void OpenViewInSecondary(int viewIndex, Models.RepositoryWorkspaceOrientation orientation)
{
if (!IsValidWorkspaceView(viewIndex) || viewIndex == SelectedViewIndex)
return;

if (!IsSplitViewEnabled)
_uiStates.SplitPrimaryViewIndex = SelectedViewIndex;

WorkspaceOrientation = orientation;
SecondaryViewIndex = viewIndex;
}

public void SetWorkspaceOrientation(Models.RepositoryWorkspaceOrientation orientation)
{
if (IsSplitViewEnabled)
WorkspaceOrientation = orientation;
}

public void CloseSecondaryView()
{
if (!IsSplitViewEnabled)
return;

SecondaryViewIndex = -1;
_uiStates.SplitPrimaryViewIndex = -1;
}

public void SwapWorkspaceViews()
{
if (!IsSplitViewEnabled)
return;

var primary = SelectedViewIndex;
_selectedViewIndex = SecondaryViewIndex;
_uiStates.SecondaryViewIndex = primary;
_uiStates.SplitPrimaryViewIndex = _selectedViewIndex;
OnPropertyChanged(nameof(SelectedViewIndex));
OnPropertyChanged(nameof(SecondaryViewIndex));
NotifyWorkspaceVisibilityChanged();
}

private bool IsValidWorkspaceView(int viewIndex)
{
return viewIndex == 0 || (!IsBare && viewIndex is 1 or 2);
}

private void NotifyWorkspaceVisibilityChanged()
{
OnPropertyChanged(nameof(IsHistoriesVisible));
OnPropertyChanged(nameof(IsWorkingCopyVisible));
OnPropertyChanged(nameof(IsStashesVisible));
}

public bool EnableTopoOrderInHistory
Expand Down Expand Up @@ -495,12 +622,41 @@ public void Open()
_workingCopy = new WorkingCopy(this) { CommitMessage = _uiStates.LastCommitMessage };
_stashesPage = new StashesPage(this);
_searchCommitContext = new SearchCommitContext(this);
_selectedViewIndex = Preferences.Instance.ShowLocalChangesByDefault ? 1 : 0;
RestoreWorkspaceState();
_lastFetchTime = DateTime.Now;
_autoFetchTimer = new Timer(AutoFetchByTimer, null, 5000, 5000);
RefreshAll();
}

private void RestoreWorkspaceState()
{
var defaultView = Preferences.Instance.ShowLocalChangesByDefault && !IsBare ? 1 : 0;
var primary = _uiStates.SplitPrimaryViewIndex;
var secondary = _uiStates.SecondaryViewIndex;
if (!IsValidWorkspaceView(primary) ||
!IsValidWorkspaceView(secondary) ||
primary == secondary)
{
_selectedViewIndex = defaultView;
_uiStates.SplitPrimaryViewIndex = -1;
_uiStates.SecondaryViewIndex = -1;
}
else
{
_selectedViewIndex = primary;
}

if (!Enum.IsDefined(_uiStates.WorkspaceOrientation))
_uiStates.WorkspaceOrientation = Models.RepositoryWorkspaceOrientation.SideBySide;

if (!Enum.IsDefined(_uiStates.NavigationPlacement))
_uiStates.NavigationPlacement = Models.RepositoryNavigationPlacement.Sidebar;

_uiStates.WorkspaceSplitRatio = double.IsFinite(_uiStates.WorkspaceSplitRatio)
? Math.Clamp(_uiStates.WorkspaceSplitRatio, 0.2, 0.8)
: 0.5;
}

public void Close()
{
var commitMessage = _workingCopy.CommitMessage;
Expand Down
6 changes: 5 additions & 1 deletion src/Views/DiffView.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,11 @@ protected override void OnLoaded(RoutedEventArgs e)
if (DataContext is ViewModels.DiffContext vm)
vm.CheckSettings();

ToggleHotkeyBindings(IsEffectivelyVisible);
var repository = this.FindAncestorOfType<Repository>();
if (repository != null)
repository.UpdateWorkspaceHotkeys();
else
ToggleHotkeyBindings(IsEffectivelyVisible);
}

private void OnGotoFirstChange(object _, RoutedEventArgs e)
Expand Down
21 changes: 11 additions & 10 deletions src/Views/Histories.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
SelectedCommits="{Binding SelectedCommits, Mode=TwoWay}"
ColumnHeaderHeight="24"
RowHeight="26"
SizeChanged="OnCommitListSizeChanged"
LayoutUpdated="OnCommitListLayoutUpdated"
ContextRequested="OnCommitListContextRequested"
DoubleTapped="OnCommitListDoubleTapped">
Expand Down Expand Up @@ -99,7 +100,7 @@
</DataGrid.Styles>

<DataGrid.Columns>
<DataGridTemplateColumn Width="*" IsReadOnly="True">
<v:HistoriesDataGridColumn Name="GraphAndSubjectColumn" Width="*" IsReadOnly="True">
<DataGridTemplateColumn.Header>
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.GraphAndSubject}" HorizontalAlignment="Center"/>
</DataGridTemplateColumn.Header>
Expand Down Expand Up @@ -146,9 +147,9 @@
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</v:HistoriesDataGridColumn>

<DataGridTemplateColumn MinWidth="80" IsReadOnly="True" IsVisible="{Binding IsAuthorColumnVisible, Mode=OneWay}">
<v:HistoriesDataGridColumn Name="AuthorColumn" MinWidth="80" IsReadOnly="True">
<DataGridTemplateColumn.Header>
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.Author}" HorizontalAlignment="Center"/>
</DataGridTemplateColumn.Header>
Expand All @@ -174,9 +175,9 @@
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</v:HistoriesDataGridColumn>

<DataGridTemplateColumn MinWidth="100" IsReadOnly="True" IsVisible="{Binding IsSHAColumnVisible, Mode=OneWay}">
<v:HistoriesDataGridColumn Name="SHAColumn" MinWidth="100" IsReadOnly="True">
<DataGridTemplateColumn.Header>
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.SHA}" HorizontalAlignment="Center"/>
</DataGridTemplateColumn.Header>
Expand All @@ -191,9 +192,9 @@
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</v:HistoriesDataGridColumn>

<DataGridTemplateColumn MinWidth="160" IsReadOnly="True" IsVisible="{Binding IsAuthorTimeColumnVisible, Mode=OneWay}">
<v:HistoriesDataGridColumn Name="AuthorTimeColumn" MinWidth="160" IsReadOnly="True">
<DataGridTemplateColumn.Header>
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.AuthorTime}" HorizontalAlignment="Center"/>
</DataGridTemplateColumn.Header>
Expand All @@ -211,9 +212,9 @@
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</v:HistoriesDataGridColumn>

<DataGridTemplateColumn MinWidth="160" IsReadOnly="True" IsVisible="{Binding IsCommitTimeColumnVisible, Mode=OneWay}">
<v:HistoriesDataGridColumn Name="CommitTimeColumn" MinWidth="160" IsReadOnly="True">
<DataGridTemplateColumn.Header>
<TextBlock Classes="table_header" Text="{DynamicResource Text.Histories.Header.CommitTime}" HorizontalAlignment="Center"/>
</DataGridTemplateColumn.Header>
Expand All @@ -231,7 +232,7 @@
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</v:HistoriesDataGridColumn>
</DataGrid.Columns>
</v:HistoriesCommitList>

Expand Down
Loading