Re: Has anyone been able to force TreeView expander with no children?



On 10/15/2009 09:36 AM, Holger Berndt wrote:
> Hi Daniel,
>
> On Mi, 14.10.2009 18:52, Daniel B. Thurman wrote:
>
>   
>> I need
>> the expanders so that when I expand the directory
>> in question, I would then trigger a call to add more
>> children, and so on.
>>     
> The way I do that is to add a single dummy child (with a text like
> "Loading..."). That makes the top level entry expandable. When
> the user expands the item, he gets feedback right away by seeing the
> "Loading..." entry, while the code populates the model on the fly, and
> finally removes the dummy entry.
>
> Others (e.g. Nautilus list view) seem to do it similarly.
>
> Holger
>   
The problem I have is: how do I capture the signal when the
row is expanded?  I posted a follow up on this and it seems
that the key is "row-has-child-toggled", but this does not
seem to work:

self.treeview.connect('row-has-child-toggled', self.on_row_activated)
TypeError: <gtk.TreeView object at 0xb7b9ab6c (GtkTreeView at
0x8df5080)>: unknown signal name: row-has-child-toggled

I have, however tried:
self.treeview.connect('row-activated', self.on_row_activated)

and this works, except that the row has to be mouse
double-clicked, which is not what I want.

I sure wish there is a Python-GTK code somewhere
that I could peruse to resolve my many issues!

Since the code I have is experimental, I include it
in the following, so that it is open to critique and
may be of benefit to others following the same
pathway:

==================================
[code]
#!/usr/bin/env python

import os, stat, sys, time
import pygtk
pygtk.require('2.0')
import gtk

DEBUG=True
RECURSE=1
SEP='                  '

DEFAULT_PATH='~/Desktop/'

class FileLister:

#    column_names = ['Files', 'Size', 'Mode', 'Last Changed', 'Path']
    column_names = ['Files']

    # Close the window and quit
    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def __init__(self, path=None):
       
        cell_data_funcs = (
            None,
            self.file_size,
            self.file_mode,
            self.file_last_changed,
            self.file_path)
       
        # Create a new window
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_title("FileLister")
        self.window.set_size_request(600, 400)
        self.window.connect("delete_event", self.delete_event)

        # TreeView
        self.treestore = gtk.TreeStore(str, gtk.gdk.Pixbuf, int, bool, str)
        self.treeview = gtk.TreeView(self.treestore)

        # TreeView Options
        self.treeview.set_level_indentation(0)
        self.treeview.set_show_expanders(True)
#        self.treeview.set_hover_expand(True)
#        self.treeview.set_search_column(0)
#        self.treeview.set_reorderable(True)

        # TreeViewColumns
        self.tvcolumn = [None] * len(self.column_names)
        cellpb = gtk.CellRendererPixbuf()
        self.tvcolumn[0] = gtk.TreeViewColumn(self.column_names[0], cellpb)
        self.tvcolumn[0].set_cell_data_func(cellpb, self.file_pixbuf)
        cell = gtk.CellRendererText()
        self.tvcolumn[0].pack_start(cell, False)
        self.tvcolumn[0].set_cell_data_func(cell, self.file_name)
        self.treeview.append_column(self.tvcolumn[0])
        # Append more TreeView columns, if available       
        for n in range(1, len(self.column_names)):
            cell = gtk.CellRendererText()
            self.tvcolumn[n] = gtk.TreeViewColumn(self.column_names[n],
cell)
            if n == 1:
                cell.set_property('xalign', 0.0)
            self.tvcolumn[n].set_cell_data_func(cell, cell_data_funcs[n])
            self.treeview.append_column(self.tvcolumn[n])

        # Signals
#        self.treeview.connect('row-activated', self.on_row_activated)
        ''' FOLLOWING DOES NOT WORK '''
        self.treeview.connect('row-has-child-toggled',
self.on_row_activated)
       
        # Populate TreeView with initial files
        self.path = os.path.expanduser(DEFAULT_PATH)
        self.dir_walk(path=self.path, recurse=RECURSE)

        # Add scrolled Window
        self.scrolledwindow = gtk.ScrolledWindow()
        self.scrolledwindow.add(self.treeview)
        self.window.add(self.scrolledwindow)

        # Display the window
        self.window.show_all()

    # Populate TreeStore with directory listing
    def dir_walk(self, path, parent=None, recurse=0):
        filestat = os.stat(path)
        if not stat.S_ISDIR(filestat.st_mode):
            self.debug("File     : "+path)
            return self.treestore
        for f in os.listdir(path):
            rec=recurse
            filename = os.path.join(path, f)
            fdata = os.stat(filename)
            is_folder = stat.S_ISDIR(fdata.st_mode)
            if is_folder:
                fType="Directory"
                hdr="%s: %s" % (fType, filename)
            else:
                fType="File"
                hdr="%s     : %s" % (fType, filename)
            self.debug(hdr)
            img = gtk.icon_theme_get_default().load_icon(
                    "folder" if is_folder else "document",
                    gtk.ICON_SIZE_MENU, 0)
            try:
                ts = self.treestore.append(parent, [f,img,fdata.st_size,
is_folder, path])
            except Exception, error:
                ''' Note: exceptions occurs on certain files on
Fedora-11 mounted NTFS filesystem <Needs investigating...> '''
                extradata="Filename=%s\n%sFiletype=%s\n%sparent=%s,
[f=%s, img=%s, size=%s, is_folder=%s, path=%s]" % (filename, SEP, fType,
SEP, parent, f, img, fdata.st_size, is_folder, path)  
                self.dump_traceback(extradata)
                continue
            if is_folder and rec > 0:
                rec=rec-1
                self.dir_walk(path=filename, parent=ts, recurse=rec)
        return self.treestore

    def on_row_activated(self, treeview, path, column):
        model = treeview.get_model()
        iter = model.get_iter(path)
        filename = os.path.join(model.get_value(iter, 4),
model.get_value(iter, 0))
        #self.debug("File     : "+filename)
        ts = self.dir_walk(filename, parent=iter, recurse=1)
        treeview.set_model(ts)
        return

    def file_pixbuf(self, column, cell, model, iter):
        filename = os.path.join(model.get_value(iter, 4),
model.get_value(iter, 0))
        filestat = os.stat(filename)
        if stat.S_ISDIR(filestat.st_mode):
            pb = gtk.icon_theme_get_default().load_icon("folder",
gtk.ICON_SIZE_MENU, 0)
        else:
            pb = gtk.icon_theme_get_default().load_icon("document",
gtk.ICON_SIZE_MENU, 0)
        cell.set_property('pixbuf', pb)
        return

    def file_name(self, column, cell, model, iter):
        cell.set_property('text', model.get_value(iter, 0))
        return

    def file_size(self, column, cell, model, iter):
        filename = os.path.join(model.get_value(iter, 4),
model.get_value(iter, 0))
        filestat = os.stat(filename)
        cell.set_property('text', filestat.st_size)
        return

    def file_mode(self, column, cell, model, iter):
        filename = os.path.join(model.get_value(iter, 4),
model.get_value(iter, 0))
        filestat = os.stat(filename)
        cell.set_property('text', oct(stat.S_IMODE(filestat.st_mode)))
        return

    def file_last_changed(self, column, cell, model, iter):
        filename = os.path.join(model.get_value(iter, 4),
model.get_value(iter, 0))
        filestat = os.stat(filename)
        cell.set_property('text', time.ctime(filestat.st_mtime))
        return
   
    def file_path(self, column, cell, model, iter):
        filename = os.path.join(model.get_value(iter, 4),
model.get_value(iter, 0))
        cell.set_property('text', filename)
        return

    def debug(self, string):
        if DEBUG:
            print 'DEBUG: %s' % string
           
    def dump_traceback(self, extradata=None):
        import traceback
        etb = traceback.extract_tb(sys.exc_info()[2])
        traceback = 'Traceback:\n'
        for tub in etb:
            f, l, m, c = tub # file, lineno, function, codeline
            traceback += '                  '+('File: %(a)s, line %(b)s,
in %(c)s\n') % {'a': f, 'b': l, 'c': m}
            traceback += '                  %s \n' % c
            traceback += '                  %s: %s' %
(sys.exc_info()[0], sys.exc_info()[1]) #etype, evalue
        print "ERROR: Exception: %s\n%s%s" % (traceback, SEP,
extradata)               
   
def main():
    gtk.main()

if __name__ == "__main__":
    myApp = FileLister()
    main()
[/code]



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]