GTK4 ColumnView Satır Seçim Sorunu

Python ve GTK4 ile denemeler yapıyordum. Ancak GTK4’teki ColumnView widget’ı kullanıldığında her satırın alt ve üst sınırlarında sağ tıklanıp menü açılmayan bölgeler var. Bu nasıl aşılabilir? Tıklamaya duyarsız alanları aşağıdaki resimde kırmızıyla işaretledim. Sağ tıklayınca menü açılmıyor. Ama satırların orta kısımlarına sağ tıklayınca menü açılıyor. Bu durum GTK3’teki TreeView’da yoktu.

gtk4_columnview

Basitleştirilmiş bir Python kodunu aşağıya ekledim.

import gi
gi.require_version("Gtk", "4.0")
gi.require_version("Gio", "2.0")
from gi.repository import Gtk, Gio, GObject, Gdk

class Person(GObject.Object):
    def __init__(self, name, city):
        super().__init__()
        self.name = name
        self.city = city

class AppWindow(Gtk.ApplicationWindow):
    def __init__(self, app):
        super().__init__(application=app, title="GTK4 ColumnView", default_width=400, default_height=300)

        self.model = Gio.ListStore(item_type=Person)
        self.model.append(Person("Abc Def", "İstanbul"))
        self.model.append(Person("Klm Mno", "Ankara"))
        self.model.append(Person("Prs Tui", "İzmir"))
        self.selection_model = Gtk.SingleSelection(model=self.model)
        
        self.column_view = Gtk.ColumnView(model=self.selection_model)
        self.add_column("İsim", "name")
        self.add_column("Şehir", "city")

        scrolled = Gtk.ScrolledWindow()
        scrolled.set_child(self.column_view)
        self.set_child(scrolled)

    def add_column(self, title, property_name):
        factory = Gtk.SignalListItemFactory()
        factory.connect("setup", self.on_factory_setup)
        factory.connect("bind", self.on_factory_bind, property_name)
        column = Gtk.ColumnViewColumn(title=title, factory=factory)
        self.column_view.append_column(column)

    def on_factory_setup(self, factory, list_item):
        label = Gtk.Label(xalign=0)
        list_item.set_child(label)

        gesture = Gtk.GestureClick(button=3)
        gesture.connect("pressed", self.on_row_right_click, list_item)
        label.add_controller(gesture)

    def on_factory_bind(self, factory, list_item, property_name):
        item = list_item.get_item()
        label = list_item.get_child()
        label.set_text(getattr(item, property_name))

    def on_row_right_click(self, gesture, n_press, x, y, list_item):
        index = list_item.get_position()
        self.selection_model.set_selected(index)

        popover = Gtk.PopoverMenu()
        popover.set_parent(list_item.get_child())
        popover.set_has_arrow(True)
        
        rect = Gdk.Rectangle()
        popover.popup()

    def on_edit_clicked(self, action, parameter):
        pass

    def on_delete_clicked(self, action, parameter):
        pass

def on_activate(app):
    win = AppWindow(app)
    win.present()

app = Gtk.Application(application_id="com.example.ColumnViewMenu")
app.connect("activate", on_activate)
app.run(None)

Attığınız kodu birebir açıp deneyeyim dedim, ben arada hiç boşluk hissedemedim, temayla alakalı bir durum da olabilir.

gtk4

ColumnView’in css temasını override edip belirli bir padding, margin veya spacing değerine zorlayabilirsiniz.

Örneğin aralarına 9px boşluk eklemek için ColumnView objenize bosluklu css_class’ını ekleyin :

.bosluklu > listview > row {
	margin-top: 9px;
}

Veya 0px yaparak aradaki boşluğu sıfırlamaya zorlayabilirsiniz.

Sol tıklama çalışıyor. Sağ tıklayarak deneyin. Menü o kısımlarda açılmıyor. Ortalara tıklanınca açılıyor.
Menü deneme amaçlı boş bir menü.

Pardus 25’in varsayılan temasını kullanıyorum. Başka bir tema yüklemedim.

@eminfedar, hatayı yeniden üretebildiniz mi?

Aşağıdaki gibi büyük bir listede olunca sorun oluyor. Sağ tıklama duyarsız yerlere denk geliyor çok satır olunca.

Yapay zekada aramak için kullanabilirsiniz.

GTK Inspector kullarak tıpkı tarayıcıdaki öğeyi denetledeki gibi widget’leri denetleyebilir, boyutlarını görebilir ve property’lerini değiştirebilirsiniz.

Problemin özeti şu:

ListItem’in içerisine set_child ile eklediğiniz Gtk.Label’in boyutları satırı tamamen kaplamıyor. Etrafında boşluk var. Bunu da içinde olduğu GtkColumnViewCellWidget ve css’si cell nesnesinin padding’i yapıyor.

Çözüm ise, bu cell’in padding’ini sıfırlayıp Label’a padding vermek. ColumnView’e yine bir css sınıfı atayın, ismi paddingli olabilir örneğin:

/* Column Cell'in paddingini sıfırla */
.paddingli > listview > row > cell {
	padding:0px;
}

/* Column Cell'in içindeki label'e padding ver */
.paddingli > listview > row > cell > label {
	padding: 6px;
}

Bu şekilde olduğunda sağ tıkladığınız zaman Cell’e değil, Label’e tıklarsınız çünkü Label bütün Cell’in boyutunu kaplamış olur artık. Siz aradaki boşluğa tıklayınca menünün gelmeme sebebi Label’e tıklamıyor oluşunuz. Çünkü sağ tık eventi label’e ait.

Normal hali:
image

Label’a padding verilmiş hali (tüm hücreyi kapladı):
image

1 Beğeni

Yardımlarınız için teşekkürler. Sorun temadan kaynaklanıyormuş. Cell için olan padding değeri sıfırlanıp Label’e eklenince sorun gitti.

İlk cevabı yazanın mesajını cevap olarak işaretleyeceğim.

1 Beğeni

Sizin mesajınızdaki css kodunu deneyince de sorun düzeldi.

Bu konu son yanıttan 30 gün sonra otomatik olarak kapatıldı. Yeni yanıtlara artık izin verilmiyor.