Skip to content

Commit 009b704

Browse files
committed
feat: node editor
1 parent e9e43ec commit 009b704

File tree

3 files changed

+358
-130
lines changed

3 files changed

+358
-130
lines changed
Lines changed: 73 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1-
// lib/features/workspace/workspace_desktop.dart
2-
31
import 'package:cookethflow/core/helpers/responsive_layout.helper.dart' as rh;
42
import 'package:cookethflow/features/workspace/pages/canvas_page.dart';
3+
import 'package:cookethflow/features/workspace/providers/canvas_provider.dart';
54
import 'package:cookethflow/features/workspace/providers/workspace_provider.dart';
65
import 'package:cookethflow/features/workspace/widgets/export_project_button.dart';
6+
import 'package:cookethflow/features/workspace/widgets/node_editing_toolbox.dart';
77
import 'package:cookethflow/features/workspace/widgets/toolbar.dart';
88
import 'package:cookethflow/features/workspace/widgets/undo_redo_button.dart';
99
import 'package:cookethflow/features/workspace/widgets/workspace_drawer.dart';
1010
import 'package:cookethflow/features/workspace/widgets/zoom_control_button.dart';
1111
import 'package:flutter/material.dart';
1212
import 'package:provider/provider.dart';
1313
import '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

1617
class 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

Comments
 (0)