macOSのスクリーンショットの保存場所を変更するメニュバーエクストラ
Révision | f3720b49643be2df50cf748311f82f08949fe8c4 (tree) |
---|---|
l'heure | 2017-04-23 09:59:12 |
Auteur | masakih <masakih@user...> |
Commiter | masakih |
LimitedArray<FolderItem>をシリアライズできるようにした
@@ -13,6 +13,7 @@ | ||
13 | 13 | F40EB6CA1EA1D7B500FEE444 /* ImageType.plist in Resources */ = {isa = PBXBuildFile; fileRef = F40EB6C91EA1D7B500FEE444 /* ImageType.plist */; }; |
14 | 14 | F40EB6D01EA26BEC00FEE444 /* ActionListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = F40EB6CF1EA26BEC00FEE444 /* ActionListener.swift */; }; |
15 | 15 | F40EB6D21EA2F28100FEE444 /* Screenshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = F40EB6D11EA2F28100FEE444 /* Screenshot.swift */; }; |
16 | + F414DD051EAC12D500111DA7 /* FolderItemSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F414DD041EAC12D500111DA7 /* FolderItemSerializer.swift */; }; | |
16 | 17 | F463F6D91EAA3B8F00FAB2E3 /* LimitedArraySerializerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = F463F6D81EAA3B8F00FAB2E3 /* LimitedArraySerializerTest.swift */; }; |
17 | 18 | F463F6DB1EAA3C9700FAB2E3 /* LimitedArraySerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F463F6DA1EAA3C9700FAB2E3 /* LimitedArraySerializer.swift */; }; |
18 | 19 | F47B06EB1E9A5DF9006711D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47B06EA1E9A5DF9006711D9 /* AppDelegate.swift */; }; |
@@ -47,6 +48,7 @@ | ||
47 | 48 | F40EB6C91EA1D7B500FEE444 /* ImageType.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ImageType.plist; sourceTree = "<group>"; }; |
48 | 49 | F40EB6CF1EA26BEC00FEE444 /* ActionListener.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionListener.swift; sourceTree = "<group>"; }; |
49 | 50 | F40EB6D11EA2F28100FEE444 /* Screenshot.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Screenshot.swift; sourceTree = "<group>"; }; |
51 | + F414DD041EAC12D500111DA7 /* FolderItemSerializer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FolderItemSerializer.swift; sourceTree = "<group>"; }; | |
50 | 52 | F463F6D81EAA3B8F00FAB2E3 /* LimitedArraySerializerTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LimitedArraySerializerTest.swift; sourceTree = "<group>"; }; |
51 | 53 | F463F6DA1EAA3C9700FAB2E3 /* LimitedArraySerializer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LimitedArraySerializer.swift; sourceTree = "<group>"; }; |
52 | 54 | F47B06E71E9A5DF9006711D9 /* GoInto.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GoInto.app; sourceTree = BUILT_PRODUCTS_DIR; }; |
@@ -117,6 +119,7 @@ | ||
117 | 119 | F40EB6CF1EA26BEC00FEE444 /* ActionListener.swift */, |
118 | 120 | F4D346931EA644170031AFB3 /* LimitedArray.swift */, |
119 | 121 | F463F6DA1EAA3C9700FAB2E3 /* LimitedArraySerializer.swift */, |
122 | + F414DD041EAC12D500111DA7 /* FolderItemSerializer.swift */, | |
120 | 123 | F47B06EE1E9A5DF9006711D9 /* Assets.xcassets */, |
121 | 124 | F47B06F31E9A5DF9006711D9 /* Info.plist */, |
122 | 125 | F40EB6C91EA1D7B500FEE444 /* ImageType.plist */, |
@@ -255,6 +258,7 @@ | ||
255 | 258 | F463F6DB1EAA3C9700FAB2E3 /* LimitedArraySerializer.swift in Sources */, |
256 | 259 | F4D346941EA644170031AFB3 /* LimitedArray.swift in Sources */, |
257 | 260 | F47B07121EA10A3E006711D9 /* ChooseFolderItem.swift in Sources */, |
261 | + F414DD051EAC12D500111DA7 /* FolderItemSerializer.swift in Sources */, | |
258 | 262 | ); |
259 | 263 | runOnlyForDeploymentPostprocessing = 0; |
260 | 264 | }; |
@@ -18,7 +18,7 @@ extension Selector { | ||
18 | 18 | static let changeFolder = #selector(ActionListener.changeFolder(_:)) |
19 | 19 | } |
20 | 20 | |
21 | -class FolderItem: StatusItem { | |
21 | +final class FolderItem: StatusItem { | |
22 | 22 | let url: URL |
23 | 23 | let menuItem = NSMenuItem() |
24 | 24 | let listener = ActionListener() |
@@ -0,0 +1,38 @@ | ||
1 | +// | |
2 | +// FolderItemSerializer.swift | |
3 | +// GoInto | |
4 | +// | |
5 | +// Created by Hori,Masaki on 2017/04/23. | |
6 | +// Copyright © 2017年 Hori,Masaki. All rights reserved. | |
7 | +// | |
8 | + | |
9 | +import Foundation | |
10 | + | |
11 | +final class FolderItemSerializer: NSObject, NSCoding { | |
12 | + fileprivate let url: URL | |
13 | + var folderItem: FolderItem { return FolderItem(url) } | |
14 | + | |
15 | + init(_ url: URL) { | |
16 | + self.url = url | |
17 | + } | |
18 | + | |
19 | + private struct CodingKey { | |
20 | + static let url = "FolderItemWrapper.url" | |
21 | + } | |
22 | + | |
23 | + init?(coder aDecoder: NSCoder) { | |
24 | + guard let url = aDecoder.decodeObject(forKey: CodingKey.url) as? URL | |
25 | + else { return nil } | |
26 | + self.url = url | |
27 | + } | |
28 | + func encode(with aCoder: NSCoder) { | |
29 | + aCoder.encode(url, forKey: CodingKey.url) | |
30 | + } | |
31 | +} | |
32 | +extension FolderItemSerializer: Serializer { | |
33 | + var original: SerializerProvider? { return FolderItem(url) } | |
34 | +} | |
35 | + | |
36 | +extension FolderItem: SerializerProvider { | |
37 | + var serializer: Serializer { return FolderItemSerializer(url) } | |
38 | +} |
@@ -8,6 +8,13 @@ | ||
8 | 8 | |
9 | 9 | import Foundation |
10 | 10 | |
11 | +protocol SerializerProvider { | |
12 | + var serializer: Serializer { get } | |
13 | +} | |
14 | +protocol Serializer { | |
15 | + var original: SerializerProvider? { get } | |
16 | +} | |
17 | + | |
11 | 18 | private struct LimitedArrayWrapperCodingKey { |
12 | 19 | static let array = "LimitedArrayWrapperCodingKey.Array" |
13 | 20 | static let size = "LimitedArrayWrapperCodingKey.Size" |
@@ -22,13 +29,24 @@ private class LimitedArrayWrapper<Element: Equatable>: NSObject, NSCoding { | ||
22 | 29 | size = limited.size |
23 | 30 | } |
24 | 31 | required init?(coder aDecoder: NSCoder) { |
25 | - guard let array = aDecoder.decodeObject(forKey: LimitedArrayWrapperCodingKey.array) as? [Element] | |
26 | - else { return nil } | |
27 | - self.array = array | |
32 | + let array = aDecoder.decodeObject(forKey: LimitedArrayWrapperCodingKey.array) | |
33 | + switch array { | |
34 | + case let elements as [Element]: | |
35 | + self.array = elements | |
36 | + case let serialized as [Serializer]: | |
37 | + self.array = serialized.flatMap { $0.original as? Element } | |
38 | + default: | |
39 | + return nil | |
40 | + } | |
28 | 41 | size = aDecoder.decodeInteger(forKey: LimitedArrayWrapperCodingKey.size) |
29 | 42 | } |
30 | 43 | func encode(with aCoder: NSCoder) { |
31 | - aCoder.encode(array, forKey: LimitedArrayWrapperCodingKey.array) | |
44 | + if let serializable = array as? [SerializerProvider] { | |
45 | + let storeArray = serializable.map { $0.serializer } | |
46 | + aCoder.encode(storeArray, forKey: LimitedArrayWrapperCodingKey.array) | |
47 | + } else { | |
48 | + aCoder.encode(array, forKey: LimitedArrayWrapperCodingKey.array) | |
49 | + } | |
32 | 50 | aCoder.encode(size, forKey: LimitedArrayWrapperCodingKey.size) |
33 | 51 | } |
34 | 52 | } |
@@ -13,7 +13,7 @@ import XCTest | ||
13 | 13 | |
14 | 14 | class LimitedArraySerializerTest: XCTestCase { |
15 | 15 | |
16 | - func testExample() { | |
16 | + func testInt() { | |
17 | 17 | var limited = LimitedArray<Int>(3) |
18 | 18 | limited.append(1) |
19 | 19 | limited.append(2) |
@@ -40,6 +40,19 @@ class LimitedArraySerializerTest: XCTestCase { | ||
40 | 40 | XCTAssertEqual(object.array, limited.array) |
41 | 41 | XCTAssertEqual(object.size, limited.size) |
42 | 42 | } |
43 | + func testFolderItem() { | |
44 | + var limited = LimitedArray<FolderItem>(3) | |
45 | + limited.append(FolderItem(URL(fileURLWithPath: "/System/"))) | |
46 | + limited.append(FolderItem(URL(fileURLWithPath: "/Users/"))) | |
47 | + limited.append(FolderItem(URL(fileURLWithPath: "/var/"))) | |
48 | + | |
49 | + let data = LimitedArraySerializer.seirialize(limited) | |
50 | + XCTAssertNotNil(data) | |
51 | + let object: LimitedArray<FolderItem> = LimitedArraySerializer.deserialize(data) ?? LimitedArray<FolderItem>(3) | |
52 | + | |
53 | + XCTAssertEqual(object.array, limited.array) | |
54 | + XCTAssertEqual(object.size, limited.size) | |
55 | + } | |
43 | 56 | |
44 | 57 | func testSize() { |
45 | 58 | var limited = LimitedArray<URL>(5) |
@@ -54,5 +67,4 @@ class LimitedArraySerializerTest: XCTestCase { | ||
54 | 67 | XCTAssertEqual(object.array, limited.array) |
55 | 68 | XCTAssertEqual(object.size, limited.size) |
56 | 69 | } |
57 | - | |
58 | 70 | } |