2023-05-26 20:50:31 +00:00
|
|
|
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,
|
2023-05-26 20:50:31 +00:00
|
|
|
this.color = Colors.white,
|
2023-05-26 12:24:03 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
final Widget first, second;
|
|
|
|
final double mainAxisSpacing, crossAxisSpacing;
|
2023-05-26 20:50:31 +00:00
|
|
|
final Color color;
|
2023-05-26 12:24:03 +00:00
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2023-05-26 20:50:31 +00:00
|
|
|
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,
|
2023-05-26 20:50:31 +00:00
|
|
|
this.color = Colors.white,
|
2023-05-26 12:24:03 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
final Widget first, second;
|
|
|
|
final double mainAxisSpacing, crossAxisSpacing;
|
2023-05-26 20:50:31 +00:00
|
|
|
final Color color;
|
2023-05-26 12:24:03 +00:00
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2023-05-26 20:50:31 +00:00
|
|
|
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,
|
2023-05-26 20:50:31 +00:00
|
|
|
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,
|
2023-05-26 20:50:31 +00:00
|
|
|
color: Colors.transparent,
|
2023-05-26 12:24:03 +00:00
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|