From b167287c5bf50531857f3efa7fa10553c578d8c7 Mon Sep 17 00:00:00 2001 From: lollipopkit <10864310+lollipopkit@users.noreply.github.com> Date: Fri, 7 Jun 2024 23:53:13 +0800 Subject: [PATCH] opt.: ssh tab page's tab bar --- ios/Runner.xcodeproj/project.pbxproj | 36 +++++------ lib/data/res/build_data.dart | 4 +- lib/view/page/ssh/tab.dart | 89 +++++++++++++++++--------- macos/Runner.xcodeproj/project.pbxproj | 12 ++-- 4 files changed, 86 insertions(+), 55 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 4babe7f1..e9602bcb 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -690,7 +690,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -700,7 +700,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -826,7 +826,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -836,7 +836,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -854,7 +854,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_BITCODE = NO; INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist"; @@ -864,7 +864,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -885,7 +885,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -898,7 +898,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; @@ -924,7 +924,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -937,7 +937,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -960,7 +960,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_TEAM = BA88US33G6; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -973,7 +973,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -996,7 +996,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1008,7 +1008,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; @@ -1037,7 +1037,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1049,7 +1049,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; @@ -1075,7 +1075,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = BA88US33G6; ENABLE_PREVIEWS = YES; @@ -1087,7 +1087,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd; PRODUCT_NAME = ServerBox; diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index e57fb6d0..5098c95b 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,9 +2,9 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 938; + static const int build = 940; static const String engine = "3.22.1"; - static const String buildAt = "2024-06-07 21:09:41"; + static const String buildAt = "2024-06-07 21:51:18"; static const int modifications = 2; static const int script = 48; } diff --git a/lib/view/page/ssh/tab.dart b/lib/view/page/ssh/tab.dart index fcbecac6..f4612363 100644 --- a/lib/view/page/ssh/tab.dart +++ b/lib/view/page/ssh/tab.dart @@ -141,11 +141,12 @@ class _SSHTabPageState extends State void _onTapInitCard(ServerPrivateInfo spi) async { final name = () { final reg = RegExp(r'\((\d+)\)'); - final idxs = _tabMap.keys.map((e) => reg.firstMatch(e)).toList(); - final biggest = idxs + final idxs = _tabMap.keys + .map((e) => reg.firstMatch(e)) .map((e) => e?.group(1)) - .where((e) => e != null) - .reduce((a, b) => a!.length > b!.length ? a : b); + .where((e) => e != null); + if (idxs.isEmpty) return spi.name; + final biggest = idxs.reduce((a, b) => a!.length > b!.length ? a : b); final biggestInt = int.tryParse(biggest ?? '0'); if (biggestInt != null && biggestInt > 0) { return '${spi.name}(${biggestInt + 1})'; @@ -203,11 +204,18 @@ final class _TabBar extends StatelessWidget implements PreferredSizeWidget { return ListenBuilder( listenable: idxVN, builder: () { - return ListView.builder( + return ListView.separated( scrollDirection: Axis.horizontal, padding: const EdgeInsets.symmetric(horizontal: 11, vertical: 5), itemCount: names.length, itemBuilder: (_, idx) => _buillItem(idx), + separatorBuilder: (_, __) => Padding( + padding: const EdgeInsets.symmetric(vertical: 17), + child: Container( + color: const Color.fromARGB(61, 158, 158, 158), + width: 3, + ), + ), ); }, ); @@ -215,32 +223,55 @@ final class _TabBar extends StatelessWidget implements PreferredSizeWidget { Widget _buillItem(int idx) { final name = names[idx]; + final selected = idxVN.value == idx; + final color = + selected ? const Color.fromARGB(240, 255, 255, 255) : Colors.grey; + + final Widget child; + if (idx == 0) { + child = Padding( + padding: const EdgeInsets.symmetric(horizontal: 13), + child: Icon(Icons.add, size: 17, color: color), + ); + } else { + final text = Text( + name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle(color: color), + softWrap: false, + textAlign: TextAlign.center, + textWidthBasis: TextWidthBasis.parent, + ); + child = AnimatedContainer( + width: selected ? 90 : 50, + duration: Durations.medium3, + curve: Curves.fastEaseInToSlowEaseOut, + child: switch (selected) { + true => Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox(width: 55, child: text), + if (selected) + FadeIn( + child: IconBtn( + icon: Icons.close, + color: color, + onTap: () => onClose(name), + ), + ), + ], + ), + false => Center(child: text), + }, + ).paddingOnly(left: 3, right: 3); + } + return InkWell( borderRadius: BorderRadius.circular(13), onTap: () => onTap(idx), - child: SizedBox( - width: idx == 0 ? 80 : 130, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - idx == 0 - // Use [IconBtn] for same size - ? IconBtn(icon: Icons.add, onTap: () {}) - : IconBtn( - icon: Icons.close, - onTap: () => onClose(name), - ), - SizedBox( - width: idx == 0 ? 35 : 85, - child: Text(name), - ), - (idxVN.value == idx && idx != 0) - ? FadeIn(child: UIs.dot()) - : const SizedBox(width: 7), - ], - ), - ).paddingOnly(left: 3, right: 17), - ).paddingSymmetric(horizontal: 3); + child: child, + ).paddingSymmetric(horizontal: 13); } } diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index ab73f7ad..cc7d88c6 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -471,7 +471,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -481,7 +481,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -608,7 +608,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_TEAM = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = "Server Box"; @@ -618,7 +618,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -638,7 +638,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 938; + CURRENT_PROJECT_VERSION = 940; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=macosx*]" = BA88US33G6; INFOPLIST_FILE = Runner/Info.plist; @@ -649,7 +649,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.15; - MARKETING_VERSION = 1.0.938; + MARKETING_VERSION = 1.0.940; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_NAME = "Server Box"; PROVISIONING_PROFILE_SPECIFIER = "";