mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
chore: config build context of URLCellEditor
This commit is contained in:
parent
57e5c36fe8
commit
5bd0fb9fae
@ -6,21 +6,29 @@ import 'package:provider/provider.dart';
|
||||
import 'package:flowy_infra/size.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
|
||||
abstract class GridCellAccessory implements Widget {
|
||||
void onTap(BuildContext context);
|
||||
class GridCellAccessoryBuildContext {
|
||||
final BuildContext anchorContext;
|
||||
|
||||
GridCellAccessoryBuildContext({required this.anchorContext});
|
||||
}
|
||||
|
||||
abstract class AccessoryHoverChild extends Widget {
|
||||
const AccessoryHoverChild({Key? key}) : super(key: key);
|
||||
abstract class GridCellAccessory implements Widget {
|
||||
void onTap();
|
||||
}
|
||||
|
||||
typedef AccessoryBuilder = List<GridCellAccessory> Function(GridCellAccessoryBuildContext buildContext);
|
||||
|
||||
abstract class AccessoryWidget extends Widget {
|
||||
const AccessoryWidget({Key? key}) : super(key: key);
|
||||
|
||||
// The hover will show if the onFocus's value is true
|
||||
ValueNotifier<bool>? get isFocus;
|
||||
|
||||
List<GridCellAccessory> accessories();
|
||||
AccessoryBuilder? get accessoryBuilder;
|
||||
}
|
||||
|
||||
class AccessoryHover extends StatefulWidget {
|
||||
final AccessoryHoverChild child;
|
||||
final AccessoryWidget child;
|
||||
final EdgeInsets contentPadding;
|
||||
const AccessoryHover({
|
||||
required this.child,
|
||||
@ -62,8 +70,10 @@ class _AccessoryHoverState extends State<AccessoryHover> {
|
||||
const _Background(),
|
||||
Padding(padding: widget.contentPadding, child: widget.child),
|
||||
];
|
||||
final accessories = widget.child.accessories();
|
||||
if (accessories.isNotEmpty) {
|
||||
|
||||
final accessoryBuilder = widget.child.accessoryBuilder;
|
||||
if (accessoryBuilder != null) {
|
||||
final accessories = accessoryBuilder((GridCellAccessoryBuildContext(anchorContext: context)));
|
||||
children.add(
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right: 6),
|
||||
@ -152,7 +162,7 @@ class AccessoryContainer extends StatelessWidget {
|
||||
return GestureDetector(
|
||||
child: hover,
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: () => accessory.onTap(context),
|
||||
onTap: () => accessory.onTap(),
|
||||
);
|
||||
}).toList();
|
||||
|
||||
|
@ -48,14 +48,12 @@ class BlankCell extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
abstract class GridCellWidget implements AccessoryHoverChild, CellContainerFocustable {
|
||||
abstract class GridCellWidget implements AccessoryWidget, CellContainerFocustable {
|
||||
@override
|
||||
final ValueNotifier<bool> isFocus = ValueNotifier<bool>(false);
|
||||
|
||||
@override
|
||||
List<GridCellAccessory> accessories() {
|
||||
return List.empty();
|
||||
}
|
||||
List<GridCellAccessory> Function(GridCellAccessoryBuildContext buildContext)? get accessoryBuilder => null;
|
||||
|
||||
@override
|
||||
final GridCellRequestBeginFocus requestBeginFocus = GridCellRequestBeginFocus();
|
||||
@ -135,7 +133,7 @@ abstract class CellContainerFocustable {
|
||||
|
||||
class CellContainer extends StatelessWidget {
|
||||
final GridCellWidget child;
|
||||
final List<GridCellAccessory> accessories;
|
||||
final AccessoryBuilder? accessoryBuilder;
|
||||
final double width;
|
||||
final RegionStateNotifier rowStateNotifier;
|
||||
const CellContainer({
|
||||
@ -143,7 +141,7 @@ class CellContainer extends StatelessWidget {
|
||||
required this.child,
|
||||
required this.width,
|
||||
required this.rowStateNotifier,
|
||||
this.accessories = const [],
|
||||
this.accessoryBuilder,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
@ -159,8 +157,12 @@ class CellContainer extends StatelessWidget {
|
||||
Provider.of<CellStateNotifier>(context, listen: false).isFocus = child.isFocus.value;
|
||||
});
|
||||
|
||||
if (accessories.isNotEmpty) {
|
||||
container = CellEnterRegion(child: container, accessories: accessories);
|
||||
if (accessoryBuilder != null) {
|
||||
final buildContext = GridCellAccessoryBuildContext(anchorContext: context);
|
||||
final accessories = accessoryBuilder!(buildContext);
|
||||
if (accessories.isNotEmpty) {
|
||||
container = CellEnterRegion(child: container, accessories: accessories);
|
||||
}
|
||||
}
|
||||
|
||||
return GestureDetector(
|
||||
|
@ -48,32 +48,34 @@ class GridURLCell extends StatefulWidget with GridCellWidget {
|
||||
@override
|
||||
State<GridURLCell> createState() => _GridURLCellState();
|
||||
|
||||
@override
|
||||
List<GridCellAccessory> accessories() {
|
||||
final List<GridCellAccessory> accessories = [];
|
||||
if (cellStyle != null) {
|
||||
accessories.addAll(cellStyle!.accessoryTypes.map(accessoryFromType));
|
||||
}
|
||||
|
||||
// If the accessories is empty then the default accessory will be GridURLCellAccessoryType.edit
|
||||
if (accessories.isEmpty) {
|
||||
accessories.add(accessoryFromType(GridURLCellAccessoryType.edit));
|
||||
}
|
||||
|
||||
return accessories;
|
||||
}
|
||||
|
||||
GridCellAccessory accessoryFromType(GridURLCellAccessoryType ty) {
|
||||
GridCellAccessory accessoryFromType(GridURLCellAccessoryType ty, GridCellAccessoryBuildContext buildContext) {
|
||||
switch (ty) {
|
||||
case GridURLCellAccessoryType.edit:
|
||||
final cellContext = cellContextBuilder.build() as GridURLCellContext;
|
||||
return _EditURLAccessory(cellContext: cellContext);
|
||||
return _EditURLAccessory(cellContext: cellContext, anchorContext: buildContext.anchorContext);
|
||||
|
||||
case GridURLCellAccessoryType.copyURL:
|
||||
final cellContext = cellContextBuilder.build() as GridURLCellContext;
|
||||
return _CopyURLAccessory(cellContext: cellContext);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
List<GridCellAccessory> Function(GridCellAccessoryBuildContext buildContext) get accessoryBuilder => (buildContext) {
|
||||
final List<GridCellAccessory> accessories = [];
|
||||
if (cellStyle != null) {
|
||||
accessories.addAll(cellStyle!.accessoryTypes.map((ty) {
|
||||
return accessoryFromType(ty, buildContext);
|
||||
}));
|
||||
}
|
||||
|
||||
// If the accessories is empty then the default accessory will be GridURLCellAccessoryType.edit
|
||||
if (accessories.isEmpty) {
|
||||
accessories.add(accessoryFromType(GridURLCellAccessoryType.edit, buildContext));
|
||||
}
|
||||
|
||||
return accessories;
|
||||
};
|
||||
}
|
||||
|
||||
class _GridURLCellState extends State<GridURLCell> {
|
||||
@ -153,7 +155,12 @@ class _GridURLCellState extends State<GridURLCell> {
|
||||
|
||||
class _EditURLAccessory extends StatelessWidget with GridCellAccessory {
|
||||
final GridURLCellContext cellContext;
|
||||
const _EditURLAccessory({required this.cellContext, Key? key}) : super(key: key);
|
||||
final BuildContext anchorContext;
|
||||
const _EditURLAccessory({
|
||||
required this.cellContext,
|
||||
required this.anchorContext,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@ -162,8 +169,8 @@ class _EditURLAccessory extends StatelessWidget with GridCellAccessory {
|
||||
}
|
||||
|
||||
@override
|
||||
void onTap(BuildContext context) {
|
||||
URLCellEditor.show(context, cellContext);
|
||||
void onTap() {
|
||||
URLCellEditor.show(anchorContext, cellContext);
|
||||
}
|
||||
}
|
||||
|
||||
@ -178,10 +185,9 @@ class _CopyURLAccessory extends StatelessWidget with GridCellAccessory {
|
||||
}
|
||||
|
||||
@override
|
||||
void onTap(BuildContext context) {
|
||||
void onTap() {
|
||||
final content = cellContext.getCellData(loadIfNoCache: false)?.content ?? "";
|
||||
Clipboard.setData(ClipboardData(text: content));
|
||||
|
||||
showMessageToast(LocaleKeys.grid_row_copyProperty.tr());
|
||||
}
|
||||
}
|
||||
|
@ -176,13 +176,25 @@ class _RowCells extends StatelessWidget {
|
||||
if (gridCell.field.isPrimary) {
|
||||
accessories.add(_PrimaryCellAccessory(onTapCallback: onExpand));
|
||||
}
|
||||
accessories.addAll(child.accessories());
|
||||
|
||||
accessoryBuilder(buildContext) {
|
||||
final builder = child.accessoryBuilder;
|
||||
List<GridCellAccessory> accessories = [];
|
||||
if (gridCell.field.isPrimary) {
|
||||
accessories.add(_PrimaryCellAccessory(onTapCallback: onExpand));
|
||||
}
|
||||
|
||||
if (builder != null) {
|
||||
accessories.addAll(builder(buildContext));
|
||||
}
|
||||
return accessories;
|
||||
}
|
||||
|
||||
return CellContainer(
|
||||
width: gridCell.field.width.toDouble(),
|
||||
child: child,
|
||||
rowStateNotifier: Provider.of<RegionStateNotifier>(context, listen: false),
|
||||
accessories: accessories,
|
||||
accessoryBuilder: accessoryBuilder,
|
||||
);
|
||||
},
|
||||
).toList();
|
||||
@ -213,7 +225,7 @@ class _PrimaryCellAccessory extends StatelessWidget with GridCellAccessory {
|
||||
}
|
||||
|
||||
@override
|
||||
void onTap(BuildContext context) {
|
||||
void onTap() {
|
||||
onTapCallback();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user