From 9c8f9c3b9f76f00aa9b7efee0a107ea798d31b17 Mon Sep 17 00:00:00 2001 From: lollipopkit Date: Mon, 9 Jan 2023 13:46:02 +0800 Subject: [PATCH] auto paste in `private key` page --- lib/app.dart | 39 +++++++------------------ lib/core/extension/colorx.dart | 16 ++++++++++ lib/data/model/sftp/browser_status.dart | 1 - lib/data/provider/docker.dart | 4 ++- lib/view/page/private_key/edit.dart | 10 ++++++- 5 files changed, 39 insertions(+), 31 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index e5a39f2b..1e123f2d 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:toolbox/core/extension/colorx.dart'; import 'package:toolbox/core/utils.dart'; import 'package:toolbox/data/res/build_data.dart'; import 'package:toolbox/data/store/setting.dart'; @@ -7,25 +8,9 @@ import 'package:toolbox/generated/l10n.dart'; import 'package:toolbox/locator.dart'; import 'package:toolbox/view/page/home.dart'; -const Set interactiveStates = { - MaterialState.pressed, - MaterialState.hovered, - MaterialState.focused, - MaterialState.selected -}; - class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); - MaterialStateProperty getMaterialStateColor(Color primaryColor) { - return MaterialStateProperty.resolveWith((states) { - if (states.any(interactiveStates.contains)) { - return primaryColor; - } - return null; - }); - } - @override Widget build(BuildContext context) { setTransparentNavigationBar(context); @@ -34,11 +19,13 @@ class MyApp extends StatelessWidget { builder: (_, value, __) { final primaryColor = Color(value); final textStyle = TextStyle(color: primaryColor); + final materialColor = primaryColor.materialStateColor; + final materialColorAlpha = + primaryColor.withOpacity(0.7).materialStateColor; return MaterialApp( localizationsDelegates: const [ S.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, + ...GlobalMaterialLocalizations.delegates, ], supportedLocales: S.delegate.supportedLocales, title: BuildData.name, @@ -50,10 +37,8 @@ class MyApp extends StatelessWidget { iconTheme: IconThemeData(color: primaryColor), primaryIconTheme: IconThemeData(color: primaryColor), switchTheme: SwitchThemeData( - thumbColor: getMaterialStateColor(primaryColor), - trackColor: getMaterialStateColor( - primaryColor.withOpacity(0.7), - ), + thumbColor: materialColor, + trackColor: materialColorAlpha, ), buttonTheme: ButtonThemeData(splashColor: primaryColor), inputDecorationTheme: InputDecorationTheme( @@ -63,7 +48,7 @@ class MyApp extends StatelessWidget { ), ), radioTheme: RadioThemeData( - fillColor: getMaterialStateColor(primaryColor), + fillColor: materialColor, ), ), darkTheme: ThemeData.dark().copyWith( @@ -73,10 +58,8 @@ class MyApp extends StatelessWidget { iconTheme: IconThemeData(color: primaryColor), primaryIconTheme: IconThemeData(color: primaryColor), switchTheme: SwitchThemeData( - thumbColor: getMaterialStateColor(primaryColor), - trackColor: getMaterialStateColor( - primaryColor.withOpacity(0.7), - ), + thumbColor: materialColor, + trackColor: materialColorAlpha, ), buttonTheme: ButtonThemeData(splashColor: primaryColor), inputDecorationTheme: InputDecorationTheme( @@ -86,7 +69,7 @@ class MyApp extends StatelessWidget { ), ), radioTheme: RadioThemeData( - fillColor: getMaterialStateColor(primaryColor), + fillColor: materialColor, ), ), home: MyHomePage(primaryColor: primaryColor), diff --git a/lib/core/extension/colorx.dart b/lib/core/extension/colorx.dart index 844ac175..8dc0e151 100644 --- a/lib/core/extension/colorx.dart +++ b/lib/core/extension/colorx.dart @@ -1,5 +1,12 @@ import 'package:flutter/material.dart'; +const Set interactiveStates = { + MaterialState.pressed, + MaterialState.hovered, + MaterialState.focused, + MaterialState.selected +}; + extension ColorX on Color { bool get isBrightColor { return getBrightnessFromColor == Brightness.light; @@ -8,4 +15,13 @@ extension ColorX on Color { Brightness get getBrightnessFromColor { return ThemeData.estimateBrightnessForColor(this); } + + MaterialStateProperty get materialStateColor { + return MaterialStateProperty.resolveWith((states) { + if (states.any(interactiveStates.contains)) { + return this; + } + return null; + }); + } } diff --git a/lib/data/model/sftp/browser_status.dart b/lib/data/model/sftp/browser_status.dart index 325e44a8..ae7d9818 100644 --- a/lib/data/model/sftp/browser_status.dart +++ b/lib/data/model/sftp/browser_status.dart @@ -1,5 +1,4 @@ import 'package:dartssh2/dartssh2.dart'; -import 'package:toolbox/data/model/server/server_private_info.dart'; import 'package:toolbox/data/model/sftp/absolute_path.dart'; class SftpBrowserStatus { diff --git a/lib/data/provider/docker.dart b/lib/data/provider/docker.dart index e539c5d0..753515fb 100644 --- a/lib/data/provider/docker.dart +++ b/lib/data/provider/docker.dart @@ -23,6 +23,8 @@ const _dockerPS = 'docker ps -a'; final _logger = Logger('DockerProvider'); class DockerProvider extends BusyProvider { + final dockerStore = locator(); + SSHClient? client; String? userName; List? items; @@ -156,7 +158,7 @@ class DockerProvider extends BusyProvider { // judge whether to use DOCKER_HOST / sudo String _wrap(String cmd) { - final dockerHost = locator().getDockerHost(hostId!); + final dockerHost = dockerStore.getDockerHost(hostId!); if (dockerHost == null || dockerHost.isEmpty) { return 'sudo $cmd'.withLangExport; } diff --git a/lib/view/page/private_key/edit.dart b/lib/view/page/private_key/edit.dart index 597a3799..21909a84 100644 --- a/lib/view/page/private_key/edit.dart +++ b/lib/view/page/private_key/edit.dart @@ -2,6 +2,7 @@ import 'package:after_layout/after_layout.dart'; import 'package:dartssh2/dartssh2.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:toolbox/core/utils.dart'; import 'package:toolbox/data/model/server/private_key_info.dart'; import 'package:toolbox/data/provider/private_key.dart'; @@ -10,6 +11,8 @@ import 'package:toolbox/generated/l10n.dart'; import 'package:toolbox/locator.dart'; import 'package:toolbox/view/widget/input_decoration.dart'; +const _format = 'text/plain'; + class PrivateKeyEditPage extends StatefulWidget { const PrivateKeyEditPage({Key? key, this.info}) : super(key: key); @@ -143,11 +146,16 @@ class _PrivateKeyEditPageState extends State } @override - void afterFirstLayout(BuildContext context) { + Future afterFirstLayout(BuildContext context) async { if (widget.info != null) { _nameController.text = widget.info!.id; _keyController.text = widget.info!.privateKey; _pwdController.text = widget.info!.password; + } else { + final clipdata = ((await Clipboard.getData(_format))?.text ?? '').trim(); + if (clipdata.startsWith('-----BEGIN') && clipdata.endsWith('-----')) { + _keyController.text = clipdata; + } } } }