aboutsummaryrefslogtreecommitdiff
path: root/file_associations-plugin.tcl
blob: b44e162fe75fa3ccb6d4aa71179c6781e8581f66 (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
# this is a plugin for Pd 0.43 that adds the ability to associate Pd patches
# with filetypes like .wav, .ogg, etc.

package provide file_associations 0.1

namespace eval ::file_associations:: {
    namespace export pdtk_post
}

proc ::file_associations::load_file_associations {} {
    set ::associationsdir "[pwd]/../associations"
    # TODO this should search the whole path for 'associations' in order to
    # support user-installed associations, not only included ones
    puts stderr "find_file_associations $::associationsdir"
    if { ! [file isdirectory $::associationsdir]} { return }
    foreach filename [glob -directory $::associationsdir -nocomplain -types {f} -- *.pd] {
        set extension [file rootname [file tail $filename]]
        puts "\tAssociating $filename to $extension"
        lset ::filetypes 0 1 [concat [lindex $::filetypes 0 1] ".$extension"]
        set ::filetypes [lappend ::filetypes \
                             [list "[string toupper $extension] files" ".$extension"]]
    }
}

proc ::file_associations::menu_open {} {
    pdtk_post "using menu_open from file_associations.tcl"
    if { ! [file isdirectory $::pd_menucommands::menu_open_dir]} {
        set ::pd_menucommands::menu_open_dir $::env(HOME)
    }
    set files [tk_getOpenFile -defaultextension .pd \
                       -multiple true \
                       -filetypes $::filetypes \
                       -initialdir $::pd_menucommands::menu_open_dir]
    if {$files ne ""} {
        foreach filename $files {
            set extension [lindex [split $filename .] end]
            if {$extension == "pd"} {
                puts "open_file $filename"
                open_file $filename
            } else {
                set assocpatchfile [open [file join $::associationsdir "$extension.pd"]]
                set patchcontents [regsub -all -- "\\\$FILENAME" [read $assocpatchfile] $filename]
                close $assocpatchfile
                pdsend "pd filename [file tail $filename].pd \
                            [enquote_path $::pd_menucommands::menu_open_dir]"
                pdsend $patchcontents
                pdsend "#X pop 1"
            }
        }
        set ::pd_menucommands::menu_open_dir [file dirname $filename]
    }
}

#::file_associations::load_file_associations
# TODO insert code to override built-in menu_open proc