Browse Source

Refined layout management in the designer

pull/99/head
Eugenio Parodi 3 years ago
parent
commit
b840e0ff1a
  1. 37
      ttkDesigner/app/propertyeditor.py
  2. 62
      ttkDesigner/app/superobj/superlayout.py
  3. 1
      ttkDesigner/app/superobj/superlayoutgrid.py
  4. 5
      ttkDesigner/app/superobj/superlayouthbox.py
  5. 1
      ttkDesigner/app/superobj/superlayoutvbox.py
  6. 17
      ttkDesigner/app/superobj/superwidget.py
  7. 2
      ttkDesigner/app/treeinspector.py

37
ttkDesigner/app/propertyeditor.py

@ -96,9 +96,25 @@ class PropertyEditor(ttk.TTkGridLayout):
def setDetail(self, widget, superWidget):
self._widget = widget
self._superWidget = superWidget
self._makeDetail(widget)
exceptions = {
'Layout' : {
'get': { 'cb': lambda _: superWidget._superLayout.layout().__class__ , 'type':'singleflag',
'flags': {
'TTkLayout' : ttk.TTkLayout ,
'TTkGridLayout' : ttk.TTkGridLayout ,
'TTkVBoxLayout' : ttk.TTkVBoxLayout ,
'TTkHBoxLayout' : ttk.TTkHBoxLayout } },
'set': { 'cb': lambda _,l: superWidget.changeSuperLayout(l) , 'type':'singleflag',
'flags': {
'TTkLayout' : ttk.TTkLayout ,
'TTkGridLayout' : ttk.TTkGridLayout ,
'TTkVBoxLayout' : ttk.TTkVBoxLayout ,
'TTkHBoxLayout' : ttk.TTkHBoxLayout } },
}
}
self._makeDetail(widget, exceptions)
def _makeDetail(self, domw):
def _makeDetail(self, domw, exceptions):
def _bound(_f,_w,_l):
def _ret(_v):
_f(_w,_l(_v))
@ -129,12 +145,12 @@ class PropertyEditor(ttk.TTkGridLayout):
# value = ttk.TTkFrame(layout=ttk.TTkVBoxLayout(), height=len(flags), border=False)
for fl in flags:
if 'set' in prop:
fcb = ttk.TTkCheckbox(text=f" 0x{flags[fl]:04X}", checked=bool(prop['get']['cb'](domw)&flags[fl]))
fcb = ttk.TTkCheckbox(text=f" 0x{flags[fl]:04X}", checked=bool(prop['get']['cb'](domw)&flags[fl]), height=1)
fcb.stateChanged.connect(_boundFlags(
prop['set']['cb'], prop['get']['cb'],
domw, lambda v: v==ttk.TTkK.Checked, flags[fl]))
else:
fcb = ttk.TTkCheckbox(text=f" 0x{flags[fl]:04X}", checked=bool(prop['get']['cb'](domw)&flags[fl]), enabled=False)
fcb = ttk.TTkCheckbox(text=f" 0x{flags[fl]:04X}", checked=bool(prop['get']['cb'](domw)&flags[fl]), height=1, enabled=False)
ret.addChild(ttk.TTkTreeWidgetItem([f"{fl}", fcb]))
return ret
@ -226,6 +242,12 @@ class PropertyEditor(ttk.TTkGridLayout):
value = ttk.TTkColorButtonPicker(color=getval, height=1)
value.colorSelected.connect(_bound(prop['set']['cb'],domw,lambda v:v))
return ttk.TTkTreeWidgetItem([name,value])
# Layout field
def _processTTkLayout(name, prop):
value = ttk.TTkComboBox(list=['TTkLayout','TTkGridLayout','TTkHBoxLayout','TTkVBoxLayout'], height=1)
value.setCurrentText(prop['get']['cb'](domw).__class__.__name__)
value.currentTextChanged.connect(_bound(prop['set']['cb'],domw, lambda v:globals()[v]()))
return ttk.TTkTreeWidgetItem([name,value])
# Unrecognised Field
def _processUnknown(name, prop):
@ -253,6 +275,8 @@ class PropertyEditor(ttk.TTkGridLayout):
return _processTTkString(p,prop,multiLine=False)
elif prop['get']['type'] == ttk.TTkColor and 'set' in prop:
return _processTTkColor(name, prop)
elif prop['get']['type'] == ttk.TTkLayout and 'set' in prop:
return _processTTkLayout(name, prop)
elif type(prop['get']['type']) == list:
return _processList(name, prop)
elif type(prop['get']['type']) == dict:
@ -270,7 +294,10 @@ class PropertyEditor(ttk.TTkGridLayout):
self._detail.addTopLevelItem(classItem)
if ccName in ttk.TTkUiProperties:
for p in ttk.TTkUiProperties[ccName]:
prop = ttk.TTkUiProperties[ccName][p]
if p in exceptions:
prop = exceptions[p]
else:
prop = ttk.TTkUiProperties[ccName][p]
if prop not in proplist:
proplist.append(prop)
classItem.addChild(_processProp(p, prop))

62
ttkDesigner/app/superobj/superlayout.py

@ -30,16 +30,16 @@ class SuperLayout(ttk.TTkWidget):
def __init__(self, lay, weModified, thingSelected, *args, **kwargs):
self.weModified = weModified
self.thingSelected = thingSelected
self._lay = ttk.TTkLayout()
self._lay = lay
self._dropBorder = 0 # This property is used to exclude the border from the drop routine
self._superRootWidget = kwargs.get('superRootWidget',False)
self._selectable = kwargs.get('selectable', False)
# kwargs['pos'] = (x,y) = lay.pos()
x,y = kwargs.get('pos',lay.pos())
kwargs['size'] = (w,h) = lay.size()
kwargs['layout'] = lay.__class__()
self._lay.setGeometry(x,y,w,h)
# x,y = kwargs.get('pos',lay.pos())
# kwargs['size'] = (w,h) = lay.size()
# kwargs['layout'] = lay # .__class__()
# self._lay.setGeometry(x,y,w,h)
super().__init__(*args, **kwargs)
@ -71,16 +71,17 @@ class SuperLayout(ttk.TTkWidget):
}
children.append(w.widget().dumpDict()|layoutItemParams)
ret = {'class': 'TTkLayout',
'params' : SuperObject.dumpParams(self._lay),
# 'params' : SuperObject.dumpParams(self._lay),
'params' : SuperObject.dumpParams(self.layout()),
'children':children}
return ret
def updateAll(self):
self.resize(*(self._lay.size()))
self.move(*(self._lay.pos()))
# self.resize(*(self._lay.size()))
# self.move(*(self._lay.pos()))
# self.setPadding(*(self._lay.getPadding()))
self.setMaximumSize(*(self._lay.maximumSize()))
self.setMinimumSize(*(self._lay.minimumSize()))
# self.setMaximumSize(*(self._lay.maximumSize()))
# self.setMinimumSize(*(self._lay.minimumSize()))
self.update()
def mousePressEvent(self, evt) -> bool:
@ -95,7 +96,7 @@ class SuperLayout(ttk.TTkWidget):
def mouseReleaseEvent(self, evt) -> bool:
if self._superRootWidget or not self._selectable: return False
self.pushSuperControlWidget()
self.thingSelected.emit(self._lay,self)
# self.thingSelected.emit(self._lay,self)
return True
def mouseDragEvent(self, evt) -> bool:
@ -110,7 +111,7 @@ class SuperLayout(ttk.TTkWidget):
drag.setPixmap(canvas)
drag.setData(data)
drag.exec()
self.parentWidget()._lay.removeItem(self._lay)
# self.parentWidget()._lay.removeItem(self._lay)
self.parentWidget().layout().removeWidget(self)
self.parentWidget().layout().update()
self.parentWidget().update()
@ -133,42 +134,42 @@ class SuperLayout(ttk.TTkWidget):
hsx,hsy = evt.hotSpot()
ttk.TTkLog.debug(f"Drop ({data.__class__.__name__}) -> pos={evt.pos()}")
if issubclass(type(data),ttk.TTkLayout):
_,__,w,h = data.geometry()
x,y = evt.x-hsx, evt.y-hsy
lay = ttk.TTkLayout()
if issubclass(type(data),ttk.TTkVBoxLayout):
sw = so.SuperLayoutVBox(lay=data, weModified=self.weModified, thingSelected=self.thingSelected, pos=(evt.x-hsx, evt.y-hsy), selectable=True)
sl = so.SuperLayoutVBox(pos=(x,y), size=(w,h), lay=lay, weModified=self.weModified, thingSelected=self.thingSelected, selectable=True)
elif issubclass(type(data),ttk.TTkHBoxLayout):
sw = so.SuperLayoutHBox(lay=data, weModified=self.weModified, thingSelected=self.thingSelected, pos=(evt.x-hsx, evt.y-hsy), selectable=True)
sl = so.SuperLayoutHBox(pos=(x,y), size=(w,h), lay=lay, weModified=self.weModified, thingSelected=self.thingSelected, selectable=True)
elif issubclass(type(data),ttk.TTkGridLayout):
sw = so.SuperLayoutGrid(lay=data, weModified=self.weModified, thingSelected=self.thingSelected, pos=(evt.x-hsx, evt.y-hsy), selectable=True)
sl = so.SuperLayoutGrid(pos=(x,y), size=(w,h), lay=lay, weModified=self.weModified, thingSelected=self.thingSelected, selectable=True)
else:
sw = so.SuperLayout(lay=data, weModified=self.weModified, thingSelected=self.thingSelected, pos=(evt.x-hsx, evt.y-hsy), selectable=True)
self.addSuperWidget(sw)
sl = so.SuperLayout( pos=(x,y), size=(w,h), lay=lay, weModified=self.weModified, thingSelected=self.thingSelected, selectable=True)
self.addSuperWidget(sl)
self._lay.addItem(data)
sl = sw
elif issubclass(type(data), so.SuperLayout):
sw = data
self.addSuperWidget(sw)
data = data._lay
self._lay.addItem(data)
sl = sw
sw.show()
sw.move(evt.x-hsx, evt.y-hsy)
sl = data
self.addSuperWidget(sl)
self._lay.addItem(sl._lay)
sl.show()
sl.move(evt.x-hsx, evt.y-hsy)
elif issubclass(type(data), so.SuperWidget):
sw = data
self.addSuperWidget(sw)
data = data._wid
self._lay.addWidget(sw._wid)
sl = sw._superLayout
sw.move(evt.x-hsx, evt.y-hsy)
sw.show()
self._lay.addWidget(data)
data.move(evt.x-hsx, evt.y-hsy)
elif issubclass(type(data),ttk.TTkWidget):
self.addSuperWidget(sw := so.SuperWidget(wid=data, weModified=self.weModified, thingSelected=self.thingSelected, pos=(evt.x-hsx, evt.y-hsy)))
sl = sw._superLayout
self._lay.addWidget(data)
data.move(evt.x-hsx, evt.y-hsy)
sw.move(evt.x-hsx, evt.y-hsy)
sl = sw._superLayout
else:
return False
self.layout().update()
# set the Drop Border in case this layout auto resize
if issubclass(type(self.layout()),ttk.TTkGridLayout):
sl.setDropBorder(1)
@ -182,7 +183,6 @@ class SuperLayout(ttk.TTkWidget):
def move(self, x: int, y: int):
w,h = self._lay.size()
self._lay.setGeometry(x,y,w,h)
# self.update()
return super().move(x, y)
def resizeEvent(self, w, h):

1
ttkDesigner/app/superobj/superlayoutgrid.py

@ -26,6 +26,7 @@ from .superlayout import SuperLayout
class SuperLayoutGrid(SuperLayout):
def __init__(self, *args, **kwargs):
kwargs['layout'] = ttk.TTkGridLayout()
super().__init__(*args, **kwargs)
self._dragOver = None

5
ttkDesigner/app/superobj/superlayouthbox.py

@ -24,4 +24,7 @@ import TermTk as ttk
import ttkDesigner.app.superobj as so
from .superlayout import SuperLayout
class SuperLayoutHBox(SuperLayout): pass
class SuperLayoutHBox(SuperLayout):
def __init__(self, *args, **kwargs):
kwargs['layout'] = ttk.TTkHBoxLayout()
super().__init__(*args, **kwargs)

1
ttkDesigner/app/superobj/superlayoutvbox.py

@ -26,6 +26,7 @@ from .superlayout import SuperLayout
class SuperLayoutVBox(SuperLayout):
def __init__(self, *args, **kwargs):
kwargs['layout'] = ttk.TTkVBoxLayout()
super().__init__(*args, **kwargs)
self._dragOver = None

17
ttkDesigner/app/superobj/superwidget.py

@ -34,7 +34,7 @@ class SuperWidget(ttk.TTkWidget):
self._wid = wid
self._wid.move(*kwargs['pos'])
self._wid._canvas.show()
self._superLayout = so.SuperLayout(lay=ttk.TTkLayout(), weModified=self.weModified, thingSelected=self.thingSelected,)
self._superLayout = so.SuperLayout(lay=self._wid.layout(), weModified=self.weModified, thingSelected=self.thingSelected,)
self._superRootWidget = kwargs.get('superRootWidget',False)
kwargs['layout'] = ttk.TTkGridLayout()
kwargs['layout'].addWidget(self._superLayout)
@ -73,6 +73,21 @@ class SuperWidget(ttk.TTkWidget):
}
return ret
def changeSuperLayout(self, layout):
sl = self._superLayout
self.layout().removeWidget(sl)
if layout == ttk.TTkVBoxLayout:
sl = so.SuperLayoutVBox(lay=self._wid.layout(), weModified=self.weModified, thingSelected=self.thingSelected, selectable=False)
elif layout == ttk.TTkHBoxLayout:
sl = so.SuperLayoutHBox(lay=self._wid.layout(), weModified=self.weModified, thingSelected=self.thingSelected, selectable=False)
elif layout == ttk.TTkGridLayout:
sl = so.SuperLayoutGrid(lay=self._wid.layout(), weModified=self.weModified, thingSelected=self.thingSelected, selectable=False)
else:
sl = so.SuperLayout( lay=self._wid.layout(), weModified=self.weModified, thingSelected=self.thingSelected, selectable=False)
self._superLayout = sl
self._wid.setLayout(layout())
self.layout().addWidget(sl)
def updateAll(self):
self.resize(*(self._wid.size()))
self.move(*(self._wid.pos()))

2
ttkDesigner/app/treeinspector.py

@ -96,7 +96,7 @@ class TreeInspector(ttk.TTkGridLayout):
if issubclass(type(superThing), SuperWidget):
thing = thing._wid
elif issubclass(type(superThing), SuperLayout):
thing = thing._lay
thing = thing.layout()
expanded = True # ttk.TTkHelper.isParent(widSelected,thing) if widSelected else False
if issubclass(type(superThing), SuperWidget):
top = _TTkTomTreeWidgetItem([

Loading…
Cancel
Save