Commit d12c9d90 authored by m-spi's avatar m-spi

Avant que le merge ne casse tout...

parents 638273e1 888706d5
tp1/assets/images/1.jpg

1.34 MB | W: | H:

tp1/assets/images/1.jpg

72.1 KB | W: | H:

tp1/assets/images/1.jpg
tp1/assets/images/1.jpg
tp1/assets/images/1.jpg
tp1/assets/images/1.jpg
  • 2-up
  • Swipe
  • Onion skin
tp1/assets/images/2.jpg

937 KB | W: | H:

tp1/assets/images/2.jpg

45.1 KB | W: | H:

tp1/assets/images/2.jpg
tp1/assets/images/2.jpg
tp1/assets/images/2.jpg
tp1/assets/images/2.jpg
  • 2-up
  • Swipe
  • Onion skin
......@@ -7,14 +7,13 @@ import 'package:english_words/english_words.dart';
const String filePath = '../assets/data.json';
class TindBookState extends ChangeNotifier {
var input;
String input = "";
var data;
var favorites = <int>[];
List<int> favorites = <int>[];
void loadData() async {
this.input = await rootBundle.loadString(filePath);
this.data = jsonDecode(input)['books'];
print(this.data);
notifyListeners();
}
......
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'dart:math';
import 'favorite_page.dart';
import 'app_state.dart';
void main() => runApp(const TindBook());
......@@ -20,11 +20,11 @@ class TindBook extends StatelessWidget {
child: MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
primaryColor: Color.fromRGBO(204, 213, 174, 1),
primaryColor: Color.fromRGBO(212, 163, 115, 1),
backgroundColor: Color.fromRGBO(233, 237, 201, 1),
scaffoldBackgroundColor: Color.fromRGBO(254, 250, 224, 1),
appBarTheme: AppBarTheme(
backgroundColor: Color.fromRGBO(204, 213, 174, 1), // Set app bar color
backgroundColor: Color.fromRGBO(212, 163, 115, 1), // Set app bar color
),
navigationRailTheme: NavigationRailThemeData(
backgroundColor: Color.fromRGBO(212, 163, 115, 1), // Set navigation rail color
......@@ -32,7 +32,14 @@ class TindBook extends StatelessWidget {
),
title: 'Tind Book',
home: Scaffold(
appBar: AppBar(title: const Text('Draggable Sample')),
appBar: AppBar(title: Text(
'Tind Book',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
letterSpacing: 1.5,
),
),),
body: const MyHomePage(),
),
),
......@@ -69,50 +76,60 @@ class _MyHomePageState extends State<MyHomePage> {
}
return LayoutBuilder(
builder: (context, constraints) {
return Scaffold(
body: Row(
children: [
SafeArea(
child: NavigationRail(
extended: constraints.maxWidth >= 600,
destinations: [
NavigationRailDestination(
icon: Icon(Icons.home),
label: Text('Home'),
),
NavigationRailDestination(
icon: Icon(Icons.swipe),
label: Text('Swipe'),
),
NavigationRailDestination(
icon: Icon(Icons.info),
label: Text('About'),
),
],
selectedIndex: selectedIndex,
onDestinationSelected: (value) {
print('selected: $value');
setState(() {
selectedIndex = value;
});
},
builder: (context, constraints) => Scaffold(
body: Row(children: [
SafeArea(child: NavigationRail(
extended: constraints.maxWidth >= 600,
destinations: [
NavigationRailDestination(
icon: Icon(Icons.home),
label: Text(
'Home',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
VerticalDivider(
thickness: 1,
width: 1,
), // Add a vertical divider
Expanded(
child: Container(
color: Color.fromRGBO(250, 237, 205, 1),
child: page,
NavigationRailDestination(
icon: Icon(Icons.swipe),
label: Text(
'Swipe',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
NavigationRailDestination(
icon: Icon(Icons.info),
label: Text(
'About',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
],
),
);
},
selectedIndex: selectedIndex,
onDestinationSelected: (value) {
print('selected: $value');
setState(() {
selectedIndex = value;
});
},
),),
VerticalDivider(
thickness: 1,
width: 1,
), // Add a vertical divider
Expanded(child: Container(
color: Color.fromRGBO(250, 237, 205, 1),
child: page,
)),
],),
)
);
}
}
......@@ -150,6 +167,7 @@ class _TindBookContentState extends State<TindBookContent> {
// Swipe right
if (currentImageIndex < state.data.length - 1) {
currentImageIndex++;
state.addIndexToFav(currentImageIndex);
}
} else {
// Swipe left
......@@ -174,15 +192,19 @@ class _TindBookContentState extends State<TindBookContent> {
onHorizontalDragEnd: (details) {
if (_isSwiping) {
_isSwiping = false;
print(_deltaX.toString());
print(currentImageIndex.toString());
print(state.data[currentImageIndex]['image']);
if (_deltaX > 50) {
// Swipe right
handleSwipe(1);
showDialog(
context: context,
builder: (_) => SwipeFeedback(isSwipeRight: true),
);
} else if (_deltaX < -50) {
// Swipe left
handleSwipe(-1);
showDialog(
context: context,
builder: (_) => SwipeFeedback(isSwipeRight: false),
);
}
}
_startX = 0.0;
......@@ -191,24 +213,22 @@ class _TindBookContentState extends State<TindBookContent> {
},
child: Stack(
children: [
Positioned.fill(
child: Container(
color: Color.fromRGBO(250, 237, 205, 1),
height: containerHeight / 3,
width: containerWidth / 3,
),
),
Positioned.fill(child: Container(
color: Color.fromRGBO(250, 237, 205, 1),
height: containerHeight / 3,
width: containerWidth / 3,
)),
Positioned(
top: 0,
left: 0,
right: 0,
bottom: 0,
top: 20,
left: 20,
right: 20,
bottom: 20,
child: Transform.translate(
offset: Offset(_deltaX, 0.0),
child: Transform.rotate(
angle: _deltaX * 0.0002, // Adjust the rotation speed here
child: ClipRRect(
borderRadius: BorderRadius.circular(100), // Adjust the radius as needed
borderRadius: BorderRadius.circular(120), // Adjust the radius as needed
child: Image.asset(
state.data[currentImageIndex]['image'],
height: containerHeight / 3, // Adjust image height
......@@ -228,6 +248,11 @@ class _TindBookContentState extends State<TindBookContent> {
decoration: BoxDecoration(
color: Colors.black.withOpacity(0.5),
borderRadius: BorderRadius.circular(10),
boxShadow: [BoxShadow(
color: Colors.black.withOpacity(0.2),
blurRadius: 10,
offset: Offset(0, 4),
)],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
......@@ -241,11 +266,18 @@ class _TindBookContentState extends State<TindBookContent> {
),
),
SizedBox(height: 5),
Text(
'un tres bon livre qui parle de beaucoup chose , notamment mais aussi de lorem ipsum dolor sit amet a m Doctrine est pas de ',
style: TextStyle(
Container(
decoration: BoxDecoration(
color: Colors.white,
fontSize: 16,
borderRadius: BorderRadius.circular(8),
),
padding: EdgeInsets.all(8),
child: Text(
'un tres bon livre qui parle de beaucoup chose , notamment mais aussi de lorem ipsum dolor sit amet a m Doctrine est pas de ',
style: TextStyle(
color: Colors.black,
fontSize: 16,
),
),
),
],
......@@ -259,3 +291,129 @@ class _TindBookContentState extends State<TindBookContent> {
);
}
}
class SwipeFeedback extends StatefulWidget {
final bool isSwipeRight;
const SwipeFeedback({Key? key, required this.isSwipeRight}) : super(key: key);
@override
_SwipeFeedbackState createState() => _SwipeFeedbackState();
}
class _SwipeFeedbackState extends State<SwipeFeedback> with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
late Timer _timer;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: Duration(milliseconds: 200),
);
_animation = Tween<double>(
begin: 0.0,
end: 1.0,
).animate(_controller);
_controller.forward();
_controller.addStatusListener((status) {
if (status == AnimationStatus.completed) {
_timer = Timer(Duration(milliseconds: 200), () {
Navigator.of(context).pop(); // Dismiss the dialog after 500 milliseconds
});
} else if (status == AnimationStatus.dismissed) {
_controller.dispose();
}
});
}
@override
Widget build(BuildContext context) {
return Center(
child: AnimatedBuilder(
animation: _animation,
builder: (context, child) {
return Opacity(
opacity: 1.0 - _animation.value,
child: Transform.scale(
scale: 1.0 + _animation.value * 0.5,
child: Icon(
widget.isSwipeRight ? Icons.favorite : Icons.close,
color: widget.isSwipeRight ? Colors.green : Colors.red,
size: 400.0,
),
),
);
},
),
);
}
@override
void dispose() {
_controller.dispose();
_timer.cancel(); // Cancel the timer when disposing the widget
super.dispose();
}
}
class FavoritePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
TindBookState state = Provider.of<TindBookState>(context);
return Scaffold(
appBar: AppBar(
title: Text('Favorite Books'),
),
body: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 0.7,
),
itemCount: state.favorites.length,
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ImageScreen(imagePath: state.getFav(index)['image']),
),
);
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset(
state.getFav(index)['image'],
fit: BoxFit.cover,
),
),
);
},
),
);
}
}
class ImageScreen extends StatelessWidget {
final String imagePath;
const ImageScreen({Key? key, required this.imagePath}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: Image.asset(imagePath),
),
);
}
}
......@@ -26,4 +26,6 @@ flutter:
assets:
- assets/images/1.jpg
- assets/images/2.jpg
- assets/images/3.jpg
- assets/images/4.jpg
- assets/images/passeur.png
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment