Skip to content

Commit c126649

Browse files
Add full window mode for plots (#709)
* Add full window mode for plots * Add default full window config entry
1 parent 332d36e commit c126649

File tree

8 files changed

+127
-20
lines changed

8 files changed

+127
-20
lines changed

html/httpgd/index.js

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,14 @@ function getSmallPlots() {
2121
return smallPlots;
2222
}
2323
let isHandlerDragging = false;
24+
let isFullWindow = false;
2425
function postResizeMessage(userTriggered = false) {
25-
const newHeight = largePlotDiv.clientHeight;
26-
const newWidth = largePlotDiv.clientWidth;
26+
let newHeight = largePlotDiv.clientHeight;
27+
let newWidth = largePlotDiv.clientWidth;
28+
if (isFullWindow) {
29+
newHeight = window.innerHeight;
30+
newWidth = window.innerWidth;
31+
}
2732
if (userTriggered || newHeight !== oldHeight || newWidth !== oldWidth) {
2833
const msg = {
2934
message: 'resize',
@@ -66,6 +71,9 @@ window.addEventListener('message', (ev) => {
6671
else if (msg.message === 'togglePreviewPlotLayout') {
6772
togglePreviewPlotLayout(msg.style);
6873
}
74+
else if (msg.message === 'toggleFullWindow') {
75+
toggleFullWindowMode(msg.useFullWindow);
76+
}
6977
});
7078
function addPlot(html) {
7179
const wrapper = document.createElement('div');
@@ -124,6 +132,17 @@ function togglePreviewPlotLayout(newStyle) {
124132
smallPlotDiv.classList.remove('multirow', 'scroll', 'hidden');
125133
smallPlotDiv.classList.add(newStyle);
126134
}
135+
function toggleFullWindowMode(useFullWindow) {
136+
isFullWindow = useFullWindow;
137+
if (useFullWindow) {
138+
document.body.classList.add('fullWindow');
139+
window.scrollTo(0, 0);
140+
}
141+
else {
142+
document.body.classList.remove('fullWindow');
143+
}
144+
postResizeMessage(true);
145+
}
127146
////
128147
// On window load
129148
////
@@ -136,15 +155,15 @@ window.onload = () => {
136155
////
137156
document.addEventListener('mousedown', (e) => {
138157
// If mousedown event is fired from .handler, toggle flag to true
139-
if (e.target === handler) {
158+
if (!isFullWindow && e.target === handler) {
140159
isHandlerDragging = true;
141160
handler.classList.add('dragging');
142161
document.body.style.cursor = 'ns-resize';
143162
}
144163
});
145164
document.addEventListener('mousemove', (e) => {
146165
// Don't do anything if dragging flag is false
147-
if (!isHandlerDragging) {
166+
if (isFullWindow || !isHandlerDragging) {
148167
return false;
149168
}
150169
// postLogMessage('mousemove');

html/httpgd/index.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,15 @@ function getSmallPlots(): HTMLAnchorElement[] {
4444
let isHandlerDragging = false;
4545

4646

47+
let isFullWindow = false;
4748

4849
function postResizeMessage(userTriggered: boolean = false){
49-
const newHeight = largePlotDiv.clientHeight;
50-
const newWidth = largePlotDiv.clientWidth;
50+
let newHeight = largePlotDiv.clientHeight;
51+
let newWidth = largePlotDiv.clientWidth;
52+
if(isFullWindow){
53+
newHeight = window.innerHeight;
54+
newWidth = window.innerWidth;
55+
}
5156
if(userTriggered || newHeight !== oldHeight || newWidth !== oldWidth){
5257
const msg: ResizeMessage = {
5358
message: 'resize',
@@ -86,6 +91,8 @@ window.addEventListener('message', (ev: MessageEvent<InMessage>) => {
8691
addPlot(msg.html);
8792
} else if(msg.message === 'togglePreviewPlotLayout'){
8893
togglePreviewPlotLayout(msg.style);
94+
} else if(msg.message === 'toggleFullWindow'){
95+
toggleFullWindowMode(msg.useFullWindow);
8996
}
9097
});
9198

@@ -165,6 +172,16 @@ function togglePreviewPlotLayout(newStyle: PreviewPlotLayout): void {
165172
smallPlotDiv.classList.add(newStyle);
166173
}
167174

175+
function toggleFullWindowMode(useFullWindow): void {
176+
isFullWindow = useFullWindow;
177+
if(useFullWindow){
178+
document.body.classList.add('fullWindow');
179+
window.scrollTo(0, 0);
180+
} else {
181+
document.body.classList.remove('fullWindow');
182+
}
183+
postResizeMessage(true);
184+
}
168185

169186
////
170187
// On window load
@@ -183,7 +200,7 @@ window.onload = () => {
183200

184201
document.addEventListener('mousedown', (e) => {
185202
// If mousedown event is fired from .handler, toggle flag to true
186-
if (e.target === handler) {
203+
if (!isFullWindow && e.target === handler) {
187204
isHandlerDragging = true;
188205
handler.classList.add('dragging');
189206
document.body.style.cursor = 'ns-resize';
@@ -192,7 +209,7 @@ document.addEventListener('mousedown', (e) => {
192209

193210
document.addEventListener('mousemove', (e) => {
194211
// Don't do anything if dragging flag is false
195-
if (!isHandlerDragging) {
212+
if (isFullWindow || !isHandlerDragging) {
196213
return false;
197214
}
198215

html/httpgd/style.css

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ body {
1212
padding-left: 1px;
1313
padding-right: 1px;
1414
}
15+
body.fullWindow {
16+
overflow-x: hidden;
17+
overflow-y: hidden;
18+
}
1519

1620
svg {
1721
user-select: none;
@@ -29,6 +33,13 @@ svg {
2933
overflow-x: auto;
3034
overflow-y: hidden;
3135
padding: 10px;
36+
width: 100%;
37+
height: 100%;
38+
}
39+
body.fullWindow #largePlot {
40+
overflow-x: hidden;
41+
width: 100vw !important;
42+
height: 100vh !important;
3243
}
3344

3445
/* Dragbar to resize main plot: */
@@ -42,10 +53,16 @@ svg {
4253
transition: background-color .1s ease-out;
4354
transition-delay: .2s;
4455
}
56+
body.fullWindow #handler {
57+
display: none;
58+
}
4559

4660
#placeholder {
4761
height: 95vh;
4862
}
63+
body.fullWindow #placeHolder {
64+
display: none;
65+
}
4966

5067
/* Plot history: */
5168

@@ -58,6 +75,9 @@ svg {
5875
overflow-y: hidden;
5976
padding: 10px;
6077
}
78+
body.fullWindow #smallPlots {
79+
display: none;
80+
}
6181

6282
#smallPlots.multirow {
6383
overflow-x: hidden;

html/httpgd/webviewMessages.d.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ interface ToggleStyleMessage extends IMessage {
4141
useOverwrites: boolean
4242
}
4343

44+
interface ToggleFullWindowMessage extends IMessage {
45+
message: 'toggleFullWindow',
46+
useFullWindow: boolean
47+
}
48+
4449
type PreviewPlotLayout = 'multirow' | 'scroll' | 'hidden';
4550
interface PreviewPlotLayoutMessage extends IMessage {
4651
message: 'togglePreviewPlotLayout',
@@ -57,5 +62,5 @@ interface AddPlotMessage extends IMessage {
5762
html: string
5863
}
5964

60-
type InMessage = UpdatePlotMessage | FocusPlotMessage | ToggleStyleMessage | HidePlotMessage | AddPlotMessage | PreviewPlotLayoutMessage;
65+
type InMessage = UpdatePlotMessage | FocusPlotMessage | ToggleStyleMessage | HidePlotMessage | AddPlotMessage | PreviewPlotLayoutMessage | ToggleFullWindowMessage;
6166

package.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,12 @@
691691
"command": "r.plot.toggleStyle",
692692
"icon": "$(symbol-color)"
693693
},
694+
{
695+
"title": "Toggle Full Window Mode",
696+
"category": "R Plot",
697+
"command": "r.plot.toggleFullWindow",
698+
"icon": "$(screen-full)"
699+
},
694700
{
695701
"title": "Toggle Preview Plot Layout",
696702
"category": "R Plot",
@@ -937,6 +943,11 @@
937943
"when": "resourceScheme =~ /webview/ && r.plot.active",
938944
"command": "r.plot.toggleStyle"
939945
},
946+
{
947+
"group": "navigation",
948+
"when": "resourceScheme =~ /webview/ && r.plot.active",
949+
"command": "r.plot.toggleFullWindow"
950+
},
940951
{
941952
"group": "httpgd",
942953
"when": "resourceScheme =~ /webview/ && r.plot.active",
@@ -1348,6 +1359,11 @@
13481359
],
13491360
"markdownDescription": "How to display plot previews if more than one row required."
13501361
},
1362+
"r.plot.defaults.fullWindowMode": {
1363+
"type": "boolean",
1364+
"default": false,
1365+
"markdownDescription": "Whether to use full window mode when launching the plot viewer."
1366+
},
13511367
"r.plot.timing.resizeInterval": {
13521368
"type": "number",
13531369
"default": 100,

src/plotViewer/httpgdTypes.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export interface HttpgdViewerOptions {
8686
viewColumn?: vscode.ViewColumn;
8787
htmlRoot: string;
8888
stripStyles?: boolean;
89+
fullWindow?: boolean;
8990
previewPlotLayout?: PreviewPlotLayout,
9091
resizeTimeoutLength?: number;
9192
refreshTimeoutLength?: number;

src/plotViewer/index.ts

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { config, setContext } from '../util';
1212

1313
import { extensionContext } from '../extension';
1414

15-
import { FocusPlotMessage, InMessage, OutMessage, ToggleStyleMessage, UpdatePlotMessage, HidePlotMessage, AddPlotMessage, PreviewPlotLayout, PreviewPlotLayoutMessage } from './webviewMessages';
15+
import { FocusPlotMessage, InMessage, OutMessage, ToggleStyleMessage, UpdatePlotMessage, HidePlotMessage, AddPlotMessage, PreviewPlotLayout, PreviewPlotLayoutMessage, ToggleFullWindowMessage } from './webviewMessages';
1616

1717
import { isHost, rHostService, shareBrowser } from '../liveshare';
1818

@@ -22,6 +22,7 @@ const commands = [
2222
'openExternal',
2323
'showIndex',
2424
'toggleStyle',
25+
'toggleFullWindow',
2526
'togglePreviewPlots',
2627
'exportPlot',
2728
'nextPlot',
@@ -83,6 +84,7 @@ export class HttpgdManager {
8384
this.viewerOptions.previewPlotLayout = conf.get<PreviewPlotLayout>('plot.defaults.plotPreviewLayout', 'multirow');
8485
this.viewerOptions.refreshTimeoutLength = conf.get('plot.timing.refreshInterval', 10);
8586
this.viewerOptions.resizeTimeoutLength = conf.get('plot.timing.resizeInterval', 100);
87+
this.viewerOptions.fullWindow = conf.get('plot.defaults.fullWindowMode', false);
8688
this.viewerOptions.token = token;
8789
const viewer = new HttpgdViewer(host, this.viewerOptions);
8890
this.viewers.unshift(viewer);
@@ -171,16 +173,16 @@ export class HttpgdManager {
171173
void viewer.focusPlot(stringArg);
172174
break;
173175
} case 'nextPlot': {
174-
viewer.nextPlot(boolArg);
176+
void viewer.nextPlot(boolArg);
175177
break;
176178
} case 'prevPlot': {
177-
viewer.prevPlot(boolArg);
179+
void viewer.prevPlot(boolArg);
178180
break;
179181
} case 'lastPlot': {
180-
viewer.nextPlot(true);
182+
void viewer.nextPlot(true);
181183
break;
182184
} case 'firstPlot': {
183-
viewer.prevPlot(true);
185+
void viewer.prevPlot(true);
184186
break;
185187
} case 'resetPlots': {
186188
viewer.resetPlots();
@@ -209,6 +211,9 @@ export class HttpgdManager {
209211
} case 'openExternal': {
210212
void viewer.openExternal();
211213
break;
214+
} case 'toggleFullWindow': {
215+
void viewer.toggleFullWindow();
216+
break;
212217
} default: {
213218
break;
214219
}
@@ -267,6 +272,9 @@ export class HttpgdViewer implements IHttpgdViewer {
267272

268273
readonly defaultPreviewPlotLayout: PreviewPlotLayout = 'multirow';
269274
previewPlotLayout: PreviewPlotLayout;
275+
276+
readonly defaultFullWindow: boolean = false;
277+
fullWindow: boolean;
270278

271279
// Custom file to be used instead of `styleOverwrites.css`
272280
customOverwriteCssPath?: string;
@@ -360,6 +368,8 @@ export class HttpgdViewer implements IHttpgdViewer {
360368
this.stripStyles = this.defaultStripStyles;
361369
this.defaultPreviewPlotLayout = options.previewPlotLayout ?? this.defaultPreviewPlotLayout;
362370
this.previewPlotLayout = this.defaultPreviewPlotLayout;
371+
this.defaultFullWindow = options.fullWindow ?? this.defaultFullWindow;
372+
this.fullWindow = this.defaultFullWindow;
363373
this.resizeTimeoutLength = options.refreshTimeoutLength ?? this.resizeTimeoutLength;
364374
this.refreshTimeoutLength = options.refreshTimeoutLength ?? this.refreshTimeoutLength;
365375
this.api.start();
@@ -397,7 +407,9 @@ export class HttpgdViewer implements IHttpgdViewer {
397407

398408
// focus a specific plot id
399409
public async focusPlot(id?: PlotId): Promise<void> {
400-
this.activePlot = id;
410+
if(id){
411+
this.activePlot = id;
412+
}
401413
const plt = this.plots[this.activeIndex];
402414
if(plt.height !== this.viewHeight * this.scale || plt.width !== this.viewHeight * this.scale){
403415
await this.refreshPlots();
@@ -416,13 +428,13 @@ export class HttpgdViewer implements IHttpgdViewer {
416428
}
417429

418430
// navigate through plots (supply `true` to go to end/beginning of list)
419-
public nextPlot(last?: boolean): void {
431+
public async nextPlot(last?: boolean): Promise<void> {
420432
this.activeIndex = last ? this.plots.length - 1 : this.activeIndex+1;
421-
this._focusPlot();
433+
await this.focusPlot();
422434
}
423-
public prevPlot(first?: boolean): void {
435+
public async prevPlot(first?: boolean): Promise<void> {
424436
this.activeIndex = first ? 0 : this.activeIndex-1;
425-
this._focusPlot();
437+
await this.focusPlot();
426438
}
427439

428440
// restore closed plots, reset zoom, redraw html
@@ -468,6 +480,15 @@ export class HttpgdViewer implements IHttpgdViewer {
468480
};
469481
this.postWebviewMessage(msg);
470482
}
483+
484+
public toggleFullWindow(force?: boolean): void {
485+
this.fullWindow = force ?? !this.fullWindow;
486+
const msg: ToggleFullWindowMessage = {
487+
message: 'toggleFullWindow',
488+
useFullWindow: this.fullWindow
489+
};
490+
this.postWebviewMessage(msg);
491+
}
471492

472493
public togglePreviewPlots(force?: PreviewPlotLayout): void{
473494
if(force){
@@ -664,6 +685,8 @@ export class HttpgdViewer implements IHttpgdViewer {
664685
this.webviewPanel ??= this.makeNewWebview();
665686
this.webviewPanel.webview.html = '';
666687
this.webviewPanel.webview.html = this.makeHtml();
688+
// make sure that fullWindow is set correctly:
689+
this.toggleFullWindow(this.fullWindow);
667690
void this.setContextValues(true);
668691
}
669692

src/plotViewer/webviewMessages.d.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ export interface ToggleStyleMessage extends IMessage {
4646
useOverwrites: boolean
4747
}
4848

49+
export interface ToggleFullWindowMessage extends IMessage {
50+
message: 'toggleFullWindow',
51+
useFullWindow: boolean
52+
}
53+
54+
4955
export type PreviewPlotLayout = 'multirow' | 'scroll' | 'hidden';
5056
export interface PreviewPlotLayoutMessage extends IMessage {
5157
message: 'togglePreviewPlotLayout',
@@ -62,4 +68,4 @@ export interface AddPlotMessage extends IMessage {
6268
html: string
6369
}
6470

65-
export type InMessage = UpdatePlotMessage | FocusPlotMessage | ToggleStyleMessage | HidePlotMessage | AddPlotMessage | PreviewPlotLayoutMessage;
71+
export type InMessage = UpdatePlotMessage | FocusPlotMessage | ToggleStyleMessage | HidePlotMessage | AddPlotMessage | PreviewPlotLayoutMessage | ToggleFullWindowMessage;

0 commit comments

Comments
 (0)