JXA で後回しにし続けていた画像サムネイル表示をそろそろ作りたい。
NSCollectionView – AppKit | Apple Developer Documentation
どうやらコレを使えばイケるらしい。
色々遠回りしたけど上手くいったコードをいきなり。
#!/usr/bin/env python3 import objc, os, re from AppKit import * PATH = '/Users/sasakima-nao/Pictures/nae' class ItemView(NSView): def init(self): objc.super(ItemView, self).init() self.image = None return self def drawRect_(self, rect): self.image.drawInRect_(rect) class CollectionViewItem(NSCollectionViewItem): def init(self): objc.super(CollectionViewItem, self).init() self.setView_(ItemView.alloc().initWithFrame_(NSMakeRect(0, 0, 100, 100))) return self def setRepresentedObject_(self, rep): objc.super(CollectionViewItem, self).setRepresentedObject_(rep) if rep != None: self.view().image = rep['pic'] class ComipoliCollectionView(NSCollectionView): def init(self): objc.super(ComipoliCollectionView, self).init() a = [] l = os.listdir(PATH) for s in l: if re.search(r'\.(jpg|png)$', s, re.I): f = '{0}/{1}'.format(PATH, s) image = NSImage.alloc().initWithContentsOfFile_(f) a.append({'pic': image}) self.setItemPrototype_(CollectionViewItem.new()) self.setContent_(a) return self class ComipoliWindow(NSWindow): def init(self): frame = NSMakeRect(100, 400, 400, 300) objc.super(ComipoliWindow, self).initWithContentRect_styleMask_backing_defer_( frame, NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask, NSBackingStoreBuffered, False) self.setTitle_('thumbnail') self.setDelegate_(self) # view self.canvas = ComipoliCollectionView.new() self.canvas.setFrameSize_(frame.size) self.contentView().addSubview_(self.canvas) return self def windowDidResize_(self, sender): aw = self.contentView().frame().size.width ah = self.contentView().frame().size.height size = NSMakeSize(aw, ah) self.canvas.setFrameSize_(size) class ComipoliMenu(NSMenu): def init(self): objc.super(ComipoliMenu, self).init() item_app = NSMenuItem.new() self.addItem_(item_app) menu_app = NSMenu.new() item_app.setSubmenu_(menu_app) item_quit = NSMenuItem.new() item_quit.initWithTitle_action_keyEquivalent_('Quit', 'terminate:', 'q') menu_app.addItem_(item_quit) return self NSApplication.sharedApplication() window = ComipoliWindow.new() window.makeKeyAndOrderFront_(window) NSApp.setMainMenu_(ComipoliMenu.new()) NSApp.activateIgnoringOtherApps_(True) NSApp.run()
NSCollectionView, NSCollectionViewItem, NSView が最小限必要。
表示したい NSImage は適当なキーで辞書にいれて配列に突っ込む。
辞書毎に setRepresentedObject_ が呼ばれるので取り出す。
他にも手段があるようだけど、一つの方法として。
後選択可能にしたりとかもやらないと。
画像や PDF のリサイズやバックグラウンド処理をやらないと。
苗ちゃんの画像が古いのは実はもうやっていないからだとか。