Skip to content

Commit d67b08c

Browse files
authored
fix: Properly zoom in all matrix sizes (#227)
2 parents 77091c7 + f2091ee commit d67b08c

File tree

18 files changed

+392
-330
lines changed

18 files changed

+392
-330
lines changed

lib/providers/desktop_view_provider.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,12 @@ class DesktopViewProvider extends UnityProvider {
306306
}
307307
}
308308

309+
if (previousDevice.matrixType != device.matrixType) {
310+
final player = UnityPlayers.players[device.uuid];
311+
player?.zoom.matrixType = device.matrixType ?? MatrixType.t16;
312+
player?.zoom.zoomAxis = (-1, -1);
313+
}
314+
309315
if (reload) {
310316
UnityPlayers.reloadDevice(device);
311317
}

lib/providers/downloads_provider.dart

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import 'package:bluecherry_client/providers/settings_provider.dart';
2828
import 'package:bluecherry_client/utils/constants.dart';
2929
import 'package:bluecherry_client/utils/storage.dart';
3030
import 'package:dio/dio.dart';
31+
import 'package:file_picker/file_picker.dart';
3132
import 'package:flutter/foundation.dart';
3233
import 'package:path/path.dart' as path;
3334
import 'package:path_provider/path_provider.dart';
@@ -230,7 +231,23 @@ class DownloadsManager extends UnityProvider {
230231
downloading[event] = 0.0;
231232
notifyListeners();
232233

233-
final dir = SettingsProvider.instance.kDownloadsDirectory.value;
234+
final dir = await () async {
235+
final settings = SettingsProvider.instance;
236+
237+
if (settings.kChooseLocationEveryTime.value) {
238+
final selectedDirectory = await FilePicker.platform.getDirectoryPath(
239+
dialogTitle: 'Choose download location',
240+
initialDirectory: settings.kDownloadsDirectory.value,
241+
lockParentWindow: true,
242+
);
243+
244+
if (selectedDirectory != null) {
245+
debugPrint('Selected directory: $selectedDirectory');
246+
settings.kDownloadsDirectory.value = selectedDirectory;
247+
}
248+
}
249+
return settings.kDownloadsDirectory.value;
250+
}();
234251
final fileName =
235252
'event_${event.id}_${event.deviceID}_${event.server.name}.mp4';
236253
final downloadPath = path.join(dir, fileName);

lib/providers/settings_provider.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import 'dart:io';
2121

2222
import 'package:bluecherry_client/providers/app_provider_interface.dart';
2323
import 'package:bluecherry_client/providers/downloads_provider.dart';
24+
import 'package:bluecherry_client/providers/update_provider.dart';
2425
import 'package:bluecherry_client/utils/storage.dart';
2526
import 'package:bluecherry_client/utils/video_player.dart';
2627
import 'package:flutter/foundation.dart';
@@ -43,10 +44,11 @@ class _SettingsOption<T> {
4344
late final String Function(T value) saveAs;
4445
late final T Function(String value) loadFrom;
4546
final ValueChanged<T>? onChanged;
47+
final T Function()? valueOverrider;
4648

4749
late T _value;
4850

49-
T get value => _value;
51+
T get value => valueOverrider?.call() ?? _value;
5052
set value(T newValue) {
5153
SettingsProvider.instance.updateProperty(() {
5254
_value = newValue;
@@ -66,6 +68,7 @@ class _SettingsOption<T> {
6668
this.min,
6769
this.max,
6870
this.onChanged,
71+
this.valueOverrider,
6972
}) {
7073
Future.microtask(() async {
7174
_value = getDefault != null ? await getDefault!() : def;
@@ -347,15 +350,18 @@ class SettingsProvider extends UnityProvider {
347350
saveAs: (value) => value.index.toString(),
348351
);
349352
final kSoftwareZooming = _SettingsOption<bool>(
350-
def: Platform.isMacOS ? true : false,
353+
def: Platform.isMacOS || kIsWeb || UpdateManager.isEmbedded ? true : false,
351354
key: 'other.software_zoom',
352355
onChanged: (value) {
353356
for (final player in UnityPlayers.players.values) {
354357
player
355358
..resetCrop()
356-
..softwareZoom = value;
359+
..zoom.softwareZoom = value;
357360
}
358361
},
362+
valueOverrider: Platform.isMacOS || kIsWeb || UpdateManager.isEmbedded
363+
? () => true
364+
: null,
359365
);
360366
final kShowDebugInfo = _SettingsOption(
361367
def: kDebugMode,

lib/screens/layouts/desktop/multicast_view.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class _MulticastViewportState extends State<MulticastViewport> {
124124
next = previousZoom(currentZoom!, size);
125125
}
126126

127-
view.player.crop(next.$1, next.$2, size);
127+
view.player.crop(next.$1, next.$2);
128128
debugPrint('next: $next');
129129
currentZoom = next;
130130
}
@@ -160,7 +160,7 @@ class _MulticastViewportState extends State<MulticastViewport> {
160160
);
161161
},
162162
onPressed: () {
163-
view.player.crop(row, col, size);
163+
view.player.crop(row, col);
164164
currentZoom = (row, col);
165165
},
166166
builder: (context, states) => SizedBox.expand(

lib/screens/settings/advanced_options.dart

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ class AdvancedOptionsSettings extends StatelessWidget {
161161
},
162162
dense: false,
163163
),
164-
if (kDebugMode)
164+
if (settings.kShowDebugInfo.value)
165165
CheckboxListTile.adaptive(
166166
contentPadding: DesktopSettings.horizontalPadding,
167167
secondary: CircleAvatar(
@@ -187,7 +187,7 @@ class AdvancedOptionsSettings extends StatelessWidget {
187187
contentPadding: DesktopSettings.horizontalPadding,
188188
leading: CircleAvatar(
189189
backgroundColor: Colors.transparent,
190-
foregroundColor: theme.iconTheme.color,
190+
foregroundColor: theme.colorScheme.error,
191191
child: const Icon(Icons.restore),
192192
),
193193
title: const Text('Restore Defaults'),
@@ -196,8 +196,36 @@ class AdvancedOptionsSettings extends StatelessWidget {
196196
'affect your servers or any other data.',
197197
),
198198
trailing: const Icon(Icons.navigate_next),
199-
// TODO(bdlukaa): Show an "Are you sure?" dialog
200-
onTap: settings.restoreDefaults,
199+
textColor: theme.colorScheme.error,
200+
iconColor: theme.colorScheme.error,
201+
onTap: () {
202+
showDialog(
203+
context: context,
204+
builder: (context) {
205+
return AlertDialog(
206+
title: const Text('Are you sure?'),
207+
content: const Text(
208+
'This will restore all settings to their default values. '
209+
'This will not affect your servers or any other data.',
210+
),
211+
actions: [
212+
FilledButton(
213+
onPressed: () {
214+
settings.restoreDefaults();
215+
Navigator.of(context).pop();
216+
},
217+
child: Text(loc.yes),
218+
),
219+
TextButton(
220+
autofocus: true,
221+
onPressed: Navigator.of(context).pop,
222+
child: Text(loc.no),
223+
),
224+
],
225+
);
226+
},
227+
);
228+
},
201229
),
202230
],
203231
]);

lib/screens/settings/application.dart

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import 'package:bluecherry_client/screens/settings/settings_desktop.dart';
2222
import 'package:bluecherry_client/screens/settings/shared/options_chooser_tile.dart';
2323
import 'package:bluecherry_client/utils/extensions.dart';
2424
import 'package:bluecherry_client/widgets/misc.dart';
25-
import 'package:flutter/foundation.dart';
2625
import 'package:flutter/material.dart';
2726
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
2827
import 'package:flutter_localized_locales/flutter_localized_locales.dart';
@@ -39,7 +38,8 @@ class ApplicationSettings extends StatelessWidget {
3938
final settings = context.watch<SettingsProvider>();
4039
return ListView(padding: DesktopSettings.verticalPadding, children: [
4140
OptionsChooserTile<ThemeMode>(
42-
title: 'Theme',
41+
title: loc.theme,
42+
description: loc.themeDescription,
4343
icon: Icons.contrast,
4444
value: settings.kThemeMode.value,
4545
values: ThemeMode.values.map((mode) {
@@ -51,7 +51,11 @@ class ApplicationSettings extends StatelessWidget {
5151
ThemeMode.dark => Icons.dark_mode,
5252
},
5353
text: switch (mode) {
54-
ThemeMode.system => loc.system,
54+
ThemeMode.system => loc.system +
55+
switch (MediaQuery.platformBrightnessOf(context)) {
56+
Brightness.light => ' (${loc.light})',
57+
Brightness.dark => ' (${loc.dark})',
58+
},
5559
ThemeMode.light => loc.light,
5660
ThemeMode.dark => loc.dark,
5761
},
@@ -64,7 +68,7 @@ class ApplicationSettings extends StatelessWidget {
6468
const LanguageSection(),
6569
const DateFormatSection(),
6670
const TimeFormatSection(),
67-
if (kDebugMode) ...[
71+
if (settings.kShowDebugInfo.value) ...[
6872
const SubHeader('Window'),
6973
CheckboxListTile.adaptive(
7074
value: settings.kLaunchAppOnStartup.value,
@@ -228,6 +232,7 @@ class DateFormatSection extends StatelessWidget {
228232

229233
@override
230234
Widget build(BuildContext context) {
235+
final loc = AppLocalizations.of(context);
231236
final settings = context.watch<SettingsProvider>();
232237
final locale = Localizations.localeOf(context).toLanguageTag();
233238
final formats = [
@@ -242,7 +247,7 @@ class DateFormatSection extends StatelessWidget {
242247
].map((e) => DateFormat(e, locale));
243248

244249
return OptionsChooserTile(
245-
title: 'Date Format',
250+
title: loc.dateFormat,
246251
description: 'What format to use for displaying dates',
247252
icon: Icons.calendar_month,
248253
value: '',
@@ -264,13 +269,14 @@ class TimeFormatSection extends StatelessWidget {
264269

265270
@override
266271
Widget build(BuildContext context) {
272+
final loc = AppLocalizations.of(context);
267273
final settings = context.watch<SettingsProvider>();
268274
final locale = Localizations.localeOf(context).toLanguageTag();
269275

270276
final patterns = ['HH:mm', 'hh:mm a'].map((e) => DateFormat(e, locale));
271277
final date = DateTime.utc(1969, 7, 20, 14, 18, 04);
272278
return OptionsChooserTile(
273-
title: 'Time Format',
279+
title: loc.timeFormat,
274280
description: 'What format to use for displaying time',
275281
icon: Icons.hourglass_empty,
276282
value: '',

lib/screens/settings/events_and_downloads.dart

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import 'package:bluecherry_client/screens/settings/settings_desktop.dart';
2424
import 'package:bluecherry_client/screens/settings/shared/options_chooser_tile.dart';
2525
import 'package:bluecherry_client/widgets/misc.dart';
2626
import 'package:file_picker/file_picker.dart';
27-
import 'package:flutter/foundation.dart';
2827
import 'package:flutter/material.dart';
2928
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
3029
import 'package:provider/provider.dart';
@@ -39,22 +38,26 @@ class EventsAndDownloadsSettings extends StatelessWidget {
3938
final settings = context.watch<SettingsProvider>();
4039
return ListView(children: [
4140
SubHeader(loc.downloads),
42-
if (kDebugMode)
43-
CheckboxListTile.adaptive(
44-
value: settings.kChooseLocationEveryTime.value,
45-
onChanged: (v) {
46-
if (v != null) {
47-
settings.kChooseLocationEveryTime.value = v;
48-
}
49-
},
50-
contentPadding: DesktopSettings.horizontalPadding,
51-
secondary: CircleAvatar(
52-
backgroundColor: Colors.transparent,
53-
foregroundColor: theme.iconTheme.color,
54-
child: const Icon(Icons.create_new_folder),
55-
),
56-
title: const Text('Choose location for each download'),
41+
CheckboxListTile.adaptive(
42+
value: settings.kChooseLocationEveryTime.value,
43+
onChanged: (v) {
44+
if (v != null) {
45+
settings.kChooseLocationEveryTime.value = v;
46+
}
47+
},
48+
contentPadding: DesktopSettings.horizontalPadding,
49+
secondary: CircleAvatar(
50+
backgroundColor: Colors.transparent,
51+
foregroundColor: theme.iconTheme.color,
52+
child: const Icon(Icons.create_new_folder),
53+
),
54+
title: const Text('Choose location for each download'),
55+
subtitle: const Text(
56+
'Whether to choose the location for each download or use the default '
57+
'location. When enabled, you will be prompted to choose the download '
58+
'directory for each download.',
5759
),
60+
),
5861
ListTile(
5962
contentPadding: DesktopSettings.horizontalPadding,
6063
leading: CircleAvatar(
@@ -78,7 +81,7 @@ class EventsAndDownloadsSettings extends StatelessWidget {
7881
}
7982
},
8083
),
81-
if (kDebugMode)
84+
if (settings.kShowDebugInfo.value)
8285
CheckboxListTile.adaptive(
8386
value: false,
8487
onChanged: (v) {},
@@ -91,9 +94,8 @@ class EventsAndDownloadsSettings extends StatelessWidget {
9194
title: const Text(
9295
'Block the app from closing when there are ongoing downloads'),
9396
),
94-
const SizedBox(height: 20.0),
9597
const SubHeader('Events'),
96-
if (kDebugMode)
98+
if (settings.kShowDebugInfo.value)
9799
CheckboxListTile.adaptive(
98100
value: settings.kPictureInPicture.value,
99101
onChanged: (v) {
@@ -156,7 +158,7 @@ class EventsAndDownloadsSettings extends StatelessWidget {
156158
),
157159
),
158160
const SizedBox(height: 20.0),
159-
if (kDebugMode) ...[
161+
if (settings.kShowDebugInfo.value) ...[
160162
const SubHeader('Timeline of Events'),
161163
CheckboxListTile.adaptive(
162164
value: settings.kShowDifferentColorsForEvents.value,

lib/screens/settings/general.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import 'package:bluecherry_client/screens/settings/settings_desktop.dart';
2222
import 'package:bluecherry_client/screens/settings/shared/options_chooser_tile.dart';
2323
import 'package:bluecherry_client/utils/extensions.dart';
2424
import 'package:bluecherry_client/widgets/misc.dart';
25-
import 'package:flutter/foundation.dart';
2625
import 'package:flutter/material.dart';
2726
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
2827
import 'package:provider/provider.dart';
@@ -150,7 +149,7 @@ class GeneralSettings extends StatelessWidget {
150149
settings.kNotificationClickBehavior.value = v;
151150
},
152151
),
153-
if (kDebugMode) ...[
152+
if (settings.kShowDebugInfo.value) ...[
154153
const SubHeader(
155154
'Data Usage',
156155
padding: DesktopSettings.horizontalPadding,

lib/screens/settings/privacy_and_security.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import 'package:bluecherry_client/providers/settings_provider.dart';
2121
import 'package:bluecherry_client/screens/settings/settings_desktop.dart';
2222
import 'package:bluecherry_client/screens/settings/shared/options_chooser_tile.dart';
2323
import 'package:bluecherry_client/utils/extensions.dart';
24-
import 'package:flutter/foundation.dart';
2524
import 'package:flutter/material.dart';
2625
import 'package:provider/provider.dart';
2726

@@ -70,7 +69,7 @@ class PrivacySecuritySettings extends StatelessWidget {
7069
settings.kAllowCrashReports.value = v;
7170
},
7271
),
73-
if (kDebugMode) ...[
72+
if (settings.kShowDebugInfo.value) ...[
7473
const Divider(),
7574
ListTile(
7675
contentPadding: DesktopSettings.horizontalPadding,

lib/screens/settings/server_and_devices.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class StreamingSettings extends StatelessWidget {
124124
settings.kVideoFit.value = v;
125125
},
126126
),
127-
if (kDebugMode) ...[
127+
if (settings.kShowDebugInfo.value) ...[
128128
const SizedBox(height: 8.0),
129129
OptionsChooserTile(
130130
title: 'Refresh Period',
@@ -213,7 +213,7 @@ class StreamingSettings extends StatelessWidget {
213213
},
214214
),
215215
const SizedBox(height: 8.0),
216-
if (kDebugMode) ...[
216+
if (settings.kShowDebugInfo.value) ...[
217217
CheckboxListTile.adaptive(
218218
secondary: CircleAvatar(
219219
backgroundColor: Colors.transparent,

macos/Flutter/ephemeral/Flutter-Generated.xcconfig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ FLUTTER_ROOT=C:\Users\bruno\Documents\flutter\flutter
33
FLUTTER_APPLICATION_PATH=C:\Users\bruno\Documents\flutter\paid_projects\unity
44
COCOAPODS_PARALLEL_CODE_SIGN=true
55
FLUTTER_BUILD_DIR=build
6-
FLUTTER_BUILD_NAME=3.0.014
7-
FLUTTER_BUILD_NUMBER=3.0.014
6+
FLUTTER_BUILD_NAME=3.0.015
7+
FLUTTER_BUILD_NUMBER=3.0.015
88
DART_OBFUSCATION=false
99
TRACK_WIDGET_CREATION=true
1010
TREE_SHAKE_ICONS=false

macos/Flutter/ephemeral/flutter_export_environment.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ export "FLUTTER_ROOT=C:\Users\bruno\Documents\flutter\flutter"
44
export "FLUTTER_APPLICATION_PATH=C:\Users\bruno\Documents\flutter\paid_projects\unity"
55
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
66
export "FLUTTER_BUILD_DIR=build"
7-
export "FLUTTER_BUILD_NAME=3.0.014"
8-
export "FLUTTER_BUILD_NUMBER=3.0.014"
7+
export "FLUTTER_BUILD_NAME=3.0.015"
8+
export "FLUTTER_BUILD_NUMBER=3.0.015"
99
export "DART_OBFUSCATION=false"
1010
export "TRACK_WIDGET_CREATION=true"
1111
export "TREE_SHAKE_ICONS=false"

0 commit comments

Comments
 (0)