@@ -11,6 +11,7 @@ import 'package:launch_r/widgets/edge_flipper.dart';
1111import 'package:launch_r/widgets/keep_alive.dart' ;
1212import 'package:launch_r/widgets/launcher_cell.dart' ;
1313import 'package:launch_r/widgets/page_dots.dart' ;
14+ import 'package:launch_r/widgets/home_widget_frame.dart' ;
1415
1516class 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