150 lines
5.1 KiB
Dart
150 lines
5.1 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:wonders/common_libs.dart';
|
|
import 'package:wonders/logic/common/platform_info.dart';
|
|
import 'package:wonders/logic/common/string_utils.dart';
|
|
import 'package:wonders/logic/data/wonder_data.dart';
|
|
import 'package:wonders/ui/common/app_backdrop.dart';
|
|
import 'package:wonders/ui/common/app_icons.dart';
|
|
import 'package:wonders/ui/common/centered_box.dart';
|
|
import 'package:wonders/ui/common/controls/app_header.dart';
|
|
import 'package:wonders/ui/common/curved_clippers.dart';
|
|
import 'package:wonders/ui/common/hidden_collectible.dart';
|
|
import 'package:wonders/ui/common/list_gradient.dart';
|
|
import 'package:wonders/ui/common/themed_text.dart';
|
|
import 'package:wonders/ui/common/timeline_event_card.dart';
|
|
import 'package:wonders/ui/common/wonders_timeline_builder.dart';
|
|
import 'package:wonders/ui/wonder_illustrations/common/wonder_title_text.dart';
|
|
|
|
part 'widgets/_events_list.dart';
|
|
part 'widgets/_timeline_btn.dart';
|
|
part 'widgets/_wonder_image_with_timeline.dart';
|
|
|
|
//TODO: Maintain scroll position when switching from portrait to landscape
|
|
class WonderEvents extends StatelessWidget {
|
|
WonderEvents({Key? key, required this.type}) : super(key: key);
|
|
final WonderType type;
|
|
late final _data = wondersLogic.getData(type);
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
void handleTimelineBtnPressed() => context.push(ScreenPaths.timeline(type));
|
|
// Main view content switches between 1 and 2 column layouts
|
|
// On mobile, use the 2 column layout on screens close to landscape (>.85). This is primarily an optimization for foldable devices square-ish dimensions when opened.
|
|
final twoColumnAspect = PlatformInfo.isMobile ? .85 : 1;
|
|
bool useTwoColumnLayout = context.mq.size.aspectRatio > twoColumnAspect;
|
|
|
|
return LayoutBuilder(builder: (context, constraints) {
|
|
return Container(
|
|
color: $styles.colors.black,
|
|
child: SafeArea(
|
|
bottom: false,
|
|
child: Stack(
|
|
children: [
|
|
/// Main view
|
|
Positioned.fill(
|
|
top: $styles.insets.sm,
|
|
child: useTwoColumnLayout ? _buildTwoColumn(context) : _buildSingleColumn(),
|
|
),
|
|
|
|
/// Header w/ TimelineBtn
|
|
TopCenter(
|
|
child: AppHeader(
|
|
showBackBtn: false,
|
|
isTransparent: true,
|
|
trailing: (_) => CircleIconBtn(
|
|
icon: AppIcons.timeline,
|
|
onPressed: handleTimelineBtnPressed,
|
|
semanticLabel: $strings.eventsListButtonOpenGlobal),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
});
|
|
}
|
|
|
|
/// Landscape layout is a row, with the WonderImage on left and EventsList on the right
|
|
Widget _buildTwoColumn(BuildContext context) {
|
|
return Row(
|
|
children: [
|
|
/// WonderImage w/ Timeline btn
|
|
Expanded(
|
|
child: CenteredBox(
|
|
width: $styles.sizes.maxContentWidth3,
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Gap($styles.insets.lg),
|
|
Expanded(
|
|
child: Center(
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
_WonderImageWithTimeline(data: _data, height: min(500, context.heightPx - 300)),
|
|
Gap($styles.insets.lg),
|
|
SizedBox(width: 400, child: _TimelineBtn(type: type)),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
Gap($styles.insets.lg),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
|
|
/// EventsList
|
|
Expanded(
|
|
child: CenteredBox(
|
|
width: $styles.sizes.maxContentWidth2,
|
|
child: _EventsList(
|
|
data: _data,
|
|
topHeight: 100,
|
|
blurOnScroll: false,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
/// Portrait layout is a stack with the EventsList scrolling overtop of the WonderImage
|
|
Widget _buildSingleColumn() {
|
|
return LayoutBuilder(builder: (_, constraints) {
|
|
double topHeight = max(constraints.maxHeight * .55, 200);
|
|
return CenteredBox(
|
|
width: $styles.sizes.maxContentWidth2,
|
|
child: Stack(
|
|
children: [
|
|
/// Top content, sits underneath scrolling list
|
|
_WonderImageWithTimeline(height: topHeight, data: _data),
|
|
|
|
/// EventsList + TimelineBtn
|
|
Column(
|
|
children: [
|
|
Expanded(
|
|
/// List
|
|
child: _EventsList(
|
|
data: _data,
|
|
topHeight: topHeight,
|
|
blurOnScroll: true,
|
|
showTopGradient: false,
|
|
),
|
|
),
|
|
Gap($styles.insets.lg),
|
|
|
|
/// Btn
|
|
_TimelineBtn(type: _data.type, width: $styles.sizes.maxContentWidth2),
|
|
Gap($styles.insets.lg),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
);
|
|
});
|
|
}
|
|
}
|