mirror of
https://github.com/gryf/pygtktalog.git
synced 2025-12-17 11:30:19 +01:00
Added module with dialog helpers, and unit test
This commit is contained in:
99
pygtktalog/dialogs.py
Normal file
99
pygtktalog/dialogs.py
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
"""
|
||||||
|
Project: pyGTKtalog
|
||||||
|
Description: Simple dialogs for interact with user
|
||||||
|
Type: helper
|
||||||
|
Author: Roman 'gryf' Dobosz, gryf73@gmail.com
|
||||||
|
Created: 2009-05-12
|
||||||
|
"""
|
||||||
|
import gtk
|
||||||
|
|
||||||
|
|
||||||
|
class Dialog(object):
|
||||||
|
"""Show simple dialog for questions
|
||||||
|
if "OK" button pressed, return "True"
|
||||||
|
"Cancel" button return "False"
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, dialog_type, message, secondary_msg="", title=""):
|
||||||
|
"""Initialize some defaults"""
|
||||||
|
self.dialog = None
|
||||||
|
self.buttons = gtk.BUTTONS_OK
|
||||||
|
self.ok_default = False
|
||||||
|
self.message = message
|
||||||
|
self.secondary_msg = secondary_msg
|
||||||
|
self.type = dialog_type
|
||||||
|
self.title = title
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
"""Show the dialog"""
|
||||||
|
if self.dialog is None:
|
||||||
|
self.__create_dialog()
|
||||||
|
|
||||||
|
# Change default/focus from cancel/no to ok/yes. Suitable only for
|
||||||
|
# Question dialog.
|
||||||
|
# Ofcourse, if something changes in the future, this could break
|
||||||
|
# things.
|
||||||
|
if self.ok_default:
|
||||||
|
button = self.dialog.get_children()[0].get_children()[2]
|
||||||
|
button.get_children()[self.ok_default].grab_default()
|
||||||
|
|
||||||
|
retval = self.dialog.run()
|
||||||
|
self.dialog.destroy()
|
||||||
|
if retval == gtk.RESPONSE_OK or retval == gtk.RESPONSE_YES:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def __create_dialog(self):
|
||||||
|
"""Create MessageDialog widgt"""
|
||||||
|
if self.type == gtk.MESSAGE_QUESTION and \
|
||||||
|
self.buttons not in (gtk.BUTTONS_YES_NO, gtk.BUTTONS_OK_CANCEL):
|
||||||
|
self.buttons = gtk.BUTTONS_YES_NO
|
||||||
|
|
||||||
|
self.dialog = gtk.MessageDialog(buttons=self.buttons, type=self.type,
|
||||||
|
message_format=self.message)
|
||||||
|
self.dialog.format_secondary_text(self.secondary_msg)
|
||||||
|
self.dialog.set_title(self.title)
|
||||||
|
|
||||||
|
|
||||||
|
def yesno(message, secondarymsg="", title="", default=False):
|
||||||
|
"""Question with yes-no buttons. Returns False on 'no', True on 'yes'"""
|
||||||
|
dialog = Dialog(gtk.MESSAGE_QUESTION, message, secondarymsg, title)
|
||||||
|
dialog.buttons = gtk.BUTTONS_YES_NO
|
||||||
|
dialog.ok_default = default
|
||||||
|
return dialog.run()
|
||||||
|
|
||||||
|
def okcancel(message, secondarymsg="", title="", default=False):
|
||||||
|
"""Question with ok-cancel buttons. Returns False on 'cancel', True on
|
||||||
|
'ok'"""
|
||||||
|
dialog = Dialog(gtk.MESSAGE_QUESTION, message, secondarymsg, title)
|
||||||
|
dialog.buttons = gtk.BUTTONS_OK_CANCEL
|
||||||
|
dialog.ok_default = default
|
||||||
|
return dialog.run()
|
||||||
|
|
||||||
|
def info(message, secondarymsg="", title="", button=gtk.BUTTONS_OK):
|
||||||
|
"""Info dialog. Button defaults to gtk.BUTTONS_OK, but can be changed with
|
||||||
|
gtk.BUTTONS_CANCEL, gtk.BUTTONS_CLOSE or gtk.BUTTONS_NONE.
|
||||||
|
Always returns True."""
|
||||||
|
dialog = Dialog(gtk.MESSAGE_INFO, message, secondarymsg, title)
|
||||||
|
dialog.buttons = button
|
||||||
|
dialog.run()
|
||||||
|
return True
|
||||||
|
|
||||||
|
def warn(message, secondarymsg="", title="", button=gtk.BUTTONS_OK):
|
||||||
|
"""Warning dialog. Button defaults to gtk.BUTTONS_OK, but can be changed
|
||||||
|
with gtk.BUTTONS_CANCEL, gtk.BUTTONS_CLOSE or gtk.BUTTONS_NONE.
|
||||||
|
Always returns True."""
|
||||||
|
dialog = Dialog(gtk.MESSAGE_WARNING, message, secondarymsg, title)
|
||||||
|
dialog.buttons = button
|
||||||
|
dialog.run()
|
||||||
|
return True
|
||||||
|
|
||||||
|
def error(message, secondarymsg="", title="", button=gtk.BUTTONS_OK):
|
||||||
|
"""Error dialog. Button defaults to gtk.BUTTONS_OK, but can be changed with
|
||||||
|
gtk.BUTTONS_CANCEL, gtk.BUTTONS_CLOSE or gtk.BUTTONS_NONE.
|
||||||
|
Always returns True."""
|
||||||
|
dialog = Dialog(gtk.MESSAGE_ERROR, message, secondarymsg, title)
|
||||||
|
dialog.buttons = button
|
||||||
|
dialog.run()
|
||||||
|
return True
|
||||||
|
|
||||||
77
test/unit/dialogs_test.py
Normal file
77
test/unit/dialogs_test.py
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
"""
|
||||||
|
Project: pyGTKtalog
|
||||||
|
Description: Test simple dialogs
|
||||||
|
Type: test
|
||||||
|
Author: Roman 'gryf' Dobosz, gryf73@gmail.com
|
||||||
|
Created: 2009-05-19
|
||||||
|
"""
|
||||||
|
import unittest
|
||||||
|
import os
|
||||||
|
|
||||||
|
import gtk
|
||||||
|
|
||||||
|
from pygtktalog.dialogs import Dialog, yesno, okcancel, info, warn, error
|
||||||
|
|
||||||
|
|
||||||
|
class MessageDialogMock(gtk.MessageDialog):
|
||||||
|
"""Mock class for MessageDialog, which shouldn't be displayed in a test"""
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
"""Carefull! only for MESSAGE_INFO return value is RESPONSE_OK!"""
|
||||||
|
if self.get_property('message-type') == gtk.MESSAGE_INFO:
|
||||||
|
return gtk.RESPONSE_OK
|
||||||
|
else:
|
||||||
|
return gtk.RESPONSE_CANCEL
|
||||||
|
|
||||||
|
class TestDialog(unittest.TestCase):
|
||||||
|
"""Tests for Dialog class"""
|
||||||
|
|
||||||
|
def test_dialog_create(self):
|
||||||
|
"""Test dialog creation and run method"""
|
||||||
|
# overwrite MessageDialog class in gtk module
|
||||||
|
gtk.MessageDialog = MessageDialogMock
|
||||||
|
dialog = Dialog(gtk.MESSAGE_INFO, 'msg', 'secondarymsg', 'title')
|
||||||
|
self.assertTrue(dialog.buttons == gtk.BUTTONS_OK, "dialog should have"
|
||||||
|
" gtk.BUTTONS_OK")
|
||||||
|
self.assertTrue(dialog.run(), "dialog should return True")
|
||||||
|
|
||||||
|
dialog = Dialog(gtk.MESSAGE_QUESTION, 'msg', 'secondarymsg', 'title')
|
||||||
|
self.assertFalse(dialog.run(), "dialog should return False")
|
||||||
|
# NOTE: dialog should be run before test against buttons attribute
|
||||||
|
self.assertTrue(dialog.buttons == gtk.BUTTONS_YES_NO,
|
||||||
|
"dialog should have gtk.BUTTONS_YES_NO")
|
||||||
|
|
||||||
|
dialog = Dialog(gtk.MESSAGE_QUESTION, 'msg', 'secondarymsg', 'title')
|
||||||
|
dialog.buttons = gtk.BUTTONS_OK
|
||||||
|
dialog.ok_default = True
|
||||||
|
self.assertFalse(dialog.run(), "dialog should return True")
|
||||||
|
|
||||||
|
def test_error(self):
|
||||||
|
"""Test error function"""
|
||||||
|
result = error('msg', 'secondarymsg', 'title')
|
||||||
|
self.assertTrue(result, "Should return True")
|
||||||
|
|
||||||
|
def test_warn(self):
|
||||||
|
"""Test warn function"""
|
||||||
|
result = warn('msg', 'secondarymsg', 'title')
|
||||||
|
self.assertTrue(result, "Should return True")
|
||||||
|
|
||||||
|
def test_info(self):
|
||||||
|
"""Test info function"""
|
||||||
|
result = info('msg', 'secondarymsg', 'title')
|
||||||
|
self.assertTrue(result, "Should return True")
|
||||||
|
|
||||||
|
def test_yesno(self):
|
||||||
|
"""Test yesno function"""
|
||||||
|
result = yesno('msg', 'secondarymsg', 'title')
|
||||||
|
self.assertFalse(result, "Should return False")
|
||||||
|
|
||||||
|
def test_okcancel(self):
|
||||||
|
"""Test yesno function"""
|
||||||
|
result = okcancel('msg', 'secondarymsg', 'title')
|
||||||
|
self.assertFalse(result, "Should return False")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
os.chdir(os.path.join(os.path.abspath(os.path.dirname(__file__)), "../"))
|
||||||
|
unittest.main()
|
||||||
Reference in New Issue
Block a user