diff options
Diffstat (limited to 'pd/tcl/pd_menus.tcl')
-rw-r--r-- | pd/tcl/pd_menus.tcl | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/pd/tcl/pd_menus.tcl b/pd/tcl/pd_menus.tcl new file mode 100644 index 00000000..f8dc2469 --- /dev/null +++ b/pd/tcl/pd_menus.tcl @@ -0,0 +1,355 @@ +# Copyright (c) 1997-2009 Miller Puckette. +#(c) 2008 WordTech Communications LLC. License: standard Tcl license, http://www.tcl.tk/software/tcltk/license.html + +package provide pd_menus 0.1 + +package require pd_menucommands +package require Tk +#package require tile +## replace Tk widgets with Ttk widgets on 8.5 +#namespace import -force ttk::* + +# TODO figure out Undo/Redo/Cut/Copy/Paste/DSP state changes for menus +# TODO figure out parent window/window list for Window menu +# TODO what is the Tcl package constructor or init()? + + + +# ------------------------------------------------------------------------------ +# global variables + +# TODO this should properly be inside the pd_menus namespace, now it is global +namespace import ::pd_menucommands::* + +namespace eval ::pd_menus:: { + variable accelerator + + namespace export create_menubar + namespace export configure_pdwindow + + # turn off tearoff menus globally + option add *tearOff 0 +} + +# ------------------------------------------------------------------------------ +# +proc ::pd_menus::create_menubar {mymenubar mytoplevel} { + variable accelerator + if {$::windowingsystem eq "aqua"} { + set accelerator "Cmd" + } else { + set accelerator "Ctrl" + } + menu $mymenubar + set menulist "file edit put find media window help" + if { $::windowingsystem eq "aqua" } {create_apple_menu $mymenubar} +#TODO figure out why this took my menubars out? -msp +# if { $::windowingsystem eq "win32" } {create_system_menu $mymenubar} + foreach mymenu $menulist { + menu $mymenubar.$mymenu + $mymenubar add cascade -label [_ [string totitle $mymenu]] \ + -menu $mymenubar.$mymenu + [format build_%s_menu $mymenu] $mymenubar.$mymenu $mytoplevel + if {$::windowingsystem eq "win32"} { + # fix menu font size on Windows with tk scaling = 1 + $mymenubar.$mymenu configure -font menufont + } + } +} + +proc ::pd_menus::configure_pdwindow {mymenubar} { + # these are meaningless for the Pd window, so disable them + set file_items_to_disable {"Save" "Save As..." "Print..." "Close"} + foreach menuitem $file_items_to_disable { + $mymenubar.file entryconfigure [_ $menuitem] -state disabled + } + set edit_items_to_disable {"Undo" "Redo" "Duplicate" "Tidy Up" "Edit Mode"} + foreach menuitem $edit_items_to_disable { + $mymenubar.edit entryconfigure [_ $menuitem] -state disabled + } + # disable everything on the Put menu + for {set i 0} {$i <= [$mymenubar.put index end]} {incr i} { + # catch errors by trying to disable separators + catch {$mymenubar.put entryconfigure $i -state disabled } + } +} + +# ------------------------------------------------------------------------------ +# menu building functions +proc ::pd_menus::build_file_menu {mymenu mytoplevel} { + [format build_file_menu_%s $::windowingsystem] $mymenu + $mymenu entryconfigure [_ "New"] -command "menu_new" + $mymenu entryconfigure [_ "Open"] -command "menu_open" + $mymenu entryconfigure [_ "Save"] -command "pdsend \"$mytoplevel menusave\"" + $mymenu entryconfigure [_ "Save As..."] -command "pdsend \"$mytoplevel menusaveas\"" + # $mymenu entryconfigure "Revert*" -command "menu_revert $mytoplevel" + $mymenu entryconfigure [_ "Close"] -command "pdsend \"$mytoplevel menuclose 0\"" + $mymenu entryconfigure [_ "Message"] -command "menu_message_panel" + $mymenu entryconfigure [_ "Print..."] -command "menu_print $mytoplevel" +} + +proc ::pd_menus::build_edit_menu {mymenu mytoplevel} { + variable accelerator + $mymenu add command -label [_ "Undo"] -accelerator "$accelerator+Z" \ + -command "menu_undo $mytoplevel" + $mymenu add command -label [_ "Redo"] -accelerator "Shift+$accelerator+Z" \ + -command "menu_redo $mytoplevel" + $mymenu add separator + $mymenu add command -label [_ "Cut"] -accelerator "$accelerator+X" \ + -command "pdsend \"$mytoplevel cut\"" + $mymenu add command -label [_ "Copy"] -accelerator "$accelerator+C" \ + -command "pdsend \"$mytoplevel copy\"" + $mymenu add command -label [_ "Paste"] -accelerator "$accelerator+V" \ + -command "pdsend \"$mytoplevel paste\"" + $mymenu add command -label [_ "Duplicate"] -accelerator "$accelerator+D" \ + -command "pdsend \"$mytoplevel duplicate\"" + $mymenu add command -label [_ "Select All"] -accelerator "$accelerator+A" \ + -command "pdsend \"$mytoplevel selectall\"" + $mymenu add separator + if {$::windowingsystem eq "aqua"} { + $mymenu add command -label [_ "Text Editor"] \ + -command "menu_texteditor $mytoplevel" + $mymenu add command -label [_ "Font"] -accelerator "$accelerator+T" \ + -command "menu_dialog_font $mytoplevel" + } else { + $mymenu add command -label [_ "Text Editor"] -accelerator "$accelerator+T"\ + -command "menu_texteditor $mytoplevel" + $mymenu add command -label [_ "Font"] \ + -command "menu_dialog_font $mytoplevel" + } + $mymenu add command -label [_ "Tidy Up"] \ + -command "pdsend \"$mytoplevel tidy\"" + # $mymenu add command -label [_ "Toggle Console"] -accelerator "Shift+$accelerator+R" \ + # -command {.controls.switches.console invoke} + # $mymenu add command -label [_ "Clear Console"] -accelerator "Shift+$accelerator+L" \ + # -command "menu_clear_console" + $mymenu add separator + $mymenu add radiobutton -label [_ "Edit Mode"] -accelerator "$accelerator+E" \ + -indicatoron true -selectcolor grey85 \ + -command "pdsend \"$mytoplevel editmode 0\"" + # if { $editable == 0 } { + # $mymenu entryconfigure "Edit Mode" -indicatoron false + # } + + #if { ! [catch {console hide}]} { + # TODO set up menu item to show/hide the Tcl/Tk console, if it available + #} + + if {$::windowingsystem ne "aqua"} { + $mymenu add separator + $mymenu add command -label [_ "Path..."] \ + -command "menu_path_panel" + $mymenu add command -label [_ "Startup..."] \ + -command "menu_startup_panel" + } +} + +proc ::pd_menus::build_put_menu {mymenu mytoplevel} { + variable accelerator + $mymenu add command -label [_ "Object"] -accelerator "$accelerator+1" \ + -command "pdsend \"$mytoplevel obj 0\"" + $mymenu add command -label [_ "Message"] -accelerator "$accelerator+2" \ + -command "pdsend \"$mytoplevel msg 0\"" + $mymenu add command -label [_ "Number"] -accelerator "$accelerator+3" \ + -command "pdsend \"$mytoplevel floatatom 0\"" + $mymenu add command -label [_ "Symbol"] -accelerator "$accelerator+4" \ + -command "pdsend \"$mytoplevel symbolatom 0\"" + $mymenu add command -label [_ "Comment"] -accelerator "$accelerator+5" \ + -command "pdsend \"$mytoplevel text 0\"" + $mymenu add separator + $mymenu add command -label [_ "Bang"] -accelerator "Shift+$accelerator+B" \ + -command "pdsend \"$mytoplevel bng 0\"" + $mymenu add command -label [_ "Toggle"] -accelerator "Shift+$accelerator+T" \ + -command "pdsend \"$mytoplevel toggle 0\"" + $mymenu add command -label [_ "Number2"] -accelerator "Shift+$accelerator+N" \ + -command "pdsend \"$mytoplevel numbox 0\"" + $mymenu add command -label [_ "Vslider"] -accelerator "Shift+$accelerator+V" \ + -command "pdsend \"$mytoplevel vslider 0\"" + $mymenu add command -label [_ "Hslider"] -accelerator "Shift+$accelerator+H" \ + -command "pdsend \"$mytoplevel hslider 0\"" + $mymenu add command -label [_ "Vradio"] -accelerator "Shift+$accelerator+D" \ + -command "pdsend \"$mytoplevel vradio 0\"" + $mymenu add command -label [_ "Hradio"] -accelerator "Shift+$accelerator+I" \ + -command "pdsend \"$mytoplevel hradio 0\"" + $mymenu add command -label [_ "VU Meter"] -accelerator "Shift+$accelerator+U"\ + -command "pdsend \"$mytoplevel vumeter 0\"" + $mymenu add command -label [_ "Canvas"] -accelerator "Shift+$accelerator+C" \ + -command "pdsend \"$mytoplevel mycnv 0\"" + $mymenu add separator + $mymenu add command -label Graph -command "pdsend \"$mytoplevel graph\"" + $mymenu add command -label Array -command "pdsend \"$mytoplevel menuarray\"" +} + +proc ::pd_menus::build_find_menu {mymenu mytoplevel} { + variable accelerator + $mymenu add command -label [_ "Find..."] -accelerator "$accelerator+F" \ + -command "::dialog_find::menu_dialog_find $mytoplevel" + $mymenu add command -label [_ "Find Again"] -accelerator "$accelerator+G" \ + -command "pdsend \"$mytoplevel findagain\"" + $mymenu add command -label [_ "Find Last Error"] \ + -command "pdsend \"$mytoplevel finderror\"" +} + +proc ::pd_menus::build_media_menu {mymenu mytoplevel} { + variable accelerator + $mymenu add radiobutton -label [_ "Audio ON"] -accelerator "$accelerator+/" \ + -command "pdsend \"pd dsp 1\"" + $mymenu add radiobutton -label [_ "Audio OFF"] -accelerator "$accelerator+." \ + -command "pdsend \"pd dsp 0\"" -indicatoron true + $mymenu add separator + $mymenu add command -label [_ "Audio settings..."] \ + -command "pdsend \"pd audio-properties\"" + $mymenu add command -label [_ "MIDI settings..."] \ + -command "pdsend \"pd midi-properties\"" + $mymenu add separator + $mymenu add command -label [_ "Test Audio and MIDI..."] \ + -command "menu_doc_open doc/7.stuff/tools testtone.pd" + $mymenu add command -label [_ "Load Meter"] \ + -command "menu_doc_open doc/7.stuff/tools load-meter.pd" +} + +proc ::pd_menus::build_window_menu {mymenu mytoplevel} { + variable accelerator + if {$::windowingsystem eq "aqua"} { + $mymenu add command -label [_ "Minimize"] -command "menu_minimize ." \ + -accelerator "$accelerator+M" + $mymenu add command -label [_ "Zoom"] -command "menu_zoom ." + $mymenu add separator + } + $mymenu add command -label [_ "Parent Window"] \ + -command "pdsend \"$mytoplevel findparent\"" + $mymenu add command -label [_ "Pd window"] -command "menu_raise_pdwindow" \ + -accelerator "$accelerator+R" + $mymenu add separator + if {$::windowingsystem eq "aqua"} { + $mymenu add command -label [_ "Bring All to Front"] \ + -command "menu_bringalltofront" + $mymenu add separator + } +} + +proc ::pd_menus::build_help_menu {mymenu mytoplevel} { + if {$::windowingsystem ne "aqua"} { + $mymenu add command -label {About Pd} \ + -command "placeholder menu_doc_open doc/1.manual 1.introduction.txt" + } + $mymenu add command -label {HTML ...} \ + -command "placeholder menu_doc_open doc/1.manual index.htm" + $mymenu add command -label {Browser ...} \ + -command "placeholder menu_helpbrowser \$help_top_directory" +} + +# ------------------------------------------------------------------------------ +# menu building functions for Mac OS X/aqua + +# for Mac OS X only +proc ::pd_menus::create_apple_menu {mymenu} { + puts stderr BUILD_APPLE_MENU + # TODO this should open a Pd patch called about.pd + menu $mymenu.apple + $mymenu.apple add command -label [_ "About Pd"] \ + -command "menu_doc_open doc/1.manual 1.introduction.txt" + $mymenu add cascade -label "Apple" -menu $mymenu.apple + $mymenu.apple add separator + # starting in 8.4.14, this is created automatically + set patchlevel [split [info patchlevel] .] + if {[lindex $patchlevel 1] < 5 && [lindex $patchlevel 2] < 14} { + $mymenu.apple add command -label [_ "Preferences..."] \ + -command "menu_preferences_panel" -accelerator "Cmd+," + } +} + +proc ::pd_menus::build_file_menu_aqua {mymenu} { + variable accelerator + $mymenu add command -label [_ "New"] -accelerator "$accelerator+N" + $mymenu add command -label [_ "Open"] -accelerator "$accelerator+O" + $mymenu add cascade -label [_ "Open Recent"] + $mymenu add separator + $mymenu add command -label [_ "Close"] -accelerator "$accelerator+W" + $mymenu add command -label [_ "Save"] -accelerator "$accelerator+S" + $mymenu add command -label [_ "Save As..."] -accelerator "$accelerator+Shift+S" + #$mymenu add command -label [_ "Save All"] + #$mymenu add command -label [_ "Revert to Saved"] + $mymenu add separator + $mymenu add command -label [_ "Message"] + $mymenu add separator + $mymenu add command -label [_ "Print..."] -accelerator "$accelerator+P" +} + +# the "Edit", "Put", and "Find" menus do not have cross-platform differences + +proc ::pd_menus::build_media_menu_aqua {mymenu} { +} + +proc ::pd_menus::build_window_menu_aqua {mymenu} { +} + +# the "Help" does not have cross-platform differences + +# ------------------------------------------------------------------------------ +# menu building functions for UNIX/X11 + +proc ::pd_menus::build_file_menu_x11 {mymenu} { + variable accelerator + $mymenu add command -label [_ "New"] -accelerator "$accelerator+N" + $mymenu add command -label [_ "Open"] -accelerator "$accelerator+O" + $mymenu add separator + $mymenu add command -label [_ "Save"] -accelerator "$accelerator+S" + $mymenu add command -label [_ "Save As..."] -accelerator "Shift+$accelerator+S" + # $mymenu add command -label "Revert" + $mymenu add separator + $mymenu add command -label [_ "Message"] -accelerator "$accelerator+M" + $mymenu add command -label [_ "Print..."] -accelerator "$accelerator+P" + $mymenu add separator + $mymenu add command -label [_ "Close"] -accelerator "$accelerator+W" + $mymenu add command -label [_ "Quit"] -accelerator "$accelerator+Q" \ + -command "pdsend \"pd verifyquit\"" +} + +# the "Edit", "Put", and "Find" menus do not have cross-platform differences + +proc ::pd_menus::build_media_menu_x11 {mymenu} { +} + +proc ::pd_menus::build_window_menu_x11 {mymenu} { +} + +# the "Help" does not have cross-platform differences + +# ------------------------------------------------------------------------------ +# menu building functions for Windows/Win32 + +# for Windows only +proc ::pd_menus::create_system_menu {mymenu} { + $mymenu add cascade -menu [menu $mymenu.system] + # TODO add Close, Minimize, etc and whatever else is on the little menu + # that is on the top left corner of the window frame +} + +proc ::pd_menus::build_file_menu_win32 {mymenu} { + variable accelerator + $mymenu add command -label [_ "New"] -accelerator "$accelerator+N" + $mymenu add command -label [_ "Open"] -accelerator "$accelerator+O" + $mymenu add separator + $mymenu add command -label [_ "Save"] -accelerator "$accelerator+S" + $mymenu add command -label [_ "Save As..."] -accelerator "Shift+$accelerator+S" + # $mymenu add command -label "Revert" + $mymenu add separator + $mymenu add command -label [_ "Message"] -accelerator "$accelerator+M" + $mymenu add command -label [_ "Print..."] -accelerator "$accelerator+P" + $mymenu add separator + $mymenu add command -label [_ "Close"] -accelerator "$accelerator+W" + $mymenu add command -label [_ "Quit"] -accelerator "$accelerator+Q"\ + -command "pdsend \"pd verifyquit\"" +} + +# the "Edit", "Put", and "Find" menus do not have cross-platform differences + +proc ::pd_menus::build_media_menu_win32 {mymenu} { +} + +proc ::pd_menus::build_window_menu_win32 {mymenu} { +} + +# the "Help" does not have cross-platform differences + |