macOS

[Framework] 파인더 커스텀 FIFinderSync(1)

Daesiker 2021. 4. 29. 16:27
반응형

FIFinderSync

FIFinderSync는 macOS 프레임워크 중 사용자 정의 바로가기 메뉴 및 도구모음 버튼을 Finder에 추가한다. 이 클래스는 개발자가 액세스할 수 있는 API를 제공하지 않지만 프로토콜을 채택한다. 또한 폴더가 열리고 사용될 때를 탐지하여 감시할 수 있도록 설정하고 등록할 수 있다. 또한 해당 폴더안에 있는 파일안에 커스텀 컨텍스트 메뉴를 만들어서 사용할 수 있다. FIFinderSync는 NSObject를 상속한다.

 

기능

  • Sidebar Icon에 원하는 폴더 추가
  • 해당 폴더안에 있는 파일 및 폴더에 뱃지기능 추가
  • 해당 폴더안에 있는 파일 및 폴더에 원하는 context Menu 추가 가능
  • Finder Toolbar에 원하는 커스텀 버튼 추가

 

시작하기

  1. 원하는 xCode project에 target을 추가한다. (File → new → Target)

 

2. Finder Sync Extension을 추가한다.

 

 

3. 새로운 FinderSync 폴더가 생성이 되었는지 확인

 

 


FinderSync.swift

Import Framework

import Cocoa 
import FinderSync

macOS 관련 프레임워크와 Finder을 커스텀할 수 있는 FinderSync 프레임워크를 임포트 해준다.

 

Class 생성

class FinderSync: FIFinderSync { 	
	var myFolderURL = URL(fileURLWithPath: "/Users/ingervanboeijen/Playground")
    override init() { 		
    	super.init() 		
        FIFinderSyncController.default().directoryURLs = [self.myFolderURL] 	
	} 
}

새로운 클래스를 만든뒤 FIFinderSync 프로토콜을 채용한다. 그리고 클래스의 멤버로 URL을 선언하여 준다. URL 값에는 Finder을 커스텀하는 위치를 알려주는 역할이다. 필자는 /Users/ingervanboeijen/Playground 폴더만 커스텀을 할 수 있도록 만들었다. 그리고 FIFinderSyncController 함수를 통해 diretoryURLs이라는 값은 URL 타입으로 이루어진 배열인데 여기에 커스텀을 원하는 폴더의 경로를 입력하면 그 폴더 안에서만 실행할 수 있도록 도와준다.

 

폴더 및 파일 뱃지 생성

override init() {
	super.init()         
    NSLog("FinderSync() launched from %@", Bundle.main.bundlePath as NSString)
    // Set up the directory we are syncing.         
    FIFinderSyncController.default().directoryURLs = [self.myFolderURL]                  
    FIFinderSyncController.default().setBadgeImage(NSImage(named: NSImage.colorPanelName)!, label: "Status One", forBadgeIdentifier: "One")         
    FIFinderSyncController.default().setBadgeImage(NSImage(named: NSImage.cautionName)!, label: "Status Two", forBadgeIdentifier: "Two")                  
}

init() 함수 안에 setBadgeImage를 추가해주면 폴더 및 파일에 추가할 뱃지의 Image와 label, Identifier을 추가할 수 있다. 이때 이미지는 NSImage 타입으로 지정을 해주어야한다.

 

override func requestBadgeIdentifier(for url: URL) {
	let whichBadge = abs(url.path.hash) % 3         
    let badgeIdentifier = ["", "One", "Two"][whichBadge]         
    FIFinderSyncController.default().setBadgeIdentifier(badgeIdentifier, for: url)     
}

그 다음 클래스안에 requestBadgeIdentifier(for url: URL)함수를 추가시켜준다. 이 함수는 뱃지를 어떻게 설정할 것인지에 대해 명시하는 함수이다. 필자는 url.path의 해시값을 3으로 나눈 나머지를 통해 뱃지가 없는 파일, One이라는 ID를 가진 뱃지, Two라는 ID를 가진 뱃지를 추가시켰다. setBadgeIndentifier을 통해 설정이 가능하고 첫번째 파라미터에는 뱃지의 ID 2번째 파라미터는 해당 url을 추가시켜주면 된다.

 

결과값

해시값은 랜덤이라서 PC에 따라 다른 결과값이 나온다.

 

Custom ContextMenu 생성

override func menu(for menu: FIMenuKind) -> NSMenu? {
	let menu = NSMenu(title: "")         
    let item = NSMenuItem(title: "newCanvasFor".localized, action: #selector(FinderSync.newCanvas(_:)), keyEquivalent: "")         
    let url = URL(string: "file:///System/Applications/Preview.app")!         
    item.image = NSWorkspace.shared.icon(forFile: url.path)         
    menu.addItem(item)         
    return menu     
}

FinderSync가 적용된 폴더에서 파일을 우축클릭하면 생성되는 메뉴에 커스텀으로 내용을 추가할 수 있는 함수이다. NSMenu를 return하는 함수이므로 NSMenu를 생성한뒤 NSMenuItem을 추가해주면 Item에 대한 정보가 ContextMenu에 나오는 것을 확인할 수 있다. NSMenuItem에는 3가지의 파라미터가 존재하는데 title에는 해당 아이템의 타이틀을 String타입으로 나타내주고 action에는 실행할 함수를 keyEquivalent에는 단축키를 설정해 준다. 단축키를 설정하고 싶지 않으면 ""을 적어주면 된다.(nil x) item의 이미지도 NSImage를 통해 설정이 가능하다. item에 대한 설정을 다 끝낸 후에 addItem 함수를 통해 menu에 item을 추가해 주면 된다.

 

결과

해당 url에 있는 파일의 contextMenu에 Item이 추가된 것을 알 수 있다.

 

반응형

'macOS' 카테고리의 다른 글

[Framework] 파인더 커스텀 FIFinderSync(2)  (0) 2021.05.03
[iOS, macOS] PromiseKit  (0) 2021.03.23
[Swift] Protocol(1)  (0) 2021.03.16
[Swift] UserDefaults  (0) 2021.03.15
[iOS, macOS] Alamofire Framework(3)  (2) 2021.03.11