今回は 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 が遅くてもどかしい。。。。。