Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
ceae528b
Kaydet (Commit)
ceae528b
authored
Eki 25, 1990
tarafından
Guido van Rossum
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Generalizations.
üst
f49ef1ca
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
188 additions
and
198 deletions
+188
-198
Buttons.py
Lib/lib-stdwin/Buttons.py
+94
-99
Buttons.py
Lib/stdwin/Buttons.py
+94
-99
No files found.
Lib/lib-stdwin/Buttons.py
Dosyayı görüntüle @
ceae528b
# Module 'Buttons' -- see README
#
# Module functionality is now split in two parts:
# - 'appearance' defines what it looks like
# - 'reactivity' defines how it acts to mouse events
# Module 'Buttons'
# Import module 'rect' renamed as '_rect'
...
...
@@ -20,32 +16,42 @@ _BUTTON = 2
_MASK
=
3
# BaseAppearance provides defaults for all appearance methods.
# In fact it looks like a label.
# LabelAppearance provides defaults for all appearance methods.
# selected state not visible
# disabled --> crossed out
# hilited --> inverted
#
class
Base
Appearance
():
class
Label
Appearance
():
#
# Initialization
#
def
init_appearance
(
self
,
(
win
,
bounds
)):
win
.
change
(
bounds
)
self
.
win
=
win
self
.
bounds
=
bounds
self
.
enabled
=
1
self
.
hilited
=
0
self
.
selected
=
0
self
.
text
=
''
self
.
limbo
=
1
self
.
recalc
()
self
.
win
.
change
(
self
.
bounds
)
# While the limbo flag is set, redraw calls are ignored.
# It is cleared by the first draw event.
# This is intended to avoid duplicate drawing during
# initialization.
#
# Changing the parameters
#
def
settext
(
self
,
text
):
self
.
text
=
text
self
.
recalctextpos
()
self
.
redraw
()
#
def
setbounds
(
self
,
bounds
):
# This elays drawing until after all buttons are moved
# This
d
elays drawing until after all buttons are moved
self
.
win
.
change
(
self
.
bounds
)
self
.
bounds
=
bounds
self
.
recalc
()
self
.
win
.
change
(
bounds
)
#
# Changing the state bits
...
...
@@ -53,25 +59,54 @@ class BaseAppearance():
def
enable
(
self
,
flag
):
if
flag
<>
self
.
enabled
:
self
.
enabled
=
flag
self
.
flipenable
(
self
.
win
.
begindrawing
())
if
not
self
.
limbo
:
self
.
flipenable
(
self
.
win
.
begindrawing
())
#
def
hilite
(
self
,
flag
):
if
flag
<>
self
.
hilited
:
self
.
hilited
=
flag
self
.
fliphilite
(
self
.
win
.
begindrawing
())
if
not
self
.
limbo
:
self
.
fliphilite
(
self
.
win
.
begindrawing
())
#
def
select
(
self
,
flag
):
if
flag
<>
self
.
selected
:
self
.
selected
=
flag
self
.
redraw
()
#
# Recalculate the box bounds and text position.
# This can be overridden by buttons that draw different boxes
# or want their text in a different position.
#
def
recalc
(
self
):
self
.
recalcbounds
()
self
.
recalctextpos
()
#
def
recalcbounds
(
self
):
self
.
hilitebounds
=
_rect
.
inset
(
self
.
bounds
,
(
3
,
3
))
self
.
crossbounds
=
self
.
bounds
#
def
recalctextpos
(
self
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
d
=
self
.
win
.
begindrawing
()
h
=
(
left
+
right
-
d
.
textwidth
(
self
.
text
))
/
2
v
=
(
top
+
bottom
-
d
.
lineheight
())
/
2
self
.
textpos
=
h
,
v
#
# Resize method.
# Override for widgets that take over window geomtry management.
#
def
resize
(
self
):
pass
#
# Generic drawing mechanism.
#
There should be no reason to override redraw() or draw() method
s.
#
Do not override redraw() or draw() methods; override drawit() c.
s.
#
def
redraw
(
self
):
self
.
draw
(
self
.
win
.
begindrawing
(),
self
.
bounds
)
if
not
self
.
limbo
:
self
.
draw
(
self
.
win
.
begindrawing
(),
self
.
bounds
)
#
def
draw
(
self
,
(
d
,
area
)):
self
.
limbo
=
0
area
=
_rect
.
intersect
(
area
,
self
.
bounds
)
if
area
=
_rect
.
empty
:
return
...
...
@@ -83,10 +118,9 @@ class BaseAppearance():
# The drawit() method is fairly generic but may be overridden.
#
def
drawit
(
self
,
d
):
self
.
drawpict
(
d
)
# Box, circle etc.; also 'selected'
self
.
drawpict
(
d
)
if
self
.
text
:
hv
=
self
.
textpos
(
d
)
d
.
text
(
hv
,
self
.
text
)
d
.
text
(
self
.
textpos
,
self
.
text
)
if
not
self
.
enabled
:
self
.
flipenable
(
d
)
if
self
.
hilited
:
...
...
@@ -95,52 +129,15 @@ class BaseAppearance():
# Default drawing detail functions.
# Overriding these is normally sufficient to get different
# appearances.
# No picture; centered text; enable crosses out; hilite inverts.
#
def
drawpict
(
self
,
d
):
pass
#
def
textpos
(
self
,
d
):
# XXX shouldn't this be done once by init/settext()?
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
h
=
(
left
+
right
-
d
.
textwidth
(
self
.
text
))
/
2
v
=
(
top
+
bottom
-
d
.
lineheight
())
/
2
return
h
,
v
#
def
flipenable
(
self
,
d
):
_xorcross
(
d
,
self
.
bounds
)
_xorcross
(
d
,
self
.
cross
bounds
)
#
def
fliphilite
(
self
,
d
):
d
.
invert
(
_rect
.
inset
(
self
.
bounds
,
(
3
,
3
)))
# Subroutine to cross out a rectangle.
#
def
_xorcross
(
d
,
bounds
):
((
left
,
top
),
(
right
,
bottom
))
=
bounds
left
=
left
+
2
right
=
right
-
2
top
=
top
+
2
bottom
=
bottom
-
3
d
.
xorline
(((
left
,
top
),
(
right
,
bottom
)))
d
.
xorline
((
left
,
bottom
),
(
right
,
top
))
# LabelAppearance displays a centered string.
# selected --> underlined
# disabled --> crossed out
# hilited --> inverted
#
class
LabelAppearance
()
=
BaseAppearance
():
#
def
drawpict
(
self
,
d
):
if
self
.
selected
:
# Underline it
d
.
line
((
left
+
1
,
bottom
-
1
),
(
right
-
1
,
bottom
-
1
))
#
if
not
self
.
enabled
:
self
.
_crossout
(
d
)
if
self
.
hilited
:
self
.
_invert
(
d
)
#
d
.
invert
(
self
.
hilitebounds
)
# ButtonAppearance displays a centered string in a box.
...
...
@@ -148,7 +145,7 @@ class LabelAppearance() = BaseAppearance():
# disabled --> crossed out
# hilited --> inverted
#
class
ButtonAppearance
()
=
Base
Appearance
():
class
ButtonAppearance
()
=
Label
Appearance
():
#
def
drawpict
(
self
,
d
):
d
.
box
(
_rect
.
inset
(
self
.
bounds
,
(
1
,
1
)))
...
...
@@ -165,27 +162,25 @@ class ButtonAppearance() = BaseAppearance():
# disabled --> whole button crossed out
# hilited --> box is inverted
#
class
CheckAppearance
()
=
Base
Appearance
():
class
CheckAppearance
()
=
Label
Appearance
():
#
def
drawpict
(
self
,
d
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
boxbounds
=
(
left
,
top
),
(
left
+
size
,
bottom
)
d
.
box
(
boxbounds
)
if
self
.
selected
:
_xorcross
(
d
,
boxbounds
)
d
.
box
(
self
.
boxbounds
)
if
self
.
selected
:
_xorcross
(
d
,
self
.
boxbounds
)
#
def
textpos
(
self
,
d
):
def
recalcbounds
(
self
):
LabelAppearance
.
recalcbounds
(
self
)
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
h
=
left
+
size
+
d
.
textwidth
(
' '
)
v
=
top
+
(
size
-
d
.
lineheight
())
/
2
return
h
,
v
self
.
size
=
bottom
-
top
-
4
self
.
boxbounds
=
(
left
+
2
,
top
+
2
),
(
left
+
2
+
self
.
size
,
bottom
-
2
)
self
.
hilitebounds
=
self
.
boxbounds
#
def
fliphilite
(
self
,
d
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
boxbounds
=
(
left
,
top
),
(
left
+
size
,
bottom
)
d
.
invert
(
boxbounds
)
def
recalctextpos
(
self
):
d
=
self
.
win
.
begindrawing
()
(
left
,
top
),
(
right
,
bottom
)
=
self
.
boxbounds
h
=
right
+
d
.
textwidth
(
' '
)
v
=
top
+
(
self
.
size
-
d
.
lineheight
())
/
2
self
.
textpos
=
h
,
v
#
...
...
@@ -194,37 +189,24 @@ class CheckAppearance() = BaseAppearance():
# disabled --> whole button crossed out
# hilited --> indicator is inverted
#
class
RadioAppearance
()
=
Base
Appearance
():
class
RadioAppearance
()
=
Check
Appearance
():
#
def
drawpict
(
self
,
d
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
radius
=
size
/
2
(
left
,
top
),
(
right
,
bottom
)
=
self
.
boxbounds
radius
=
self
.
size
/
2
h
,
v
=
left
+
radius
,
top
+
radius
d
.
circle
((
h
,
v
),
radius
-
1
)
d
.
circle
((
h
,
v
),
radius
)
if
self
.
selected
:
some
=
radius
/
3
d
.
paint
((
h
-
some
,
v
-
some
),
(
h
+
some
,
v
+
some
))
#
def
textpos
(
self
,
d
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
h
=
left
+
size
+
d
.
textwidth
(
' '
)
v
=
top
+
(
size
-
d
.
lineheight
())
/
2
return
h
,
v
#
def
fliphilite
(
self
,
d
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
d
.
invert
((
left
,
top
),
(
left
+
size
,
bottom
))
#
# NoReactivity ignores mouse and timer events.
# The trigger methods call the corresponding hooks set by the user.
# Hooks (and triggers) mean the following:
# down_hook called on some mouse-down events
#
acti
ve_hook called on some mouse-move events
#
mo
ve_hook called on some mouse-move events
# up_hook called on mouse-up events
# on_hook called for buttons with on/off state, when it goes on
# timer_hook called on timer events
...
...
@@ -235,7 +217,7 @@ class RadioAppearance() = BaseAppearance():
class
NoReactivity
():
#
def
init_reactivity
(
self
):
self
.
down_hook
=
self
.
acti
ve_hook
=
self
.
up_hook
=
\
self
.
down_hook
=
self
.
mo
ve_hook
=
self
.
up_hook
=
\
self
.
on_hook
=
self
.
off_hook
=
self
.
timer_hook
=
\
self
.
hook
=
self
.
active
=
0
#
...
...
@@ -257,8 +239,8 @@ class NoReactivity():
def
down_trigger
(
self
):
if
self
.
down_hook
:
self
.
down_hook
(
self
)
#
def
acti
ve_trigger
(
self
):
if
self
.
active_hook
:
self
.
acti
ve_hook
(
self
)
def
mo
ve_trigger
(
self
):
if
self
.
move_hook
:
self
.
mo
ve_hook
(
self
)
#
def
up_trigger
(
self
):
if
self
.
up_hook
:
self
.
up_hook
(
self
)
...
...
@@ -290,7 +272,7 @@ class ToggleReactivity() = NoReactivity():
#
def
mouse_move
(
self
,
detail
):
if
self
.
active
:
self
.
acti
ve_trigger
()
self
.
mo
ve_trigger
()
#
def
mouse_up
(
self
,
detail
):
if
self
.
active
:
...
...
@@ -325,7 +307,7 @@ class TriggerReactivity() = NoReactivity():
if
self
.
active
:
self
.
hilite
(
self
.
mousetest
(
detail
[
_HV
]))
if
self
.
hilited
:
self
.
acti
ve_trigger
()
self
.
mo
ve_trigger
()
#
def
mouse_up
(
self
,
detail
):
if
self
.
active
:
...
...
@@ -338,7 +320,7 @@ class TriggerReactivity() = NoReactivity():
#
def
timer
(
self
):
if
self
.
active
and
self
.
hilited
:
self
.
active
_trigger
()
self
.
timer
_trigger
()
#
...
...
@@ -382,14 +364,27 @@ class Define():
#
def
define
(
self
,
(
win
,
bounds
,
text
)):
self
.
init_appearance
(
win
,
bounds
)
self
.
text
=
text
self
.
init_reactivity
()
self
.
settext
(
text
)
return
self
# Subroutine to cross out a rectangle.
#
def
_xorcross
(
d
,
bounds
):
((
left
,
top
),
(
right
,
bottom
))
=
bounds
# This is s bit funny to make it look better
left
=
left
+
2
right
=
right
-
2
top
=
top
+
2
bottom
=
bottom
-
3
d
.
xorline
(((
left
,
top
),
(
right
,
bottom
)))
d
.
xorline
((
left
,
bottom
),
(
right
,
top
))
# Ready-made button classes
#
class
BaseButton
()
=
NoReactivity
(),
Base
Appearance
(),
Define
():
pass
class
BaseButton
()
=
NoReactivity
(),
Label
Appearance
(),
Define
():
pass
class
Label
()
=
NoReactivity
(),
LabelAppearance
(),
Define
():
pass
class
ClassicButton
()
=
TriggerReactivity
(),
ButtonAppearance
(),
Define
():
pass
class
CheckButton
()
=
CheckReactivity
(),
CheckAppearance
(),
Define
():
pass
...
...
Lib/stdwin/Buttons.py
Dosyayı görüntüle @
ceae528b
# Module 'Buttons' -- see README
#
# Module functionality is now split in two parts:
# - 'appearance' defines what it looks like
# - 'reactivity' defines how it acts to mouse events
# Module 'Buttons'
# Import module 'rect' renamed as '_rect'
...
...
@@ -20,32 +16,42 @@ _BUTTON = 2
_MASK
=
3
# BaseAppearance provides defaults for all appearance methods.
# In fact it looks like a label.
# LabelAppearance provides defaults for all appearance methods.
# selected state not visible
# disabled --> crossed out
# hilited --> inverted
#
class
Base
Appearance
():
class
Label
Appearance
():
#
# Initialization
#
def
init_appearance
(
self
,
(
win
,
bounds
)):
win
.
change
(
bounds
)
self
.
win
=
win
self
.
bounds
=
bounds
self
.
enabled
=
1
self
.
hilited
=
0
self
.
selected
=
0
self
.
text
=
''
self
.
limbo
=
1
self
.
recalc
()
self
.
win
.
change
(
self
.
bounds
)
# While the limbo flag is set, redraw calls are ignored.
# It is cleared by the first draw event.
# This is intended to avoid duplicate drawing during
# initialization.
#
# Changing the parameters
#
def
settext
(
self
,
text
):
self
.
text
=
text
self
.
recalctextpos
()
self
.
redraw
()
#
def
setbounds
(
self
,
bounds
):
# This elays drawing until after all buttons are moved
# This
d
elays drawing until after all buttons are moved
self
.
win
.
change
(
self
.
bounds
)
self
.
bounds
=
bounds
self
.
recalc
()
self
.
win
.
change
(
bounds
)
#
# Changing the state bits
...
...
@@ -53,25 +59,54 @@ class BaseAppearance():
def
enable
(
self
,
flag
):
if
flag
<>
self
.
enabled
:
self
.
enabled
=
flag
self
.
flipenable
(
self
.
win
.
begindrawing
())
if
not
self
.
limbo
:
self
.
flipenable
(
self
.
win
.
begindrawing
())
#
def
hilite
(
self
,
flag
):
if
flag
<>
self
.
hilited
:
self
.
hilited
=
flag
self
.
fliphilite
(
self
.
win
.
begindrawing
())
if
not
self
.
limbo
:
self
.
fliphilite
(
self
.
win
.
begindrawing
())
#
def
select
(
self
,
flag
):
if
flag
<>
self
.
selected
:
self
.
selected
=
flag
self
.
redraw
()
#
# Recalculate the box bounds and text position.
# This can be overridden by buttons that draw different boxes
# or want their text in a different position.
#
def
recalc
(
self
):
self
.
recalcbounds
()
self
.
recalctextpos
()
#
def
recalcbounds
(
self
):
self
.
hilitebounds
=
_rect
.
inset
(
self
.
bounds
,
(
3
,
3
))
self
.
crossbounds
=
self
.
bounds
#
def
recalctextpos
(
self
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
d
=
self
.
win
.
begindrawing
()
h
=
(
left
+
right
-
d
.
textwidth
(
self
.
text
))
/
2
v
=
(
top
+
bottom
-
d
.
lineheight
())
/
2
self
.
textpos
=
h
,
v
#
# Resize method.
# Override for widgets that take over window geomtry management.
#
def
resize
(
self
):
pass
#
# Generic drawing mechanism.
#
There should be no reason to override redraw() or draw() method
s.
#
Do not override redraw() or draw() methods; override drawit() c.
s.
#
def
redraw
(
self
):
self
.
draw
(
self
.
win
.
begindrawing
(),
self
.
bounds
)
if
not
self
.
limbo
:
self
.
draw
(
self
.
win
.
begindrawing
(),
self
.
bounds
)
#
def
draw
(
self
,
(
d
,
area
)):
self
.
limbo
=
0
area
=
_rect
.
intersect
(
area
,
self
.
bounds
)
if
area
=
_rect
.
empty
:
return
...
...
@@ -83,10 +118,9 @@ class BaseAppearance():
# The drawit() method is fairly generic but may be overridden.
#
def
drawit
(
self
,
d
):
self
.
drawpict
(
d
)
# Box, circle etc.; also 'selected'
self
.
drawpict
(
d
)
if
self
.
text
:
hv
=
self
.
textpos
(
d
)
d
.
text
(
hv
,
self
.
text
)
d
.
text
(
self
.
textpos
,
self
.
text
)
if
not
self
.
enabled
:
self
.
flipenable
(
d
)
if
self
.
hilited
:
...
...
@@ -95,52 +129,15 @@ class BaseAppearance():
# Default drawing detail functions.
# Overriding these is normally sufficient to get different
# appearances.
# No picture; centered text; enable crosses out; hilite inverts.
#
def
drawpict
(
self
,
d
):
pass
#
def
textpos
(
self
,
d
):
# XXX shouldn't this be done once by init/settext()?
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
h
=
(
left
+
right
-
d
.
textwidth
(
self
.
text
))
/
2
v
=
(
top
+
bottom
-
d
.
lineheight
())
/
2
return
h
,
v
#
def
flipenable
(
self
,
d
):
_xorcross
(
d
,
self
.
bounds
)
_xorcross
(
d
,
self
.
cross
bounds
)
#
def
fliphilite
(
self
,
d
):
d
.
invert
(
_rect
.
inset
(
self
.
bounds
,
(
3
,
3
)))
# Subroutine to cross out a rectangle.
#
def
_xorcross
(
d
,
bounds
):
((
left
,
top
),
(
right
,
bottom
))
=
bounds
left
=
left
+
2
right
=
right
-
2
top
=
top
+
2
bottom
=
bottom
-
3
d
.
xorline
(((
left
,
top
),
(
right
,
bottom
)))
d
.
xorline
((
left
,
bottom
),
(
right
,
top
))
# LabelAppearance displays a centered string.
# selected --> underlined
# disabled --> crossed out
# hilited --> inverted
#
class
LabelAppearance
()
=
BaseAppearance
():
#
def
drawpict
(
self
,
d
):
if
self
.
selected
:
# Underline it
d
.
line
((
left
+
1
,
bottom
-
1
),
(
right
-
1
,
bottom
-
1
))
#
if
not
self
.
enabled
:
self
.
_crossout
(
d
)
if
self
.
hilited
:
self
.
_invert
(
d
)
#
d
.
invert
(
self
.
hilitebounds
)
# ButtonAppearance displays a centered string in a box.
...
...
@@ -148,7 +145,7 @@ class LabelAppearance() = BaseAppearance():
# disabled --> crossed out
# hilited --> inverted
#
class
ButtonAppearance
()
=
Base
Appearance
():
class
ButtonAppearance
()
=
Label
Appearance
():
#
def
drawpict
(
self
,
d
):
d
.
box
(
_rect
.
inset
(
self
.
bounds
,
(
1
,
1
)))
...
...
@@ -165,27 +162,25 @@ class ButtonAppearance() = BaseAppearance():
# disabled --> whole button crossed out
# hilited --> box is inverted
#
class
CheckAppearance
()
=
Base
Appearance
():
class
CheckAppearance
()
=
Label
Appearance
():
#
def
drawpict
(
self
,
d
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
boxbounds
=
(
left
,
top
),
(
left
+
size
,
bottom
)
d
.
box
(
boxbounds
)
if
self
.
selected
:
_xorcross
(
d
,
boxbounds
)
d
.
box
(
self
.
boxbounds
)
if
self
.
selected
:
_xorcross
(
d
,
self
.
boxbounds
)
#
def
textpos
(
self
,
d
):
def
recalcbounds
(
self
):
LabelAppearance
.
recalcbounds
(
self
)
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
h
=
left
+
size
+
d
.
textwidth
(
' '
)
v
=
top
+
(
size
-
d
.
lineheight
())
/
2
return
h
,
v
self
.
size
=
bottom
-
top
-
4
self
.
boxbounds
=
(
left
+
2
,
top
+
2
),
(
left
+
2
+
self
.
size
,
bottom
-
2
)
self
.
hilitebounds
=
self
.
boxbounds
#
def
fliphilite
(
self
,
d
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
boxbounds
=
(
left
,
top
),
(
left
+
size
,
bottom
)
d
.
invert
(
boxbounds
)
def
recalctextpos
(
self
):
d
=
self
.
win
.
begindrawing
()
(
left
,
top
),
(
right
,
bottom
)
=
self
.
boxbounds
h
=
right
+
d
.
textwidth
(
' '
)
v
=
top
+
(
self
.
size
-
d
.
lineheight
())
/
2
self
.
textpos
=
h
,
v
#
...
...
@@ -194,37 +189,24 @@ class CheckAppearance() = BaseAppearance():
# disabled --> whole button crossed out
# hilited --> indicator is inverted
#
class
RadioAppearance
()
=
Base
Appearance
():
class
RadioAppearance
()
=
Check
Appearance
():
#
def
drawpict
(
self
,
d
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
radius
=
size
/
2
(
left
,
top
),
(
right
,
bottom
)
=
self
.
boxbounds
radius
=
self
.
size
/
2
h
,
v
=
left
+
radius
,
top
+
radius
d
.
circle
((
h
,
v
),
radius
-
1
)
d
.
circle
((
h
,
v
),
radius
)
if
self
.
selected
:
some
=
radius
/
3
d
.
paint
((
h
-
some
,
v
-
some
),
(
h
+
some
,
v
+
some
))
#
def
textpos
(
self
,
d
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
h
=
left
+
size
+
d
.
textwidth
(
' '
)
v
=
top
+
(
size
-
d
.
lineheight
())
/
2
return
h
,
v
#
def
fliphilite
(
self
,
d
):
(
left
,
top
),
(
right
,
bottom
)
=
self
.
bounds
size
=
bottom
-
top
d
.
invert
((
left
,
top
),
(
left
+
size
,
bottom
))
#
# NoReactivity ignores mouse and timer events.
# The trigger methods call the corresponding hooks set by the user.
# Hooks (and triggers) mean the following:
# down_hook called on some mouse-down events
#
acti
ve_hook called on some mouse-move events
#
mo
ve_hook called on some mouse-move events
# up_hook called on mouse-up events
# on_hook called for buttons with on/off state, when it goes on
# timer_hook called on timer events
...
...
@@ -235,7 +217,7 @@ class RadioAppearance() = BaseAppearance():
class
NoReactivity
():
#
def
init_reactivity
(
self
):
self
.
down_hook
=
self
.
acti
ve_hook
=
self
.
up_hook
=
\
self
.
down_hook
=
self
.
mo
ve_hook
=
self
.
up_hook
=
\
self
.
on_hook
=
self
.
off_hook
=
self
.
timer_hook
=
\
self
.
hook
=
self
.
active
=
0
#
...
...
@@ -257,8 +239,8 @@ class NoReactivity():
def
down_trigger
(
self
):
if
self
.
down_hook
:
self
.
down_hook
(
self
)
#
def
acti
ve_trigger
(
self
):
if
self
.
active_hook
:
self
.
acti
ve_hook
(
self
)
def
mo
ve_trigger
(
self
):
if
self
.
move_hook
:
self
.
mo
ve_hook
(
self
)
#
def
up_trigger
(
self
):
if
self
.
up_hook
:
self
.
up_hook
(
self
)
...
...
@@ -290,7 +272,7 @@ class ToggleReactivity() = NoReactivity():
#
def
mouse_move
(
self
,
detail
):
if
self
.
active
:
self
.
acti
ve_trigger
()
self
.
mo
ve_trigger
()
#
def
mouse_up
(
self
,
detail
):
if
self
.
active
:
...
...
@@ -325,7 +307,7 @@ class TriggerReactivity() = NoReactivity():
if
self
.
active
:
self
.
hilite
(
self
.
mousetest
(
detail
[
_HV
]))
if
self
.
hilited
:
self
.
acti
ve_trigger
()
self
.
mo
ve_trigger
()
#
def
mouse_up
(
self
,
detail
):
if
self
.
active
:
...
...
@@ -338,7 +320,7 @@ class TriggerReactivity() = NoReactivity():
#
def
timer
(
self
):
if
self
.
active
and
self
.
hilited
:
self
.
active
_trigger
()
self
.
timer
_trigger
()
#
...
...
@@ -382,14 +364,27 @@ class Define():
#
def
define
(
self
,
(
win
,
bounds
,
text
)):
self
.
init_appearance
(
win
,
bounds
)
self
.
text
=
text
self
.
init_reactivity
()
self
.
settext
(
text
)
return
self
# Subroutine to cross out a rectangle.
#
def
_xorcross
(
d
,
bounds
):
((
left
,
top
),
(
right
,
bottom
))
=
bounds
# This is s bit funny to make it look better
left
=
left
+
2
right
=
right
-
2
top
=
top
+
2
bottom
=
bottom
-
3
d
.
xorline
(((
left
,
top
),
(
right
,
bottom
)))
d
.
xorline
((
left
,
bottom
),
(
right
,
top
))
# Ready-made button classes
#
class
BaseButton
()
=
NoReactivity
(),
Base
Appearance
(),
Define
():
pass
class
BaseButton
()
=
NoReactivity
(),
Label
Appearance
(),
Define
():
pass
class
Label
()
=
NoReactivity
(),
LabelAppearance
(),
Define
():
pass
class
ClassicButton
()
=
TriggerReactivity
(),
ButtonAppearance
(),
Define
():
pass
class
CheckButton
()
=
CheckReactivity
(),
CheckAppearance
(),
Define
():
pass
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment