Skip to content

Commit 9c3066b

Browse files
committed
feat: Episode list mode
1 parent 029aa64 commit 9c3066b

File tree

3 files changed

+64
-9
lines changed

3 files changed

+64
-9
lines changed

lib/pages/detail/widgets/detail_episodes.dart

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:get/get.dart';
55
import 'package:miru_app/models/extension.dart';
66
import 'package:miru_app/pages/detail/controller.dart';
77
import 'package:miru_app/pages/detail/widgets/detail_continue_play.dart';
8+
import 'package:miru_app/utils/miru_storage.dart';
89
import 'package:miru_app/widgets/card_tile.dart';
910
import 'package:miru_app/utils/i18n.dart';
1011
import 'package:miru_app/widgets/platform_widget.dart';
@@ -23,6 +24,7 @@ class _DetailEpisodesState extends State<DetailEpisodes> {
2324
List<fluent.ComboBoxItem<int>>? comboBoxItems;
2425
List<DropdownMenuItem<int>>? dropdownItems;
2526
late List<ExtensionEpisodeGroup> episodes = [];
27+
late String listMode = MiruStorage.getSetting(SettingKey.listMode);
2628

2729
Widget _buildAndroidEpisodes(BuildContext context) {
2830
return Column(
@@ -101,8 +103,23 @@ class _DetailEpisodesState extends State<DetailEpisodes> {
101103
} else {
102104
episodesString = 'reader.chapters'.i18n;
103105
}
104-
return CardTile(
106+
107+
Widget cardTile(Widget child) {
108+
return CardTile(
105109
title: episodesString,
110+
leading: fluent.IconButton(
111+
icon: Icon(
112+
listMode == "grid"
113+
? fluent.FluentIcons.view_list
114+
: fluent.FluentIcons.grid_view_medium,
115+
),
116+
onPressed: () {
117+
setState(() {
118+
listMode == "grid" ? listMode = "list" : listMode = "grid";
119+
MiruStorage.setSetting(SettingKey.listMode, listMode);
120+
});
121+
},
122+
),
106123
trailing: Row(
107124
children: [
108125
const DetailContinuePlay(),
@@ -118,12 +135,20 @@ class _DetailEpisodesState extends State<DetailEpisodes> {
118135
)
119136
],
120137
),
121-
child: LayoutBuilder(builder: (context, constraints) {
122-
return Container(
123-
constraints: const BoxConstraints(
124-
maxHeight: 500,
125-
),
126-
child: GridView.builder(
138+
child: Container(
139+
constraints: const BoxConstraints(
140+
maxHeight: 500,
141+
),
142+
child: child,
143+
),
144+
);
145+
}
146+
147+
if (listMode == "grid") {
148+
return cardTile(
149+
LayoutBuilder(
150+
builder: (context, constraints) {
151+
return GridView.builder(
127152
shrinkWrap: true,
128153
itemCount: episodes.isEmpty
129154
? 0
@@ -149,9 +174,33 @@ class _DetailEpisodesState extends State<DetailEpisodes> {
149174
},
150175
);
151176
},
152-
),
177+
);
178+
},
179+
),
180+
);
181+
}
182+
183+
return cardTile(
184+
ListView.builder(
185+
shrinkWrap: true,
186+
padding: const EdgeInsets.all(0),
187+
itemCount:
188+
episodes.isEmpty ? 0 : episodes[c.selectEpGroup.value].urls.length,
189+
itemBuilder: (context, index) {
190+
return fluent.ListTile(
191+
title: Text(episodes[c.selectEpGroup.value].urls[index].name),
192+
onPressed: () {
193+
c.goWatch(
194+
context,
195+
episodes[c.selectEpGroup.value].urls,
196+
index,
197+
c.selectEpGroup.value,
198+
);
199+
},
153200
);
154-
}));
201+
},
202+
),
203+
);
155204
}
156205

157206
@override

lib/utils/miru_storage.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ class MiruStorage {
112112
await _initSetting(SettingKey.theme, 'system');
113113
await _initSetting(SettingKey.enableNSFW, false);
114114
await _initSetting(SettingKey.videoPlayer, 'built-in');
115+
await _initSetting(SettingKey.listMode, "grid");
115116
}
116117

117118
static _initSetting(String key, dynamic value) async {
@@ -139,4 +140,5 @@ class SettingKey {
139140
static String enableNSFW = 'EnableNSFW';
140141
static String videoPlayer = 'VideoPlayer';
141142
static String databaseVersion = 'DatabaseVersion';
143+
static String listMode = 'ListMode';
142144
}

lib/widgets/card_tile.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ class CardTile extends StatelessWidget {
66
required this.title,
77
required this.child,
88
this.trailing,
9+
this.leading,
910
}) : super(key: key);
1011
final String title;
12+
final Widget? leading;
1113
final Widget? trailing;
1214
final Widget child;
1315

@@ -34,6 +36,8 @@ class CardTile extends StatelessWidget {
3436
fontWeight: FontWeight.bold,
3537
),
3638
),
39+
const SizedBox(width: 3),
40+
if (leading != null) leading!,
3741
const Spacer(),
3842
if (trailing != null) trailing!
3943
],

0 commit comments

Comments
 (0)