feat: initial Pyramid project scaffold
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pyramid/features/rooms/rooms_page.dart';
|
||||
|
||||
final sidebarWidthProvider = StateProvider<double>((ref) => 280);
|
||||
|
||||
class PanelLayout extends ConsumerWidget {
|
||||
final Widget mainContent;
|
||||
const PanelLayout({super.key, required this.mainContent});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final sidebarWidth = ref.watch(sidebarWidthProvider);
|
||||
|
||||
return Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: sidebarWidth,
|
||||
child: const RoomsPage(),
|
||||
),
|
||||
_ResizeDivider(
|
||||
onDrag: (delta) {
|
||||
final notifier = ref.read(sidebarWidthProvider.notifier);
|
||||
notifier.state =
|
||||
(notifier.state + delta).clamp(180.0, 480.0);
|
||||
},
|
||||
),
|
||||
Expanded(child: mainContent),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _ResizeDivider extends StatelessWidget {
|
||||
final ValueChanged<double> onDrag;
|
||||
const _ResizeDivider({required this.onDrag});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onHorizontalDragUpdate: (d) => onDrag(d.delta.dx),
|
||||
child: MouseRegion(
|
||||
cursor: SystemMouseCursors.resizeColumn,
|
||||
child: Container(
|
||||
width: 6,
|
||||
color: Theme.of(context).dividerColor,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:pyramid/layout/panel_layout.dart';
|
||||
|
||||
class ShellPage extends ConsumerWidget {
|
||||
final Widget child;
|
||||
const ShellPage({super.key, required this.child});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final isWide = MediaQuery.sizeOf(context).width >= 700;
|
||||
|
||||
return Scaffold(
|
||||
body: isWide
|
||||
? PanelLayout(mainContent: child)
|
||||
: child,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user