-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow dragging to reorder tabs to the last position. #35
Allow dragging tabs between different TabbedView instances. #32
- Loading branch information
1 parent
f8c169a
commit be6f423
Showing
25 changed files
with
566 additions
and
417 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -169,4 +169,4 @@ packages: | |
version: "2.1.4" | ||
sdks: | ||
dart: ">=3.0.0-0 <4.0.0" | ||
flutter: ">=1.17.0" | ||
flutter: ">=2.17.0" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
import 'package:tabbed_view/src/tab_data.dart'; | ||
import 'package:tabbed_view/src/tabbed_view_controller.dart'; | ||
|
||
class DraggableData { | ||
DraggableData(this.controller, this.tabData); | ||
|
||
final TabbedViewController controller; | ||
final TabData tabData; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
import 'dart:collection'; | ||
|
||
import 'package:flutter/material.dart'; | ||
import 'package:meta/meta.dart'; | ||
|
||
/// Holds the hidden tab indexes. | ||
@internal | ||
class HiddenTabs extends ChangeNotifier { | ||
List<int> _indexes = []; | ||
|
||
bool _hasHiddenTabs = false; | ||
bool get hasHiddenTabs => _hasHiddenTabs; | ||
|
||
List<int> get indexes { | ||
_indexes.sort(); | ||
return UnmodifiableListView(_indexes); | ||
} | ||
|
||
void update(List<int> hiddenIndexes) { | ||
_indexes = hiddenIndexes; | ||
bool hasHiddenTabs = _indexes.isNotEmpty; | ||
if (_hasHiddenTabs != hasHiddenTabs) { | ||
_hasHiddenTabs = hasHiddenTabs; | ||
Future.microtask(() => notifyListeners()); | ||
} | ||
} | ||
} |
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:meta/meta.dart'; | ||
import 'package:tabbed_view/src/internal/tabs_area/hidden_tabs.dart'; | ||
import 'package:tabbed_view/src/internal/tabbed_view_provider.dart'; | ||
import 'package:tabbed_view/src/tab_button.dart'; | ||
import 'package:tabbed_view/src/tab_button_widget.dart'; | ||
import 'package:tabbed_view/src/tab_data.dart'; | ||
import 'package:tabbed_view/src/tabbed_view_menu_item.dart'; | ||
import 'package:tabbed_view/src/theme/tabbed_view_theme_data.dart'; | ||
import 'package:tabbed_view/src/theme/tabs_area_theme_data.dart'; | ||
import 'package:tabbed_view/src/theme/theme_widget.dart'; | ||
|
||
/// Area for buttons like the hidden tabs menu button. | ||
@internal | ||
class TabsAreaButtonsWidget extends StatelessWidget { | ||
final TabbedViewProvider provider; | ||
final HiddenTabs hiddenTabs; | ||
|
||
const TabsAreaButtonsWidget( | ||
{super.key, required this.provider, required this.hiddenTabs}); | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
final TabbedViewThemeData theme = TabbedViewTheme.of(context); | ||
final TabsAreaThemeData tabsAreaTheme = theme.tabsArea; | ||
|
||
List<TabButton> buttons = []; | ||
if (provider.tabsAreaButtonsBuilder != null) { | ||
buttons = provider.tabsAreaButtonsBuilder!( | ||
context, provider.controller.tabs.length); | ||
} | ||
if (hiddenTabs.hasHiddenTabs) { | ||
buttons.insert( | ||
0, | ||
TabButton( | ||
icon: tabsAreaTheme.menuIcon, | ||
menuBuilder: _hiddenTabsMenuBuilder)); | ||
} | ||
|
||
List<Widget> children = []; | ||
|
||
for (int i = 0; i < buttons.length; i++) { | ||
EdgeInsets? padding; | ||
if (i > 0 && tabsAreaTheme.buttonsGap > 0) { | ||
padding = EdgeInsets.only(left: tabsAreaTheme.buttonsGap); | ||
} | ||
final TabButton tabButton = buttons[i]; | ||
children.add(Container( | ||
child: TabButtonWidget( | ||
provider: provider, | ||
button: tabButton, | ||
enabled: provider.draggingTabIndex == null, | ||
normalColor: tabsAreaTheme.normalButtonColor, | ||
hoverColor: tabsAreaTheme.hoverButtonColor, | ||
disabledColor: tabsAreaTheme.disabledButtonColor, | ||
normalBackground: tabsAreaTheme.normalButtonBackground, | ||
hoverBackground: tabsAreaTheme.hoverButtonBackground, | ||
disabledBackground: tabsAreaTheme.disabledButtonBackground, | ||
iconSize: tabButton.iconSize != null | ||
? tabButton.iconSize! | ||
: tabsAreaTheme.buttonIconSize, | ||
themePadding: tabsAreaTheme.buttonPadding), | ||
padding: padding)); | ||
} | ||
|
||
Widget buttonsArea = Row(children: children); | ||
|
||
EdgeInsetsGeometry? margin; | ||
if (tabsAreaTheme.buttonsOffset > 0) { | ||
margin = EdgeInsets.only(left: tabsAreaTheme.buttonsOffset); | ||
} | ||
|
||
if (children.isNotEmpty && | ||
(tabsAreaTheme.buttonsAreaDecoration != null || | ||
tabsAreaTheme.buttonsAreaPadding != null || | ||
margin != null)) { | ||
buttonsArea = Container( | ||
child: buttonsArea, | ||
decoration: tabsAreaTheme.buttonsAreaDecoration, | ||
padding: tabsAreaTheme.buttonsAreaPadding, | ||
margin: margin); | ||
} | ||
return buttonsArea; | ||
} | ||
|
||
/// Builder for hidden tabs menu. | ||
List<TabbedViewMenuItem> _hiddenTabsMenuBuilder(BuildContext context) { | ||
List<TabbedViewMenuItem> list = []; | ||
for (int index in hiddenTabs.indexes) { | ||
TabData tab = provider.controller.tabs[index]; | ||
list.add(TabbedViewMenuItem( | ||
text: tab.text, | ||
onSelection: () => provider.controller.selectedIndex = index)); | ||
} | ||
return list; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:meta/meta.dart'; | ||
import 'package:tabbed_view/src/internal/tabbed_view_provider.dart'; | ||
import 'package:tabbed_view/src/internal/tabs_area/drop_tab_widget.dart'; | ||
import 'package:tabbed_view/src/internal/tabs_area/hidden_tabs.dart'; | ||
import 'package:tabbed_view/src/internal/tabs_area/tabs_area_buttons_widget.dart'; | ||
|
||
@internal | ||
class TabsAreaCorner extends StatelessWidget { | ||
final TabbedViewProvider provider; | ||
final HiddenTabs hiddenTabs; | ||
|
||
const TabsAreaCorner( | ||
{super.key, required this.provider, required this.hiddenTabs}); | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
return ListenableBuilder(listenable: hiddenTabs, builder: _builder); | ||
} | ||
|
||
Widget _builder(BuildContext context, Widget? child) { | ||
return DropTabWidget( | ||
provider: provider, | ||
newIndex: provider.controller.length, | ||
child: Container( | ||
padding: EdgeInsets.only(left: DropTabWidget.dropWidth), | ||
child: Row( | ||
children: [ | ||
TabsAreaButtonsWidget( | ||
provider: provider, hiddenTabs: hiddenTabs) | ||
], | ||
mainAxisAlignment: MainAxisAlignment.end, | ||
crossAxisAlignment: CrossAxisAlignment.end))); | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
lib/src/internal/tabs_area/tabs_area_layout_parent_data.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import 'package:flutter/rendering.dart'; | ||
import 'package:meta/meta.dart'; | ||
|
||
/// Parent data for [_TabsAreaLayoutRenderBox] class. | ||
@internal | ||
class TabsAreaLayoutParentData extends ContainerBoxParentData<RenderBox> { | ||
bool visible = false; | ||
bool selected = false; | ||
|
||
double leftBorderHeight = 0; | ||
double rightBorderHeight = 0; | ||
|
||
/// Resets all values. | ||
void reset() { | ||
visible = false; | ||
selected = false; | ||
|
||
leftBorderHeight = 0; | ||
rightBorderHeight = 0; | ||
} | ||
} |
Oops, something went wrong.