Sasagoi

梅雨の休日はプログラミングを、と考えていたのですが。
今日の尾張地区は雲ひとつない晴天です、よし野鳥を探すぞ。
紫陽花もそろそろと思ったけどまだイマイチつぼみですね。

isohiyodori

イソヒヨドリのメスを見つけました。
柵の形から解るだろうけど 5/28 のオスと同じ場所にて。

isohiyodori

同じ個体かは判らないけれど物凄い近くにも突然現れました。
人懐っこいんですね、こっちを向いている所を撮れなくて残念。

sasagoi

ササゴイ、枝が邪魔だけどこの角度でしか撮れなかった。
五条川で見たのは初、てゆーか川の中以外で見たのも初。

kiji

そしてキジ、まだおるでー。
すっかりオチになってしまった感、夕方にいることが多いし。

しかしカメラボディは E-M5 Mark3 しか使わなくなってしまった。
だって OM Workspace の AI ノイズリダクションがありがたすぎる。
上記のイソヒヨドリの写真にも使っているし、もはや必須機能。

Lightroom に同様な機能が付いたので Adobe に戻れば LUMIX でも。
いやプロキャプチャや深度合成が、サブスク料金も必要だし。
そんなこんなでサブ機用途で買ったのにすっかりメインに。

Tanuki

今日の五条川は金曜の豪雨がまだ影響していてメッチャ濁っている。
なので犬山の某公園へ、犬山市は犬山踊芸祭でワッショイしていた。
デモソンナノカンケーネェー、古くてごめん。

tanuki

タヌキじゃん、愛知県ってタヌキが出るんだ!
まあ庄内緑地にはキツネがいるし小牧山にサルも出たし。

tanuki

犬山の動物|犬山市 なんとアライグマとかもいるんだね。
とはいえどれも夜行性だし普段は見ることなんてないか。

tonbo

チュンチュンとカーカーしかいなかったので木曽川へ移動。
赤トンボってもう秋なのか、いやショウジョウトンボというらしい。

hoojiro

やっと野鳥を発見、ホオジロを貼るのははじめてかな。
残念ながら曇ってしまった、青空バックで撮りたかった。

しかし木曽川のサイクルロードはチャリダーがえらく増えてますね。
自転車はコロナ禍の一時的な流行だと思っていたけど皆結構続くのね。
カメラバッグ背負っているのは筆者くらいしかいないけど。

GTK4: Label

GTK4 の基本と外枠のまとめはゴールデンウイークに作った。
細かい Widget はどうするか、ほとんど GTK3 と変わっていないのですし。
でもその時だけ GTK3 のページを見てくれじゃアレなんで少し書き足そうかと。

Gtk(PyGObject) Tips | ラベル – Paepoi

とりあえずコイツの GTK4 化だな。

Gtk.Label

angle プロパティが無くなった以外は特に問題無さそうにみえる。
回転するにはどうするのかな、pango を使えになったのだろうか?

Pango ? 1.0: Text Attributes and Markup

angle に相当するものはないようで。
text_transform に rotate(deg90) はやっぱりダメか。
でも gravity という重力の指定でどの方向が下なのか決めることはできる。
これで 90 度単位な回転ができるっぽい、他も含めてやってみる。

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1')
from gi.repository import Gtk, Adw

class Win(Gtk.ApplicationWindow):
    def __init__(self, a):
        manager = Adw.StyleManager.get_default()
        manager.set_color_scheme(Adw.ColorScheme.DEFAULT)
        Gtk.ApplicationWindow.__init__(self, application=a)
        # mouse move
        labels = [
            Gtk.Label(label='中心'),
            Gtk.Label(label='左寄せ', xalign=0),
            Gtk.Label(label='右寄せ', xalign=1),
            #Gtk.Label(label='180度回転', angle=180),
            Gtk.Label(label='<s>打ち消し線</s>を入れたり', use_markup=True),
            Gtk.Label(label='<span bgcolor="red">赤くする</span>とか', use_markup=True),
            Gtk.Label(label='<span fgcolor="blue">青くする</span>とか', use_markup=True),
            Gtk.Label(label='<span font_weight="heavy">太くする</span>とか', use_markup=True),
            Gtk.Label(label='<span font_style="italic">italic にしたり</span>とか', use_markup=True),
            Gtk.Label(label='エスケープ文字も\n\t使えます', xalign=0),
            Gtk.Label(label='エスケープ文字を\n\t無効にする', xalign=0, single_line_mode=True),
            Gtk.Label(label='薄くする', opacity=0.3),
            #
            Gtk.Label(label='<span text_transform="uppercase">uppercase</span>とか', use_markup=True),
            #Gtk.Label(label='<span text_transform="ratate 45deg">回転</span>Error', use_markup=True),
            Gtk.Label(label='<span gravity="north" baseline_shift="13pt">反転</span>とか', use_markup=True),
            Gtk.Label(label='<span gravity="west" baseline_shift="8pt">西が下</span>とか', use_markup=True)
        ]
        #
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        for label in labels:
            vbox.append(label)
            vbox.append(Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL))
        # 
        self.set_child(vbox)
        self.set_default_size(200, 200)

app = Gtk.Application()
app.connect('activate', lambda a: Win(a).present())
app.run()

gtklabel

なんとかなった。
baseline_shift に注意、元のベースラインを軸に回転するので上に動かす。
でもコレ環境によるよなぁって、まあ回転は可能ってことで。
それと single_line_mode だと改行が矢印になるんだね、笑った。

kochidori

今日はコチドリを見つけました、やっとツバメ以外の夏鳥が撮れた。
駐車場でウロウロしていたけどそんな所にミミズいないだろ。

isohiyodori

デカいカワセミ、ではなくイソヒヨドリです。
五条川で見たのは二回目、前回は超望遠をもっておらず点でしたけど。

Hina

先週先々週とキビタキを追いかけ、ボウズでネタ無し。
囀りは聞こえど姿は見えず、趣味なのにウンザリしてきた。
五条川に来ないからと山や公園に行っているのが悪いのか?
なので今日からは五条川にて身近な野鳥という本来の姿に戻る。

suzume

だからってスズメかよ、いやネクタイが小さいから幼鳥ですね。
パナライカ 100-400 前後ボケの例です、被写界深度せま!

sekirei

ハクセキレイの親子、幼鳥って最初はこんな色なんですね。
しかし知らぬ間に幼鳥の季節になっていた、

hibari

ヒバリ、二羽で行動していたがどちらにもトサカが無かった。
もしかしてキマシタワー?

kiji

そしてキジ、いつものキジポイントにまだいます。
そろそろこの田圃にも水を張るだろうし、いなくなる前に。
てかオスしか見かけないんですが、今年はハーレム無しかな。

他にカワラヒワモズカルガモムクドリetc…
季節の鳥に拘らないならいくらでもいるんだよな。

GtkStyleContext to GtkWidget css_classes

Gtk.StyleContext

GTK 4.10 は GtkStyleContext も廃止予定になっていた。
get_style_context から背景の透過にしかつかっていなかったとはいえ。
Tips ページを書き換えなきゃ、背景透過は今後どうすりゃいいんだ?

「API は GtkWidget に移した」とあるけど何をどう移したのかは説明無し。
Linux はそんなものだ、自力で色々プロパティを弄くってみる。

#!/usr/bin/env python3

import gi, sys
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk, GdkPixbuf, Gdk

# Picture File
PNGFILE = 'test.png'
 
class Win(Gtk.ApplicationWindow):
    '''
        GTK4: No Decorated Window
    '''
    def __init__(self, a):
        Gtk.ApplicationWindow.__init__(self, application=a, decorated=False)
        ''' Deprecated
        APP_CSS = 'window { background-color: rgba(255, 255, 255, 0); }' #.encode('utf-8')
        provider = Gtk.CssProvider()
        provider.load_from_data(APP_CSS, -1)
        context = self.get_style_context()
        context.add_provider_for_display(
            self.get_display(),
            provider,
            Gtk.STYLE_PROVIDER_PRIORITY_USER)
        '''
        #
        # Transparent
        #
        print(self.get_css_classes()) #=> [background]
        self.set_css_classes(['no_name'])
        #
        # Mouse Signal
        click = Gtk.GestureClick()
        #click.connect('pressed', self.on_gesture_click_pressed)
        click.connect('stopped', self.on_gesture_click_stopped)
        click.connect('released', self.on_gesture_cllick_released)
        self.add_controller(click)
        # Draw
        self.pixbuf = GdkPixbuf.Pixbuf.new_from_file(PNGFILE)
        da = Gtk.DrawingArea()
        da.set_draw_func(self.da_draw_func)
        self.set_child(da)
        # Resize
        self.set_default_size(self.pixbuf.get_width(), self.pixbuf.get_height())
 
    def da_draw_func(self, da, cr, width, height):
        Gdk.cairo_set_source_pixbuf(cr, self.pixbuf, 0, 0)
        cr.paint()

    def on_gesture_click_stopped(self, click):
        '''
            Mouse Move
        '''
        button = click.get_button()
        toplevel = self.get_surface() # GdkToplevel
        display = self.get_display()
        seat = display.get_default_seat()
        device = seat.get_pointer()
        s, win_x, win_y = device.get_surface_at_position()
        time = device.get_timestamp()
        toplevel.begin_move(device, button, win_x, win_y, time)

    def on_gesture_cllick_released(self, widget, n_press, x, y):
        '''
            Double Click
        '''
        if n_press == 2:
            self.close()

app = Gtk.Application()
app.connect('activate', lambda a: Win(a).present())
app.run()

css

結果 GtkWidget の css_classes を変更したいが定義がワカラン。
存在しない CSS にしたらどうなる?って適当にやったらイケてしまった。
多分正しい手段ではないので今後は解らないですけど。

他に CSS 文字列は UTF-8 にする必要がいつのまにかなくなっていたり。
いやそれは廃止されるのだからどうでもいいんですけど。

ついでに、GtkGestureClick で今頃発見。
pressed シグナルを処理すると released シグナルが発行されなくなるのですけど。
stopped シグナルなら releace も発行される、よし今度からこの方法にしよう。