Skip to content

Commit 03e3c2e

Browse files
authored
Merge pull request #1110 from AppFlowy-IO/feat/highlight_trash_button
Feat/highlight trash button
2 parents 488882c + 7e972c3 commit 03e3c2e

File tree

3 files changed

+174
-163
lines changed

3 files changed

+174
-163
lines changed

frontend/app_flowy/lib/plugins/trash/src/trash_cell.dart

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,41 @@ class TrashCell extends StatelessWidget {
1515
final VoidCallback onRestore;
1616
final VoidCallback onDelete;
1717
final TrashPB object;
18-
const TrashCell({required this.object, required this.onRestore, required this.onDelete, Key? key}) : super(key: key);
18+
const TrashCell(
19+
{required this.object,
20+
required this.onRestore,
21+
required this.onDelete,
22+
Key? key})
23+
: super(key: key);
1924

2025
@override
2126
Widget build(BuildContext context) {
2227
final theme = context.watch<AppTheme>();
2328
return Row(
2429
children: [
25-
SizedBox(width: TrashSizes.fileNameWidth, child: FlowyText(object.name, fontSize: 12)),
26-
SizedBox(width: TrashSizes.lashModifyWidth, child: FlowyText(dateFormatter(object.modifiedTime), fontSize: 12)),
27-
SizedBox(width: TrashSizes.createTimeWidth, child: FlowyText(dateFormatter(object.createTime), fontSize: 12)),
30+
SizedBox(
31+
width: TrashSizes.fileNameWidth,
32+
child: FlowyText(object.name, fontSize: 12)),
33+
SizedBox(
34+
width: TrashSizes.lashModifyWidth,
35+
child: FlowyText(dateFormatter(object.modifiedTime), fontSize: 12)),
36+
SizedBox(
37+
width: TrashSizes.createTimeWidth,
38+
child: FlowyText(dateFormatter(object.createTime), fontSize: 12)),
2839
const Spacer(),
2940
FlowyIconButton(
30-
width: 16,
41+
width: 26,
3142
onPressed: onRestore,
43+
hoverColor: theme.hover,
44+
iconPadding: const EdgeInsets.all(5),
3245
icon: svgWidget("editor/restore", color: theme.iconColor),
3346
),
3447
const HSpace(20),
3548
FlowyIconButton(
36-
width: 16,
49+
width: 26,
3750
onPressed: onDelete,
51+
hoverColor: theme.hover,
52+
iconPadding: const EdgeInsets.all(5),
3853
icon: svgWidget("editor/delete", color: theme.iconColor),
3954
),
4055
],
@@ -43,7 +58,8 @@ class TrashCell extends StatelessWidget {
4358

4459
String dateFormatter($fixnum.Int64 inputTimestamps) {
4560
var outputFormat = DateFormat('MM/dd/yyyy hh:mm a');
46-
var date = DateTime.fromMillisecondsSinceEpoch(inputTimestamps.toInt() * 1000);
61+
var date =
62+
DateTime.fromMillisecondsSinceEpoch(inputTimestamps.toInt() * 1000);
4763
var outputDate = outputFormat.format(date);
4864
return outputDate;
4965
}

frontend/app_flowy/lib/plugins/trash/trash.dart

Lines changed: 1 addition & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,13 @@ export "./src/trash_cell.dart";
33
export "./src/trash_header.dart";
44

55
import 'package:app_flowy/startup/plugin/plugin.dart';
6-
import 'package:app_flowy/startup/startup.dart';
7-
import 'package:app_flowy/plugins/trash/application/trash_bloc.dart';
86
import 'package:app_flowy/workspace/presentation/home/home_stack.dart';
97
import 'package:easy_localization/easy_localization.dart';
10-
import 'package:flowy_infra/image.dart';
11-
import 'package:flowy_infra/theme.dart';
12-
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
13-
import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart';
14-
import 'package:flowy_infra_ui/style_widget/scrolling/styled_scrollview.dart';
158
import 'package:flowy_infra_ui/style_widget/text.dart';
16-
import 'package:flowy_infra_ui/style_widget/button.dart';
17-
import 'package:flowy_infra_ui/widget/spacing.dart';
189
import 'package:flutter/material.dart';
19-
import 'package:flutter_bloc/flutter_bloc.dart';
20-
import 'package:styled_widget/styled_widget.dart';
2110
import 'package:app_flowy/generated/locale_keys.g.dart';
2211

23-
import 'src/sizes.dart';
24-
import 'src/trash_cell.dart';
25-
import 'src/trash_header.dart';
12+
import 'trash_page.dart';
2613

2714
class TrashPluginBuilder extends PluginBuilder {
2815
@override
@@ -71,145 +58,3 @@ class TrashPluginDisplay extends PluginDisplay {
7158
@override
7259
List<NavigationItem> get navigationItems => [this];
7360
}
74-
75-
class TrashPage extends StatefulWidget {
76-
const TrashPage({Key? key}) : super(key: key);
77-
78-
@override
79-
State<TrashPage> createState() => _TrashPageState();
80-
}
81-
82-
class _TrashPageState extends State<TrashPage> {
83-
final ScrollController _scrollController = ScrollController();
84-
@override
85-
Widget build(BuildContext context) {
86-
final theme = context.watch<AppTheme>();
87-
const horizontalPadding = 80.0;
88-
return BlocProvider(
89-
create: (context) => getIt<TrashBloc>()..add(const TrashEvent.initial()),
90-
child: BlocBuilder<TrashBloc, TrashState>(
91-
builder: (context, state) {
92-
return SizedBox.expand(
93-
child: Column(
94-
mainAxisAlignment: MainAxisAlignment.start,
95-
children: [
96-
_renderTopBar(context, theme, state),
97-
const VSpace(32),
98-
_renderTrashList(context, state),
99-
],
100-
).padding(horizontal: horizontalPadding, vertical: 48),
101-
);
102-
},
103-
),
104-
);
105-
}
106-
107-
Widget _renderTrashList(BuildContext context, TrashState state) {
108-
const barSize = 6.0;
109-
return Expanded(
110-
child: ScrollbarListStack(
111-
axis: Axis.vertical,
112-
controller: _scrollController,
113-
scrollbarPadding: EdgeInsets.only(top: TrashSizes.headerHeight),
114-
barSize: barSize,
115-
child: StyledSingleChildScrollView(
116-
controller: ScrollController(),
117-
barSize: barSize,
118-
axis: Axis.horizontal,
119-
child: SizedBox(
120-
width: TrashSizes.totalWidth,
121-
child: ScrollConfiguration(
122-
behavior: const ScrollBehavior().copyWith(scrollbars: false),
123-
child: CustomScrollView(
124-
shrinkWrap: true,
125-
physics: StyledScrollPhysics(),
126-
controller: _scrollController,
127-
slivers: [
128-
_renderListHeader(context, state),
129-
_renderListBody(context, state),
130-
],
131-
),
132-
),
133-
),
134-
),
135-
),
136-
);
137-
}
138-
139-
Widget _renderTopBar(BuildContext context, AppTheme theme, TrashState state) {
140-
return SizedBox(
141-
height: 36,
142-
child: Row(
143-
crossAxisAlignment: CrossAxisAlignment.stretch,
144-
children: [
145-
FlowyText.semibold(LocaleKeys.trash_text.tr()),
146-
const Spacer(),
147-
IntrinsicWidth(
148-
child: FlowyButton(
149-
text: FlowyText.medium(LocaleKeys.trash_restoreAll.tr(),
150-
fontSize: 12),
151-
leftIcon: svgWidget('editor/restore', color: theme.iconColor),
152-
hoverColor: theme.hover,
153-
onTap: () => context.read<TrashBloc>().add(
154-
const TrashEvent.restoreAll(),
155-
),
156-
),
157-
),
158-
const HSpace(6),
159-
IntrinsicWidth(
160-
child: FlowyButton(
161-
text: FlowyText.medium(LocaleKeys.trash_deleteAll.tr(),
162-
fontSize: 12),
163-
leftIcon: svgWidget('editor/delete', color: theme.iconColor),
164-
hoverColor: theme.hover,
165-
onTap: () =>
166-
context.read<TrashBloc>().add(const TrashEvent.deleteAll()),
167-
),
168-
)
169-
],
170-
),
171-
);
172-
}
173-
174-
Widget _renderListHeader(BuildContext context, TrashState state) {
175-
return SliverPersistentHeader(
176-
delegate: TrashHeaderDelegate(),
177-
floating: true,
178-
pinned: true,
179-
);
180-
}
181-
182-
Widget _renderListBody(BuildContext context, TrashState state) {
183-
return SliverList(
184-
delegate: SliverChildBuilderDelegate(
185-
(BuildContext context, int index) {
186-
final object = state.objects[index];
187-
return SizedBox(
188-
height: 42,
189-
child: TrashCell(
190-
object: object,
191-
onRestore: () {
192-
context.read<TrashBloc>().add(TrashEvent.putback(object.id));
193-
},
194-
onDelete: () =>
195-
context.read<TrashBloc>().add(TrashEvent.delete(object)),
196-
),
197-
);
198-
},
199-
childCount: state.objects.length,
200-
addAutomaticKeepAlives: false,
201-
),
202-
);
203-
}
204-
}
205-
// class TrashScrollbar extends ScrollBehavior {
206-
// @override
207-
// Widget buildScrollbar(BuildContext context, Widget child, ScrollableDetails details) {
208-
// return ScrollbarListStack(
209-
// controller: details.controller,
210-
// axis: Axis.vertical,
211-
// barSize: 6,
212-
// child: child,
213-
// );
214-
// }
215-
// }
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
import 'package:app_flowy/generated/locale_keys.g.dart';
2+
import 'package:app_flowy/plugins/trash/src/sizes.dart';
3+
import 'package:app_flowy/plugins/trash/src/trash_header.dart';
4+
import 'package:app_flowy/startup/startup.dart';
5+
import 'package:easy_localization/easy_localization.dart';
6+
import 'package:flowy_infra/image.dart';
7+
import 'package:flowy_infra/theme.dart';
8+
import 'package:flowy_infra_ui/style_widget/button.dart';
9+
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
10+
import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart';
11+
import 'package:flowy_infra_ui/style_widget/scrolling/styled_scrollview.dart';
12+
import 'package:flowy_infra_ui/style_widget/text.dart';
13+
import 'package:flowy_infra_ui/widget/spacing.dart';
14+
import 'package:flutter/material.dart';
15+
import 'package:flutter_bloc/flutter_bloc.dart';
16+
import 'package:styled_widget/styled_widget.dart';
17+
18+
import 'application/trash_bloc.dart';
19+
import 'src/trash_cell.dart';
20+
21+
class TrashPage extends StatefulWidget {
22+
const TrashPage({Key? key}) : super(key: key);
23+
24+
@override
25+
State<TrashPage> createState() => _TrashPageState();
26+
}
27+
28+
class _TrashPageState extends State<TrashPage> {
29+
final ScrollController _scrollController = ScrollController();
30+
@override
31+
Widget build(BuildContext context) {
32+
final theme = context.watch<AppTheme>();
33+
const horizontalPadding = 80.0;
34+
return BlocProvider(
35+
create: (context) => getIt<TrashBloc>()..add(const TrashEvent.initial()),
36+
child: BlocBuilder<TrashBloc, TrashState>(
37+
builder: (context, state) {
38+
return SizedBox.expand(
39+
child: Column(
40+
mainAxisAlignment: MainAxisAlignment.start,
41+
children: [
42+
_renderTopBar(context, theme, state),
43+
const VSpace(32),
44+
_renderTrashList(context, state),
45+
],
46+
).padding(horizontal: horizontalPadding, vertical: 48),
47+
);
48+
},
49+
),
50+
);
51+
}
52+
53+
Widget _renderTrashList(BuildContext context, TrashState state) {
54+
const barSize = 6.0;
55+
return Expanded(
56+
child: ScrollbarListStack(
57+
axis: Axis.vertical,
58+
controller: _scrollController,
59+
scrollbarPadding: EdgeInsets.only(top: TrashSizes.headerHeight),
60+
barSize: barSize,
61+
child: StyledSingleChildScrollView(
62+
controller: ScrollController(),
63+
barSize: barSize,
64+
axis: Axis.horizontal,
65+
child: SizedBox(
66+
width: TrashSizes.totalWidth,
67+
child: ScrollConfiguration(
68+
behavior: const ScrollBehavior().copyWith(scrollbars: false),
69+
child: CustomScrollView(
70+
shrinkWrap: true,
71+
physics: StyledScrollPhysics(),
72+
controller: _scrollController,
73+
slivers: [
74+
_renderListHeader(context, state),
75+
_renderListBody(context, state),
76+
],
77+
),
78+
),
79+
),
80+
),
81+
),
82+
);
83+
}
84+
85+
Widget _renderTopBar(BuildContext context, AppTheme theme, TrashState state) {
86+
return SizedBox(
87+
height: 36,
88+
child: Row(
89+
crossAxisAlignment: CrossAxisAlignment.stretch,
90+
children: [
91+
FlowyText.semibold(LocaleKeys.trash_text.tr()),
92+
const Spacer(),
93+
IntrinsicWidth(
94+
child: FlowyButton(
95+
text: FlowyText.medium(LocaleKeys.trash_restoreAll.tr(),
96+
fontSize: 12),
97+
leftIcon: svgWidget('editor/restore', color: theme.iconColor),
98+
hoverColor: theme.hover,
99+
onTap: () => context.read<TrashBloc>().add(
100+
const TrashEvent.restoreAll(),
101+
),
102+
),
103+
),
104+
const HSpace(6),
105+
IntrinsicWidth(
106+
child: FlowyButton(
107+
text: FlowyText.medium(LocaleKeys.trash_deleteAll.tr(),
108+
fontSize: 12),
109+
leftIcon: svgWidget('editor/delete', color: theme.iconColor),
110+
hoverColor: theme.hover,
111+
onTap: () =>
112+
context.read<TrashBloc>().add(const TrashEvent.deleteAll()),
113+
),
114+
)
115+
],
116+
),
117+
);
118+
}
119+
120+
Widget _renderListHeader(BuildContext context, TrashState state) {
121+
return SliverPersistentHeader(
122+
delegate: TrashHeaderDelegate(),
123+
floating: true,
124+
pinned: true,
125+
);
126+
}
127+
128+
Widget _renderListBody(BuildContext context, TrashState state) {
129+
return SliverList(
130+
delegate: SliverChildBuilderDelegate(
131+
(BuildContext context, int index) {
132+
final object = state.objects[index];
133+
return SizedBox(
134+
height: 42,
135+
child: TrashCell(
136+
object: object,
137+
onRestore: () {
138+
context.read<TrashBloc>().add(TrashEvent.putback(object.id));
139+
},
140+
onDelete: () =>
141+
context.read<TrashBloc>().add(TrashEvent.delete(object)),
142+
),
143+
);
144+
},
145+
childCount: state.objects.length,
146+
addAutomaticKeepAlives: false,
147+
),
148+
);
149+
}
150+
}

0 commit comments

Comments
 (0)