"""
utility functions to work with gui objects
"""
from PyQt4 import QtCore


def layout_widgets(layout):
    """
    return a generator with all widgets in a layout
    """
    return (layout.itemAt(i) for i in range(layout.count()))


DELAY_MSECS = 50


def delay(obj, method_str=None, call_args=None):
    """
    Triggers a function or slot with a small delay.
    this is a mainly a hack to get responsiveness in the ui
    in cases in which the event loop freezes and the task
    is not heavy enough to setup a processing queue.
    """
    if callable(obj) and not method_str:
        fun = lambda: obj()

    if method_str:
        invoke = QtCore.QMetaObject.invokeMethod
        if call_args:
            fun = lambda: invoke(obj, method_str, call_args)
        else:
            fun = lambda: invoke(obj, method_str)

    QtCore.QTimer().singleShot(DELAY_MSECS, fun)