5 changed files with 371 additions and 2 deletions
@ -1,3 +1,4 @@ |
|||||||
from .colorpicker import TTkColorButtonPicker, TTkColorDialogPicker |
from .colorpicker import TTkColorButtonPicker, TTkColorDialogPicker |
||||||
from .filepicker import TTkFileDialog, TTkFileDialogPicker |
from .filepicker import TTkFileDialog, TTkFileDialogPicker |
||||||
from .textpicker import TTkTextPicker, TTkTextDialogPicker |
from .textpicker import TTkTextPicker, TTkTextDialogPicker |
||||||
|
from .messagebox import TTkMessageBox |
||||||
@ -0,0 +1,235 @@ |
|||||||
|
# MIT License |
||||||
|
# |
||||||
|
# Copyright (c) 2023 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com> |
||||||
|
# |
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy |
||||||
|
# of this software and associated documentation files (the "Software"), to deal |
||||||
|
# in the Software without restriction, including without limitation the rights |
||||||
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||||
|
# copies of the Software, and to permit persons to whom the Software is |
||||||
|
# furnished to do so, subject to the following conditions: |
||||||
|
# |
||||||
|
# The above copyright notice and this permission notice shall be included in all |
||||||
|
# copies or substantial portions of the Software. |
||||||
|
# |
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||||
|
# SOFTWARE. |
||||||
|
|
||||||
|
import zlib, pickle, base64 |
||||||
|
|
||||||
|
from TermTk.TTkCore.cfg import TTkCfg |
||||||
|
from TermTk.TTkCore.signal import pyTTkSignal,pyTTkSlot |
||||||
|
from TermTk.TTkCore.color import TTkColor |
||||||
|
from TermTk.TTkCore.string import TTkString |
||||||
|
from TermTk.TTkLayouts.layout import TTkLayout |
||||||
|
from TermTk.TTkLayouts.gridlayout import TTkGridLayout |
||||||
|
from TermTk.TTkLayouts.boxlayout import TTkHBoxLayout |
||||||
|
from TermTk.TTkWidgets.widget import TTkWidget |
||||||
|
from TermTk.TTkWidgets.window import TTkWindow |
||||||
|
from TermTk.TTkWidgets.image import TTkImage |
||||||
|
from TermTk.TTkWidgets.label import TTkLabel |
||||||
|
from TermTk.TTkWidgets.button import TTkButton |
||||||
|
|
||||||
|
class TTkMessageBox(TTkWindow): |
||||||
|
class Icon(int): |
||||||
|
NoIcon = 0 |
||||||
|
'''the message box does not have any icon.''' |
||||||
|
Question = 4 |
||||||
|
'''an icon indicating that the message is asking a question.''' |
||||||
|
Information = 1 |
||||||
|
'''an icon indicating that the message is nothing out of the ordinary.''' |
||||||
|
Warning = 2 |
||||||
|
'''an icon indicating that the message is a warning, but can be dealt with.''' |
||||||
|
Critical = 3 |
||||||
|
'''an icon indicating that the message represents a critical problem.''' |
||||||
|
|
||||||
|
class StandardButton(int): |
||||||
|
Ok = 0x00000400 |
||||||
|
'''An "OK" button defined with the AcceptRole.''' |
||||||
|
Open = 0x00002000 |
||||||
|
'''An "Open" button defined with the AcceptRole.''' |
||||||
|
Save = 0x00000800 |
||||||
|
'''A "Save" button defined with the AcceptRole.''' |
||||||
|
Cancel = 0x00400000 |
||||||
|
'''A "Cancel" button defined with the RejectRole.''' |
||||||
|
Close = 0x00200000 |
||||||
|
'''A "Close" button defined with the RejectRole.''' |
||||||
|
Discard = 0x00800000 |
||||||
|
'''A "Discard" or "Don't Save" button, depending on the platform, defined with the DestructiveRole.''' |
||||||
|
Apply = 0x02000000 |
||||||
|
'''An "Apply" button defined with the ApplyRole.''' |
||||||
|
Reset = 0x04000000 |
||||||
|
'''A "Reset" button defined with the ResetRole.''' |
||||||
|
RestoreDefaults = 0x08000000 |
||||||
|
'''A "Restore Defaults" button defined with the ResetRole.''' |
||||||
|
Help = 0x01000000 |
||||||
|
'''A "Help" button defined with the HelpRole.''' |
||||||
|
SaveAll = 0x00001000 |
||||||
|
'''A "Save All" button defined with the AcceptRole.''' |
||||||
|
Yes = 0x00004000 |
||||||
|
'''A "Yes" button defined with the YesRole.''' |
||||||
|
YesToAll = 0x00008000 |
||||||
|
'''A "Yes to All" button defined with the YesRole.''' |
||||||
|
No = 0x00010000 |
||||||
|
'''A "No" button defined with the NoRole.''' |
||||||
|
NoToAll = 0x00020000 |
||||||
|
'''A "No to All" button defined with the NoRole.''' |
||||||
|
Abort = 0x00040000 |
||||||
|
'''An "Abort" button defined with the RejectRole.''' |
||||||
|
Retry = 0x00080000 |
||||||
|
'''A "Retry" button defined with the AcceptRole.''' |
||||||
|
Ignore = 0x00100000 |
||||||
|
'''An "Ignore" button defined with the AcceptRole.''' |
||||||
|
NoButton = 0x00000000 |
||||||
|
'''An invalid button.''' |
||||||
|
|
||||||
|
# Icons from: |
||||||
|
# /usr/share/icons/mate/16x16/actions |
||||||
|
_compressed_data = { |
||||||
|
Icon.NoIcon : "", |
||||||
|
Icon.Question : |
||||||
|
"eJydlUtsjFEYhusScVuQWFE7I1aWjajLQmrzLtw1EiajzUTjWkJVdUwlY6aKSqZTqpSilGhEpi6rRixYNxYiKmxYVUMpdUla73f8nzmOf6ZGnyZP/jM557zn+885f93E" + |
||||||
|
"5pLJBeZvS2oB/1EgJFIYJ9BzBLoYS7GYLsFKrMjhJaTY6zfbGkfHHcNhO4POXUo20jUCfYRELEdILb2PVNJhbEM5XYZyhHJ4A1lPBzAfAXq84GTQdevc1QJdRQ5Y3ond" + |
||||||
|
"2EFHcRRR+rZAd5N0FnfTXQJdS2pMlgDmeRkmCGwLYSuC9EmcwnHjxpxOIoXTdBsu4jx9g1yj9yKGc8Zx4+1M20K3owOdVmapyzovQxEWoYhtd3HP5P4q0KNkJItH6WHB" + |
||||||
|
"9Ltv1nmBWVrpm6TTcjUaTMY4U7dbdfHekclwmLU5aM09RD7R78kAfRk9eEFfxUP00S14gOd0P38ftPol0YRG+pZAx7w5JUOb1e6XQWur6/tIPlgedJ678Biv6Ed4ijdW" + |
||||||
|
"Px1Hai3vPch9dcZ6Vv9Lhs9kyMc96MVbk+EJXpt6/Wp3M9wRcjiToUz2n28Gqe2wj+u5jmc+7W6GtECv5a5MWs9qzRDKkeGHkIe13wmep3prDrWbQc/FJlL6e09GcIht" + |
||||||
|
"3wV6RPBxFa6g16fdzVDB01hh3Qdupj2szy56luCczW6esrSVRcd27Wb4JiTkHo2a+9Mbm3syiM30ddLx9178467WO0qzaF30HTXjLJroL4JPpks8vXL2CjEXhZmxMZ1M" + |
||||||
|
"y9QcrUJmL/p+L7JZx44jgRj9DgPo99mL2fpPEujVWINVpj4hU598MqhnkhkJ+U7UmZr34aW5s3QfjNVf672cLPvPDOqpZAq9n1SaM9uAY3n0d77t4fDCnx3noWM=" , |
||||||
|
Icon.Information : |
||||||
|
"eJy1lO1PzWEYx9OpTlI5PZ46lJ5LEdIqIYWIrxcSK6ZUOsNaD1OtrFE2UtMIZabF9IJJy9NGvIpFXhgzzy/YYsy89gf43le/ezvLOcxMV9tnv+vcD9/r4b7aPfryvd3k" + |
||||||
|
"r7Q3if9wU3as9xd6wSQsRTJmkL0ogDc5imKYDXo7+EuRIuv0PlfnTqPdmYYkBAivoVDuespb1pEfMIGD5CdMYpD8ii+4RX7HewyRH3FDfh/GFtGkz/kbDYnGnhGUwI98" + |
||||||
|
"izuoIm/TU0xWoh4h5EqUwYtcxnWe5E5UI5x8iDH0kD+o7jl5F3ZEOZz7Ow06d/3MqTrzFa5iG9mJ40giN6JO4kpDFnzlzPmIJFcjH9lkJrIRTOahXPafwBkUkN8YxbCc" + |
||||||
|
"u0E0u6iRaNiEGPGNogkJ5E1cQC65Ga3wIeciElYyThl5SBn5mTYp+2jkIixBMrkeNVLD+7iHBvIR+lBE6nucaWhgfEr/M5xCDrkPRxFAZjAyfzJWGRmjzEFLvzLykjJy" + |
||||||
|
"lTIyndVS+dqDdqnRa2ppJBuNe5xp6OReE33veGY+WYIe6YcYJEj99Z2hCJFvP5qvA8MRhjCHddGkWleII/L7G4yjRWo7dY8zDW1YDnfRcFri2IGzoiGOdbcaeVDxB9Is" + |
||||||
|
"Ulcvo75T1H69LpYvIpTcim455wVrZSfbsELucaahAgvlt8dowQKymnvVmVnsJcV4mqpFMIIQRM6i+ThQ+/W6DHaERWraJb06jnOS3wqkutSQBZv4LlK5yuF17k0kd3Gv" + |
||||||
|
"v/EOosko2jwyyLhTU/v1uu3Mp4p/COeRTg5STbTEZHPZkya4i68eS2XOPWGXxpMdrKDKaTkGMJvMZYXVdwr7P8KB2l9qaO7AScyRedGFNLKBr9eD9GfezC40aJ8NvsID" + |
||||||
|
"nD4qZxOcC0r/CHtLxVnLeam07MYVyXUlLst3LeO2SNzd0pMPWHk1Vw5jDWaSXWiWWRfDN24jzewjDxcapmup51RSeRngpPCXuPZKfC/ZN3HSa62SrzGqiJB1RaJpPzvC" + |
||||||
|
"JPnLE+3NjKVK8tOGJjKCN6i8edBMLjRo6hrpOpYx++6S23T51tR+vU7nPIxvWc2ZbCyWfNax26tkTtQIbbAi8A8a/pVmeMpMsvLlWKRnY2XGr0UOMmWuhKqe/q8aND2Z" + |
||||||
|
"UVWbUGOOGHczS0Hq225P/Ql34Le7" , |
||||||
|
Icon.Critical : |
||||||
|
"eJyVlUlslVUYhqEUUiBlCAumIi2UhhlBaBAKSKKJyaOBUKoYqdiYbqgURECkDghCIRJXmLhQNCYkJiwYRKNLjYrGjQkYh7S9WrhSLnSgrXARF773/c8f/wJW7GnytGf4" + |
||||||
|
"znu+6d+d/9ZDBQP8U314un4ZkBuNh/+VkxnMYHEroxktHmM848UfmMhE8SwTmCB+yBjGiJsYxjCxmEEM6sduYG1/Gp5hFKPEC8xipngJeFi8rJWnzJfYYTaw3es1rBfP" + |
||||||
|
"8yArrXEcY8UaCigQB/4PDUcZ67O/MZ97fUctNeZjVPquFSwT25jDbPFiYBvLqfB6FWuCpmprKWWq+D5DGXq7lj4anmY4w8VmZjNLzPAk62y7nIXiFdbYdi+f8LGY1Ytb" + |
||||||
|
"E4znM6xlrfg7C/yGNtZRJX7PJMeuum+MrOGeMPdziGuGVTzid9/HAvEqB2gUb3Cd6+JNjT/FvzRuJhjP35CqrNjJId6wn+YyR0yHWH4X/FGU0FAXcqg17L3MSh4Q26m0" + |
||||||
|
"77Nc45p4gIPsF19nH3vF7twQu3JDbFB+vCge4k3fnQ2aM4pNlf2xzLH6kWmOTR155AUNHzCCEfbdYsq9N8qDbk7zkW1lbWs7L7BNrOJxa3uebWwRn9NfmxPzr7GXVxPn" + |
||||||
|
"uvmMT53bUd6kgv33Iv9bw7cUUmifxblWRpnjm6JF1Gvsh0u54dqrpy5xZ8wtqt56+1Ejca5XUbhgDSWU2N8VLBG/SMTi65CLaa0tNUspFXtooUn8Q6M3aGgTN+vlm+6g" + |
||||||
|
"YWvwR05DJnGuR7e3+u5iil1vkb+TGt5lCEO8FvkqzUxmiB2c4Lht9DjuL/MKDYk76/XyZ4NfNibmG7RzV+Jch+rltO2XMU1sYgbTHYt/NNSqYgdq7idlapF9ttD1kFZ9" + |
||||||
|
"rHJddNEh7maP47yDnc6LdPDx+VCbu5STO8X9NDpnr2p0el+la7pVeTBPPKfeNU7c2Kc2o/7wFfnkW285i3wm6i0XlWN7XGsdXDE7rakraIsZz+fY7nNRTf/KFOdBikXu" + |
||||||
|
"M19G9aBvwO09an3gGdVJobUs5X6fncoUa3rUfSPDSceoPeRLzAynOOFzq1ndmOt1JSH+S1icsLuhnz4Z99C3A79hJCPFlmAjpZ413/9H/mkO366mwOYwnwr9sTnk3plg" + |
||||||
|
"50iwm3cX34tYyxOBse/OKmqTxF+Y517WolquSDCeP6eeXJQ4t+HOd9/VdzNm6KlxDvFO4Oe38Mgt+yb/h91YQ+3cvwEUh1KT", |
||||||
|
Icon.Warning : |
||||||
|
"eJy1lUlIVXEUxlWkDMwgCiIIKoNskVQGYkGLqBb+sMEWoiWl9szAcgiUsszAeFg0mVptQlECxSaKWjQQZZOkkVkI1qKJNhKJTfo0Ovd7VxOSUNP3Hvzg3HvP+c53zv2/" + |
||||||
|
"ouDy1SEB+iSXRdiPAOfrLRs25zFVfMZ2go0PSCHQOIuwEeVx6RmNhnukMtH4gyrijN84B8aLJEjTeGpYyWzxMyeINnZb1W3iBVIVP0KkcSkzxlxDoMsWdhKqmpdIN/Zw" + |
||||||
|
"gzzxGjnypZbNxgbS5NNYaognQuzgFMul4TIZxl5TVSU2c1bxevnRwVEWGVcx9781BBMkviKbyerzPAlu37uMv3jPTfGd6Ghz/Plue7Le2MwO+RHkODlKDVuJFD9wmMXG" + |
||||||
|
"n1Qrdy9NlBl3k0OmmC328oRjuq9SO/qWYhYYN7o+jkTDJHPA4Qt3/l85wwr1WUeS+n5NrdHLAe1BCUXkKt6ueLf5FW/sopwYvcMZhBgnuL4OR0MmS8Q37GOOZmC7rj4f" + |
||||||
|
"UWzso41KY5W9H85OVlNKvhv378d9CvVcqfainXxmGtNcX/+lYYopddiER3Pssg7D5W0Va1SjhVKxlQrjXWoo8DpnVK1qOvHT4nNO6rkKooyd7Nc+NbJF+UNdn4fSkEe0" + |
||||||
|
"2GbzDdNueaXfZ9WylbsJr8sS8SmHxEYOio+lqY+H8sfHVRK9zhm2R3lbrTeHOUT9pWG6bYD//NskdlIgH5w+Fipng6vhD3OG2LE+cyR30PU+m0mWZnJcM/1iXfrrJInT" + |
||||||
|
"/HWloZBlir10dfbr9tlZtFa8RYrmfJs08Q4evS/1OpMcJrvx9EHXfe79PXaOxg7hx15iBjTUEafYJ5vBYA3jxY9kiTXEDmhIZL5iV1gnXmfDuLK/Thzho/7fHGN6PJG/" + |
||||||
|
"AT+dCtg=" , |
||||||
|
} |
||||||
|
|
||||||
|
__slots__=('_icon', '_text', '_detailedText', '_standardButtons', '_defaultButton' |
||||||
|
'_widImage', '_widLabel', '_widBtnLayout', |
||||||
|
# Signal |
||||||
|
'buttonSelected') |
||||||
|
def __init__(self, *args, **kwargs): |
||||||
|
self.buttonSelected = pyTTkSignal(TTkMessageBox.StandardButton) |
||||||
|
TTkWindow.__init__(self, *args, **kwargs|{'layout':TTkGridLayout()}) |
||||||
|
self._icon = kwargs.get('icon', TTkMessageBox.Icon.NoIcon) |
||||||
|
self._text = TTkString(kwargs.get('text', '')) |
||||||
|
self._detailedText = TTkString(kwargs.get('detailedText', '')) |
||||||
|
self._standardButtons = kwargs.get('standardButtons', TTkMessageBox.StandardButton.Ok) |
||||||
|
self._defaultButton = kwargs.get('defaultButton', TTkMessageBox.StandardButton.NoButton) |
||||||
|
|
||||||
|
compressedData = TTkMessageBox._compressed_data.get(self._icon,'') |
||||||
|
self._widImage = TTkImage(rasteriser=TTkImage.HALFBLOCK) |
||||||
|
self.layout().addWidget(self._widImage,0,0,4,1) |
||||||
|
if compressedData: |
||||||
|
data = pickle.loads(zlib.decompress(base64.b64decode(compressedData.encode("ascii")))) |
||||||
|
self._widImage.setData(data) |
||||||
|
self._widImage.setMinimumSize(16,8) |
||||||
|
|
||||||
|
self.layout().addItem(TTkLayout(),0,1,1,3) |
||||||
|
self.layout().addItem(TTkLayout(),2,1,1,3) |
||||||
|
|
||||||
|
self._widLabel = TTkLabel(text=self._text) |
||||||
|
self._widLabel.setMinimumSize(*self._widLabel.size()) |
||||||
|
self.layout().addWidget(self._widLabel,1,2) |
||||||
|
|
||||||
|
self._widBtnLayout = TTkHBoxLayout() |
||||||
|
self.layout().addItem(self._widBtnLayout,3,1,1,3) |
||||||
|
|
||||||
|
def _genClickedSlot(sb): |
||||||
|
@pyTTkSlot() |
||||||
|
def _clicked(): |
||||||
|
self.close() |
||||||
|
self.buttonSelected.emit(sb) |
||||||
|
return _clicked |
||||||
|
|
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Help): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Help")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Reset): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Reset")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.RestoreDefaults): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Restore Default")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Apply): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Apply")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Discard): # Don't Save |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Don't Save")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Ignore): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Ignore")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Retry): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Retry")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Open): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Open")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.SaveAll): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="SaveAll")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Save): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Save")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Cancel): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Cancel")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Close): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Close")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Abort): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Abort")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Ok): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="OK")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.NoToAll): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="No to All")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.No): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="No")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.YesToAll): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Yes to All")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
if sb := (self._standardButtons & TTkMessageBox.StandardButton.Yes): |
||||||
|
self._widBtnLayout.addWidget(_btn := TTkButton(border=True, text="Yes")) |
||||||
|
_btn.clicked.connect(_genClickedSlot(sb)) |
||||||
|
|
||||||
|
_,_,w,h = self.layout().fullWidgetAreaGeometry() |
||||||
|
self.resize(w+2,h+4) |
||||||
|
|
||||||
|
# def setText(self, text):pass |
||||||
|
# def setDetailedText(self, text): |
||||||
|
# def setStandardButtons(self, buttons):pass |
||||||
|
# def setDefaultButton(self, button):pass |
||||||
@ -0,0 +1,130 @@ |
|||||||
|
#!/usr/bin/env python3 |
||||||
|
|
||||||
|
# MIT License |
||||||
|
# |
||||||
|
# Copyright (c) 2021 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com> |
||||||
|
# |
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy |
||||||
|
# of this software and associated documentation files (the "Software"), to deal |
||||||
|
# in the Software without restriction, including without limitation the rights |
||||||
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||||
|
# copies of the Software, and to permit persons to whom the Software is |
||||||
|
# furnished to do so, subject to the following conditions: |
||||||
|
# |
||||||
|
# The above copyright notice and this permission notice shall be included in all |
||||||
|
# copies or substantial portions of the Software. |
||||||
|
# |
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||||
|
# SOFTWARE. |
||||||
|
|
||||||
|
import sys, os, argparse |
||||||
|
|
||||||
|
sys.path.append(os.path.join(sys.path[0],'../..')) |
||||||
|
import TermTk as ttk |
||||||
|
|
||||||
|
|
||||||
|
def demoMessageBox(root=None): |
||||||
|
frame = ttk.TTkFrame(parent=root, border=False) |
||||||
|
|
||||||
|
# winFP = ttk.TTkWindow(parent=frame,pos = (0,0), size=(20,10), title="Test File Pickers", border=True) |
||||||
|
btn1 = ttk.TTkButton(parent=frame, pos=(0,0), border=True, text='Open' ) |
||||||
|
title = ttk.TTkTextPicker(parent=frame, pos=(0,3),size=(20,1), text='Test Messagebox', multiLine=False) |
||||||
|
icon = ttk.TTkComboBox(parent=frame,pos=(0,4), size=(20,1), list=['NoIcon','Question','Information','Warning','Critical'],index=3) |
||||||
|
frameList = ttk.TTkFrame(parent=frame, title='Buttons',pos=(0,5), size=(20,15), layout=ttk.TTkGridLayout()) |
||||||
|
listWidgetMulti = ttk.TTkList(parent=frameList, selectionMode=ttk.TTkK.MultiSelection) |
||||||
|
for name, val in [ |
||||||
|
('Ok', ttk.TTkMessageBox.StandardButton.Ok), |
||||||
|
('Open', ttk.TTkMessageBox.StandardButton.Open), |
||||||
|
('Save', ttk.TTkMessageBox.StandardButton.Save), |
||||||
|
('Cancel', ttk.TTkMessageBox.StandardButton.Cancel), |
||||||
|
('Close', ttk.TTkMessageBox.StandardButton.Close), |
||||||
|
('Discard', ttk.TTkMessageBox.StandardButton.Discard), |
||||||
|
('Apply', ttk.TTkMessageBox.StandardButton.Apply), |
||||||
|
('Reset', ttk.TTkMessageBox.StandardButton.Reset), |
||||||
|
('RestoreDefaults', ttk.TTkMessageBox.StandardButton.RestoreDefaults), |
||||||
|
('Help', ttk.TTkMessageBox.StandardButton.Help), |
||||||
|
('SaveAll', ttk.TTkMessageBox.StandardButton.SaveAll), |
||||||
|
('Yes', ttk.TTkMessageBox.StandardButton.Yes), |
||||||
|
('YesToAll', ttk.TTkMessageBox.StandardButton.YesToAll), |
||||||
|
('No', ttk.TTkMessageBox.StandardButton.No), |
||||||
|
('NoToAll', ttk.TTkMessageBox.StandardButton.NoToAll), |
||||||
|
('Abort', ttk.TTkMessageBox.StandardButton.Abort), |
||||||
|
('Retry', ttk.TTkMessageBox.StandardButton.Retry), |
||||||
|
('Ignore', ttk.TTkMessageBox.StandardButton.Ignore), |
||||||
|
('NoButton', ttk.TTkMessageBox.StandardButton.NoButton)]: |
||||||
|
listWidgetMulti.addItem(name,val) |
||||||
|
|
||||||
|
label = ttk.TTkLabel(parent=frame, pos=(22,0), text="...") |
||||||
|
text = ttk.TTkTextPicker(parent=frame, pos=(22,1),size=(35,1), autoSize=True, text='Text ln1\nText ln2 😻') |
||||||
|
|
||||||
|
ttk.pyTTkSlot(ttk.TTkMessageBox.StandardButton) |
||||||
|
def _buttonSelected(btn): |
||||||
|
buttonName = { |
||||||
|
ttk.TTkMessageBox.StandardButton.Ok : 'Ok', |
||||||
|
ttk.TTkMessageBox.StandardButton.Open : 'Open', |
||||||
|
ttk.TTkMessageBox.StandardButton.Save : 'Save', |
||||||
|
ttk.TTkMessageBox.StandardButton.Cancel : 'Cancel', |
||||||
|
ttk.TTkMessageBox.StandardButton.Close : 'Close', |
||||||
|
ttk.TTkMessageBox.StandardButton.Discard : 'Discard', |
||||||
|
ttk.TTkMessageBox.StandardButton.Apply : 'Apply', |
||||||
|
ttk.TTkMessageBox.StandardButton.Reset : 'Reset', |
||||||
|
ttk.TTkMessageBox.StandardButton.RestoreDefaults : 'RestoreDefaults', |
||||||
|
ttk.TTkMessageBox.StandardButton.Help : 'Help', |
||||||
|
ttk.TTkMessageBox.StandardButton.SaveAll : 'SaveAll', |
||||||
|
ttk.TTkMessageBox.StandardButton.Yes : 'Yes', |
||||||
|
ttk.TTkMessageBox.StandardButton.YesToAll : 'YesToAll', |
||||||
|
ttk.TTkMessageBox.StandardButton.No : 'No', |
||||||
|
ttk.TTkMessageBox.StandardButton.NoToAll : 'NoToAll', |
||||||
|
ttk.TTkMessageBox.StandardButton.Abort : 'Abort', |
||||||
|
ttk.TTkMessageBox.StandardButton.Retry : 'Retry', |
||||||
|
ttk.TTkMessageBox.StandardButton.Ignore : 'Ignore', |
||||||
|
ttk.TTkMessageBox.StandardButton.NoButton : 'NoButton'}.get(btn,"???") |
||||||
|
label.setText(f"Selected: {buttonName}") |
||||||
|
|
||||||
|
def _showDialog(): |
||||||
|
iconVal = { |
||||||
|
'NoIcon':ttk.TTkMessageBox.Icon.NoIcon, |
||||||
|
'Question':ttk.TTkMessageBox.Icon.Question, |
||||||
|
'Information':ttk.TTkMessageBox.Icon.Information, |
||||||
|
'Warning':ttk.TTkMessageBox.Icon.Warning, |
||||||
|
'Critical':ttk.TTkMessageBox.Icon.Critical}.get(icon.currentText(),ttk.TTkMessageBox.Icon.NoIcon) |
||||||
|
buttons = sum([item.data() for item in listWidgetMulti.selectedItems()]) |
||||||
|
messageBox = ttk.TTkMessageBox( |
||||||
|
title=title.getTTkString(), |
||||||
|
text=text.getTTkString(), |
||||||
|
icon=iconVal, |
||||||
|
standardButtons=buttons) |
||||||
|
messageBox.buttonSelected.connect(_buttonSelected) |
||||||
|
ttk.TTkHelper.overlay(btn1, messageBox, 2, 1, True) |
||||||
|
|
||||||
|
btn1.clicked.connect(_showDialog) |
||||||
|
|
||||||
|
return frame |
||||||
|
|
||||||
|
def main(): |
||||||
|
parser = argparse.ArgumentParser() |
||||||
|
parser.add_argument('-f', help='Full Screen', action='store_true') |
||||||
|
args = parser.parse_args() |
||||||
|
|
||||||
|
ttk.TTkLog.use_default_file_logging() |
||||||
|
|
||||||
|
ttk.TTkTheme.loadTheme(ttk.TTkTheme.NERD) |
||||||
|
|
||||||
|
root = ttk.TTk() |
||||||
|
if args.f: |
||||||
|
root.setLayout(ttk.TTkGridLayout()) |
||||||
|
winColor1 = root |
||||||
|
else: |
||||||
|
winColor1 = ttk.TTkWindow(parent=root,pos = (0,0), size=(60,25), title="Test File/Folder Picker", border=True, layout=ttk.TTkGridLayout()) |
||||||
|
|
||||||
|
demoMessageBox(winColor1) |
||||||
|
|
||||||
|
root.mainloop() |
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
main() |
||||||
Loading…
Reference in new issue