Committed by
David PHAM-VAN
Implement and apply `PdfActionBarTheme`
Showing
2 changed files
with
87 additions
and
4 deletions
| 1 | +import 'package:flutter/foundation.dart'; | ||
| 2 | +import 'package:flutter/material.dart'; | ||
| 3 | + | ||
| 4 | +class PdfActionBarTheme with Diagnosticable { | ||
| 5 | + /// Creates a theme for action bar of [PdfPreviewController]. | ||
| 6 | + const PdfActionBarTheme({ | ||
| 7 | + this.backgroundColor, | ||
| 8 | + this.iconColor, | ||
| 9 | + this.height, | ||
| 10 | + this.textStyle, | ||
| 11 | + this.elevation = 4, | ||
| 12 | + this.alignment = WrapAlignment.spaceAround, | ||
| 13 | + }); | ||
| 14 | + | ||
| 15 | + final Color? backgroundColor; | ||
| 16 | + final Color? iconColor; | ||
| 17 | + final double? height; | ||
| 18 | + final TextStyle? textStyle; | ||
| 19 | + final double elevation; | ||
| 20 | + final WrapAlignment alignment; | ||
| 21 | + | ||
| 22 | + /// Creates a copy of this object but with the given fields replaced with the | ||
| 23 | + /// new values. | ||
| 24 | + PdfActionBarTheme copyWith({ | ||
| 25 | + Color? backgroundColor, | ||
| 26 | + Color? iconColor, | ||
| 27 | + double? height, | ||
| 28 | + TextStyle? textStyle, | ||
| 29 | + double? elevation, | ||
| 30 | + WrapAlignment? alignment, | ||
| 31 | + }) { | ||
| 32 | + return PdfActionBarTheme( | ||
| 33 | + backgroundColor: backgroundColor ?? this.backgroundColor, | ||
| 34 | + iconColor: iconColor ?? this.iconColor, | ||
| 35 | + height: height ?? this.height, | ||
| 36 | + textStyle: textStyle ?? this.textStyle, | ||
| 37 | + elevation: elevation ?? this.elevation, | ||
| 38 | + alignment: alignment ?? this.alignment, | ||
| 39 | + ); | ||
| 40 | + } | ||
| 41 | + | ||
| 42 | + @override | ||
| 43 | + int get hashCode => Object.hashAll( | ||
| 44 | + [backgroundColor, iconColor, height, textStyle, elevation, alignment]); | ||
| 45 | + | ||
| 46 | + @override | ||
| 47 | + bool operator ==(Object other) { | ||
| 48 | + if (identical(this, other)) { | ||
| 49 | + return true; | ||
| 50 | + } | ||
| 51 | + if (other.runtimeType != runtimeType) { | ||
| 52 | + return false; | ||
| 53 | + } | ||
| 54 | + return other is PdfActionBarTheme && | ||
| 55 | + other.backgroundColor == backgroundColor && | ||
| 56 | + other.iconColor == iconColor && | ||
| 57 | + other.height == height && | ||
| 58 | + other.textStyle == textStyle && | ||
| 59 | + other.elevation == elevation && | ||
| 60 | + other.alignment == alignment; | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + @override | ||
| 64 | + void debugFillProperties(DiagnosticPropertiesBuilder properties) { | ||
| 65 | + super.debugFillProperties(properties); | ||
| 66 | + properties.add(ColorProperty('backgroundColor', backgroundColor)); | ||
| 67 | + properties.add(ColorProperty('iconColor', iconColor)); | ||
| 68 | + properties.add(DoubleProperty('height', height)); | ||
| 69 | + properties.add(DiagnosticsProperty<TextStyle>('textStyle', textStyle)); | ||
| 70 | + properties.add(DoubleProperty('elevation', elevation)); | ||
| 71 | + properties.add(DiagnosticsProperty<WrapAlignment>('alignment', alignment, | ||
| 72 | + defaultValue: WrapAlignment.spaceAround)); | ||
| 73 | + } | ||
| 74 | +} |
| @@ -21,6 +21,7 @@ import 'package:pdf/widgets.dart' as pw; | @@ -21,6 +21,7 @@ import 'package:pdf/widgets.dart' as pw; | ||
| 21 | import '../callback.dart'; | 21 | import '../callback.dart'; |
| 22 | import '../printing.dart'; | 22 | import '../printing.dart'; |
| 23 | import '../printing_info.dart'; | 23 | import '../printing_info.dart'; |
| 24 | +import 'action_bar_theme.dart'; | ||
| 24 | import 'actions.dart'; | 25 | import 'actions.dart'; |
| 25 | import 'controller.dart'; | 26 | import 'controller.dart'; |
| 26 | import 'custom.dart'; | 27 | import 'custom.dart'; |
| @@ -62,6 +63,7 @@ class PdfPreview extends StatefulWidget { | @@ -62,6 +63,7 @@ class PdfPreview extends StatefulWidget { | ||
| 62 | this.loadingWidget, | 63 | this.loadingWidget, |
| 63 | this.onPageFormatChanged, | 64 | this.onPageFormatChanged, |
| 64 | this.dpi, | 65 | this.dpi, |
| 66 | + this.actionBarTheme = const PdfActionBarTheme(), | ||
| 65 | }) : _pagesBuilder = null, | 67 | }) : _pagesBuilder = null, |
| 66 | super(key: key); | 68 | super(key: key); |
| 67 | 69 | ||
| @@ -119,6 +121,7 @@ class PdfPreview extends StatefulWidget { | @@ -119,6 +121,7 @@ class PdfPreview extends StatefulWidget { | ||
| 119 | this.loadingWidget, | 121 | this.loadingWidget, |
| 120 | this.onPageFormatChanged, | 122 | this.onPageFormatChanged, |
| 121 | this.dpi, | 123 | this.dpi, |
| 124 | + this.actionBarTheme = const PdfActionBarTheme(), | ||
| 122 | required CustomPdfPagesBuilder pagesBuilder, | 125 | required CustomPdfPagesBuilder pagesBuilder, |
| 123 | }) : _pagesBuilder = pagesBuilder, | 126 | }) : _pagesBuilder = pagesBuilder, |
| 124 | super(key: key); | 127 | super(key: key); |
| @@ -223,6 +226,9 @@ class PdfPreview extends StatefulWidget { | @@ -223,6 +226,9 @@ class PdfPreview extends StatefulWidget { | ||
| 223 | /// If not provided, this value is calculated. | 226 | /// If not provided, this value is calculated. |
| 224 | final double? dpi; | 227 | final double? dpi; |
| 225 | 228 | ||
| 229 | + /// The style of actions bar. | ||
| 230 | + final PdfActionBarTheme actionBarTheme; | ||
| 231 | + | ||
| 226 | /// clients can pass this builder to render | 232 | /// clients can pass this builder to render |
| 227 | /// their own pages. | 233 | /// their own pages. |
| 228 | final CustomPdfPagesBuilder? _pagesBuilder; | 234 | final CustomPdfPagesBuilder? _pagesBuilder; |
| @@ -406,16 +412,19 @@ class PdfPreviewState extends State<PdfPreview> { | @@ -406,16 +412,19 @@ class PdfPreviewState extends State<PdfPreview> { | ||
| 406 | if (actions.isNotEmpty) | 412 | if (actions.isNotEmpty) |
| 407 | IconTheme.merge( | 413 | IconTheme.merge( |
| 408 | data: IconThemeData( | 414 | data: IconThemeData( |
| 409 | - color: iconColor, | 415 | + color: widget.actionBarTheme.iconColor ?? iconColor, |
| 410 | ), | 416 | ), |
| 411 | child: Material( | 417 | child: Material( |
| 412 | - elevation: 4, | ||
| 413 | - color: theme.primaryColor, | 418 | + elevation: widget.actionBarTheme.elevation, |
| 419 | + color: | ||
| 420 | + widget.actionBarTheme.backgroundColor ?? theme.primaryColor, | ||
| 421 | + textStyle: widget.actionBarTheme.textStyle, | ||
| 414 | child: SizedBox( | 422 | child: SizedBox( |
| 415 | width: double.infinity, | 423 | width: double.infinity, |
| 424 | + height: widget.actionBarTheme.height, | ||
| 416 | child: SafeArea( | 425 | child: SafeArea( |
| 417 | child: Wrap( | 426 | child: Wrap( |
| 418 | - alignment: WrapAlignment.spaceAround, | 427 | + alignment: widget.actionBarTheme.alignment, |
| 419 | children: actions, | 428 | children: actions, |
| 420 | ), | 429 | ), |
| 421 | ), | 430 | ), |
-
Please register or login to post a comment