From 615f15883258efa179a66367b4e59260f4a17c21 Mon Sep 17 00:00:00 2001 From: hensm Date: Tue, 9 Jul 2019 16:04:11 +0100 Subject: [PATCH] Add file media type to receiver selectors --- .../AppDelegate.swift | 10 +-- .../ViewController.swift | 84 +++++++++++++++---- .../models/InitData.swift | 1 + .../models/MediaType.swift | 1 + .../models/ReceiverSelection.swift | 1 + ext/src/_locales/en/messages.json | 4 + .../NativeMacReceiverSelector.ts | 1 + .../receiver_selectors/ReceiverSelector.ts | 2 + ext/src/shim/cast/classes/ApiConfig.ts | 3 +- ext/src/ui/popup/index.tsx | 63 +++++++++++++- 10 files changed, 141 insertions(+), 29 deletions(-) diff --git a/app/NativeMacReceiverSelector/AppDelegate.swift b/app/NativeMacReceiverSelector/AppDelegate.swift index 1458c88..aa2e50c 100644 --- a/app/NativeMacReceiverSelector/AppDelegate.swift +++ b/app/NativeMacReceiverSelector/AppDelegate.swift @@ -8,15 +8,9 @@ class AppDelegate : NSObject, NSApplicationDelegate { func applicationDidFinishLaunching (_ aNotification: Notification) { - let window = NSPanel( + let window = NSWindow( contentRect: NSZeroRect - , styleMask: [ - .titled - , .closable - , .hudWindow - , .utilityWindow - , .nonactivatingPanel - ] + , styleMask: [ .titled, .closable ] , backing: .buffered , defer: false) diff --git a/app/NativeMacReceiverSelector/ViewController.swift b/app/NativeMacReceiverSelector/ViewController.swift index 413848d..a09dd30 100644 --- a/app/NativeMacReceiverSelector/ViewController.swift +++ b/app/NativeMacReceiverSelector/ViewController.swift @@ -7,13 +7,15 @@ class ViewController : NSViewController { var mediaTypePopUpButton: NSPopUpButton! var receiverViews = [ReceiverView]() + var filePath: String? + override func loadView () { - let visualEffectView = NSVisualEffectView() + /*let visualEffectView = NSVisualEffectView() visualEffectView.blendingMode = .behindWindow - visualEffectView.state = .active + visualEffectView.state = .active*/ - self.view = visualEffectView + self.view = NSView() } override func viewDidLoad () { @@ -71,34 +73,35 @@ class ViewController : NSViewController { initData.i18n_mediaTypeApp , initData.i18n_mediaTypeTab , initData.i18n_mediaTypeScreen + , initData.i18n_mediaTypeFile ]) + let mediaTypePopUpButtonMenu = self.mediaTypePopUpButton.menu! + mediaTypePopUpButtonMenu.delegate = self + let appItem = self.mediaTypePopUpButton .item(withTitle: initData.i18n_mediaTypeApp)! let tabItem = self.mediaTypePopUpButton .item(withTitle: initData.i18n_mediaTypeTab)! let screenItem = self.mediaTypePopUpButton .item(withTitle: initData.i18n_mediaTypeScreen)! + let fileItem = self.mediaTypePopUpButton + .item(withTitle: initData.i18n_mediaTypeFile)! + + mediaTypePopUpButtonMenu + .insertItem(NSMenuItem.separator() + , at: mediaTypePopUpButtonMenu.index(of: fileItem)) // Set tags to enum value appItem.tag = MediaType.app.rawValue tabItem.tag = MediaType.tab.rawValue screenItem.tag = MediaType.screen.rawValue + fileItem.tag = MediaType.file.rawValue - if (initData.availableMediaTypes & appItem.tag) == 0 { - self.mediaTypePopUpButton - .item(withTitle: initData.i18n_mediaTypeApp)? - .isEnabled = false - } - if (initData.availableMediaTypes & tabItem.tag) == 0 { - self.mediaTypePopUpButton - .item(withTitle: initData.i18n_mediaTypeTab)? - .isEnabled = false - } - if (initData.availableMediaTypes & screenItem.tag) == 0 { - self.mediaTypePopUpButton - .item(withTitle: initData.i18n_mediaTypeScreen)? - .isEnabled = false + for item in self.mediaTypePopUpButton.itemArray { + if (initData.availableMediaTypes & item.tag) == 0 { + item.isEnabled = false + } } self.mediaTypePopUpButton.selectItem( @@ -155,6 +158,50 @@ class ViewController : NSViewController { } } +extension ViewController : NSMenuDelegate { + func menuDidClose (_ menu: NSMenu) { + let mediaType = MediaType( + rawValue: self.mediaTypePopUpButton.selectedItem!.tag)! + + let fileItem = self.mediaTypePopUpButton + .item(at: self.mediaTypePopUpButton.indexOfItem( + withTag: MediaType.file.rawValue))! + + if (mediaType == .file) { + let panel = NSOpenPanel() + panel.allowsMultipleSelection = false + panel.allowedFileTypes = [ "aac", "mp3", "mp4", "wav", "webm" ] + panel.canChooseDirectories = false + panel.canCreateDirectories = false + panel.canChooseFiles = true + + panel.beginSheetModal(for: self.view.window!) { (result) in + if (result == .OK) { + let url = panel.urls[0] + let fileName = url.lastPathComponent + + // Truncate file name and set as title + fileItem.title = fileName.count > 12 + ? "\(fileName.prefix(12))..." + : fileName + + self.filePath = url.path + + return + } else { + // Re-select the default media type item + self.mediaTypePopUpButton.selectItem( + withTag: self.initData.defaultMediaType.rawValue) + } + } + } + + + // Reset file item + fileItem.title = self.initData.i18n_mediaTypeFile + self.filePath = nil + } +} extension ViewController : ReceiverViewDelegate { func didCast (_ receiver: Receiver) { @@ -173,7 +220,8 @@ extension ViewController : ReceiverViewDelegate { let selection = ReceiverSelection( receiver: receiver - , mediaType: mediaType) + , mediaType: mediaType + , filePath: self.filePath ?? nil) let jsonData = try JSONEncoder().encode(selection) let jsonString = String(data: jsonData, encoding: .utf8) diff --git a/app/NativeMacReceiverSelector/models/InitData.swift b/app/NativeMacReceiverSelector/models/InitData.swift index a7f7b18..647aad7 100644 --- a/app/NativeMacReceiverSelector/models/InitData.swift +++ b/app/NativeMacReceiverSelector/models/InitData.swift @@ -8,6 +8,7 @@ struct InitData : Codable { let i18n_mediaTypeApp: String let i18n_mediaTypeTab: String let i18n_mediaTypeScreen: String + let i18n_mediaTypeFile: String let i18n_mediaSelectCastLabel: String let i18n_mediaSelectToLabel: String } diff --git a/app/NativeMacReceiverSelector/models/MediaType.swift b/app/NativeMacReceiverSelector/models/MediaType.swift index 38df504..7e1f569 100644 --- a/app/NativeMacReceiverSelector/models/MediaType.swift +++ b/app/NativeMacReceiverSelector/models/MediaType.swift @@ -5,4 +5,5 @@ enum MediaType: Int, Codable { case app = 1 case tab = 2 case screen = 4 + case file = 8 } diff --git a/app/NativeMacReceiverSelector/models/ReceiverSelection.swift b/app/NativeMacReceiverSelector/models/ReceiverSelection.swift index 3881fab..79341bf 100644 --- a/app/NativeMacReceiverSelector/models/ReceiverSelection.swift +++ b/app/NativeMacReceiverSelector/models/ReceiverSelection.swift @@ -1,4 +1,5 @@ struct ReceiverSelection : Codable { let receiver: Receiver let mediaType: MediaType + let filePath: String? } diff --git a/ext/src/_locales/en/messages.json b/ext/src/_locales/en/messages.json index 1f982b6..cf04c63 100755 --- a/ext/src/_locales/en/messages.json +++ b/ext/src/_locales/en/messages.json @@ -21,6 +21,10 @@ "message": "Screen" , "description": "Receiver selector media type