master #81
@ -14,6 +14,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
|
|
||||||
abstract class ButtonComponent extends Component {
|
abstract class ButtonComponent extends Component {
|
||||||
@ -26,6 +27,7 @@ abstract class ButtonComponent extends Component {
|
|||||||
this.selectedStyle,
|
this.selectedStyle,
|
||||||
this.invalidStyle,
|
this.invalidStyle,
|
||||||
this.onPressed,
|
this.onPressed,
|
||||||
|
this.disabled,
|
||||||
super.themeResolver,
|
super.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
@ -51,6 +53,12 @@ abstract class ButtonComponent extends Component {
|
|||||||
/// Style of this button in invalid state
|
/// Style of this button in invalid state
|
||||||
final ButtonStyle<dynamic>? invalidStyle;
|
final ButtonStyle<dynamic>? invalidStyle;
|
||||||
|
|
||||||
/// Callback on button press
|
/// Callback on button press,
|
||||||
|
///
|
||||||
|
/// [ControlState] is passed as argument and can be used to determine if the
|
||||||
|
/// button was pressed in disabled state or not.
|
||||||
final void Function(ControlState state)? onPressed;
|
final void Function(ControlState state)? onPressed;
|
||||||
|
|
||||||
|
/// Current state of this button
|
||||||
|
final ValueNotifier<bool>? disabled;
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,7 @@ abstract class FileSelectionButtonComponent extends ButtonComponent
|
|||||||
super.selectedStyle,
|
super.selectedStyle,
|
||||||
super.invalidStyle,
|
super.invalidStyle,
|
||||||
super.onPressed,
|
super.onPressed,
|
||||||
|
super.disabled,
|
||||||
super.themeResolver,
|
super.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
@ -22,6 +22,7 @@ abstract class $FileSelectionButtonComponentCWProxy {
|
|||||||
FileSelectionButtonComponent invalidStyle(ButtonStyle<dynamic>? invalidStyle);
|
FileSelectionButtonComponent invalidStyle(ButtonStyle<dynamic>? invalidStyle);
|
||||||
FileSelectionButtonComponent onPressed(
|
FileSelectionButtonComponent onPressed(
|
||||||
void Function(ControlState)? onPressed);
|
void Function(ControlState)? onPressed);
|
||||||
|
FileSelectionButtonComponent disabled(ValueNotifier<bool>? disabled);
|
||||||
FileSelectionButtonComponent themeResolver(
|
FileSelectionButtonComponent themeResolver(
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver);
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver);
|
||||||
FileSelectionButtonComponent key(Key? key);
|
FileSelectionButtonComponent key(Key? key);
|
||||||
@ -38,6 +39,7 @@ abstract class $FileSelectionButtonComponentCWProxy {
|
|||||||
ButtonStyle<dynamic>? selectedStyle,
|
ButtonStyle<dynamic>? selectedStyle,
|
||||||
ButtonStyle<dynamic>? invalidStyle,
|
ButtonStyle<dynamic>? invalidStyle,
|
||||||
void Function(ControlState)? onPressed,
|
void Function(ControlState)? onPressed,
|
||||||
|
ValueNotifier<bool>? disabled,
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
||||||
Key? key,
|
Key? key,
|
||||||
});
|
});
|
||||||
|
@ -34,6 +34,7 @@ abstract class FlatButtonComponent extends ButtonComponent
|
|||||||
super.focusedStyle,
|
super.focusedStyle,
|
||||||
super.tappedStyle,
|
super.tappedStyle,
|
||||||
super.onPressed,
|
super.onPressed,
|
||||||
|
super.disabled,
|
||||||
super.themeResolver,
|
super.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
@ -17,6 +17,7 @@ abstract class $FlatButtonComponentCWProxy {
|
|||||||
FlatButtonComponent focusedStyle(ButtonStyle<dynamic>? focusedStyle);
|
FlatButtonComponent focusedStyle(ButtonStyle<dynamic>? focusedStyle);
|
||||||
FlatButtonComponent tappedStyle(ButtonStyle<dynamic>? tappedStyle);
|
FlatButtonComponent tappedStyle(ButtonStyle<dynamic>? tappedStyle);
|
||||||
FlatButtonComponent onPressed(void Function(ControlState)? onPressed);
|
FlatButtonComponent onPressed(void Function(ControlState)? onPressed);
|
||||||
|
FlatButtonComponent disabled(ValueNotifier<bool>? disabled);
|
||||||
FlatButtonComponent themeResolver(
|
FlatButtonComponent themeResolver(
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver);
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver);
|
||||||
FlatButtonComponent key(Key? key);
|
FlatButtonComponent key(Key? key);
|
||||||
@ -31,6 +32,7 @@ abstract class $FlatButtonComponentCWProxy {
|
|||||||
ButtonStyle<dynamic>? focusedStyle,
|
ButtonStyle<dynamic>? focusedStyle,
|
||||||
ButtonStyle<dynamic>? tappedStyle,
|
ButtonStyle<dynamic>? tappedStyle,
|
||||||
void Function(ControlState)? onPressed,
|
void Function(ControlState)? onPressed,
|
||||||
|
ValueNotifier<bool>? disabled,
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
||||||
Key? key,
|
Key? key,
|
||||||
});
|
});
|
||||||
|
@ -31,6 +31,7 @@ abstract class SimpleIconButtonComponent extends ButtonComponent
|
|||||||
super.focusedStyle,
|
super.focusedStyle,
|
||||||
super.tappedStyle,
|
super.tappedStyle,
|
||||||
super.onPressed,
|
super.onPressed,
|
||||||
|
super.disabled,
|
||||||
super.themeResolver,
|
super.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
@ -14,6 +14,7 @@ abstract class $SimpleIconButtonComponentCWProxy {
|
|||||||
SimpleIconButtonComponent focusedStyle(ButtonStyle<dynamic>? focusedStyle);
|
SimpleIconButtonComponent focusedStyle(ButtonStyle<dynamic>? focusedStyle);
|
||||||
SimpleIconButtonComponent tappedStyle(ButtonStyle<dynamic>? tappedStyle);
|
SimpleIconButtonComponent tappedStyle(ButtonStyle<dynamic>? tappedStyle);
|
||||||
SimpleIconButtonComponent onPressed(void Function(ControlState)? onPressed);
|
SimpleIconButtonComponent onPressed(void Function(ControlState)? onPressed);
|
||||||
|
SimpleIconButtonComponent disabled(ValueNotifier<bool>? disabled);
|
||||||
SimpleIconButtonComponent themeResolver(
|
SimpleIconButtonComponent themeResolver(
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver);
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver);
|
||||||
SimpleIconButtonComponent key(Key? key);
|
SimpleIconButtonComponent key(Key? key);
|
||||||
@ -25,6 +26,7 @@ abstract class $SimpleIconButtonComponentCWProxy {
|
|||||||
ButtonStyle<dynamic>? focusedStyle,
|
ButtonStyle<dynamic>? focusedStyle,
|
||||||
ButtonStyle<dynamic>? tappedStyle,
|
ButtonStyle<dynamic>? tappedStyle,
|
||||||
void Function(ControlState)? onPressed,
|
void Function(ControlState)? onPressed,
|
||||||
|
ValueNotifier<bool>? disabled,
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
||||||
Key? key,
|
Key? key,
|
||||||
});
|
});
|
||||||
|
@ -34,6 +34,7 @@ abstract class SymbolButtonComponent extends ButtonComponent
|
|||||||
super.tappedStyle,
|
super.tappedStyle,
|
||||||
super.selectedStyle,
|
super.selectedStyle,
|
||||||
super.onPressed,
|
super.onPressed,
|
||||||
|
super.disabled,
|
||||||
super.themeResolver,
|
super.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
@ -17,6 +17,7 @@ abstract class $SymbolButtonComponentCWProxy {
|
|||||||
SymbolButtonComponent tappedStyle(ButtonStyle<dynamic>? tappedStyle);
|
SymbolButtonComponent tappedStyle(ButtonStyle<dynamic>? tappedStyle);
|
||||||
SymbolButtonComponent selectedStyle(ButtonStyle<dynamic>? selectedStyle);
|
SymbolButtonComponent selectedStyle(ButtonStyle<dynamic>? selectedStyle);
|
||||||
SymbolButtonComponent onPressed(void Function(ControlState)? onPressed);
|
SymbolButtonComponent onPressed(void Function(ControlState)? onPressed);
|
||||||
|
SymbolButtonComponent disabled(ValueNotifier<bool>? disabled);
|
||||||
SymbolButtonComponent themeResolver(
|
SymbolButtonComponent themeResolver(
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver);
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver);
|
||||||
SymbolButtonComponent key(Key? key);
|
SymbolButtonComponent key(Key? key);
|
||||||
@ -31,6 +32,7 @@ abstract class $SymbolButtonComponentCWProxy {
|
|||||||
ButtonStyle<dynamic>? tappedStyle,
|
ButtonStyle<dynamic>? tappedStyle,
|
||||||
ButtonStyle<dynamic>? selectedStyle,
|
ButtonStyle<dynamic>? selectedStyle,
|
||||||
void Function(ControlState)? onPressed,
|
void Function(ControlState)? onPressed,
|
||||||
|
ValueNotifier<bool>? disabled,
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
||||||
Key? key,
|
Key? key,
|
||||||
});
|
});
|
||||||
|
@ -15,14 +15,23 @@
|
|||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
import 'package:wyatt_ui_kit/wyatt_ui_kit.dart';
|
import 'package:wyatt_ui_kit/wyatt_ui_kit.dart';
|
||||||
import 'package:wyatt_ui_kit_example/theme/constants.dart';
|
import 'package:wyatt_ui_kit_example/theme/constants.dart';
|
||||||
|
|
||||||
class FileSelectionButtons extends StatelessWidget {
|
class FileSelectionButtons extends StatefulWidget {
|
||||||
const FileSelectionButtons({super.key});
|
const FileSelectionButtons({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<FileSelectionButtons> createState() => _FileSelectionButtonsState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _FileSelectionButtonsState extends State<FileSelectionButtons> {
|
||||||
|
final _disabled = ValueNotifier(true);
|
||||||
|
final _dynamic = ValueNotifier(false);
|
||||||
|
|
||||||
Widget _leading() => const DecoratedBox(
|
Widget _leading() => const DecoratedBox(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Constants.grey2,
|
color: Constants.grey2,
|
||||||
@ -48,6 +57,7 @@ class FileSelectionButtons extends StatelessWidget {
|
|||||||
style: Theme.of(context).textTheme.titleMedium,
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
),
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
|
// Default
|
||||||
FileSelectionButton(
|
FileSelectionButton(
|
||||||
leading: _leading(),
|
leading: _leading(),
|
||||||
title: const TextWrapper(
|
title: const TextWrapper(
|
||||||
@ -56,65 +66,99 @@ class FileSelectionButtons extends StatelessWidget {
|
|||||||
subTitle: const TextWrapper('Taille max: 20 Mo'),
|
subTitle: const TextWrapper('Taille max: 20 Mo'),
|
||||||
),
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
FileSelectionButton(
|
BlocProvider(
|
||||||
|
create: (context) => InvalidButtonCubit()..freeze(),
|
||||||
|
child: FileSelectionButton(
|
||||||
leading: _leading(),
|
leading: _leading(),
|
||||||
title: const TextWrapper(
|
title: const TextWrapper(
|
||||||
'Enabled',
|
'Enabled',
|
||||||
),
|
),
|
||||||
subTitle: const TextWrapper('Subtitle'),
|
subTitle: const TextWrapper('Subtitle'),
|
||||||
)
|
),
|
||||||
..bloc.enable()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
|
// Using a ValueNotifier to disable the button
|
||||||
FileSelectionButton(
|
FileSelectionButton(
|
||||||
leading: _leading(),
|
leading: _leading(),
|
||||||
title: const TextWrapper(
|
title: const TextWrapper(
|
||||||
'Disabled',
|
'Disabled',
|
||||||
),
|
),
|
||||||
subTitle: const TextWrapper('Subtitle'),
|
subTitle: const TextWrapper('Subtitle'),
|
||||||
)
|
disabled: _disabled,
|
||||||
..bloc.disable()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
FileSelectionButton(
|
BlocProvider(
|
||||||
|
create: (context) => InvalidButtonCubit()..hover(),
|
||||||
|
child: FileSelectionButton(
|
||||||
leading: _leading(),
|
leading: _leading(),
|
||||||
title: const TextWrapper(
|
title: const TextWrapper(
|
||||||
'Hovered',
|
'Hovered',
|
||||||
),
|
),
|
||||||
subTitle: const TextWrapper('Subtitle'),
|
subTitle: const TextWrapper('Subtitle'),
|
||||||
)
|
),
|
||||||
..bloc.onMouseEnter()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
FileSelectionButton(
|
BlocProvider(
|
||||||
|
create: (context) => InvalidButtonCubit()..focus(),
|
||||||
|
child: FileSelectionButton(
|
||||||
leading: _leading(),
|
leading: _leading(),
|
||||||
title: const TextWrapper(
|
title: const TextWrapper(
|
||||||
'Focused',
|
'Focused',
|
||||||
),
|
),
|
||||||
subTitle: const TextWrapper('Subtitle'),
|
subTitle: const TextWrapper('Subtitle'),
|
||||||
)
|
),
|
||||||
..bloc.onFocus()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
FileSelectionButton(
|
BlocProvider(
|
||||||
|
create: (context) => InvalidButtonCubit()..tap(),
|
||||||
|
child: FileSelectionButton(
|
||||||
leading: _leading(),
|
leading: _leading(),
|
||||||
title: const TextWrapper(
|
title: const TextWrapper(
|
||||||
'Tapped',
|
'Tapped',
|
||||||
),
|
),
|
||||||
subTitle: const TextWrapper('Subtitle'),
|
subTitle: const TextWrapper('Subtitle'),
|
||||||
)
|
),
|
||||||
..bloc.onClickDown()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
FileSelectionButton(
|
BlocProvider(
|
||||||
|
create: (context) => InvalidButtonCubit()..invalidate(),
|
||||||
|
child: FileSelectionButton(
|
||||||
leading: _leading(),
|
leading: _leading(),
|
||||||
title: const TextWrapper(
|
title: const TextWrapper(
|
||||||
'Invalid',
|
'Invalid',
|
||||||
),
|
),
|
||||||
subTitle: const TextWrapper('Subtitle'),
|
subTitle: const TextWrapper('Subtitle'),
|
||||||
)
|
),
|
||||||
..bloc.invalidate()
|
),
|
||||||
..bloc.freeze(),
|
const Gap(20),
|
||||||
|
// Dynamic, disabled with ValueNotifier and invalid with BlocProvider.
|
||||||
|
// Keep the state when the button is disabled.
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
const Text('Enabled'),
|
||||||
|
Checkbox(
|
||||||
|
value: !_dynamic.value,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
_dynamic.value = !_dynamic.value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
FileSelectionButton(
|
||||||
|
leading: _leading(),
|
||||||
|
title: const TextWrapper(
|
||||||
|
'Dynamic',
|
||||||
|
),
|
||||||
|
subTitle: const TextWrapper('Subtitle'),
|
||||||
|
disabled: _dynamic,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
@ -15,13 +15,22 @@
|
|||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
import 'package:wyatt_ui_kit/wyatt_ui_kit.dart';
|
import 'package:wyatt_ui_kit/wyatt_ui_kit.dart';
|
||||||
|
|
||||||
class FlatButtons extends StatelessWidget {
|
class FlatButtons extends StatefulWidget {
|
||||||
const FlatButtons({super.key});
|
const FlatButtons({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<FlatButtons> createState() => _FlatButtonsState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _FlatButtonsState extends State<FlatButtons> {
|
||||||
|
final _disabled = ValueNotifier(true);
|
||||||
|
final _dynamic = ValueNotifier(false);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => Column(
|
Widget build(BuildContext context) => Column(
|
||||||
children: [
|
children: [
|
||||||
@ -30,56 +39,80 @@ class FlatButtons extends StatelessWidget {
|
|||||||
style: Theme.of(context).textTheme.titleMedium,
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
),
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
Center(
|
// Default
|
||||||
|
const Center(
|
||||||
/// You can overwrite global textstyle of the label with [label],
|
/// You can overwrite global textstyle of the label with [label],
|
||||||
/// but if you only want to override the color/gradient of the text
|
/// but if you only want to override the color/gradient of the text
|
||||||
/// in a particular case you can override the style that will
|
/// in a particular case you can override the style that will
|
||||||
/// be merge during the build.
|
/// be merge during the build.
|
||||||
child: FlatButton(
|
child: FlatButton(
|
||||||
label: const TextWrapper(
|
label: TextWrapper(
|
||||||
'Voir notre savoir faire',
|
'Voir notre savoir faire',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
Center(
|
Center(
|
||||||
child: FlatButton(
|
child: BlocProvider(
|
||||||
label: const TextWrapper('Enabled'),
|
create: (context) => ButtonCubit()..freeze(),
|
||||||
)
|
child: const FlatButton(
|
||||||
..bloc.enable()
|
label: TextWrapper('Enabled'),
|
||||||
..bloc.freeze(),
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
|
// Disabled with ValueNotifier
|
||||||
Center(
|
Center(
|
||||||
child: FlatButton(
|
child: FlatButton(
|
||||||
label: const TextWrapper('Disabled'),
|
label: const TextWrapper('Disabled'),
|
||||||
)
|
disabled: _disabled,
|
||||||
..bloc.disable()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
),
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
Center(
|
Center(
|
||||||
child: FlatButton(
|
child: BlocProvider(
|
||||||
label: const TextWrapper('Hovered'),
|
create: (context) => ButtonCubit()..hover(),
|
||||||
)
|
child: const FlatButton(
|
||||||
..bloc.onMouseEnter()
|
label: TextWrapper('Hovered'),
|
||||||
..bloc.freeze(),
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
Center(
|
Center(
|
||||||
child: FlatButton(
|
child: BlocProvider(
|
||||||
label: const TextWrapper('Focused'),
|
create: (context) => ButtonCubit()..focus(),
|
||||||
)
|
child: const FlatButton(
|
||||||
..bloc.onFocus()
|
label: TextWrapper('Focused'),
|
||||||
..bloc.freeze(),
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
Center(
|
Center(
|
||||||
child: FlatButton(
|
child: BlocProvider(
|
||||||
label: const TextWrapper('Tapped'),
|
create: (context) => ButtonCubit()..tap(),
|
||||||
)
|
child: const FlatButton(
|
||||||
..bloc.onClickDown()
|
label: TextWrapper('Tapped'),
|
||||||
..bloc.freeze(),
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(20),
|
||||||
|
// Dynamic, disabled with ValueNotifier and
|
||||||
|
// keep the state when the button is disabled
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Checkbox(
|
||||||
|
value: !_dynamic.value,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
_dynamic.value = !_dynamic.value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
FlatButton(
|
||||||
|
label: const TextWrapper('Dynamic'),
|
||||||
|
disabled: _dynamic,
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
],
|
],
|
||||||
|
@ -15,12 +15,21 @@
|
|||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:wyatt_ui_kit/wyatt_ui_kit.dart';
|
import 'package:wyatt_ui_kit/wyatt_ui_kit.dart';
|
||||||
|
|
||||||
class SimpleIconButtons extends StatelessWidget {
|
class SimpleIconButtons extends StatefulWidget {
|
||||||
const SimpleIconButtons({super.key});
|
const SimpleIconButtons({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<SimpleIconButtons> createState() => _SimpleIconButtonsState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SimpleIconButtonsState extends State<SimpleIconButtons> {
|
||||||
|
final _disabled = ValueNotifier(true);
|
||||||
|
final _dynamic = ValueNotifier(false);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => Column(
|
Widget build(BuildContext context) => Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
@ -30,8 +39,9 @@ class SimpleIconButtons extends StatelessWidget {
|
|||||||
style: Theme.of(context).textTheme.titleMedium,
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
),
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
SimpleIconButton(
|
// Default
|
||||||
icon: const Icon(
|
const SimpleIconButton(
|
||||||
|
icon: Icon(
|
||||||
Icons.storm_outlined,
|
Icons.storm_outlined,
|
||||||
size: 17,
|
size: 17,
|
||||||
),
|
),
|
||||||
@ -42,71 +52,101 @@ class SimpleIconButtons extends StatelessWidget {
|
|||||||
style: Theme.of(context).textTheme.labelMedium,
|
style: Theme.of(context).textTheme.labelMedium,
|
||||||
),
|
),
|
||||||
const Gap(10),
|
const Gap(10),
|
||||||
SimpleIconButton(
|
BlocProvider(
|
||||||
icon: const Icon(
|
create: (context) => ButtonCubit()..freeze(),
|
||||||
|
child: const SimpleIconButton(
|
||||||
|
icon: Icon(
|
||||||
Icons.storm_outlined,
|
Icons.storm_outlined,
|
||||||
size: 17,
|
size: 17,
|
||||||
),
|
),
|
||||||
)
|
),
|
||||||
..bloc.enable()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
Text(
|
Text(
|
||||||
'Disabled',
|
'Disabled',
|
||||||
style: Theme.of(context).textTheme.labelMedium,
|
style: Theme.of(context).textTheme.labelMedium,
|
||||||
),
|
),
|
||||||
const Gap(10),
|
const Gap(10),
|
||||||
|
// Disabled using ValueNotifier
|
||||||
SimpleIconButton(
|
SimpleIconButton(
|
||||||
icon: const Icon(
|
icon: const Icon(
|
||||||
Icons.storm_outlined,
|
Icons.storm_outlined,
|
||||||
size: 17,
|
size: 17,
|
||||||
),
|
),
|
||||||
)
|
disabled: _disabled,
|
||||||
..bloc.disable()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
Text(
|
Text(
|
||||||
'Hovered',
|
'Hovered',
|
||||||
style: Theme.of(context).textTheme.labelMedium,
|
style: Theme.of(context).textTheme.labelMedium,
|
||||||
),
|
),
|
||||||
const Gap(10),
|
const Gap(10),
|
||||||
SimpleIconButton(
|
BlocProvider(
|
||||||
icon: const Icon(
|
create: (context) => ButtonCubit()..hover(),
|
||||||
|
child: const SimpleIconButton(
|
||||||
|
icon: Icon(
|
||||||
Icons.storm_outlined,
|
Icons.storm_outlined,
|
||||||
size: 17,
|
size: 17,
|
||||||
),
|
),
|
||||||
)
|
),
|
||||||
..bloc.onMouseEnter()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
Text(
|
Text(
|
||||||
'Focused',
|
'Focused',
|
||||||
style: Theme.of(context).textTheme.labelMedium,
|
style: Theme.of(context).textTheme.labelMedium,
|
||||||
),
|
),
|
||||||
const Gap(10),
|
const Gap(10),
|
||||||
SimpleIconButton(
|
BlocProvider(
|
||||||
icon: const Icon(
|
create: (context) => ButtonCubit()..focus(),
|
||||||
|
child: const SimpleIconButton(
|
||||||
|
icon: Icon(
|
||||||
Icons.storm_outlined,
|
Icons.storm_outlined,
|
||||||
size: 17,
|
size: 17,
|
||||||
),
|
),
|
||||||
)
|
),
|
||||||
..bloc.onFocus()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
Text(
|
Text(
|
||||||
'Tapped',
|
'Tapped',
|
||||||
style: Theme.of(context).textTheme.labelMedium,
|
style: Theme.of(context).textTheme.labelMedium,
|
||||||
),
|
),
|
||||||
const Gap(10),
|
const Gap(10),
|
||||||
|
BlocProvider(
|
||||||
|
create: (context) => ButtonCubit()..tap(),
|
||||||
|
child: const SimpleIconButton(
|
||||||
|
icon: Icon(
|
||||||
|
Icons.storm_outlined,
|
||||||
|
size: 17,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Gap(20),
|
||||||
|
Text(
|
||||||
|
'Dynamic',
|
||||||
|
style: Theme.of(context).textTheme.labelMedium,
|
||||||
|
),
|
||||||
|
const Gap(10),
|
||||||
|
// Dynamic, disabled with ValueNotifier and
|
||||||
|
// keep the state when the button is disabled
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Checkbox(
|
||||||
|
value: !_dynamic.value,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
_dynamic.value = !_dynamic.value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
SimpleIconButton(
|
SimpleIconButton(
|
||||||
icon: const Icon(
|
icon: const Icon(
|
||||||
Icons.storm_outlined,
|
Icons.storm_outlined,
|
||||||
size: 17,
|
size: 17,
|
||||||
),
|
),
|
||||||
)
|
disabled: _dynamic,
|
||||||
..bloc.onClickDown()
|
),
|
||||||
..bloc.freeze(),
|
],
|
||||||
const Gap(20),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -15,14 +15,23 @@
|
|||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:gap/gap.dart';
|
import 'package:gap/gap.dart';
|
||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
import 'package:wyatt_ui_kit/wyatt_ui_kit.dart';
|
import 'package:wyatt_ui_kit/wyatt_ui_kit.dart';
|
||||||
import 'package:wyatt_ui_kit_example/theme/constants.dart';
|
import 'package:wyatt_ui_kit_example/theme/constants.dart';
|
||||||
|
|
||||||
class SymbolButtons extends StatelessWidget {
|
class SymbolButtons extends StatefulWidget {
|
||||||
const SymbolButtons({super.key});
|
const SymbolButtons({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<SymbolButtons> createState() => _SymbolButtonsState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SymbolButtonsState extends State<SymbolButtons> {
|
||||||
|
final _disabled = ValueNotifier(true);
|
||||||
|
final _dynamic = ValueNotifier(false);
|
||||||
|
|
||||||
Icon _icon(BuildContext context) => Icon(
|
Icon _icon(BuildContext context) => Icon(
|
||||||
Icons.android,
|
Icons.android,
|
||||||
size: 25,
|
size: 25,
|
||||||
@ -45,47 +54,70 @@ class SymbolButtons extends StatelessWidget {
|
|||||||
icon: _icon(context),
|
icon: _icon(context),
|
||||||
),
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
SymbolButton(
|
BlocProvider(
|
||||||
|
create: (context) => SelectableButtonCubit()..freeze(),
|
||||||
|
child: SymbolButton(
|
||||||
label: const TextWrapper('Enabled'),
|
label: const TextWrapper('Enabled'),
|
||||||
icon: _icon(context),
|
icon: _icon(context),
|
||||||
)
|
),
|
||||||
..bloc.enable()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
|
// Disabled
|
||||||
SymbolButton(
|
SymbolButton(
|
||||||
label: const TextWrapper('Disabled'),
|
label: const TextWrapper('Disabled'),
|
||||||
icon: _icon(context),
|
icon: _icon(context),
|
||||||
)
|
disabled: _disabled,
|
||||||
..bloc.disable()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
SymbolButton(
|
BlocProvider(
|
||||||
|
create: (context) => SelectableButtonCubit()..hover(),
|
||||||
|
child: SymbolButton(
|
||||||
label: const TextWrapper('Hovered'),
|
label: const TextWrapper('Hovered'),
|
||||||
icon: _icon(context),
|
icon: _icon(context),
|
||||||
)
|
),
|
||||||
..bloc.onMouseEnter()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
SymbolButton(
|
BlocProvider(
|
||||||
|
create: (context) => SelectableButtonCubit()..focus(),
|
||||||
|
child: SymbolButton(
|
||||||
label: const TextWrapper('Focused'),
|
label: const TextWrapper('Focused'),
|
||||||
icon: _icon(context),
|
icon: _icon(context),
|
||||||
)
|
),
|
||||||
..bloc.onFocus()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
SymbolButton(
|
BlocProvider(
|
||||||
|
create: (context) => SelectableButtonCubit()..tap(),
|
||||||
|
child: SymbolButton(
|
||||||
label: const TextWrapper('Tapped'),
|
label: const TextWrapper('Tapped'),
|
||||||
icon: _icon(context),
|
icon: _icon(context),
|
||||||
)
|
),
|
||||||
..bloc.onClickDown()
|
),
|
||||||
..bloc.freeze(),
|
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
SymbolButton(
|
BlocProvider(
|
||||||
|
create: (context) => SelectableButtonCubit()..select(),
|
||||||
|
child: SymbolButton(
|
||||||
label: const TextWrapper('Selected'),
|
label: const TextWrapper('Selected'),
|
||||||
icon: _icon(context),
|
icon: _icon(context),
|
||||||
)
|
),
|
||||||
..bloc.select()
|
),
|
||||||
..bloc.freeze(),
|
const Gap(20),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Checkbox(
|
||||||
|
value: !_dynamic.value,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
_dynamic.value = !_dynamic.value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
SymbolButton(
|
||||||
|
label: const TextWrapper('Dynamic'),
|
||||||
|
icon: _icon(context),
|
||||||
|
disabled: _dynamic,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
const Gap(20),
|
const Gap(20),
|
||||||
DecoratedBox(
|
DecoratedBox(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
|
@ -10,6 +10,7 @@ environment:
|
|||||||
dependencies:
|
dependencies:
|
||||||
flutter: { sdk: flutter }
|
flutter: { sdk: flutter }
|
||||||
|
|
||||||
|
flutter_bloc: ^8.1.2
|
||||||
flutter_localizations: { sdk: flutter }
|
flutter_localizations: { sdk: flutter }
|
||||||
|
|
||||||
gap: ^2.0.1
|
gap: ^2.0.1
|
||||||
|
@ -14,6 +14,9 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
export './cubit/button_cubit.dart';
|
||||||
|
export './cubit/invalid_button_cubit.dart';
|
||||||
|
export './cubit/selectable_button_cubit.dart';
|
||||||
export './file_selection_button/file_selection_button.dart';
|
export './file_selection_button/file_selection_button.dart';
|
||||||
export './flat_button/flat_button.dart';
|
export './flat_button/flat_button.dart';
|
||||||
export './simple_icon_button/simple_icon_button.dart';
|
export './simple_icon_button/simple_icon_button.dart';
|
||||||
|
@ -23,8 +23,19 @@ import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
|||||||
part 'button_state.dart';
|
part 'button_state.dart';
|
||||||
|
|
||||||
class ButtonCubit extends Cubit<ButtonState> {
|
class ButtonCubit extends Cubit<ButtonState> {
|
||||||
ButtonCubit() : super(const ButtonState.initial(ControlState.normal));
|
ButtonCubit() : super(const ButtonState.initial(ControlState.normal)) {
|
||||||
|
_previousState = state.copyWith();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The previous state of the button.
|
||||||
|
/// This is used to restore the state of the button when
|
||||||
|
/// the button is enabled again.
|
||||||
|
ButtonState? _previousState;
|
||||||
|
|
||||||
|
/// When the mouse enters the button. The button will change
|
||||||
|
/// its state to [ControlState.hovered].
|
||||||
|
///
|
||||||
|
/// If the button is disabled or freezed, this method does nothing.
|
||||||
FutureOr<void> onMouseEnter() async {
|
FutureOr<void> onMouseEnter() async {
|
||||||
if (state.isDisabled || state.isFreezed) {
|
if (state.isDisabled || state.isFreezed) {
|
||||||
return;
|
return;
|
||||||
@ -32,6 +43,10 @@ class ButtonCubit extends Cubit<ButtonState> {
|
|||||||
emit(state.copyWith(state: ControlState.hovered));
|
emit(state.copyWith(state: ControlState.hovered));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// When the mouse leaves the button. The button will change
|
||||||
|
/// its state to [ControlState.normal].
|
||||||
|
///
|
||||||
|
/// If the button is disabled or freezed, this method does nothing.
|
||||||
FutureOr<void> onMouseLeave() async {
|
FutureOr<void> onMouseLeave() async {
|
||||||
if (state.isDisabled || state.isFreezed) {
|
if (state.isDisabled || state.isFreezed) {
|
||||||
return;
|
return;
|
||||||
@ -40,6 +55,10 @@ class ButtonCubit extends Cubit<ButtonState> {
|
|||||||
emit(state.copyWith(state: ControlState.normal));
|
emit(state.copyWith(state: ControlState.normal));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// When the button is focused. The button will change
|
||||||
|
/// its state to [ControlState.focused].
|
||||||
|
///
|
||||||
|
/// If the button is disabled or freezed, this method does nothing.
|
||||||
FutureOr<void> onFocus() async {
|
FutureOr<void> onFocus() async {
|
||||||
if (state.isDisabled || state.isFreezed) {
|
if (state.isDisabled || state.isFreezed) {
|
||||||
return;
|
return;
|
||||||
@ -47,6 +66,10 @@ class ButtonCubit extends Cubit<ButtonState> {
|
|||||||
emit(state.copyWith(state: ControlState.focused));
|
emit(state.copyWith(state: ControlState.focused));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// When the button is unfocused. The button will change
|
||||||
|
/// its state to [ControlState.normal].
|
||||||
|
///
|
||||||
|
/// If the button is disabled or freezed, this method does nothing.
|
||||||
FutureOr<void> onUnfocus() async {
|
FutureOr<void> onUnfocus() async {
|
||||||
if (state.isDisabled || state.isFreezed) {
|
if (state.isDisabled || state.isFreezed) {
|
||||||
return;
|
return;
|
||||||
@ -54,6 +77,10 @@ class ButtonCubit extends Cubit<ButtonState> {
|
|||||||
emit(state.copyWith(state: ControlState.normal));
|
emit(state.copyWith(state: ControlState.normal));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// When the mouse is pressed on the button. The button will change
|
||||||
|
/// its state to [ControlState.tapped].
|
||||||
|
///
|
||||||
|
/// If the button is disabled or freezed, this method does nothing.
|
||||||
FutureOr<void> onClickDown() async {
|
FutureOr<void> onClickDown() async {
|
||||||
if (state.isDisabled || state.isFreezed) {
|
if (state.isDisabled || state.isFreezed) {
|
||||||
return;
|
return;
|
||||||
@ -61,39 +88,127 @@ class ButtonCubit extends Cubit<ButtonState> {
|
|||||||
emit(state.copyWith(state: ControlState.tapped));
|
emit(state.copyWith(state: ControlState.tapped));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// When the mouse is released on the button. The button will change
|
||||||
|
/// its state to [ControlState.hovered].
|
||||||
|
///
|
||||||
|
/// If the button is disabled or freezed, this method does nothing.
|
||||||
FutureOr<void> onClickUpIn() async {
|
FutureOr<void> onClickUpIn() async {
|
||||||
if (state.isDisabled) {
|
if (state.isDisabled || state.isFreezed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
emit(state.copyWith(state: ControlState.hovered));
|
emit(state.copyWith(state: ControlState.hovered));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// When the mouse is released outside the button. The button will change
|
||||||
|
/// its state to [ControlState.normal].
|
||||||
|
///
|
||||||
|
/// If the button is disabled or freezed, this method does nothing.
|
||||||
FutureOr<void> onClickUpOut() async {
|
FutureOr<void> onClickUpOut() async {
|
||||||
if (state.isDisabled) {
|
if (state.isDisabled || state.isFreezed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
emit(state.copyWith(state: ControlState.normal));
|
emit(state.copyWith(state: ControlState.normal));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Programmatically change the state or extra states of the button.
|
||||||
|
FutureOr<void> setState({
|
||||||
|
ControlState? state,
|
||||||
|
List<ExtraState>? extraStates,
|
||||||
|
}) async {
|
||||||
|
emit(this.state.copyWith(state: state, extraStates: extraStates));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Disable the button.
|
||||||
|
///
|
||||||
|
/// This will remove all extra states and set
|
||||||
|
/// the state to [ControlState.disabled] and add [ExtraState.freezed].
|
||||||
FutureOr<void> disable() async {
|
FutureOr<void> disable() async {
|
||||||
if (state.isFreezed) {
|
/// Save the previous state.
|
||||||
return;
|
/// copyWith() is used to make sure the previous state is not
|
||||||
}
|
/// affected by any changes to the current state.
|
||||||
emit(state.copyWith(state: ControlState.disabled));
|
_previousState = state.copyWith();
|
||||||
|
|
||||||
|
emit(
|
||||||
|
const ButtonState(
|
||||||
|
state: ControlState.disabled,
|
||||||
|
extraStates: [ExtraState.freezed],
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Enable the button.
|
||||||
|
///
|
||||||
|
/// This will restore the previous state of the button.
|
||||||
FutureOr<void> enable() async {
|
FutureOr<void> enable() async {
|
||||||
if (state.isFreezed) {
|
if (_previousState == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
emit(state.copyWith(state: ControlState.normal));
|
|
||||||
|
emit(_previousState!);
|
||||||
|
_previousState = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the button to hovered state and freeze it.
|
||||||
|
///
|
||||||
|
/// Use this method to programmatically set the button to hovered state.
|
||||||
|
FutureOr<void> hover() async {
|
||||||
|
emit(
|
||||||
|
state.copyWith(
|
||||||
|
state: ControlState.hovered,
|
||||||
|
extraStates: state.extraStates + [ExtraState.freezed],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set the button to focused state and freeze it.
|
||||||
|
///
|
||||||
|
/// Use this method to programmatically set the button to focused state.
|
||||||
|
FutureOr<void> focus() async {
|
||||||
|
emit(
|
||||||
|
state.copyWith(
|
||||||
|
state: ControlState.focused,
|
||||||
|
extraStates: state.extraStates + [ExtraState.freezed],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set the button to tapped state and freeze it.
|
||||||
|
///
|
||||||
|
/// Use this method to programmatically set the button to tapped state.
|
||||||
|
FutureOr<void> tap() async {
|
||||||
|
emit(
|
||||||
|
state.copyWith(
|
||||||
|
state: ControlState.tapped,
|
||||||
|
extraStates: state.extraStates + [ExtraState.freezed],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Freeze the button in its current state.
|
||||||
|
///
|
||||||
|
/// Shortcut for [setState] with extra state [ExtraState.freezed].
|
||||||
|
///
|
||||||
|
/// Use this method to programmatically freeze the button.
|
||||||
FutureOr<void> freeze() async {
|
FutureOr<void> freeze() async {
|
||||||
emit(state.copyWith(freezed: true));
|
emit(
|
||||||
|
state.copyWith(
|
||||||
|
extraStates: state.extraStates + [ExtraState.freezed],
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Unfreeze the button.
|
||||||
|
///
|
||||||
|
/// Shortcut for [setState] without extra state [ExtraState.freezed].
|
||||||
|
///
|
||||||
|
/// Use this method to programmatically unfreeze the button.
|
||||||
FutureOr<void> unfreeze() async {
|
FutureOr<void> unfreeze() async {
|
||||||
emit(state.copyWith(freezed: false));
|
emit(
|
||||||
|
state.copyWith(
|
||||||
|
extraStates: state.extraStates
|
||||||
|
.where((element) => element != ExtraState.freezed)
|
||||||
|
.toList(),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,54 +18,41 @@
|
|||||||
part of 'button_cubit.dart';
|
part of 'button_cubit.dart';
|
||||||
|
|
||||||
class ButtonState extends Equatable {
|
class ButtonState extends Equatable {
|
||||||
const ButtonState({
|
const ButtonState({required this.state, required this.extraStates});
|
||||||
required this.state,
|
|
||||||
required this.selected,
|
|
||||||
required this.invalid,
|
|
||||||
required this.freezed,
|
|
||||||
});
|
|
||||||
|
|
||||||
const ButtonState.initial(this.state)
|
const ButtonState.initial(this.state) : extraStates = const [];
|
||||||
: selected = false,
|
|
||||||
invalid = false,
|
|
||||||
freezed = false;
|
|
||||||
|
|
||||||
|
/// The control state of the button
|
||||||
final ControlState state;
|
final ControlState state;
|
||||||
|
|
||||||
// Not in control state, because a button state can be
|
/// Not in control state, because a button state can be
|
||||||
// a control state + extra state
|
/// a control state + extra state
|
||||||
// e.g : hover + invalid, or selected + tapped
|
/// e.g :
|
||||||
final bool selected;
|
/// - ControlState.hover + [ExtraState.invalid]
|
||||||
final bool invalid;
|
/// - ControlState.tapped + [ExtraState.invalid + ExtraState.freezed]
|
||||||
final bool freezed;
|
final List<ExtraState> extraStates;
|
||||||
|
|
||||||
bool get isDisabled => state.isDisabled();
|
bool get isDisabled => state.isDisabled();
|
||||||
bool get isEnabled => state.isEnabled();
|
bool get isEnabled => state.isEnabled();
|
||||||
bool get isFocused => state.isFocused();
|
bool get isFocused => state.isFocused();
|
||||||
bool get isHovered => state.isHovered();
|
bool get isHovered => state.isHovered();
|
||||||
bool get isTapped => state.isTapped();
|
bool get isTapped => state.isTapped();
|
||||||
|
bool get isSelected => extraStates.contains(ExtraState.selected);
|
||||||
// only for consistence
|
bool get isInvalid => extraStates.contains(ExtraState.invalid);
|
||||||
bool get isSelected => selected;
|
bool get isFreezed => extraStates.contains(ExtraState.freezed);
|
||||||
bool get isInvalid => invalid;
|
|
||||||
bool get isFreezed => freezed;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [state, selected, invalid, freezed];
|
List<Object?> get props => [state, extraStates];
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool? get stringify => true;
|
bool? get stringify => true;
|
||||||
|
|
||||||
ButtonState copyWith({
|
ButtonState copyWith({
|
||||||
ControlState? state,
|
ControlState? state,
|
||||||
bool? selected,
|
List<ExtraState>? extraStates,
|
||||||
bool? invalid,
|
|
||||||
bool? freezed,
|
|
||||||
}) =>
|
}) =>
|
||||||
ButtonState(
|
ButtonState(
|
||||||
state: state ?? this.state,
|
state: state ?? this.state,
|
||||||
selected: selected ?? this.selected,
|
extraStates: extraStates ?? this.extraStates,
|
||||||
invalid: invalid ?? this.invalid,
|
|
||||||
freezed: freezed ?? this.freezed,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -20,49 +20,29 @@ import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
|||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
||||||
|
|
||||||
class InvalidButtonCubit extends ButtonCubit {
|
class InvalidButtonCubit extends ButtonCubit {
|
||||||
@override
|
/// When the button is invalid. The button will add the
|
||||||
FutureOr<void> onClickUpIn() async {
|
/// [ExtraState.invalid] to its extra states.
|
||||||
if (state.isDisabled || state.isFreezed) {
|
///
|
||||||
return;
|
/// Use [validate] to remove the [ExtraState.invalid] from the extra states.
|
||||||
}
|
///
|
||||||
|
/// Use this method to invalidate the button programmatically.
|
||||||
emit(
|
|
||||||
state.copyWith(
|
|
||||||
state: ControlState.hovered,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
FutureOr<void> onClickUpOut() async {
|
|
||||||
if (state.isDisabled || state.isFreezed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit(
|
|
||||||
state.copyWith(
|
|
||||||
state: ControlState.normal,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
FutureOr<void> invalidate() async {
|
FutureOr<void> invalidate() async {
|
||||||
if (state.isDisabled || state.isFreezed) {
|
emit(state.copyWith(extraStates: state.extraStates + [ExtraState.invalid]));
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// When the button is valid. The button will remove the
|
||||||
|
/// [ExtraState.invalid] from its extra states.
|
||||||
|
///
|
||||||
|
/// Use [invalidate] to add the [ExtraState.invalid] to the extra states.
|
||||||
|
///
|
||||||
|
/// Use this method to validate the button programmatically.
|
||||||
|
FutureOr<void> validate() async {
|
||||||
emit(
|
emit(
|
||||||
state.copyWith(invalid: true),
|
state.copyWith(
|
||||||
);
|
extraStates: state.extraStates
|
||||||
}
|
.where((element) => element != ExtraState.invalid)
|
||||||
|
.toList(),
|
||||||
FutureOr<void> fix() async {
|
),
|
||||||
if (state.isDisabled || state.isFreezed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit(
|
|
||||||
state.copyWith(invalid: false),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,14 +20,32 @@ import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
|||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
||||||
|
|
||||||
class SelectableButtonCubit extends ButtonCubit {
|
class SelectableButtonCubit extends ButtonCubit {
|
||||||
|
ButtonState _toggle(ButtonState state) {
|
||||||
|
if (state.isSelected) {
|
||||||
|
return state.copyWith(
|
||||||
|
extraStates: state.extraStates
|
||||||
|
.where((element) => element != ExtraState.selected)
|
||||||
|
.toList(),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return state.copyWith(
|
||||||
|
extraStates: state.extraStates + [ExtraState.selected],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// When the mouse is released on the button, the button will
|
||||||
|
/// add the [ExtraState.selected] if it is selected, or remove
|
||||||
|
/// the [ExtraState.selected] if it is not selected.
|
||||||
|
///
|
||||||
|
/// If the button is disabled or freezed, this method does nothing.
|
||||||
@override
|
@override
|
||||||
FutureOr<void> onClickUpIn() async {
|
FutureOr<void> onClickUpIn() async {
|
||||||
if (state.isDisabled || state.isFreezed) {
|
if (state.isDisabled || state.isFreezed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
emit(
|
|
||||||
state.copyWith(state: ControlState.hovered, selected: !state.selected),
|
emit(_toggle(state).copyWith(state: ControlState.hovered));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -35,26 +53,31 @@ class SelectableButtonCubit extends ButtonCubit {
|
|||||||
if (state.isDisabled || state.isFreezed) {
|
if (state.isDisabled || state.isFreezed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
emit(state.copyWith(state: ControlState.normal, selected: !state.selected));
|
|
||||||
|
emit(_toggle(state).copyWith(state: ControlState.normal));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// When the button is selected. The button will add the
|
||||||
|
/// [ExtraState.selected] to its extra states.
|
||||||
|
///
|
||||||
|
/// Use this method to select the button programmatically.
|
||||||
FutureOr<void> select() async {
|
FutureOr<void> select() async {
|
||||||
if (state.isDisabled || state.isFreezed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit(
|
emit(
|
||||||
state.copyWith(selected: true),
|
state.copyWith(extraStates: state.extraStates + [ExtraState.selected]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// When the button is unselected. The button will remove the
|
||||||
|
/// [ExtraState.selected] from its extra states.
|
||||||
|
///
|
||||||
|
/// Use this method to unselect the button programmatically.
|
||||||
FutureOr<void> unselect() async {
|
FutureOr<void> unselect() async {
|
||||||
if (state.isDisabled || state.isFreezed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit(
|
emit(
|
||||||
state.copyWith(selected: false),
|
state.copyWith(
|
||||||
|
extraStates: state.extraStates
|
||||||
|
.where((element) => element != ExtraState.selected)
|
||||||
|
.toList(),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,23 +14,22 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
||||||
|
|
||||||
class ExportableBloc<T extends StateStreamableSource<Object?>>
|
/// A class that listens to the state of a [ValueNotifier] and
|
||||||
extends StatelessWidget {
|
/// changes the state of a [ButtonCubit] accordingly.
|
||||||
const ExportableBloc({
|
abstract class StateListener {
|
||||||
required this.bloc,
|
/// Listens to the state of the [ValueNotifier] and
|
||||||
required this.child,
|
/// changes the state of the [ButtonCubit] accordingly.
|
||||||
super.key,
|
static void listen<B extends ButtonCubit>(
|
||||||
});
|
ValueNotifier<bool>? state,
|
||||||
|
B bloc,
|
||||||
final T bloc;
|
) {
|
||||||
final Widget child;
|
if (state!.value) {
|
||||||
|
bloc.disable();
|
||||||
@override
|
} else {
|
||||||
Widget build(BuildContext context) => BlocProvider<T>.value(
|
bloc.enable();
|
||||||
value: bloc,
|
}
|
||||||
child: child,
|
}
|
||||||
);
|
|
||||||
}
|
}
|
@ -17,8 +17,6 @@
|
|||||||
import 'package:flutter/material.dart' hide ButtonStyle;
|
import 'package:flutter/material.dart' hide ButtonStyle;
|
||||||
import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart';
|
import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart';
|
||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/invalid_button_cubit.dart';
|
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/exportable_bloc.dart';
|
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/file_selection_button/file_selection_button_screen.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/file_selection_button/file_selection_button_screen.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/file_selection_button/file_selection_button_theme_resolver.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/file_selection_button/file_selection_button_theme_resolver.dart';
|
||||||
|
|
||||||
@ -27,7 +25,7 @@ part 'file_selection_button.g.dart';
|
|||||||
@ComponentCopyWithExtension()
|
@ComponentCopyWithExtension()
|
||||||
class FileSelectionButton extends FileSelectionButtonComponent
|
class FileSelectionButton extends FileSelectionButtonComponent
|
||||||
with $FileSelectionButtonCWMixin {
|
with $FileSelectionButtonCWMixin {
|
||||||
FileSelectionButton({
|
const FileSelectionButton({
|
||||||
super.leading,
|
super.leading,
|
||||||
super.title,
|
super.title,
|
||||||
super.subTitle,
|
super.subTitle,
|
||||||
@ -39,15 +37,12 @@ class FileSelectionButton extends FileSelectionButtonComponent
|
|||||||
super.selectedStyle,
|
super.selectedStyle,
|
||||||
super.invalidStyle,
|
super.invalidStyle,
|
||||||
super.onPressed,
|
super.onPressed,
|
||||||
|
super.disabled,
|
||||||
super.mainAxisSize,
|
super.mainAxisSize,
|
||||||
super.themeResolver,
|
super.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
|
||||||
final InvalidButtonCubit _cubit = InvalidButtonCubit();
|
|
||||||
|
|
||||||
InvalidButtonCubit get bloc => _cubit;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FileSelectionButtonStyle? get disabledStyle =>
|
FileSelectionButtonStyle? get disabledStyle =>
|
||||||
super.disabledStyle as FileSelectionButtonStyle?;
|
super.disabledStyle as FileSelectionButtonStyle?;
|
||||||
@ -81,9 +76,7 @@ class FileSelectionButton extends FileSelectionButtonComponent
|
|||||||
super.themeResolver as FileSelectionButtonThemeResolver?;
|
super.themeResolver as FileSelectionButtonThemeResolver?;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => ExportableBloc(
|
Widget build(BuildContext context) => FileSelectionButtonScreen(
|
||||||
bloc: _cubit,
|
|
||||||
child: FileSelectionButtonScreen(
|
|
||||||
leading: leading,
|
leading: leading,
|
||||||
title: title,
|
title: title,
|
||||||
subTitle: subTitle,
|
subTitle: subTitle,
|
||||||
@ -95,9 +88,9 @@ class FileSelectionButton extends FileSelectionButtonComponent
|
|||||||
selectedStyle: selectedStyle,
|
selectedStyle: selectedStyle,
|
||||||
invalidStyle: invalidStyle,
|
invalidStyle: invalidStyle,
|
||||||
onPressed: onPressed,
|
onPressed: onPressed,
|
||||||
|
disabled: disabled,
|
||||||
mainAxisSize: mainAxisSize,
|
mainAxisSize: mainAxisSize,
|
||||||
themeResolver: themeResolver,
|
themeResolver: themeResolver,
|
||||||
key: key,
|
key: key,
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,9 @@ class $FileSelectionButtonCWProxyImpl
|
|||||||
FileSelectionButton onPressed(void Function(ControlState)? onPressed) =>
|
FileSelectionButton onPressed(void Function(ControlState)? onPressed) =>
|
||||||
this(onPressed: onPressed);
|
this(onPressed: onPressed);
|
||||||
@override
|
@override
|
||||||
|
FileSelectionButton disabled(ValueNotifier<bool>? disabled) =>
|
||||||
|
this(disabled: disabled);
|
||||||
|
@override
|
||||||
FileSelectionButton themeResolver(
|
FileSelectionButton themeResolver(
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver) =>
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver) =>
|
||||||
this(themeResolver: themeResolver);
|
this(themeResolver: themeResolver);
|
||||||
@ -64,6 +67,7 @@ class $FileSelectionButtonCWProxyImpl
|
|||||||
ButtonStyle<dynamic>? selectedStyle,
|
ButtonStyle<dynamic>? selectedStyle,
|
||||||
ButtonStyle<dynamic>? invalidStyle,
|
ButtonStyle<dynamic>? invalidStyle,
|
||||||
void Function(ControlState)? onPressed,
|
void Function(ControlState)? onPressed,
|
||||||
|
ValueNotifier<bool>? disabled,
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
||||||
Key? key,
|
Key? key,
|
||||||
}) =>
|
}) =>
|
||||||
@ -79,6 +83,7 @@ class $FileSelectionButtonCWProxyImpl
|
|||||||
selectedStyle: selectedStyle ?? _value.selectedStyle,
|
selectedStyle: selectedStyle ?? _value.selectedStyle,
|
||||||
invalidStyle: invalidStyle ?? _value.invalidStyle,
|
invalidStyle: invalidStyle ?? _value.invalidStyle,
|
||||||
onPressed: onPressed ?? _value.onPressed,
|
onPressed: onPressed ?? _value.onPressed,
|
||||||
|
disabled: disabled ?? _value.disabled,
|
||||||
mainAxisSize: mainAxisSize ?? _value.mainAxisSize,
|
mainAxisSize: mainAxisSize ?? _value.mainAxisSize,
|
||||||
themeResolver: themeResolver ?? _value.themeResolver,
|
themeResolver: themeResolver ?? _value.themeResolver,
|
||||||
key: key ?? _value.key,
|
key: key ?? _value.key,
|
||||||
|
@ -21,6 +21,7 @@ import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart';
|
|||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/invalid_button_cubit.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/invalid_button_cubit.dart';
|
||||||
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/state_listener.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/file_selection_button/dotter_border_child.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/file_selection_button/dotter_border_child.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/file_selection_button/file_selection_button_theme_resolver.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/file_selection_button/file_selection_button_theme_resolver.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
|
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
|
||||||
@ -39,6 +40,7 @@ class FileSelectionButtonScreen
|
|||||||
this.selectedStyle,
|
this.selectedStyle,
|
||||||
this.invalidStyle,
|
this.invalidStyle,
|
||||||
this.onPressed,
|
this.onPressed,
|
||||||
|
this.disabled,
|
||||||
this.mainAxisSize,
|
this.mainAxisSize,
|
||||||
this.themeResolver,
|
this.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
@ -58,11 +60,26 @@ class FileSelectionButtonScreen
|
|||||||
final FileSelectionButtonStyle? invalidStyle;
|
final FileSelectionButtonStyle? invalidStyle;
|
||||||
|
|
||||||
final void Function(ControlState state)? onPressed;
|
final void Function(ControlState state)? onPressed;
|
||||||
|
final ValueNotifier<bool>? disabled;
|
||||||
final FileSelectionButtonThemeResolver? themeResolver;
|
final FileSelectionButtonThemeResolver? themeResolver;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
InvalidButtonCubit create(BuildContext context) => InvalidButtonCubit();
|
InvalidButtonCubit create(BuildContext context) => InvalidButtonCubit();
|
||||||
|
|
||||||
|
@override
|
||||||
|
InvalidButtonCubit init(BuildContext context, InvalidButtonCubit bloc) {
|
||||||
|
disabled?.addListener(
|
||||||
|
() => StateListener.listen<InvalidButtonCubit>(disabled, bloc),
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Set the initial state depending on the disabled value
|
||||||
|
/// after adding the listener.
|
||||||
|
if (disabled?.value ?? false) {
|
||||||
|
bloc.disable();
|
||||||
|
}
|
||||||
|
return bloc;
|
||||||
|
}
|
||||||
|
|
||||||
/// Negotiate the theme to get a complete style.
|
/// Negotiate the theme to get a complete style.
|
||||||
FileSelectionButtonStyle _resolve(BuildContext context, ButtonState state) {
|
FileSelectionButtonStyle _resolve(BuildContext context, ButtonState state) {
|
||||||
final FileSelectionButtonThemeResolver resolver = themeResolver ??
|
final FileSelectionButtonThemeResolver resolver = themeResolver ??
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
import 'package:flutter/material.dart' hide ButtonStyle;
|
import 'package:flutter/material.dart' hide ButtonStyle;
|
||||||
import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart';
|
import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart';
|
||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/exportable_bloc.dart';
|
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/flat_button/flat_button_screen.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/flat_button/flat_button_screen.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/flat_button/flat_button_theme_resolver.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/flat_button/flat_button_theme_resolver.dart';
|
||||||
|
|
||||||
@ -26,7 +24,7 @@ part 'flat_button.g.dart';
|
|||||||
|
|
||||||
@ComponentCopyWithExtension()
|
@ComponentCopyWithExtension()
|
||||||
class FlatButton extends FlatButtonComponent with $FlatButtonCWMixin {
|
class FlatButton extends FlatButtonComponent with $FlatButtonCWMixin {
|
||||||
FlatButton({
|
const FlatButton({
|
||||||
super.prefix,
|
super.prefix,
|
||||||
super.suffix,
|
super.suffix,
|
||||||
super.label,
|
super.label,
|
||||||
@ -36,15 +34,12 @@ class FlatButton extends FlatButtonComponent with $FlatButtonCWMixin {
|
|||||||
super.focusedStyle,
|
super.focusedStyle,
|
||||||
super.tappedStyle,
|
super.tappedStyle,
|
||||||
super.onPressed,
|
super.onPressed,
|
||||||
|
super.disabled,
|
||||||
super.mainAxisSize,
|
super.mainAxisSize,
|
||||||
super.themeResolver,
|
super.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
|
||||||
final ButtonCubit _cubit = ButtonCubit();
|
|
||||||
|
|
||||||
ButtonCubit get bloc => _cubit;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FlatButtonStyle? get disabledStyle => super.disabledStyle as FlatButtonStyle?;
|
FlatButtonStyle? get disabledStyle => super.disabledStyle as FlatButtonStyle?;
|
||||||
|
|
||||||
@ -65,9 +60,7 @@ class FlatButton extends FlatButtonComponent with $FlatButtonCWMixin {
|
|||||||
super.themeResolver as FlatButtonThemeResolver?;
|
super.themeResolver as FlatButtonThemeResolver?;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => ExportableBloc(
|
Widget build(BuildContext context) => FlatButtonScreen(
|
||||||
bloc: _cubit,
|
|
||||||
child: FlatButtonScreen(
|
|
||||||
prefix: prefix,
|
prefix: prefix,
|
||||||
suffix: suffix,
|
suffix: suffix,
|
||||||
label: label,
|
label: label,
|
||||||
@ -77,9 +70,9 @@ class FlatButton extends FlatButtonComponent with $FlatButtonCWMixin {
|
|||||||
focusedStyle: focusedStyle,
|
focusedStyle: focusedStyle,
|
||||||
tappedStyle: tappedStyle,
|
tappedStyle: tappedStyle,
|
||||||
onPressed: onPressed,
|
onPressed: onPressed,
|
||||||
|
disabled: disabled,
|
||||||
mainAxisSize: mainAxisSize,
|
mainAxisSize: mainAxisSize,
|
||||||
themeResolver: themeResolver,
|
themeResolver: themeResolver,
|
||||||
key: key,
|
key: key,
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,9 @@ class $FlatButtonCWProxyImpl implements $FlatButtonComponentCWProxy {
|
|||||||
FlatButton onPressed(void Function(ControlState)? onPressed) =>
|
FlatButton onPressed(void Function(ControlState)? onPressed) =>
|
||||||
this(onPressed: onPressed);
|
this(onPressed: onPressed);
|
||||||
@override
|
@override
|
||||||
|
FlatButton disabled(ValueNotifier<bool>? disabled) =>
|
||||||
|
this(disabled: disabled);
|
||||||
|
@override
|
||||||
FlatButton themeResolver(
|
FlatButton themeResolver(
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver) =>
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver) =>
|
||||||
this(themeResolver: themeResolver);
|
this(themeResolver: themeResolver);
|
||||||
@ -54,6 +57,7 @@ class $FlatButtonCWProxyImpl implements $FlatButtonComponentCWProxy {
|
|||||||
ButtonStyle<dynamic>? focusedStyle,
|
ButtonStyle<dynamic>? focusedStyle,
|
||||||
ButtonStyle<dynamic>? tappedStyle,
|
ButtonStyle<dynamic>? tappedStyle,
|
||||||
void Function(ControlState)? onPressed,
|
void Function(ControlState)? onPressed,
|
||||||
|
ValueNotifier<bool>? disabled,
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
||||||
Key? key,
|
Key? key,
|
||||||
}) =>
|
}) =>
|
||||||
@ -67,6 +71,7 @@ class $FlatButtonCWProxyImpl implements $FlatButtonComponentCWProxy {
|
|||||||
focusedStyle: focusedStyle ?? _value.focusedStyle,
|
focusedStyle: focusedStyle ?? _value.focusedStyle,
|
||||||
tappedStyle: tappedStyle ?? _value.tappedStyle,
|
tappedStyle: tappedStyle ?? _value.tappedStyle,
|
||||||
onPressed: onPressed ?? _value.onPressed,
|
onPressed: onPressed ?? _value.onPressed,
|
||||||
|
disabled: disabled ?? _value.disabled,
|
||||||
mainAxisSize: mainAxisSize ?? _value.mainAxisSize,
|
mainAxisSize: mainAxisSize ?? _value.mainAxisSize,
|
||||||
themeResolver: themeResolver ?? _value.themeResolver,
|
themeResolver: themeResolver ?? _value.themeResolver,
|
||||||
key: key ?? _value.key,
|
key: key ?? _value.key,
|
||||||
|
@ -20,6 +20,7 @@ import 'package:gap/gap.dart';
|
|||||||
import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart';
|
import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart';
|
||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
||||||
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/state_listener.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/flat_button/flat_button_theme_resolver.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/flat_button/flat_button_theme_resolver.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/gradients/gradient_box_border.dart';
|
import 'package:wyatt_ui_kit/src/components/gradients/gradient_box_border.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
|
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
|
||||||
@ -35,6 +36,7 @@ class FlatButtonScreen extends CubitScreen<ButtonCubit, ButtonState> {
|
|||||||
this.focusedStyle,
|
this.focusedStyle,
|
||||||
this.tappedStyle,
|
this.tappedStyle,
|
||||||
this.onPressed,
|
this.onPressed,
|
||||||
|
this.disabled,
|
||||||
this.mainAxisSize,
|
this.mainAxisSize,
|
||||||
this.themeResolver,
|
this.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
@ -52,11 +54,23 @@ class FlatButtonScreen extends CubitScreen<ButtonCubit, ButtonState> {
|
|||||||
final FlatButtonStyle? tappedStyle;
|
final FlatButtonStyle? tappedStyle;
|
||||||
|
|
||||||
final void Function(ControlState state)? onPressed;
|
final void Function(ControlState state)? onPressed;
|
||||||
|
final ValueNotifier<bool>? disabled;
|
||||||
final FlatButtonThemeResolver? themeResolver;
|
final FlatButtonThemeResolver? themeResolver;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ButtonCubit create(BuildContext context) => ButtonCubit();
|
ButtonCubit create(BuildContext context) => ButtonCubit();
|
||||||
|
|
||||||
|
@override
|
||||||
|
ButtonCubit init(BuildContext context, ButtonCubit bloc) {
|
||||||
|
disabled?.addListener(() => StateListener.listen(disabled, bloc));
|
||||||
|
/// Set the initial state depending on the disabled value
|
||||||
|
/// after adding the listener.
|
||||||
|
if (disabled?.value ?? false) {
|
||||||
|
bloc.disable();
|
||||||
|
}
|
||||||
|
return bloc;
|
||||||
|
}
|
||||||
|
|
||||||
/// Negotiate the theme to get a complete style.
|
/// Negotiate the theme to get a complete style.
|
||||||
FlatButtonStyle _resolve(BuildContext context, ControlState state) {
|
FlatButtonStyle _resolve(BuildContext context, ControlState state) {
|
||||||
final FlatButtonThemeResolver resolver = themeResolver ??
|
final FlatButtonThemeResolver resolver = themeResolver ??
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
import 'package:flutter/material.dart' hide ButtonStyle;
|
import 'package:flutter/material.dart' hide ButtonStyle;
|
||||||
import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart';
|
import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart';
|
||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/exportable_bloc.dart';
|
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/simple_icon_button/simple_icon_button_theme_resolver.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/simple_icon_button/simple_icon_button_theme_resolver.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/simple_icon_button/simple_icon_screen.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/simple_icon_button/simple_icon_screen.dart';
|
||||||
|
|
||||||
@ -27,7 +25,7 @@ part 'simple_icon_button.g.dart';
|
|||||||
@ComponentCopyWithExtension()
|
@ComponentCopyWithExtension()
|
||||||
class SimpleIconButton extends SimpleIconButtonComponent
|
class SimpleIconButton extends SimpleIconButtonComponent
|
||||||
with $SimpleIconButtonCWMixin {
|
with $SimpleIconButtonCWMixin {
|
||||||
SimpleIconButton({
|
const SimpleIconButton({
|
||||||
super.icon,
|
super.icon,
|
||||||
super.disabledStyle,
|
super.disabledStyle,
|
||||||
super.normalStyle,
|
super.normalStyle,
|
||||||
@ -35,14 +33,11 @@ class SimpleIconButton extends SimpleIconButtonComponent
|
|||||||
super.focusedStyle,
|
super.focusedStyle,
|
||||||
super.tappedStyle,
|
super.tappedStyle,
|
||||||
super.onPressed,
|
super.onPressed,
|
||||||
|
super.disabled,
|
||||||
super.themeResolver,
|
super.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
|
||||||
final ButtonCubit _cubit = ButtonCubit();
|
|
||||||
|
|
||||||
ButtonCubit get bloc => _cubit;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
SimpleIconButtonStyle? get disabledStyle =>
|
SimpleIconButtonStyle? get disabledStyle =>
|
||||||
super.disabledStyle as SimpleIconButtonStyle?;
|
super.disabledStyle as SimpleIconButtonStyle?;
|
||||||
@ -68,9 +63,7 @@ class SimpleIconButton extends SimpleIconButtonComponent
|
|||||||
super.themeResolver as SimpleIconButtonThemeResolver?;
|
super.themeResolver as SimpleIconButtonThemeResolver?;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => ExportableBloc(
|
Widget build(BuildContext context) => SimpleIconButtonScreen(
|
||||||
bloc: _cubit,
|
|
||||||
child: SimpleIconButtonScreen(
|
|
||||||
icon: icon,
|
icon: icon,
|
||||||
disabledStyle: disabledStyle,
|
disabledStyle: disabledStyle,
|
||||||
normalStyle: normalStyle,
|
normalStyle: normalStyle,
|
||||||
@ -78,8 +71,8 @@ class SimpleIconButton extends SimpleIconButtonComponent
|
|||||||
focusedStyle: focusedStyle,
|
focusedStyle: focusedStyle,
|
||||||
tappedStyle: tappedStyle,
|
tappedStyle: tappedStyle,
|
||||||
onPressed: onPressed,
|
onPressed: onPressed,
|
||||||
|
disabled: disabled,
|
||||||
themeResolver: themeResolver,
|
themeResolver: themeResolver,
|
||||||
key: key,
|
key: key,
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,9 @@ class $SimpleIconButtonCWProxyImpl
|
|||||||
SimpleIconButton onPressed(void Function(ControlState)? onPressed) =>
|
SimpleIconButton onPressed(void Function(ControlState)? onPressed) =>
|
||||||
this(onPressed: onPressed);
|
this(onPressed: onPressed);
|
||||||
@override
|
@override
|
||||||
|
SimpleIconButton disabled(ValueNotifier<bool>? disabled) =>
|
||||||
|
this(disabled: disabled);
|
||||||
|
@override
|
||||||
SimpleIconButton themeResolver(
|
SimpleIconButton themeResolver(
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver) =>
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver) =>
|
||||||
this(themeResolver: themeResolver);
|
this(themeResolver: themeResolver);
|
||||||
@ -45,6 +48,7 @@ class $SimpleIconButtonCWProxyImpl
|
|||||||
ButtonStyle<dynamic>? focusedStyle,
|
ButtonStyle<dynamic>? focusedStyle,
|
||||||
ButtonStyle<dynamic>? tappedStyle,
|
ButtonStyle<dynamic>? tappedStyle,
|
||||||
void Function(ControlState)? onPressed,
|
void Function(ControlState)? onPressed,
|
||||||
|
ValueNotifier<bool>? disabled,
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
||||||
Key? key,
|
Key? key,
|
||||||
}) =>
|
}) =>
|
||||||
@ -56,6 +60,7 @@ class $SimpleIconButtonCWProxyImpl
|
|||||||
focusedStyle: focusedStyle ?? _value.focusedStyle,
|
focusedStyle: focusedStyle ?? _value.focusedStyle,
|
||||||
tappedStyle: tappedStyle ?? _value.tappedStyle,
|
tappedStyle: tappedStyle ?? _value.tappedStyle,
|
||||||
onPressed: onPressed ?? _value.onPressed,
|
onPressed: onPressed ?? _value.onPressed,
|
||||||
|
disabled: disabled ?? _value.disabled,
|
||||||
themeResolver: themeResolver ?? _value.themeResolver,
|
themeResolver: themeResolver ?? _value.themeResolver,
|
||||||
key: key ?? _value.key,
|
key: key ?? _value.key,
|
||||||
);
|
);
|
||||||
|
@ -19,6 +19,7 @@ import 'package:flutter/services.dart';
|
|||||||
import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart';
|
import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart';
|
||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
||||||
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/state_listener.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/simple_icon_button/simple_icon_button_theme_resolver.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/simple_icon_button/simple_icon_button_theme_resolver.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/gradients/gradient_box_border.dart';
|
import 'package:wyatt_ui_kit/src/components/gradients/gradient_box_border.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/gradients/gradient_icon.dart';
|
import 'package:wyatt_ui_kit/src/components/gradients/gradient_icon.dart';
|
||||||
@ -33,6 +34,7 @@ class SimpleIconButtonScreen extends CubitScreen<ButtonCubit, ButtonState> {
|
|||||||
this.focusedStyle,
|
this.focusedStyle,
|
||||||
this.tappedStyle,
|
this.tappedStyle,
|
||||||
this.onPressed,
|
this.onPressed,
|
||||||
|
this.disabled,
|
||||||
this.themeResolver,
|
this.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
@ -46,11 +48,24 @@ class SimpleIconButtonScreen extends CubitScreen<ButtonCubit, ButtonState> {
|
|||||||
final SimpleIconButtonStyle? tappedStyle;
|
final SimpleIconButtonStyle? tappedStyle;
|
||||||
|
|
||||||
final void Function(ControlState state)? onPressed;
|
final void Function(ControlState state)? onPressed;
|
||||||
|
final ValueNotifier<bool>? disabled;
|
||||||
final SimpleIconButtonThemeResolver? themeResolver;
|
final SimpleIconButtonThemeResolver? themeResolver;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ButtonCubit create(BuildContext context) => ButtonCubit();
|
ButtonCubit create(BuildContext context) => ButtonCubit();
|
||||||
|
|
||||||
|
@override
|
||||||
|
ButtonCubit init(BuildContext context, ButtonCubit bloc) {
|
||||||
|
disabled?.addListener(() => StateListener.listen(disabled, bloc));
|
||||||
|
|
||||||
|
/// Set the initial state depending on the disabled value
|
||||||
|
/// after adding the listener.
|
||||||
|
if (disabled?.value ?? false) {
|
||||||
|
bloc.disable();
|
||||||
|
}
|
||||||
|
return bloc;
|
||||||
|
}
|
||||||
|
|
||||||
/// Negotiate the theme to get a complete style.
|
/// Negotiate the theme to get a complete style.
|
||||||
SimpleIconButtonStyle _resolve(BuildContext context, ControlState state) {
|
SimpleIconButtonStyle _resolve(BuildContext context, ControlState state) {
|
||||||
final SimpleIconButtonThemeResolver resolver = themeResolver ??
|
final SimpleIconButtonThemeResolver resolver = themeResolver ??
|
||||||
|
@ -17,17 +17,14 @@
|
|||||||
import 'package:flutter/material.dart' hide ButtonStyle;
|
import 'package:flutter/material.dart' hide ButtonStyle;
|
||||||
import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart';
|
import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart';
|
||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/selectable_button_cubit.dart';
|
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/exportable_bloc.dart';
|
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/symbol_button/symbol_button_screen.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/symbol_button/symbol_button_screen.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/symbol_button/symbol_button_theme_resolver.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/symbol_button/symbol_button_theme_resolver.dart';
|
||||||
|
|
||||||
part 'symbol_button.g.dart';
|
part 'symbol_button.g.dart';
|
||||||
|
|
||||||
@ComponentCopyWithExtension()
|
@ComponentCopyWithExtension()
|
||||||
class SymbolButton extends SymbolButtonComponent
|
class SymbolButton extends SymbolButtonComponent with $SymbolButtonCWMixin {
|
||||||
with $SymbolButtonCWMixin{
|
const SymbolButton({
|
||||||
SymbolButton({
|
|
||||||
super.icon,
|
super.icon,
|
||||||
super.label,
|
super.label,
|
||||||
super.disabledStyle,
|
super.disabledStyle,
|
||||||
@ -39,13 +36,10 @@ class SymbolButton extends SymbolButtonComponent
|
|||||||
super.mainAxisSize,
|
super.mainAxisSize,
|
||||||
super.themeResolver,
|
super.themeResolver,
|
||||||
super.onPressed,
|
super.onPressed,
|
||||||
|
super.disabled,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
|
||||||
final SelectableButtonCubit _cubit = SelectableButtonCubit();
|
|
||||||
|
|
||||||
SelectableButtonCubit get bloc => _cubit;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
SymbolButtonStyle? get disabledStyle =>
|
SymbolButtonStyle? get disabledStyle =>
|
||||||
super.disabledStyle as SymbolButtonStyle?;
|
super.disabledStyle as SymbolButtonStyle?;
|
||||||
@ -73,9 +67,7 @@ class SymbolButton extends SymbolButtonComponent
|
|||||||
super.themeResolver as SymbolButtonThemeResolver?;
|
super.themeResolver as SymbolButtonThemeResolver?;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => ExportableBloc(
|
Widget build(BuildContext context) => SymbolButtonScreen(
|
||||||
bloc: _cubit,
|
|
||||||
child: SymbolButtonScreen(
|
|
||||||
icon: icon,
|
icon: icon,
|
||||||
label: label,
|
label: label,
|
||||||
disabledStyle: disabledStyle,
|
disabledStyle: disabledStyle,
|
||||||
@ -85,9 +77,9 @@ class SymbolButton extends SymbolButtonComponent
|
|||||||
tappedStyle: tappedStyle,
|
tappedStyle: tappedStyle,
|
||||||
selectedStyle: selectedStyle,
|
selectedStyle: selectedStyle,
|
||||||
onPressed: onPressed,
|
onPressed: onPressed,
|
||||||
|
disabled: disabled,
|
||||||
mainAxisSize: mainAxisSize,
|
mainAxisSize: mainAxisSize,
|
||||||
themeResolver: themeResolver,
|
themeResolver: themeResolver,
|
||||||
key: key,
|
key: key,
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,9 @@ class $SymbolButtonCWProxyImpl implements $SymbolButtonComponentCWProxy {
|
|||||||
SymbolButton onPressed(void Function(ControlState)? onPressed) =>
|
SymbolButton onPressed(void Function(ControlState)? onPressed) =>
|
||||||
this(onPressed: onPressed);
|
this(onPressed: onPressed);
|
||||||
@override
|
@override
|
||||||
|
SymbolButton disabled(ValueNotifier<bool>? disabled) =>
|
||||||
|
this(disabled: disabled);
|
||||||
|
@override
|
||||||
SymbolButton themeResolver(
|
SymbolButton themeResolver(
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver) =>
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver) =>
|
||||||
this(themeResolver: themeResolver);
|
this(themeResolver: themeResolver);
|
||||||
@ -55,6 +58,7 @@ class $SymbolButtonCWProxyImpl implements $SymbolButtonComponentCWProxy {
|
|||||||
ButtonStyle<dynamic>? tappedStyle,
|
ButtonStyle<dynamic>? tappedStyle,
|
||||||
ButtonStyle<dynamic>? selectedStyle,
|
ButtonStyle<dynamic>? selectedStyle,
|
||||||
void Function(ControlState)? onPressed,
|
void Function(ControlState)? onPressed,
|
||||||
|
ValueNotifier<bool>? disabled,
|
||||||
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
ThemeResolver<dynamic, dynamic, dynamic>? themeResolver,
|
||||||
Key? key,
|
Key? key,
|
||||||
}) =>
|
}) =>
|
||||||
@ -70,6 +74,7 @@ class $SymbolButtonCWProxyImpl implements $SymbolButtonComponentCWProxy {
|
|||||||
mainAxisSize: mainAxisSize ?? _value.mainAxisSize,
|
mainAxisSize: mainAxisSize ?? _value.mainAxisSize,
|
||||||
themeResolver: themeResolver ?? _value.themeResolver,
|
themeResolver: themeResolver ?? _value.themeResolver,
|
||||||
onPressed: onPressed ?? _value.onPressed,
|
onPressed: onPressed ?? _value.onPressed,
|
||||||
|
disabled: disabled ?? _value.disabled,
|
||||||
key: key ?? _value.key,
|
key: key ?? _value.key,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart';
|
|||||||
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/button_cubit.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/cubit/selectable_button_cubit.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/selectable_button_cubit.dart';
|
||||||
|
import 'package:wyatt_ui_kit/src/components/buttons/cubit/state_listener.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/buttons/symbol_button/symbol_button_theme_resolver.dart';
|
import 'package:wyatt_ui_kit/src/components/buttons/symbol_button/symbol_button_theme_resolver.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/gradients/gradient_box_border.dart';
|
import 'package:wyatt_ui_kit/src/components/gradients/gradient_box_border.dart';
|
||||||
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
|
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
|
||||||
@ -37,6 +38,7 @@ class SymbolButtonScreen
|
|||||||
this.tappedStyle,
|
this.tappedStyle,
|
||||||
this.selectedStyle,
|
this.selectedStyle,
|
||||||
this.onPressed,
|
this.onPressed,
|
||||||
|
this.disabled,
|
||||||
this.mainAxisSize,
|
this.mainAxisSize,
|
||||||
this.themeResolver,
|
this.themeResolver,
|
||||||
super.key,
|
super.key,
|
||||||
@ -54,11 +56,26 @@ class SymbolButtonScreen
|
|||||||
final SymbolButtonStyle? selectedStyle;
|
final SymbolButtonStyle? selectedStyle;
|
||||||
|
|
||||||
final void Function(ControlState state)? onPressed;
|
final void Function(ControlState state)? onPressed;
|
||||||
|
final ValueNotifier<bool>? disabled;
|
||||||
final SymbolButtonThemeResolver? themeResolver;
|
final SymbolButtonThemeResolver? themeResolver;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
SelectableButtonCubit create(BuildContext context) => SelectableButtonCubit();
|
SelectableButtonCubit create(BuildContext context) => SelectableButtonCubit();
|
||||||
|
|
||||||
|
@override
|
||||||
|
SelectableButtonCubit init(BuildContext context, SelectableButtonCubit bloc) {
|
||||||
|
disabled?.addListener(
|
||||||
|
() => StateListener.listen<SelectableButtonCubit>(disabled, bloc),
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Set the initial state depending on the disabled value
|
||||||
|
/// after adding the listener.
|
||||||
|
if (disabled?.value ?? false) {
|
||||||
|
bloc.disable();
|
||||||
|
}
|
||||||
|
return bloc;
|
||||||
|
}
|
||||||
|
|
||||||
/// Negotiate the theme to get a complete style.
|
/// Negotiate the theme to get a complete style.
|
||||||
SymbolButtonStyle _resolve(BuildContext context, ButtonState state) {
|
SymbolButtonStyle _resolve(BuildContext context, ButtonState state) {
|
||||||
final SymbolButtonThemeResolver resolver = themeResolver ??
|
final SymbolButtonThemeResolver resolver = themeResolver ??
|
||||||
|
Loading…
x
Reference in New Issue
Block a user