Skip to content

Commit 73bca4f

Browse files
committed
GridView
1 parent 14e9afe commit 73bca4f

File tree

16 files changed

+288
-133
lines changed

16 files changed

+288
-133
lines changed

client/lib/controls/column.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/widgets.dart';
22
import '../models/control.dart';
3+
import '../utils/alignment.dart';
34
import 'create_control.dart';
45
import 'scrollable_control.dart';
56

client/lib/controls/container.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
import 'package:flet_view/controls/create_control.dart';
2-
import 'package:flet_view/controls/error.dart';
3-
import 'package:flet_view/utils/colors.dart';
41
import 'package:flutter/material.dart';
52
import 'package:flutter/widgets.dart';
63

4+
import '../utils/alignment.dart';
5+
import '../utils/borders.dart';
6+
import 'create_control.dart';
7+
import 'error.dart';
8+
import '../utils/colors.dart';
79
import '../models/control.dart';
10+
import '../utils/edge_insets.dart';
811

912
class ContainerControl extends StatelessWidget {
1013
final Control? parent;

client/lib/controls/create_control.dart

Lines changed: 7 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import '../models/control.dart';
1616
import '../models/control_view_model.dart';
1717
import '../models/app_state.dart';
1818
import '../utils/theme.dart';
19+
import 'grid_view.dart';
1920
import 'icon_button.dart';
2021
import 'outlined_button.dart';
2122
import 'row.dart';
@@ -104,6 +105,12 @@ Widget createControl(Control? parent, String id, bool parentDisabled) {
104105
control: controlView.control,
105106
children: controlView.children,
106107
parentDisabled: parentDisabled);
108+
case ControlType.gridView:
109+
return GridViewControl(
110+
parent: parent,
111+
control: controlView.control,
112+
children: controlView.children,
113+
parentDisabled: parentDisabled);
107114
case ControlType.textField:
108115
return TextFieldControl(
109116
parent: parent,
@@ -170,89 +177,3 @@ Widget _expandable(Widget widget, Control? parent, Control control) {
170177
}
171178
return widget;
172179
}
173-
174-
MainAxisAlignment parseMainAxisAlignment(
175-
Control control, String propName, MainAxisAlignment defValue) {
176-
return MainAxisAlignment.values.firstWhere(
177-
(e) =>
178-
e.name.toLowerCase() ==
179-
control.attrString(propName, "")!.toLowerCase(),
180-
orElse: () => defValue);
181-
}
182-
183-
CrossAxisAlignment parseCrossAxisAlignment(
184-
Control control, String propName, CrossAxisAlignment defValue) {
185-
return CrossAxisAlignment.values.firstWhere(
186-
(e) =>
187-
e.name.toLowerCase() ==
188-
control.attrString(propName, "")!.toLowerCase(),
189-
orElse: () => defValue);
190-
}
191-
192-
WrapAlignment parseWrapAlignment(
193-
Control control, String propName, WrapAlignment defValue) {
194-
return WrapAlignment.values.firstWhere(
195-
(e) =>
196-
e.name.toLowerCase() ==
197-
control.attrString(propName, "")!.toLowerCase(),
198-
orElse: () => defValue);
199-
}
200-
201-
WrapCrossAlignment parseWrapCrossAlignment(
202-
Control control, String propName, WrapCrossAlignment defValue) {
203-
return WrapCrossAlignment.values.firstWhere(
204-
(e) =>
205-
e.name.toLowerCase() ==
206-
control.attrString(propName, "")!.toLowerCase(),
207-
orElse: () => defValue);
208-
}
209-
210-
ThemeData? parseTheme(Control control, String propName) {
211-
var v = control.attrString(propName, null);
212-
if (v == null) {
213-
return null;
214-
}
215-
216-
final j1 = json.decode(v);
217-
return themeFromJson(j1);
218-
}
219-
220-
EdgeInsets? parseEdgeInsets(Control control, String propName) {
221-
var v = control.attrString(propName, null);
222-
if (v == null) {
223-
return null;
224-
}
225-
226-
final j1 = json.decode(v);
227-
return edgeInsetsFromJson(j1);
228-
}
229-
230-
Alignment? parseAlignment(Control control, String propName) {
231-
var v = control.attrString(propName, null);
232-
if (v == null) {
233-
return null;
234-
}
235-
236-
final j1 = json.decode(v);
237-
return alignmentFromJson(j1);
238-
}
239-
240-
BorderRadius? parseBorderRadius(Control control, String propName) {
241-
var v = control.attrString(propName, null);
242-
if (v == null) {
243-
return null;
244-
}
245-
246-
final j1 = json.decode(v);
247-
return borderRadiusFromJSON(j1);
248-
}
249-
250-
Border? parseBorder(BuildContext context, Control control, String propName) {
251-
var v = control.attrString(propName, null);
252-
if (v == null) {
253-
return null;
254-
}
255-
256-
final j1 = json.decode(v);
257-
return borderFromJSON(context, j1);
258-
}

client/lib/controls/grid_view.dart

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import 'package:flutter/widgets.dart';
2+
import '../models/control.dart';
3+
import '../utils/edge_insets.dart';
4+
import 'create_control.dart';
5+
6+
class GridViewControl extends StatelessWidget {
7+
final Control? parent;
8+
final Control control;
9+
final bool parentDisabled;
10+
final List<Control> children;
11+
12+
const GridViewControl(
13+
{Key? key,
14+
this.parent,
15+
required this.control,
16+
required this.children,
17+
required this.parentDisabled})
18+
: super(key: key);
19+
20+
@override
21+
Widget build(BuildContext context) {
22+
debugPrint("GridViewControl build: ${control.id}");
23+
24+
bool disabled = control.isDisabled || parentDisabled;
25+
26+
final horizontal = control.attrBool("horizontal", false)!;
27+
final runsCount = control.attrInt("runsCount", 1)!;
28+
final spacing = control.attrDouble("spacing", 10)!;
29+
final runSpacing = control.attrDouble("runSpacing", 10)!;
30+
final padding = parseEdgeInsets(control, "padding");
31+
32+
List<Widget> controls =
33+
children.map((c) => createControl(control, c.id, disabled)).toList();
34+
35+
return constrainedControl(
36+
GridView.count(
37+
scrollDirection: horizontal ? Axis.horizontal : Axis.vertical,
38+
crossAxisCount: runsCount,
39+
mainAxisSpacing: spacing,
40+
crossAxisSpacing: runSpacing,
41+
padding: padding,
42+
children: controls,
43+
),
44+
parent,
45+
control);
46+
}
47+
}

client/lib/controls/image.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:flutter_redux/flutter_redux.dart';
55

66
import '../models/app_state.dart';
77
import '../models/control.dart';
8+
import '../utils/borders.dart';
89
import '../utils/uri.dart';
910

1011
class ImageControl extends StatelessWidget {

client/lib/controls/list_view.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/widgets.dart';
22
import '../models/control.dart';
3+
import '../utils/edge_insets.dart';
34
import 'create_control.dart';
45

56
class ListViewControl extends StatelessWidget {

client/lib/controls/page.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import 'package:flet_view/utils/colors.dart';
22

3+
import '../utils/alignment.dart';
4+
import '../utils/edge_insets.dart';
5+
import '../utils/theme.dart';
36
import '../widgets/screen_size.dart';
47
import 'package:flutter/material.dart';
58
import 'create_control.dart';

client/lib/controls/row.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
import 'package:flutter/rendering.dart';
2-
3-
import '../models/page_breakpoint_view_model.dart';
41
import 'package:flutter/widgets.dart';
5-
import 'package:flutter_redux/flutter_redux.dart';
6-
import '../models/app_state.dart';
72
import '../models/control.dart';
3+
import '../utils/alignment.dart';
84
import 'create_control.dart';
95
import 'scrollable_control.dart';
106

client/lib/utils/alignment.dart

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,55 @@
1+
import 'dart:convert';
2+
13
import 'package:flutter/cupertino.dart';
24

5+
import '../models/control.dart';
6+
7+
MainAxisAlignment parseMainAxisAlignment(
8+
Control control, String propName, MainAxisAlignment defValue) {
9+
return MainAxisAlignment.values.firstWhere(
10+
(e) =>
11+
e.name.toLowerCase() ==
12+
control.attrString(propName, "")!.toLowerCase(),
13+
orElse: () => defValue);
14+
}
15+
16+
CrossAxisAlignment parseCrossAxisAlignment(
17+
Control control, String propName, CrossAxisAlignment defValue) {
18+
return CrossAxisAlignment.values.firstWhere(
19+
(e) =>
20+
e.name.toLowerCase() ==
21+
control.attrString(propName, "")!.toLowerCase(),
22+
orElse: () => defValue);
23+
}
24+
25+
WrapAlignment parseWrapAlignment(
26+
Control control, String propName, WrapAlignment defValue) {
27+
return WrapAlignment.values.firstWhere(
28+
(e) =>
29+
e.name.toLowerCase() ==
30+
control.attrString(propName, "")!.toLowerCase(),
31+
orElse: () => defValue);
32+
}
33+
34+
WrapCrossAlignment parseWrapCrossAlignment(
35+
Control control, String propName, WrapCrossAlignment defValue) {
36+
return WrapCrossAlignment.values.firstWhere(
37+
(e) =>
38+
e.name.toLowerCase() ==
39+
control.attrString(propName, "")!.toLowerCase(),
40+
orElse: () => defValue);
41+
}
42+
43+
Alignment? parseAlignment(Control control, String propName) {
44+
var v = control.attrString(propName, null);
45+
if (v == null) {
46+
return null;
47+
}
48+
49+
final j1 = json.decode(v);
50+
return alignmentFromJson(j1);
51+
}
52+
353
Alignment alignmentFromJson(Map<String, dynamic> json) {
454
return Alignment(json['x'] as double, json['y'] as double);
555
}

client/lib/utils/borders.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,30 @@
1+
import 'dart:convert';
2+
13
import 'package:flet_view/utils/colors.dart';
24
import 'package:flutter/material.dart';
35

6+
import '../models/control.dart';
7+
8+
BorderRadius? parseBorderRadius(Control control, String propName) {
9+
var v = control.attrString(propName, null);
10+
if (v == null) {
11+
return null;
12+
}
13+
14+
final j1 = json.decode(v);
15+
return borderRadiusFromJSON(j1);
16+
}
17+
18+
Border? parseBorder(BuildContext context, Control control, String propName) {
19+
var v = control.attrString(propName, null);
20+
if (v == null) {
21+
return null;
22+
}
23+
24+
final j1 = json.decode(v);
25+
return borderFromJSON(context, j1);
26+
}
27+
428
BorderRadius borderRadiusFromJSON(Map<String, dynamic> json) {
529
return BorderRadius.only(
630
topLeft: Radius.circular(json['tl'] as double),

0 commit comments

Comments
 (0)