diff --git a/lib/api/client.dart b/lib/api/client.dart index 75856df..fefb032 100644 --- a/lib/api/client.dart +++ b/lib/api/client.dart @@ -240,6 +240,7 @@ abstract class _EHApi { @Query("sort_by_gid") bool? sortByGid, @Query("uploader") String? uploader, @Query("tag") String? tag, + @Query("category") String? category, @CancelRequest() CancelToken? cancel}); @GET('/tag/{id}') diff --git a/lib/api/client.g.dart b/lib/api/client.g.dart index 2c76277..3a7f6db 100644 --- a/lib/api/client.g.dart +++ b/lib/api/client.g.dart @@ -6,7 +6,7 @@ part of 'client.dart'; // RetrofitGenerator // ************************************************************************** -// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers +// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element class __EHApi implements _EHApi { __EHApi( @@ -51,11 +51,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => BUser.fromJson(json as Map), ); - return value; + return _value; } @override @@ -101,11 +101,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => json as dynamic, ); - return value; + return _value; } @override @@ -160,11 +160,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => json as int, ); - return value; + return _value; } @override @@ -209,11 +209,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => json as dynamic, ); - return value; + return _value; } @override @@ -248,11 +248,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => BUser.fromJson(json as Map), ); - return value; + return _value; } @override @@ -289,7 +289,7 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult>.fromJson( + final _value = ApiResult>.fromJson( _result.data!, (json) => json is List ? json @@ -297,7 +297,7 @@ class __EHApi implements _EHApi { .toList() : List.empty(), ); - return value; + return _value; } @override @@ -370,11 +370,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => BUser.fromJson(json as Map), ); - return value; + return _value; } @override @@ -402,11 +402,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => ServerStatus.fromJson(json as Map), ); - return value; + return _value; } @override @@ -501,11 +501,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => Token.fromJson(json as Map), ); - return value; + return _value; } @override @@ -571,11 +571,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => Token.fromJson(json as Map), ); - return value; + return _value; } @override @@ -613,11 +613,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => json as bool, ); - return value; + return _value; } @override @@ -648,11 +648,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => TokenWithUserInfo.fromJson(json as Map), ); - return value; + return _value; } @override @@ -684,8 +684,8 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = _result.data!.cast(); - final httpResponse = HttpResponse(value, _result); + final _value = _result.data!.cast(); + final httpResponse = HttpResponse(_value, _result); return httpResponse; } @@ -718,11 +718,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => EhFileExtend.fromJson(json as Map), ); - return value; + return _value; } @override @@ -760,8 +760,8 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = _result.data!.cast(); - final httpResponse = HttpResponse(value, _result); + final _value = _result.data!.cast(); + final httpResponse = HttpResponse(_value, _result); return httpResponse; } @@ -793,11 +793,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => EhFiles.fromJson(json as Map), ); - return value; + return _value; } @override @@ -844,8 +844,8 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = _result.data!.cast(); - final httpResponse = HttpResponse(value, _result); + final _value = _result.data!.cast(); + final httpResponse = HttpResponse(_value, _result); return httpResponse; } @@ -877,11 +877,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => GalleryData.fromJson(json as Map), ); - return value; + return _value; } @override @@ -912,11 +912,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => GMetaInfos.fromJson(json as Map), ); - return value; + return _value; } @override @@ -927,6 +927,7 @@ class __EHApi implements _EHApi { bool? sortByGid, String? uploader, String? tag, + String? category, CancelToken? cancel, }) async { final _extra = {}; @@ -937,6 +938,7 @@ class __EHApi implements _EHApi { r'sort_by_gid': sortByGid, r'uploader': uploader, r'tag': tag, + r'category': category, }; queryParameters.removeWhere((k, v) => v == null); final _headers = {}; @@ -959,7 +961,7 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult>.fromJson( + final _value = ApiResult>.fromJson( _result.data!, (json) => json is List ? json @@ -967,7 +969,7 @@ class __EHApi implements _EHApi { .toList() : List.empty(), ); - return value; + return _value; } @override @@ -998,11 +1000,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => Tags.fromJson(json as Map), ); - return value; + return _value; } @override @@ -1030,7 +1032,7 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult>.fromJson( + final _value = ApiResult>.fromJson( _result.data!, (json) => json is List ? json @@ -1038,7 +1040,7 @@ class __EHApi implements _EHApi { .toList() : List.empty(), ); - return value; + return _value; } @override @@ -1077,8 +1079,8 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = _result.data; - final httpResponse = HttpResponse(value, _result); + final _value = _result.data; + final httpResponse = HttpResponse(_value, _result); return httpResponse; } @@ -1136,11 +1138,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => json as dynamic, ); - return value; + return _value; } @override @@ -1190,11 +1192,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => json as dynamic, ); - return value; + return _value; } @override @@ -1244,11 +1246,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => json as dynamic, ); - return value; + return _value; } @override @@ -1279,8 +1281,8 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = Config.fromJson(_result.data!); - return value; + final _value = Config.fromJson(_result.data!); + return _value; } @override @@ -1312,8 +1314,8 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = UpdateConfigResult.fromJson(_result.data!); - return value; + final _value = UpdateConfigResult.fromJson(_result.data!); + return _value; } @override @@ -1348,11 +1350,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => EHMetaInfo.fromJson(json as Map), ); - return value; + return _value; } @override @@ -1403,11 +1405,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => Task.fromJson(json as Map), ); - return value; + return _value; } @override @@ -1453,11 +1455,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => Task.fromJson(json as Map), ); - return value; + return _value; } @override @@ -1508,11 +1510,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => Task.fromJson(json as Map), ); - return value; + return _value; } @override @@ -1541,11 +1543,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => DownloadConfig.fromJson(json as Map), ); - return value; + return _value; } @override @@ -1574,11 +1576,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => ExportZipConfig.fromJson(json as Map), ); - return value; + return _value; } @override @@ -1607,11 +1609,11 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final _value = ApiResult.fromJson( _result.data!, (json) => DefaultImportConfig.fromJson(json as Map), ); - return value; + return _value; } RequestOptions _setStreamType(RequestOptions requestOptions) { diff --git a/lib/components/gallery_basic_info.dart b/lib/components/gallery_basic_info.dart index ecd6b32..2a7a5b6 100644 --- a/lib/components/gallery_basic_info.dart +++ b/lib/components/gallery_basic_info.dart @@ -57,7 +57,14 @@ class GalleryBasicInfo extends StatelessWidget { context.pushNamed("/galleries", queryParameters: {"uploader": gMeta.uploader}); })), - SelectableText(gMeta.category), + SelectableText.rich(TextSpan( + text: gMeta.category, + mouseCursor: SystemMouseCursors.click, + recognizer: TapGestureRecognizer() + ..onTap = () { + context.pushNamed("/galleries", + queryParameters: {"category": gMeta.category}); + })), ], )) ])), diff --git a/lib/components/gallery_info_desktop.dart b/lib/components/gallery_info_desktop.dart index 6408f00..ba8aa11 100644 --- a/lib/components/gallery_info_desktop.dart +++ b/lib/components/gallery_info_desktop.dart @@ -94,8 +94,17 @@ class GalleryInfoDesktop extends StatelessWidget { SizedBox( width: 170, child: Column(children: [ - SelectableText(gData.meta.category, - style: TextStyle(color: cs.secondary)), + SelectableText.rich(TextSpan( + text: gData.meta.category, + style: TextStyle(color: cs.secondary), + mouseCursor: SystemMouseCursors.click, + recognizer: TapGestureRecognizer() + ..onTap = () { + context.pushNamed("/galleries", + queryParameters: { + "category": gData.meta.category + }); + })), SelectableText.rich(TextSpan( text: gData.meta.uploader, style: TextStyle(color: cs.secondary), diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index bd7e210..5e96987 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -61,7 +61,7 @@ } } }, - "tagUploaderGalleries": "Galleries tagged {tag} by {uploader}", + "tagUploaderGalleries": "Galleries tagged {tag} uploaded by {uploader}", "@tagUploaderGalleries": { "placeholders": { "tag": { @@ -269,5 +269,49 @@ "thumbnailAlignHelp": "This only works if the scaling method is to touch container from outside/inside.", "createImportTask": "Create import task", "importPath": "Path to the file/directory to import", - "importSize": "Image size" + "importSize": "Image size", + "tagUploaderCategoryGalleries": "Galleries tagged {tag} uploaded by {uploader} in category {category}", + "@tagUploaderCategoryGalleries": { + "placeholders": { + "tag": { + "type": "String" + }, + "uploader": { + "type": "String" + }, + "category": { + "type": "String" + } + } + }, + "categoryGalleries": "Galleries with category {category}", + "@categoryGalleries": { + "placeholders": { + "category": { + "type": "String" + } + } + }, + "uploaderCategoryGalleries": "Galleries with category {category} uploaded by {uploader}", + "@uploaderCategoryGalleries": { + "placeholders": { + "category": { + "type": "String" + }, + "uploader": { + "type": "String" + } + } + }, + "tagCategoryGalleries": "Galleries with category {category} tagged {tag}", + "@tagCategoryGalleries": { + "placeholders": { + "category": { + "type": "String" + }, + "tag": { + "type": "String" + } + } + } } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 36dc90a..0330175 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -12,9 +12,9 @@ "networkError": "网络错误。", "internalError": "出现了内部错误,请将日志发送给开发者。", "setServerUrl": "服务器地址", - "createRootUser": "创建根用户", + "createRootUser": "新建根用户", "skip": "跳过", - "create": "创建", + "create": "新建", "settings": "设置", "lang": "语言", "systemLang": "系统语言", @@ -267,7 +267,51 @@ "center": "居中", "rightOrBottom": "右/下", "thumbnailAlignHelp": "仅当缩放方法是缩放以填满/适合容器时生效。", - "createImportTask": "创建导入任务", + "createImportTask": "新建导入任务", "importPath": "需要导入的文件/文件夹路径", - "importSize": "图像大小" + "importSize": "图像大小", + "tagUploaderCategoryGalleries": "在分类 {category} 中 {uploader} 上传的带有 {tag} 标签的画廊", + "@tagUploaderCategoryGalleries": { + "placeholders": { + "tag": { + "type": "String" + }, + "uploader": { + "type": "String" + }, + "category": { + "type": "String" + } + } + }, + "categoryGalleries": "分类为 {category} 的画廊", + "@categoryGalleries": { + "placeholders": { + "category": { + "type": "String" + } + } + }, + "uploaderCategoryGalleries": "{uploader} 上传的分类为 {category} 的画廊", + "@uploaderCategoryGalleries": { + "placeholders": { + "category": { + "type": "String" + }, + "uploader": { + "type": "String" + } + } + }, + "tagCategoryGalleries": "分类为 {category} 的带有 {tag} 标签的画廊", + "@tagCategoryGalleries": { + "placeholders": { + "category": { + "type": "String" + }, + "tag": { + "type": "String" + } + } + } } diff --git a/lib/main.dart b/lib/main.dart index 0ba10c2..273a958 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -72,6 +72,7 @@ final _router = GoRouter( } final tag = state.uri.queryParameters["tag"]; final uploader = state.uri.queryParameters["uploader"]; + final category = state.uri.queryParameters["category"]; final extra = state.extra as GalleriesPageExtra?; return GalleriesPage( key: state.pageKey, @@ -79,6 +80,7 @@ final _router = GoRouter( tag: tag, uploader: uploader, translatedTag: extra?.translatedTag, + category: category, hasExtra: extra != null); }), GoRoute( diff --git a/lib/pages/galleries.dart b/lib/pages/galleries.dart index 6582540..10f5a8f 100644 --- a/lib/pages/galleries.dart +++ b/lib/pages/galleries.dart @@ -23,12 +23,14 @@ class GalleriesPage extends StatefulWidget { this.uploader, this.tag, this.translatedTag, + this.category, this.hasExtra = false}); final SortByGid? sortByGid; final String? uploader; final String? tag; final String? translatedTag; final bool hasExtra; + final String? category; bool _stt(BuildContext context) => prefs.getBool("showTranslatedTag") ?? MainApp.of(context).lang.toLocale().languageCode == "zh"; @@ -61,6 +63,7 @@ class _GalleriesPage extends State limit: _pageSize, sortByGid: _sortByGid, uploader: widget.uploader, + category: widget.category, tag: widget.tag)) .unwrap(); final isLastPage = list.length < _pageSize; @@ -140,6 +143,7 @@ class _GalleriesPage extends State "sortByGid": [v!.index.toString()], "tag": [widget.tag ?? ""], "uploader": [widget.uploader ?? ""], + "category": [widget.category ?? ""], }; queryParameters.removeWhere((k, v) => v[0].isEmpty); context.pushReplacementNamed("/galleries", @@ -155,12 +159,24 @@ class _GalleriesPage extends State ], leadingIcon: const Icon(Icons.sort), ); - final title = widget.uploader != null && widget.tag != null - ? i18n.tagUploaderGalleries(preferredTag(context)!, widget.uploader!) + final title = widget.tag != null + ? widget.uploader != null + ? widget.category != null + ? i18n.tagUploaderCategoryGalleries( + preferredTag(context)!, widget.uploader!, widget.category!) + : i18n.tagUploaderGalleries( + preferredTag(context)!, widget.uploader!) + : widget.category != null + ? i18n.tagCategoryGalleries( + widget.category!, preferredTag(context)!) + : i18n.tagGalleries(preferredTag(context)!) : widget.uploader != null - ? i18n.uploaderGalleries(widget.uploader!) - : widget.tag != null - ? i18n.tagGalleries(preferredTag(context)!) + ? widget.category != null + ? i18n.uploaderCategoryGalleries( + widget.category!, widget.uploader!) + : i18n.uploaderGalleries(widget.uploader!) + : widget.category != null + ? i18n.categoryGalleries(widget.category!) : i18n.galleries; if (isTop(context)) { setCurrentTitle(title, Theme.of(context).primaryColor.value);