Skip to content

Commit 5bd0fb9

Browse files
committed
chore: config build context of URLCellEditor
1 parent 57e5c36 commit 5bd0fb9

File tree

4 files changed

+71
-41
lines changed

4 files changed

+71
-41
lines changed

frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_accessory.dart

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,29 @@ import 'package:provider/provider.dart';
66
import 'package:flowy_infra/size.dart';
77
import 'package:styled_widget/styled_widget.dart';
88

9+
class GridCellAccessoryBuildContext {
10+
final BuildContext anchorContext;
11+
12+
GridCellAccessoryBuildContext({required this.anchorContext});
13+
}
14+
915
abstract class GridCellAccessory implements Widget {
10-
void onTap(BuildContext context);
16+
void onTap();
1117
}
1218

13-
abstract class AccessoryHoverChild extends Widget {
14-
const AccessoryHoverChild({Key? key}) : super(key: key);
19+
typedef AccessoryBuilder = List<GridCellAccessory> Function(GridCellAccessoryBuildContext buildContext);
20+
21+
abstract class AccessoryWidget extends Widget {
22+
const AccessoryWidget({Key? key}) : super(key: key);
1523

1624
// The hover will show if the onFocus's value is true
1725
ValueNotifier<bool>? get isFocus;
1826

19-
List<GridCellAccessory> accessories();
27+
AccessoryBuilder? get accessoryBuilder;
2028
}
2129

2230
class AccessoryHover extends StatefulWidget {
23-
final AccessoryHoverChild child;
31+
final AccessoryWidget child;
2432
final EdgeInsets contentPadding;
2533
const AccessoryHover({
2634
required this.child,
@@ -62,8 +70,10 @@ class _AccessoryHoverState extends State<AccessoryHover> {
6270
const _Background(),
6371
Padding(padding: widget.contentPadding, child: widget.child),
6472
];
65-
final accessories = widget.child.accessories();
66-
if (accessories.isNotEmpty) {
73+
74+
final accessoryBuilder = widget.child.accessoryBuilder;
75+
if (accessoryBuilder != null) {
76+
final accessories = accessoryBuilder((GridCellAccessoryBuildContext(anchorContext: context)));
6777
children.add(
6878
Padding(
6979
padding: const EdgeInsets.only(right: 6),
@@ -152,7 +162,7 @@ class AccessoryContainer extends StatelessWidget {
152162
return GestureDetector(
153163
child: hover,
154164
behavior: HitTestBehavior.opaque,
155-
onTap: () => accessory.onTap(context),
165+
onTap: () => accessory.onTap(),
156166
);
157167
}).toList();
158168

frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/cell_builder.dart

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,12 @@ class BlankCell extends StatelessWidget {
4848
}
4949
}
5050

51-
abstract class GridCellWidget implements AccessoryHoverChild, CellContainerFocustable {
51+
abstract class GridCellWidget implements AccessoryWidget, CellContainerFocustable {
5252
@override
5353
final ValueNotifier<bool> isFocus = ValueNotifier<bool>(false);
5454

5555
@override
56-
List<GridCellAccessory> accessories() {
57-
return List.empty();
58-
}
56+
List<GridCellAccessory> Function(GridCellAccessoryBuildContext buildContext)? get accessoryBuilder => null;
5957

6058
@override
6159
final GridCellRequestBeginFocus requestBeginFocus = GridCellRequestBeginFocus();
@@ -135,15 +133,15 @@ abstract class CellContainerFocustable {
135133

136134
class CellContainer extends StatelessWidget {
137135
final GridCellWidget child;
138-
final List<GridCellAccessory> accessories;
136+
final AccessoryBuilder? accessoryBuilder;
139137
final double width;
140138
final RegionStateNotifier rowStateNotifier;
141139
const CellContainer({
142140
Key? key,
143141
required this.child,
144142
required this.width,
145143
required this.rowStateNotifier,
146-
this.accessories = const [],
144+
this.accessoryBuilder,
147145
}) : super(key: key);
148146

149147
@override
@@ -159,8 +157,12 @@ class CellContainer extends StatelessWidget {
159157
Provider.of<CellStateNotifier>(context, listen: false).isFocus = child.isFocus.value;
160158
});
161159

162-
if (accessories.isNotEmpty) {
163-
container = CellEnterRegion(child: container, accessories: accessories);
160+
if (accessoryBuilder != null) {
161+
final buildContext = GridCellAccessoryBuildContext(anchorContext: context);
162+
final accessories = accessoryBuilder!(buildContext);
163+
if (accessories.isNotEmpty) {
164+
container = CellEnterRegion(child: container, accessories: accessories);
165+
}
164166
}
165167

166168
return GestureDetector(

frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/cell/url_cell/url_cell.dart

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -48,32 +48,34 @@ class GridURLCell extends StatefulWidget with GridCellWidget {
4848
@override
4949
State<GridURLCell> createState() => _GridURLCellState();
5050

51-
@override
52-
List<GridCellAccessory> accessories() {
53-
final List<GridCellAccessory> accessories = [];
54-
if (cellStyle != null) {
55-
accessories.addAll(cellStyle!.accessoryTypes.map(accessoryFromType));
56-
}
57-
58-
// If the accessories is empty then the default accessory will be GridURLCellAccessoryType.edit
59-
if (accessories.isEmpty) {
60-
accessories.add(accessoryFromType(GridURLCellAccessoryType.edit));
61-
}
62-
63-
return accessories;
64-
}
65-
66-
GridCellAccessory accessoryFromType(GridURLCellAccessoryType ty) {
51+
GridCellAccessory accessoryFromType(GridURLCellAccessoryType ty, GridCellAccessoryBuildContext buildContext) {
6752
switch (ty) {
6853
case GridURLCellAccessoryType.edit:
6954
final cellContext = cellContextBuilder.build() as GridURLCellContext;
70-
return _EditURLAccessory(cellContext: cellContext);
55+
return _EditURLAccessory(cellContext: cellContext, anchorContext: buildContext.anchorContext);
7156

7257
case GridURLCellAccessoryType.copyURL:
7358
final cellContext = cellContextBuilder.build() as GridURLCellContext;
7459
return _CopyURLAccessory(cellContext: cellContext);
7560
}
7661
}
62+
63+
@override
64+
List<GridCellAccessory> Function(GridCellAccessoryBuildContext buildContext) get accessoryBuilder => (buildContext) {
65+
final List<GridCellAccessory> accessories = [];
66+
if (cellStyle != null) {
67+
accessories.addAll(cellStyle!.accessoryTypes.map((ty) {
68+
return accessoryFromType(ty, buildContext);
69+
}));
70+
}
71+
72+
// If the accessories is empty then the default accessory will be GridURLCellAccessoryType.edit
73+
if (accessories.isEmpty) {
74+
accessories.add(accessoryFromType(GridURLCellAccessoryType.edit, buildContext));
75+
}
76+
77+
return accessories;
78+
};
7779
}
7880

7981
class _GridURLCellState extends State<GridURLCell> {
@@ -153,7 +155,12 @@ class _GridURLCellState extends State<GridURLCell> {
153155

154156
class _EditURLAccessory extends StatelessWidget with GridCellAccessory {
155157
final GridURLCellContext cellContext;
156-
const _EditURLAccessory({required this.cellContext, Key? key}) : super(key: key);
158+
final BuildContext anchorContext;
159+
const _EditURLAccessory({
160+
required this.cellContext,
161+
required this.anchorContext,
162+
Key? key,
163+
}) : super(key: key);
157164

158165
@override
159166
Widget build(BuildContext context) {
@@ -162,8 +169,8 @@ class _EditURLAccessory extends StatelessWidget with GridCellAccessory {
162169
}
163170

164171
@override
165-
void onTap(BuildContext context) {
166-
URLCellEditor.show(context, cellContext);
172+
void onTap() {
173+
URLCellEditor.show(anchorContext, cellContext);
167174
}
168175
}
169176

@@ -178,10 +185,9 @@ class _CopyURLAccessory extends StatelessWidget with GridCellAccessory {
178185
}
179186

180187
@override
181-
void onTap(BuildContext context) {
188+
void onTap() {
182189
final content = cellContext.getCellData(loadIfNoCache: false)?.content ?? "";
183190
Clipboard.setData(ClipboardData(text: content));
184-
185191
showMessageToast(LocaleKeys.grid_row_copyProperty.tr());
186192
}
187193
}

frontend/app_flowy/lib/workspace/presentation/plugins/grid/src/widgets/row/grid_row.dart

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,25 @@ class _RowCells extends StatelessWidget {
176176
if (gridCell.field.isPrimary) {
177177
accessories.add(_PrimaryCellAccessory(onTapCallback: onExpand));
178178
}
179-
accessories.addAll(child.accessories());
179+
180+
accessoryBuilder(buildContext) {
181+
final builder = child.accessoryBuilder;
182+
List<GridCellAccessory> accessories = [];
183+
if (gridCell.field.isPrimary) {
184+
accessories.add(_PrimaryCellAccessory(onTapCallback: onExpand));
185+
}
186+
187+
if (builder != null) {
188+
accessories.addAll(builder(buildContext));
189+
}
190+
return accessories;
191+
}
180192

181193
return CellContainer(
182194
width: gridCell.field.width.toDouble(),
183195
child: child,
184196
rowStateNotifier: Provider.of<RegionStateNotifier>(context, listen: false),
185-
accessories: accessories,
197+
accessoryBuilder: accessoryBuilder,
186198
);
187199
},
188200
).toList();
@@ -213,7 +225,7 @@ class _PrimaryCellAccessory extends StatelessWidget with GridCellAccessory {
213225
}
214226

215227
@override
216-
void onTap(BuildContext context) {
228+
void onTap() {
217229
onTapCallback();
218230
}
219231
}

0 commit comments

Comments
 (0)