1- // lib/features/workspace/workspace_desktop.dart
2-
31import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh;
42import 'package:cookethflow/features/workspace/pages/canvas_page.dart' ;
3+ import 'package:cookethflow/features/workspace/providers/canvas_provider.dart' ;
54import 'package:cookethflow/features/workspace/providers/workspace_provider.dart' ;
65import 'package:cookethflow/features/workspace/widgets/export_project_button.dart' ;
6+ import 'package:cookethflow/features/workspace/widgets/node_editing_toolbox.dart' ;
77import 'package:cookethflow/features/workspace/widgets/toolbar.dart' ;
88import 'package:cookethflow/features/workspace/widgets/undo_redo_button.dart' ;
99import 'package:cookethflow/features/workspace/widgets/workspace_drawer.dart' ;
1010import 'package:cookethflow/features/workspace/widgets/zoom_control_button.dart' ;
1111import 'package:flutter/material.dart' ;
1212import 'package:provider/provider.dart' ;
1313import 'package:flutter_screenutil/flutter_screenutil.dart' ;
14- import 'package:cookethflow/features/workspace/widgets/object_text_editor.dart' ; // NEW: Import ObjectTextEditor
14+ import 'package:cookethflow/features/workspace/widgets/object_text_editor.dart' ;
15+ import 'package:vector_math/vector_math_64.dart' as vector_math;
1516
1617class WorkspaceDesktop extends StatelessWidget {
1718 const WorkspaceDesktop ({super .key});
@@ -20,43 +21,75 @@ class WorkspaceDesktop extends StatelessWidget {
2021 Widget build (BuildContext context) {
2122 bool isDesktop =
2223 rh.ResponsiveLayoutHelper .getDeviceType (context) ==
23- rh.DeviceType .desktop;
24-
25- return Consumer <WorkspaceProvider >(
26- builder: (context,provider,child) {
27- return Scaffold (
28- backgroundColor: provider.currentWorkspaceColor,
29- body: Padding (
30- padding: EdgeInsets .symmetric (horizontal: 40. w, vertical: 40. h),
31- child: Stack (
32- children: [
33- // 1. CanvasPage - This should be the base layer, filling the entire available space
34- const CanvasPage (),
35-
36- const WorkspaceDrawer (),
37- SizedBox (width: 20. w),
38- // Undo/Redo Controls Container
39- Positioned (top: 0 ,left: 0.21 .sw,child: UndoRedoButton ()),
40- // Export project button
41- Positioned (top: 0 ,right: 0.001 .sw,child: ExportProjectButton ()),
42-
43- Positioned (right: 0 ,top: 0.15 .sh,child: ToolBar ()),
44-
45- // 3. Zoom Control - Positioned at the bottom right of the Stack
46- Positioned (
47- bottom: 0. h, // Aligns to the bottom edge of the Stack
48- right: 0. w, // Aligns to the right edge of the Stack
49- child: ZoomControlButton (),
50- ),
51-
52- // NEW: ObjectTextEditor positioned here to overlay everything else
53- // Its visibility and position are controlled by ObjectTextEditor widget itself
54- const ObjectTextEditor (),
55- ],
56- ),
24+ rh.DeviceType .desktop;
25+
26+ return Consumer <WorkspaceProvider >(builder: (context, provider, child) {
27+ return Scaffold (
28+ backgroundColor: provider.currentWorkspaceColor,
29+ body: Padding (
30+ padding: EdgeInsets .symmetric (horizontal: 40. w, vertical: 40. h),
31+ child: Stack (
32+ clipBehavior: Clip .none, // Allow toolbox to render outside the Stack's bounds
33+ children: [
34+ const CanvasPage (),
35+
36+ const WorkspaceDrawer (),
37+ SizedBox (width: 20. w),
38+ Positioned (top: 0 , left: 0.21 .sw, child: UndoRedoButton ()),
39+ Positioned (top: 0 , right: 0.001 .sw, child: ExportProjectButton ()),
40+
41+ Positioned (right: 0 , top: 0.15 .sh, child: ToolBar ()),
42+
43+ Positioned (
44+ bottom: 0. h,
45+ right: 0. w,
46+ child: ZoomControlButton (),
47+ ),
48+
49+ // The new Object Editing Toolbox, positioned dynamically
50+ Consumer2 <WorkspaceProvider , CanvasProvider >(
51+ builder: (context, workspaceProvider, canvasProvider, child) {
52+ // Listen for changes in the transformation to update position
53+ return ListenableBuilder (
54+ listenable: canvasProvider.transformationController,
55+ builder: (context, child) {
56+ if (workspaceProvider.shouldShowObjectToolbox) {
57+ final selectedObject = workspaceProvider.canvasObjects[
58+ workspaceProvider.currentlySelectedObjectId! ]! ;
59+ final objectBounds = selectedObject.getBounds ();
60+ final matrix =
61+ canvasProvider.transformationController.value;
62+
63+ // Use the matrix to find the object's top-center position on the screen
64+ final transformedTopCenter = matrix.transform3 (
65+ vector_math.Vector3 (objectBounds.topCenter.dx,
66+ objectBounds.topCenter.dy, 0 ));
67+
68+ // Calculate the screen position
69+ final screenPosition = Offset (
70+ transformedTopCenter.x, transformedTopCenter.y);
71+
72+ // Define an approximate size for the toolbox to help with centering.
73+ const double toolboxWidth = 240 ;
74+ const double toolboxHeight = 48 ;
75+
76+ return Positioned (
77+ left: screenPosition.dx - (toolboxWidth / 2 ),
78+ top: screenPosition.dy - toolboxHeight - 15 , // 15px margin above object
79+ child: const NodeEditingToolbox (),
80+ );
81+ }
82+ return const SizedBox .shrink ();
83+ },
84+ );
85+ },
86+ ),
87+
88+ const ObjectTextEditor (),
89+ ],
5790 ),
58- );
59- }
60- );
91+ ),
92+ );
93+ } );
6194 }
6295}
0 commit comments