Eskil

Check-in [507ba476ff]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Rewrote as snidget
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 507ba476ff06f4d9f8014a501e9eccd29b5440e7
User & Date: peter 2007-12-10 06:56:31.000
Context
2007-12-20
19:15
First version with working comparison using background processing. check-in: 8037773bcd user: peter tags: trunk
2007-12-10
06:56
Rewrote as snidget check-in: 507ba476ff user: peter tags: trunk
2007-12-09
18:42
Initial experiment check-in: f01668f775 user: peter tags: trunk
Changes
Unified Diff Ignore Whitespace Patch
Changes to dirdifftest.tcl.
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
    option -rightdir

    variable AfterId
    variable IdleQueue
    variable IdleQueueArr

    constructor {args} {
        install tree using ttk::treeview %AUTO%















        $self configurelist $args
        set AfterId ""
        set IdleQueue {}





























    }
    destructor {

    }

    method AddNodeToIdle {node} {
        if {[info exists IdleQueueArr($node)]} { return }
        lappend IdleQueue $node
        set IdleQueueArr($node) 1

        if {$AfterId eq ""} {
            set AfterId [after idle [list UpdateIdle $tree]]
        }
    }
}

proc InitIdleHandler {tree} {
    if {![info exists ::IdleHandler($tree,afterid)]} {
        set ::IdleHandler($tree,afterid) ""
    }
    if {$::IdleHandler($tree,afterid) ne ""} {
        after cancel $::IdleHandler($tree,afterid)
        set ::IdleHandler($tree,afterid) ""
    }
    #array unset ::IdleHandler $tree,*
    set ::IdleHandler($tree) {}
}

proc AddNodeToIdle {tree node} {
    if {[info exists ::IdleHandler($tree,$node)]} { return }
    lappend ::IdleHandler($tree) $node
    set ::IdleHandler($tree,$node) 1

    if {$::IdleHandler($tree,afterid) eq ""} {
        set ::IdleHandler($tree,afterid) [after idle [list UpdateIdle $tree]]
    }
}

proc UpdateIdle {tree} {
    set ::IdleHandler($tree,afterid) {}

    if {[llength $::IdleHandler($tree)] > 0} {
        set node [lindex $::IdleHandler($tree) 0]
        set ::IdleHandler($tree) [lrange $::IdleHandler($tree) 1 end]
        unset ::IdleHandler($tree,$node)

        UpdateDirNode $tree $node
    }

    if {[llength $::IdleHandler($tree)] > 0} {
        set ::IdleHandler($tree,afterid) [after idle [list UpdateIdle $tree]]
    }
}

proc UpdateDirNode {tree node} {
    if {[$tree set $node type] ne "directory"} {
	return
    }
    if {[$tree set $node status] ne "empty"} {
        puts "Dir [$tree set $node leftfull] already done"
	return
    }
    $tree delete [$tree children $node]

    set leftfull [$tree set $node leftfull]
    set leftall [lsort -dictionary [glob -nocomplain -dir $leftfull *]]
    foreach f $leftall {
	set type [file type $f]
	set id [$tree insert $node end -text [file tail $f] \
		-values [list $type unknown $f [file tail $f] 0 0 $f [file tail $f] 0 0]]
	if {$type eq "directory"} {
	    ## Make it so that this node is openable
            $tree set $id status empty
	    $tree insert $id 0 -text dummy ;# a dummy
	    $tree item $id -text [file tail $f]/
            AddNodeToIdle $tree $id
        }
    }

    $tree set $node status unknown
    $tree set $node leftfull
    $tree set $node leftname
    $tree set $node rightfull
    $tree set $node rightname

}

proc makeWin {} {

    set top .dirdiff
    toplevel $top

    set w [frame $top.f]
    ## Create the tree and set it up
    ttk::treeview $w.tree \
            -columns {type status leftfull leftname leftsize leftdate rightfull rightname rightsize rightdate} \
            -displaycolumns {leftname leftsize leftdate rightname rightsize rightdate} \
            -yscroll "$w.vsb set" -xscroll "$w.hsb set"
    if {[tk windowingsystem] ne "aqua"} {
        ttk::scrollbar $w.vsb -orient vertical -command "$w.tree yview"
        ttk::scrollbar $w.hsb -orient horizontal -command "$w.tree xview"
    } else {
        scrollbar $w.vsb -orient vertical -command "$w.tree yview"
        scrollbar $w.hsb -orient horizontal -command "$w.tree xview"
    }
    $w.tree heading \#0 -text "Directory"
    $w.tree heading leftname -text "Name"
    $w.tree heading leftsize -text "Size"
    $w.tree heading leftdate -text "Date"
    $w.tree heading rightname -text "Name"
    $w.tree heading rightsize -text "Size"
    $w.tree heading rightdate -text "Date"

    $w.tree column leftsize  -stretch 0 -width 70
    $w.tree column rightsize -stretch 0 -width 70
    $w.tree column leftdate  -stretch 0 -width 70
    $w.tree column rightdate -stretch 0 -width 70

    # Fill in root data
    $w.tree set {} type       directory
    $w.tree set {} status     empty
    $w.tree set {} leftfull   $::dirdiff(leftDir)
    $w.tree set {} leftname   [file tail $::dirdiff(leftDir)]
    $w.tree set {} rightfull  $::dirdiff(leftDir)
    $w.tree set {} rightname  [file tail $::dirdiff(leftDir)]

    InitIdleHandler $w.tree
    UpdateDirNode $w.tree {}
    bind $w.tree <<TreeviewOpen>> {UpdateDirNode %W [%W focus]}

    pack $w -fill both -expand 1
    grid $w.tree $w.vsb -sticky nsew
    grid $w.hsb         -sticky nsew
    grid columnconfigure $w 0 -weight 1
    grid rowconfigure    $w 0 -weight 1
}

makeWin









|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>











|


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|

|
|
|
|

|
|

|
|
|
|

|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
>




<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

<
<
<
<





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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137


138






































139




140
141
142
143
144
    option -rightdir

    variable AfterId
    variable IdleQueue
    variable IdleQueueArr

    constructor {args} {
        install tree using ttk::treeview $win.tree \
                -columns {type status leftfull leftname leftsize leftdate rightfull rightname rightsize rightdate} \
                -displaycolumns {leftname leftsize leftdate rightname rightsize rightdate}
        if {[tk windowingsystem] ne "aqua"} {
            install vsb using ttk::scrollbar $win.vsb -orient vertical \
                    -command "$tree yview"
            install hsb using ttk::scrollbar $win.hsb -orient horizontal \
                    -command "$tree xview"
        } else {
            install vsb using scrollbar $win.vsb -orient vertical \
                    -command "$tree yview"
            install hsb using scrollbar $win.hsb -orient horizontal \
                    -command "$tree xview"
        }
        $tree configure -yscroll "$vsb set" -xscroll "$hsb set"

        $self configurelist $args
        set AfterId ""
        set IdleQueue {}

        $tree heading \#0 -text "Directory"
        $tree heading leftname -text "Name"
        $tree heading leftsize -text "Size"
        $tree heading leftdate -text "Date"
        $tree heading rightname -text "Name"
        $tree heading rightsize -text "Size"
        $tree heading rightdate -text "Date"

        $tree column leftsize  -stretch 0 -width 70
        $tree column rightsize -stretch 0 -width 70
        $tree column leftdate  -stretch 0 -width 70
        $tree column rightdate -stretch 0 -width 70

        # Fill in root data
        $tree set {} type       directory
        $tree set {} status     empty
        $tree set {} leftfull   $options(-leftdir)
        $tree set {} leftname   [file tail $options(-leftdir)]
        $tree set {} rightfull  $options(-rightdir)
        $tree set {} rightname  [file tail $options(-rightdir)]

        $self UpdateDirNode {}
        bind $tree <<TreeviewOpen>> "[mymethod UpdateDirNode] \[%W focus\]"

        grid $tree $vsb -sticky nsew
        grid $hsb         -sticky nsew
        grid columnconfigure $win 0 -weight 1
        grid rowconfigure    $win 0 -weight 1
    }
    destructor {

    }

    method AddNodeToIdle {node} {
        if {[info exists IdleQueueArr($node)]} { return }
        lappend IdleQueue $node
        set IdleQueueArr($node) 1

        if {$AfterId eq ""} {
            set AfterId [after idle [mymethod UpdateIdle]]
        }
    }
























    method UpdateIdle {} {
        set AfterId ""

        if {[llength $IdleQueue] > 0} {
            set node [lindex $IdleQueue 0]
            set IdleQueue [lrange $IdleQueue 1 end]
            unset IdleQueueArr($node)

            $self UpdateDirNode $node
        }

        if {[llength $IdleQueue] > 0} {
            set AfterId [after idle [mymethod UpdateIdle]]
        }
    }

    method UpdateDirNode {node} {
        if {[$tree set $node type] ne "directory"} {
            return
        }
        if {[$tree set $node status] ne "empty"} {
            puts "Dir [$tree set $node leftfull] already done"
            return
        }
        $tree delete [$tree children $node]

        set leftfull [$tree set $node leftfull]
        set leftall [lsort -dictionary [glob -nocomplain -dir $leftfull *]]
        foreach f $leftall {
            set type [file type $f]
            set id [$tree insert $node end -text [file tail $f] \
                    -values [list $type unknown $f [file tail $f] 0 0 $f [file tail $f] 0 0]]
            if {$type eq "directory"} {
                ## Make it so that this node is openable
                $tree set $id status empty
                $tree insert $id 0 -text dummy ;# a dummy
                $tree item $id -text [file tail $f]/
                $self AddNodeToIdle $id
            }
        }

        $tree set $node status unknown
        $tree set $node leftfull
        $tree set $node leftname
        $tree set $node rightfull
        $tree set $node rightname
    }
}

proc makeWin {} {



    set w [DirCompare .f -leftdir $::dirdiff(leftDir) -rightdir $::dirdiff(rightDir)]






































    pack $w -fill both -expand 1




}

makeWin