Skip to content

Commit aeeddbe

Browse files
committed
Styling changes
1 parent e60b7db commit aeeddbe

File tree

3 files changed

+75
-31
lines changed

3 files changed

+75
-31
lines changed

src/codebucket/command/registerCommands.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { commands, ExtensionContext } from 'vscode';
1+
import { FileDecorationProvider } from 'src/views/nodes/pullRequestFilesNode';
2+
import { commands, ExtensionContext, window } from 'vscode';
23

34
import { CopyBitbucketPullRequestCommand } from './command-copy-pullreqest';
45
import { OpenInBitbucketCommand } from './command-open';
@@ -34,4 +35,6 @@ export function activate(context: ExtensionContext) {
3435
copyPullRequest.run(),
3536
);
3637
context.subscriptions.push(copyPullRequestCmd);
38+
const decorationProvider = new FileDecorationProvider();
39+
context.subscriptions.push(window.registerFileDecorationProvider(decorationProvider));
3740
}

src/views/nodes/pullRequestFilesNode.ts

Lines changed: 64 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,53 +4,91 @@ import * as vscode from 'vscode';
44
import { FileStatus } from '../../bitbucket/model';
55
import { Commands } from '../../commands';
66
import { configuration } from '../../config/configuration';
7-
import { Resources } from '../../resources';
87
import { DiffViewArgs } from '../pullrequest/diffViewHelper';
9-
import { PullRequestContextValue } from '../pullrequest/pullRequestNode';
108
import { AbstractBaseNode } from './abstractBaseNode';
119

10+
export class FileDecorationProvider implements vscode.FileDecorationProvider {
11+
private _onDidChangeFileDecorations = new vscode.EventEmitter<vscode.Uri[]>();
12+
readonly onDidChangeFileDecorations = this._onDidChangeFileDecorations.event;
13+
14+
provideFileDecoration(
15+
uri: vscode.Uri,
16+
_token: vscode.CancellationToken,
17+
): vscode.ProviderResult<vscode.FileDecoration> {
18+
try {
19+
const params = JSON.parse(uri.query);
20+
const status = params.status as FileStatus;
21+
const hasComments = params.hasComments;
22+
if (status) {
23+
return {
24+
badge: hasComments ? `💬${status}` : status,
25+
color: this.getColor(status),
26+
tooltip: hasComments ? `File has comments` : undefined,
27+
propagate: false,
28+
};
29+
}
30+
} catch (e) {
31+
console.error('Error in provideFileDecoration:', e);
32+
}
33+
return undefined;
34+
}
35+
36+
private getColor(status: FileStatus): vscode.ThemeColor {
37+
switch (status) {
38+
case FileStatus.MODIFIED:
39+
return new vscode.ThemeColor('gitDecoration.modifiedResourceForeground');
40+
case FileStatus.ADDED:
41+
return new vscode.ThemeColor('gitDecoration.addedResourceForeground');
42+
case FileStatus.DELETED:
43+
return new vscode.ThemeColor('gitDecoration.deletedResourceForeground');
44+
case FileStatus.RENAMED:
45+
return new vscode.ThemeColor('gitDecoration.renamedResourceForeground');
46+
case FileStatus.CONFLICT:
47+
return new vscode.ThemeColor('gitDecoration.conflictingResourceForeground');
48+
case FileStatus.COPIED:
49+
return new vscode.ThemeColor('gitDecoration.addedResourceForeground');
50+
default:
51+
return new vscode.ThemeColor('gitDecoration.modifiedResourceForeground');
52+
}
53+
}
54+
}
55+
1256
export class PullRequestFilesNode extends AbstractBaseNode {
1357
constructor(private diffViewData: DiffViewArgs) {
1458
super();
1559
}
1660

61+
createFileChangeUri(fileName: string, status: FileStatus, prUrl: string, hasComments: boolean): vscode.Uri {
62+
return vscode.Uri.parse(`${prUrl}/${fileName}`).with({
63+
scheme: 'pullRequest',
64+
query: JSON.stringify({
65+
status: status,
66+
hasComments: hasComments,
67+
}),
68+
});
69+
}
70+
1771
async getTreeItem(): Promise<vscode.TreeItem> {
1872
const itemData = this.diffViewData.fileDisplayData;
1973
let fileDisplayString = itemData.fileDisplayName;
2074
if (configuration.get<boolean>('bitbucket.explorer.nestFilesEnabled')) {
2175
fileDisplayString = path.basename(itemData.fileDisplayName);
2276
}
23-
const item = new vscode.TreeItem(
24-
`${itemData.numberOfComments > 0 ? '💬 ' : ''}${fileDisplayString}`,
25-
vscode.TreeItemCollapsibleState.None,
26-
);
77+
const item = new vscode.TreeItem(fileDisplayString, vscode.TreeItemCollapsibleState.None);
2778
item.tooltip = itemData.fileDisplayName;
2879
item.command = {
2980
command: Commands.ViewDiff,
3081
title: 'Diff file',
3182
arguments: this.diffViewData.diffArgs,
3283
};
3384

34-
item.contextValue = PullRequestContextValue;
35-
item.resourceUri = vscode.Uri.parse(`${itemData.prUrl}#chg-${itemData.fileDisplayName}`);
36-
switch (itemData.fileDiffStatus) {
37-
case FileStatus.ADDED:
38-
item.iconPath = Resources.icons.get('add-circle');
39-
break;
40-
case FileStatus.DELETED:
41-
item.iconPath = Resources.icons.get('delete');
42-
break;
43-
case FileStatus.CONFLICT:
44-
item.iconPath = Resources.icons.get('warning');
45-
break;
46-
default:
47-
item.iconPath = Resources.icons.get('edit');
48-
break;
49-
}
50-
51-
if (this.diffViewData.fileDisplayData.isConflicted) {
52-
item.iconPath = Resources.icons.get('warning');
53-
}
85+
item.resourceUri = this.createFileChangeUri(
86+
itemData.fileDisplayName,
87+
itemData.fileDiffStatus,
88+
itemData.prUrl,
89+
itemData.numberOfComments > 0,
90+
);
91+
item.iconPath = undefined;
5492

5593
return item;
5694
}

src/views/pullrequest/pullRequestNode.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ export class PullRequestTitlesNode extends AbstractBaseNode {
6464
item.iconPath = vscode.Uri.parse(this.pr.data!.author!.avatarUrl);
6565
item.contextValue = PullRequestContextValue;
6666
item.resourceUri = vscode.Uri.parse(this.pr.data.url);
67+
item.command = {
68+
command: Commands.BitbucketShowPullRequestDetails,
69+
title: 'Open pull request details',
70+
arguments: [this.pr],
71+
};
72+
6773
let dateString = '';
6874
if (typeof this.pr.data.updatedTs === 'number') {
6975
dateString = formatDistanceToNow(new Date(this.pr.data.updatedTs), {
@@ -102,7 +108,6 @@ export class PullRequestTitlesNode extends AbstractBaseNode {
102108
fileChangedNodes = await createFileChangesNodes(this.pr, comments, files, [], []);
103109
// update loadedChildren with critical data without commits
104110
this.loadedChildren = [
105-
new DescriptionNode(this.pr),
106111
...(this.pr.site.details.isCloud ? [new CommitSectionNode(this.pr, [], true)] : []),
107112
...fileChangedNodes,
108113
];
@@ -130,7 +135,6 @@ export class PullRequestTitlesNode extends AbstractBaseNode {
130135
]);
131136
// update loadedChildren with additional data
132137
this.loadedChildren = [
133-
new DescriptionNode(this.pr),
134138
...(this.pr.site.details.isCloud ? [new CommitSectionNode(this.pr, commits)] : []),
135139
...jiraIssueNodes,
136140
...fileNodes,
@@ -148,7 +152,7 @@ export class PullRequestTitlesNode extends AbstractBaseNode {
148152
}
149153

150154
this.isLoading = true;
151-
this.loadedChildren = [new DescriptionNode(this.pr), new SimpleNode('Loading...')];
155+
this.loadedChildren = [new SimpleNode('Loading...')];
152156
let fileDiffs: FileDiff[] = [];
153157
let allComments: PaginatedComments = { data: [] };
154158
let fileChangedNodes: AbstractBaseNode[] = [];
@@ -168,7 +172,6 @@ export class PullRequestTitlesNode extends AbstractBaseNode {
168172
const commits = await commitsPromise;
169173
// update loadedChildren with commits data
170174
this.loadedChildren = [
171-
new DescriptionNode(this.pr),
172175
...(this.pr.site.details.isCloud ? [new CommitSectionNode(this.pr, commits)] : []),
173176
...fileChangedNodes,
174177
];

0 commit comments

Comments
 (0)