Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion demo/linux/flutter/ephemeral/.plugin_symlinks/printing

This file was deleted.

120 changes: 101 additions & 19 deletions lib/src/pluto_dual_grid.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand All @@ -67,6 +69,7 @@ class PlutoDualGrid extends StatefulWidget {
this.mode = PlutoGridMode.normal,
this.onSelected,
this.display,
this.isVertical,
this.divider = const PlutoDualGridDivider(),
super.key,
});
Expand Down Expand Up @@ -97,11 +100,14 @@ class PlutoDualGridState extends State<PlutoDualGrid> {

late final StreamSubscription<PlutoGridEvent> _streamB;

late final bool isVertical;

@override
void initState() {
super.initState();

display = widget.display ?? PlutoDualGridDisplayRatio();
isVertical = widget.isVertical ?? false;
}

@override
Expand Down Expand Up @@ -209,6 +215,7 @@ class PlutoDualGridState extends State<PlutoDualGrid> {
display: display,
showDraggableDivider: widget.divider.show,
isLTR: isLTR,
isVertical: isVertical,
),
children: [
_buildGrid(
Expand All @@ -227,12 +234,19 @@ class PlutoDualGridState extends State<PlutoDualGrid> {
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();
},
Expand Down Expand Up @@ -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,
),
Expand All @@ -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;
Expand All @@ -348,6 +372,8 @@ class PlutoDualGridLayoutDelegate extends MultiChildLayoutDelegate {

final bool isLTR;

final bool isVertical;

@override
void performLayout(Size size) {
final BoxConstraints constrains = BoxConstraints(
Expand All @@ -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;
Expand All @@ -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));
}
}
}

Expand All @@ -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;
}
Expand All @@ -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 {
Expand All @@ -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 {
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
8 changes: 4 additions & 4 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -13,13 +13,13 @@ 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:
flutter_test:
sdk: flutter
mockito: ^5.4.4
build_runner: ^2.4.8
flutter_lints: ^3.0.1
flutter_lints: ^5.0.0