2003-12-21 VI A weekend project to get my daughter started on programming. She loves drawing, so this is something for her to play around with, on a Tk Canvas.
Edit in text box, then press Ctrl-R to run. Other file menu items are hopefully obvious.
2003-12-24 VI Fixed some problems on Save and added coordinate display in status bar
# Gidrw. by Venkat Iyer. Tcl License # Version 1.1 package require Tk package require BWidget namespace eval ::gidrw {} proc ::gidrw::run {} { .c delete all .c configure -background white uplevel #0 [.t get 1.0 end] } proc ::gidrw::save {{new 0}} { set types { {{gidrw format} {.gid}} {{all files} {*}} } if {$::gidrw::filename == "" || $new == 1} { set fn [tk_getSaveFile -title "Save GIDRW File" \ -filetypes $types -defaultextension gid] if {$fn == ""} return set ::gidrw::filename $fn wm title . [file nativename $::gidrw::filename] } set t [string trim [.t get 1.0 end]] set fo [::open $::gidrw::filename w] puts -nonewline $fo $t close $fo set ::gidrw::s $t } proc ::gidrw::checksaved {} { set t [string trim [.t get 1.0 end]] if {$t == ""} {return 1} if {$t != $::gidrw::s} { set answer [tk_messageBox \ -message "Do you want to save changes?" \ -type yesnocancel -icon warning -default yes] switch $answer { yes { return ::gidrw::save} no { return 1 } cancel { return 0 } } } return 1 } proc ::gidrw::new {} { ::gidrw::checksaved set ::gidrw::filename "" .t delete 1.0 end ::gidrw::run } proc ::gidrw::open {} { if ![::gidrw::checksaved] return set types { {{gidrw format} {.gid}} {{all files} {*}} } set fn [tk_getOpenFile -title "Open GIDRW File" \ -filetypes $types -defaultextension gid] if {$fn == "" } return set ::gidrw::filename $fn wm title . [file nativename $::gidrw::filename] .t delete 1.0 end set fi [::open $fn] set ::gidrw::s [string trim [read $fi]] close $fi .t insert end $::gidrw::s ::gidrw::run } proc ::gidrw::build_gui {} { MainFrame .main -menu { &File {} {} 0 { {command "&Open" {} "Open Existing gidrw file" {Ctrl o} -command ::gidrw::open } {command "&Save" {} "Save gidrw File" {Ctrl s} -command ::gidrw::save } {command "Save &As" {} "Save under a different name" {Ctrl a} -command "::gidrw::save 1" } {command "&New" {} "Start with a new blank gidrw" {Ctrl n} -command ::gidrw::new } {command "E&xit" {} "Exit gidrw" {Alt x} -command {if [::gidrw::checksaved] exit} } {command "&Run" {} "Run Program" {Ctrl r} -command ::gidrw::run } } } pack .main -expand 1 -fill both .main addindicator -width 10 -textvariable ::xy PanedWindow .pane -side left -pad 0 pack .pane -in [.main getframe] -expand 1 -fill both .pane add ScrolledWindow .cw -auto both -scrollbar both pack .cw -in [.pane getframe 0] -expand 1 -fill both -side top canvas .c -width 750 -height 400 -scrollregion {0 0 750 400} .cw setwidget .c .pane add ScrolledWindow .sw -auto both -scrollbar both pack .sw -in [.pane getframe 1] -expand 1 -fill both -side top text .t -height 4 .sw setwidget .t bind .c <Motion> {set ::xy "%X,%Y"} } ::gidrw::build_gui ::gidrw::new