今回は GtkGestureRotate で画像を回転してみる。
ただコレはタッチパネルか対応トラックパッドが必要なんだな。
筆者は古い Macbook Air 2011 に Fedora を入れているのでソレで。
多分 Windows で対応ノートに入れても結果は同じ、だと思う。
それと、回転のピボットポイントを指定する方法が見つからなかった。
今回は下記ページ中心あたりにある一度ズラして元の位置に戻す方法で。
もしかして cairo だけだとソレしか手段が無いのかな?
Clutter が使えるなら簡単なんだけど、GTK4 には乗せられないし。
とにかく上手くいったコード。
#!/usr/bin/env python3
import gi, sys, cairo
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk
FILENAME = '300x225.png'
class Win(Gtk.ApplicationWindow):
'''
GtkGestureRotate Sample Code
TouchPanel or Trackpad
'''
def __init__(self, app):
Gtk.ApplicationWindow.__init__(self, application=app)
# var
self.view_angle = 0.0
# gesture
rotate = Gtk.GestureRotate()
rotate.connect('angle-changed', self.on_angle_changed)
self.add_controller(rotate)
# view
self.surface = cairo.ImageSurface.create_from_png(FILENAME)
self.view = Gtk.DrawingArea()
self.view.set_draw_func(self.view_draw_func)
# self
self.set_child(self.view)
self.set_size_request(400, 300)
self.present()
def view_draw_func(self, da, cr, width, height):
cr.translate(200, 150)
cr.rotate(self.view_angle) # 0.0 - 1.0
cr.translate(-200, -150)
cr.set_source_surface(self.surface)
cr.paint()
def on_angle_changed(self, gesture, angle, delta):
self.view_angle = angle
self.view.queue_draw()
class App(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self)
def do_startup(self):
Gtk.Application.do_startup(self)
Win(self)
def do_activate(self):
pass
app = App()
app.run(sys.argv)
Mac では上手くいった。
後は再回転させる時に前回の回転位置から開始する処理だ。
eog を参考にしようと思ったらコレ 90 度ずつしか回転しないのねん。。。
そんなことよりさ。
M1 Mac に慣れてしまって 2011 Air が遅くてもどかしい。。。。。
