mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-05 16:15:43 +00:00
Refactor project in get-cli standard (#80)
* refactor project in get-cli standard * use local trackers when github is not connectable upgrade stylish_bottom_bar to 1.0.0 responsive view for home_view treeview for file_list_vie fluent ui integrating * improve responsive view. treeView add light theme.fix overflow bugs * responsive view,treeView,file select downloaded and downloading pages file extension icons fix some minor bugs * use local trackers when github is not connectable upgrade stylish_bottom_bar to 1.0.0 responsive view for home_view treeview for file_list_vie fluent ui integrating * improve responsive view. treeView add light theme.fix overflow bugs * bottom bar index fix * refactor project in get-cli standard --------- Co-authored-by: wuke2022 <[email protected]>
This commit is contained in:
1 parent
9b1ed15fea
commit
74c24ad860
44 files changed
+1025
-360
No files matched your search
+40
-5
@@ -1,17 +1,52 @@
|
||||
# Gopeed contributors guide
|
||||
|
||||
Firstly, thank you for your interest in contributing to Gopeed. This guide will help you better participate in the development of Gopeed.
|
||||
Firstly, thank you for your interest in contributing to Gopeed. This guide will help you better
|
||||
participate in the development of Gopeed.
|
||||
|
||||
## Branch description
|
||||
|
||||
This project only has one main branch, namely the `main` branch. If you want to participate in the development of Gopeed, please fork this project first, and then develop in your fork project. After development is completed, submit a PR to this project and merge it into the `main` branch.
|
||||
This project only has one main branch, namely the `main` branch. If you want to participate in the
|
||||
development of Gopeed, please fork this project first, and then develop in your fork project. After
|
||||
development is completed, submit a PR to this project and merge it into the `main` branch.
|
||||
|
||||
## Local development
|
||||
|
||||
It is recommended to develop and debug through the web. First, start the backend service, and start it by the command line `go run cmd/api/main.go`, the default port of the service is `9999`, and then start the front-end flutter project in `debug` mode to run.
|
||||
It is recommended to develop and debug through the web. First, start the backend service, and start
|
||||
it by the command line `go run cmd/api/main.go`, the default port of the service is `9999`, and then
|
||||
start the front-end flutter project in `debug` mode to run.
|
||||
|
||||
## Translation
|
||||
|
||||
The internationalization files of Gopeed are located in the `ui/flutter/lib/i18n/langs` directory. You only need to add the corresponding language file in this directory.
|
||||
The internationalization files of Gopeed are located in the `ui/flutter/assets/locales` directory.
|
||||
You only need to add the corresponding language file in this directory.
|
||||
|
||||
> Tip: Please refer to `en_us.dart` for translation.
|
||||
Generate locales after you edit locales/internationalization:
|
||||
|
||||
```
|
||||
get generate locales
|
||||
```
|
||||
|
||||
Please refer to `en_us.dart` for translation.
|
||||
|
||||
## flutter development
|
||||
|
||||
Don't forget to run`dart format .`before you commit to keep your code in standard dart format
|
||||
|
||||
Turn on build_runner watcher if you want to edit api/models:
|
||||
|
||||
```
|
||||
flutter pub run build_runner watch
|
||||
```
|
||||
|
||||
|
||||
get-cli commands usages:
|
||||
|
||||
```
|
||||
create:
|
||||
controller: Generate controller
|
||||
page: Use to generate pages
|
||||
view: Generate view
|
||||
generate:
|
||||
locales: Generate translation file from json files
|
||||
model: generate Class model from json
|
||||
```
|
||||
+35
-4
@@ -4,14 +4,45 @@
|
||||
|
||||
## 分支说明
|
||||
|
||||
本项目只有一个主分支,即 `main` 分支,如果您想要参与到 Gopeed 的开发中来,请先 fork 本项目,然后在您的 fork 项目中进行开发,开发完成后再向本项目提交 PR,合并到 `main` 分支。
|
||||
本项目只有一个主分支,即 `main` 分支,如果您想要参与到 Gopeed 的开发中来,请先 fork 本项目,然后在您的 fork 项目中进行开发,开发完成后再向本项目提交
|
||||
PR,合并到 `main` 分支。
|
||||
|
||||
## 本地开发
|
||||
|
||||
建议通过 web 端进行开发调试,首先启动后端服务,通过命令行 `go run cmd/api/main.go` 启动 ,服务启动默认端口为 `9999`,然后以 `debug` 模式启动前端 flutter 项目即可运行。
|
||||
建议通过 web 端进行开发调试,首先启动后端服务,通过命令行 `go run cmd/api/main.go` 启动 ,服务启动默认端口为 `9999`,然后以 `debug` 模式启动前端
|
||||
flutter 项目即可运行。
|
||||
|
||||
## 翻译
|
||||
|
||||
Gopeed 的国际化文件位于 `ui/flutter/assets/locales` 目录下,只需要在该目录下添加对应的语言文件即可。
|
||||
|
||||
Gopeed 的国际化文件位于 `ui/flutter/lib/i18n/langs` 目录下,只需要在该目录下添加对应的语言文件即可。
|
||||
编辑locales/internationalization后请运行以下命令:
|
||||
|
||||
```
|
||||
get generate locales
|
||||
```
|
||||
|
||||
请注意以 `en_US.json` 为参照进行翻译。
|
||||
|
||||
## flutter development
|
||||
|
||||
每次提交前请务必运行`dart format .`
|
||||
|
||||
如果要编辑api/models,请打开build_runner watcher:
|
||||
|
||||
```
|
||||
flutter pub run build_runner watch
|
||||
```
|
||||
|
||||
适用get-cli 命令:
|
||||
|
||||
```
|
||||
create:
|
||||
controller: Generate controller
|
||||
page: Use to generate pages
|
||||
view: Generate view
|
||||
generate:
|
||||
locales: Generate translation file from json files
|
||||
model: generate Class model from json
|
||||
```
|
||||
|
||||
> 请注意以 `en_us.dart` 为参照进行翻译。
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
C:/Users/huget/fvm/versions/3.7.0
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"flutterSdkVersion": "3.7.0",
|
||||
"flavors": {}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
|
||||
|
||||
|
||||
|
||||
Don't forget to run`dart format .`before you commit to keep your code in standard dart format
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"label": "English",
|
||||
"error": "Error",
|
||||
"tip": "Tip",
|
||||
"confirm": "Confirm",
|
||||
"cancel": "Cancel",
|
||||
"selectAll": "Select All",
|
||||
"task": "Task",
|
||||
"downloading": "downloading",
|
||||
"downloaded": "downloaded",
|
||||
"setting": "Setting",
|
||||
"create": "Create Task",
|
||||
"downloadLink": "Download Link",
|
||||
"downloadLinkValid": "Please enter the download link",
|
||||
"downloadLinkHit": "Please enter the download link, HTTP/HTTPS/MAGNET supported@append",
|
||||
"downloadLinkHitDesktop": ", or drag the torrent file here directly",
|
||||
"download": "Download",
|
||||
"noStoragePermission": "Storage permission required",
|
||||
"selectFile": "Select File",
|
||||
"basic": "Basic",
|
||||
"advanced": "Advanced",
|
||||
"general": "General",
|
||||
"downloadDir": "Download Directory",
|
||||
"downloadDirValid": "Please select the download directory",
|
||||
"connections": "Connections",
|
||||
"items": "@count items",
|
||||
"subscribeTracker": "Subscribe Tracker",
|
||||
"subscribeFail": "Subscribe failed, please check network or try again later",
|
||||
"update": "Update",
|
||||
"updateDaily": "Update daily",
|
||||
"lastUpdate": "Last update: @time",
|
||||
"addTracker": "Add Tracker",
|
||||
"addTrackerHit": "Please enter the tracker server url, one per line",
|
||||
"ui": "UI",
|
||||
"theme": "Theme",
|
||||
"themeSystem": "System",
|
||||
"themeLight": "Light",
|
||||
"themeDark": "Dark",
|
||||
"locale": "Language",
|
||||
"about": "About",
|
||||
"homepage": "Homepage",
|
||||
"version": "Version",
|
||||
"protocol": "Protocol",
|
||||
"port": "Port",
|
||||
"apiToken": "API Token",
|
||||
"notSet": "NS",
|
||||
"set": "SET",
|
||||
"effectAfterRestart": "Effect after restart",
|
||||
"deleteTask": "Delete Task",
|
||||
"deleteTaskTip": "Keep downloaded files",
|
||||
"delete": "Delete"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"label": "فارسی",
|
||||
"error": "اررور",
|
||||
"tip": "Tip",
|
||||
"confirm": "تایید",
|
||||
"cancel": "انصراف",
|
||||
"selectAll": "انتخاب همه",
|
||||
"task": "کار",
|
||||
"downloading": "downloading",
|
||||
"downloaded": "downloaded",
|
||||
"setting": "تنظیمات",
|
||||
"title": "ایجاد کار",
|
||||
"downloadLink": "لینک دانلود",
|
||||
"downloadLinkValid": "لطفا لینک دانلود را وارد کنید",
|
||||
"downloadLinkHit": "Please enter the download link, HTTP/HTTPS/MAGNET supported@append",
|
||||
"downloadLinkHitDesktop": ", or drag the torrent file here directly",
|
||||
"download": "دانلود",
|
||||
"noStoragePermission": "مجوز ذخیره سازی مورد نیاز است",
|
||||
"selectFile": "انتخاب فایل",
|
||||
"basic": "پایه",
|
||||
"advanced": "پیشرفته",
|
||||
"general": "عمومی",
|
||||
"downloadDir": "دایرکتوری دانلود",
|
||||
"downloadDirValid": "لطفا دایرکتوری دانلود را انتخاب کنید",
|
||||
"connections": "اتصالات",
|
||||
"items": "@count آیتم ها",
|
||||
"subscribeTracker": "Subscribe Tracker",
|
||||
"subscribeFail": "Subscribe failed, please check network or try again later",
|
||||
"update": "بروزرسانی",
|
||||
"updateDaily": "بروزرسانی روزانه",
|
||||
"lastUpdate": "Last update: @time",
|
||||
"addTracker": "Add Tracker",
|
||||
"addTrackerHit": "Please enter the tracker server url, one per line",
|
||||
"ui": "رابط کاربری",
|
||||
"theme": "پوسته",
|
||||
"themeSystem": "سیستم",
|
||||
"themeLight": "روشن",
|
||||
"themeDark": "تاریک",
|
||||
"locale": "Language",
|
||||
"about": "درباره ی",
|
||||
"homepage": "صفحه اصلی",
|
||||
"version": "نسخه",
|
||||
"protocol": "پروتکل",
|
||||
"port": "پورت",
|
||||
"apiToken": "API توکن",
|
||||
"notSet": "NS",
|
||||
"set": "SET",
|
||||
"effectAfterRestart": "Effect after restart",
|
||||
"deleteTask": "پاک کردن کار",
|
||||
"deleteTaskTip": "فایل های دانلود شده را نگه دارد",
|
||||
"delete": "پاک کردن"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"label": "Русский(Россия)",
|
||||
"error": "Ошибка",
|
||||
"tip": "Подсказка",
|
||||
"confirm": "Подтвердить",
|
||||
"cancel": "Отмена",
|
||||
"selectAll": "Выбрать все",
|
||||
"task": "Задачи",
|
||||
"downloading": "downloading",
|
||||
"downloaded": "downloaded",
|
||||
"setting": "Настройки",
|
||||
"title": "Создать задачу",
|
||||
"downloadLink": "Ссылка для скачивание",
|
||||
"downloadLinkValid": "Пожалуйста, введите ссылку для скачивания",
|
||||
"downloadLinkHit": "Пожалуйста, введите ссылку для скачивания, HTTP/HTTPS/MAGNET supported@append",
|
||||
"downloadLinkHitDesktop": ", или перетащите сюда торрент-файл",
|
||||
"download": "Скачать",
|
||||
"noStoragePermission": "Требуется доступ к хранилищу",
|
||||
"selectFile": "Выберать файл",
|
||||
"basic": "Основные параметры",
|
||||
"advanced": "Расширенные",
|
||||
"general": "Общие",
|
||||
"downloadDir": "Папка загрузки",
|
||||
"downloadDirValid": "Пожалуйста, выберите папку для загрузки",
|
||||
"connections": "Соединений",
|
||||
"items": "@подсчет элементов",
|
||||
"subscribeTracker": "Подпись трекера",
|
||||
"subscribeFail": "Подписка не удалась, пожалуйста, проверьте сеть или повторите попытку позже",
|
||||
"update": "Обновить",
|
||||
"updateDaily": "Обновлять ежедневно",
|
||||
"lastUpdate": "Последнее обновление: @время",
|
||||
"addTracker": "Добавить трекер",
|
||||
"addTrackerHit": "Пожалуйста, введите url трекера, по одному в строке",
|
||||
"ui": "UI",
|
||||
"theme": "Тема",
|
||||
"themeSystem": "Системная",
|
||||
"themeLight": "Светлая",
|
||||
"themeDark": "Темная",
|
||||
"locale": "Язык",
|
||||
"about": "О приложении",
|
||||
"homepage": "Домашняя страница",
|
||||
"version": "Версия",
|
||||
"protocol": "Протокол",
|
||||
"port": "Порт",
|
||||
"apiToken": "API Токен",
|
||||
"notSet": "Не установлено",
|
||||
"set": "Установлено",
|
||||
"effectAfterRestart": "Эффект после перезагрузки",
|
||||
"deleteTask": "Удалить задачу",
|
||||
"deleteTaskTip": "Сохранить загруженные файлы",
|
||||
"delete": "Удалить"
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"label": "中文(简体)",
|
||||
"error": "错误",
|
||||
"tip": "提示",
|
||||
"confirm": "确认",
|
||||
"cancel": "取消",
|
||||
"selectAll": "全选",
|
||||
"task": "任务",
|
||||
"downloading": "下载中",
|
||||
"downloaded": "已完成",
|
||||
"setting": "设置",
|
||||
"title": "创建任务",
|
||||
"downloadLink": "下载链接",
|
||||
"downloadLinkValid": "请输入下载链接",
|
||||
"downloadLinkHit": "请输入下载链接,支持 HTTP/HTTPS/MAGNET@append",
|
||||
"downloadLinkHitDesktop": ",也可以直接拖拽种子文件到此处",
|
||||
"download": "下载",
|
||||
"noStoragePermission": "需要开启存储权限",
|
||||
"selectFile": "选择文件",
|
||||
"basic": "基础",
|
||||
"advanced": "高级",
|
||||
"general": "通用",
|
||||
"downloadDir": "下载目录",
|
||||
"downloadDirValid": "请选择下载目录",
|
||||
"connections": "连接数",
|
||||
"items": "@count 条",
|
||||
"subscribeTracker": "订阅 Tracker",
|
||||
"subscribeFail": "订阅失败,请检查网络或稍后重试",
|
||||
"update": "更新",
|
||||
"updateDaily": "每天自动更新",
|
||||
"lastUpdate": "上次更新:@time",
|
||||
"addTracker": "添加 Tracker",
|
||||
"addTrackerHit": "请输入 tracker 服务器地址,每行一条",
|
||||
"ui": "界面",
|
||||
"theme": "主题",
|
||||
"themeSystem": "跟随系统",
|
||||
"themeLight": "明亮主题",
|
||||
"themeDark": "暗黑主题",
|
||||
"locale": "语言",
|
||||
"about": "关于",
|
||||
"homepage": "主页",
|
||||
"version": "版本",
|
||||
"protocol": "通讯协议",
|
||||
"port": "端口",
|
||||
"apiToken": "接口令牌",
|
||||
"notSet": "未设置",
|
||||
"set": "已设置",
|
||||
"effectAfterRestart": "此配置项将在重启应用后生效",
|
||||
"deleteTask": "删除任务",
|
||||
"deleteTaskTip": "保留已下载的文件",
|
||||
"delete": "删除"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class ApiProvider extends GetConnect {
|
||||
@override
|
||||
void onInit() {
|
||||
httpClient.baseUrl = 'YOUR-API-URL';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../controllers/app_controller.dart';
|
||||
|
||||
class AppBinding extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut<AppController>(
|
||||
() => AppController(),
|
||||
);
|
||||
}
|
||||
}
|
||||
+6
-6
@@ -6,12 +6,12 @@ import 'package:get/get.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../../api/api.dart';
|
||||
import '../../api/model/downloader_config.dart';
|
||||
import '../../core/common/start_config.dart';
|
||||
import '../../i18n/messages.dart';
|
||||
import '../../util/log_util.dart';
|
||||
import '../../util/util.dart';
|
||||
import '../../../../api/api.dart';
|
||||
import '../../../../api/model/downloader_config.dart';
|
||||
import '../../../../core/common/start_config.dart';
|
||||
import '../../../../i18n/messages.dart';
|
||||
import '../../../../util/log_util.dart';
|
||||
import '../../../../util/util.dart';
|
||||
|
||||
const _startConfigNetwork = "start.network";
|
||||
const _startConfigAddress = "start.address";
|
||||
+8
-10
@@ -2,11 +2,11 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../i18n/messages.dart';
|
||||
import '../../routes/router.dart';
|
||||
import '../../theme/theme.dart';
|
||||
import '../home/home_controller.dart';
|
||||
import 'app_controller.dart';
|
||||
import '../../../../generated/locales.g.dart';
|
||||
import '../../../../i18n/messages.dart';
|
||||
import '../../../../theme/theme.dart';
|
||||
import '../../../routes/app_pages.dart';
|
||||
import '../controllers/app_controller.dart';
|
||||
|
||||
class AppView extends GetView<AppController> {
|
||||
const AppView({Key? key}) : super(key: key);
|
||||
@@ -15,15 +15,13 @@ class AppView extends GetView<AppController> {
|
||||
Widget build(BuildContext context) {
|
||||
final config = controller.downloaderConfig.value;
|
||||
return GetMaterialApp.router(
|
||||
initialBinding: BindingsBuilder(() {
|
||||
Get.lazyPut<HomeController>(() => HomeController(), fenix: true);
|
||||
}),
|
||||
useInheritedMediaQuery: true,
|
||||
debugShowCheckedModeBanner: false,
|
||||
theme: GopeedTheme.light,
|
||||
darkTheme: GopeedTheme.dark,
|
||||
themeMode: ThemeMode.values.byName(config.extra.themeMode),
|
||||
translations: messages,
|
||||
// translations: messages,
|
||||
translationsKeys: AppTranslation.translations,
|
||||
locale: toLocale(config.extra.locale),
|
||||
fallbackLocale: fallbackLocale,
|
||||
localizationsDelegates: const [
|
||||
@@ -32,7 +30,7 @@ class AppView extends GetView<AppController> {
|
||||
GlobalCupertinoLocalizations.delegate,
|
||||
],
|
||||
supportedLocales: messages.keys.keys.map((e) => toLocale(e)).toList(),
|
||||
getPages: Routes.routes,
|
||||
getPages: AppPages.routes,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../controllers/create_controller.dart';
|
||||
|
||||
class CreateBinding extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut<CreateController>(
|
||||
() => CreateController(),
|
||||
);
|
||||
}
|
||||
}
|
||||
File renamed without changes.
+12
-12
@@ -4,16 +4,16 @@ import 'package:get/get.dart';
|
||||
import 'package:gopeed/api/model/resolve_result.dart';
|
||||
import 'package:rounded_loading_button/rounded_loading_button.dart';
|
||||
|
||||
import '../../api/api.dart';
|
||||
import '../../api/model/create_task.dart';
|
||||
import '../../api/model/options.dart';
|
||||
import '../../api/model/request.dart';
|
||||
import '../../routes/router.dart';
|
||||
import '../../util/util.dart';
|
||||
import '../../widget/directory_selector.dart';
|
||||
import '../../widget/file_list_view.dart';
|
||||
import '../app/app_controller.dart';
|
||||
import 'create_controller.dart';
|
||||
import '../../../../api/api.dart';
|
||||
import '../../../../api/model/create_task.dart';
|
||||
import '../../../../api/model/options.dart';
|
||||
import '../../../../api/model/request.dart';
|
||||
import '../../../../util/util.dart';
|
||||
import '../../../routes/app_pages.dart';
|
||||
import '../../../views/views/directory_selector.dart';
|
||||
import '../../../views/views/file_list_view.dart';
|
||||
import '../../app/controllers/app_controller.dart';
|
||||
import '../controllers/create_controller.dart';
|
||||
|
||||
class CreateView extends GetView<CreateController> {
|
||||
final _resolveFormKey = GlobalKey<FormState>();
|
||||
@@ -29,7 +29,7 @@ class CreateView extends GetView<CreateController> {
|
||||
appBar: AppBar(
|
||||
leading: IconButton(
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
onPressed: () => Get.rootDelegate.offNamed(Routes.downloading)),
|
||||
onPressed: () => Get.rootDelegate.offNamed(Routes.DOWNLOADING)),
|
||||
// actions: [],
|
||||
title: Text('create.title'.tr),
|
||||
),
|
||||
@@ -185,7 +185,7 @@ class CreateView extends GetView<CreateController> {
|
||||
selectFiles:
|
||||
controller.selectedIndexs.cast<int>())));
|
||||
Get.back();
|
||||
Get.rootDelegate.offNamed(Routes.downloading);
|
||||
Get.rootDelegate.offNamed(Routes.DOWNLOADING);
|
||||
}
|
||||
} catch (e) {
|
||||
Get.snackbar('error'.tr, e.toString());
|
||||
@@ -0,0 +1,12 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../controllers/downloaded_controller.dart';
|
||||
|
||||
class DownloadedBinding extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut<DownloadedController>(
|
||||
() => DownloadedController(),
|
||||
);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -2,8 +2,8 @@ import 'dart:async';
|
||||
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../api/api.dart';
|
||||
import '../../api/model/task.dart';
|
||||
import '../../../../api/api.dart';
|
||||
import '../../../../api/model/task.dart';
|
||||
|
||||
class DownloadedController extends GetxController {
|
||||
final tasks = <Task>[].obs;
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:gopeed/widget/buid_task_list_view.dart';
|
||||
import 'package:gopeed/app/views/views/buid_task_list_view.dart';
|
||||
|
||||
import 'downloaded_controller.dart';
|
||||
import '../controllers/downloaded_controller.dart';
|
||||
|
||||
class DownloadedView extends GetView<DownloadedController> {
|
||||
const DownloadedView({Key? key}) : super(key: key);
|
||||
@@ -0,0 +1,12 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../controllers/downloading_controller.dart';
|
||||
|
||||
class DownloadingBinding extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut<DownloadingController>(
|
||||
() => DownloadingController(),
|
||||
);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -2,8 +2,8 @@ import 'dart:async';
|
||||
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../api/api.dart';
|
||||
import '../../api/model/task.dart';
|
||||
import '../../../../api/api.dart';
|
||||
import '../../../../api/model/task.dart';
|
||||
|
||||
class DownloadingController extends GetxController {
|
||||
final tasks = <Task>[].obs;
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../widget/buid_task_list_view.dart';
|
||||
import 'downloading_controller.dart';
|
||||
import '../../../views/views/buid_task_list_view.dart';
|
||||
import '../controllers/downloading_controller.dart';
|
||||
|
||||
class DownloadingView extends GetView<DownloadingController> {
|
||||
const DownloadingView({Key? key}) : super(key: key);
|
||||
@@ -0,0 +1,13 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../controllers/home_controller.dart';
|
||||
|
||||
class HomeBinding extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut<HomeController>(
|
||||
() => HomeController(),
|
||||
fenix: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
File renamed without changes.
@@ -0,0 +1,124 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:stylish_bottom_bar/model/bar_items.dart';
|
||||
import 'package:stylish_bottom_bar/stylish_bottom_bar.dart';
|
||||
|
||||
import '../../../routes/app_pages.dart';
|
||||
import '../../../views/views/responsive_builder.dart';
|
||||
import '../controllers/home_controller.dart';
|
||||
|
||||
class HomeView extends GetView<HomeController> {
|
||||
const HomeView({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GetRouterOutlet.builder(builder: (context, delegate, currentRoute) {
|
||||
return Scaffold(
|
||||
extendBody: true,
|
||||
body: Row(
|
||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
!ResponsiveBuilder.isNarrow(context)
|
||||
? NavigationRail(
|
||||
extended: true,
|
||||
labelType: NavigationRailLabelType.none,
|
||||
minExtendedWidth: 140,
|
||||
groupAlignment: 0,
|
||||
// useIndicator: false,
|
||||
onDestinationSelected: (int index) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
delegate.toNamed(Routes.DOWNLOADING);
|
||||
controller.currentIndex.value = 0;
|
||||
break;
|
||||
case 1:
|
||||
delegate.toNamed(Routes.DOWNLOADED);
|
||||
controller.currentIndex.value = 1;
|
||||
break;
|
||||
case 2:
|
||||
delegate.toNamed(Routes.SETTING);
|
||||
controller.currentIndex.value = 2;
|
||||
break;
|
||||
}
|
||||
},
|
||||
destinations: [
|
||||
NavigationRailDestination(
|
||||
icon: const Icon(Icons.format_align_left_outlined),
|
||||
selectedIcon:
|
||||
const Icon(Icons.format_align_left_outlined),
|
||||
label: Text('downloading'.tr),
|
||||
),
|
||||
NavigationRailDestination(
|
||||
icon: const Icon(Icons.format_align_justify_outlined),
|
||||
selectedIcon:
|
||||
const Icon(Icons.format_align_justify_outlined),
|
||||
label: Text('downloaded'.tr),
|
||||
),
|
||||
NavigationRailDestination(
|
||||
icon: const Icon(Icons.settings),
|
||||
selectedIcon: const Icon(Icons.settings),
|
||||
label: Text('setting'.tr),
|
||||
),
|
||||
],
|
||||
selectedIndex: controller.currentIndex.value,
|
||||
leading: const Icon(Icons.logo_dev),
|
||||
// trailing: const Icon(Icons.info_outline),
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
Expanded(
|
||||
child: GetRouterOutlet(
|
||||
initialRoute: Routes.DOWNLOADING,
|
||||
// anchorRoute: '/',
|
||||
// filterPages: (afterAnchor) {
|
||||
// logger.w(afterAnchor);
|
||||
// logger.w(afterAnchor.take(1));
|
||||
// return afterAnchor.take(1);
|
||||
// },
|
||||
))
|
||||
]),
|
||||
bottomNavigationBar: ResponsiveBuilder.isNarrow(context)
|
||||
? StylishBottomBar(
|
||||
option: AnimatedBarOptions(
|
||||
iconSize: 32,
|
||||
barAnimation: BarAnimation.blink,
|
||||
iconStyle: IconStyle.Default,
|
||||
opacity: 0.3,
|
||||
),
|
||||
items: [
|
||||
BottomBarItem(
|
||||
icon: const Icon(Icons.format_align_left_outlined),
|
||||
selectedColor: Get.theme.primaryColor,
|
||||
title: Text('downloading'.tr)),
|
||||
BottomBarItem(
|
||||
icon: const Icon(Icons.format_align_justify_outlined),
|
||||
selectedColor: Get.theme.primaryColor,
|
||||
title: Text('downloaded'.tr)),
|
||||
BottomBarItem(
|
||||
icon: const Icon(Icons.settings),
|
||||
selectedColor: Get.theme.primaryColor,
|
||||
title: Text('setting'.tr)),
|
||||
],
|
||||
// hasNotch: true,
|
||||
currentIndex: controller.currentIndex.value,
|
||||
onTap: (index) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
delegate.toNamed(Routes.DOWNLOADING);
|
||||
controller.currentIndex.value = 0;
|
||||
break;
|
||||
case 1:
|
||||
delegate.toNamed(Routes.DOWNLOADED);
|
||||
controller.currentIndex.value = 1;
|
||||
break;
|
||||
case 2:
|
||||
delegate.toNamed(Routes.SETTING);
|
||||
controller.currentIndex.value = 2;
|
||||
break;
|
||||
}
|
||||
},
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../controllers/root_controller.dart';
|
||||
|
||||
class RootBinding extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut<RootController>(() => RootController(), fenix: true);
|
||||
}
|
||||
}
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
import 'package:get/get.dart';
|
||||
import '../../api/api.dart';
|
||||
|
||||
class RootController extends GetxController {}
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../routes/router.dart';
|
||||
import 'root_controller.dart';
|
||||
import '../../../routes/app_pages.dart';
|
||||
import '../controllers/root_controller.dart';
|
||||
|
||||
class RootView extends GetView<RootController> {
|
||||
const RootView({Key? key}) : super(key: key);
|
||||
@@ -12,7 +12,7 @@ class RootView extends GetView<RootController> {
|
||||
return GetRouterOutlet.builder(
|
||||
builder: (context, delegate, current) {
|
||||
return GetRouterOutlet(
|
||||
initialRoute: Routes.home,
|
||||
initialRoute: Routes.HOME,
|
||||
// anchorRoute: '/',
|
||||
// filterPages: (afterAnchor) {
|
||||
// return afterAnchor.take(1);
|
||||
@@ -0,0 +1,12 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../controllers/setting_controller.dart';
|
||||
|
||||
class SettingBinding extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut<SettingController>(
|
||||
() => SettingController(),
|
||||
);
|
||||
}
|
||||
}
|
||||
File renamed without changes.
+44
-48
@@ -7,14 +7,14 @@ import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
import '../../i18n/messages.dart';
|
||||
import '../../util/package_info.dart';
|
||||
import '../../util/util.dart';
|
||||
import '../../widget/check_list_view.dart';
|
||||
import '../../widget/directory_selector.dart';
|
||||
import '../../widget/outlined_button_loading.dart';
|
||||
import '../app/app_controller.dart';
|
||||
import 'setting_controller.dart';
|
||||
import '../../../../i18n/messages.dart';
|
||||
import '../../../../util/package_info.dart';
|
||||
import '../../../../util/util.dart';
|
||||
import '../../../views/views/check_list_view.dart';
|
||||
import '../../../views/views/directory_selector.dart';
|
||||
import '../../../views/views/outlined_button_loading.dart';
|
||||
import '../../app/controllers/app_controller.dart';
|
||||
import '../controllers/setting_controller.dart';
|
||||
|
||||
const _padding = SizedBox(height: 10);
|
||||
final _divider = const Divider().paddingOnly(left: 10, right: 10);
|
||||
@@ -38,7 +38,7 @@ class SettingView extends GetView<SettingController> {
|
||||
.then(completer.complete)
|
||||
.onError(completer.completeError);
|
||||
if (needRestart) {
|
||||
Get.snackbar('tip'.tr, 'setting.effectAfterRestart'.tr);
|
||||
Get.snackbar('tip'.tr, 'effectAfterRestart'.tr);
|
||||
}
|
||||
});
|
||||
return completer.future;
|
||||
@@ -46,8 +46,7 @@ class SettingView extends GetView<SettingController> {
|
||||
|
||||
// download basic config items start
|
||||
final buildDownloadDir = _buildConfigItem(
|
||||
'setting.downloadDir', () => downloaderCfg.value.downloadDir,
|
||||
(Key key) {
|
||||
'downloadDir', () => downloaderCfg.value.downloadDir, (Key key) {
|
||||
final downloadDirController =
|
||||
TextEditingController(text: downloaderCfg.value.downloadDir);
|
||||
downloadDirController.addListener(() async {
|
||||
@@ -69,8 +68,7 @@ class SettingView extends GetView<SettingController> {
|
||||
// http config items start
|
||||
final httpConfig = downloaderCfg.value.protocolConfig.http;
|
||||
final buildHttpConnections = _buildConfigItem(
|
||||
'setting.connections'.tr, () => httpConfig.connections.toString(),
|
||||
(Key key) {
|
||||
'connections'.tr, () => httpConfig.connections.toString(), (Key key) {
|
||||
final connectionsController =
|
||||
TextEditingController(text: httpConfig.connections.toString());
|
||||
connectionsController.addListener(() async {
|
||||
@@ -98,8 +96,8 @@ class SettingView extends GetView<SettingController> {
|
||||
final btExtConfig = downloaderCfg.value.extra.bt;
|
||||
|
||||
final buildBtTrackerSubscribeUrls = _buildConfigItem(
|
||||
'setting.subscribeTracker'.tr,
|
||||
() => 'setting.items'.trParams(
|
||||
'subscribeTracker'.tr,
|
||||
() => 'items'.trParams(
|
||||
{'count': btExtConfig.trackerSubscribeUrls.length.toString()}),
|
||||
(Key key) {
|
||||
final trackerUpdateController = OutlinedButtonLoadingController();
|
||||
@@ -127,24 +125,24 @@ class SettingView extends GetView<SettingController> {
|
||||
try {
|
||||
await appController.trackerUpdate();
|
||||
} catch (e) {
|
||||
Get.snackbar('error'.tr, 'setting.subscribeFail'.tr);
|
||||
Get.snackbar('error'.tr, 'subscribeFail'.tr);
|
||||
} finally {
|
||||
trackerUpdateController.stop();
|
||||
}
|
||||
},
|
||||
controller: trackerUpdateController,
|
||||
child: Text('setting.update'.tr),
|
||||
child: Text('update'.tr),
|
||||
),
|
||||
Expanded(
|
||||
child: SwitchListTile(
|
||||
controlAffinity: ListTileControlAffinity.leading,
|
||||
value: true,
|
||||
onChanged: (bool value) {},
|
||||
title: Text('setting.updateDaily'.tr)),
|
||||
title: Text('updateDaily'.tr)),
|
||||
),
|
||||
],
|
||||
),
|
||||
Text('setting.lastUpdate'.trParams({
|
||||
Text('lastUpdate'.trParams({
|
||||
'time': btExtConfig.lastTrackerUpdateTime != null
|
||||
? DateFormat('yyyy-MM-dd HH:mm:ss')
|
||||
.format(btExtConfig.lastTrackerUpdateTime!)
|
||||
@@ -154,8 +152,8 @@ class SettingView extends GetView<SettingController> {
|
||||
);
|
||||
});
|
||||
final buildBtTrackers = _buildConfigItem(
|
||||
'setting.addTracker'.tr,
|
||||
() => 'setting.items'
|
||||
'addTracker'.tr,
|
||||
() => 'items'
|
||||
.trParams({'count': btExtConfig.customTrackers.length.toString()}),
|
||||
(Key key) {
|
||||
final trackersController = TextEditingController(
|
||||
@@ -168,7 +166,7 @@ class SettingView extends GetView<SettingController> {
|
||||
keyboardType: TextInputType.multiline,
|
||||
maxLines: 5,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'setting.addTrackerHit'.tr,
|
||||
hintText: 'addTrackerHit'.tr,
|
||||
),
|
||||
onChanged: (value) async {
|
||||
btExtConfig.customTrackers = ls.convert(value);
|
||||
@@ -181,7 +179,7 @@ class SettingView extends GetView<SettingController> {
|
||||
|
||||
// ui config items start
|
||||
final buildTheme = _buildConfigItem(
|
||||
'setting.theme',
|
||||
'theme',
|
||||
() => _getThemeName(downloaderCfg.value.extra.themeMode),
|
||||
(Key key) => DropdownButton<String>(
|
||||
key: key,
|
||||
@@ -203,7 +201,7 @@ class SettingView extends GetView<SettingController> {
|
||||
.toList(),
|
||||
));
|
||||
final buildLocale = _buildConfigItem(
|
||||
'setting.locale',
|
||||
'locale',
|
||||
() => messages.keys[downloaderCfg.value.extra.locale]!['label']!,
|
||||
(Key key) => DropdownButton<String>(
|
||||
key: key,
|
||||
@@ -228,7 +226,7 @@ class SettingView extends GetView<SettingController> {
|
||||
|
||||
// about config items start
|
||||
buildHomepage() => ListTile(
|
||||
title: Text('setting.homepage'.tr),
|
||||
title: Text('homepage'.tr),
|
||||
subtitle: const Text('https://github.com/GopeedLab/gopeed'),
|
||||
onTap: () {
|
||||
launchUrl(Uri.parse('https://github.com/GopeedLab/gopeed'),
|
||||
@@ -236,13 +234,13 @@ class SettingView extends GetView<SettingController> {
|
||||
},
|
||||
);
|
||||
buildVersion() => ListTile(
|
||||
title: Text('setting.version'.tr),
|
||||
title: Text('version'.tr),
|
||||
subtitle: Text(packageInfo.version),
|
||||
);
|
||||
|
||||
// advanced config items start
|
||||
final buildApiProtocol = _buildConfigItem(
|
||||
'setting.protocol'.tr,
|
||||
'protocol'.tr,
|
||||
() => startCfg.value.network == 'tcp'
|
||||
? 'TCP ${startCfg.value.address}'
|
||||
: 'Unix',
|
||||
@@ -320,7 +318,7 @@ class SettingView extends GetView<SettingController> {
|
||||
child: TextFormField(
|
||||
controller: portController,
|
||||
decoration: InputDecoration(
|
||||
labelText: 'setting.port'.tr,
|
||||
labelText: 'port'.tr,
|
||||
contentPadding: const EdgeInsets.all(0.0),
|
||||
),
|
||||
keyboardType: TextInputType.number,
|
||||
@@ -340,11 +338,9 @@ class SettingView extends GetView<SettingController> {
|
||||
);
|
||||
},
|
||||
);
|
||||
final buildApiToken = _buildConfigItem(
|
||||
'setting.apiToken'.tr,
|
||||
() => startCfg.value.apiToken.isEmpty
|
||||
? 'setting.notSet'.tr
|
||||
: 'setting.seted'.tr, (Key key) {
|
||||
final buildApiToken = _buildConfigItem('apiToken'.tr,
|
||||
() => startCfg.value.apiToken.isEmpty ? 'notSet'.tr : 'seted'.tr,
|
||||
(Key key) {
|
||||
final apiTokenController =
|
||||
TextEditingController(text: startCfg.value.apiToken);
|
||||
apiTokenController.addListener(() async {
|
||||
@@ -377,10 +373,10 @@ class SettingView extends GetView<SettingController> {
|
||||
bottom: TabBar(
|
||||
tabs: [
|
||||
Tab(
|
||||
text: 'setting.basic'.tr,
|
||||
text: 'basic'.tr,
|
||||
),
|
||||
Tab(
|
||||
text: 'setting.advanced'.tr,
|
||||
text: 'advanced'.tr,
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -391,7 +387,7 @@ class SettingView extends GetView<SettingController> {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: _addPadding([
|
||||
Text('setting.general'.tr),
|
||||
Text('general'.tr),
|
||||
Card(
|
||||
child: Column(
|
||||
children: _addDivider([
|
||||
@@ -413,7 +409,7 @@ class SettingView extends GetView<SettingController> {
|
||||
buildBtTrackers(),
|
||||
]),
|
||||
)),
|
||||
Text('setting.ui'.tr),
|
||||
Text('ui'.tr),
|
||||
Card(
|
||||
child: Column(
|
||||
children: _addDivider([
|
||||
@@ -421,7 +417,7 @@ class SettingView extends GetView<SettingController> {
|
||||
buildLocale(),
|
||||
]),
|
||||
)),
|
||||
Text('setting.about'.tr),
|
||||
Text('about'.tr),
|
||||
Card(
|
||||
child: Column(
|
||||
children: _addDivider([
|
||||
@@ -519,22 +515,22 @@ class SettingView extends GetView<SettingController> {
|
||||
String _getThemeName(String? themeMode) {
|
||||
switch (ThemeMode.values.byName(themeMode ?? ThemeMode.system.name)) {
|
||||
case ThemeMode.light:
|
||||
return 'setting.themeLight'.tr;
|
||||
return 'themeLight'.tr;
|
||||
case ThemeMode.dark:
|
||||
return 'setting.themeDark'.tr;
|
||||
return 'themeDark'.tr;
|
||||
default:
|
||||
return 'setting.themeSystem'.tr;
|
||||
return 'themeSystem'.tr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class _ConfigItem {
|
||||
late String label;
|
||||
late String Function() text;
|
||||
late Widget Function(Key key) inputItem;
|
||||
|
||||
_ConfigItem(this.label, this.text, this.inputItem);
|
||||
}
|
||||
// class _ConfigItem {
|
||||
// late String label;
|
||||
// late String Function() text;
|
||||
// late Widget Function(Key key) inputItem;
|
||||
//
|
||||
// _ConfigItem(this.label, this.text, this.inputItem);
|
||||
// }
|
||||
|
||||
class _NumericalRangeFormatter extends TextInputFormatter {
|
||||
final int min;
|
||||
@@ -0,0 +1,68 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../modules/create/bindings/create_binding.dart';
|
||||
import '../modules/create/views/create_view.dart';
|
||||
import '../modules/downloaded/bindings/downloaded_binding.dart';
|
||||
import '../modules/downloaded/views/downloaded_view.dart';
|
||||
import '../modules/downloading/bindings/downloading_binding.dart';
|
||||
import '../modules/downloading/views/downloading_view.dart';
|
||||
import '../modules/home/bindings/home_binding.dart';
|
||||
import '../modules/home/views/home_view.dart';
|
||||
import '../modules/root/bindings/root_binding.dart';
|
||||
import '../modules/root/views/root_view.dart';
|
||||
import '../modules/setting/bindings/setting_binding.dart';
|
||||
import '../modules/setting/views/setting_view.dart';
|
||||
|
||||
part 'app_routes.dart';
|
||||
|
||||
class AppPages {
|
||||
AppPages._();
|
||||
|
||||
static const INITIAL = Routes.ROOT;
|
||||
|
||||
static final routes = [
|
||||
GetPage(
|
||||
name: _Paths.ROOT,
|
||||
participatesInRootNavigator: true,
|
||||
transition: Transition.topLevel,
|
||||
// preventDuplicates: true,
|
||||
page: () => const RootView(),
|
||||
binding: RootBinding(),
|
||||
children: [
|
||||
GetPage(
|
||||
name: _Paths.HOME,
|
||||
// participatesInRootNavigator: true,
|
||||
// transition: Transition.topLevel,
|
||||
// preventDuplicates: true,
|
||||
page: () => const HomeView(),
|
||||
binding: HomeBinding(),
|
||||
children: [
|
||||
GetPage(
|
||||
name: _Paths.DOWNLOADED,
|
||||
transition: Transition.noTransition,
|
||||
page: () => const DownloadedView(),
|
||||
binding: DownloadedBinding(),
|
||||
),
|
||||
GetPage(
|
||||
name: _Paths.DOWNLOADING,
|
||||
transition: Transition.noTransition,
|
||||
page: () => const DownloadingView(),
|
||||
binding: DownloadingBinding(),
|
||||
),
|
||||
GetPage(
|
||||
name: _Paths.SETTING,
|
||||
transition: Transition.noTransition,
|
||||
page: () => const SettingView(),
|
||||
binding: SettingBinding(),
|
||||
),
|
||||
]),
|
||||
GetPage(
|
||||
name: _Paths.CREATE,
|
||||
transition: Transition.downToUp,
|
||||
// preventDuplicates: true,
|
||||
page: () => CreateView(),
|
||||
binding: CreateBinding(),
|
||||
),
|
||||
]),
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
part of 'app_pages.dart';
|
||||
// DO NOT EDIT. This is code generated via package:get_cli/get_cli.dart
|
||||
|
||||
abstract class Routes {
|
||||
Routes._();
|
||||
static const DOWNLOADED = _Paths.HOME + _Paths.DOWNLOADED;
|
||||
static const DOWNLOADING = _Paths.HOME + _Paths.DOWNLOADING;
|
||||
static const CREATE = _Paths.CREATE;
|
||||
static const ROOT = _Paths.ROOT;
|
||||
static const SETTING = _Paths.HOME + _Paths.SETTING;
|
||||
static const HOME = _Paths.HOME;
|
||||
}
|
||||
|
||||
abstract class _Paths {
|
||||
_Paths._();
|
||||
static const DOWNLOADED = '/downloaded';
|
||||
static const DOWNLOADING = '/downloading';
|
||||
static const CREATE = '/create';
|
||||
static const ROOT = '/';
|
||||
static const SETTING = '/setting';
|
||||
static const HOME = '/home';
|
||||
}
|
||||
+5
-5
@@ -4,10 +4,10 @@ import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
import '../../api/api.dart';
|
||||
import '../../api/model/task.dart';
|
||||
import '../../routes/router.dart';
|
||||
import '../../util/util.dart';
|
||||
import '../../../api/api.dart';
|
||||
import '../../../api/model/task.dart';
|
||||
import '../../../util/util.dart';
|
||||
import '../../routes/app_pages.dart';
|
||||
|
||||
class BuildTaskListView extends GetView {
|
||||
final List<Task> tasks;
|
||||
@@ -26,7 +26,7 @@ class BuildTaskListView extends GetView {
|
||||
icon: const Icon(Icons.add),
|
||||
tooltip: 'create.title'.tr,
|
||||
onPressed: () {
|
||||
Get.rootDelegate.toNamed(Routes.create);
|
||||
Get.rootDelegate.toNamed(Routes.CREATE);
|
||||
},
|
||||
),
|
||||
//TODO appBar toggleALl/start selected/delete selected/
|
||||
File renamed without changes.
+4
-4
@@ -2,8 +2,8 @@ import 'package:file_selector/file_selector.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../util/mac_secure_util.dart';
|
||||
import '../util/util.dart';
|
||||
import '../../../util/mac_secure_util.dart';
|
||||
import '../../../util/util.dart';
|
||||
|
||||
class DirectorySelector extends StatefulWidget {
|
||||
final TextEditingController controller;
|
||||
@@ -28,11 +28,11 @@ class _DirectorySelectorState extends State<DirectorySelector> {
|
||||
controller: widget.controller,
|
||||
decoration: widget.showLabel
|
||||
? InputDecoration(
|
||||
labelText: 'setting.downloadDir'.tr,
|
||||
labelText: 'downloadDir'.tr,
|
||||
)
|
||||
: null,
|
||||
validator: (v) {
|
||||
return v!.trim().isNotEmpty ? null : 'setting.downloadDirValid'.tr;
|
||||
return v!.trim().isNotEmpty ? null : 'downloadDirValid'.tr;
|
||||
},
|
||||
)),
|
||||
!Util.isDesktop()
|
||||
+4
-4
@@ -3,10 +3,10 @@ import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
|
||||
import '../pages/app/app_controller.dart';
|
||||
import '../pages/create/create_controller.dart';
|
||||
import '../util/file_icon.dart';
|
||||
import '../util/util.dart';
|
||||
import '../../../util/file_icon.dart';
|
||||
import '../../../util/util.dart';
|
||||
import '../../modules/app/controllers/app_controller.dart';
|
||||
import '../../modules/create/controllers/create_controller.dart';
|
||||
|
||||
class FileListView extends GetView {
|
||||
FileListView({
|
||||
File renamed without changes.
@@ -0,0 +1,50 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class ResponsiveBuilder extends StatelessWidget {
|
||||
const ResponsiveBuilder({
|
||||
required this.narrowBuilder,
|
||||
required this.mediumBuilder,
|
||||
required this.wideBuilder,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
|
||||
final Widget Function(
|
||||
BuildContext context,
|
||||
BoxConstraints constraints,
|
||||
) narrowBuilder;
|
||||
|
||||
final Widget Function(
|
||||
BuildContext context,
|
||||
BoxConstraints constraints,
|
||||
) mediumBuilder;
|
||||
|
||||
final Widget Function(
|
||||
BuildContext context,
|
||||
BoxConstraints constraints,
|
||||
) wideBuilder;
|
||||
|
||||
static bool isNarrow(BuildContext context) =>
|
||||
MediaQuery.of(context).size.width < 768;
|
||||
|
||||
static bool isMedium(BuildContext context) =>
|
||||
MediaQuery.of(context).size.width < 992 &&
|
||||
MediaQuery.of(context).size.width >= 768;
|
||||
|
||||
static bool isWide(BuildContext context) =>
|
||||
MediaQuery.of(context).size.width >= 992;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return LayoutBuilder(
|
||||
builder: (context, constraints) {
|
||||
if (constraints.maxWidth >= 992) {
|
||||
return wideBuilder(context, constraints);
|
||||
} else if (constraints.maxWidth >= 768) {
|
||||
return mediumBuilder(context, constraints);
|
||||
} else {
|
||||
return narrowBuilder(context, constraints);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
File renamed without changes.
@@ -0,0 +1,284 @@
|
||||
// DO NOT EDIT. This is code generated via package:get_cli/get_cli.dart
|
||||
|
||||
// ignore_for_file: lines_longer_than_80_chars
|
||||
// ignore: avoid_classes_with_only_static_members
|
||||
class AppTranslation {
|
||||
static Map<String, Map<String, String>> translations = {
|
||||
'en_US': Locales.en_US,
|
||||
'fa_IR': Locales.fa_IR,
|
||||
'ru_RU': Locales.ru_RU,
|
||||
'zh_CN': Locales.zh_CN,
|
||||
};
|
||||
}
|
||||
|
||||
class LocaleKeys {
|
||||
LocaleKeys._();
|
||||
static const label = 'label';
|
||||
static const error = 'error';
|
||||
static const tip = 'tip';
|
||||
static const confirm = 'confirm';
|
||||
static const cancel = 'cancel';
|
||||
static const selectAll = 'selectAll';
|
||||
static const task = 'task';
|
||||
static const downloading = 'downloading';
|
||||
static const downloaded = 'downloaded';
|
||||
static const setting = 'setting';
|
||||
static const create = 'create';
|
||||
static const downloadLink = 'downloadLink';
|
||||
static const downloadLinkValid = 'downloadLinkValid';
|
||||
static const downloadLinkHit = 'downloadLinkHit';
|
||||
static const downloadLinkHitDesktop = 'downloadLinkHitDesktop';
|
||||
static const download = 'download';
|
||||
static const noStoragePermission = 'noStoragePermission';
|
||||
static const selectFile = 'selectFile';
|
||||
static const basic = 'basic';
|
||||
static const advanced = 'advanced';
|
||||
static const general = 'general';
|
||||
static const downloadDir = 'downloadDir';
|
||||
static const downloadDirValid = 'downloadDirValid';
|
||||
static const connections = 'connections';
|
||||
static const items = 'items';
|
||||
static const subscribeTracker = 'subscribeTracker';
|
||||
static const subscribeFail = 'subscribeFail';
|
||||
static const update = 'update';
|
||||
static const updateDaily = 'updateDaily';
|
||||
static const lastUpdate = 'lastUpdate';
|
||||
static const addTracker = 'addTracker';
|
||||
static const addTrackerHit = 'addTrackerHit';
|
||||
static const ui = 'ui';
|
||||
static const theme = 'theme';
|
||||
static const themeSystem = 'themeSystem';
|
||||
static const themeLight = 'themeLight';
|
||||
static const themeDark = 'themeDark';
|
||||
static const locale = 'locale';
|
||||
static const about = 'about';
|
||||
static const homepage = 'homepage';
|
||||
static const version = 'version';
|
||||
static const protocol = 'protocol';
|
||||
static const port = 'port';
|
||||
static const apiToken = 'apiToken';
|
||||
static const notSet = 'notSet';
|
||||
static const set = 'set';
|
||||
static const effectAfterRestart = 'effectAfterRestart';
|
||||
static const deleteTask = 'deleteTask';
|
||||
static const deleteTaskTip = 'deleteTaskTip';
|
||||
static const delete = 'delete';
|
||||
static const title = 'title';
|
||||
}
|
||||
|
||||
class Locales {
|
||||
static const en_US = {
|
||||
'label': 'English',
|
||||
'error': 'Error',
|
||||
'tip': 'Tip',
|
||||
'confirm': 'Confirm',
|
||||
'cancel': 'Cancel',
|
||||
'selectAll': 'Select All',
|
||||
'task': 'Task',
|
||||
'downloading': 'downloading',
|
||||
'downloaded': 'downloaded',
|
||||
'setting': 'Setting',
|
||||
'create': 'Create Task',
|
||||
'downloadLink': 'Download Link',
|
||||
'downloadLinkValid': 'Please enter the download link',
|
||||
'downloadLinkHit':
|
||||
'Please enter the download link, HTTP/HTTPS/MAGNET supported@append',
|
||||
'downloadLinkHitDesktop': ', or drag the torrent file here directly',
|
||||
'download': 'Download',
|
||||
'noStoragePermission': 'Storage permission required',
|
||||
'selectFile': 'Select File',
|
||||
'basic': 'Basic',
|
||||
'advanced': 'Advanced',
|
||||
'general': 'General',
|
||||
'downloadDir': 'Download Directory',
|
||||
'downloadDirValid': 'Please select the download directory',
|
||||
'connections': 'Connections',
|
||||
'items': '@count items',
|
||||
'subscribeTracker': 'Subscribe Tracker',
|
||||
'subscribeFail':
|
||||
'Subscribe failed, please check network or try again later',
|
||||
'update': 'Update',
|
||||
'updateDaily': 'Update daily',
|
||||
'lastUpdate': 'Last update: @time',
|
||||
'addTracker': 'Add Tracker',
|
||||
'addTrackerHit': 'Please enter the tracker server url, one per line',
|
||||
'ui': 'UI',
|
||||
'theme': 'Theme',
|
||||
'themeSystem': 'System',
|
||||
'themeLight': 'Light',
|
||||
'themeDark': 'Dark',
|
||||
'locale': 'Language',
|
||||
'about': 'About',
|
||||
'homepage': 'Homepage',
|
||||
'version': 'Version',
|
||||
'protocol': 'Protocol',
|
||||
'port': 'Port',
|
||||
'apiToken': 'API Token',
|
||||
'notSet': 'NS',
|
||||
'set': 'SET',
|
||||
'effectAfterRestart': 'Effect after restart',
|
||||
'deleteTask': 'Delete Task',
|
||||
'deleteTaskTip': 'Keep downloaded files',
|
||||
'delete': 'Delete',
|
||||
};
|
||||
static const fa_IR = {
|
||||
'label': 'فارسی',
|
||||
'error': 'اررور',
|
||||
'tip': 'Tip',
|
||||
'confirm': 'تایید',
|
||||
'cancel': 'انصراف',
|
||||
'selectAll': 'انتخاب همه',
|
||||
'task': 'کار',
|
||||
'downloading': 'downloading',
|
||||
'downloaded': 'downloaded',
|
||||
'setting': 'تنظیمات',
|
||||
'title': 'ایجاد کار',
|
||||
'downloadLink': 'لینک دانلود',
|
||||
'downloadLinkValid': 'لطفا لینک دانلود را وارد کنید',
|
||||
'downloadLinkHit':
|
||||
'Please enter the download link, HTTP/HTTPS/MAGNET supported@append',
|
||||
'downloadLinkHitDesktop': ', or drag the torrent file here directly',
|
||||
'download': 'دانلود',
|
||||
'noStoragePermission': 'مجوز ذخیره سازی مورد نیاز است',
|
||||
'selectFile': 'انتخاب فایل',
|
||||
'basic': 'پایه',
|
||||
'advanced': 'پیشرفته',
|
||||
'general': 'عمومی',
|
||||
'downloadDir': 'دایرکتوری دانلود',
|
||||
'downloadDirValid': 'لطفا دایرکتوری دانلود را انتخاب کنید',
|
||||
'connections': 'اتصالات',
|
||||
'items': '@count آیتم ها',
|
||||
'subscribeTracker': 'Subscribe Tracker',
|
||||
'subscribeFail':
|
||||
'Subscribe failed, please check network or try again later',
|
||||
'update': 'بروزرسانی',
|
||||
'updateDaily': 'بروزرسانی روزانه',
|
||||
'lastUpdate': 'Last update: @time',
|
||||
'addTracker': 'Add Tracker',
|
||||
'addTrackerHit': 'Please enter the tracker server url, one per line',
|
||||
'ui': 'رابط کاربری',
|
||||
'theme': 'پوسته',
|
||||
'themeSystem': 'سیستم',
|
||||
'themeLight': 'روشن',
|
||||
'themeDark': 'تاریک',
|
||||
'locale': 'Language',
|
||||
'about': 'درباره ی',
|
||||
'homepage': 'صفحه اصلی',
|
||||
'version': 'نسخه',
|
||||
'protocol': 'پروتکل',
|
||||
'port': 'پورت',
|
||||
'apiToken': 'API توکن',
|
||||
'notSet': 'NS',
|
||||
'set': 'SET',
|
||||
'effectAfterRestart': 'Effect after restart',
|
||||
'deleteTask': 'پاک کردن کار',
|
||||
'deleteTaskTip': 'فایل های دانلود شده را نگه دارد',
|
||||
'delete': 'پاک کردن',
|
||||
};
|
||||
static const ru_RU = {
|
||||
'label': 'Русский(Россия)',
|
||||
'error': 'Ошибка',
|
||||
'tip': 'Подсказка',
|
||||
'confirm': 'Подтвердить',
|
||||
'cancel': 'Отмена',
|
||||
'selectAll': 'Выбрать все',
|
||||
'task': 'Задачи',
|
||||
'downloading': 'downloading',
|
||||
'downloaded': 'downloaded',
|
||||
'setting': 'Настройки',
|
||||
'title': 'Создать задачу',
|
||||
'downloadLink': 'Ссылка для скачивание',
|
||||
'downloadLinkValid': 'Пожалуйста, введите ссылку для скачивания',
|
||||
'downloadLinkHit':
|
||||
'Пожалуйста, введите ссылку для скачивания, HTTP/HTTPS/MAGNET supported@append',
|
||||
'downloadLinkHitDesktop': ', или перетащите сюда торрент-файл',
|
||||
'download': 'Скачать',
|
||||
'noStoragePermission': 'Требуется доступ к хранилищу',
|
||||
'selectFile': 'Выберать файл',
|
||||
'basic': 'Основные параметры',
|
||||
'advanced': 'Расширенные',
|
||||
'general': 'Общие',
|
||||
'downloadDir': 'Папка загрузки',
|
||||
'downloadDirValid': 'Пожалуйста, выберите папку для загрузки',
|
||||
'connections': 'Соединений',
|
||||
'items': '@подсчет элементов',
|
||||
'subscribeTracker': 'Подпись трекера',
|
||||
'subscribeFail':
|
||||
'Подписка не удалась, пожалуйста, проверьте сеть или повторите попытку позже',
|
||||
'update': 'Обновить',
|
||||
'updateDaily': 'Обновлять ежедневно',
|
||||
'lastUpdate': 'Последнее обновление: @время',
|
||||
'addTracker': 'Добавить трекер',
|
||||
'addTrackerHit': 'Пожалуйста, введите url трекера, по одному в строке',
|
||||
'ui': 'UI',
|
||||
'theme': 'Тема',
|
||||
'themeSystem': 'Системная',
|
||||
'themeLight': 'Светлая',
|
||||
'themeDark': 'Темная',
|
||||
'locale': 'Язык',
|
||||
'about': 'О приложении',
|
||||
'homepage': 'Домашняя страница',
|
||||
'version': 'Версия',
|
||||
'protocol': 'Протокол',
|
||||
'port': 'Порт',
|
||||
'apiToken': 'API Токен',
|
||||
'notSet': 'Не установлено',
|
||||
'set': 'Установлено',
|
||||
'effectAfterRestart': 'Эффект после перезагрузки',
|
||||
'deleteTask': 'Удалить задачу',
|
||||
'deleteTaskTip': 'Сохранить загруженные файлы',
|
||||
'delete': 'Удалить',
|
||||
};
|
||||
static const zh_CN = {
|
||||
'label': '中文(简体)',
|
||||
'error': '错误',
|
||||
'tip': '提示',
|
||||
'confirm': '确认',
|
||||
'cancel': '取消',
|
||||
'selectAll': '全选',
|
||||
'task': '任务',
|
||||
'downloading': '下载中',
|
||||
'downloaded': '已完成',
|
||||
'setting': '设置',
|
||||
'title': '创建任务',
|
||||
'downloadLink': '下载链接',
|
||||
'downloadLinkValid': '请输入下载链接',
|
||||
'downloadLinkHit': '请输入下载链接,支持 HTTP/HTTPS/MAGNET@append',
|
||||
'downloadLinkHitDesktop': ',也可以直接拖拽种子文件到此处',
|
||||
'download': '下载',
|
||||
'noStoragePermission': '需要开启存储权限',
|
||||
'selectFile': '选择文件',
|
||||
'basic': '基础',
|
||||
'advanced': '高级',
|
||||
'general': '通用',
|
||||
'downloadDir': '下载目录',
|
||||
'downloadDirValid': '请选择下载目录',
|
||||
'connections': '连接数',
|
||||
'items': '@count 条',
|
||||
'subscribeTracker': '订阅 Tracker',
|
||||
'subscribeFail': '订阅失败,请检查网络或稍后重试',
|
||||
'update': '更新',
|
||||
'updateDaily': '每天自动更新',
|
||||
'lastUpdate': '上次更新:@time',
|
||||
'addTracker': '添加 Tracker',
|
||||
'addTrackerHit': '请输入 tracker 服务器地址,每行一条',
|
||||
'ui': '界面',
|
||||
'theme': '主题',
|
||||
'themeSystem': '跟随系统',
|
||||
'themeLight': '明亮主题',
|
||||
'themeDark': '暗黑主题',
|
||||
'locale': '语言',
|
||||
'about': '关于',
|
||||
'homepage': '主页',
|
||||
'version': '版本',
|
||||
'protocol': '通讯协议',
|
||||
'port': '端口',
|
||||
'apiToken': '接口令牌',
|
||||
'notSet': '未设置',
|
||||
'set': '已设置',
|
||||
'effectAfterRestart': '此配置项将在重启应用后生效',
|
||||
'deleteTask': '删除任务',
|
||||
'deleteTaskTip': '保留已下载的文件',
|
||||
'delete': '删除',
|
||||
};
|
||||
}
|
||||
@@ -4,9 +4,9 @@ import 'package:get/get.dart';
|
||||
import 'package:gopeed/api/api.dart' as api;
|
||||
import 'package:gopeed/i18n/messages.dart';
|
||||
|
||||
import 'app/modules/app/controllers/app_controller.dart';
|
||||
import 'app/modules/app/views/app_view.dart';
|
||||
import 'core/libgopeed_boot.dart';
|
||||
import 'pages/app/app_controller.dart';
|
||||
import 'pages/app/app_view.dart';
|
||||
import 'util/log_util.dart';
|
||||
import 'util/mac_secure_util.dart';
|
||||
import 'util/package_info.dart';
|
||||
|
||||
@@ -1,143 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:stylish_bottom_bar/model/bar_items.dart';
|
||||
import 'package:stylish_bottom_bar/stylish_bottom_bar.dart';
|
||||
|
||||
import '../../routes/router.dart';
|
||||
import '../../util/responsive_builder.dart';
|
||||
import 'home_controller.dart';
|
||||
|
||||
class HomeView extends GetView<HomeController> {
|
||||
const HomeView({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GetRouterOutlet.builder(
|
||||
builder: (context, delegate, currentRoute) {
|
||||
//This router outlet handles the appbar and the bottom navigation bar
|
||||
return Scaffold(
|
||||
extendBody: true,
|
||||
body: Row(
|
||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
!ResponsiveBuilder.isNarrow(context)
|
||||
? NavigationRail(
|
||||
extended: true,
|
||||
labelType: NavigationRailLabelType.none,
|
||||
minExtendedWidth: 140,
|
||||
groupAlignment: 0,
|
||||
// useIndicator: false,
|
||||
onDestinationSelected: (int index) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
delegate.toNamed(Routes.downloading);
|
||||
controller.currentIndex.value = 0;
|
||||
break;
|
||||
case 1:
|
||||
delegate.toNamed(Routes.downloaded);
|
||||
controller.currentIndex.value = 1;
|
||||
break;
|
||||
case 2:
|
||||
delegate.toNamed(Routes.setting);
|
||||
controller.currentIndex.value = 2;
|
||||
break;
|
||||
}
|
||||
},
|
||||
destinations: [
|
||||
NavigationRailDestination(
|
||||
icon: const Icon(Icons.format_align_left_outlined),
|
||||
selectedIcon:
|
||||
const Icon(Icons.format_align_left_outlined),
|
||||
label: Text('home.downloading'.tr),
|
||||
),
|
||||
NavigationRailDestination(
|
||||
icon:
|
||||
const Icon(Icons.format_align_justify_outlined),
|
||||
selectedIcon:
|
||||
const Icon(Icons.format_align_justify_outlined),
|
||||
label: Text('home.downloaded'.tr),
|
||||
),
|
||||
NavigationRailDestination(
|
||||
icon: const Icon(Icons.settings),
|
||||
selectedIcon: const Icon(Icons.settings),
|
||||
label: Text('home.setting'.tr),
|
||||
),
|
||||
],
|
||||
selectedIndex: controller.currentIndex.value,
|
||||
leading: const Icon(Icons.logo_dev),
|
||||
// trailing: const Icon(Icons.info_outline),
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
Expanded(
|
||||
child: GetRouterOutlet(
|
||||
initialRoute: Routes.downloading,
|
||||
))
|
||||
]),
|
||||
bottomNavigationBar: ResponsiveBuilder.isNarrow(context)
|
||||
? StylishBottomBar(
|
||||
option: AnimatedBarOptions(
|
||||
iconSize: 32,
|
||||
barAnimation: BarAnimation.blink,
|
||||
iconStyle: IconStyle.Default,
|
||||
opacity: 0.3,
|
||||
),
|
||||
items: [
|
||||
BottomBarItem(
|
||||
icon: const Icon(Icons.format_align_left_outlined),
|
||||
selectedColor: Get.theme.primaryColor,
|
||||
title: Text('home.downloading'.tr)),
|
||||
BottomBarItem(
|
||||
icon: const Icon(Icons.format_align_justify_outlined),
|
||||
selectedColor: Get.theme.primaryColor,
|
||||
title: Text('home.downloaded'.tr)),
|
||||
BottomBarItem(
|
||||
icon: const Icon(Icons.settings),
|
||||
selectedColor: Get.theme.primaryColor,
|
||||
title: Text('home.setting'.tr)),
|
||||
],
|
||||
// hasNotch: true,
|
||||
currentIndex: controller.currentIndex.value,
|
||||
onTap: (index) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
delegate.toNamed(Routes.downloading);
|
||||
controller.currentIndex.value = 0;
|
||||
break;
|
||||
case 1:
|
||||
delegate.toNamed(Routes.downloaded);
|
||||
controller.currentIndex.value = 1;
|
||||
break;
|
||||
case 2:
|
||||
delegate.toNamed(Routes.setting);
|
||||
controller.currentIndex.value = 2;
|
||||
break;
|
||||
}
|
||||
},
|
||||
)
|
||||
: const SizedBox.shrink(),
|
||||
// floatingActionButtonAnimator: FloatingActionButtonAnimator.scaling,
|
||||
// floatingActionButton: ResponsiveBuilder.isNarrow(context)
|
||||
// ? FloatingActionButton(
|
||||
// onPressed: () {
|
||||
// /* Get.isDarkMode
|
||||
// ? {
|
||||
// Get.changeTheme(GopeedTheme.light),
|
||||
// Get.changeThemeMode(ThemeMode.light)
|
||||
// }
|
||||
// : {
|
||||
// Get.changeTheme(GopeedTheme.dark),
|
||||
// Get.changeThemeMode(ThemeMode.dark)
|
||||
// }; */
|
||||
// Get.rootDelegate.toNamed(Routes.create);
|
||||
// },
|
||||
// child: const Icon(
|
||||
// Icons.add,
|
||||
// ))
|
||||
// : null,
|
||||
// floatingActionButtonLocation:
|
||||
// FloatingActionButtonLocation.centerDocked,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../pages/create/create_controller.dart';
|
||||
import '../pages/create/create_view.dart';
|
||||
import '../pages/downloaded/downloaded_controller.dart';
|
||||
import '../pages/downloaded/downloaded_view.dart';
|
||||
import '../pages/downloading/downloading_controller.dart';
|
||||
import '../pages/downloading/downloading_view.dart';
|
||||
import '../pages/home/home_controller.dart';
|
||||
import '../pages/home/home_view.dart';
|
||||
import '../pages/root/root_controller.dart';
|
||||
import '../pages/root/root_view.dart';
|
||||
import '../pages/setting/setting_controller.dart';
|
||||
import '../pages/setting/setting_view.dart';
|
||||
|
||||
abstract class _Paths {
|
||||
static const root = '/';
|
||||
|
||||
static const create = '/create';
|
||||
|
||||
static const home = '/home';
|
||||
static const downloading = '/downloading';
|
||||
static const downloaded = '/downloaded';
|
||||
static const setting = '/setting';
|
||||
}
|
||||
|
||||
class Routes {
|
||||
static const root = _Paths.root;
|
||||
|
||||
static const create = _Paths.create;
|
||||
|
||||
static const home = _Paths.home;
|
||||
static const downloading = _Paths.home + _Paths.downloading;
|
||||
static const downloaded = _Paths.home + _Paths.downloaded;
|
||||
|
||||
static const setting = _Paths.home + _Paths.setting;
|
||||
|
||||
static final routes = [
|
||||
GetPage(
|
||||
name: _Paths.root,
|
||||
participatesInRootNavigator: true,
|
||||
transition: Transition.topLevel,
|
||||
// preventDuplicates: true,
|
||||
page: () => const RootView(),
|
||||
binding: BindingsBuilder(() {
|
||||
Get.lazyPut<RootController>(() => RootController(), fenix: true);
|
||||
}),
|
||||
children: [
|
||||
GetPage(
|
||||
name: _Paths.create,
|
||||
transition: Transition.downToUp,
|
||||
// preventDuplicates: true,
|
||||
page: () => CreateView(),
|
||||
binding: BindingsBuilder(() {
|
||||
Get.lazyPut<CreateController>(() => CreateController(),
|
||||
fenix: true);
|
||||
}),
|
||||
),
|
||||
GetPage(
|
||||
name: _Paths.home,
|
||||
// transition: Transition.upToDown,
|
||||
// preventDuplicates: true,
|
||||
page: () => const HomeView(),
|
||||
binding: BindingsBuilder(() {
|
||||
Get.lazyPut<HomeController>(() => HomeController(),
|
||||
fenix: true);
|
||||
}),
|
||||
children: [
|
||||
GetPage(
|
||||
name: _Paths.downloading,
|
||||
transition: Transition.noTransition,
|
||||
page: () => const DownloadingView(),
|
||||
binding: BindingsBuilder(() {
|
||||
Get.lazyPut<DownloadingController>(
|
||||
() => DownloadingController(),
|
||||
);
|
||||
}),
|
||||
),
|
||||
GetPage(
|
||||
name: _Paths.downloaded,
|
||||
transition: Transition.noTransition,
|
||||
page: () => const DownloadedView(),
|
||||
binding: BindingsBuilder(() {
|
||||
Get.lazyPut<DownloadedController>(
|
||||
() => DownloadedController(),
|
||||
);
|
||||
}),
|
||||
),
|
||||
GetPage(
|
||||
name: _Paths.setting,
|
||||
transition: Transition.noTransition,
|
||||
page: () => const SettingView(),
|
||||
binding: BindingsBuilder(() {
|
||||
Get.lazyPut<SettingController>(() => SettingController());
|
||||
}),
|
||||
)
|
||||
]),
|
||||
]),
|
||||
];
|
||||
}
|
||||
Reference in new issue
Block a user