ente/lib/ui/tools/collage/collage_with_two_items.dart

221 lines
5.3 KiB
Dart
Raw Normal View History

import "package:flutter/material.dart";
2023-05-26 12:24:03 +00:00
import "package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart";
2023-08-25 04:39:30 +00:00
import 'package:photos/models/file/file.dart';
2023-05-26 17:28:29 +00:00
import "package:photos/ui/tools/collage/collage_common_widgets.dart";
2023-05-26 13:25:23 +00:00
import 'package:photos/ui/tools/collage/collage_item_icon.dart';
2023-05-26 12:24:03 +00:00
import "package:photos/ui/tools/collage/collage_item_widget.dart";
2023-05-26 17:28:29 +00:00
import "package:photos/ui/tools/collage/collage_save_button.dart";
2023-05-26 12:24:03 +00:00
import "package:widgets_to_image/widgets_to_image.dart";
2023-05-26 13:31:51 +00:00
enum Variant {
first,
second,
}
class CollageWithTwoItems extends StatefulWidget {
const CollageWithTwoItems(
2023-05-26 12:24:03 +00:00
this.first,
2023-05-26 17:28:29 +00:00
this.second, {
2023-05-26 12:24:03 +00:00
super.key,
});
2023-08-24 16:56:24 +00:00
final EnteFile first, second;
2023-05-26 12:24:03 +00:00
@override
2023-05-26 13:31:51 +00:00
State<CollageWithTwoItems> createState() => _CollageWithTwoItemsState();
2023-05-26 12:24:03 +00:00
}
2023-05-26 13:31:51 +00:00
class _CollageWithTwoItemsState extends State<CollageWithTwoItems> {
2023-05-26 17:28:29 +00:00
final _widgetsToImageController = WidgetsToImageController();
2023-05-26 13:31:51 +00:00
Variant _variant = Variant.first;
2023-05-26 12:24:03 +00:00
@override
Widget build(BuildContext context) {
return Column(
2023-05-26 17:28:29 +00:00
crossAxisAlignment: CrossAxisAlignment.center,
2023-05-26 12:24:03 +00:00
children: [
WidgetsToImage(
2023-05-26 17:28:29 +00:00
controller: _widgetsToImageController,
2023-05-26 12:24:03 +00:00
child: _getCollage(),
),
2023-05-26 17:28:29 +00:00
const Expanded(child: SizedBox()),
const CollageLayoutHeading(),
_getLayouts(),
const Padding(padding: EdgeInsets.all(4)),
SaveCollageButton(_widgetsToImageController),
],
);
}
Widget _getLayouts() {
return Row(
children: [
2023-05-26 18:33:32 +00:00
CollageLayoutIconButton(
2023-05-26 19:50:43 +00:00
child: FirstVariantIcon(
2023-05-26 18:33:32 +00:00
isActive: _variant == Variant.first,
2023-05-26 17:28:29 +00:00
),
onTap: () {
setState(() {
_variant = Variant.first;
});
},
),
2023-05-26 18:33:32 +00:00
CollageLayoutIconButton(
2023-05-26 19:50:43 +00:00
child: SecondVariantIcon(
2023-05-26 18:33:32 +00:00
isActive: _variant == Variant.second,
2023-05-26 17:28:29 +00:00
),
onTap: () {
setState(() {
_variant = Variant.second;
});
},
2023-05-26 12:24:03 +00:00
),
],
);
}
Widget _getCollage() {
2023-05-26 13:31:51 +00:00
switch (_variant) {
case Variant.first:
return FirstVariant(
CollageItemWidget(widget.first),
CollageItemWidget(widget.second),
);
case Variant.second:
return SecondVariant(
CollageItemWidget(widget.first),
CollageItemWidget(widget.second),
);
}
2023-05-26 12:24:03 +00:00
}
}
2023-05-26 13:31:51 +00:00
class FirstVariant extends StatelessWidget {
const FirstVariant(
2023-05-26 12:24:03 +00:00
this.first,
this.second, {
super.key,
this.mainAxisSpacing = 4,
this.crossAxisSpacing = 4,
this.color = Colors.white,
2023-05-26 12:24:03 +00:00
});
final Widget first, second;
final double mainAxisSpacing, crossAxisSpacing;
final Color color;
2023-05-26 12:24:03 +00:00
@override
Widget build(BuildContext context) {
return Container(
color: color,
child: Padding(
padding: const EdgeInsets.all(6),
child: StaggeredGrid.count(
crossAxisCount: 2,
mainAxisSpacing: mainAxisSpacing,
crossAxisSpacing: crossAxisSpacing,
axisDirection: AxisDirection.down,
children: [
StaggeredGridTile.count(
crossAxisCellCount: 1,
mainAxisCellCount: 2,
child: first,
),
StaggeredGridTile.count(
crossAxisCellCount: 1,
mainAxisCellCount: 2,
child: second,
),
],
),
2023-05-26 12:24:03 +00:00
),
);
}
}
2023-05-26 13:31:51 +00:00
class SecondVariant extends StatelessWidget {
const SecondVariant(
2023-05-26 12:24:03 +00:00
this.first,
this.second, {
super.key,
this.mainAxisSpacing = 4,
this.crossAxisSpacing = 4,
this.color = Colors.white,
2023-05-26 12:24:03 +00:00
});
final Widget first, second;
final double mainAxisSpacing, crossAxisSpacing;
final Color color;
2023-05-26 12:24:03 +00:00
@override
Widget build(BuildContext context) {
return Container(
color: color,
child: Padding(
padding: const EdgeInsets.all(6),
child: StaggeredGrid.count(
crossAxisCount: 2,
mainAxisSpacing: mainAxisSpacing,
crossAxisSpacing: crossAxisSpacing,
axisDirection: AxisDirection.down,
children: [
StaggeredGridTile.count(
crossAxisCellCount: 2,
mainAxisCellCount: 1,
child: first,
),
StaggeredGridTile.count(
crossAxisCellCount: 2,
mainAxisCellCount: 1,
child: second,
),
],
),
2023-05-26 12:24:03 +00:00
),
);
}
}
2023-05-26 13:31:51 +00:00
class FirstVariantIcon extends StatelessWidget {
const FirstVariantIcon({
2023-05-26 12:24:03 +00:00
super.key,
this.isActive = false,
});
final bool isActive;
@override
Widget build(BuildContext context) {
2023-05-26 13:25:23 +00:00
return CollageIconContainerWidget(
2023-05-26 13:31:51 +00:00
child: FirstVariant(
2023-05-26 13:25:23 +00:00
CollageItemIcon(isActive: isActive),
CollageItemIcon(isActive: isActive),
2023-05-26 12:24:03 +00:00
mainAxisSpacing: 2,
crossAxisSpacing: 2,
color: Colors.transparent,
2023-05-26 12:24:03 +00:00
),
);
}
}
2023-05-26 13:31:51 +00:00
class SecondVariantIcon extends StatelessWidget {
const SecondVariantIcon({
2023-05-26 12:24:03 +00:00
super.key,
this.isActive = false,
});
final bool isActive;
@override
Widget build(BuildContext context) {
2023-05-26 13:25:23 +00:00
return CollageIconContainerWidget(
2023-05-26 13:31:51 +00:00
child: SecondVariant(
2023-05-26 13:25:23 +00:00
CollageItemIcon(isActive: isActive),
CollageItemIcon(isActive: isActive),
2023-05-26 12:24:03 +00:00
mainAxisSpacing: 2,
crossAxisSpacing: 2,
color: Colors.transparent,
2023-05-26 12:24:03 +00:00
),
);
}
}