Browse Source

Basic implementation of the UiLoader

pull/115/head
Eugenio Parodi 3 years ago
parent
commit
955780fbef
  1. 2
      TermTk/TTkUiTools/properties/__init__.py
  2. 3
      TermTk/TTkUiTools/properties/button.py
  3. 16
      TermTk/TTkUiTools/properties/scrollbar.py
  4. 58
      TermTk/TTkUiTools/uiloader.py
  5. 1
      TermTk/TTkUiTools/uiproperties.py
  6. 18
      TermTk/TTkWidgets/button.py
  7. 3
      TermTk/TTkWidgets/scrollbar.py
  8. 14
      ttkDesigner/app/designer.py
  9. 1
      ttkDesigner/app/widgetbox.py
  10. 5
      ttkDesigner/app/windoweditor.py

2
TermTk/TTkUiTools/properties/__init__.py

@ -14,7 +14,7 @@ from .list_ import TTkListProperties
from .radiobutton import TTkRadioButtonProperties
from .resizableframe import TTkResizableFrameProperties
# from .scrollarea import
# from .scrollbar import
from .scrollbar import TTkScrollBarProperties
# from .spacer import
# from .spinbox import
from .splitter import TTkSplitterProperties

3
TermTk/TTkUiTools/properties/button.py

@ -28,6 +28,9 @@ TTkButtonProperties = {
'init': {'name':'text', 'type':TTkString },
'get': {'cb':TTkButton.text, 'type':TTkString } ,
'set': {'cb':TTkButton.setText, 'type':TTkString } },
'Border' : {
'init': {'name':'border', 'type':bool },
'get': {'cb':TTkButton.border, 'type':bool } },
'Checkable' : {
'init': {'name':'checkable', 'type':bool },
'get': {'cb':TTkButton.isCheckable, 'type':bool } ,

16
TermTk/TTkUiTools/properties/scrollbar.py

@ -21,3 +21,19 @@
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
from TermTk.TTkCore.string import TTkString
from TermTk.TTkCore.constant import TTkK
from TermTk.TTkWidgets.scrollbar import TTkScrollBar
TTkScrollBarProperties = {
'Orientation' : {
'init': {'name':'orientation', 'type':'singleflag',
'flags': {
'Horizontal' : TTkK.HORIZONTAL ,
'Vertical' : TTkK.VERTICAL } } ,
'get': {'cb':TTkScrollBar.orientation, 'type':'singleflag',
'flags': {
'Horizontal' : TTkK.HORIZONTAL ,
'Vertical' : TTkK.VERTICAL } } },
}

58
TermTk/TTkUiTools/uiloader.py

@ -20,5 +20,61 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import yaml
from TermTk import TTkLog
from TermTk.TTkLayouts import TTkLayout, TTkGridLayout, TTkVBoxLayout, TTkHBoxLayout
from TermTk.TTkWidgets import *
from TermTk.TTkUiTools.uiproperties import TTkUiProperties
class TTkUiLoader():
pass
@staticmethod
def loadYaml(text):
def _getWidget(widProp):
properties = {}
ttkClass = globals()[widProp['class']]
for cc in reversed(ttkClass.__mro__):
if cc.__name__ in TTkUiProperties:
properties |= TTkUiProperties[cc.__name__]
kwargs = {}
for pname in widProp['params']:
if 'init' in properties[pname]:
initp = properties[pname]['init']
name = initp['name']
if initp['type'] is TTkLayout:
value = globals()[widProp['params'][pname]]()
else:
value = widProp['params'][pname]
TTkLog.debug(f"{name=} {value=}")
kwargs |= {name: value}
widget = ttkClass(**kwargs)
TTkLog.debug(widget)
for c in widProp['children']:
widget.layout().addWidget(_getWidget(c))
return widget
widgetProperty = yaml.safe_load(text)
TTkLog.debug(widgetProperty)
# Yaml=
# params:
# Name: TTkButton
# Position:
# - 16
# - 5
#
# widgetProperty =
# { 'children': [],
# 'class': 'TTkWidget',
# 'params': {
# 'Enabled': True,
# 'Layout': 'TTkLayout',
# 'Name': 'TTk',
# 'Padding': [0, 0, 0, 0],
# 'Position': [4, 2],
# 'Size': [73, 28],
# 'Visible': True}}
return _getWidget(widgetProperty)

1
TermTk/TTkUiTools/uiproperties.py

@ -34,6 +34,7 @@ TTkUiProperties = {
TTkList.__name__: TTkListProperties,
TTkRadioButton.__name__: TTkRadioButtonProperties,
TTkResizableFrame.__name__: TTkResizableFrameProperties,
TTkScrollBar.__name__: TTkScrollBarProperties,
TTkSplitter.__name__: TTkSplitterProperties,
TTkWidget.__name__: TTkWidgetProperties,
TTkWindow.__name__: TTkWindowProperties,

18
TermTk/TTkWidgets/button.py

@ -120,6 +120,9 @@ class TTkButton(TTkWidget):
self.setMaximumHeight(1)
self.setFocusPolicy(TTkK.ClickFocus + TTkK.TabFocus)
def border(self):
return self._border
def isCheckable(self):
''' This property holds whether the button is checkable
@ -258,18 +261,3 @@ class TTkButton(TTkWidget):
self._canvas.drawText(pos=(0,y), color=borderColor ,text='[')
self._canvas.drawText(pos=(1+text.termWidth(),y), color=borderColor ,text=']')
self._canvas.drawText(pos=(1,y) ,text=text)
_ttkProperties = {
'Text' : {
'init': {'name':'text', 'type':TTkString },
'get': {'cb':text, 'type':TTkString } ,
'set': {'cb':setText, 'type':TTkString } },
'Checkable' : {
'init': {'name':'checkable', 'type':bool },
'get': {'cb':isCheckable, 'type':bool } ,
'set': {'cb':setCheckable, 'type':bool } },
'Checked' : {
'init': {'name':'checked', 'type':bool },
'get': {'cb':isChecked, 'type':bool } ,
'set': {'cb':setChecked, 'type':bool } },
}

3
TermTk/TTkWidgets/scrollbar.py

@ -76,6 +76,9 @@ class TTkScrollBar(TTkWidget):
self._mouseDelta = 0
self.setFocusPolicy(TTkK.ClickFocus)
def orientation(self):
return self._orientation
'''
| min | max
<-----XXXXX--------> scrollbar

14
ttkDesigner/app/designer.py

@ -35,6 +35,8 @@ from TermTk import TTkGridLayout, TTkVBoxLayout
from TermTk import TTkSplitter
from TermTk import TTkLogViewer, TTkTomInspector
from TermTk import TTkUiLoader
from .cfg import *
from .about import *
from .widgetbox import DragDesignItem, WidgetBox, WidgetBoxScrollArea
@ -131,5 +133,15 @@ class TTkDesigner(TTkGridLayout):
# debugSplit.addWidget(TTkLogViewer())
def preview(self, btn=None):
for line in self._windowEditor.getYaml().split('\n'):
yaml = self._windowEditor.getYaml()
for line in yaml.split('\n'):
TTkLog.debug(f"{line}")
widget = TTkUiLoader.loadYaml(yaml)
win = TTkWindow(
title="Mr Terminal",
size=(50,20),
layout=TTkGridLayout(),
flags=TTkK.WindowFlag.WindowMaximizeButtonHint|TTkK.WindowFlag.WindowCloseButtonHint)
win.layout().addWidget(widget)
TTkHelper.overlay(None, win, 2, 2)

1
ttkDesigner/app/widgetbox.py

@ -35,6 +35,7 @@ dWidgets = {
},
'Buttons':{
"Button" : { "class":ttk.TTkButton, "params":{'size':(20,3), 'text':'Button', 'border':True, }},
"Button Slim" : { "class":ttk.TTkButton, "params":{'size':(20,1), 'text':'Button', 'border':False, }},
"Checkbox" : { "class":ttk.TTkCheckbox, "params":{'size':(20,1), 'text':'Checkbox' }},
"Radio Button" : { "class":ttk.TTkRadioButton, "params":{'size':(20,1), 'text':'Radio b.' }},
},

5
ttkDesigner/app/windoweditor.py

@ -20,9 +20,10 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import TermTk as ttk
import yaml
import TermTk as ttk
class SuperControlWidget(ttk.TTkResizableFrame):
def __init__(self, wid, *args, **kwargs):
self._wid = wid
@ -161,7 +162,7 @@ class SuperWidget(ttk.TTkWidget):
params |= {p: _dumpTTkString(propCb(wid))}
elif propType is ttk.TTkColor:
params |= {p: _dumpTTkColor(propCb(wid))}
elif propType in ('singleFlag','multiFlag'):
elif propType in ('singleflag','multiflags'):
params |= {p: _dumpFlag(propCb(wid))}
else:
ttk.TTkLog.warn("Type not Recognised")

Loading…
Cancel
Save