summaryrefslogtreecommitdiff
path: root/fs/browsewin.py
blob: 8c3c2daa0e7f1fb2e9e01bbacc4dd667dd922acc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/env python

import wx

import fs



class BrowseFrame(wx.Frame):

    def __init__(self, fs):
        wx.Frame.__init__(self, None)

        self.fs = fs
        self.SetTitle("FS Browser - "+str(fs))

        self.tree = wx.TreeCtrl(self, -1)
        self.root_id = self.tree.AddRoot(str(fs), data=wx.TreeItemData( {'path':"/", 'expanded':False} ))

        isz = (16, 16)
        il = wx.ImageList(isz[0], isz[1])
        self.fldridx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER,      wx.ART_OTHER, isz))
        self.fldropenidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, isz))
        self.fileidx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz))

        self.tree.SetImageList(il)
        self.il = il

        self.tree.SetItemImage(self.root_id, self.fldridx, wx.TreeItemIcon_Normal)
        self.tree.SetItemImage(self.root_id, self.fldropenidx, wx.TreeItemIcon_Expanded)

        self.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.OnItemExpanding)

        self.expand(self.root_id)


    def expand(self, item_id):

        item_data = self.tree.GetItemData(item_id).GetData()

        path = item_data["path"]

        if not self.fs.isdir(path):
            return

        if item_data['expanded']:            
            return

        paths = self.fs.listdir(path, absolute=True)

        if not paths:
            self.tree.SetItemHasChildren(item_id, False)
            self.tree.Collapse(item_id)
            return


        paths.sort(key=lambda p:(not self.fs.isdir(p), p.lower()))


        for new_path in paths:

            is_dir = self.fs.isdir(new_path)
            name = fs.pathsplit(new_path)[-1]
            new_item = self.tree.AppendItem(item_id, name, data=wx.TreeItemData( {'path':new_path, 'expanded':False}))

            if is_dir:
                self.tree.SetItemHasChildren(new_item)
                self.tree.SetItemImage(new_item, self.fldridx, wx.TreeItemIcon_Normal)
                self.tree.SetItemImage(new_item, self.fldropenidx, wx.TreeItemIcon_Expanded)
            else:
                self.tree.SetItemImage(new_item, self.fileidx, wx.TreeItemIcon_Normal)


        item_data['expanded'] = True
        self.tree.Expand(item_id)


    def OnItemExpanding(self, e):

        self.expand(e.GetItem())
        e.Skip()


def browse(fs):

    app = wx.PySimpleApp()
    frame = BrowseFrame(fs)
    frame.Show()
    app.MainLoop()

if __name__ == "__main__":

    home_fs = fs.OSFS("~/")
    browse(home_fs)