mirror of
https://gitlab.com/nkming2/nc-photos.git
synced 2025-03-27 09:24:45 +01:00
Refactor: extract common widgets
This commit is contained in:
parent
f75b64812a
commit
6ea872f2fb
3 changed files with 102 additions and 45 deletions
|
@ -50,6 +50,7 @@ import 'package:nc_photos/widget/draggable_item_list.dart';
|
||||||
import 'package:nc_photos/widget/export_collection_dialog.dart';
|
import 'package:nc_photos/widget/export_collection_dialog.dart';
|
||||||
import 'package:nc_photos/widget/fancy_option_picker.dart';
|
import 'package:nc_photos/widget/fancy_option_picker.dart';
|
||||||
import 'package:nc_photos/widget/file_sharer_dialog.dart';
|
import 'package:nc_photos/widget/file_sharer_dialog.dart';
|
||||||
|
import 'package:nc_photos/widget/finger_listener.dart';
|
||||||
import 'package:nc_photos/widget/network_thumbnail.dart';
|
import 'package:nc_photos/widget/network_thumbnail.dart';
|
||||||
import 'package:nc_photos/widget/page_visibility_mixin.dart';
|
import 'package:nc_photos/widget/page_visibility_mixin.dart';
|
||||||
import 'package:nc_photos/widget/photo_list_item.dart';
|
import 'package:nc_photos/widget/photo_list_item.dart';
|
||||||
|
@ -59,11 +60,11 @@ import 'package:nc_photos/widget/selection_app_bar.dart';
|
||||||
import 'package:nc_photos/widget/share_collection_dialog.dart';
|
import 'package:nc_photos/widget/share_collection_dialog.dart';
|
||||||
import 'package:nc_photos/widget/shared_album_info_dialog.dart';
|
import 'package:nc_photos/widget/shared_album_info_dialog.dart';
|
||||||
import 'package:nc_photos/widget/simple_input_dialog.dart';
|
import 'package:nc_photos/widget/simple_input_dialog.dart';
|
||||||
|
import 'package:nc_photos/widget/sliver_visualized_scale.dart';
|
||||||
import 'package:nc_photos/widget/viewer.dart';
|
import 'package:nc_photos/widget/viewer.dart';
|
||||||
import 'package:np_codegen/np_codegen.dart';
|
import 'package:np_codegen/np_codegen.dart';
|
||||||
import 'package:np_common/or_null.dart';
|
import 'package:np_common/or_null.dart';
|
||||||
import 'package:np_ui/np_ui.dart';
|
import 'package:np_ui/np_ui.dart';
|
||||||
import 'package:sliver_tools/sliver_tools.dart';
|
|
||||||
import 'package:to_string/to_string.dart';
|
import 'package:to_string/to_string.dart';
|
||||||
|
|
||||||
part 'collection_browser.g.dart';
|
part 'collection_browser.g.dart';
|
||||||
|
@ -240,21 +241,11 @@ class _WrappedCollectionBrowserState extends State<_WrappedCollectionBrowser>
|
||||||
child: Stack(
|
child: Stack(
|
||||||
fit: StackFit.expand,
|
fit: StackFit.expand,
|
||||||
children: [
|
children: [
|
||||||
Listener(
|
FingerListener(
|
||||||
onPointerMove: (event) => _onPointerMove(context, event),
|
onPointerMove: (event) => _onPointerMove(context, event),
|
||||||
onPointerDown: (_) {
|
onFingerChanged: (finger) {
|
||||||
setState(() {
|
setState(() {
|
||||||
++_finger;
|
_finger = finger;
|
||||||
});
|
|
||||||
},
|
|
||||||
onPointerUp: (_) {
|
|
||||||
setState(() {
|
|
||||||
--_finger;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onPointerCancel: (_) {
|
|
||||||
setState(() {
|
|
||||||
--_finger;
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
|
@ -303,21 +294,10 @@ class _WrappedCollectionBrowserState extends State<_WrappedCollectionBrowser>
|
||||||
previous.scale != current.scale,
|
previous.scale != current.scale,
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
if (!state.isEditMode) {
|
if (!state.isEditMode) {
|
||||||
return SliverStack(
|
return SliverTransitionedScale(
|
||||||
children: [
|
scale: state.scale,
|
||||||
SliverOpacity(
|
baseSliver: const _ContentList(),
|
||||||
opacity: state.scale == null
|
overlaySliver: const _ScalingList(),
|
||||||
? 1
|
|
||||||
: _scaleToCurrentOpacity(state.scale!),
|
|
||||||
sliver: const _ContentList(),
|
|
||||||
),
|
|
||||||
if (state.scale != null)
|
|
||||||
SliverOpacity(
|
|
||||||
opacity: 1 -
|
|
||||||
_scaleToCurrentOpacity(state.scale!),
|
|
||||||
sliver: const _ScalingList(),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
if (context
|
if (context
|
||||||
|
@ -411,22 +391,6 @@ class _WrappedCollectionBrowserState extends State<_WrappedCollectionBrowser>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static double _scaleToCurrentOpacity(double scale) {
|
|
||||||
if (scale < 1) {
|
|
||||||
if (scale <= .3) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return ((scale - .3) / .7).clamp(0, 1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (scale >= 1.9) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return (1 - (scale - 1) / .9).clamp(0, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
late final _bloc = context.read<_Bloc>();
|
late final _bloc = context.read<_Bloc>();
|
||||||
final _scrollController = ScrollController();
|
final _scrollController = ScrollController();
|
||||||
bool? _isDragScrollingDown;
|
bool? _isDragScrollingDown;
|
||||||
|
|
42
app/lib/widget/finger_listener.dart
Normal file
42
app/lib/widget/finger_listener.dart
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class FingerListener extends StatefulWidget {
|
||||||
|
const FingerListener({
|
||||||
|
super.key,
|
||||||
|
required this.child,
|
||||||
|
this.onFingerChanged,
|
||||||
|
this.onPointerMove,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() => _FingerListenerState();
|
||||||
|
|
||||||
|
final Widget? child;
|
||||||
|
final void Function(int finger)? onFingerChanged;
|
||||||
|
|
||||||
|
final PointerMoveEventListener? onPointerMove;
|
||||||
|
}
|
||||||
|
|
||||||
|
class _FingerListenerState extends State<FingerListener> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Listener(
|
||||||
|
onPointerDown: (_) {
|
||||||
|
++_finger;
|
||||||
|
widget.onFingerChanged?.call(_finger);
|
||||||
|
},
|
||||||
|
onPointerUp: (_) {
|
||||||
|
--_finger;
|
||||||
|
widget.onFingerChanged?.call(_finger);
|
||||||
|
},
|
||||||
|
onPointerCancel: (_) {
|
||||||
|
--_finger;
|
||||||
|
widget.onFingerChanged?.call(_finger);
|
||||||
|
},
|
||||||
|
onPointerMove: widget.onPointerMove,
|
||||||
|
child: widget.child,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
var _finger = 0;
|
||||||
|
}
|
51
app/lib/widget/sliver_visualized_scale.dart
Normal file
51
app/lib/widget/sliver_visualized_scale.dart
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:np_common/object_util.dart';
|
||||||
|
import 'package:sliver_tools/sliver_tools.dart';
|
||||||
|
|
||||||
|
/// Transitioned scaling between two slivers
|
||||||
|
class SliverTransitionedScale extends StatelessWidget {
|
||||||
|
const SliverTransitionedScale({
|
||||||
|
super.key,
|
||||||
|
required this.scale,
|
||||||
|
required this.baseSliver,
|
||||||
|
required this.overlaySliver,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SliverStack(
|
||||||
|
children: [
|
||||||
|
SliverOpacity(
|
||||||
|
opacity: scale?.let(_scaleToCurrentOpacity) ?? 1,
|
||||||
|
sliver: baseSliver,
|
||||||
|
),
|
||||||
|
if (scale != null)
|
||||||
|
SliverOpacity(
|
||||||
|
opacity: 1 - _scaleToCurrentOpacity(scale!),
|
||||||
|
sliver: overlaySliver,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Current scaling factor [0, 1], or null if not scaling
|
||||||
|
final double? scale;
|
||||||
|
final Widget baseSliver;
|
||||||
|
final Widget overlaySliver;
|
||||||
|
}
|
||||||
|
|
||||||
|
double _scaleToCurrentOpacity(double scale) {
|
||||||
|
if (scale < 1) {
|
||||||
|
if (scale <= .3) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return ((scale - .3) / .7).clamp(0, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (scale >= 1.9) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return (1 - (scale - 1) / .9).clamp(0, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue