viewer: stabilized widget tree for top overlay when switching from single to multi entry
This commit is contained in:
parent
2c5451776a
commit
7e11a397c6
2 changed files with 63 additions and 86 deletions
|
@ -3,7 +3,6 @@ import 'package:aves/model/settings/settings.dart';
|
||||||
import 'package:aves/theme/themes.dart';
|
import 'package:aves/theme/themes.dart';
|
||||||
import 'package:aves/widgets/common/fx/blurred.dart';
|
import 'package:aves/widgets/common/fx/blurred.dart';
|
||||||
import 'package:aves/widgets/viewer/multipage/conductor.dart';
|
import 'package:aves/widgets/viewer/multipage/conductor.dart';
|
||||||
import 'package:aves/widgets/viewer/multipage/controller.dart';
|
|
||||||
import 'package:aves/widgets/viewer/overlay/details.dart';
|
import 'package:aves/widgets/viewer/overlay/details.dart';
|
||||||
import 'package:aves/widgets/viewer/overlay/minimap.dart';
|
import 'package:aves/widgets/viewer/overlay/minimap.dart';
|
||||||
import 'package:aves/widgets/viewer/page_entry_builder.dart';
|
import 'package:aves/widgets/viewer/page_entry_builder.dart';
|
||||||
|
@ -32,84 +31,64 @@ class ViewerTopOverlay extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
late Widget child;
|
final multiPageController = mainEntry.isMultiPage ? context.read<MultiPageConductor>().getController(mainEntry) : null;
|
||||||
|
return PageEntryBuilder(
|
||||||
|
multiPageController: multiPageController,
|
||||||
|
builder: (pageEntry) {
|
||||||
|
pageEntry ??= mainEntry;
|
||||||
|
|
||||||
if (mainEntry.isMultiPage) {
|
final showInfo = settings.showOverlayInfo;
|
||||||
final multiPageController = context.read<MultiPageConductor>().getController(mainEntry);
|
|
||||||
child = PageEntryBuilder(
|
|
||||||
multiPageController: multiPageController,
|
|
||||||
builder: (pageEntry) => _buildOverlay(
|
|
||||||
context,
|
|
||||||
mainEntry,
|
|
||||||
pageEntry: pageEntry,
|
|
||||||
multiPageController: multiPageController,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
child = _buildOverlay(context, mainEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
return child;
|
final viewStateConductor = context.read<ViewStateConductor>();
|
||||||
}
|
final viewStateNotifier = viewStateConductor.getOrCreateController(pageEntry);
|
||||||
|
|
||||||
Widget _buildOverlay(
|
final blurred = settings.enableOverlayBlurEffect;
|
||||||
BuildContext context,
|
final viewInsetsPadding = (viewInsets ?? EdgeInsets.zero) + (viewPadding ?? EdgeInsets.zero);
|
||||||
AvesEntry mainEntry, {
|
return Column(
|
||||||
AvesEntry? pageEntry,
|
mainAxisSize: MainAxisSize.min,
|
||||||
MultiPageController? multiPageController,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
}) {
|
children: [
|
||||||
pageEntry ??= mainEntry;
|
if (showInfo)
|
||||||
|
BlurredRect(
|
||||||
final showInfo = settings.showOverlayInfo;
|
enabled: blurred,
|
||||||
|
child: Container(
|
||||||
final viewStateConductor = context.read<ViewStateConductor>();
|
color: Themes.overlayBackgroundColor(brightness: Theme.of(context).brightness, blurred: blurred),
|
||||||
final viewStateNotifier = viewStateConductor.getOrCreateController(pageEntry);
|
child: SafeArea(
|
||||||
|
bottom: false,
|
||||||
final blurred = settings.enableOverlayBlurEffect;
|
minimum: EdgeInsets.only(
|
||||||
final viewInsetsPadding = (viewInsets ?? EdgeInsets.zero) + (viewPadding ?? EdgeInsets.zero);
|
left: viewInsetsPadding.left,
|
||||||
return Column(
|
top: viewInsetsPadding.top,
|
||||||
mainAxisSize: MainAxisSize.min,
|
right: viewInsetsPadding.right,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
),
|
||||||
children: [
|
child: ViewerDetailOverlay(
|
||||||
if (showInfo)
|
index: index,
|
||||||
BlurredRect(
|
entries: entries,
|
||||||
enabled: blurred,
|
hasCollection: hasCollection,
|
||||||
child: Container(
|
multiPageController: multiPageController,
|
||||||
color: Themes.overlayBackgroundColor(brightness: Theme.of(context).brightness, blurred: blurred),
|
),
|
||||||
child: SafeArea(
|
),
|
||||||
bottom: false,
|
),
|
||||||
|
),
|
||||||
|
if (settings.showOverlayMinimap)
|
||||||
|
SafeArea(
|
||||||
|
top: !showInfo,
|
||||||
minimum: EdgeInsets.only(
|
minimum: EdgeInsets.only(
|
||||||
left: viewInsetsPadding.left,
|
left: viewInsetsPadding.left,
|
||||||
top: viewInsetsPadding.top,
|
|
||||||
right: viewInsetsPadding.right,
|
right: viewInsetsPadding.right,
|
||||||
),
|
),
|
||||||
child: ViewerDetailOverlay(
|
child: Padding(
|
||||||
index: index,
|
padding: const EdgeInsets.all(8),
|
||||||
entries: entries,
|
child: FadeTransition(
|
||||||
hasCollection: hasCollection,
|
opacity: scale,
|
||||||
multiPageController: multiPageController,
|
child: Minimap(
|
||||||
|
viewStateNotifier: viewStateNotifier,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
)
|
||||||
),
|
],
|
||||||
),
|
);
|
||||||
if (settings.showOverlayMinimap)
|
},
|
||||||
SafeArea(
|
|
||||||
top: !showInfo,
|
|
||||||
minimum: EdgeInsets.only(
|
|
||||||
left: viewInsetsPadding.left,
|
|
||||||
right: viewInsetsPadding.right,
|
|
||||||
),
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(8),
|
|
||||||
child: FadeTransition(
|
|
||||||
opacity: scale,
|
|
||||||
child: Minimap(
|
|
||||||
viewStateNotifier: viewStateNotifier,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,20 +16,18 @@ class PageEntryBuilder extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final controller = multiPageController;
|
final controller = multiPageController;
|
||||||
return controller != null
|
return StreamBuilder<MultiPageInfo?>(
|
||||||
? StreamBuilder<MultiPageInfo?>(
|
stream: controller != null ? controller.infoStream : Stream.value(null),
|
||||||
stream: controller.infoStream,
|
builder: (context, snapshot) {
|
||||||
builder: (context, snapshot) {
|
final multiPageInfo = controller?.info;
|
||||||
final multiPageInfo = controller.info;
|
return ValueListenableBuilder<int?>(
|
||||||
return ValueListenableBuilder<int?>(
|
valueListenable: controller?.pageNotifier ?? ValueNotifier(null),
|
||||||
valueListenable: controller.pageNotifier,
|
builder: (context, page, child) {
|
||||||
builder: (context, page, child) {
|
final pageEntry = multiPageInfo?.getPageEntryByIndex(page);
|
||||||
final pageEntry = multiPageInfo?.getPageEntryByIndex(page);
|
return builder(pageEntry);
|
||||||
return builder(pageEntry);
|
},
|
||||||
},
|
);
|
||||||
);
|
},
|
||||||
},
|
);
|
||||||
)
|
|
||||||
: builder(null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue