Advertisement
Altair200333

Untitled

Jul 14th, 2019
424
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 9.58 KB | None | 0 0
  1. import 'dart:io';
  2. import 'dart:math';
  3. import 'package:flutter/material.dart';
  4. import 'package:font_awesome_flutter/font_awesome_flutter.dart';
  5. import 'package:memoapp/AppData.dart';
  6. import 'package:memoapp/api/api.dart';
  7. import 'package:memoapp/api/model.dart';
  8. import 'package:memoapp/components/Loading.dart';
  9. import 'package:memoapp/components/TermView.dart';
  10. import 'package:memoapp/components/AudioList.dart';
  11. import 'package:memoapp/components/addContentButton.dart';
  12. import 'package:memoapp/screen/recordaudioscreen.dart';
  13.  
  14. //import 'package:image_picker/image_picker.dart';
  15. import 'package:flutter/material.dart';
  16. import 'package:path/path.dart' show join;
  17. import 'package:path_provider/path_provider.dart';
  18. import 'package:image_picker/image_picker.dart';
  19. import 'package:uuid/uuid.dart';
  20. import 'package:youtube_player/youtube_player.dart';
  21.  
  22.  
  23. typedef SearchCallback = void Function(String searchString);
  24.  
  25. class TermDetail extends StatefulWidget {
  26.   String id;
  27.  
  28.   TermDetail(this.id);
  29.  
  30.   @override
  31.   State<StatefulWidget> createState() {
  32.     return new TermDetailState(id);
  33.   }
  34. }
  35. List<IconData> images = [
  36.   Icons.looks_one,
  37.   Icons.looks_two,
  38.   Icons.looks_3,
  39.   Icons.looks_4,
  40. ];
  41.  
  42. List<String> title = [
  43.   "audio",
  44.   "visual",
  45.   "translated_as",
  46.   "in",
  47.   "related",
  48.   "def",
  49.   "def_of",
  50. ];
  51. class TermDetailState extends State<TermDetail> {
  52.   Widget cp = Container();
  53.   Widget switcher = Container();
  54.   String id;
  55.   TermInfo term;
  56.   int _addStatus = 1;
  57.  
  58.   TermDetailState(this.id);
  59.  
  60.  
  61.   get appState {
  62.     return appData.appState;
  63.   }
  64.  
  65.   @override
  66.   void initState() {
  67.     super.initState();
  68.     fetchData();
  69.  
  70.   }
  71.  
  72.  
  73.  
  74.   fetchData() async {
  75.     var result = await fetchAudioList(id, 0, 10);
  76.     setState(() {
  77.       term = result;
  78.       cp = getAudiosPage();
  79.       switcher = Row(
  80.         children: <Widget>[Text("1 "), Text("2")],
  81.         mainAxisAlignment: MainAxisAlignment.center,
  82.       );
  83.     });
  84.   }
  85.  
  86.   void addContent() {
  87.     if (_addStatus == 0) {
  88.       setState(() {
  89.         _addStatus = 1;
  90.       });
  91.     } else if (_addStatus == 1) {
  92.       setState(() {
  93.         _addStatus = 0;
  94.       });
  95.     }
  96.   }
  97.  
  98.   void openAddAudio() {
  99.     print("audio open!");
  100.     var route = MaterialPageRoute(
  101.         builder: (_) => new RecordAudioScreen(
  102.               term: term,
  103.             ));
  104.     Navigator.pushReplacement(context, route);
  105.   }
  106.  
  107.   Widget getAudiosPage() {
  108.     return term.audio.items.length > 0
  109.         ? new AudioList(term, fetchData)
  110.         : Align(
  111.             child: Container(
  112.               width: 200,
  113.               child: Text(
  114.                 "No audios yet ;)",
  115.                 style: TextStyle(fontSize: 20, color: Colors.blue[800]),
  116.               ),
  117.               alignment: Alignment(0, 0),
  118.               padding: EdgeInsets.only(top: 10, bottom: 10),
  119.               decoration: BoxDecoration(
  120.                   color: Colors.grey[200],
  121.                   borderRadius: BorderRadius.circular(20),
  122.                   boxShadow: <BoxShadow>[BoxShadow(blurRadius: 5)]),
  123.             ),
  124.           );
  125.   }
  126.  
  127.   var currentPage = images.length - 1.0;
  128.  
  129.   @override
  130.   Widget build(BuildContext context) {
  131.     if (term == null) {
  132.       return Loading();
  133.     }
  134.  
  135.     PageController controller = PageController(initialPage: images.length - 1);
  136.     controller.addListener(() {
  137.       setState(() {
  138.         currentPage = controller.page;
  139.       });
  140.     });
  141.  
  142.     var RadialAddButton = Container(
  143.         child: RadialMenu(
  144.       icons: <RadialBtn>[
  145.         RadialBtn(
  146.             angle: 160,
  147.             color: Colors.grey[600],
  148.             icon: FontAwesomeIcons.cameraRetro,
  149.             onTap: () {
  150.               openCamera();
  151.             }),
  152.         RadialBtn(
  153.             angle: 110,
  154.             color: Colors.green,
  155.             icon: FontAwesomeIcons.images,
  156.             onTap: () {
  157.               openGalery();
  158.             }),
  159.         RadialBtn(
  160.             angle: 40,
  161.             color: Colors.orange,
  162.             icon: FontAwesomeIcons.microphoneAlt,
  163.             onTap: () {
  164.               openAddAudio();
  165.             }),
  166.       ],
  167.     ));
  168.  
  169.     return new Scaffold(
  170.       appBar: AppBar(
  171.         title: Text("Detail"),
  172.       ),
  173.       body: ListView(
  174.         children: <Widget>[
  175.           Padding(
  176.             padding: EdgeInsets.only(top: 10, bottom: 10),
  177.             child: TermView(term: term, tappable: false),
  178.           ),
  179.           //switcher,
  180.           Stack(
  181.             children: <Widget>[
  182.               CardScrollWidget(currentPage),
  183.               Positioned.fill(
  184.                 child: PageView.builder(
  185.                   itemCount: images.length,
  186.                   controller: controller,
  187.                   reverse: true,
  188.                   itemBuilder: (context, index) {
  189.                     return Container(child: Text(index.toString()),);
  190.                   },
  191.                 ),
  192.               )
  193.             ],
  194.           ),
  195.           cp,
  196.  
  197.  
  198.           RadialAddButton,
  199.         ],
  200.       ),
  201.     );
  202.   }
  203.  
  204.   void openCamera() async {
  205.     File cameraFile;
  206.     print("camera open!");
  207.     cameraFile = await ImagePicker.pickImage(
  208.       source: ImageSource.camera,
  209.       //maxHeight: 50.0,
  210.       //maxWidth: 50.0,
  211.     );
  212.     if (cameraFile != null) {
  213.       print("You selected camera image : " + cameraFile.path);
  214.       uploadPhoto(cameraFile);
  215.     } else {
  216.       print("no data");
  217.     }
  218.     setState(() {});
  219.   }
  220.  
  221.   void openGalery() async {
  222.     File galleryFile;
  223.  
  224.     galleryFile = await ImagePicker.pickImage(
  225.       source: ImageSource.gallery,
  226.       // maxHeight: 50.0,
  227.       // maxWidth: 50.0,
  228.     );
  229.     if (galleryFile != null) {
  230.       print("You selected gallery image : " + galleryFile.path);
  231.       uploadPhoto(galleryFile);
  232.     } else {
  233.       print("no data");
  234.     }
  235.     setState(() {});
  236.   }
  237.  
  238.   void uploadPhoto(File f) async {
  239.     List<int> bytes = f.readAsBytesSync();
  240.  
  241.     // TODO link to current term
  242.     var uuid = new Uuid();
  243.     final user = appData.appState.user;
  244.     String datauid = uuid.v4();
  245.     final remotePath = "user/${user.uid}/visual/${datauid}.jpeg";
  246.  
  247.     var res = await upload("$remotePath", 'visual/jpeg', bytes);
  248.     TermUpdate tup = new TermUpdate();
  249.     tup.imageUid = res.uid;
  250.     print(tup.imageUid);
  251.     var res2 = await upadteTerm(term.uid, tup);
  252.     print(res2.toString());
  253.   }
  254. }
  255. var gar = 12.0/16.0;
  256. //Переименовать...
  257. class EdgeSelectorData
  258. {
  259.   String dgeName;
  260.   Color backColor;
  261. }
  262. class CardScrollWidget extends StatelessWidget {
  263.   var currentPage;
  264.   var padding = 50.0;
  265.   var verticalInset = 20.0;
  266.  
  267.   CardScrollWidget(this.currentPage);
  268.  
  269.   @override
  270.   Widget build(BuildContext context) {
  271.     return new AspectRatio(
  272.       aspectRatio: gar* 2,
  273.       child: LayoutBuilder(builder: (context, contraints) {
  274.         var width = contraints.maxWidth;
  275.         var height = contraints.maxHeight;
  276.  
  277.         var safeWidth = width - 2 * padding;
  278.         var safeHeight = height - 2 * padding;
  279.  
  280.         var heightOfPrimaryCard = safeHeight;
  281.         var widthOfPrimaryCard = heightOfPrimaryCard * gar;
  282.  
  283.         var primaryCardLeft = safeWidth - widthOfPrimaryCard;
  284.         var horizontalInset = primaryCardLeft / 2;
  285.  
  286.         List<Widget> cardList = new List();
  287.  
  288.         for (var i = 0; i < images.length; i++) {
  289.           var delta = i - currentPage;
  290.           bool isOnRight = delta > 0;
  291.  
  292.           var start = padding +
  293.               max(
  294.                   primaryCardLeft -
  295.                       horizontalInset * -delta * (isOnRight ? 15 : 0.5 ),
  296.                   0.0);
  297.  
  298.           var cardItem = Positioned.directional(
  299.             top: padding + verticalInset * max(-delta, 0.0),
  300.             bottom: padding + verticalInset * max(-delta, 0.0),
  301.             start: start-100,
  302.             textDirection: TextDirection.rtl,
  303.             child: ClipRRect(
  304.               borderRadius: BorderRadius.circular(16.0),
  305.               child: Container(
  306.                 decoration: BoxDecoration(color: Colors.grey[i*100+100], boxShadow: [
  307.                   BoxShadow(
  308.                       color: Colors.black12,
  309.                       offset: Offset(3.0, 6.0),
  310.                       blurRadius: 20.0)
  311.                 ]),
  312.                 child: Container(
  313.                   //aspectRatio: gar,
  314.                   child: Stack(
  315.                     //fit: StackFit.expand,
  316.                     children: <Widget>[
  317.  
  318.                       //Icon(images[i]),
  319.                       Align(
  320.                         alignment: Alignment.center,
  321.                         child: Column(
  322.                           mainAxisSize: MainAxisSize.min,
  323.                           crossAxisAlignment: CrossAxisAlignment.start,
  324.                           children: <Widget>[
  325.                             Padding(
  326.                               padding: EdgeInsets.symmetric(
  327.                                   horizontal: 16.0, vertical: 8.0),
  328.                               child: Text(title[i],
  329.                                   style: TextStyle(
  330.                                       color: Colors.black,
  331.                                       fontSize: sqrt(pow(currentPage-i,2))<0.8?25-20*sqrt(pow(currentPage-i,2)):15,
  332.                                       fontFamily: "SF-Pro-Text-Regular")),
  333.                             ),
  334.  
  335.  
  336.                           ],
  337.                         ),
  338.                       )
  339.                     ],
  340.                   ),
  341.                 ),
  342.               ),
  343.             ),
  344.           );
  345.           cardList.add(cardItem);
  346.         }
  347.         return Stack(
  348.           children: cardList,
  349.         );
  350.       }),
  351.     );
  352.   }
  353. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement