Skip to content

Commit 68e9204

Browse files
Refactor HomeView layout to use Stack and Positioned
1 parent c1d75b3 commit 68e9204

1 file changed

Lines changed: 50 additions & 18 deletions

File tree

‎lib/widgets/home_view.dart‎

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:launch_r/widgets/edge_flipper.dart';
1111
import 'package:launch_r/widgets/keep_alive.dart';
1212
import 'package:launch_r/widgets/launcher_cell.dart';
1313
import 'package:launch_r/widgets/page_dots.dart';
14+
import 'package:launch_r/widgets/home_widget_frame.dart';
1415

1516
class HomeView extends StatelessWidget {
1617
const HomeView({super.key, required this.controller});
@@ -117,6 +118,7 @@ void _announce(BuildContext context, DropOutcome outcome) {
117118
DropOutcome.done => null,
118119
DropOutcome.alreadyOnHome => 'Already on Home',
119120
DropOutcome.rejected => 'Drop folders on an empty spot',
121+
DropOutcome.noRoom => 'Not enough room for this widget',
120122
};
121123
if (text == null) return;
122124
ScaffoldMessenger.maybeOf(context)?.showSnackBar(
@@ -143,28 +145,50 @@ class _HomePage extends StatelessWidget {
143145
child: LayoutBuilder(
144146
builder: (context, c) {
145147
final cw = c.maxWidth / cols;
148+
final ch = c.maxHeight / rows;
146149
final iconSize = math.min(cw * 0.6, 58.0);
147-
return Column(
150+
return Stack(
148151
children: [
149-
for (var r = 0; r < rows; r++)
150-
Expanded(
151-
child: Row(
152-
children: [
153-
for (var col = 0; col < cols; col++)
154-
Expanded(
155-
child: _cell(
156-
context,
157-
model,
158-
settings,
159-
items[r * cols + col],
160-
r * cols + col,
161-
cw,
162-
iconSize,
163-
),
152+
Positioned.fill(
153+
child: Column(
154+
children: [
155+
for (var r = 0; r < rows; r++)
156+
Expanded(
157+
child: Row(
158+
children: [
159+
for (var col = 0; col < cols; col++)
160+
Expanded(
161+
child: _cell(
162+
context,
163+
model,
164+
settings,
165+
items[r * cols + col],
166+
r * cols + col,
167+
cw,
168+
iconSize,
169+
),
170+
),
171+
],
164172
),
165-
],
166-
),
173+
),
174+
],
167175
),
176+
),
177+
for (var i = 0; i < items.length; i++)
178+
if (items[i] case final WidgetItem w)
179+
Positioned(
180+
key: ValueKey('widget-${w.wid}'),
181+
left: (i % cols) * cw,
182+
top: (i ~/ cols) * ch,
183+
width: w.cols * cw,
184+
height: w.rows * ch,
185+
child: HomeWidgetFrame(
186+
item: w,
187+
cellWidth: cw,
188+
cellHeight: ch,
189+
locked: settings.lockLayout,
190+
),
191+
),
168192
],
169193
);
170194
},
@@ -191,6 +215,13 @@ class _HomePage extends StatelessWidget {
191215
width: width,
192216
style: style,
193217
locked: settings.lockLayout,
218+
canDrop: (d) {
219+
final dragged = d.item;
220+
if (dragged is WidgetItem) {
221+
return model.canPlaceWidget(dragged, page, index);
222+
}
223+
return !model.slotIsWidgetPart(page, index);
224+
},
194225
onDrop: (d, _) =>
195226
_announce(context, model.slotDrop(d, Zone.home, page, index)),
196227
);
@@ -231,6 +262,7 @@ class _Dock extends StatelessWidget {
231262
style: style,
232263
locked: settings.lockLayout,
233264
showLabel: false,
265+
canDrop: (d) => d.item is! WidgetItem,
234266
onDrop: (d, _) => _announce(
235267
context,
236268
model.slotDrop(d, Zone.dock, 0, i),

0 commit comments

Comments
 (0)