NSWindow へのファイルドロップを検索する。
NSFilenamesPboardType 指定ばかりだけどもう Deprecated だ。
てか、JXA 版から変換コピペしたらエラーになった。
Dragging Files
NSURLPboardType を現行は指定するようだ。
def windowDidExitFullScreen_(self, sender):
self.toolbar.setVisible_(True)
self.is_fullscreen = False
def wantsPeriodicDraggingUpdates_(self, sender):
return True
def performDragOperation_(self, sender):
pb = sender.draggingPasteboard()
if pb.types().containsObject_(NSURLPboardType):
url = NSURL.URLFromPasteboard_(pb)
self.set_path(url.path())
return True
def draggingEntered_(self, sender):
return NSDragOperationCopy
です。
そんなことより。
今日はクソ寒い中バルキアのレイドに二回挑戦してどっちも逃げられてしまった!
いやそれは本当にどうでもよくて。
前回 NSPDFImageRep でいくとか書いたけど。
この方法では左右ページが同じページになってしまうと後で気が付いた。
同じ NSPDFImageRep を左ページ用にセットした後で描写するのだから当然だった。
CGAffineTransformMake という Matrix を自分で作成する関数を見つけた。
結局 Matrix で描写するはめに、勉強しておいてよかった。
def drawRect_(self, rect):
NSColor.blackColor().set()
NSRectFill(rect)
NSColor.whiteColor().set()
if self.first_page != None:
if self.is_pdf:
ctx = NSGraphicsContext.currentContext().CGContext()
r = CGPDFPageGetBoxRect(self.first_page, kCGPDFMediaBox)
if r.size.width - r.size.height > 0 or not self.spread:
CGContextSaveGState(ctx)
if rect.size.width * r.size.height > rect.size.height * r.size.width:
n = rect.size.height / r.size.height
matrix = CGAffineTransformMake(n, 0, 0, n, rect.size.width / 2 - r.size.width * n / 2, 0)
else:
n = rect.size.width / r.size.width
matrix = CGAffineTransformMake(n, 0, 0, n, n, rect.size.height / 2 - r.size.height / 2)
CGContextConcatCTM(ctx, matrix)
NSColor.whiteColor().set()
CGContextFillRect(ctx, r)
CGContextClipToRect(ctx, r)
CGContextDrawPDFPage(ctx, self.first_page)
CGContextRestoreGState(ctx)
見開きは省略。
NSUserDefaults でウインドウサイズを記憶させるのだが。
Toolbar をヘッダーバーにしているせいか縦位置と高さがズレる。
plist を見ながら補正値を入れた、こんなんでいいのだろうか。
def windowWillClose_(self, sender):
defaults = NSUserDefaults.alloc().initWithSuiteName_('com.sasakima.comipoli')
defaults.setFloat_forKey_(self.contentView().frame().size.width, 'width')
defaults.setFloat_forKey_(self.contentView().frame().size.height - 22, 'height')
defaults.setFloat_forKey_(self.frame().origin.x, 'x')
defaults.setFloat_forKey_(self.frame().origin.y + 38, 'y')
defaults.setBool_forKey_(self.canvas.l_to_r, 'LtoR')
defaults.synchronize()
強引な。
数値順(自然順とも)ソートの他に Finder は大文字小文字の区別をしない。
以下をそのまま使ったらいい感じ。
sorting Pythonには、自然言語の文字列のための関数が組み込まれていますか? – CODE Q&A 問題解決
左右ページ切り替えを comipoli オリジナルと同様に。
PyObjC 版はメニューを丸ごと入れ替えることにしてみた。
def onLRButtonClicked_(self, button):
if self.canvas.l_to_r:
self.canvas.l_to_r = False
self.toolbar.lr_button.setTitle_('L<-R')
menu = NSApp.mainMenu().itemAtIndex_(2).submenu()
menu.itemAtIndex_(0).setKeyEquivalent_(NSLeftArrowFunctionKey)
menu.itemAtIndex_(1).setKeyEquivalent_(NSLeftArrowFunctionKey)
menu.itemAtIndex_(2).setKeyEquivalent_(NSRightArrowFunctionKey)
menu.itemAtIndex_(3).setKeyEquivalent_(NSRightArrowFunctionKey)
menu.itemAtIndex_(5).setKeyEquivalent_(NSRightArrowFunctionKey)
menu.itemAtIndex_(6).setKeyEquivalent_(NSLeftArrowFunctionKey)
else:
self.canvas.l_to_r = True
self.toolbar.lr_button.setTitle_('L->R')
menu = NSApp.mainMenu().itemAtIndex_(2).submenu()
menu.itemAtIndex_(0).setKeyEquivalent_(NSRightArrowFunctionKey)
menu.itemAtIndex_(1).setKeyEquivalent_(NSRightArrowFunctionKey)
menu.itemAtIndex_(2).setKeyEquivalent_(NSLeftArrowFunctionKey)
menu.itemAtIndex_(3).setKeyEquivalent_(NSLeftArrowFunctionKey)
menu.itemAtIndex_(5).setKeyEquivalent_(NSLeftArrowFunctionKey)
menu.itemAtIndex_(6).setKeyEquivalent_(NSRightArrowFunctionKey)
if len(self.archive) != 0:
self.canvas.display()
アホだ。
えっと、後何かあったかな?
連休が終わったのでここからは遅いかも。
comipoli_pyobjc_2.tar.gz
ここまでのバックアップ。