aboutsummaryrefslogtreecommitdiff
path: root/pd/tcl/scrollboxwindow.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'pd/tcl/scrollboxwindow.tcl')
-rw-r--r--pd/tcl/scrollboxwindow.tcl94
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
+}
+
+