diff --git a/Yattee.xcodeproj/project.pbxproj b/Yattee.xcodeproj/project.pbxproj index d5052013..f3d39f4d 100644 --- a/Yattee.xcodeproj/project.pbxproj +++ b/Yattee.xcodeproj/project.pbxproj @@ -699,6 +699,240 @@ }; name = Release; }; + 376D70452F996E0700255B09 /* Release-DeveloperID */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 78Z5H3M6RJ; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = "Release-DeveloperID"; + }; + 376D70462F996E0700255B09 /* Release-DeveloperID */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = Yattee2; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + AUTOMATION_APPLE_EVENTS = NO; + CODE_SIGN_ENTITLEMENTS = Yattee/Yattee.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 259; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = 78Z5H3M6RJ; + ENABLE_APP_SANDBOX = YES; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_INCOMING_NETWORK_CONNECTIONS = YES; + ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES; + ENABLE_PREVIEWS = YES; + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = YES; + ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO; + ENABLE_RESOURCE_ACCESS_CALENDARS = NO; + ENABLE_RESOURCE_ACCESS_CAMERA = NO; + ENABLE_RESOURCE_ACCESS_CONTACTS = NO; + ENABLE_RESOURCE_ACCESS_LOCATION = NO; + ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO; + ENABLE_RESOURCE_ACCESS_PRINTING = NO; + ENABLE_RESOURCE_ACCESS_USB = NO; + ENABLE_USER_SELECTED_FILES = readonly; + GCC_PREPROCESSOR_DEFINITIONS = ( + "GLES_SILENCE_DEPRECATION=1", + "GL_SILENCE_DEPRECATION=1", + ); + GENERATE_INFOPLIST_FILE = YES; + HEADER_SEARCH_PATHS = ( + "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Libsmbclient.framework/Headers/samba-4.0", + "$(BUILT_PRODUCTS_DIR)/Libsmbclient.framework/Headers/samba-4.0", + ); + INFOPLIST_FILE = Yattee/Info.plist; + "INFOPLIST_FILE[sdk=appletvos*]" = "Yattee/Info-tvOS.plist"; + "INFOPLIST_FILE[sdk=appletvsimulator*]" = "Yattee/Info-tvOS.plist"; + INFOPLIST_KEY_CFBundleDisplayName = Yattee; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.video"; + INFOPLIST_KEY_NSLocalNetworkUsageDescription = "Yattee uses local network to discover and control playback on other Yattee devices."; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = 2.0.0; + PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO; + RUNTIME_EXCEPTION_ALLOW_JIT = NO; + RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = YES; + RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO; + RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO; + RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "SPARKLE $(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = nonisolated; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/Yattee/Yattee-Bridging-Header.h"; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3"; + TVOS_DEPLOYMENT_TARGET = 18.0; + XROS_DEPLOYMENT_TARGET = 26.1; + }; + name = "Release-DeveloperID"; + }; + 376D70472F996E0700255B09 /* Release-DeveloperID */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 259; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = 78Z5H3M6RJ; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + MACOSX_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app.YatteeTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Yattee.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Yattee"; + TVOS_DEPLOYMENT_TARGET = 18.0; + XROS_DEPLOYMENT_TARGET = 26.1; + }; + name = "Release-DeveloperID"; + }; + 376D70482F996E0700255B09 /* Release-DeveloperID */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = YatteeShareExtension/YatteeShareExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 259; + DEVELOPMENT_TEAM = 78Z5H3M6RJ; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = YatteeShareExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Yattee Share Extension"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 18; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 2.0.0; + PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app.ShareExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = "Release-DeveloperID"; + }; + 376D70492F996E0700255B09 /* Release-DeveloperID */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = YatteeTopShelf/YatteeTopShelf.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 259; + DEVELOPMENT_TEAM = 78Z5H3M6RJ; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = YatteeTopShelf/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Yattee Top Shelf"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_ENTRY_POINT = _NSExtensionMain; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 2.0.0; + PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app.TopShelf; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = nonisolated; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 18.0; + VALIDATE_PRODUCT = YES; + }; + name = "Release-DeveloperID"; + }; 37BA19B72EE4EB7F001D7B0F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -897,6 +1131,7 @@ buildConfigurations = ( 372D1A302EDB163900F58F7A /* Debug */, 372D1A312EDB163900F58F7A /* Release */, + 376D70452F996E0700255B09 /* Release-DeveloperID */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -906,6 +1141,7 @@ buildConfigurations = ( 372D1A332EDB163900F58F7A /* Debug */, 372D1A342EDB163900F58F7A /* Release */, + 376D70462F996E0700255B09 /* Release-DeveloperID */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -915,6 +1151,7 @@ buildConfigurations = ( 37BA19B72EE4EB7F001D7B0F /* Debug */, 37BA19B82EE4EB7F001D7B0F /* Release */, + 376D70482F996E0700255B09 /* Release-DeveloperID */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -924,6 +1161,7 @@ buildConfigurations = ( 37C0AAAA00000000AAAA000A /* Debug */, 37C0AAAA00000000AAAA000B /* Release */, + 376D70492F996E0700255B09 /* Release-DeveloperID */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -933,6 +1171,7 @@ buildConfigurations = ( 37D0B29B2EDB23BD00B9C4ED /* Debug */, 37D0B29C2EDB23BD00B9C4ED /* Release */, + 376D70472F996E0700255B09 /* Release-DeveloperID */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Yattee/Views/Settings/SettingsView.swift b/Yattee/Views/Settings/SettingsView.swift index 3dc14434..c3a9b50a 100644 --- a/Yattee/Views/Settings/SettingsView.swift +++ b/Yattee/Views/Settings/SettingsView.swift @@ -20,7 +20,7 @@ struct SettingsView: View { var body: some View { #if os(macOS) macOSSettings - .frame(minWidth: 600, minHeight: 400) + .frame(minWidth: 600, minHeight: 520) #elseif os(tvOS) tvOSSettings #else @@ -33,11 +33,16 @@ struct SettingsView: View { #if os(macOS) private var macOSSettings: some View { NavigationSplitView { - List(SettingsSection.allCases, selection: $selectedSection) { section in - Label(section.title, systemImage: section.icon) - .tag(section) + VStack(spacing: 0) { + List(SettingsSection.allCases, selection: $selectedSection) { section in + Label(section.title, systemImage: section.icon) + .tag(section) + } + .listStyle(.sidebar) + + Divider() + macOSSidebarFooter } - .listStyle(.sidebar) .navigationSplitViewColumnWidth(min: 180, ideal: 200) } detail: { if appEnvironment != nil { @@ -75,6 +80,27 @@ struct SettingsView: View { } } } + + private var macOSSidebarFooter: some View { + VStack(spacing: 6) { + Image("AppIconPreview") + .resizable() + .scaledToFit() + .frame(width: 48, height: 48) + .clipShape(RoundedRectangle(cornerRadius: 10)) + + Text(verbatim: "Yattee") + .font(.callout) + .fontWeight(.semibold) + + Text("\(appVersion) (\(buildNumber))") + .font(.caption) + .foregroundStyle(.secondary) + } + .frame(maxWidth: .infinity) + .padding(.vertical, 12) + .allowsHitTesting(false) + } #endif // MARK: - tvOS Settings diff --git a/Yattee/YatteeApp.swift b/Yattee/YatteeApp.swift index eb5bb373..bee3bcac 100644 --- a/Yattee/YatteeApp.swift +++ b/Yattee/YatteeApp.swift @@ -302,7 +302,7 @@ struct YatteeApp: App { Window(String(localized: "menu.app.settings"), id: "settings") { SettingsView(showCloseButton: false) .appEnvironment(appEnvironment) - .frame(minWidth: 600, idealWidth: 900, maxWidth: .infinity, minHeight: 400, idealHeight: 600, maxHeight: .infinity) + .frame(minWidth: 600, idealWidth: 900, maxWidth: .infinity, minHeight: 520, idealHeight: 600, maxHeight: .infinity) } .windowResizability(.contentMinSize) .defaultSize(width: 900, height: 600)