Source code for magicclass.gui.menu_gui

from __future__ import annotations
from typing import Callable
import warnings
from inspect import signature
from magicgui.widgets import Image, Table, Label, FunctionGui
from magicgui.widgets._bases import ButtonWidget
from magicgui.widgets._bases.widget import Widget
from macrokit import Symbol
from qtpy.QtWidgets import QMenu

from .mgui_ext import AbstractAction, WidgetAction, _LabeledWidgetAction
from ._base import (
    BaseGui,
    PopUpMode,
    ErrorMode,
    ContainerLikeGui,
    nested_function_gui_callback,
)
from .utils import MagicClassConstructionError

from ..signature import get_additional_option
from ..fields import MagicField
from ..widgets import Separator, FreeWidget
from ..utils import iter_members


def _check_popupmode(popup_mode: PopUpMode):
    if popup_mode in (PopUpMode.above, PopUpMode.below, PopUpMode.first):
        msg = (
            f"magicmenu does not support popup mode {popup_mode.value}."
            "PopUpMode.popup is used instead"
        )
        warnings.warn(msg, UserWarning)
    elif popup_mode == PopUpMode.last:
        msg = (
            f"magicmenu does not support popup mode {popup_mode.value}."
            "PopUpMode.parentlast is used instead"
        )
        warnings.warn(msg, UserWarning)
        popup_mode = PopUpMode.parentlast

    return popup_mode





[docs]def insert_action_like(qmenu: QMenu, key: int, obj): """ Insert a QObject into a QMenu in a Pythonic way, like qmenu.insert(key, obj). Parameters ---------- qmenu : QMenu QMenu object to which object will be inserted. key : int Position to insert. obj : QMenu or QAction or "sep" Object to be inserted. """ actions = qmenu.actions() l = len(actions) if key < 0: key = key + l if key == l: if isinstance(obj, QMenu): qmenu.addMenu(obj) elif obj == "sep": qmenu.addSeparator() else: qmenu.addAction(obj) else: new_action = actions[key] before = new_action if isinstance(obj, QMenu): qmenu.insertMenu(before, obj) elif obj == "sep": qmenu.insertSeparator(before) else: qmenu.insertAction(before, obj)
[docs]class ContextMenuGui(MenuGuiBase): """Magic class that will be converted into a context menu."""
# TODO: Prevent more than one context menu