cpdf_main_tool_bar.dart 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. import 'package:compdfkit_flutter/core/cpdf_view_ctrl.dart';
  2. import 'package:compdfkit_flutter/theme/colors.dart';
  3. import 'package:compdfkit_flutter/theme/themes.dart';
  4. import 'package:compdfkit_flutter/widgets/viewer/pdfbota/cpdf_bota_page.dart';
  5. import 'package:compdfkit_flutter/widgets/viewer/pdfdisplaysettings/cpdf_display_settings_page.dart';
  6. import 'package:flutter/material.dart';
  7. import '../../viewer/pdfbota/pdfthumbnail/cpdf_thumbnail_page.dart';
  8. /// Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
  9. ///
  10. /// THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
  11. /// AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
  12. /// UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
  13. /// This notice may not be removed from this file.
  14. class CPDFSlidingMainToolbar extends CPDFMainToolbar {
  15. final bool visible;
  16. final AnimationController controller;
  17. CPDFSlidingMainToolbar(
  18. {super.key,
  19. required this.visible,
  20. required this.controller,
  21. required super.ctrl,
  22. super.isDark,
  23. super.actions});
  24. CPDFSlidingMainToolbar.normal(
  25. {required this.visible,
  26. required this.controller,
  27. required super.ctrl,
  28. super.isDark})
  29. : super.normal();
  30. @override
  31. Widget build(BuildContext context) {
  32. visible ? controller.reverse() : controller.forward();
  33. return SlideTransition(
  34. position: Tween(begin: Offset.zero, end: const Offset(0, -1)).animate(
  35. CurvedAnimation(parent: controller, curve: Curves.fastOutSlowIn)),
  36. child: visible ? super.build(context) : null);
  37. }
  38. // @override
  39. // Size get preferredSize =>
  40. // visible ? super.preferredSize : Size(super.preferredSize.width, 0.0);
  41. }
  42. class CPDFMainToolbar extends StatelessWidget implements PreferredSizeWidget {
  43. final CPDFViewCtrl ctrl;
  44. List<CPDFActionWidget>? actions;
  45. bool isDark = false;
  46. CPDFMainToolbar(
  47. {Key? key, required this.ctrl, this.isDark = false, this.actions})
  48. : super(key: key);
  49. CPDFMainToolbar.normal({Key? key, this.isDark = false, required this.ctrl})
  50. : super(key: key) {
  51. actions = [
  52. CPDFActions.thumbnail(onPressed: (context) async {
  53. pushToBota(context, const [CPDFBotaType.thumbnails, CPDFBotaType.outline]);
  54. }),
  55. CPDFActions.search(),
  56. CPDFActions.bota(onPressed: (context) {
  57. pushToBota(context, const [CPDFBotaType.outline]);
  58. }),
  59. CPDFActions.more(onPressed: (context){
  60. Navigator.push(context, MaterialPageRoute(builder: (_) {
  61. return CPDFDisplaySettingsPage(ctrl: ctrl, isDark: isDark,);
  62. }));
  63. })
  64. ];
  65. }
  66. void pushToBota(BuildContext context, List<CPDFBotaType> types) async {
  67. int? pageIndex = await Navigator.push(context, MaterialPageRoute(builder: (_) {
  68. return CPDFBotaPage(
  69. ctrl: ctrl,
  70. isDark: isDark,
  71. types: types,
  72. );
  73. }));
  74. if (pageIndex != null) {
  75. ctrl.setDisplayPageIndex(pageIndex);
  76. }
  77. }
  78. @override
  79. Widget build(BuildContext context) {
  80. return Theme(
  81. data: isDark
  82. ? comPDFKitDarkTheme
  83. : comPDFKitLightTheme.copyWith(
  84. colorScheme: comPDFKitLightTheme.colorScheme
  85. .copyWith(primary: const Color(0xFFFAFCFF))),
  86. child: Builder(builder: (context) {
  87. return AppBar(
  88. leading: null,
  89. title: Row(
  90. children: [
  91. InkWell(
  92. borderRadius: BorderRadius.circular(6),
  93. child: Padding(
  94. padding: const EdgeInsets.only(
  95. left: 8, right: 8, top: 8, bottom: 8),
  96. child: Text('Viewer',
  97. style: Theme.of(context)
  98. .textTheme
  99. .titleLarge
  100. ?.copyWith(fontFamily: 'sans-serif-medium'))),
  101. onTap: () {},
  102. ),
  103. ],
  104. ),
  105. titleSpacing: 10,
  106. elevation: 2,
  107. actions: actions,
  108. );
  109. }));
  110. }
  111. @override
  112. Size get preferredSize => const Size(double.infinity, 56);
  113. }
  114. class CPDFActions {
  115. static CPDFActionWidget thumbnail({CPDFActionOnPressedCallback? onPressed}) {
  116. return CPDFActionWidget(
  117. image: 'assets/images/ic_thumbnail.png',
  118. package: 'compdfkit_flutter',
  119. onPressed: onPressed,
  120. );
  121. }
  122. static CPDFActionWidget search({CPDFActionOnPressedCallback? onPressed}) {
  123. return CPDFActionWidget(
  124. image: 'assets/images/ic_search.png',
  125. package: 'compdfkit_flutter',
  126. onPressed: onPressed,
  127. );
  128. }
  129. static CPDFActionWidget bota({CPDFActionOnPressedCallback? onPressed}) {
  130. return CPDFActionWidget(
  131. image: 'assets/images/ic_book.png',
  132. package: 'compdfkit_flutter',
  133. onPressed: onPressed,
  134. );
  135. }
  136. static CPDFActionWidget more({CPDFActionOnPressedCallback? onPressed}) {
  137. return CPDFActionWidget(
  138. image: 'assets/images/ic_more.png',
  139. package: 'compdfkit_flutter',
  140. onPressed: onPressed,
  141. );
  142. }
  143. }
  144. typedef CPDFActionOnPressedCallback = Function(BuildContext context);
  145. class CPDFActionWidget extends StatelessWidget {
  146. final String image;
  147. final String package;
  148. final CPDFActionOnPressedCallback? onPressed;
  149. const CPDFActionWidget(
  150. {Key? key,
  151. required this.image,
  152. this.package = 'compdfkit_flutter',
  153. this.onPressed})
  154. : super(key: key);
  155. @override
  156. Widget build(BuildContext context) {
  157. return IconButton(
  158. splashRadius: 24,
  159. onPressed: () {
  160. if (onPressed != null) {
  161. onPressed!(context);
  162. }
  163. },
  164. icon: Image.asset(
  165. image,
  166. package: package,
  167. width: 24,
  168. height: 24,
  169. color: Theme.of(context).colorScheme.onBackground,
  170. ));
  171. }
  172. }