-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpdkcalc-plugin.tcl
103 lines (81 loc) · 3.13 KB
/
pdkcalc-plugin.tcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# META pdkcalc/TK prompt plugin
# META DESCRIPTION adds a calculator to the pd window (code mostly lifted from tclprompt by IOhannes zmoelnig and Hans-Christoph Steiner)
# META AUTHOR Derek Kwan
# META VERSION 0.1
package require pdwindow 0.1
namespace eval ::pdkcalc:: {
variable pdkcalcentry {}
variable pdkcalcentry_history {}
variable history_position 0
variable show 1
}
proc ::pdkcalc::eval_pdkcalcentry {} {
variable pdkcalcentry
variable pdkcalcentry_history
variable history_position 0
if {$pdkcalcentry eq ""} {return} ;# no need to do anything if empty
if {[catch {expr $pdkcalcentry} errorname]} {
global errorInfo
::pdwindow::error "pdkcalc: improper input!\n"
} else {
::pdwindow::post "pdkcalc: "
::pdwindow::post [expr $pdkcalcentry]
::pdwindow::post "\n"
}
lappend pdkcalcentry_history $pdkcalcentry
set pdkcalcentry {}
}
proc ::pdkcalc::get_history {direction} {
variable pdkcalcentry_history
variable history_position
incr history_position $direction
if {$history_position < 0} {set history_position 0}
if {$history_position > [llength $pdkcalcentry_history]} {
set history_position [llength $pdkcalcentry_history]
}
.pdwindow.pdkcalc.entry delete 0 end
.pdwindow.pdkcalc.entry insert 0 \
[lindex $pdkcalcentry_history end-[expr $history_position - 1]]
}
#--create pdkcalc entry-----------------------------------------------------------#
proc ::pdkcalc::create {} {
# pdkcalc entry box frame
frame .pdwindow.pdkcalc -borderwidth 0
pack .pdwindow.pdkcalc -side bottom -fill x -before .pdwindow.text
label .pdwindow.pdkcalc.label -text [_ "Calc:"] -anchor e
pack .pdwindow.pdkcalc.label -side left
entry .pdwindow.pdkcalc.entry -width 200 \
-exportselection 1 -insertwidth 2 -insertbackground blue \
-textvariable ::pdkcalc::pdkcalcentry -font {$::font_family -12}
pack .pdwindow.pdkcalc.entry -side left -fill x
# bindings for the pdkcalc entry widget
bind .pdwindow.pdkcalc.entry <$::modifier-Key-a> "%W selection range 0 end; break"
bind .pdwindow.pdkcalc.entry <Return> "::pdkcalc::eval_pdkcalcentry"
bind .pdwindow.pdkcalc.entry <Up> "::pdkcalc::get_history 1"
bind .pdwindow.pdkcalc.entry <Down> "::pdkcalc::get_history -1"
#bind .pdwindow.pdkcalc.entry <KeyRelease> +"::pdkcalc::validate_pdkcalc"
bind .pdwindow.text <Key-Tab> "focus .pdwindow.pdkcalc.entry; break"
# pack .pdwindow.pdkcalc
}
proc ::pdkcalc::destroy {} {
::destroy .pdwindow.pdkcalc
}
set mymenu .menubar.help
$mymenu add separator
$mymenu add check -label [_ "pdkcalc prompt"] -variable ::pdkcalc::show \
-command {::pdkcalc::toggle $::pdkcalc::show}
::pdkcalc::create
puts "built-in pdkcalc"
proc ::pdkcalc::create {} {}
proc ::pdkcalc::destroy {} {
# actually we *can* destroy it, but we cannot re-create it
::pdwindow::error "cannot destroy built-in pdkcalc\n"
}
proc ::pdkcalc::toggle {state} {
if { $state } { ::pdkcalc::create } { ::pdkcalc::destroy }
}
proc ::pdkcalc::test {} {
after 1000 ::pdkcalc::create
::pdkcalc::destroy
}
pdtk_post "loaded pdkcalc-plugin\n"