GtkTreeView Scroll

何を今頃だが昨日旧 Blog の「ぱぇぽぃ」を削除した。
月単位で逆アクセスがまだ百を越えていたので意図的な放置だったんですが…
流石に三年前の「あの頃の私」が書いた記事は情報が古すぎると思ったもので。

なんたってバリバリな「 Windows 以外の OS なんて知らないよ!」なデルヒャァ屋だったし。
今になって考えればキャーリックスが大失敗に終わったのは当然過ぎて笑える結果。
mono で WindowsForm よりはマシだったがせめて GTK+ にすればよかったのに。

他にサイトの一部を整理したり、伴って外部リンクしていたコードの Blog 起こしとか。
さぼっていたわけじゃないんですけど Blog で書くようなネタが作れなかった。

ということで久々にコードを。

Y901x のリストが再生開始時に選択行が見えない場合がある。
ということでリストアップしたら表示配位内にスクロールさせようと考えた。

何故この時期に Y901x をやっているんだと言わないでくれい。
自分が作ったアプリの中ではやはり一番コイツを使うんだよということで。

Windows 版 Y901 ではやっていたんですけどね、Cinema は忘れた。
一つ上と一つ下を残すようにしないと次をクリックしにくいんで結構考える。
正直メンドイ、WPF ListView の ScrollIntoView メソッドみたいなのは無いかな?

Gtk::ScrolledWindow – Ruby-GNOME2 Project Website

Ruby だが value は upper – page_size 以下にしなければいけないとか見つかるんだが
そうすると何故かうまくいかないので無視こいて

def selection_scroll(self):
    """
        def __on_selection_changed(self, selection):
        を利用だと上手くいかない
    """
    # Get GtkAdjustment
    adjustment = self.view.get_vadjustment()
    # calc
    n = self.__get_select_num()
    if n == -1:
        return
    page_size = adjustment.get_property("page_size")
    column_height = self.column1.cell_get_size(gtk.gdk.Rectangle())[4]
    # 計算値
    sc = column_height * n
    # 現在の表示範囲に入っているか検証
    v = adjustment.get_value()
    h = page_size + v - (column_height * 2)
    if sc == 0.0:
        adjustment.set_value(sc)
    elif sc < v:
        adjustment.set_value(sc - column_height)
    elif sc >= h:
        adjustment.set_value(sc - page_size + (column_height * 2))

def __get_select_num(self):
    model, it = self.selection.get_selected()
    if it:
        path = model.get_path(it)
        return path[0]
    return -1

def __on_size_request(self, widget, event=None):
    self.selection_scroll()

てな感じでリストアップしたらこのメソッドを呼んでやる。
というところまでできた、まだ検証が甘いので今日はここまで。