From 2d76fb1b5c5bf02f37888bc26df5f804a37312e1 Mon Sep 17 00:00:00 2001 From: wanghongenpin Date: Mon, 18 Aug 2025 19:14:09 +0800 Subject: [PATCH] windows toolbar --- android/app/build.gradle | 4 +- assets/icon_foreground.png | Bin 0 -> 4790 bytes lib/main.dart | 2 +- lib/network/channel/channel.dart | 6 +- lib/network/channel/network.dart | 2 +- .../model/search_model.dart | 0 .../search_condition.dart | 3 +- lib/ui/desktop/desktop.dart | 14 ++- lib/ui/desktop/request/domians.dart | 5 +- lib/ui/desktop/request/list.dart | 2 +- lib/ui/desktop/request/request_sequence.dart | 3 +- lib/ui/desktop/request/search.dart | 5 +- lib/ui/desktop/toolbar/toolbar.dart | 70 ++++++-------- lib/ui/desktop/widgets/windows_toolbar.dart | 91 ++++++++++++++++++ lib/ui/mobile/request/list.dart | 3 +- lib/ui/mobile/request/request_sequence.dart | 3 +- lib/ui/mobile/request/search.dart | 5 +- lib/ui/toolbox/toolbox.dart | 6 +- pubspec.yaml | 1 + 19 files changed, 159 insertions(+), 66 deletions(-) create mode 100644 assets/icon_foreground.png rename lib/ui/{desktop/request => component}/model/search_model.dart (100%) rename lib/ui/{desktop/request => component}/search_condition.dart (99%) create mode 100644 lib/ui/desktop/widgets/windows_toolbar.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index dff8580..eca5950 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -51,7 +51,7 @@ android { applicationId "com.network.proxy" ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64' } // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion 21 + minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion multiDexEnabled true versionCode flutterVersionCode.toInteger() @@ -88,4 +88,4 @@ flutter { } dependencies { -} \ No newline at end of file +} diff --git a/assets/icon_foreground.png b/assets/icon_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..12c14871b35d6f5fdcc9a99e47512a117d546e4b GIT binary patch literal 4790 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 literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index cc714f8..ef0c256 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -64,7 +64,7 @@ void main(List args) async { minimumSize: const Size(1000, 600), size: windowSize, center: true, - titleBarStyle: Platform.isMacOS ? TitleBarStyle.hidden : TitleBarStyle.normal); + titleBarStyle: TitleBarStyle.hidden ); Offset? windowPosition = appConfiguration.windowPosition; diff --git a/lib/network/channel/channel.dart b/lib/network/channel/channel.dart index e00ef33..091983c 100644 --- a/lib/network/channel/channel.dart +++ b/lib/network/channel/channel.dart @@ -170,9 +170,9 @@ class Channel { await Future.delayed(const Duration(milliseconds: 150)); } isOpen = false; - if (!isWriting) { - await _socket.flush(); - } + // if (!isWriting) { + // await _socket.flush(); + // } await _socket.close(); _socket.destroy(); } diff --git a/lib/network/channel/network.dart b/lib/network/channel/network.dart index 2531324..7888c69 100644 --- a/lib/network/channel/network.dart +++ b/lib/network/channel/network.dart @@ -208,7 +208,7 @@ class Server extends Network { Channel? remoteChannel = channelContext.serverChannel; - if (HostFilter.filter(hostAndPort.host) || !configuration.enableSsl) { + if (!isHttp || HostFilter.filter(hostAndPort.host) || !configuration.enableSsl) { remoteChannel = remoteChannel ?? await channelContext.connectServerChannel(hostAndPort, RelayHandler(channel)); relay(channel, remoteChannel); channel.dispatcher.channelRead(channelContext, channel, data); diff --git a/lib/ui/desktop/request/model/search_model.dart b/lib/ui/component/model/search_model.dart similarity index 100% rename from lib/ui/desktop/request/model/search_model.dart rename to lib/ui/component/model/search_model.dart diff --git a/lib/ui/desktop/request/search_condition.dart b/lib/ui/component/search_condition.dart similarity index 99% rename from lib/ui/desktop/request/search_condition.dart rename to lib/ui/component/search_condition.dart index 2fec892..bfbafaa 100644 --- a/lib/ui/desktop/request/search_condition.dart +++ b/lib/ui/component/search_condition.dart @@ -19,9 +19,10 @@ import 'package:get/get.dart'; import 'package:proxypin/l10n/app_localizations.dart'; import 'package:proxypin/network/http/content_type.dart'; import 'package:proxypin/network/http/http.dart'; -import 'package:proxypin/ui/desktop/request/model/search_model.dart'; import 'package:proxypin/utils/lang.dart'; +import 'model/search_model.dart'; + /// @author wanghongen /// 2023/8/6 class SearchConditions extends StatefulWidget { diff --git a/lib/ui/desktop/desktop.dart b/lib/ui/desktop/desktop.dart index 25f7d6d..dd1d2e6 100644 --- a/lib/ui/desktop/desktop.dart +++ b/lib/ui/desktop/desktop.dart @@ -14,6 +14,8 @@ * limitations under the License. */ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:proxypin/l10n/app_localizations.dart'; import 'package:proxypin/network/bin/configuration.dart'; @@ -32,6 +34,7 @@ import 'package:proxypin/ui/desktop/left_menus/history.dart'; import 'package:proxypin/ui/desktop/left_menus/navigation.dart'; import 'package:proxypin/ui/desktop/request/list.dart'; import 'package:proxypin/ui/desktop/toolbar/toolbar.dart'; +import 'package:proxypin/ui/desktop/widgets/windows_toolbar.dart'; import 'package:proxypin/utils/listenable_list.dart'; import '../app_update/app_update_repository.dart'; @@ -111,9 +114,16 @@ class _DesktopHomePagePageState extends State implements EventL return Scaffold( appBar: Tab( child: Container( + padding: EdgeInsets.only(bottom: 2.5), + margin: EdgeInsets.only(bottom: 2.5), decoration: BoxDecoration( - border: Border(bottom: BorderSide(color: Theme.of(context).dividerColor.withOpacity(0.25), width: 0.2))), - child: Toolbar(proxyServer, requestListStateKey, sideNotifier: _selectIndex), + color: Theme.of(context).brightness == Brightness.dark ? null : Color(0xFFF9F9F9), + border: Border( + bottom: BorderSide( + color: Theme.of(context).dividerColor.withOpacity(0.3), width: Platform.isMacOS ? 0.2 : 0.55))), + child: Platform.isMacOS + ? Toolbar(proxyServer, requestListStateKey) + : WindowsToolbar(title: Toolbar(proxyServer, requestListStateKey)), )), body: Row( children: [ diff --git a/lib/ui/desktop/request/domians.dart b/lib/ui/desktop/request/domians.dart index 8e4532c..f771eaa 100644 --- a/lib/ui/desktop/request/domians.dart +++ b/lib/ui/desktop/request/domians.dart @@ -33,11 +33,12 @@ import 'package:proxypin/network/http/http_client.dart'; import 'package:proxypin/ui/component/transition.dart'; import 'package:proxypin/ui/component/utils.dart'; import 'package:proxypin/ui/content/panel.dart'; -import 'package:proxypin/ui/desktop/request/model/search_model.dart'; import 'package:proxypin/ui/desktop/request/request.dart'; import 'package:proxypin/utils/keyword_highlight.dart'; import 'package:proxypin/utils/listenable_list.dart'; +import '../../component/model/search_model.dart'; + /// 左侧域名 /// @author wanghongen /// 2023/10/8 @@ -78,7 +79,7 @@ class DomainWidgetState extends State with AutomaticKeepAliveClientM bool sortDesc = true; - changeState() { + void changeState() { if (!changing) { changing = true; Future.delayed(const Duration(milliseconds: 500), () { diff --git a/lib/ui/desktop/request/list.dart b/lib/ui/desktop/request/list.dart index a751711..a33e027 100644 --- a/lib/ui/desktop/request/list.dart +++ b/lib/ui/desktop/request/list.dart @@ -27,13 +27,13 @@ import 'package:proxypin/network/http/http.dart'; import 'package:proxypin/network/http/http_client.dart'; import 'package:proxypin/ui/component/widgets.dart'; import 'package:proxypin/ui/content/panel.dart'; -import 'package:proxypin/ui/desktop/request/model/search_model.dart'; import 'package:proxypin/ui/desktop/request/request_sequence.dart'; import 'package:proxypin/ui/desktop/request/search.dart'; import 'package:proxypin/utils/har.dart'; import 'package:proxypin/utils/lang.dart'; import 'package:proxypin/utils/listenable_list.dart'; +import '../../component/model/search_model.dart'; import 'domians.dart'; /// @author wanghongen diff --git a/lib/ui/desktop/request/request_sequence.dart b/lib/ui/desktop/request/request_sequence.dart index 356cd05..62cfa1f 100644 --- a/lib/ui/desktop/request/request_sequence.dart +++ b/lib/ui/desktop/request/request_sequence.dart @@ -21,11 +21,12 @@ import 'package:proxypin/network/bin/configuration.dart'; import 'package:proxypin/network/bin/server.dart'; import 'package:proxypin/network/http/http.dart'; import 'package:proxypin/ui/component/utils.dart'; -import 'package:proxypin/ui/desktop/request/model/search_model.dart'; import 'package:proxypin/ui/desktop/request/request.dart'; import 'package:proxypin/utils/keyword_highlight.dart'; import 'package:proxypin/utils/listenable_list.dart'; +import '../../component/model/search_model.dart'; + ///请求序列 列表 /// @author wanghongen class RequestSequence extends StatefulWidget { diff --git a/lib/ui/desktop/request/search.dart b/lib/ui/desktop/request/search.dart index fcedde4..5c44da9 100644 --- a/lib/ui/desktop/request/search.dart +++ b/lib/ui/desktop/request/search.dart @@ -16,8 +16,9 @@ import 'package:flutter/material.dart'; import 'package:proxypin/l10n/app_localizations.dart'; import 'package:proxypin/network/http/content_type.dart'; -import 'package:proxypin/ui/desktop/request/model/search_model.dart'; -import 'package:proxypin/ui/desktop/request/search_condition.dart'; +import 'package:proxypin/ui/component/search_condition.dart'; + +import '../../component/model/search_model.dart'; /// @author wanghongen /// 2023/10/8 diff --git a/lib/ui/desktop/toolbar/toolbar.dart b/lib/ui/desktop/toolbar/toolbar.dart index f118623..0201967 100644 --- a/lib/ui/desktop/toolbar/toolbar.dart +++ b/lib/ui/desktop/toolbar/toolbar.dart @@ -33,9 +33,8 @@ import '../request/list.dart'; class Toolbar extends StatefulWidget { final ProxyServer proxyServer; final GlobalKey requestListStateKey; - final ValueNotifier sideNotifier; - const Toolbar(this.proxyServer, this.requestListStateKey, {super.key, required this.sideNotifier}); + const Toolbar(this.proxyServer, this.requestListStateKey, {super.key}); @override State createState() { @@ -53,7 +52,6 @@ class _ToolbarState extends State { } bool onKeyEvent(KeyEvent event) { - if (HardwareKeyboard.instance.isLogicalKeyPressed(LogicalKeyboardKey.escape)) { if (ModalRoute.of(context)?.isCurrent == false) { Navigator.maybePop(context); @@ -82,48 +80,34 @@ class _ToolbarState extends State { @override Widget build(BuildContext context) { - return Row( - children: [ - Padding(padding: EdgeInsets.only(left: Platform.isMacOS ? 80 : 30)), - SocketLaunch(proxyServer: widget.proxyServer, startup: widget.proxyServer.configuration.startup), - const Padding(padding: EdgeInsets.only(left: 18)), - IconButton( - tooltip: localizations.clear, - icon: const Icon(Icons.cleaning_services_outlined, size: 21), - onPressed: () { - widget.requestListStateKey.currentState?.clean(); - }), - const Padding(padding: EdgeInsets.only(left: 18)), - SslWidget(proxyServer: widget.proxyServer), // SSL配置 - const Padding(padding: EdgeInsets.only(left: 18)), - Setting(proxyServer: widget.proxyServer), // 设置 - const Padding(padding: EdgeInsets.only(left: 18)), - IconButton( - tooltip: localizations.mobileConnect, - icon: const Icon(Icons.phone_iphone, size: 21), - onPressed: () async { - final ips = await localIps(readCache: false); - phoneConnect(ips, widget.proxyServer.port); - }), - const Expanded(child: SizedBox()), //自动扩展挤压 - ValueListenableBuilder( - valueListenable: widget.sideNotifier, - builder: (_, sideIndex, __) => IconButton( - icon: Icon(Icons.space_dashboard, size: 20, color: sideIndex >= 0 ? Colors.blueGrey : Colors.grey), - onPressed: () { - if (widget.sideNotifier.value >= 0) { - widget.sideNotifier.value = -1; - } else { - widget.sideNotifier.value = 0; - } - }, - )), //右对齐 - const Padding(padding: EdgeInsets.only(left: 30)), - ], - ); + return Row(children: [ + Padding(padding: EdgeInsets.only(left: Platform.isMacOS ? 80 : 20)), + SocketLaunch(proxyServer: widget.proxyServer, startup: widget.proxyServer.configuration.startup), + const Padding(padding: EdgeInsets.only(left: 18)), + IconButton( + tooltip: localizations.clear, + icon: const Icon(Icons.cleaning_services_outlined, size: 21), + onPressed: () { + widget.requestListStateKey.currentState?.clean(); + }), + const Padding(padding: EdgeInsets.only(left: 18)), + SslWidget(proxyServer: widget.proxyServer), // SSL配置 + const Padding(padding: EdgeInsets.only(left: 18)), + Setting(proxyServer: widget.proxyServer), // 设置 + const Padding(padding: EdgeInsets.only(left: 18)), + IconButton( + tooltip: localizations.mobileConnect, + icon: const Icon(Icons.phone_iphone, size: 21), + onPressed: () async { + final ips = await localIps(readCache: false); + phoneConnect(ips, widget.proxyServer.port); + }), + + const Padding(padding: EdgeInsets.only(left: 30)), + ]); } - phoneConnect(List hosts, int port) { + void phoneConnect(List hosts, int port) { showDialog( context: context, builder: (context) { diff --git a/lib/ui/desktop/widgets/windows_toolbar.dart b/lib/ui/desktop/widgets/windows_toolbar.dart new file mode 100644 index 0000000..0ac65ba --- /dev/null +++ b/lib/ui/desktop/widgets/windows_toolbar.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.dart'; +import 'package:window_manager/window_manager.dart'; + +class WindowsToolbar extends StatefulWidget { + final Widget? title; + + const WindowsToolbar({ + super.key, + this.title, + }); + + @override + State createState() => _WindowsToolbarState(); +} + +class _WindowsToolbarState extends State with WindowListener { + @override + void initState() { + windowManager.addListener(this); + super.initState(); + } + + @override + void dispose() { + windowManager.removeListener(this); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Row( + children: [ + SizedBox(width: 7), + Padding( + padding: EdgeInsets.only(top: 2), + child: Center( + child: Image.asset( + 'assets/icon_foreground.png', + width: 32, + ))), + Expanded( + child: DragToMoveArea( + child: widget.title ?? Container(), + )), + WindowCaptionButton.minimize( + brightness: Theme.brightnessOf(context), + onPressed: () async { + bool isMinimized = await windowManager.isMinimized(); + if (isMinimized) { + windowManager.restore(); + } else { + windowManager.minimize(); + } + }), + FutureBuilder( + future: windowManager.isMaximized(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.data == true) { + return WindowCaptionButton.unmaximize( + brightness: Theme.brightnessOf(context), + onPressed: () { + windowManager.unmaximize(); + }, + ); + } + return WindowCaptionButton.maximize( + brightness: Theme.brightnessOf(context), + onPressed: () { + windowManager.maximize(); + }, + ); + }), + WindowCaptionButton.close( + brightness: Theme.brightnessOf(context), + onPressed: () { + windowManager.close(); + }), + ], + ); + } + + @override + void onWindowMaximize() { + setState(() {}); + } + + @override + void onWindowUnmaximize() { + setState(() {}); + } +} diff --git a/lib/ui/mobile/request/list.dart b/lib/ui/mobile/request/list.dart index ada3e4d..b3a4f7a 100644 --- a/lib/ui/mobile/request/list.dart +++ b/lib/ui/mobile/request/list.dart @@ -22,7 +22,6 @@ import 'package:proxypin/network/bin/server.dart'; import 'package:proxypin/network/channel/channel.dart'; import 'package:proxypin/network/channel/channel_context.dart'; import 'package:proxypin/network/http/http.dart'; -import 'package:proxypin/ui/desktop/request/model/search_model.dart'; import 'package:proxypin/ui/mobile/request/domians.dart'; import 'package:proxypin/ui/mobile/request/request_sequence.dart'; import 'package:proxypin/utils/har.dart'; @@ -30,6 +29,8 @@ import 'package:proxypin/utils/listenable_list.dart'; import 'package:proxypin/utils/platform.dart'; import 'package:share_plus/share_plus.dart'; +import '../../component/model/search_model.dart'; + /// 请求列表 /// @author wanghongen class RequestListWidget extends StatefulWidget { diff --git a/lib/ui/mobile/request/request_sequence.dart b/lib/ui/mobile/request/request_sequence.dart index 6ad97d0..d377efb 100644 --- a/lib/ui/mobile/request/request_sequence.dart +++ b/lib/ui/mobile/request/request_sequence.dart @@ -3,11 +3,12 @@ import 'dart:collection'; import 'package:flutter/material.dart'; import 'package:proxypin/network/bin/server.dart'; import 'package:proxypin/network/http/http.dart'; -import 'package:proxypin/ui/desktop/request/model/search_model.dart'; import 'package:proxypin/ui/mobile/request/request.dart'; import 'package:proxypin/utils/keyword_highlight.dart'; import 'package:proxypin/utils/listenable_list.dart'; +import '../../component/model/search_model.dart'; + ///请求序列 列表 ///@author wanghongen class RequestSequence extends StatefulWidget { diff --git a/lib/ui/mobile/request/search.dart b/lib/ui/mobile/request/search.dart index c4da396..d31b366 100644 --- a/lib/ui/mobile/request/search.dart +++ b/lib/ui/mobile/request/search.dart @@ -14,8 +14,9 @@ * limitations under the License. */ import 'package:flutter/material.dart'; -import 'package:proxypin/ui/desktop/request/model/search_model.dart'; -import 'package:proxypin/ui/desktop/request/search_condition.dart'; +import 'package:proxypin/ui/component/search_condition.dart'; + +import '../../component/model/search_model.dart'; class MobileSearch extends StatefulWidget { final Function(SearchModel searchModel)? onSearch; diff --git a/lib/ui/toolbox/toolbox.dart b/lib/ui/toolbox/toolbox.dart index 0499739..c6adb06 100644 --- a/lib/ui/toolbox/toolbox.dart +++ b/lib/ui/toolbox/toolbox.dart @@ -99,7 +99,7 @@ class _ToolboxState extends State { child: const Column( children: [Icon(Icons.format_bold_outlined), SizedBox(height: 3), Text('Base64')]), )), - const SizedBox(width: 15), + const SizedBox(width: 10), InkWell( onTap: () => encodeWindow(EncoderType.unicode, context), child: Container( @@ -107,7 +107,7 @@ class _ToolboxState extends State { child: const Column( children: [Icon(Icons.format_underline_outlined), SizedBox(height: 3), Text('Unicode')]), )), - const SizedBox(width: 15), + const SizedBox(width: 10), InkWell( onTap: () => encodeWindow(EncoderType.md5, context), child: Container( @@ -188,7 +188,7 @@ class _ToolboxState extends State { )); } - httpRequest() async { + Future httpRequest() async { if (Platforms.isMobile()) { Navigator.of(context) .push(MaterialPageRoute(builder: (context) => MobileRequestEditor(proxyServer: widget.proxyServer))); diff --git a/pubspec.yaml b/pubspec.yaml index a84b441..6865572 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -64,4 +64,5 @@ flutter: - assets/certs/ca.crt - assets/certs/ca_key.pem - assets/icon.png + - assets/icon_foreground.png - assets/js/ \ No newline at end of file