(This is my first page on the Wiki, so please forgive me if I make some mistake.)
I'm experimenting in Tcl/Tk some ui concepts often found in applications out there. The one I'm showing you this time is what I called "in place edit": a (sort of) widget linked to another one which you can use to change a value of the latter without opening dialog boxes. To be practical, this could be a sample use of the IPE (In Place Edit):
Please note that this is a (simple) experiment and not production ready code. Moreover, I'm testing the code on Linux and fixing it for that system (however, it seems to work on Windows, too).
First, let's see some pictures of the code in action!
Here, I change the text of a label, by double-clicking on it, editing it, and finally hitting Enter.
Here, I do the same with a button, but double-right-clicking on it!
Finally, let's see how the code works with toplevel captions too (by double-clicking on the toplevel empty area):
Now, this is the code I used: it contains both the code for the IPE and that for the usage samples.
namespace eval ipe { variable ipe variable tl variable tlbtnbind variable outvar } proc ipe::init {} { variable ipe set ipe [toplevel .ipe] wm withdraw $ipe wm protocol $ipe WM_DELETE_WINDOW ipe::hide wm attributes .ipe -topmost 1 wm overrideredirect .ipe 1 ttk::frame $ipe.f pack $ipe.f ttk::entry $ipe.f.e pack $ipe.f.e bind $ipe.f.e <Return> [list ipe::hide 1] bind $ipe.f.e <Escape> ipe::hide bind $ipe.f <FocusOut> ipe::hide } proc ipe::hide {{store 0}} { variable ipe variable outvar variable tl variable tlbtnbind bind $tl <Button> $tlbtnbind wm withdraw $ipe if { $store } { uplevel #0 set $outvar [list [$ipe.f.e get]] } } proc ipe::show {w txt outName} { variable ipe variable tl variable tlbtnbind variable outvar set outvar $outName set tl [winfo toplevel $w] set tlbtnbind [bind $tl <Button>] bind $tl <Button> ipe::hide $ipe.f.e delete 0 end $ipe.f.e insert 0 $txt wm deiconify $ipe wm geometry $ipe =+[winfo rootx $w]+[winfo rooty $w] focus $ipe.f.e } # # Samples # ttk::style theme use clam set labelvar "Testo" ttk::label .l -textvar labelvar pack .l set buttonvar "Pulsante" ttk::button .b -textvariable buttonvar pack .b ttk::entry .e pack .e proc tlcaption {name null op} { upvar #0 $name tlvar wm title .t $tlvar } toplevel .t trace add variable tlvar write tlcaption set tlvar "Finestra" ipe::init bind .l <Double-1> {ipe::show %W $labelvar labelvar; break} bind .b <Double-3> {ipe::show %W $buttonvar buttonvar; break} bind .t <Double-1> {ipe::show %W $tlvar tlvar; break}
The code above is really straightforward; I'm using Ttk widgets, but it seems to work with old fashioned Tk widgets, too.
(I posted a longer article about this experiment on my just created blog; you can also go there, if you like, but it is in italian: http://freeasinfreedom.altervista.org )