@@ -10,11 +10,12 @@ import CoreUtil
10
10
final class PDFGeneratorViewController : ToolPageViewController {
11
11
private let cell = PDFGeneratorView ( )
12
12
13
- @Observable var images = [ ImageItem] ( )
13
+ @RestorableData ( " pdf.input " ) var images = [ ImageItem] ( )
14
14
15
15
override func loadView( ) { self . view = cell }
16
16
17
17
override func viewDidLoad( ) {
18
+ print ( _images. fileURL)
18
19
self . $images
19
20
. sink { [ unowned self] in cell. imageListView. imageItems = $0 } . store ( in: & objectBag)
20
21
@@ -25,11 +26,35 @@ final class PDFGeneratorViewController: ToolPageViewController {
25
26
self . cell. imageListView. removePublisher
26
27
. sink { [ unowned self] in $0. reversed ( ) . forEach { self . images. remove ( at: $0) } } . store ( in: & objectBag)
27
28
self . cell. imageListView. movePublisher
28
- . sink { [ unowned self] in self . images . move ( fromIndex : $0 . from , toIndex : $0 . to ) } . store ( in: & objectBag)
29
+ . sink { [ unowned self] in self . moveItems ( $0 , to : $1 ) } . store ( in: & objectBag)
29
30
self . cell. clearButton. actionPublisher
30
31
. sink { [ unowned self] in self . images = [ ] } . store ( in: & objectBag)
31
32
}
32
33
34
+ private func moveItems( _ fromRows: [ Int ] , to row: Int ) {
35
+ guard !fromRows. isEmpty else { return }
36
+
37
+ let fromMin = fromRows. min ( ) !
38
+
39
+ let fromRows = fromRows. sorted ( ) . reversed ( )
40
+ var nextImages = self . images
41
+ var removed = [ ImageItem] ( )
42
+
43
+ for fromRow in fromRows {
44
+ let item = nextImages. remove ( at: fromRow)
45
+ removed. append ( item)
46
+ }
47
+
48
+ removed. reverse ( )
49
+
50
+ if row < fromMin {
51
+ nextImages. insert ( contentsOf: removed, at: row)
52
+ } else {
53
+ nextImages. insert ( contentsOf: removed, at: row - fromRows. count)
54
+ }
55
+ self . images = nextImages
56
+ }
57
+
33
58
private func readURLs( _ pasteboard: NSPasteboard ) {
34
59
var newImageItems = [ ImageItem] ( )
35
60
@@ -103,7 +128,7 @@ private enum ScaleMode: String, TextItem {
103
128
var title : String { rawValue }
104
129
}
105
130
106
- final private class PDFGeneratorView : ToolPage {
131
+ final private class PDFGeneratorView : Page {
107
132
let imageListView = ImageListView ( )
108
133
let clearButton = SectionButton ( title: " Clear " , image: R . Image. clear)
109
134
let generateButton = Button ( title: " Generate PDF " )
@@ -142,16 +167,22 @@ final private class PDFGeneratorView: ToolPage {
142
167
}
143
168
}
144
169
145
- struct ImageItem {
170
+ struct ImageItem : Codable {
146
171
let title : String
147
- let image : NSImage
172
+ var image : NSImage { imageContainer. image }
173
+ private let imageContainer : NSImageContainer
174
+
175
+ init ( title: String , image: NSImage ) {
176
+ self . title = title
177
+ self . imageContainer = . wrap( image)
178
+ }
148
179
}
149
180
150
181
final private class ImageListView : NSLoadScrollView {
151
182
let listView = NSTableView . list ( )
152
183
var imageItems = [ ImageItem] ( ) { didSet { listView. reloadData ( ) } }
153
184
var removePublisher = PassthroughSubject < [ Int ] , Never > ( )
154
- var movePublisher = PassthroughSubject < ( from: Int , to: Int ) , Never > ( )
185
+ var movePublisher = PassthroughSubject < ( from: [ Int ] , to: Int ) , Never > ( )
155
186
private let backgroundLayer = ControlBackgroundLayer . animationDisabled ( )
156
187
157
188
override func keyDown( with event: NSEvent ) {
@@ -254,7 +285,7 @@ extension ImageListView: NSTableViewDelegate, NSTableViewDataSource {
254
285
255
286
func tableView( _ tableView: NSTableView , acceptDrop info: NSDraggingInfo , row: Int , dropOperation: NSTableView . DropOperation ) -> Bool {
256
287
guard dropOperation == . above else { return false }
257
- guard let fromRow = info. draggingPasteboard. propertyList ( forType: . imageItem) as? Int else { return false }
288
+ guard let fromRow = info. draggingPasteboard. pasteboardItems ? . map { $0 . propertyList ( forType: . imageItem) } as? [ Int ] else { return false }
258
289
259
290
movePublisher. send ( ( fromRow, row) )
260
291
0 commit comments