diff options
Diffstat (limited to 'pd/tcl/scrollboxwindow.tcl')
-rw-r--r-- | pd/tcl/scrollboxwindow.tcl | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/pd/tcl/scrollboxwindow.tcl b/pd/tcl/scrollboxwindow.tcl new file mode 100644 index 00000000..d78622c6 --- /dev/null +++ b/pd/tcl/scrollboxwindow.tcl @@ -0,0 +1,94 @@ + +####### scrollboxwindow -- scrollbox window with default bindings ######### +## This is the base dialog behind the Path and Startup dialogs +## This namespace specifies everything the two dialogs have in common, +## with arguments specifying the differences +## +## By default, this creates a dialog centered on the viewing area of the screen +## with cancel, apply, and OK buttons +## which contains a scrollbox widget populated with the given data + +package provide scrollboxwindow 0.1 + +package require scrollbox + +namespace eval scrollboxwindow { +} + + +proc ::scrollboxwindow::get_listdata {mytoplevel} { + return [$mytoplevel.listbox.box get 0 end] +} + +proc ::scrollboxwindow::do_apply {mytoplevel commit_method listdata} { + $commit_method [pdtk_encode $listdata] + pdsend "pd save-preferences" +} + +# Cancel button action +proc ::scrollboxwindow::cancel {mytoplevel} { + pdsend "$mytoplevel cancel" +} + +# Apply button action +proc ::scrollboxwindow::apply {mytoplevel commit_method } { + do_apply $mytoplevel $commit_method [get_listdata $mytoplevel] +} + +# OK button action +# The "commit" action can take a second or more, +# long enough to be noticeable, so we only write +# the changes after closing the dialog +proc ::scrollboxwindow::ok {mytoplevel commit_method } { + set listdata [get_listdata $mytoplevel] + cancel $mytoplevel + do_apply $mytoplevel $commit_method $listdata +} + +# "Constructor" function for building the window +# id -- the window id to use +# listdata -- the data used to populate the scrollbox +# add_method -- a reference to a proc to be called when the user adds a new item +# edit_method -- same as above, for editing and existing item +# commit_method -- same as above, to commit during the "apply" action +# title -- top-level title for the dialog +# width, height -- initial width and height dimensions for the window, also minimum size +proc ::scrollboxwindow::make {mytoplevel listdata add_method edit_method commit_method title width height } { + wm deiconify .pdwindow + raise .pdwindow + toplevel $mytoplevel -class DialogWindow + wm title $mytoplevel $title + wm group $mytoplevel . + wm transient $mytoplevel .pdwindow + wm protocol $mytoplevel WM_DELETE_WINDOW "::scrollboxwindow::cancel $mytoplevel" + + # Enforce a minimum size for the window + wm minsize $mytoplevel $width $height + + # Set the current dimensions of the window + wm geometry $mytoplevel "${width}x${height}" + + # Add the scrollbox widget + ::scrollbox::make $mytoplevel $listdata $add_method $edit_method + + # Use two frames for the buttons, since we want them both + # bottom and right + frame $mytoplevel.nb + pack $mytoplevel.nb -side bottom -fill x -pady 2m + + frame $mytoplevel.nb.buttonframe + pack $mytoplevel.nb.buttonframe -side right -padx 2m + + button $mytoplevel.nb.buttonframe.cancel -text [_ "Cancel"]\ + -command "::scrollboxwindow::cancel $mytoplevel" + button $mytoplevel.nb.buttonframe.apply -text [_ "Apply"]\ + -command "::scrollboxwindow::apply $mytoplevel $commit_method" + button $mytoplevel.nb.buttonframe.ok -text [_ "OK"]\ + -command "::scrollboxwindow::ok $mytoplevel $commit_method" + + pack $mytoplevel.nb.buttonframe.cancel -side left -expand 1 -padx 2m + pack $mytoplevel.nb.buttonframe.apply -side left -expand 1 -padx 2m + pack $mytoplevel.nb.buttonframe.ok -side left -expand 1 -padx 2m +} + + |