fix: create view panel icon color

This commit is contained in:
appflowy 2022-09-23 17:27:30 +08:00
parent ee7cb0cb42
commit 0218f4e8b9
11 changed files with 104 additions and 61 deletions

View File

@ -133,7 +133,8 @@ class _BoardCardState extends State<BoardCard> {
throw UnimplementedError(); throw UnimplementedError();
case AccessoryType.more: case AccessoryType.more:
return GridRowActionSheet( return GridRowActionSheet(
rowData: context.read<BoardCardBloc>().rowInfo()); rowData: context.read<BoardCardBloc>().rowInfo(),
);
} }
} }

View File

@ -233,7 +233,7 @@ class ShareActionWrapper extends ActionItem {
ShareActionWrapper(this.inner); ShareActionWrapper(this.inner);
@override @override
Widget? get icon => null; Widget? icon(Color iconColor) => null;
@override @override
String get name => inner.name; String get name => inner.name;

View File

@ -76,7 +76,7 @@ class _DateCellEditor extends State<DateCellEditor> {
} }
} }
class _CellCalendarWidget extends StatelessWidget { class _CellCalendarWidget extends StatefulWidget {
final GridDateCellController cellContext; final GridDateCellController cellContext;
final DateTypeOptionPB dateTypeOptionPB; final DateTypeOptionPB dateTypeOptionPB;
@ -86,26 +86,43 @@ class _CellCalendarWidget extends StatelessWidget {
Key? key, Key? key,
}) : super(key: key); }) : super(key: key);
@override
State<_CellCalendarWidget> createState() => _CellCalendarWidgetState();
}
class _CellCalendarWidgetState extends State<_CellCalendarWidget> {
late PopoverMutex popoverMutex;
late DateCalBloc bloc;
@override
void initState() {
popoverMutex = PopoverMutex();
bloc = DateCalBloc(
dateTypeOptionPB: widget.dateTypeOptionPB,
cellData: widget.cellContext.getCellData(),
cellController: widget.cellContext,
)..add(const DateCalEvent.initial());
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final theme = context.watch<AppTheme>(); final theme = context.watch<AppTheme>();
return BlocProvider( return BlocProvider.value(
create: (context) { value: bloc,
return DateCalBloc(
dateTypeOptionPB: dateTypeOptionPB,
cellData: cellContext.getCellData(),
cellController: cellContext,
)..add(const DateCalEvent.initial());
},
child: BlocBuilder<DateCalBloc, DateCalState>( child: BlocBuilder<DateCalBloc, DateCalState>(
buildWhen: (p, c) => false, buildWhen: (p, c) => false,
builder: (context, state) { builder: (context, state) {
List<Widget> children = [ List<Widget> children = [
_buildCalendar(theme, context), _buildCalendar(theme, context),
_TimeTextField(bloc: context.read<DateCalBloc>()), _TimeTextField(
bloc: context.read<DateCalBloc>(),
popoverMutex: popoverMutex,
),
Divider(height: 1, color: theme.shader5), Divider(height: 1, color: theme.shader5),
const _IncludeTimeButton(), const _IncludeTimeButton(),
const _DateTypeOptionButton() _DateTypeOptionButton(popoverMutex: popoverMutex)
]; ];
return ListView.separated( return ListView.separated(
@ -124,6 +141,13 @@ class _CellCalendarWidget extends StatelessWidget {
); );
} }
@override
void dispose() {
bloc.close();
popoverMutex.dispose();
super.dispose();
}
Widget _buildCalendar(AppTheme theme, BuildContext context) { Widget _buildCalendar(AppTheme theme, BuildContext context) {
return BlocBuilder<DateCalBloc, DateCalState>( return BlocBuilder<DateCalBloc, DateCalState>(
builder: (context, state) { builder: (context, state) {
@ -223,8 +247,10 @@ class _IncludeTimeButton extends StatelessWidget {
class _TimeTextField extends StatefulWidget { class _TimeTextField extends StatefulWidget {
final DateCalBloc bloc; final DateCalBloc bloc;
final PopoverMutex popoverMutex;
const _TimeTextField({ const _TimeTextField({
required this.bloc, required this.bloc,
required this.popoverMutex,
Key? key, Key? key,
}) : super(key: key); }) : super(key: key);
@ -245,9 +271,18 @@ class _TimeTextFieldState extends State<_TimeTextField> {
if (mounted) { if (mounted) {
widget.bloc.add(DateCalEvent.setTime(_controller.text)); widget.bloc.add(DateCalEvent.setTime(_controller.text));
} }
if (_focusNode.hasFocus) {
widget.popoverMutex.close();
}
});
widget.popoverMutex.listenOnPopoverChanged(() {
if (_focusNode.hasFocus) {
_focusNode.unfocus();
}
}); });
} }
super.initState(); super.initState();
} }
@ -295,7 +330,11 @@ class _TimeTextFieldState extends State<_TimeTextField> {
} }
class _DateTypeOptionButton extends StatelessWidget { class _DateTypeOptionButton extends StatelessWidget {
const _DateTypeOptionButton({Key? key}) : super(key: key); final PopoverMutex popoverMutex;
const _DateTypeOptionButton({
required this.popoverMutex,
Key? key,
}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -306,6 +345,7 @@ class _DateTypeOptionButton extends StatelessWidget {
selector: (state) => state.dateTypeOptionPB, selector: (state) => state.dateTypeOptionPB,
builder: (context, dateTypeOptionPB) { builder: (context, dateTypeOptionPB) {
return AppFlowyPopover( return AppFlowyPopover(
mutex: popoverMutex,
triggerActions: PopoverTriggerFlags.hover | PopoverTriggerFlags.click, triggerActions: PopoverTriggerFlags.hover | PopoverTriggerFlags.click,
offset: const Offset(20, 0), offset: const Offset(20, 0),
constraints: BoxConstraints.loose(const Size(140, 100)), constraints: BoxConstraints.loose(const Size(140, 100)),
@ -318,6 +358,7 @@ class _DateTypeOptionButton extends StatelessWidget {
popupBuilder: (BuildContext popContext) { popupBuilder: (BuildContext popContext) {
return _CalDateTimeSetting( return _CalDateTimeSetting(
dateTypeOptionPB: dateTypeOptionPB, dateTypeOptionPB: dateTypeOptionPB,
popoverMutex: popoverMutex,
onEvent: (event) => context.read<DateCalBloc>().add(event), onEvent: (event) => context.read<DateCalBloc>().add(event),
); );
}, },
@ -328,11 +369,15 @@ class _DateTypeOptionButton extends StatelessWidget {
} }
class _CalDateTimeSetting extends StatefulWidget { class _CalDateTimeSetting extends StatefulWidget {
final PopoverMutex popoverMutex;
final DateTypeOptionPB dateTypeOptionPB; final DateTypeOptionPB dateTypeOptionPB;
final Function(DateCalEvent) onEvent; final Function(DateCalEvent) onEvent;
const _CalDateTimeSetting( const _CalDateTimeSetting({
{required this.dateTypeOptionPB, required this.onEvent, Key? key}) required this.dateTypeOptionPB,
: super(key: key); required this.popoverMutex,
required this.onEvent,
Key? key,
}) : super(key: key);
@override @override
State<_CalDateTimeSetting> createState() => _CalDateTimeSettingState(); State<_CalDateTimeSetting> createState() => _CalDateTimeSettingState();
@ -340,13 +385,12 @@ class _CalDateTimeSetting extends StatefulWidget {
class _CalDateTimeSettingState extends State<_CalDateTimeSetting> { class _CalDateTimeSettingState extends State<_CalDateTimeSetting> {
String? overlayIdentifier; String? overlayIdentifier;
final _popoverMutex = PopoverMutex();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<Widget> children = [ List<Widget> children = [
AppFlowyPopover( AppFlowyPopover(
mutex: _popoverMutex, mutex: widget.popoverMutex,
asBarrier: true, asBarrier: true,
triggerActions: PopoverTriggerFlags.hover | PopoverTriggerFlags.click, triggerActions: PopoverTriggerFlags.hover | PopoverTriggerFlags.click,
offset: const Offset(20, 0), offset: const Offset(20, 0),
@ -360,7 +404,7 @@ class _CalDateTimeSettingState extends State<_CalDateTimeSetting> {
child: const DateFormatButton(), child: const DateFormatButton(),
), ),
AppFlowyPopover( AppFlowyPopover(
mutex: _popoverMutex, mutex: widget.popoverMutex,
asBarrier: true, asBarrier: true,
triggerActions: PopoverTriggerFlags.hover | PopoverTriggerFlags.click, triggerActions: PopoverTriggerFlags.hover | PopoverTriggerFlags.click,
offset: const Offset(20, 0), offset: const Offset(20, 0),

View File

@ -139,7 +139,6 @@ class _FieldNameTextField extends StatefulWidget {
class _FieldNameTextFieldState extends State<_FieldNameTextField> { class _FieldNameTextFieldState extends State<_FieldNameTextField> {
FocusNode focusNode = FocusNode(); FocusNode focusNode = FocusNode();
VoidCallback? _popoverCallback;
late TextEditingController controller; late TextEditingController controller;
@override @override
@ -151,6 +150,12 @@ class _FieldNameTextFieldState extends State<_FieldNameTextField> {
} }
}); });
widget.popoverMutex.listenOnPopoverChanged(() {
if (focusNode.hasFocus) {
focusNode.unfocus();
}
});
super.initState(); super.initState();
} }
@ -176,8 +181,6 @@ class _FieldNameTextFieldState extends State<_FieldNameTextField> {
buildWhen: (previous, current) => buildWhen: (previous, current) =>
previous.errorText != current.errorText, previous.errorText != current.errorText,
builder: (context, state) { builder: (context, state) {
listenOnPopoverChanged(context);
return RoundedInputField( return RoundedInputField(
height: 36, height: 36,
focusNode: focusNode, focusNode: focusNode,
@ -198,18 +201,6 @@ class _FieldNameTextFieldState extends State<_FieldNameTextField> {
), ),
); );
} }
void listenOnPopoverChanged(BuildContext context) {
if (_popoverCallback != null) {
widget.popoverMutex.removePopoverListener(_popoverCallback!);
}
_popoverCallback = widget.popoverMutex.listenOnPopoverChanged(() {
if (focusNode.hasFocus) {
final node = FocusScope.of(context);
node.unfocus();
}
});
}
} }
class _DeleteFieldButton extends StatelessWidget { class _DeleteFieldButton extends StatelessWidget {

View File

@ -5,9 +5,12 @@ import 'package:flutter/material.dart';
import 'header.dart'; import 'header.dart';
class AppDisclosureActionSheet with ActionList<DisclosureActionWrapper>, FlowyOverlayDelegate { class AppDisclosureActionSheet
with ActionList<DisclosureActionWrapper>, FlowyOverlayDelegate {
final Function(dartz.Option<AppDisclosureAction>) onSelected; final Function(dartz.Option<AppDisclosureAction>) onSelected;
final _items = AppDisclosureAction.values.map((action) => DisclosureActionWrapper(action)).toList(); final _items = AppDisclosureAction.values
.map((action) => DisclosureActionWrapper(action))
.toList();
AppDisclosureActionSheet({ AppDisclosureActionSheet({
required this.onSelected, required this.onSelected,
@ -17,7 +20,8 @@ class AppDisclosureActionSheet with ActionList<DisclosureActionWrapper>, FlowyOv
List<DisclosureActionWrapper> get items => _items; List<DisclosureActionWrapper> get items => _items;
@override @override
void Function(dartz.Option<DisclosureActionWrapper> p1) get selectCallback => (result) { void Function(dartz.Option<DisclosureActionWrapper> p1) get selectCallback =>
(result) {
result.fold( result.fold(
() => onSelected(dartz.none()), () => onSelected(dartz.none()),
(wrapper) => onSelected( (wrapper) => onSelected(
@ -40,7 +44,7 @@ class DisclosureActionWrapper extends ActionItem {
DisclosureActionWrapper(this.inner); DisclosureActionWrapper(this.inner);
@override @override
Widget? get icon => inner.icon; Widget? icon(Color iconColor) => inner.icon;
@override @override
String get name => inner.name; String get name => inner.name;

View File

@ -80,7 +80,7 @@ class ViewDisclosureRegion extends StatelessWidget
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Listener( return Listener(
onPointerDown: (event) => {_handleClick(event, context)}, onPointerDown: (event) => _handleClick(event, context),
child: child, child: child,
); );
} }
@ -123,7 +123,7 @@ class ViewDisclosureActionWrapper extends ActionItem {
ViewDisclosureActionWrapper(this.inner); ViewDisclosureActionWrapper(this.inner);
@override @override
Widget? get icon => inner.icon; Widget? icon(Color iconColor) => inner.icon(iconColor);
@override @override
String get name => inner.name; String get name => inner.name;

View File

@ -147,14 +147,14 @@ extension ViewDisclosureExtension on ViewDisclosureAction {
} }
} }
Widget get icon { Widget icon(Color iconColor) {
switch (this) { switch (this) {
case ViewDisclosureAction.rename: case ViewDisclosureAction.rename:
return svgWidget('editor/edit', color: const Color(0xff999999)); return svgWidget('editor/edit', color: iconColor);
case ViewDisclosureAction.delete: case ViewDisclosureAction.delete:
return svgWidget('editor/delete', color: const Color(0xff999999)); return svgWidget('editor/delete', color: iconColor);
case ViewDisclosureAction.duplicate: case ViewDisclosureAction.duplicate:
return svgWidget('editor/copy', color: const Color(0xff999999)); return svgWidget('editor/copy', color: iconColor);
} }
} }
} }

View File

@ -101,9 +101,11 @@ class _DebugToast {
} }
} }
class QuestionBubbleActionSheet with ActionList<BubbleActionWrapper>, FlowyOverlayDelegate { class QuestionBubbleActionSheet
with ActionList<BubbleActionWrapper>, FlowyOverlayDelegate {
final Function(dartz.Option<BubbleAction>) onSelected; final Function(dartz.Option<BubbleAction>) onSelected;
final _items = BubbleAction.values.map((action) => BubbleActionWrapper(action)).toList(); final _items =
BubbleAction.values.map((action) => BubbleActionWrapper(action)).toList();
QuestionBubbleActionSheet({ QuestionBubbleActionSheet({
required this.onSelected, required this.onSelected,
@ -119,7 +121,8 @@ class QuestionBubbleActionSheet with ActionList<BubbleActionWrapper>, FlowyOverl
List<BubbleActionWrapper> get items => _items; List<BubbleActionWrapper> get items => _items;
@override @override
void Function(dartz.Option<BubbleActionWrapper> p1) get selectCallback => (result) { void Function(dartz.Option<BubbleActionWrapper> p1) get selectCallback =>
(result) {
result.fold( result.fold(
() => onSelected(dartz.none()), () => onSelected(dartz.none()),
(wrapper) => onSelected( (wrapper) => onSelected(
@ -156,7 +159,8 @@ class FlowyVersionDescription extends StatelessWidget {
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) { builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.connectionState == ConnectionState.done) { if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) { if (snapshot.hasError) {
return FlowyText("Error: ${snapshot.error}", fontSize: 12, color: theme.shader4); return FlowyText("Error: ${snapshot.error}",
fontSize: 12, color: theme.shader4);
} }
PackageInfo packageInfo = snapshot.data; PackageInfo packageInfo = snapshot.data;
@ -170,7 +174,8 @@ class FlowyVersionDescription extends StatelessWidget {
children: [ children: [
Divider(height: 1, color: theme.shader6, thickness: 1.0), Divider(height: 1, color: theme.shader6, thickness: 1.0),
const VSpace(6), const VSpace(6),
FlowyText("$appName $version.$buildNumber", fontSize: 12, color: theme.shader4), FlowyText("$appName $version.$buildNumber",
fontSize: 12, color: theme.shader4),
], ],
).padding( ).padding(
horizontal: ActionListSizes.itemHPadding + ActionListSizes.padding, horizontal: ActionListSizes.itemHPadding + ActionListSizes.padding,
@ -190,7 +195,7 @@ class BubbleActionWrapper extends ActionItem {
BubbleActionWrapper(this.inner); BubbleActionWrapper(this.inner);
@override @override
Widget? get icon => inner.emoji; Widget? icon(Color iconColor) => inner.emoji;
@override @override
String get name => inner.name; String get name => inner.name;

View File

@ -59,7 +59,7 @@ abstract class ActionList<T extends ActionItem> {
} }
abstract class ActionItem { abstract class ActionItem {
Widget? get icon; Widget? icon(Color iconColor);
String get name; String get name;
} }
@ -83,6 +83,7 @@ class ActionCell<T extends ActionItem> extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final theme = context.watch<AppTheme>(); final theme = context.watch<AppTheme>();
final icon = action.icon(theme.iconColor);
return FlowyHover( return FlowyHover(
style: HoverStyle(hoverColor: theme.hover), style: HoverStyle(hoverColor: theme.hover),
@ -94,12 +95,9 @@ class ActionCell<T extends ActionItem> extends StatelessWidget {
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
if (action.icon != null) action.icon!, if (icon != null) icon,
HSpace(ActionListSizes.itemHPadding), HSpace(ActionListSizes.itemHPadding),
FlowyText.medium( FlowyText.medium(action.name, fontSize: 12),
action.name,
fontSize: 12,
),
], ],
), ),
).padding( ).padding(

View File

@ -30,7 +30,7 @@ class AppFlowyPopover extends StatelessWidget {
this.offset, this.offset,
this.controller, this.controller,
this.asBarrier = false, this.asBarrier = false,
this.margin = const EdgeInsets.all(12), this.margin = const EdgeInsets.all(6),
}) : super(key: key); }) : super(key: key);
@override @override

View File

@ -55,7 +55,7 @@ impl GroupControllerSharedOperation for DefaultGroupController {
_row_rev: &RowRevision, _row_rev: &RowRevision,
_field_rev: &FieldRevision, _field_rev: &FieldRevision,
) -> FlowyResult<Vec<GroupChangesetPB>> { ) -> FlowyResult<Vec<GroupChangesetPB>> {
todo!() Ok(vec![])
} }
fn did_delete_row( fn did_delete_row(
@ -63,7 +63,7 @@ impl GroupControllerSharedOperation for DefaultGroupController {
_row_rev: &RowRevision, _row_rev: &RowRevision,
_field_rev: &FieldRevision, _field_rev: &FieldRevision,
) -> FlowyResult<Vec<GroupChangesetPB>> { ) -> FlowyResult<Vec<GroupChangesetPB>> {
todo!() Ok(vec![])
} }
fn move_group_row(&mut self, _context: MoveGroupRowContext) -> FlowyResult<Vec<GroupChangesetPB>> { fn move_group_row(&mut self, _context: MoveGroupRowContext) -> FlowyResult<Vec<GroupChangesetPB>> {