Skip to content

Commit

Permalink
add option to show checkboxes
Browse files Browse the repository at this point in the history
  • Loading branch information
letmaik committed Aug 5, 2023
1 parent a26e916 commit 9015700
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 14 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
## 1.16.0

* Added option to show checkboxes to tick off reviewed files
* Organized title menu items into groups

## 1.15.1

* Fixed "Discard Changes" incorrectly restoring files to base ref instead of merge base
Expand Down
55 changes: 44 additions & 11 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
},
"homepage": "https://github.com/letmaik/vscode-git-tree-compare",
"engines": {
"vscode": "^1.75.0"
"vscode": "^1.81.0"
},
"capabilities": {
"virtualWorkspaces": false,
Expand Down Expand Up @@ -126,6 +126,16 @@
"title": "Switch to Merge Diff",
"category": "Git Tree Compare"
},
{
"command": "gitTreeCompare.showCheckboxes",
"title": "Show checkboxes",
"category": "Git Tree Compare"
},
{
"command": "gitTreeCompare.hideCheckboxes",
"title": "Hide checkboxes",
"category": "Git Tree Compare"
},
{
"command": "gitTreeCompare.viewAsList",
"title": "View as List",
Expand All @@ -143,7 +153,8 @@
"view/title": [
{
"command": "gitTreeCompare.changeRepository",
"when": "view == gitTreeCompare && gitOpenRepositoryCount != 1"
"when": "view == gitTreeCompare && gitOpenRepositoryCount != 1",
"group": "1_state"
},
{
"command": "gitTreeCompare.changeRepository",
Expand All @@ -152,23 +163,28 @@
},
{
"command": "gitTreeCompare.changeBase",
"when": "view == gitTreeCompare"
"when": "view == gitTreeCompare",
"group": "1_state"
},
{
"command": "gitTreeCompare.openAllChanges",
"when": "view == gitTreeCompare"
"when": "view == gitTreeCompare",
"group": "2_files"
},
{
"command": "gitTreeCompare.openChangedFiles",
"when": "view == gitTreeCompare"
"when": "view == gitTreeCompare",
"group": "2_files"
},
{
"command": "gitTreeCompare.discardAllChanges",
"when": "view == gitTreeCompare"
"when": "view == gitTreeCompare",
"group": "2_files"
},
{
"command": "gitTreeCompare.refresh",
"when": "view == gitTreeCompare"
"when": "view == gitTreeCompare",
"group": "1_state"
},
{
"command": "gitTreeCompare.refresh",
Expand All @@ -177,11 +193,23 @@
},
{
"command": "gitTreeCompare.switchToFullDiff",
"when": "view == gitTreeCompare && config.gitTreeCompare.diffMode == merge"
"when": "view == gitTreeCompare && config.gitTreeCompare.diffMode == merge",
"group": "3_options"
},
{
"command": "gitTreeCompare.switchToMergeDiff",
"when": "view == gitTreeCompare && config.gitTreeCompare.diffMode == full"
"when": "view == gitTreeCompare && config.gitTreeCompare.diffMode == full",
"group": "3_options"
},
{
"command": "gitTreeCompare.showCheckboxes",
"when": "view == gitTreeCompare && !config.gitTreeCompare.showCheckboxes",
"group": "3_options"
},
{
"command": "gitTreeCompare.hideCheckboxes",
"when": "view == gitTreeCompare && config.gitTreeCompare.showCheckboxes",
"group": "3_options"
},
{
"command": "gitTreeCompare.viewAsList",
Expand Down Expand Up @@ -364,6 +392,11 @@
"type": "boolean",
"description": "Whether to compact (flatten) single-child folders into a single tree element. Useful for Java package structures, for example. May have a performance impact for large diff trees.",
"default": true
},
"gitTreeCompare.showCheckboxes": {
"type": "boolean",
"description": "Whether to show checkboxes such that files or folders can be ticked off, for example when reviewing.",
"default": false
}
}
}
Expand All @@ -378,9 +411,9 @@
"@types/byline": "4.2.31",
"@types/file-type": "^5.2.1",
"@types/node": "^13.5.0",
"@types/vscode": "^1.60.0",
"@types/vscode": "^1.81.0",
"@types/which": "^1.0.28",
"@vscode/vsce": "^2.19.0",
"@vscode/vsce": "^2.20.1",
"ts-loader": "^9.2.6",
"typescript": "^4.4.3",
"webpack": "^5.44.0",
Expand Down
6 changes: 6 additions & 0 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@ export function activate(context: ExtensionContext) {
commands.registerCommand(NAMESPACE + '.switchToMergeDiff', () => {
runAfterInit(() => provider!.switchToMergeDiff());
});
commands.registerCommand(NAMESPACE + '.showCheckboxes', () => {
runAfterInit(() => provider!.hideCheckboxes(false));
});
commands.registerCommand(NAMESPACE + '.hideCheckboxes', () => {
runAfterInit(() => provider!.hideCheckboxes(true));
});
commands.registerCommand(NAMESPACE + '.viewAsList', () => {
runAfterInit(() => provider!.viewAsTree(false));
});
Expand Down
41 changes: 38 additions & 3 deletions src/treeProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import * as fs from 'fs'
import { TreeDataProvider, TreeItem, TreeItemCollapsibleState,
Uri, Disposable, EventEmitter, TextDocumentShowOptions,
QuickPickItem, ProgressLocation, Memento, OutputChannel,
workspace, commands, window, WorkspaceFoldersChangeEvent, TreeView, ThemeIcon } from 'vscode'
workspace, commands, window, WorkspaceFoldersChangeEvent, TreeView, ThemeIcon, TreeItemCheckboxState, TreeCheckboxChangeEvent } from 'vscode'
import { NAMESPACE } from './constants'
import { Repository, Git } from './git/git'
import { Ref, RefType } from './git/api/git'
Expand Down Expand Up @@ -102,6 +102,7 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos
private findRenames: boolean;
private showCollapsed: boolean;
private compactFolders: boolean;
private showCheckboxes: boolean;

// Dynamic options
private repository: Repository | undefined;
Expand Down Expand Up @@ -132,6 +133,7 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos
// UI state
private treeView: TreeView<Element>;
private isPaused: boolean;
private checkboxStates: Map<string, TreeItemCheckboxState> = new Map<string, TreeItemCheckboxState>();

// Other
private readonly disposables: Disposable[] = [];
Expand Down Expand Up @@ -182,6 +184,8 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos
const onWorkspaceChange = anyEvent(fsWatcher.onDidChange, fsWatcher.onDidCreate, fsWatcher.onDidDelete);
const onRelevantWorkspaceChange = filterEvent(onWorkspaceChange, isRelevantChange);
this.disposables.push(onRelevantWorkspaceChange(this.handleWorkspaceChange, this));

this.disposables.push(treeView.onDidChangeCheckboxState(this.handleChangeCheckboxState, this));
}

async setRepository(repositoryRoot: string) {
Expand Down Expand Up @@ -236,6 +240,7 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos
window.showErrorMessage(`${msg}: ${e.message}`);
return;
}
this.checkboxStates.clear();
this._onDidChangeTreeData.fire();
}

Expand Down Expand Up @@ -301,6 +306,14 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos
}
}

private async handleChangeCheckboxState(e: TreeCheckboxChangeEvent<Element>) {
for (let [element, state] of e.items) {
if (element instanceof FileElement || element instanceof FolderElement) {
this.checkboxStates.set(element.dstAbsPath, state);
}
}
}

private log(msg: string, error: Error | undefined=undefined) {
if (error) {
console.warn(msg, error);
Expand Down Expand Up @@ -331,6 +344,7 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos
this.findRenames = config.get<boolean>('findRenames', true);
this.showCollapsed = config.get<boolean>('collapsed', false);
this.compactFolders = config.get<boolean>('compactFolders', false);
this.showCheckboxes = config.get<boolean>('showCheckboxes', false);
}

private async getStoredBaseRef(): Promise<string | undefined> {
Expand Down Expand Up @@ -366,7 +380,13 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos
}

getTreeItem(element: Element): TreeItem {
return toTreeItem(element, this.openChangesOnSelect, this.iconsMinimal, this.showCollapsed, this.viewAsList, this.asAbsolutePath);
let checkboxState: TreeItemCheckboxState | undefined;
if (this.showCheckboxes) {
if (element instanceof FileElement || element instanceof FolderElement) {
checkboxState = this.checkboxStates.get(element.dstAbsPath) ?? TreeItemCheckboxState.Unchecked;
}
}
return toTreeItem(element, this.openChangesOnSelect, this.iconsMinimal, this.showCollapsed, this.viewAsList, checkboxState, this.asAbsolutePath);
}

async getChildren(element?: Element): Promise<Element[]> {
Expand Down Expand Up @@ -456,6 +476,7 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos
}
if (this.headName !== headName) {
this.log(`HEAD ref updated: ${this.headName} -> ${headName}`);
this.checkboxStates.clear();
}
if (this.headCommit !== headCommit) {
this.log(`HEAD ref commit updated: ${this.headCommit} -> ${headCommit}`);
Expand Down Expand Up @@ -642,6 +663,7 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos
const oldFullDiff = this.fullDiff;
const oldFindRenames = this.findRenames;
const oldCompactFolders = this.compactFolders;
const oldshowCheckboxes = this.showCheckboxes;
this.readConfig();
if (oldTreeRootIsRepo != this.treeRootIsRepo ||
oldInclude != this.includeFilesOutsideWorkspaceFolderRoot ||
Expand All @@ -651,7 +673,8 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos
(!oldRefreshIndex && this.refreshIndex) ||
oldFullDiff != this.fullDiff ||
oldFindRenames != this.findRenames ||
oldCompactFolders != this.compactFolders) {
oldCompactFolders != this.compactFolders ||
oldshowCheckboxes != this.showCheckboxes) {

if (!this.repository) {
return;
Expand Down Expand Up @@ -1062,6 +1085,11 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos
await config.update('diffMode', 'full', true);
}

async hideCheckboxes(v: boolean) {
const config = workspace.getConfiguration(NAMESPACE);
await config.update('showCheckboxes', !v, true);
}

viewAsTree(v: boolean) {
const viewAsList = !v;
if (viewAsList === this.viewAsList)
Expand All @@ -1079,6 +1107,7 @@ export class GitTreeCompareProvider implements TreeDataProvider<Element>, Dispos

function toTreeItem(element: Element, openChangesOnSelect: boolean, iconsMinimal: boolean,
showCollapsed: boolean, viewAsList: boolean,
checkboxState: TreeItemCheckboxState | undefined,
asAbsolutePath: (relPath: string) => string): TreeItem {
const gitIconRoot = asAbsolutePath('resources/git-icons');
if (element instanceof FileElement) {
Expand All @@ -1097,6 +1126,9 @@ function toTreeItem(element: Element, openChangesOnSelect: boolean, iconsMinimal
item.contextValue = element.isSubmodule ? 'submodule' : 'file';
item.id = element.dstAbsPath;
item.iconPath = path.join(gitIconRoot, toIconName(element) + '.svg');
if (checkboxState !== undefined) {
item.checkboxState = checkboxState;
}
if (!element.isSubmodule) {
const command = openChangesOnSelect ? 'openChanges' : 'openFile';
item.command = {
Expand All @@ -1120,6 +1152,9 @@ function toTreeItem(element: Element, openChangesOnSelect: boolean, iconsMinimal
item.tooltip = element.dstAbsPath;
item.contextValue = 'folder';
item.id = element.dstAbsPath;
if (checkboxState !== undefined) {
item.checkboxState = checkboxState;
}
if (!iconsMinimal) {
item.iconPath = new ThemeIcon('folder-opened');
}
Expand Down

0 comments on commit 9015700

Please sign in to comment.