118 lines
3.3 KiB
Python
118 lines
3.3 KiB
Python
#
|
|
# Python GUI - Alert base class - Generic
|
|
#
|
|
|
|
import textwrap
|
|
from GUI import ModalDialog
|
|
from GUI import Label
|
|
|
|
class BaseAlert(ModalDialog):
|
|
|
|
_wrapwidth = 50
|
|
_minimum_width = 200
|
|
_left_margin = 24
|
|
_right_margin = 24
|
|
_top_margin = 14
|
|
_bottom_margin = 20
|
|
_icon_spacing = 16
|
|
_label_button_spacing = 20
|
|
_default_width = 380
|
|
_default_lines = 3
|
|
|
|
yes_button = None
|
|
no_button = None
|
|
other_button = None
|
|
|
|
def __init__(self, kind, prompt, width = None, lines = None,
|
|
button_labels = None, default = None, cancel = None):
|
|
#if width is None:
|
|
# width = self._default_width
|
|
#if lines is None:
|
|
# lines = self._default_lines
|
|
ModalDialog.__init__(self, style = 'alert')
|
|
self.label = Label(text = self._wrap(prompt), lines = lines)
|
|
if self.label.width < self._minimum_width:
|
|
self.label.width = self._minimum_width
|
|
self._create_buttons(*button_labels)
|
|
#self.default_button = self._find_button(default)
|
|
#self.cancel_button = self._find_button(cancel)
|
|
self._layout(kind)
|
|
|
|
def _layout(self, kind):
|
|
icon_width, icon_height = self._layout_icon(kind)
|
|
label_left = self._left_margin
|
|
if icon_width:
|
|
label_left += icon_width + self._icon_spacing
|
|
if self.label.height < icon_height:
|
|
self.label.height = icon_height
|
|
self.place(self.label,
|
|
left = label_left,
|
|
top = self._top_margin)# + icon_height/4)
|
|
#_wrap_text(self.label, self._default_width - label_left - self._right_margin)
|
|
self._layout_buttons()
|
|
self.shrink_wrap(padding = (self._right_margin, self._bottom_margin))
|
|
|
|
def _layout_icon(self, kind):
|
|
# Place icon for the given alert kind, if any, and return its size.
|
|
# If there is no icon, return (0, 0).
|
|
return (0, 0)
|
|
|
|
def _wrap(self, text):
|
|
width = self._wrapwidth
|
|
return "\n\n".join(
|
|
[textwrap.fill(para, width)
|
|
for para in text.split("\n\n")])
|
|
|
|
def _find_button(self, value):
|
|
#print "BaseAlert._find_button:", value ###
|
|
if value == 1:
|
|
result = self.yes_button
|
|
elif value == 0:
|
|
result = self.no_button
|
|
elif value == -1:
|
|
result = self.other_button
|
|
else:
|
|
result = None
|
|
#print "BaseAlert._find_button: result =", result ###
|
|
return result
|
|
|
|
def yes(self):
|
|
self.dismiss(1)
|
|
|
|
def no(self):
|
|
self.dismiss(0)
|
|
|
|
def other(self):
|
|
self.dismiss(-1)
|
|
|
|
#def _wrap_text(label, label_width):
|
|
# hard_lines = [text.split()
|
|
# for text in label.text.split("\n")]
|
|
# words = hard_lines[0]
|
|
# for hard_line in hard_lines[1:]:
|
|
# words.append("\n")
|
|
# words.extend(hard_line)
|
|
# font = label.font
|
|
# space_width = font.width(" ")
|
|
# lines = []
|
|
# line = []
|
|
# line_width = 0
|
|
# for word in words:
|
|
# word_width = font.width(word)
|
|
# if word == "\n" or (line_width > 0
|
|
# and line_width + space_width + word_width > label_width):
|
|
# lines.append(line)
|
|
# line = []
|
|
# line_width = 0
|
|
# if word <> "\n":
|
|
# line.append(word)
|
|
# if line_width > 0:
|
|
# line_width += space_width
|
|
# line_width += word_width
|
|
# if line:
|
|
# lines.append(line)
|
|
# label.text = "\n".join([" ".join(line) for line in lines])
|
|
|
|
|
|
|