From 271afb9252656093eb132e7a815d80295590d62b Mon Sep 17 00:00:00 2001 From: Donove_HuWT Date: Fri, 24 Jun 2022 18:12:36 +0800 Subject: [PATCH 1/5] feat pluto_grid_insert_column_event.dart --- lib/pluto_grid.dart | 1 + .../event/pluto_grid_insert_column_event.dart | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 lib/src/manager/event/pluto_grid_insert_column_event.dart diff --git a/lib/pluto_grid.dart b/lib/pluto_grid.dart index f794d70d9..03edf41d8 100644 --- a/lib/pluto_grid.dart +++ b/lib/pluto_grid.dart @@ -19,6 +19,7 @@ export './src/manager/event/pluto_grid_drag_column_event.dart'; export './src/manager/event/pluto_grid_drag_rows_event.dart'; export './src/manager/event/pluto_grid_event.dart'; export './src/manager/event/pluto_grid_scroll_update_event.dart'; +export './src/manager/event/pluto_grid_insert_column_event.dart'; export './src/manager/pluto_grid_event_manager.dart'; export './src/manager/pluto_grid_key_manager.dart'; export './src/manager/pluto_grid_state_manager.dart'; diff --git a/lib/src/manager/event/pluto_grid_insert_column_event.dart b/lib/src/manager/event/pluto_grid_insert_column_event.dart new file mode 100644 index 000000000..b8fa1c44a --- /dev/null +++ b/lib/src/manager/event/pluto_grid_insert_column_event.dart @@ -0,0 +1,23 @@ +import 'package:pluto_grid/pluto_grid.dart'; + +class PlutoGridInsertColumnEvent extends PlutoGridEvent { + final int index; + + PlutoGridInsertColumnEvent({ + required this.index, + }) : super( + type: PlutoGridEventType.debounce, + duration: const Duration(milliseconds: debounceMilliseconds), + ); + + static const int debounceMilliseconds = 300; + + static const int resumeMilliseconds = debounceMilliseconds + 100; + + @override + void handler(PlutoGridStateManager? stateManager) async { + if (stateManager!.eventManager!.subscription.isPaused) { + return; + } + } +} From 431f59ad23c994db0ec2980e0be9136868950479 Mon Sep 17 00:00:00 2001 From: Donove_HuWT Date: Fri, 24 Jun 2022 18:15:11 +0800 Subject: [PATCH 2/5] feat show_column_menu.dart PlutoGridColumnMenuItem add `insertToLeft`,`insertToRight` Enum; refactor showColumnMenu move "frozen menu item" to bottom, because it not commonly used feat pluto_grid_configuration.dart add `insertToLeft`,`insertToRight` locale text (only english and chinese !!) --- lib/src/helper/show_column_menu.dart | 47 +++++++++++++++++++-------- lib/src/pluto_grid_configuration.dart | 18 ++++++++++ 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/lib/src/helper/show_column_menu.dart b/lib/src/helper/show_column_menu.dart index 0b0a85df7..68311c094 100644 --- a/lib/src/helper/show_column_menu.dart +++ b/lib/src/helper/show_column_menu.dart @@ -54,31 +54,23 @@ Future? showColumnMenu({ position: RelativeRect.fromRect( position & const Size(40, 40), Offset.zero & overlay.size), items: [ - if (column!.frozen.isFrozen == true) + if (column!.enableInsertColumn == true) ...[ _buildMenuItem( - value: PlutoGridColumnMenuItem.unfreeze, + value: PlutoGridColumnMenuItem.insertToLeft, child: _buildTextItem( - text: localeText.unfreezeColumn, + text: localeText.insertToLeft, textColor: textColor, ), ), - if (column.frozen.isFrozen != true) ...[ _buildMenuItem( - value: PlutoGridColumnMenuItem.freezeToLeft, + value: PlutoGridColumnMenuItem.insertToRight, child: _buildTextItem( - text: localeText.freezeColumnToLeft, - textColor: textColor, - ), - ), - _buildMenuItem( - value: PlutoGridColumnMenuItem.freezeToRight, - child: _buildTextItem( - text: localeText.freezeColumnToRight, + text: localeText.insertToRight, textColor: textColor, ), ), + const PopupMenuDivider(), ], - const PopupMenuDivider(), _buildMenuItem( value: PlutoGridColumnMenuItem.autoFit, child: _buildTextItem( @@ -123,12 +115,39 @@ Future? showColumnMenu({ enabled: stateManager.hasFilter, ), ], + const PopupMenuDivider(), + if (column.frozen.isFrozen == true) + _buildMenuItem( + value: PlutoGridColumnMenuItem.unfreeze, + child: _buildTextItem( + text: localeText.unfreezeColumn, + textColor: textColor, + ), + ), + if (column.frozen.isFrozen != true) ...[ + _buildMenuItem( + value: PlutoGridColumnMenuItem.freezeToLeft, + child: _buildTextItem( + text: localeText.freezeColumnToLeft, + textColor: textColor, + ), + ), + _buildMenuItem( + value: PlutoGridColumnMenuItem.freezeToRight, + child: _buildTextItem( + text: localeText.freezeColumnToRight, + textColor: textColor, + ), + ), + ], ], ); } /// Items in the context menu on the right side of the column enum PlutoGridColumnMenuItem { + insertToLeft, + insertToRight, unfreeze, freezeToLeft, freezeToRight, diff --git a/lib/src/pluto_grid_configuration.dart b/lib/src/pluto_grid_configuration.dart index 5ef2f229d..6d6c774b7 100644 --- a/lib/src/pluto_grid_configuration.dart +++ b/lib/src/pluto_grid_configuration.dart @@ -311,6 +311,8 @@ class PlutoGridConfiguration { class PlutoGridLocaleText { // Column menu + final String insertToLeft; + final String insertToRight; final String unfreezeColumn; final String freezeColumnToLeft; final String freezeColumnToRight; @@ -355,6 +357,8 @@ class PlutoGridLocaleText { const PlutoGridLocaleText({ // Column menu + this.insertToLeft = 'Insert to left', + this.insertToRight = 'Insert to right', this.unfreezeColumn = 'Unfreeze', this.freezeColumnToLeft = 'Freeze to left', this.freezeColumnToRight = 'Freeze to right', @@ -395,6 +399,8 @@ class PlutoGridLocaleText { const PlutoGridLocaleText.china({ // Column menu + this.insertToLeft = '向左插入列', + this.insertToRight = '向右插入列', this.unfreezeColumn = '解冻', this.freezeColumnToLeft = '冻结至左侧', this.freezeColumnToRight = '冻结至右侧', @@ -435,6 +441,8 @@ class PlutoGridLocaleText { const PlutoGridLocaleText.korean({ // Column menu + this.insertToLeft = 'Insert to left', + this.insertToRight = 'Insert to right', this.unfreezeColumn = '고정 해제', this.freezeColumnToLeft = '왼쪽 고정', this.freezeColumnToRight = '오른쪽 고정', @@ -475,6 +483,8 @@ class PlutoGridLocaleText { const PlutoGridLocaleText.russian({ // Column menu + this.insertToLeft = 'Insert to left', + this.insertToRight = 'Insert to right', this.unfreezeColumn = 'Открепить', this.freezeColumnToLeft = 'Закрепить слева', this.freezeColumnToRight = 'Закрепить справа', @@ -515,6 +525,8 @@ class PlutoGridLocaleText { const PlutoGridLocaleText.czech({ // Column menu + this.insertToLeft = 'Insert to left', + this.insertToRight = 'Insert to right', this.unfreezeColumn = 'Uvolnit', this.freezeColumnToLeft = 'Ukotvit vlevo', this.freezeColumnToRight = 'Ukotvit vpravo', @@ -555,6 +567,8 @@ class PlutoGridLocaleText { const PlutoGridLocaleText.brazilianPortuguese({ // Column menu + this.insertToLeft = 'Insert to left', + this.insertToRight = 'Insert to right', this.unfreezeColumn = 'Descongelar', this.freezeColumnToLeft = 'Congelar à esquerda', this.freezeColumnToRight = 'Congelar à direita', @@ -595,6 +609,8 @@ class PlutoGridLocaleText { const PlutoGridLocaleText.spanish({ // Column menu + this.insertToLeft = 'Insert to left', + this.insertToRight = 'Insert to right', this.unfreezeColumn = 'Descongelar', this.freezeColumnToLeft = 'Congelar a la izquierda', this.freezeColumnToRight = 'Congelar a la derecha', @@ -635,6 +651,8 @@ class PlutoGridLocaleText { const PlutoGridLocaleText.persian({ // Column menu + this.insertToLeft = 'Insert to left', + this.insertToRight = 'Insert to right', this.unfreezeColumn = 'جدا کردن', this.freezeColumnToLeft = 'چسباندن به چپ', this.freezeColumnToRight = 'چسباندن به راست', From 6f9497dbd5b14121d4fd0581a0f5fb72422d650e Mon Sep 17 00:00:00 2001 From: Donove_HuWT Date: Fri, 24 Jun 2022 18:16:31 +0800 Subject: [PATCH 3/5] feat pluto_column_title.dart emit PlutoGridColumnMenuItem.insertToLeft and insertToRight event --- lib/src/ui/columns/pluto_column_title.dart | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/src/ui/columns/pluto_column_title.dart b/lib/src/ui/columns/pluto_column_title.dart index c377bc982..cd9f37598 100644 --- a/lib/src/ui/columns/pluto_column_title.dart +++ b/lib/src/ui/columns/pluto_column_title.dart @@ -30,14 +30,27 @@ class PlutoColumnTitleState extends State { bool _isPointMoving = false; void _showContextMenu(BuildContext context, Offset position) async { - final PlutoGridColumnMenuItem? selectedMenu = await showColumnMenu( + final PlutoGridColumnMenuItem? selectedMenu = (await showColumnMenu( context: context, position: position, stateManager: widget.stateManager, column: widget.column, - ); + )); + if (selectedMenu == null) return; switch (selectedMenu) { + case PlutoGridColumnMenuItem.insertToLeft: + final columnIdx = selectedMenu.index; + widget.stateManager.eventManager?.addEvent(PlutoGridInsertColumnEvent( + index: columnIdx, + )); + break; + case PlutoGridColumnMenuItem.insertToRight: + final columnIdx = selectedMenu.index + 1; + widget.stateManager.eventManager?.addEvent(PlutoGridInsertColumnEvent( + index: columnIdx, + )); + break; case PlutoGridColumnMenuItem.unfreeze: widget.stateManager .toggleFrozenColumn(widget.column.key, PlutoColumnFrozen.none); From a16d974dd3f634e7a08ae8a3bb8e24ce465523c2 Mon Sep 17 00:00:00 2001 From: Donove_HuWT Date: Fri, 24 Jun 2022 18:17:00 +0800 Subject: [PATCH 4/5] feat pluto_column.dart PlutoColumn add `enableInsertColumn` field --- lib/src/model/pluto_column.dart | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/src/model/pluto_column.dart b/lib/src/model/pluto_column.dart index 933c70281..6bdf45876 100644 --- a/lib/src/model/pluto_column.dart +++ b/lib/src/model/pluto_column.dart @@ -115,6 +115,30 @@ class PlutoColumn { /// Entering the Enter key or tapping the cell enters the Editing mode. bool? enableEditingMode; + /// You can insert columns on [PlutoGridInsertColumnEvent] + /// ```dart + /// PlutoGrid( + /// // ... + /// onLoaded: (PlutoGridOnLoadedEvent event) { + /// stateManager = event.stateManager; + /// event.stateManager.eventManager! + /// .listener((PlutoGridEvent plutoEvent) { + /// if (plutoEvent is PlutoGridInsertColumnEvent) { + /// final columnIdx = plutoEvent.index; + /// stateManager.insertColumns(columnIdx, [ + /// PlutoColumn( + /// title: 'New Column', + /// field: 'New Field ID{${stateManager.columnIndexes.length}}', + /// type: PlutoColumnType.text(), + /// ) + /// ]); + /// } + /// }); + /// }, + /// // ... + /// ``` + bool enableInsertColumn; + /// Hide the column. bool hide; @@ -148,6 +172,7 @@ class PlutoColumn { this.enableSetColumnsMenuItem = true, this.enableAutoEditing = false, this.enableEditingMode = true, + this.enableInsertColumn = false, this.hide = false, }) : _key = UniqueKey(), _checkReadOnly = checkReadOnly; From e7b1a3dc7b77149b87a95a34b3aefa143b120f65 Mon Sep 17 00:00:00 2001 From: Donove_HuWT Date: Fri, 24 Jun 2022 18:17:21 +0800 Subject: [PATCH 5/5] feat add_and_remove_column_row_screen.dart PlutoGridInsertColumnEvent example code --- .../add_and_remove_column_row_screen.dart | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/demo/lib/screen/feature/add_and_remove_column_row_screen.dart b/demo/lib/screen/feature/add_and_remove_column_row_screen.dart index c8a188ae4..d32ff1336 100644 --- a/demo/lib/screen/feature/add_and_remove_column_row_screen.dart +++ b/demo/lib/screen/feature/add_and_remove_column_row_screen.dart @@ -50,6 +50,7 @@ class _AddAndRemoveColumnRowScreenState )), TextSpan(text: 'Id'), ]), + enableInsertColumn: true, ), PlutoColumn( title: 'Name', @@ -146,6 +147,22 @@ class _AddAndRemoveColumnRowScreenState columns: columns, rows: rows, columnGroups: columnGroups, + onLoaded: (PlutoGridOnLoadedEvent event) { + stateManager = event.stateManager; + event.stateManager.eventManager! + .listener((PlutoGridEvent plutoEvent) { + if (plutoEvent is PlutoGridInsertColumnEvent) { + final columnIdx = plutoEvent.index; + stateManager.insertColumns(columnIdx, [ + PlutoColumn( + title: 'New Column', + field: 'New Field ID{${stateManager.columnIndexes.length}}', + type: PlutoColumnType.text(), + ) + ]); + } + }); + }, onChanged: (PlutoGridOnChangedEvent event) { print(event); @@ -155,9 +172,6 @@ class _AddAndRemoveColumnRowScreenState stateManager.notifyListeners(); }, - onLoaded: (PlutoGridOnLoadedEvent event) { - stateManager = event.stateManager; - }, createHeader: (stateManager) => _Header(stateManager: stateManager), ), );