Source code for extools.ui
try:
from accpac import UI, Finder, ui_command, OpenFileDialog
except ImportError:
UI = object
Finder = object
pass
[docs]class ExUI(UI):
"""An enhanced UI class for extender.
``ExUI`` adds additional helpers to the standard Extender UI class.
"""
# Custom control constants
BUTTON_WIDTH = 1065
BUTTON_SPACE = 150
# Button Types
FINDER_BUTTON_TYPE = 4
FILE_DIALOG_FILTERS = {
"excel": ("Microsoft Excel File (*.xls, *.xlsx)"
"|*.xls*|All Files (*.*)|*.*",)
}
def __init__(self, title="exui"):
super().__init__()
self.title = title
[docs] def finder_on_click_for(self, view, ok_callback, cancel_callback,
_filter="", display_fields="1", return_fields="1"):
"""Build a callback to execute on finder button click.
:param view: The view name (either custom or built in) to find across.
:type view: str
:param ok_callback: Callback to execute on user OK
:type ok_callback: func
:param cancel_callback: Callback to execute on user cancel
:type cancel_callback: func
:param _filter: Filter to apply to finder records.
:type _filter: str
:param display_fields: fields to display in finder
:type display_fields: str (comma separated indexes)
:param return_fields: fields to display in finder
:type return_fields: str (comma separated indexes)
:returns: finder_on_click callback function
"""
def finder_on_click(btnType):
"""On finder button click, open finder modal."""
if btnType == self.FINDER_BUTTON_TYPE:
finder = Finder()
finder.viewID = view
finder.onOK = ok_callback
finder.onCancel = cancel_callback
finder.filter = _filter
finder.displayFields = display_fields
finder.returnFields = return_fields
finder.show(self)
return finder_on_click
[docs] def input_with_button(self, caption, callback, default="", label="Button"):
"""Create a compound field with an input field and a button::
+-------------------------+ +----------+
caption | <input field> | | <button> |
+-------------------------+ +----------+
:param caption: input field caption
:type caption: str
:param callback: callback function for the button
:type callback: function
:param default: default value for the input field
:type default: str
:param label: label for the button
:type label: str
:returns: (input_field, button)
:rtype: (accpac.UIField, accpac.UIButton)
To create a file browse input and button:
.. code-block:: python
file_path_fld, file_browse_btn = self.input_with_button(
"File", self.on_browse_click, label="Browse")
"""
# Create labeled text input field
_id = caption.title().replace(" ", "")
f = self.addUIField("fileField" + _id)
f.controlType = "EDIT"
f.size = 250
f.width = 5000
f.labelWidth = 60
f.caption = caption
f.hasFinder = False
if default:
f.setValue(default)
# Add the browse button.
bb = self.addButton("btn{}".format(_id), label)
bb.top = f.top
bb.width = self.BUTTON_WIDTH
bb.left = f.left + f.width + self.BUTTON_SPACE
bb.onClick = callback
f.btn = bb
return (f, bb)
[docs] def get_browse_click_callback(self, field, title="Select File", _filter=""):
"""Create the browse button callback in a closure to pass the field."""
def onBrowseClickCallback():
dialog = OpenFileDialog()
dialog.title = title
dialog.filter = _filter
dialog.onOK = self.get_file_ok_callback(field)
dialog.show(self)
return onBrowseClickCallback
[docs] def get_file_ok_callback(self, field):
"""Create the File OK callback in a closure to pass the field."""
def onFileOkCallback(value):
field.setValue(value)
ui_command("return", "4")
return onFileOkCallback