Skip to content

Commit 882717e

Browse files
committed
Rework the drawer
- Cache widgets with Riverpod - Fix apps not launched when in release mode. Apparently Flutter copies the environment variables when the engine is started, in release mode. Now, environment variables like WAYLAND_DISPLAY are set before starting the Flutter engine. - Fix an exception with the newest version of Riverpod.
1 parent 6e437f4 commit 882717e

File tree

12 files changed

+123
-112
lines changed

12 files changed

+123
-112
lines changed

lib/state/app_drawer_state.dart

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import 'dart:io';
22

3-
import 'package:flutter/material.dart';
3+
import 'package:flutter/widgets.dart';
44
import 'package:flutter_riverpod/flutter_riverpod.dart';
55
import 'package:freedesktop_desktop_entry/freedesktop_desktop_entry.dart';
6-
import 'package:freedesktop_desktop_entry/freedesktop_desktop_entry.dart' as freedesktop;
76
import 'package:freezed_annotation/freezed_annotation.dart';
87
import 'package:jovial_svg/jovial_svg.dart';
98
import 'package:riverpod_annotation/riverpod_annotation.dart';
10-
import 'package:zenith/system_ui/task_switcher/app_drawer/app_drawer.dart';
9+
import 'package:zenith/system_ui/app_drawer/app_drawer.dart';
1110

1211
part 'app_drawer_state.freezed.dart';
1312

@@ -21,6 +20,9 @@ final appDrawerStateProvider = StateProvider(
2120
/// The user is actively dragging the drawer.
2221
dragging: false,
2322

23+
/// You can interact with the drawer and taps won't just go though it.
24+
interactable: false,
25+
2426
/// The finger velocity when the drag ends.
2527
dragVelocity: 0,
2628

@@ -34,9 +36,6 @@ final appDrawerStateProvider = StateProvider(
3436
/// The actual drawer widget that is inserted into the Overlay.
3537
overlayEntry: OverlayEntry(builder: (_) => const AppDrawer()),
3638

37-
/// There is no way to query if the OverlayEntry is inserted into the overlay, so we do it ourselves.
38-
overlayEntryInserted: false,
39-
4039
/// Event to notify the drawer to initiate the closing animations.
4140
/// Just assigning a new Object() will do the trick because 2 different Object instances will always be unequal.
4241
closePanel: Object(),
@@ -48,11 +47,11 @@ class AppDrawerState with _$AppDrawerState {
4847
const factory AppDrawerState({
4948
required bool draggable,
5049
required bool dragging,
50+
required bool interactable,
5151
required double dragVelocity,
5252
required double offset,
5353
required double slideDistance,
5454
required OverlayEntry overlayEntry,
55-
required bool overlayEntryInserted,
5655
required Object closePanel,
5756
}) = _AppDrawerState;
5857
}
@@ -69,8 +68,8 @@ Future<List<LocalizedDesktopEntry>> desktopEntries(DesktopEntriesRef ref) {
6968
}
7069

7170
@Riverpod(keepAlive: true)
72-
Future<freedesktop.IconTheme> defaultIconTheme(DefaultIconThemeRef ref) {
73-
return freedesktop.IconTheme.load('breeze-dark');
71+
Future<FreedesktopIconTheme> defaultIconTheme(DefaultIconThemeRef ref) {
72+
return FreedesktopIconTheme.load('Adwaita');
7473
}
7574

7675
Stream<File> _getAllDesktopEntryFiles() async* {

lib/state/app_drawer_state.freezed.dart

Lines changed: 23 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/state/app_drawer_state.g.dart

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/system_ui/task_switcher/app_drawer/app_drawer.dart renamed to lib/system_ui/app_drawer/app_drawer.dart

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import 'package:flutter/gestures.dart';
22
import 'package:flutter/material.dart';
33
import 'package:flutter_riverpod/flutter_riverpod.dart';
4-
import 'package:tuple/tuple.dart';
54
import 'package:zenith/state/app_drawer_state.dart';
6-
import 'package:zenith/system_ui/task_switcher/app_drawer/app_grid.dart';
5+
import 'package:zenith/system_ui/app_drawer/app_grid.dart';
76

87
class AppDrawer extends ConsumerStatefulWidget {
98
const AppDrawer({super.key});
@@ -47,13 +46,13 @@ class _AppDrawerState extends ConsumerState<AppDrawer> with SingleTickerProvider
4746
}
4847
});
4948

50-
ref.listenManual(appDrawerStateProvider.select((value) => Tuple2(value.dragging, value.offset)),
51-
(previous, Tuple2<bool, double> next) {
52-
final appDrawerState = ref.read(appDrawerStateProvider);
53-
if (!next.item1 && next.item2 == appDrawerState.slideDistance) {
54-
appDrawerState.overlayEntry.remove();
55-
}
56-
});
49+
// ref.listenManual(appDrawerStateProvider.select((value) => Tuple2(value.dragging, value.offset)),
50+
// (previous, Tuple2<bool, double> next) {
51+
// final appDrawerState = ref.read(appDrawerStateProvider);
52+
// if (!next.item1 && next.item2 == appDrawerState.slideDistance) {
53+
// appDrawerState.overlayEntry.remove();
54+
// }
55+
// });
5756

5857
ref.listenManual(appDrawerStateProvider.select((value) => value.closePanel), (_, __) {
5958
animateClosing(1);
@@ -66,11 +65,13 @@ class _AppDrawerState extends ConsumerState<AppDrawer> with SingleTickerProvider
6665
}
6766

6867
void animateOpening(double velocity) {
68+
ref.read(appDrawerStateProvider.notifier).update((state) => state.copyWith(interactable: true));
6969
cancelAnimations();
7070
animateTo(0, velocity);
7171
}
7272

7373
void animateClosing(double velocity) {
74+
ref.read(appDrawerStateProvider.notifier).update((state) => state.copyWith(interactable: false));
7475
cancelAnimations();
7576
animateTo(ref.read(appDrawerStateProvider).slideDistance, velocity);
7677
}
@@ -100,12 +101,16 @@ class _AppDrawerState extends ConsumerState<AppDrawer> with SingleTickerProvider
100101
Widget build(BuildContext context) {
101102
return Consumer(
102103
builder: (_, WidgetRef ref, Widget? child) {
104+
bool interactable = ref.watch(appDrawerStateProvider.select((value) => value.interactable));
103105
double offset = ref.watch(appDrawerStateProvider.select((value) => value.offset));
104106
double slideDistance = ref.watch(appDrawerStateProvider.select((value) => value.slideDistance));
105107

106-
return Opacity(
107-
opacity: 1 - offset / slideDistance,
108-
child: child,
108+
return IgnorePointer(
109+
ignoring: !interactable,
110+
child: Opacity(
111+
opacity: 1 - offset / slideDistance,
112+
child: child,
113+
),
109114
);
110115
},
111116
child: Consumer(
@@ -119,16 +124,11 @@ class _AppDrawerState extends ConsumerState<AppDrawer> with SingleTickerProvider
119124
onPointerDown: (e) {
120125
_velocityTracker = VelocityTracker.withKind(PointerDeviceKind.touch);
121126
_velocityTracker.addPosition(e.timeStamp, e.localPosition);
122-
print('huh dd');
123127
},
124128
onPointerMove: (e) {
125129
final appDrawerState = ref.read(appDrawerStateProvider);
126130

127-
print('huh');
128-
129131
if (appDrawerState.draggable) {
130-
print('move');
131-
132132
ref.read(appDrawerStateProvider.notifier).update((state) => state.copyWith(
133133
dragging: true,
134134
offset: (state.offset + e.delta.dy).clamp(0, appDrawerState.slideDistance),
@@ -137,8 +137,6 @@ class _AppDrawerState extends ConsumerState<AppDrawer> with SingleTickerProvider
137137
}
138138
},
139139
onPointerUp: (e) {
140-
print('huh up');
141-
142140
_velocityTracker.addPosition(e.timeStamp, e.localPosition);
143141

144142
final doesntScroll =
@@ -156,7 +154,6 @@ class _AppDrawerState extends ConsumerState<AppDrawer> with SingleTickerProvider
156154
color: Colors.black.withOpacity(0.8),
157155
child: Column(
158156
children: [
159-
const TextField(),
160157
Expanded(
161158
child: AppDrawerScrollNotificationListener(
162159
child: AppGrid(scrollController: _scrollController),

0 commit comments

Comments
 (0)