Update layout

This commit is contained in:
2023-11-28 21:06:41 +08:00
parent 83fda5ae45
commit 03539f508c
7 changed files with 116 additions and 63 deletions

View File

@@ -1,18 +1,24 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import '../api/file.dart';
import '../api/gallery.dart'; import '../api/gallery.dart';
import 'thumbnail.dart'; import 'thumbnail.dart';
import '../viewer/single.dart';
class GalleryBasicInfo extends StatelessWidget { 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); : super(key: key);
final GMeta gMeta; final GMeta gMeta;
final ExtendedPMeta firstPage; final ExtendedPMeta firstPage;
final int? fileId; final int? fileId;
final GalleryData? gData;
final EhFiles? files;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final cs = Theme.of(context).colorScheme;
return SizedBox( return SizedBox(
height: 300, height: 300,
child: Column(children: [ child: Column(children: [
@@ -26,8 +32,11 @@ class GalleryBasicInfo extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
SelectableText(gMeta.preferredTitle), SelectableText(gMeta.preferredTitle,
SelectableText(gMeta.uploader), style: TextStyle(
fontWeight: FontWeight.bold, color: cs.primary)),
SelectableText(gMeta.uploader,
style: TextStyle(color: cs.secondary)),
SelectableText(gMeta.category), SelectableText(gMeta.category),
], ],
)) ))
@@ -39,7 +48,9 @@ class GalleryBasicInfo extends StatelessWidget {
children: [ children: [
ElevatedButton( ElevatedButton(
onPressed: () { 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)), child: Text(AppLocalizations.of(context)!.read)),
ElevatedButton( ElevatedButton(

View File

@@ -5,6 +5,7 @@ import '../api/file.dart';
import '../api/gallery.dart'; import '../api/gallery.dart';
import 'gallery_basic_info.dart'; import 'gallery_basic_info.dart';
import 'gallery_info_desktop.dart'; import 'gallery_info_desktop.dart';
import 'tags.dart';
import 'thumbnail_gridview.dart'; import 'thumbnail_gridview.dart';
class GalleryInfo extends StatefulWidget { class GalleryInfo extends StatefulWidget {
@@ -46,8 +47,8 @@ class _GalleryInfo extends State<GalleryInfo> with ThemeModeWidget {
context.canPop() ? context.pop() : context.go("/"); context.canPop() ? context.pop() : context.go("/");
}, },
), ),
title: SelectableText( title: SelectableText(widget.gData.meta.preferredTitle,
maxLines: 2, minLines: 1, widget.gData.meta.preferredTitle), maxLines: 1, minLines: 1),
actions: [ actions: [
buildThemeModeIcon(context), buildThemeModeIcon(context),
buildMoreVertSettingsButon(context), buildMoreVertSettingsButon(context),
@@ -58,15 +59,29 @@ class _GalleryInfo extends State<GalleryInfo> with ThemeModeWidget {
? SliverList( ? SliverList(
delegate: SliverChildListDelegate([ delegate: SliverChildListDelegate([
GalleryBasicInfo(widget.gData.meta, firstPage, GalleryBasicInfo(widget.gData.meta, firstPage,
fileId: firstFileId), fileId: firstFileId,
gData: widget.gData,
files: widget.files),
const Divider(indent: 20, endIndent: 20),
]), ]),
) )
: SliverList( : SliverList(
delegate: SliverChildListDelegate([ delegate: SliverChildListDelegate([
GalleryInfoDesktop(widget.gData, 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( ThumbnailGridView(
widget.gData, widget.gData,
SliverGridDelegateWithFixedCrossAxisCount( SliverGridDelegateWithFixedCrossAxisCount(

View File

@@ -2,12 +2,14 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import '../api/file.dart';
import '../api/gallery.dart'; import '../api/gallery.dart';
import '../main.dart'; import '../main.dart';
import '../utils/filesize.dart'; import '../utils/filesize.dart';
import 'rate.dart'; import 'rate.dart';
import 'tags.dart'; import 'tags.dart';
import 'thumbnail.dart'; import 'thumbnail.dart';
import '../viewer/single.dart';
class _KeyValue extends StatelessWidget { class _KeyValue extends StatelessWidget {
const _KeyValue(this.name, this.value, const _KeyValue(this.name, this.value,
@@ -38,11 +40,13 @@ class _KeyValue extends StatelessWidget {
} }
class GalleryInfoDesktop 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); : super(key: key);
final GalleryData gData; final GalleryData gData;
final int? fileId; final int? fileId;
final ScrollController? controller; final ScrollController? controller;
final EhFiles? files;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -130,22 +134,27 @@ class GalleryInfoDesktop extends StatelessWidget {
const VerticalDivider(indent: 10, endIndent: 10), const VerticalDivider(indent: 10, endIndent: 10),
SizedBox( SizedBox(
width: 150, width: 150,
child: Column(children: [ child: Column(
ElevatedButton( mainAxisAlignment:
onPressed: () { MainAxisAlignment.spaceAround,
context.push( children: [
'/gallery/${gData.meta.gid}/page/1'); ElevatedButton(
}, onPressed: () {
child: context.push(
Text(AppLocalizations.of(context)!.read)), '/gallery/${gData.meta.gid}/page/1',
ElevatedButton( extra: SinglePageViewerExtra(
onPressed: () { data: gData, files: files));
context.push( },
'/dialog/download/zip/${gData.meta.gid}'); child: Text(
}, AppLocalizations.of(context)!.read)),
child: Text( ElevatedButton(
AppLocalizations.of(context)!.download)), onPressed: () {
])), context.push(
'/dialog/download/zip/${gData.meta.gid}');
},
child: Text(AppLocalizations.of(context)!
.download)),
])),
])), ])),
], ],
)) ))

View File

@@ -10,9 +10,13 @@ import 'tag_tooltip.dart';
import 'scroll_parent.dart'; import 'scroll_parent.dart';
class TagsPanel extends StatefulWidget { 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 List<Tag> tags;
final ScrollController? controller; final ScrollController? controller;
final bool? sliver;
final EdgeInsetsGeometry? margin;
@override @override
State<TagsPanel> createState() => _TagsPanel(); State<TagsPanel> createState() => _TagsPanel();
@@ -53,18 +57,14 @@ class _TagsPanel extends State<TagsPanel> {
final cs = Theme.of(context).colorScheme; final cs = Theme.of(context).colorScheme;
final stt = prefs.getBool("showTranslatedTag") ?? final stt = prefs.getBool("showTranslatedTag") ??
MainApp.of(context).lang.toLocale().languageCode == "zh"; MainApp.of(context).lang.toLocale().languageCode == "zh";
final re = ListView.builder( Widget itemBuilder(BuildContext context, int index) {
physics: isIOS || ua.isSafari final t = data![index].$1;
? const ClampingScrollPhysics() final ta = data![index].$2;
: null, final namespace =
padding: const EdgeInsets.all(8), "${stt ? (tags.getTagTranslate(t) ?? t) : t}${AppLocalizations.of(context)!.colon}";
itemCount: data!.length, return Container(
itemBuilder: (context, index) { margin: widget.margin,
final t = data![index].$1; child: Wrap(
final ta = data![index].$2;
final namespace =
"${stt ? (tags.getTagTranslate(t) ?? t) : t}${AppLocalizations.of(context)!.colon}";
return Wrap(
children: List.generate(ta.length + 1, (index) { children: List.generate(ta.length + 1, (index) {
if (index == 0) { if (index == 0) {
return Container( return Container(
@@ -81,8 +81,20 @@ class _TagsPanel extends State<TagsPanel> {
? TagTooltip(ta[index - 1]!) ? TagTooltip(ta[index - 1]!)
: TagWidget(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 return widget.controller != null
? ScrollParent(controller: widget.controller!, child: re) ? ScrollParent(controller: widget.controller!, child: re)
: re; : re;

View File

@@ -102,7 +102,7 @@ class _GalleryPage extends State<GalleryPage>
leading: IconButton( leading: IconButton(
icon: const Icon(Icons.arrow_back), icon: const Icon(Icons.arrow_back),
onPressed: () { onPressed: () {
context.canPop() ? context.pop() : context.go("/"); context.canPop() ? context.pop() : context.go("/gallery");
}, },
), ),
title: Text(title), title: Text(title),

View File

@@ -4,6 +4,7 @@ import 'package:go_router/go_router.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'globals.dart'; import 'globals.dart';
import 'main.dart'; import 'main.dart';
import 'utils.dart';
final _log = Logger("SettingsPage"); final _log = Logger("SettingsPage");
@@ -278,21 +279,24 @@ class _SettingsPage extends State<SettingsPage> with ThemeModeWidget {
.showTranslatedTag), .showTranslatedTag),
), ),
), ),
Container( isAndroid || isWindows
padding: const EdgeInsets.symmetric(vertical: 8), ? Container(
child: CheckboxMenuButton( padding:
value: _preventScreenCapture, const EdgeInsets.symmetric(vertical: 8),
onChanged: (bool? value) { child: CheckboxMenuButton(
if (value != null) { value: _preventScreenCapture,
setState(() { onChanged: (bool? value) {
_preventScreenCapture = value; if (value != null) {
}); setState(() {
} _preventScreenCapture = value;
}, });
child: Text(AppLocalizations.of(context)! }
.preventScreenCapture), },
), child: Text(AppLocalizations.of(context)!
), .preventScreenCapture),
),
)
: Container(),
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [

View File

@@ -40,9 +40,10 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
late int _index; late int _index;
late GalleryData? _data; late GalleryData? _data;
late EhFiles? _files; late EhFiles? _files;
late String _back;
CancelToken? _cancel; CancelToken? _cancel;
bool _isLoading = false; bool _isLoading = false;
bool _page_changed = false; bool _pageChanged = false;
Object? _error; Object? _error;
@override @override
void initState() { void initState() {
@@ -50,6 +51,7 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
_pageController = PageController(initialPage: _index); _pageController = PageController(initialPage: _index);
_data = widget.data; _data = widget.data;
_files = widget.files; _files = widget.files;
_back = "/gallery/${widget.gid}";
super.initState(); super.initState();
} }
@@ -76,11 +78,11 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
if (_index < 0) { if (_index < 0) {
_index = 0; _index = 0;
_pageController.jumpToPage(_index); _pageController.jumpToPage(_index);
_page_changed = true; _pageChanged = true;
} else if (_index >= _data!.pages.length) { } else if (_index >= _data!.pages.length) {
_index = _data!.pages.length - 1; _index = _data!.pages.length - 1;
_pageController.jumpToPage(_index); _pageController.jumpToPage(_index);
_page_changed = true; _pageChanged = true;
} }
setState(() { setState(() {
_files = fileData; _files = fileData;
@@ -102,7 +104,7 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
void _onPageChanged(BuildContext context) { void _onPageChanged(BuildContext context) {
context.replace("/gallery/${widget.gid}/page/${_index + 1}", context.replace("/gallery/${widget.gid}/page/${_index + 1}",
extra: SinglePageViewerExtra(data: _data, files: _files)); extra: SinglePageViewerExtra(data: _data, files: _files));
_page_changed = false; _pageChanged = false;
} }
@override @override
@@ -116,7 +118,7 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
leading: IconButton( leading: IconButton(
icon: const Icon(Icons.arrow_back), icon: const Icon(Icons.arrow_back),
onPressed: () { onPressed: () {
context.canPop() ? context.pop() : context.go("/"); context.canPop() ? context.pop() : context.go(_back);
}, },
), ),
title: Text(AppLocalizations.of(context)!.loading), title: Text(AppLocalizations.of(context)!.loading),
@@ -143,7 +145,7 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
label: Text(AppLocalizations.of(context)!.retry)) label: Text(AppLocalizations.of(context)!.retry))
]))); ])));
} }
if (_page_changed) { if (_pageChanged) {
_onPageChanged(context); _onPageChanged(context);
} }
return Scaffold( return Scaffold(
@@ -167,7 +169,7 @@ class _SinglePageViewer extends State<SinglePageViewer> with ThemeModeWidget {
} }
}), }),
KeyAction(LogicalKeyboardKey.backspace, "back", () { KeyAction(LogicalKeyboardKey.backspace, "back", () {
context.canPop() ? context.pop() : context.go("/"); context.canPop() ? context.pop() : context.go(_back);
}), }),
], ],
child: PhotoViewGallery.builder( child: PhotoViewGallery.builder(