NSWindow file drop and etc

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

ここまでのバックアップ。