Merge pull request #381 from pangeachat/stack-overlays

Let multiple overlays coexist
pull/1384/head
ggurdin 1 year ago committed by GitHub
commit 10c8936fdf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -27,7 +27,7 @@ class PangeaLanguage {
static Future<void> initialize() async { static Future<void> initialize() async {
try { try {
_langList = await _getCahedFlags(); _langList = await _getCachedFlags();
if (await _shouldFetch || _langList.isEmpty) { if (await _shouldFetch || _langList.isEmpty) {
_langList = await LanguageRepo.fetchLanguages(); _langList = await LanguageRepo.fetchLanguages();
@ -77,7 +77,7 @@ class PangeaLanguage {
await MyShared.saveJson(PrefKey.flags, flagMap); await MyShared.saveJson(PrefKey.flags, flagMap);
} }
static Future<List<LanguageModel>> _getCahedFlags() async { static Future<List<LanguageModel>> _getCachedFlags() async {
final Map<dynamic, dynamic>? flagsMap = final Map<dynamic, dynamic>? flagsMap =
await MyShared.readJson(PrefKey.flags); await MyShared.readJson(PrefKey.flags);
if (flagsMap == null) { if (flagsMap == null) {

@ -4,7 +4,7 @@ import 'package:sentry_flutter/sentry_flutter.dart';
class PangeaAnyState { class PangeaAnyState {
final Map<String, LayerLinkAndKey> _layerLinkAndKeys = {}; final Map<String, LayerLinkAndKey> _layerLinkAndKeys = {};
OverlayEntry? overlay; List<OverlayEntry> entries = [];
dispose() { dispose() {
closeOverlay(); closeOverlay();
@ -32,26 +32,32 @@ class PangeaAnyState {
_layerLinkAndKeys.remove(transformTargetId); _layerLinkAndKeys.remove(transformTargetId);
} }
void openOverlay(OverlayEntry entry, BuildContext context) { void openOverlay(
closeOverlay(); OverlayEntry entry,
overlay = entry; BuildContext context, {
Overlay.of(context).insert(overlay!); bool closePrevOverlay = true,
}) {
if (closePrevOverlay) {
closeOverlay();
}
entries.add(entry);
Overlay.of(context).insert(entry);
} }
void closeOverlay() { void closeOverlay() {
if (overlay != null) { if (entries.isNotEmpty) {
try { try {
overlay?.remove(); entries.last.remove();
} catch (err, s) { } catch (err, s) {
ErrorHandler.logError( ErrorHandler.logError(
e: err, e: err,
s: s, s: s,
data: { data: {
"overlay": overlay, "overlay": entries.last,
}, },
); );
} }
overlay = null; entries.removeLast();
} }
} }

@ -94,6 +94,7 @@ class InstructionsController {
), ),
cardSize: const Size(300.0, 300.0), cardSize: const Size(300.0, 300.0),
transformTargetId: transformTargetKey, transformTargetId: transformTargetKey,
closePrevOverlay: false,
), ),
); );
} }

@ -25,9 +25,12 @@ class OverlayUtil {
Color? backgroundColor, Color? backgroundColor,
Alignment? targetAnchor, Alignment? targetAnchor,
Alignment? followerAnchor, Alignment? followerAnchor,
bool closePrevOverlay = true,
}) { }) {
try { try {
MatrixState.pAnyState.closeOverlay(); if (closePrevOverlay) {
MatrixState.pAnyState.closeOverlay();
}
final LayerLinkAndKey layerLinkAndKey = final LayerLinkAndKey layerLinkAndKey =
MatrixState.pAnyState.layerLinkAndKey(transformTargetId); MatrixState.pAnyState.layerLinkAndKey(transformTargetId);
@ -58,7 +61,8 @@ class OverlayUtil {
), ),
); );
MatrixState.pAnyState.openOverlay(entry, context); MatrixState.pAnyState
.openOverlay(entry, context, closePrevOverlay: closePrevOverlay);
} catch (err, stack) { } catch (err, stack) {
debugger(when: kDebugMode); debugger(when: kDebugMode);
ErrorHandler.logError(e: err, s: stack); ErrorHandler.logError(e: err, s: stack);
@ -72,6 +76,7 @@ class OverlayUtil {
required String transformTargetId, required String transformTargetId,
backDropToDismiss = true, backDropToDismiss = true,
Color? borderColor, Color? borderColor,
bool closePrevOverlay = true,
}) { }) {
try { try {
final LayerLinkAndKey layerLinkAndKey = final LayerLinkAndKey layerLinkAndKey =
@ -105,6 +110,7 @@ class OverlayUtil {
offset: cardOffset, offset: cardOffset,
backDropToDismiss: backDropToDismiss, backDropToDismiss: backDropToDismiss,
borderColor: borderColor, borderColor: borderColor,
closePrevOverlay: closePrevOverlay,
); );
} catch (err, stack) { } catch (err, stack) {
debugger(when: kDebugMode); debugger(when: kDebugMode);
@ -180,7 +186,7 @@ class OverlayUtil {
return Offset(dx, dy); return Offset(dx, dy);
} }
static bool get isOverlayOpen => MatrixState.pAnyState.overlay != null; static bool get isOverlayOpen => MatrixState.pAnyState.entries.isNotEmpty;
} }
class TransparentBackdrop extends StatelessWidget { class TransparentBackdrop extends StatelessWidget {

@ -136,8 +136,8 @@ class ToolbarDisplayController {
backgroundColor: const Color.fromRGBO(0, 0, 0, 1).withAlpha(100), backgroundColor: const Color.fromRGBO(0, 0, 0, 1).withAlpha(100),
); );
if (MatrixState.pAnyState.overlay != null) { if (MatrixState.pAnyState.entries.isNotEmpty) {
overlayId = MatrixState.pAnyState.overlay.hashCode.toString(); overlayId = MatrixState.pAnyState.entries.last.hashCode.toString();
} }
if (mode != null) { if (mode != null) {
@ -151,8 +151,11 @@ class ToolbarDisplayController {
bool get highlighted { bool get highlighted {
if (overlayId == null) return false; if (overlayId == null) return false;
if (MatrixState.pAnyState.overlay == null) overlayId = null; if (MatrixState.pAnyState.entries.isEmpty) {
return MatrixState.pAnyState.overlay.hashCode.toString() == overlayId; overlayId = null;
return false;
}
return MatrixState.pAnyState.entries.last.hashCode.toString() == overlayId;
} }
} }

Loading…
Cancel
Save