@@ -206,72 +206,115 @@ class _NetworkProfilerControlsState extends State<_NetworkProfilerControls>
206206
207207 final screenWidth = ScreenSize (context).width;
208208 final hasRequests = controller.filteredData.value.isNotEmpty;
209- return Row (
209+ return Column (
210210 children: [
211- StartStopRecordingButton (
212- recording: _recording,
213- onPressed: () async => await controller.togglePolling (! _recording),
214- tooltipOverride: _recording
215- ? 'Stop recording network traffic'
216- : 'Resume recording network traffic' ,
217- minScreenWidthForText: double .infinity,
218- gaScreen: gac.network,
219- gaSelection: _recording ? gac.pause : gac.resume,
220- ),
221- const SizedBox (width: denseSpacing),
222- ClearButton (
223- minScreenWidthForText: _NetworkProfilerControls ._includeTextWidth,
224- gaScreen: gac.network,
225- gaSelection: gac.clear,
226- onPressed: controller.clear,
211+ Row (
212+ children: [
213+ StartStopRecordingButton (
214+ recording: _recording,
215+ onPressed: () async =>
216+ await controller.togglePolling (! _recording),
217+ tooltipOverride: _recording
218+ ? 'Stop recording network traffic'
219+ : 'Resume recording network traffic' ,
220+ minScreenWidthForText: double .infinity,
221+ gaScreen: gac.network,
222+ gaSelection: _recording ? gac.pause : gac.resume,
223+ ),
224+ const SizedBox (width: denseSpacing),
225+ ClearButton (
226+ minScreenWidthForText: _NetworkProfilerControls ._includeTextWidth,
227+ gaScreen: gac.network,
228+ gaSelection: gac.clear,
229+ onPressed: controller.clear,
230+ ),
231+ const SizedBox (width: denseSpacing),
232+ // TODO(kenz): fix focus issue when state is refreshed
233+ Expanded (
234+ child: SearchField <NetworkController >(
235+ searchController: controller,
236+ searchFieldEnabled: hasRequests,
237+ searchFieldWidth: screenWidth <= MediaSize .xs
238+ ? defaultSearchFieldWidth
239+ : wideSearchFieldWidth,
240+ ),
241+ ),
242+ const SizedBox (width: denseSpacing),
243+ Expanded (
244+ child: StandaloneFilterField <NetworkRequest >(
245+ controller: controller,
246+ filteredItem: 'request' ,
247+ ),
248+ ),
249+ const SizedBox (width: denseSpacing),
250+ if (FeatureFlags .networkSaveLoad.isEnabled)
251+ OpenSaveButtonGroup (
252+ screenId: ScreenMetaData .network.id,
253+ saveFormats: const [SaveFormat .devtools, SaveFormat .har],
254+ gaItemForSaveFormatSelection: (SaveFormat format) =>
255+ switch (format) {
256+ SaveFormat .devtools => gac.saveFile,
257+ SaveFormat .har => gac.NetworkEvent .downloadAsHar.name,
258+ },
259+ onSave: (SaveFormat format) async {
260+ switch (format) {
261+ case SaveFormat .devtools:
262+ await controller.fetchFullDataBeforeExport ();
263+ controller.exportData ();
264+ case SaveFormat .har:
265+ await controller.exportAsHarFile ();
266+ }
267+ },
268+ )
269+ else
270+ DownloadButton (
271+ tooltip: 'Download as .har file' ,
272+ minScreenWidthForText:
273+ _NetworkProfilerControls ._includeTextWidth,
274+ onPressed: controller.exportAsHarFile,
275+ gaScreen: gac.network,
276+ gaSelection: gac.NetworkEvent .downloadAsHar.name,
277+ ),
278+ ],
227279 ),
228- const SizedBox (width: denseSpacing),
229- // TODO(kenz): fix focus issue when state is refreshed
230- Expanded (
231- child: SearchField <NetworkController >(
232- searchController: controller,
233- searchFieldEnabled: hasRequests,
234- searchFieldWidth: screenWidth <= MediaSize .xs
235- ? defaultSearchFieldWidth
236- : wideSearchFieldWidth,
280+ if (! _recording)
281+ const Padding (
282+ padding: EdgeInsets .only (top: intermediateSpacing),
283+ child: _RecordingPausedBanner (),
237284 ),
285+ ],
286+ );
287+ }
288+ }
289+
290+ class _RecordingPausedBanner extends StatelessWidget {
291+ const _RecordingPausedBanner ();
292+
293+ @override
294+ Widget build (BuildContext context) {
295+ final theme = Theme .of (context);
296+ return Card (
297+ color: theme.colorScheme.secondaryContainer,
298+ child: Padding (
299+ padding: const EdgeInsets .symmetric (
300+ vertical: densePadding,
301+ horizontal: denseSpacing,
238302 ),
239- const SizedBox (width: denseSpacing),
240- Expanded (
241- child: StandaloneFilterField <NetworkRequest >(
242- controller: controller,
243- filteredItem: 'request' ,
244- ),
303+ child: Row (
304+ mainAxisAlignment: MainAxisAlignment .spaceBetween,
305+ children: [
306+ Expanded (
307+ child: Text (
308+ 'Network traffic recording is paused. Click the resume button '
309+ 'to continue.' ,
310+ style: theme.regularTextStyle.copyWith (
311+ color: theme.colorScheme.onSecondaryContainer,
312+ ),
313+ ),
314+ ),
315+ ],
245316 ),
246- const SizedBox (width: denseSpacing),
247- if (FeatureFlags .networkSaveLoad.isEnabled)
248- OpenSaveButtonGroup (
249- screenId: ScreenMetaData .network.id,
250- saveFormats: const [SaveFormat .devtools, SaveFormat .har],
251- gaItemForSaveFormatSelection: (SaveFormat format) =>
252- switch (format) {
253- SaveFormat .devtools => gac.saveFile,
254- SaveFormat .har => gac.NetworkEvent .downloadAsHar.name,
255- },
256- onSave: (SaveFormat format) async {
257- switch (format) {
258- case SaveFormat .devtools:
259- await controller.fetchFullDataBeforeExport ();
260- controller.exportData ();
261- case SaveFormat .har:
262- await controller.exportAsHarFile ();
263- }
264- },
265- )
266- else
267- DownloadButton (
268- tooltip: 'Download as .har file' ,
269- minScreenWidthForText: _NetworkProfilerControls ._includeTextWidth,
270- onPressed: controller.exportAsHarFile,
271- gaScreen: gac.network,
272- gaSelection: gac.NetworkEvent .downloadAsHar.name,
273- ),
274- ],
317+ ),
275318 );
276319 }
277320}
0 commit comments