今回は GtkGestureRotate で画像を回転してみる。
ただコレはタッチパネルか対応トラックパッドが必要なんだな。
筆者は古い Macbook Air 2011 に Fedora を入れているのでソレで。
多分 Windows で対応ノートに入れても結果は同じ、だと思う。
それと、回転のピボットポイントを指定する方法が見つからなかった。
今回は下記ページ中心あたりにある一度ズラして元の位置に戻す方法で。
もしかして cairo だけだとソレしか手段が無いのかな?
Clutter が使えるなら簡単なんだけど、GTK4 には乗せられないし。
とにかく上手くいったコード。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #!/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 が遅くてもどかしい。。。。。