GTK3 – Tree e List – II

6

Naturalmente si continua con l’esposizione iniziata qui.

La view

Una volta definito il modello resta di visualizzarlo:

tree = Gtk.TreeView(store)
dove store è il modello, vedi sotto. Probabilmente il sistema migliore è esaminare gli esempi, anche perché non so se tutti i metodi servono davvero.

Oggetti TreeView

class Gtk.TreeView([treemodel])
crea un oggetto Gtk.TreeView inizializzato a treemodel, implementato con Gtk.TreeModel, che può essere Gtk.ListStore o Gtk.TreeStore. Se omesso o None si dovrà chiamare set_model().

set_model(model)
Setta il modello model, rimuovendo quello eventualmente esistente; se model è None il vecchio modello viene rimosso.

get_model()
ritorna il modello o None se questo non è definito.

append_column(column)
aggiunge column alla lista delle colonne.

get_selection()
ritorna la Gtk.TreeSelection associata alla tree view.

enable_model_drag_source(start_button_mask, targets, actions)
per gli argomenti vedi Gtk.Widget.drag_source_set().

enable_model_dest_source(targets, actions)
per gli argomenti vedi Gtk.Widget.drag_dest_set().

Oggetti TreeViewColumn

class Gtk.TreeViewColumn(label[, renderer[, **kwargs]])
crea un nuovo Gtk.TreeViewColumn. renderer è un’istanza a Gtk.CellRenderer; questo è equivalente a chiamate a pack_start() e add_attribute() che si devono usare se renderer è omesso.

add_attribute(renderer, attribute, value)
attribute è il parametro da settare per value; p.es. se la colonna contiene stringhe devi mettere “text”.

pack_start(renderer, expand)
mette il renderer all’inizio della colonna. Se expand è False non è possibile aggiungere altro.

pack_end(renderer, expand)
aggiunge il renderer alla fine della colonna. Se expand è False non è possibile aggiungere altro.

set_sort_column_id(sort_column_id)
setta il modo di ordinamento della colonna. Inoltre rende la colonna clickabile.

get_sort_column_id()
ritrova l’id definito con Gtk.TreeViewColumn.set_sort_column_id().

set_sort_indicator(setting)
True o False definisce se il triangolino dev’essere visibile.

get_sort_indicator()
ritrova l’indicatore del punto precedente.

set_sort_order(order)
cambia l’ordine con cui la colonna è ordinata, order può essere Gtk.SortType.ASCENDING o Gtk.SortType.DESCENDING.

get_sort_order()
ritrova il modo di ordinamento di cui al punto precedente.

La selezione

Spesso l’applicazione non deve solo visualizzare dati ma rispondere all’input dell’utente. Per questo basta prendere un riferimento all’oggetto selezionato.

select = tree.get_selection()
select.connect("changed", on_tree_selection_changed

Quindi per ritrovare i dati della riga selezionate:

def on_tree_selection_changed(selection):
    model, treeiter = selection.get_selected()
    if treeiter != None:
        print "You selected", model[treeiter][0]

Se Gtk.SelectionMode.MULTIPLE è in uso invece di Gtk.TreeSelection.get_selected() occorre usare Gtk.TreeSelection.get_selected_rows().

Oggetti TreeSelection

set_mode(type)
dove type è uno tra:

  • Gtk.SelectionMode.NONE: non è possibile la selezione;
  • Gtk.SelectionMode.SINGLE: possono essere selezionati 0 o 1 elemento;
  • Gtk.SelectionMode.BROWSE: solo un elemento è selezionato, non è possibile deselezionare un elemento senza selezionarne un altro;
  • Gtk.SelectionMode.MULTIPLE: qualsiasi numero di elementi può essere selezionato, clickando su un elemento se ne inverte la selezione, si possono usare i soliti tasti Ctrl e Shift.

get_selected()
ritorna una tupla (model, treeiter)  dove model è il modello corrente e treeiter un Gtk.TreeIter che punta alla riga selezionata. Questo metodo non funziona se la modalità di selezione è Gtk.SelectionMode.MULTIPLE.

get_selected_rows()
ritorna una lista di istanze a Gtk.TreePath per le righe selezionate.

Ordinamento

Fa impressione non usare “sorting”.

Ordinamento con click sulle colonne

Una colonna viene resa ordinabile con Gtk.TreeViewColumn.set_sort_column_id(). Ecco un esempio:
Per prima cosa creiamo un semplice  Gtk.TreeView e un Gtk.ListStore come modello.

model = Gtk.ListStore(str)
model.append(["Benjamin"])
model.append(["Charles"])
model.append(["alfred"])
model.append(["Alfred"])
model.append(["David"])
model.append(["charles"])
model.append(["david"])
model.append(["benjamin"])

treeView = Gtk.TreeView(model)

cellRenderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(“Title”, renderer, text=0)

Poi abilitiamo l’ordinamento. Nota: column_id (0 nell’esempio) si riferisce alla colonna del modello e non alla colonna di TreeView.

column.set_sort_column_id(0)

Definire un ordinamento personalizzato

È possibile cambiare il comportamento dell’ordinamento, come esempio introduciamo la distinzione maiuscole/minuscole. L’esempio precedente viene visualizzato così:

alfred
Alfred
benjamin
Benjamin
charles
Charles
david
David

mentre considerando le maiuscole/minuscole si ha:

Alfred
Benjamin
Charles
David
alfred
benjamin
charles
david

Per prima cosa è necessaria una funzione di comparazione; questa funzione prende due righe e ritorna un intero negativo se la prima riga deve precedere la seconda, zero se sono uguali e positivo se la seconda deve precedere la prima.

def compare(model, row1, row2, user_data):
    sort_column, _ = model.get_sort_column_id()
    value1 = model.get_value(row1, sort_column)
    value2 = model.get_value(row2, sort_column)
    if value1 < value2:
        return -1
    elif value1 == value2:
        return 0
    else:
        return 1

Quindi la funzione dev’essere settata con Gtk.TreeSortable.set_sort_func().

model.set_sort_func(0, compare, None)

Oggetti TreeSortable

class Gtk.TreeSortable

set_sort_column_id(sort_column_id, order)
setta l’ordinamento per sort_column_id; order può essere Gtk.SortType.ASCENDING o Gtk.SortType.DESCENDING.

get_sort_column_id()
ritorna una tupla consistente di colonna e modo di ordinamento.

set_sort_func(sort_column_id, sort_func, user_data)
setta la funzione di comparazione da usare per ordinare la colonna sort_column_id. user_data viene passato a sort_func.
sort_func è una funzione del tipo func(model, iter1, iter2, user_data) e deve ritornare un intero negativo, zero o positivo a seconda che iter1 debba precedere, essere uguale o debba seguire iter2. (vedi esempio precedente).

set_default_sort_func(sort_func, user_data)
vedi Gtk.TreeSortable.set_sort_func().  Setta la funzione da usarsi di defaut per l’ordinamento della colonna.

Basta, la prossima puntata gli esempi 🙄 Altrimenti non gioco più 😳

Annunci
Post a comment or leave a trackback: Trackback URL.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: