mirror of
https://github.com/lifegpc/eh_downloader_flutter.git
synced 2026-06-15 10:24:22 +08:00
Update layout
This commit is contained in:
@@ -1,18 +1,24 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import '../api/file.dart';
|
||||
import '../api/gallery.dart';
|
||||
import 'thumbnail.dart';
|
||||
import '../viewer/single.dart';
|
||||
|
||||
class GalleryBasicInfo extends StatelessWidget {
|
||||
const GalleryBasicInfo(this.gMeta, this.firstPage, {Key? key, this.fileId})
|
||||
const GalleryBasicInfo(this.gMeta, this.firstPage,
|
||||
{Key? key, this.fileId, this.gData, this.files})
|
||||
: super(key: key);
|
||||
final GMeta gMeta;
|
||||
final ExtendedPMeta firstPage;
|
||||
final int? fileId;
|
||||
final GalleryData? gData;
|
||||
final EhFiles? files;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final cs = Theme.of(context).colorScheme;
|
||||
return SizedBox(
|
||||
height: 300,
|
||||
child: Column(children: [
|
||||
@@ -26,8 +32,11 @@ class GalleryBasicInfo extends StatelessWidget {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SelectableText(gMeta.preferredTitle),
|
||||
SelectableText(gMeta.uploader),
|
||||
SelectableText(gMeta.preferredTitle,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold, color: cs.primary)),
|
||||
SelectableText(gMeta.uploader,
|
||||
style: TextStyle(color: cs.secondary)),
|
||||
SelectableText(gMeta.category),
|
||||
],
|
||||
))
|
||||
@@ -39,7 +48,9 @@ class GalleryBasicInfo extends StatelessWidget {
|
||||
children: [
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
context.push('/gallery/${gMeta.gid}/page/1');
|
||||
context.push('/gallery/${gMeta.gid}/page/1',
|
||||
extra: SinglePageViewerExtra(
|
||||
data: gData, files: files));
|
||||
},
|
||||
child: Text(AppLocalizations.of(context)!.read)),
|
||||
ElevatedButton(
|
||||
|
||||
@@ -5,6 +5,7 @@ import '../api/file.dart';
|
||||
import '../api/gallery.dart';
|
||||
import 'gallery_basic_info.dart';
|
||||
import 'gallery_info_desktop.dart';
|
||||
import 'tags.dart';
|
||||
import 'thumbnail_gridview.dart';
|
||||
|
||||
class GalleryInfo extends StatefulWidget {
|
||||
@@ -46,8 +47,8 @@ class _GalleryInfo extends State<GalleryInfo> with ThemeModeWidget {
|
||||
context.canPop() ? context.pop() : context.go("/");
|
||||
},
|
||||
),
|
||||
title: SelectableText(
|
||||
maxLines: 2, minLines: 1, widget.gData.meta.preferredTitle),
|
||||
title: SelectableText(widget.gData.meta.preferredTitle,
|
||||
maxLines: 1, minLines: 1),
|
||||
actions: [
|
||||
buildThemeModeIcon(context),
|
||||
buildMoreVertSettingsButon(context),
|
||||
@@ -58,15 +59,29 @@ class _GalleryInfo extends State<GalleryInfo> with ThemeModeWidget {
|
||||
? SliverList(
|
||||
delegate: SliverChildListDelegate([
|
||||
GalleryBasicInfo(widget.gData.meta, firstPage,
|
||||
fileId: firstFileId),
|
||||
fileId: firstFileId,
|
||||
gData: widget.gData,
|
||||
files: widget.files),
|
||||
const Divider(indent: 20, endIndent: 20),
|
||||
]),
|
||||
)
|
||||
: SliverList(
|
||||
delegate: SliverChildListDelegate([
|
||||
GalleryInfoDesktop(widget.gData,
|
||||
fileId: firstFileId, controller: controller),
|
||||
fileId: firstFileId,
|
||||
controller: controller,
|
||||
files: widget.files),
|
||||
]),
|
||||
),
|
||||
useMobile
|
||||
? TagsPanel(widget.gData.tags,
|
||||
sliver: true,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 20.0))
|
||||
: SliverToBoxAdapter(child: Container()),
|
||||
useMobile
|
||||
? const SliverToBoxAdapter(
|
||||
child: Divider(indent: 20, endIndent: 20))
|
||||
: SliverToBoxAdapter(child: Container()),
|
||||
ThumbnailGridView(
|
||||
widget.gData,
|
||||
SliverGridDelegateWithFixedCrossAxisCount(
|
||||
|
||||
@@ -2,12 +2,14 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import '../api/file.dart';
|
||||
import '../api/gallery.dart';
|
||||
import '../main.dart';
|
||||
import '../utils/filesize.dart';
|
||||
import 'rate.dart';
|
||||
import 'tags.dart';
|
||||
import 'thumbnail.dart';
|
||||
import '../viewer/single.dart';
|
||||
|
||||
class _KeyValue extends StatelessWidget {
|
||||
const _KeyValue(this.name, this.value,
|
||||
@@ -38,11 +40,13 @@ class _KeyValue extends StatelessWidget {
|
||||
}
|
||||
|
||||
class GalleryInfoDesktop extends StatelessWidget {
|
||||
const GalleryInfoDesktop(this.gData, {Key? key, this.fileId, this.controller})
|
||||
const GalleryInfoDesktop(this.gData,
|
||||
{Key? key, this.fileId, this.controller, this.files})
|
||||
: super(key: key);
|
||||
final GalleryData gData;
|
||||
final int? fileId;
|
||||
final ScrollController? controller;
|
||||
final EhFiles? files;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -130,22 +134,27 @@ class GalleryInfoDesktop extends StatelessWidget {
|
||||
const VerticalDivider(indent: 10, endIndent: 10),
|
||||
SizedBox(
|
||||
width: 150,
|
||||
child: Column(children: [
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
context.push(
|
||||
'/gallery/${gData.meta.gid}/page/1');
|
||||
},
|
||||
child:
|
||||
Text(AppLocalizations.of(context)!.read)),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
context.push(
|
||||
'/dialog/download/zip/${gData.meta.gid}');
|
||||
},
|
||||
child: Text(
|
||||
AppLocalizations.of(context)!.download)),
|
||||
])),
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
context.push(
|
||||
'/gallery/${gData.meta.gid}/page/1',
|
||||
extra: SinglePageViewerExtra(
|
||||
data: gData, files: files));
|
||||
},
|
||||
child: Text(
|
||||
AppLocalizations.of(context)!.read)),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
context.push(
|
||||
'/dialog/download/zip/${gData.meta.gid}');
|
||||
},
|
||||
child: Text(AppLocalizations.of(context)!
|
||||
.download)),
|
||||
])),
|
||||
])),
|
||||
],
|
||||
))
|
||||
|
||||
@@ -10,9 +10,13 @@ import 'tag_tooltip.dart';
|
||||
import 'scroll_parent.dart';
|
||||
|
||||
class TagsPanel extends StatefulWidget {
|
||||
const TagsPanel(this.tags, {Key? key, this.controller}) : super(key: key);
|
||||
const TagsPanel(this.tags,
|
||||
{Key? key, this.controller, this.sliver, this.margin})
|
||||
: super(key: key);
|
||||
final List<Tag> tags;
|
||||
final ScrollController? controller;
|
||||
final bool? sliver;
|
||||
final EdgeInsetsGeometry? margin;
|
||||
|
||||
@override
|
||||
State<TagsPanel> createState() => _TagsPanel();
|
||||
@@ -53,18 +57,14 @@ class _TagsPanel extends State<TagsPanel> {
|
||||
final cs = Theme.of(context).colorScheme;
|
||||
final stt = prefs.getBool("showTranslatedTag") ??
|
||||
MainApp.of(context).lang.toLocale().languageCode == "zh";
|
||||
final re = ListView.builder(
|
||||
physics: isIOS || ua.isSafari
|
||||
? const ClampingScrollPhysics()
|
||||
: null,
|
||||
padding: const EdgeInsets.all(8),
|
||||
itemCount: data!.length,
|
||||
itemBuilder: (context, index) {
|
||||
final t = data![index].$1;
|
||||
final ta = data![index].$2;
|
||||
final namespace =
|
||||
"${stt ? (tags.getTagTranslate(t) ?? t) : t}${AppLocalizations.of(context)!.colon}";
|
||||
return Wrap(
|
||||
Widget itemBuilder(BuildContext context, int index) {
|
||||
final t = data![index].$1;
|
||||
final ta = data![index].$2;
|
||||
final namespace =
|
||||
"${stt ? (tags.getTagTranslate(t) ?? t) : t}${AppLocalizations.of(context)!.colon}";
|
||||
return Container(
|
||||
margin: widget.margin,
|
||||
child: Wrap(
|
||||
children: List.generate(ta.length + 1, (index) {
|
||||
if (index == 0) {
|
||||
return Container(
|
||||
@@ -81,8 +81,20 @@ class _TagsPanel extends State<TagsPanel> {
|
||||
? TagTooltip(ta[index - 1]!)
|
||||
: TagWidget(ta[index - 1]!));
|
||||
}
|
||||
}));
|
||||
});
|
||||
})));
|
||||
}
|
||||
|
||||
final re = widget.sliver == true
|
||||
? SliverList.builder(
|
||||
itemBuilder: itemBuilder,
|
||||
itemCount: data!.length,
|
||||
)
|
||||
: ListView.builder(
|
||||
physics:
|
||||
isIOS || ua.isSafari ? const ClampingScrollPhysics() : null,
|
||||
padding: const EdgeInsets.all(8),
|
||||
itemCount: data!.length,
|
||||
itemBuilder: itemBuilder);
|
||||
return widget.controller != null
|
||||
? ScrollParent(controller: widget.controller!, child: re)
|
||||
: re;
|
||||
|
||||
@@ -102,7 +102,7 @@ class _GalleryPage extends State<GalleryPage>
|
||||
leading: IconButton(
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
onPressed: () {
|
||||
context.canPop() ? context.pop() : context.go("/");
|
||||
context.canPop() ? context.pop() : context.go("/gallery");
|
||||
},
|
||||
),
|
||||
title: Text(title),
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'package:go_router/go_router.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'globals.dart';
|
||||
import 'main.dart';
|
||||
import 'utils.dart';
|
||||
|
||||
final _log = Logger("SettingsPage");
|
||||
|
||||
@@ -278,21 +279,24 @@ class _SettingsPage extends State<SettingsPage> with ThemeModeWidget {
|
||||
.showTranslatedTag),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8),
|
||||
child: CheckboxMenuButton(
|
||||
value: _preventScreenCapture,
|
||||
onChanged: (bool? value) {
|
||||
if (value != null) {
|
||||
setState(() {
|
||||
_preventScreenCapture = value;
|
||||
});
|
||||
}
|
||||
},
|
||||
child: Text(AppLocalizations.of(context)!
|
||||
.preventScreenCapture),
|
||||
),
|
||||
),
|
||||
isAndroid || isWindows
|
||||
? Container(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 8),
|
||||
child: CheckboxMenuButton(
|
||||
value: _preventScreenCapture,
|
||||
onChanged: (bool? value) {
|
||||
if (value != null) {
|
||||
setState(() {
|
||||
_preventScreenCapture = value;
|
||||
});
|
||||
}
|
||||
},
|
||||
child: Text(AppLocalizations.of(context)!
|
||||
.preventScreenCapture),
|
||||
),
|
||||
)
|
||||
: Container(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
|
||||
@@ -40,9 +40,10 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
|
||||
late int _index;
|
||||
late GalleryData? _data;
|
||||
late EhFiles? _files;
|
||||
late String _back;
|
||||
CancelToken? _cancel;
|
||||
bool _isLoading = false;
|
||||
bool _page_changed = false;
|
||||
bool _pageChanged = false;
|
||||
Object? _error;
|
||||
@override
|
||||
void initState() {
|
||||
@@ -50,6 +51,7 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
|
||||
_pageController = PageController(initialPage: _index);
|
||||
_data = widget.data;
|
||||
_files = widget.files;
|
||||
_back = "/gallery/${widget.gid}";
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@@ -76,11 +78,11 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
|
||||
if (_index < 0) {
|
||||
_index = 0;
|
||||
_pageController.jumpToPage(_index);
|
||||
_page_changed = true;
|
||||
_pageChanged = true;
|
||||
} else if (_index >= _data!.pages.length) {
|
||||
_index = _data!.pages.length - 1;
|
||||
_pageController.jumpToPage(_index);
|
||||
_page_changed = true;
|
||||
_pageChanged = true;
|
||||
}
|
||||
setState(() {
|
||||
_files = fileData;
|
||||
@@ -102,7 +104,7 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
|
||||
void _onPageChanged(BuildContext context) {
|
||||
context.replace("/gallery/${widget.gid}/page/${_index + 1}",
|
||||
extra: SinglePageViewerExtra(data: _data, files: _files));
|
||||
_page_changed = false;
|
||||
_pageChanged = false;
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -116,7 +118,7 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
|
||||
leading: IconButton(
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
onPressed: () {
|
||||
context.canPop() ? context.pop() : context.go("/");
|
||||
context.canPop() ? context.pop() : context.go(_back);
|
||||
},
|
||||
),
|
||||
title: Text(AppLocalizations.of(context)!.loading),
|
||||
@@ -143,7 +145,7 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
|
||||
label: Text(AppLocalizations.of(context)!.retry))
|
||||
])));
|
||||
}
|
||||
if (_page_changed) {
|
||||
if (_pageChanged) {
|
||||
_onPageChanged(context);
|
||||
}
|
||||
return Scaffold(
|
||||
@@ -167,7 +169,7 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
|
||||
}
|
||||
}),
|
||||
KeyAction(LogicalKeyboardKey.backspace, "back", () {
|
||||
context.canPop() ? context.pop() : context.go("/");
|
||||
context.canPop() ? context.pop() : context.go(_back);
|
||||
}),
|
||||
],
|
||||
child: PhotoViewGallery.builder(
|
||||
|
||||
Reference in New Issue
Block a user