diff --git a/demo/linux/flutter/ephemeral/.plugin_symlinks/printing b/demo/linux/flutter/ephemeral/.plugin_symlinks/printing deleted file mode 120000 index 54228d131..000000000 --- a/demo/linux/flutter/ephemeral/.plugin_symlinks/printing +++ /dev/null @@ -1 +0,0 @@ -C:/Users/manek/AppData/Local/Pub/Cache/hosted/pub.dev/printing-5.9.3/ \ No newline at end of file diff --git a/demo/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux b/demo/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux index e433ea04f..a2af0f9da 120000 --- a/demo/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux +++ b/demo/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux @@ -1 +1 @@ -C:/Users/manek/AppData/Local/Pub/Cache/hosted/pub.dev/url_launcher_linux-3.0.2/ \ No newline at end of file +C:/Users/majona/AppData/Local/Pub/Cache/hosted/pub.dev/url_launcher_linux-3.2.1/ \ No newline at end of file diff --git a/lib/src/pluto_dual_grid.dart b/lib/src/pluto_dual_grid.dart index ed30d7b35..6c658e602 100644 --- a/lib/src/pluto_dual_grid.dart +++ b/lib/src/pluto_dual_grid.dart @@ -47,6 +47,8 @@ class PlutoDualGrid extends StatefulWidget { final PlutoDualOnSelectedEventCallback? onSelected; + final bool? isVertical; + /// [PlutoDualGridDisplayRatio] /// Set the width of the two grids by specifying the ratio of the left grid. /// 0.5 is 5(left grid):5(right grid). @@ -67,6 +69,7 @@ class PlutoDualGrid extends StatefulWidget { this.mode = PlutoGridMode.normal, this.onSelected, this.display, + this.isVertical, this.divider = const PlutoDualGridDivider(), super.key, }); @@ -97,11 +100,14 @@ class PlutoDualGridState extends State { late final StreamSubscription _streamB; + late final bool isVertical; + @override void initState() { super.initState(); display = widget.display ?? PlutoDualGridDisplayRatio(); + isVertical = widget.isVertical ?? false; } @override @@ -209,6 +215,7 @@ class PlutoDualGridState extends State { display: display, showDraggableDivider: widget.divider.show, isLTR: isLTR, + isVertical: isVertical, ), children: [ _buildGrid( @@ -227,12 +234,19 @@ class PlutoDualGridState extends State { final RenderBox object = context.findRenderObject() as RenderBox; - display.offset = object - .globalToLocal(Offset( - details.globalPosition.dx, - details.globalPosition.dy, - )) - .dx; + display.offset = isVertical + ? object + .globalToLocal(Offset( + details.globalPosition.dx, + details.globalPosition.dy, + )) + .dy + : object + .globalToLocal(Offset( + details.globalPosition.dx, + details.globalPosition.dy, + )) + .dx; resizeNotifier.resize(); }, @@ -306,15 +320,24 @@ class PlutoDualGridDividerWidgetState onHorizontalDragStart: onHorizontalDragStart, onHorizontalDragUpdate: onHorizontalDragUpdate, onHorizontalDragEnd: onHorizontalDragEnd, + onVerticalDragStart: onHorizontalDragStart, + onVerticalDragUpdate: onHorizontalDragUpdate, + onVerticalDragEnd: onHorizontalDragEnd, child: ColoredBox( color: isDragging ? widget.draggingColor : widget.backgroundColor, child: Stack( children: [ Positioned( - top: (size.maxHeight / 2) - 18, - left: -4, + top: size.maxHeight > size.maxWidth + ? (size.maxHeight / 2) - 18 + : -4, + left: size.maxHeight > size.maxWidth + ? -4 + : (size.maxWidth / 2) - 18, child: Icon( - Icons.drag_indicator, + size.maxHeight > size.maxWidth + ? Icons.drag_indicator + : Icons.drag_handle, color: widget.indicatorColor, size: 18, ), @@ -340,6 +363,7 @@ class PlutoDualGridLayoutDelegate extends MultiChildLayoutDelegate { required this.display, required this.showDraggableDivider, required this.isLTR, + required this.isVertical, }) : super(relayout: notifier); final PlutoDualGridDisplay display; @@ -348,6 +372,8 @@ class PlutoDualGridLayoutDelegate extends MultiChildLayoutDelegate { final bool isLTR; + final bool isVertical; + @override void performLayout(Size size) { final BoxConstraints constrains = BoxConstraints( @@ -366,6 +392,8 @@ class PlutoDualGridLayoutDelegate extends MultiChildLayoutDelegate { : display.offset! - dividerHalf : display.gridAWidth(constrains) - dividerHalf; double gridBWidth = size.width - gridAWidth - dividerWidth; + double gridAHeight = size.height; + double gridBHeight = size.height; if (!isLTR) { final savedGridBWidth = gridBWidth; @@ -385,43 +413,78 @@ class PlutoDualGridLayoutDelegate extends MultiChildLayoutDelegate { gridBWidth = size.width - dividerWidth; } + if (isVertical) { + gridAWidth = size.width; + gridBWidth = size.width; + gridAHeight = showDraggableDivider + ? display.offset == null + ? display.gridAHeight(constrains) - dividerHalf + : display.offset! - dividerHalf + : display.gridAHeight(constrains) - dividerHalf; + gridBHeight = size.height - gridAHeight - dividerWidth; + + if (gridAHeight < 0) { + gridAHeight = 0; + } else if (gridAHeight > size.height - dividerWidth) { + gridAHeight = size.height - dividerWidth; + } + + if (gridBHeight < 0) { + gridBHeight = 0; + } else if (gridBHeight > size.height - dividerWidth) { + gridBHeight = size.height - dividerWidth; + } + } + if (hasChild(_PlutoDualGridId.gridA)) { layoutChild( _PlutoDualGridId.gridA, BoxConstraints.tight( - Size(gridAWidth, size.height), + Size(gridAWidth, gridAHeight), ), ); final double posX = isLTR ? 0 : gridBWidth + dividerWidth; - - positionChild(_PlutoDualGridId.gridA, Offset(posX, 0)); + if (isVertical) { + positionChild(_PlutoDualGridId.gridA, const Offset(0, 0)); + } else { + positionChild(_PlutoDualGridId.gridA, Offset(posX, 0)); + } } if (hasChild(_PlutoDualGridId.divider)) { layoutChild( _PlutoDualGridId.divider, BoxConstraints.tight( - Size(PlutoDualGrid.dividerWidth, size.height), + isVertical + ? Size(size.width, PlutoDualGrid.dividerWidth) + : Size(PlutoDualGrid.dividerWidth, size.height), ), ); final double posX = isLTR ? gridAWidth : gridBWidth; - - positionChild(_PlutoDualGridId.divider, Offset(posX, 0)); + if (isVertical) { + positionChild(_PlutoDualGridId.divider, Offset(0, gridAHeight)); + } else { + positionChild(_PlutoDualGridId.divider, Offset(posX, 0)); + } } if (hasChild(_PlutoDualGridId.gridB)) { layoutChild( _PlutoDualGridId.gridB, BoxConstraints.tight( - Size(gridBWidth, size.height), + Size(gridBWidth, gridBHeight), ), ); final double posX = isLTR ? gridAWidth + dividerWidth : 0; - - positionChild(_PlutoDualGridId.gridB, Offset(posX, 0)); + if (isVertical) { + positionChild( + _PlutoDualGridId.gridB, Offset(0, gridAHeight + dividerWidth)); + } else { + positionChild(_PlutoDualGridId.gridB, Offset(posX, 0)); + } } } @@ -444,8 +507,9 @@ class PlutoDualOnSelectedEvent { abstract class PlutoDualGridDisplay { double gridAWidth(BoxConstraints size); - + double gridAHeight(BoxConstraints size); double gridBWidth(BoxConstraints size); + double gridBHeight(BoxConstraints size); double? offset; } @@ -465,6 +529,12 @@ class PlutoDualGridDisplayRatio implements PlutoDualGridDisplay { @override double gridBWidth(BoxConstraints size) => size.maxWidth * (1 - ratio); + + @override + double gridAHeight(BoxConstraints size) => size.maxHeight * ratio; + + @override + double gridBHeight(BoxConstraints size) => size.maxHeight * (1 - ratio); } class PlutoDualGridDisplayFixedAndExpanded implements PlutoDualGridDisplay { @@ -482,6 +552,12 @@ class PlutoDualGridDisplayFixedAndExpanded implements PlutoDualGridDisplay { @override double gridBWidth(BoxConstraints size) => size.maxWidth - width; + + @override + double gridAHeight(BoxConstraints size) => width; + + @override + double gridBHeight(BoxConstraints size) => size.maxHeight - width; } class PlutoDualGridDisplayExpandedAndFixed implements PlutoDualGridDisplay { @@ -499,6 +575,12 @@ class PlutoDualGridDisplayExpandedAndFixed implements PlutoDualGridDisplay { @override double gridBWidth(BoxConstraints size) => width; + + @override + double gridAHeight(BoxConstraints size) => size.maxHeight - width; + + @override + double gridBHeight(BoxConstraints size) => width; } class PlutoDualGridProps { diff --git a/packages/pluto_grid_export/example/macos/Flutter/GeneratedPluginRegistrant.swift b/packages/pluto_grid_export/example/macos/Flutter/GeneratedPluginRegistrant.swift index 416ef8457..9c4efdd9c 100644 --- a/packages/pluto_grid_export/example/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/packages/pluto_grid_export/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,7 +6,7 @@ import FlutterMacOS import Foundation import file_saver -import path_provider_macos +import path_provider_foundation import printing func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { diff --git a/pubspec.yaml b/pubspec.yaml index 942a9fc0e..fac7d6f56 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: pluto_grid description: PlutoGrid is a dataGrid that can be controlled by the keyboard on desktop and web. Of course, it works well on Android and IOS. (DataGrid, DataTable, Data Grid, Data Table, Sticky) -version: 8.0.0 +version: 8.0.1 homepage: https://pluto.weblaze.dev repository: https://github.com/bosskmk/pluto_grid @@ -13,8 +13,8 @@ dependencies: sdk: flutter # Follows the intl version included in Flutter. # https://github.com/flutter/flutter/blob/84a1e904f44f9b0e9c4510138010edcc653163f8/packages/flutter_localizations/pubspec.yaml#L11 - intl: ^0.19.0 - rxdart: ^0.27.7 + intl: ^0.20.2 + rxdart: ^0.28.0 collection: ^1.18.0 dev_dependencies: @@ -22,4 +22,4 @@ dev_dependencies: sdk: flutter mockito: ^5.4.4 build_runner: ^2.4.8 - flutter_lints: ^3.0.1 + flutter_lints: ^5.0.0