2
2
* Copyright (C) Microsoft Corporation. All rights reserved.
3
3
*--------------------------------------------------------*/
4
4
5
- import * as Gear from 'vscode-codicons/src/icons/gear.svg' ;
6
5
import { Metric } from './baseMetric' ;
7
6
import styles from './chart.css' ;
8
7
import { Configurator } from './configurator' ;
@@ -17,9 +16,10 @@ const openToSideWidth = 250;
17
16
const openToSideMinSpace = 600 ;
18
17
19
18
export class Chart {
20
- private valElements : [ Metric , HTMLElement ] [ ] = [ ] ;
19
+ private valElements : [ Metric , { max : HTMLElement ; val : HTMLElement } ] [ ] = [ ] ;
21
20
private configOpen = false ;
22
21
private configHadManualToggle = false ;
22
+ private hasAnyData = false ;
23
23
24
24
private readonly frameCanvas = new FrameCanvas ( this . width , this . height , this . settings ) ;
25
25
private readonly elements = this . createElements ( ) ;
@@ -62,7 +62,8 @@ export class Chart {
62
62
graphHeight = height - Sizing . LabelHeight ;
63
63
graphWidth = width ;
64
64
} else if ( width < openToSideMinSpace ) {
65
- graphHeight = Math . min ( height - Sizing . LabelHeight , Math . round ( width / naturalAspectRatio ) ) ;
65
+ const cfgrect = this . configurator . elem . getBoundingClientRect ( ) ;
66
+ graphHeight = height - cfgrect . height ;
66
67
graphWidth = width ;
67
68
} else {
68
69
graphHeight = height ;
@@ -82,9 +83,20 @@ export class Chart {
82
83
this . configurator . updateMetrics ( ) ;
83
84
}
84
85
85
- for ( const [ metric , el ] of this . valElements ) {
86
- el . innerText = metric . format ( metric . current ) ;
86
+ for ( const [ metric , { val, max } ] of this . valElements ) {
87
+ max . innerText = metric . format ( metric . maxY ) ;
88
+ val . innerText = metric . format ( metric . current ) ;
87
89
}
90
+
91
+ this . setHasData ( this . settings . allMetrics . some ( m => m . hasData ( ) ) ) ;
92
+ }
93
+
94
+ private setHasData ( hasData : boolean ) {
95
+ if ( hasData === this . hasAnyData ) {
96
+ return ;
97
+ }
98
+
99
+ this . elements . container . classList [ hasData ? 'remove' : 'add' ] ( styles . noData ) ;
88
100
}
89
101
90
102
private setConfiguratorOpen ( isOpen : boolean ) {
@@ -109,18 +121,25 @@ export class Chart {
109
121
110
122
private createElements ( ) {
111
123
const container = document . createElement ( 'div' ) ;
112
- container . classList . add ( styles . container ) ;
124
+ container . classList . add ( styles . container , styles . noData ) ;
113
125
container . style . setProperty ( '--primary-series-color' , this . settings . colors . primaryGraph ) ;
114
126
container . style . setProperty ( '--secondary-series-color' , this . settings . colors . secondaryGraph ) ;
115
127
116
128
const graph = document . createElement ( 'div' ) ;
117
129
graph . style . position = 'relative' ;
118
130
graph . appendChild ( this . frameCanvas . elem ) ;
131
+ graph . addEventListener ( 'click' , ( ) => this . toggleConfiguration ( false ) ) ;
119
132
container . appendChild ( graph ) ;
120
133
134
+ const noData = document . createElement ( 'div' ) ;
135
+ noData . classList . add ( styles . noDataText ) ;
136
+ noData . innerText = 'No data yet -- start a debug session to collect some!' ;
137
+ container . appendChild ( noData ) ;
138
+
121
139
const labelList = document . createElement ( 'div' ) ;
122
140
labelList . classList . add ( styles . labelList ) ;
123
141
labelList . style . height = `${ Sizing . LabelHeight } px` ;
142
+ labelList . addEventListener ( 'click' , ( ) => this . toggleConfiguration ( true ) ) ;
124
143
container . appendChild ( labelList ) ;
125
144
126
145
const leftTime = document . createElement ( 'div' ) ;
@@ -136,20 +155,18 @@ export class Chart {
136
155
valueContainer . classList . add ( styles . maxContainer ) ;
137
156
graph . appendChild ( valueContainer ) ;
138
157
139
- const toggleButton = document . createElement ( 'button' ) ;
140
- toggleButton . classList . add ( styles . toggle ) ;
141
- toggleButton . innerHTML = Gear ;
142
- toggleButton . addEventListener ( 'click' , ( ) => this . toggleConfiguration ( ) ) ;
143
- graph . appendChild ( toggleButton ) ;
144
-
145
158
this . setSeries ( labelList , valueContainer ) ;
146
159
147
- return { toggleButton , container, labelList, leftTime, valueContainer } ;
160
+ return { container, labelList, leftTime, valueContainer } ;
148
161
}
149
162
150
- private toggleConfiguration ( ) {
163
+ private toggleConfiguration ( toState = ! this . configOpen ) {
164
+ if ( toState === this . configOpen ) {
165
+ return ;
166
+ }
167
+
151
168
this . configHadManualToggle = true ;
152
- this . setConfiguratorOpen ( ! this . configOpen ) ;
169
+ this . setConfiguratorOpen ( toState ) ;
153
170
this . updateSize ( this . width , this . height ) ;
154
171
}
155
172
@@ -160,8 +177,9 @@ export class Chart {
160
177
}
161
178
162
179
private setSeries ( labelList : HTMLElement , maxContainer : HTMLElement ) {
163
- for ( const [ , el ] of this . valElements ) {
164
- maxContainer . removeChild ( el ) ;
180
+ for ( const [ , { max, val } ] of this . valElements ) {
181
+ max . parentElement ?. removeChild ( max ) ;
182
+ val . parentElement ?. removeChild ( val ) ;
165
183
}
166
184
167
185
labelList . innerHTML = '' ;
@@ -171,16 +189,19 @@ export class Chart {
171
189
const label = document . createElement ( 'span' ) ;
172
190
label . style . setProperty ( '--metric-color' , this . settings . metricColor ( metric ) ) ;
173
191
label . classList . add ( styles . primary ) ;
174
- label . innerText = metric . name ( ) ;
192
+ label . innerText = ` ${ metric . name ( ) } : ` ;
175
193
labelList . appendChild ( label ) ;
176
194
177
- const val = document . createElement ( 'div' ) ;
178
- val . classList . add ( styles . max , styles . primary ) ;
179
- val . style . setProperty ( '--metric-color' , this . settings . metricColor ( metric ) ) ;
195
+ const val = document . createElement ( 'span' ) ;
180
196
val . innerText = metric . format ( metric . current ) ;
197
+ label . appendChild ( val ) ;
198
+
199
+ const max = document . createElement ( 'div' ) ;
200
+ max . classList . add ( styles . max , styles . primary ) ;
201
+ max . innerText = metric . format ( metric . maxY ) ;
202
+ maxContainer . appendChild ( max ) ;
181
203
182
- maxContainer . appendChild ( val ) ;
183
- this . valElements . push ( [ metric , val ] ) ;
204
+ this . valElements . push ( [ metric , { max, val } ] ) ;
184
205
}
185
206
}
186
207
}
0 commit comments