GtkGestureRotate

今回は GtkGestureRotate で画像を回転してみる。

ただコレはタッチパネルか対応トラックパッドが必要なんだな。
筆者は古い Macbook Air 2011 に Fedora を入れているのでソレで。
多分 Windows で対応ノートに入れても結果は同じ、だと思う。

それと、回転のピボットポイントを指定する方法が見つからなかった。
今回は下記ページ中心あたりにある一度ズラして元の位置に戻す方法で。

Cairo samples

もしかして 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)

rotate

Mac では上手くいった。

後は再回転させる時に前回の回転位置から開始する処理だ。
eog を参考にしようと思ったらコレ 90 度ずつしか回転しないのねん。。。

そんなことよりさ。
M1 Mac に慣れてしまって 2011 Air が遅くてもどかしい。。。。。