fix: code editor tool bar (#933)

This commit is contained in:
lollipopkit🏳️‍⚧️
2025-10-10 09:14:41 +08:00
committed by GitHub
parent bb3e3b4848
commit bd949288ed
13 changed files with 26 additions and 345 deletions

View File

@@ -57,8 +57,10 @@ class MyApp extends StatelessWidget {
final darkTheme = ThemeData(useMaterial3: true, brightness: Brightness.dark, colorScheme: dark); final darkTheme = ThemeData(useMaterial3: true, brightness: Brightness.dark, colorScheme: dark);
if (context.isDark && dark != null) { if (context.isDark && dark != null) {
UIs.primaryColor = dark.primary; UIs.primaryColor = dark.primary;
UIs.colorSeed = dark.primary;
} else if (!context.isDark && light != null) { } else if (!context.isDark && light != null) {
UIs.primaryColor = light.primary; UIs.primaryColor = light.primary;
UIs.colorSeed = light.primary;
} }
return _buildApp(context, light: lightTheme, dark: darkTheme); return _buildApp(context, light: lightTheme, dark: darkTheme);

View File

@@ -1,21 +0,0 @@
import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'app.g.dart';
part 'app.freezed.dart';
@freezed
abstract class AppState with _$AppState {
const factory AppState() = _AppState;
}
@Riverpod(keepAlive: true)
class AppStates extends _$AppStates {
static BuildContext? ctx;
@override
AppState build() {
return const AppState();
}
}

View File

@@ -1,206 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// coverage:ignore-file
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'app.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$AppState {
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is AppState);
}
@override
int get hashCode => runtimeType.hashCode;
@override
String toString() {
return 'AppState()';
}
}
/// @nodoc
class $AppStateCopyWith<$Res> {
$AppStateCopyWith(AppState _, $Res Function(AppState) __);
}
/// Adds pattern-matching-related methods to [AppState].
extension AppStatePatterns on AppState {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _AppState value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _AppState() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _AppState value) $default,){
final _that = this;
switch (_that) {
case _AppState():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _AppState value)? $default,){
final _that = this;
switch (_that) {
case _AppState() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function()? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _AppState() when $default != null:
return $default();case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function() $default,) {final _that = this;
switch (_that) {
case _AppState():
return $default();case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function()? $default,) {final _that = this;
switch (_that) {
case _AppState() when $default != null:
return $default();case _:
return null;
}
}
}
/// @nodoc
class _AppState implements AppState {
const _AppState();
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppState);
}
@override
int get hashCode => runtimeType.hashCode;
@override
String toString() {
return 'AppState()';
}
}
// dart format on

View File

@@ -1,62 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'app.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
@ProviderFor(AppStates)
const appStatesProvider = AppStatesProvider._();
final class AppStatesProvider extends $NotifierProvider<AppStates, AppState> {
const AppStatesProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'appStatesProvider',
isAutoDispose: false,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$appStatesHash();
@$internal
@override
AppStates create() => AppStates();
/// {@macro riverpod.override_with_value}
Override overrideWithValue(AppState value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<AppState>(value),
);
}
}
String _$appStatesHash() => r'ef96f10f6fff0f3dd6d3128ebf070ad79cbc8bc9';
abstract class _$AppStates extends $Notifier<AppState> {
AppState build();
@$mustCallSuper
@override
void runBuild() {
final created = build();
final ref = this.ref as $Ref<AppState, AppState>;
final element =
ref.element
as $ClassProviderElement<
AnyNotifier<AppState, AppState>,
AppState,
Object?,
Object?
>;
element.handleValue(ref, created);
}
}

View File

@@ -1,7 +1,7 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_riverpod/misc.dart'; import 'package:flutter_riverpod/misc.dart';
import 'package:server_box/data/provider/app.dart';
import 'package:server_box/data/provider/private_key.dart'; import 'package:server_box/data/provider/private_key.dart';
import 'package:server_box/data/provider/server/all.dart'; import 'package:server_box/data/provider/server/all.dart';
import 'package:server_box/data/provider/sftp.dart'; import 'package:server_box/data/provider/sftp.dart';

View File

@@ -33,43 +33,6 @@ final class _IntroPage extends StatelessWidget {
SizedBox(height: padTop), SizedBox(height: padTop),
IntroPage.title(text: libL10n.init, big: true), IntroPage.title(text: libL10n.init, big: true),
SizedBox(height: padTop), SizedBox(height: padTop),
// Prompt to set backup password after migration or on first launch
ListTile(
leading: const Icon(Icons.lock),
title: Text(l10n.backupPassword),
subtitle: Text(l10n.backupPasswordTip, style: UIs.textGrey),
trailing: const Icon(Icons.keyboard_arrow_right),
onTap: () async {
final currentPwd = await SecureStoreProps.bakPwd.read();
final controller = TextEditingController(text: currentPwd ?? '');
final result = await ctx.showRoundDialog<bool>(
title: l10n.backupPassword,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(l10n.backupPasswordTip, style: UIs.textGrey),
UIs.height13,
Input(
label: l10n.backupPassword,
controller: controller,
obscureText: true,
onSubmitted: (_) => ctx.pop(true),
),
],
),
actions: Btnx.oks,
);
if (result == true) {
final pwd = controller.text.trim();
if (pwd.isEmpty) {
ctx.showSnackBar(libL10n.empty);
return;
}
await SecureStoreProps.bakPwd.write(pwd);
ctx.showSnackBar(l10n.backupPasswordSet);
}
},
).cardx,
ListTile( ListTile(
leading: const Icon(IonIcons.language), leading: const Icon(IonIcons.language),
title: Text(libL10n.language), title: Text(libL10n.language),

View File

@@ -7,6 +7,8 @@ import 'package:server_box/data/res/store.dart';
class ConnectionStatsPage extends StatefulWidget { class ConnectionStatsPage extends StatefulWidget {
const ConnectionStatsPage({super.key}); const ConnectionStatsPage({super.key});
static const route = AppRouteNoArg(page: ConnectionStatsPage.new, path: '/server/conn_stats');
@override @override
State<ConnectionStatsPage> createState() => _ConnectionStatsPageState(); State<ConnectionStatsPage> createState() => _ConnectionStatsPageState();
} }

View File

@@ -21,6 +21,7 @@ import 'package:server_box/data/provider/server/all.dart';
import 'package:server_box/data/provider/server/single.dart'; import 'package:server_box/data/provider/server/single.dart';
import 'package:server_box/data/res/build_data.dart'; import 'package:server_box/data/res/build_data.dart';
import 'package:server_box/data/res/store.dart'; import 'package:server_box/data/res/store.dart';
import 'package:server_box/view/page/server/connection_stats.dart';
import 'package:server_box/view/page/server/detail/view.dart'; import 'package:server_box/view/page/server/detail/view.dart';
import 'package:server_box/view/page/server/edit/edit.dart'; import 'package:server_box/view/page/server/edit/edit.dart';
import 'package:server_box/view/page/setting/entry.dart'; import 'package:server_box/view/page/setting/entry.dart';

View File

@@ -42,9 +42,9 @@ final class _TopBar extends ConsumerWidget implements PreferredSizeWidget {
} }
final total = order.length; final total = order.length;
final connectionText = '$connected/$total ${context.l10n.conn}'; final connectionText = '$connected/$total ${context.l10n.conn}';
leading = Text( leading = InkWell(
connectionText, onTap: () => ConnectionStatsPage.route.go(context),
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600), child: Text(connectionText, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600)),
); );
} }

View File

@@ -89,9 +89,8 @@ extension _App on _AppSettingsPageState {
return ListTile( return ListTile(
leading: const Icon(Icons.colorize), leading: const Icon(Icons.colorize),
title: Text(libL10n.primaryColorSeed), title: Text(libL10n.primaryColorSeed),
trailing: _setting.colorSeed.listenable().listenVal((val) { trailing: _setting.colorSeed.listenable().listenVal((_) {
final c = Color(val); return ClipOval(child: Container(color: UIs.primaryColor, height: 27, width: 27));
return ClipOval(child: Container(color: c, height: 27, width: 27));
}), }),
onTap: () async { onTap: () async {
final ctrl = TextEditingController(text: UIs.primaryColor.toHex); final ctrl = TextEditingController(text: UIs.primaryColor.toHex);
@@ -137,7 +136,6 @@ extension _App on _AppSettingsPageState {
UIs.colorSeed = color; UIs.colorSeed = color;
_setting.colorSeed.put(color.value255); _setting.colorSeed.put(color.value255);
context.pop(); context.pop();
Future.delayed(Durations.medium1, RNodes.app.notify);
} }
Widget _buildMaxRetry() { Widget _buildMaxRetry() {

View File

@@ -46,11 +46,7 @@ extension _Server on _AppSettingsPageState {
subtitle: Text(l10n.connectionStatsDesc), subtitle: Text(l10n.connectionStatsDesc),
trailing: const Icon(Icons.keyboard_arrow_right), trailing: const Icon(Icons.keyboard_arrow_right),
onTap: () { onTap: () {
Navigator.of(context).push( ConnectionStatsPage.route.go(context);
MaterialPageRoute(
builder: (context) => const ConnectionStatsPage(),
),
);
}, },
); );
} }

View File

@@ -505,8 +505,8 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: "v1.0.351" ref: "v1.0.355"
resolved-ref: "98d480eb0128805b5b3361bcfb07c3b46b9f1391" resolved-ref: "73d5f2603859a9f70459d798ed2d267b1d9a86e5"
url: "https://github.com/lppcg/fl_lib" url: "https://github.com/lppcg/fl_lib"
source: git source: git
version: "0.0.1" version: "0.0.1"
@@ -648,6 +648,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.2" version: "3.1.2"
flutter_staggered_grid_view:
dependency: transitive
description:
name: flutter_staggered_grid_view
sha256: "19e7abb550c96fbfeb546b23f3ff356ee7c59a019a651f8f102a4ba9b7349395"
url: "https://pub.dev"
source: hosted
version: "0.7.0"
flutter_svg: flutter_svg:
dependency: transitive dependency: transitive
description: description:

View File

@@ -19,17 +19,19 @@ dependencies:
easy_isolate: ^1.3.0 easy_isolate: ^1.3.0
extended_image: ^10.0.0 extended_image: ^10.0.0
file_picker: ^10.1.9 file_picker: ^10.1.9
flutter_gbk2utf8: ^1.0.1
flutter_riverpod: ^3.0.1 flutter_riverpod: ^3.0.1
flutter_highlight: ^0.7.0 flutter_highlight: ^0.7.0
flutter_displaymode: ^0.7.0 flutter_displaymode: ^0.7.0
fl_chart: ^1.0.0 fl_chart: ^1.0.0
freezed_annotation: ^3.0.0 freezed_annotation: ^3.0.0
get_it: ^8.2.0
highlight: ^0.7.0 highlight: ^0.7.0
hive_ce_flutter: ^2.3.1 hive_ce_flutter: ^2.3.1
intl: ^0.20.2 intl: ^0.20.2
json_annotation: ^4.9.0 json_annotation: ^4.9.0
responsive_framework: ^1.5.1
re_editor: ^0.8.0 re_editor: ^0.8.0
responsive_framework: ^1.5.1
riverpod_annotation: ^3.0.1 riverpod_annotation: ^3.0.1
shared_preferences: ^2.1.1 shared_preferences: ^2.1.1
wakelock_plus: ^1.2.4 wakelock_plus: ^1.2.4
@@ -63,9 +65,7 @@ dependencies:
fl_lib: fl_lib:
git: git:
url: https://github.com/lppcg/fl_lib url: https://github.com/lppcg/fl_lib
ref: v1.0.351 ref: v1.0.355
flutter_gbk2utf8: ^1.0.1
get_it: ^8.2.0
dependency_overrides: dependency_overrides:
# webdav_client_plus: # webdav_client_plus: