From a08bfc080b6bc98dac4393ce5f04730885d5754f Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Fri, 7 Jul 2023 11:59:29 +0100 Subject: [PATCH] uiLoader supports menuBar --- TermTk/TTkUiTools/uiloader.py | 39 +++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/TermTk/TTkUiTools/uiloader.py b/TermTk/TTkUiTools/uiloader.py index 78ce5d0b..6ebf3721 100644 --- a/TermTk/TTkUiTools/uiloader.py +++ b/TermTk/TTkUiTools/uiloader.py @@ -75,6 +75,25 @@ class TTkUiLoader(): @staticmethod def _loadDict_1_0_0(ui, baseWidget:TTkWidget=None, args=None): + def _setMenuButton(_menuButtonProp, _menuButton:TTkMenuButton): + if 'submenu' in _menuButtonProp: + for _sm in _menuButtonProp['submenu']: + if _sm == 'spacer': + _menuButton.addSpacer() + continue + _btn = _menuButton.addMenu(text=_sm['text'], checkable=_sm['checkable'], checked=_sm['checked']) + _setMenuButton(_sm,_btn) + + def _setMenuBar(_menuBarProp, _menuBar:TTkMenuBarLayout): + def __addMenu(__prop, __alignment): + for _bp in __prop: + _btn = _menuBar.addMenu(_bp['text'], alignment=__alignment) + _setMenuButton(_bp, _btn) + + if 'left' in _menuBarProp: __addMenu(_menuBarProp['left'], TTkK.LEFT_ALIGN) + if 'center' in _menuBarProp: __addMenu(_menuBarProp['center'], TTkK.CENTER_ALIGN) + if 'right' in _menuBarProp: __addMenu(_menuBarProp['right'], TTkK.RIGHT_ALIGN) + def _getWidget(_widProp, _baseWidget:TTkWidget=None, _args=None): properties = {} ttkClass = globals()[_widProp['class']] @@ -86,6 +105,7 @@ class TTkUiLoader(): # Init params to be configured with the setter setters = [] layout = _getLayout(_widProp['layout']) if 'layout' in _widProp else TTkLayout() + # Process the widget params for pname in _widProp['params']: if pname not in properties: continue if 'init' in properties[pname]: @@ -113,6 +133,7 @@ class TTkUiLoader(): 'cb':setcb, 'value': value, 'multi':type(setp['type']) is list}) + if _baseWidget is None: widget = ttkClass(**kwargs) else: @@ -122,15 +143,24 @@ class TTkUiLoader(): else: error = f"Base Widget '{_baseWidget.__class__.__name__}' is not a subclass of '{ttkClass.__name__}'" raise TypeError(error) + # Init params that don't have a constrictor for s in setters: if s['multi']: s['cb'](widget, *s['value']) else: s['cb'](widget, s['value']) - TTkLog.debug(widget) - # for c in _widProp['children']: - # widget.layout().addWidget(_getWidget(c)) + + # Process the optional menuBar params + if 'menuBar' in _widProp: + if 'top' in _widProp['menuBar']: + widget.setMenuBar(mb := TTkMenuBarLayout(), TTkK.TOP) + _setMenuBar(_widProp['menuBar']['top'], mb) + if 'bottom' in _widProp['menuBar']: + widget.setMenuBar(mb := TTkMenuBarLayout(), TTkK.BOTTOM) + _setMenuBar(_widProp['menuBar']['bottom'], mb) + + # TTkLog.debug(widget) return widget def _getLayout(_layprop, _baseWidget:TTkWidget=None): @@ -238,7 +268,8 @@ class TTkUiLoader(): :return: :class:`~TermTk.TTkWidgets.widget.TTkWidget` ''' - cb = {'1.0.0' : TTkUiLoader._loadDict_1_0_0 + cb = {'1.0.0' : TTkUiLoader._loadDict_1_0_0, + '1.0.1' : TTkUiLoader._loadDict_1_0_0 }.get(ui['version'], None) if cb: return cb(ui, baseWidget, kwargs)