lms-video/tcl/pd_menucommands.tcl
Santi Noreña e85d191b46 - Reestructuración de ficheros y directorios general
- merge v0.01 --> Añadido fileselector
- Añadidas fuentes de Gem y Pure Data
- pix2jpg incluído en Gem. Archivos de construcción de Gem modificados.
- Añadido fichero ompiling.txt con instrucciones de compilación
2013-02-04 18:00:17 +01:00

278 lines
9.2 KiB
Tcl

package provide pd_menucommands 0.1
namespace eval ::pd_menucommands:: {
variable untitled_number "1"
namespace export menu_*
}
# ------------------------------------------------------------------------------
# functions called from File menu
proc ::pd_menucommands::menu_new {} {
variable untitled_number
if { ! [file isdirectory $::filenewdir]} {set ::filenewdir $::env(HOME)}
# to localize "Untitled" there will need to be changes in g_canvas.c and
# g_readwrite.c, where it tests for the string "Untitled"
set untitled_name "Untitled"
pdsend "pd menunew $untitled_name-$untitled_number [enquote_path $::filenewdir]"
incr untitled_number
}
proc ::pd_menucommands::menu_open {} {
if { ! [file isdirectory $::fileopendir]} {set ::fileopendir $::env(HOME)}
set files [tk_getOpenFile -defaultextension .pd \
-multiple true \
-filetypes $::filetypes \
-initialdir $::fileopendir]
if {$files ne ""} {
foreach filename $files {
open_file $filename
}
set ::fileopendir [file dirname $filename]
}
}
proc ::pd_menucommands::menu_print {mytoplevel} {
set filename [tk_getSaveFile -initialfile pd.ps \
-defaultextension .ps \
-filetypes { {{postscript} {.ps}} }]
if {$filename ne ""} {
set tkcanvas [tkcanvas_name $mytoplevel]
$tkcanvas postscript -file $filename
}
}
# ------------------------------------------------------------------------------
# functions called from Edit menu
proc ::pd_menucommands::menu_undo {} {
if {$::focused_window eq $::undo_toplevel && $::undo_action ne "no"} {
pdsend "$::focused_window undo"
}
}
proc ::pd_menucommands::menu_redo {} {
if {$::focused_window eq $::undo_toplevel && $::redo_action ne "no"} {
pdsend "$::focused_window redo"
}
}
proc ::pd_menucommands::menu_editmode {state} {
if {[winfo class $::focused_window] ne "PatchWindow"} {return}
set ::editmode_button $state
# this shouldn't be necessary because 'pd' will reply with pdtk_canvas_editmode
# set ::editmode($::focused_window) $state
pdsend "$::focused_window editmode $state"
}
proc ::pd_menucommands::menu_toggle_editmode {} {
menu_editmode [expr {! $::editmode_button}]
}
# ------------------------------------------------------------------------------
# generic procs for sending menu events
# send a message to a pd canvas receiver
proc ::pd_menucommands::menu_send {window message} {
set mytoplevel [winfo toplevel $window]
if {[winfo class $mytoplevel] eq "PatchWindow"} {
pdsend "$mytoplevel $message"
} elseif {$mytoplevel eq ".pdwindow"} {
if {$message eq "copy"} {
tk_textCopy .pdwindow.text
} elseif {$message eq "selectall"} {
.pdwindow.text tag add sel 1.0 end
} elseif {$message eq "menusaveas"} {
::pdwindow::save_logbuffer_to_file
}
}
}
# send a message to a pd canvas receiver with a float arg
proc ::pd_menucommands::menu_send_float {window message float} {
set mytoplevel [winfo toplevel $window]
if {[winfo class $mytoplevel] eq "PatchWindow"} {
pdsend "$mytoplevel $message $float"
}
}
# ------------------------------------------------------------------------------
# open the dialog panels
proc ::pd_menucommands::menu_message_dialog {} {
::dialog_message::open_message_dialog $::focused_window
}
proc ::pd_menucommands::menu_find_dialog {} {
::dialog_find::open_find_dialog $::focused_window
}
proc ::pd_menucommands::menu_font_dialog {} {
if {[winfo exists .font]} {
raise .font
} elseif {$::focused_window eq ".pdwindow"} {
pdtk_canvas_dofont .pdwindow [lindex [.pdwindow.text cget -font] 1]
} else {
pdsend "$::focused_window menufont"
}
}
proc ::pd_menucommands::menu_path_dialog {} {
if {[winfo exists .path]} {
raise .path
} else {
pdsend "pd start-path-dialog"
}
}
proc ::pd_menucommands::menu_startup_dialog {} {
if {[winfo exists .startup]} {
raise .startup
} else {
pdsend "pd start-startup-dialog"
}
}
proc ::pd_menucommands::menu_helpbrowser {} {
::helpbrowser::open_helpbrowser
}
proc ::pd_menucommands::menu_texteditor {} {
::pdwindow::error "the text editor is not implemented"
}
# ------------------------------------------------------------------------------
# window management functions
proc ::pd_menucommands::menu_minimize {window} {
wm iconify [winfo toplevel $window]
}
proc ::pd_menucommands::menu_maximize {window} {
wm state [winfo toplevel $window] zoomed
}
proc ::pd_menucommands::menu_raise_pdwindow {} {
if {$::focused_window eq ".pdwindow" && [winfo viewable .pdwindow]} {
lower .pdwindow
} else {
wm deiconify .pdwindow
raise .pdwindow
}
}
# used for cycling thru windows of an app
proc ::pd_menucommands::menu_raisepreviouswindow {} {
lower [lindex [wm stackorder .] end] [lindex [wm stackorder .] 0]
focus [lindex [wm stackorder .] end]
}
# used for cycling thru windows of an app the other direction
proc ::pd_menucommands::menu_raisenextwindow {} {
set mytoplevel [lindex [wm stackorder .] 0]
raise $mytoplevel
focus $mytoplevel
}
# ------------------------------------------------------------------------------
# Pd window functions
proc menu_clear_console {} {
::pdwindow::clear_console
}
# ------------------------------------------------------------------------------
# manage the saving of the directories for the new commands
# this gets the dir from the path of a window's title
proc ::pd_menucommands::set_filenewdir {mytoplevel} {
# TODO add Aqua specifics once g_canvas.c has [wm attributes -titlepath]
if {$mytoplevel eq ".pdwindow"} {
set ::filenewdir $::fileopendir
} else {
regexp -- ".+ - (.+)" [wm title $mytoplevel] ignored ::filenewdir
}
}
# parse the textfile for the About Pd page
proc ::pd_menucommands::menu_aboutpd {} {
set versionstring "Pd $::PD_MAJOR_VERSION.$::PD_MINOR_VERSION.$::PD_BUGFIX_VERSION$::PD_TEST_VERSION"
set filename "$::sys_libdir/doc/1.manual/1.introduction.txt"
if {[winfo exists .aboutpd]} {
wm deiconify .aboutpd
raise .aboutpd
} else {
toplevel .aboutpd -class TextWindow
wm title .aboutpd [_ "About Pd"]
wm group .aboutpd .
.aboutpd configure -menu $::dialog_menubar
text .aboutpd.text -relief flat -borderwidth 0 \
-yscrollcommand ".aboutpd.scroll set" -background white
scrollbar .aboutpd.scroll -command ".aboutpd.text yview"
pack .aboutpd.scroll -side right -fill y
pack .aboutpd.text -side left -fill both -expand 1
bind .aboutpd <$::modifier-Key-w> "wm withdraw .aboutpd"
set textfile [open $filename]
while {![eof $textfile]} {
set bigstring [read $textfile 1000]
regsub -all PD_BASEDIR $bigstring $::sys_guidir bigstring2
regsub -all PD_VERSION $bigstring2 $versionstring bigstring3
.aboutpd.text insert end $bigstring3
}
close $textfile
}
}
# ------------------------------------------------------------------------------
# opening docs as menu items (like the Test Audio and MIDI patch and the manual)
proc ::pd_menucommands::menu_doc_open {dir basename} {
if {[file pathtype $dir] eq "relative"} {
set dirname "$::sys_libdir/$dir"
} else {
set dirname $dir
}
set textextension "[string tolower [file extension $basename]]"
if {[lsearch -exact [lindex $::filetypes 0 1] $textextension] > -1} {
set fullpath [file normalize [file join $dirname $basename]]
set dirname [file dirname $fullpath]
set basename [file tail $fullpath]
pdsend "pd open [enquote_path $basename] [enquote_path $dirname]"
} else {
::pd_menucommands::menu_openfile "$dirname/$basename"
}
}
# open HTML docs from the menu using the OS-default HTML viewer
proc ::pd_menucommands::menu_openfile {filename} {
if {$::tcl_platform(os) eq "Darwin"} {
exec sh -c [format "open '%s'" $filename]
} elseif {$::tcl_platform(platform) eq "windows"} {
exec rundll32 url.dll,FileProtocolHandler [format "%s" $filename] &
} else {
foreach candidate { gnome-open xdg-open sensible-browser iceweasel firefox \
mozilla galeon konqueror netscape lynx } {
set browser [lindex [auto_execok $candidate] 0]
if {[string length $browser] != 0} {
exec -- sh -c [format "%s '%s'" $browser $filename] &
break
}
}
}
}
# ------------------------------------------------------------------------------
# Mac OS X specific functions
proc ::pd_menucommands::menu_bringalltofront {} {
# use [winfo children .] here to include windows that are minimized
foreach item [winfo children .] {
# get all toplevel windows, exclude menubar windows
if { [string equal [winfo toplevel $item] $item] && \
[catch {$item cget -tearoff}]} {
wm deiconify $item
}
}
wm deiconify .
}