日別アーカイブ: 2022/11/28

GTK4: Adw.ComboRow

GTK+ 4.10 にて Gtk.ComboBox は廃止になる。
Adw に ComboRow というものがあるね。

Adw.ComboRow

ちょっとまて、コレ Nautilus 43 の設定にあるのそのまんまじゃん。
しかも Adw.PreferencesGroup というソレっぽいものもあるという。

それよりも、GtkStringList という GListStore 派生 class があったのかい!
文字列のみで使うなら当然 ListView や GridView にも使えます。
そんなこんなで。

#!/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):
    '''
        Adw: Sample Code
    '''
    def __init__(self, a):
        # Set Adwaita Style
        manager = Adw.StyleManager.get_default()
        manager.set_color_scheme(Adw.ColorScheme.DEFAULT)
        # init
        Gtk.ApplicationWindow.__init__(self, application=a)
        # GListStore
        slist = Gtk.StringList()
        slist.append('OM-1')
        slist.append('GH6')
        rlist = Gtk.StringList()
        rlist.append('PRO レンズ')
        rlist.append('パナライカ')
        # combo
        self.r1 = Adw.ComboRow(model=slist, title='カメラ')
        self.r2 = Adw.ComboRow(model=rlist, title='レンズ')
        # Group
        group = Adw.PreferencesGroup()
        group.add(self.r1)
        group.add(self.r2)
        # Button
        button = Gtk.Button(label='確認', margin_top=12, margin_bottom=12)
        button.connect('clicked', self.on_button_clicked)
        # pack
        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, margin_start=48, margin_end=48)
        box.append(Gtk.Label(label='欲しい', halign=Gtk.Align.START, margin_top=12, margin_bottom=12))
        box.append(group)
        box.append(button)
        self.set_child(box)
        self.set_default_size(400, 300)

    def on_button_clicked(self, button):
        '''
            値の取り出し
        '''
        s1 = self.r1.get_selected_item().get_string()
        s2 = self.r2.get_selected_item().get_string()
        self.set_title(f'{s1}, {s2}')

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

combo

予想以上に簡単だった、margin は勘で割り当てした適当な値です。
変更を即座に適用させたい場合は activated シグナルを処理。
いや GTK+ アプリの設定は基本「適用」ボタンなんて無い文化ですし。

値の取り出しはもちろん selected プロパティの UINT 値を利用する手段もある。
そのほうが設定保存等で都合がいいけど GSettings 的には文字列のほうが良さげ。

しかし GTK+ も Adw のおかげで型がいっぱい増えてなんというか。
UI の統一を狙うなら 4.10 の新規 Widget は Adw にまかせたほうがとか。