JavaScript でスマホゲームもいいけどメインの GTK+ もやらねば。
久々に Y901x の更新、ポーズからコマ戻しが上手くいく方法を見つけたので。
# self.player @ playbin
# self.settingwin @ My Setting
def set_next_frame(self, rate):
"""
1 frame up down (rate 1.0 or -1.0)
"""
if self.settingwin.direction != rate:
self.settingwin.direction = rate
self.set_playback_direction(rate)
event = Gst.Event.new_step(Gst.Format.BUFFERS, 1, 1.0, True, False)
self.player.send_event(event)
def set_playback_direction(self, rate):
"""
Change direction
"""
pos = self.player.query_position(Gst.Format.TIME)[1]
if rate >= 0.0:
self.player.seek(
rate,
Gst.Format.TIME,
Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE,
Gst.SeekType.SET, pos,
Gst.SeekType.SET, -1)
else:
self.player.seek(
rate,
Gst.Format.TIME,
Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE,
Gst.SeekType.SET, 0,
Gst.SeekType.SET, pos)
def on_play(self, widget, data=None):
if self.settingwin.direction == -1.0:
self.settingwin.direction = 1.0
self.set_playback_direction(1.0)
if self.player.get_state(1)[1] == Gst.State.PLAYING:
self.player.set_state(Gst.State.PAUSED)
else:
self.player.set_state(Gst.State.PLAYING)
逆転させる手続きを分離して send_event するだけだった。
GLib.idle_add とか色々試したのに実はこんなに簡単だった…
これなら関数を抜けるので逆転した後で 1 コマ移動ということになるのかな。
再生開始で正転に戻すのを忘れないようにと。
それと手段が全然解らず困り果てていたシークバー上のマウスホイール。
event.direction 引数が Gdk.ScrollDirection.SMOOTH になるのよ。
Gdk.ScrollDirection.UP, DOWN になる記事以外見当たらなかったし。
http://nullege.com/codes/show/src%40p%40i%40pitivi-HEAD%40pitivi%40utils%40widgets.py/1035/gi.repository.Gdk.ScrollDirection.UP/python
そういうことだったのか!
やっぱり GPL のコードを見たほうが圧倒的に参考になるね。
何も作品を作っていなさそうな人って何故勉強しているのか、日本人に多過ぎ。
def on_seek_scroll_event(self, widget, event):
"""
Mouse Wheel event
widget @ GtkScale
"""
delta = 0
if event.direction in [Gdk.ScrollDirection.UP, Gdk.ScrollDirection.RIGHT]:
delta = 1
elif event.direction in [Gdk.ScrollDirection.DOWN, Gdk.ScrollDirection.LEFT]:
delta = -1
elif event.direction in [Gdk.ScrollDirection.SMOOTH]:
unused_res, delta_x, delta_y = event.get_scroll_deltas()
if delta_x:
delta = math.copysign(1, delta_x)
elif delta_y:
delta = math.copysign(1, -delta_y)
if delta:
location = widget.get_value() - (delta * 10000000000)
if location > 0 and location < self.playinfo.duration:
self.set_play_position(location)
self.put_time_status(location)
これで約 10 秒送りなホイールスクロールが可能になった。
Fedora 20 でしか試していないけど多分 GNOME なら大丈夫だろう。
次バージョン早く出ないかなぁ、20 が安定しているからいいけど半年サイクルに慣れ過ぎた。