Browse Source

Reworked color picker, Added pos/size features to the layout

pull/14/head
Eugenio Parodi 5 years ago
parent
commit
96f7c4952e
  1. 26
      Makefile
  2. 6
      TermTk/TTkGui/theme.py
  3. 30
      TermTk/TTkLayouts/layout.py
  4. 119
      TermTk/TTkWidgets/TTkPickers/colorpicker.py
  5. 24
      TermTk/TTkWidgets/TTkPickers/dateTimePicker.py
  6. 2
      TermTk/TTkWidgets/listwidget.py
  7. 17
      demo/showcase/colorpicker.py
  8. 1
      docs/MDNotes/TODO.md

26
Makefile

@ -21,24 +21,24 @@ doc: .venv
make -C docs/ html ;
runGittk: .venv
. .venv/bin/activate
. .venv/bin/activate ; \
demo/gittk.py -f
runDemo: .venv
. .venv/bin/activate
. .venv/bin/activate ; \
demo/demo.py -f
build: .venv
. .venv/bin/activate
rm -rf dist
tools/prepareBuild.sh release
. .venv/bin/activate ; \
rm -rf dist ; \
tools/prepareBuild.sh release ; \
python3 -m build
buildTest: .venv
. .venv/bin/activate
rm -rf dist
tools/prepareBuild.sh test
python3 -m build
. .venv/bin/activate ; \
rm -rf dist ; \
tools/prepareBuild.sh test ; \
python3 -m build ; \
deployDoc:
git checkout gh-pages
@ -50,14 +50,14 @@ deployDoc:
git checkout main
deployTest: .venv
. .venv/bin/activate
. .venv/bin/activate ; \
python3 -m twine upload --repository testpypi dist/* --verbose
deploy: .venv
. .venv/bin/activate
. .venv/bin/activate ; \
python3 -m twine upload dist/*
test: .venv
. .venv/bin/activate
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics --exclude .venv,build,tmp
. .venv/bin/activate ; \
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics --exclude .venv,build,tmp ; \
pytest demo/demo.py

6
TermTk/TTkGui/theme.py

@ -75,7 +75,11 @@ class TTkTheme():
'','','',''),
(), # TODO: Grid 4
(), # TODO: Grid 5
(), # TODO: Grid 6
( # Grid 6
'','','','',
'',' ','','',
'','','','',
'','','',''),
(), # TODO: Grid 7
(), # TODO: Grid 8
( # Grid 9 ╒═╤╕

30
TermTk/TTkLayouts/layout.py

@ -43,6 +43,7 @@ class TTkLayoutItem:
'''
__slots__ = (
'_x', '_y', '_z', '_w', '_h',
'_maxw', '_maxh', '_minw', '_minh',
'_row','_col',
'_rowspan', '_colspan',
'_sMax', '_sMaxVal',
@ -50,7 +51,12 @@ class TTkLayoutItem:
'_alignment',
'_layoutItemType')
def __init__(self, *args, **kwargs):
self._x, self._y = 0, 0
self._x = kwargs.get('x', 0 )
self._y = kwargs.get('y', 0 )
self._x, self._y = kwargs.get('pos', (self._x, self._y))
self._w = kwargs.get('width' , 0 )
self._h = kwargs.get('height', 0 )
self._w, self._h = kwargs.get('size', (self._w, self._h))
self._z = kwargs.get('z',0)
self._row = kwargs.get('row', 0)
self._col = kwargs.get('col', 0)
@ -58,21 +64,27 @@ class TTkLayoutItem:
self._colspan = kwargs.get('colspan', 1)
self._layoutItemType = kwargs.get('layoutItemType', TTkK.NONE)
self._alignment = kwargs.get('alignment', TTkK.NONE)
self._w, self._h = 0, 0
self._sMax, self._sMin = False, False
self._sMaxVal, self._sMinVal = 0, 0
self._maxw = kwargs.get('maxWidth', 0x10000)
self._maxh = kwargs.get('maxHeight', 0x10000)
self._maxw, self._maxh = kwargs.get('maxSize', (self._maxw, self._maxh))
self._minw = kwargs.get('minWidth', 0x00000)
self._minh = kwargs.get('minHeight', 0x00000)
self._minw, self._minh = kwargs.get('minSize', (self._minw, self._minh))
def minimumSize(self):
return self.minimumWidth(), self.minimumHeight()
def minDimension(self,o)-> int: return 0
def minimumHeight(self) -> int: return 0
def minimumWidth(self) -> int: return 0
def minDimension(self,o)-> int: return self._minh if o == TTkK.HORIZONTAL else self._minw
def minimumHeight(self) -> int: return self._minh
def minimumWidth(self) -> int: return self._minw
def maximumSize(self):
return self.maximumWidth(), self.maximumHeight()
def maxDimension(self,o)-> int: return 0x1000
def maximumHeight(self) -> int: return 0x10000
def maximumWidth(self) -> int: return 0x10000
def maxDimension(self,o)-> int: return self._maxh if o == TTkK.HORIZONTAL else self._maxw
def maximumHeight(self) -> int: return self._maxh
def maximumWidth(self) -> int: return self._maxw
@staticmethod
def _calcSpanValue(value, pos, curpos, span):
@ -132,7 +144,7 @@ class TTkLayout(TTkLayoutItem):
'''
__slots__ = ('_items', '_zSortedItems', '_parent')
def __init__(self, *args, **kwargs):
TTkLayoutItem.__init__(self, args, kwargs)
TTkLayoutItem.__init__(self, *args, **kwargs)
self._items = []
self._zSortedItems = []
self._parent = None

119
TermTk/TTkWidgets/TTkPickers/colorpicker.py

@ -37,6 +37,7 @@ from TermTk.TTkWidgets.frame import TTkFrame
from TermTk.TTkWidgets.label import TTkLabel
from TermTk.TTkWidgets.lineedit import TTkLineEdit
from TermTk.TTkWidgets.spinbox import TTkSpinBox
from TermTk.TTkLayouts.layout import TTkLayout
from TermTk.TTkLayouts.gridlayout import TTkGridLayout
from TermTk.TTkTemplates.color import TColor
@ -245,11 +246,16 @@ class TTkColorDialogPicker(TTkWindow,TColor):
self.setLayout(TTkGridLayout())
colorLayout = TTkGridLayout() # Right
leftLayout = TTkGridLayout() # Left
# leftLayout = TTkFrame(border=False, transparent=True, minSize=(25,20), maxWidth=25) # Left
leftLayout = TTkLayout(minSize=(25,20), maxWidth=25) # Left
paletteFrame = TTkFrame(border=True, layout=TTkGridLayout(), title="Basic colors")
customFrame = TTkFrame(border=True, layout=TTkGridLayout(), title="Custom colors")
controlFrame = TTkFrame(border=True, minSize=(26,7) ,title="Conrols")
#paletteLayout = TTkFrame(border=True, layout=TTkGridLayout(), title="Basic colors")
#customLayout = TTkFrame(border=True, layout=TTkGridLayout(), title="Custom colors")
#controlLayout = TTkFrame(border=True, minSize=(26,7) , title="Conrols")
paletteLayout = TTkGridLayout(pos=(0,0), size=(24,9))
customLayout = TTkGridLayout(pos=(0,10), size=(24,4))
controlLayout = TTkLayout( pos=(0,15), size=(24,30))
# Color Layout Widgets
self._colorCanvas = _TTkColorCanvas()
@ -259,19 +265,21 @@ class TTkColorDialogPicker(TTkWindow,TColor):
self._hueCanvas.colorPicked.connect(self._colorCanvas.setHue)
# Control
sc = _TTkShowColor(pos=(1,2), size=(5,4), parent=controlFrame, color=TTkColor.bg('#ffffff'))
TTkLabel(pos=(2,1), parent=controlFrame,text="rgb:")
TTkLabel(pos=(7,2), parent=controlFrame,text="HTML:")
leR = TTkSpinBox(pos=(7,1), size=(5,1), parent=controlFrame, value=255, minimum=0, maximum=255)
leG = TTkSpinBox(pos=(13,1), size=(5,1), parent=controlFrame, value=255, minimum=0, maximum=255)
leB = TTkSpinBox(pos=(19,1), size=(5,1), parent=controlFrame, value=255, minimum=0, maximum=255)
controlLayout.addWidget( sc := _TTkShowColor(pos=(1,2), size=(5,4), color=TTkColor.bg('#ffffff')) )
controlLayout.addWidget( TTkLabel(pos=(2,1), text="rgb:") )
controlLayout.addWidget( TTkLabel(pos=(7,2), text="HTML:") )
controlLayout.addWidget( leR := TTkSpinBox(pos=(7,1), size=(5,1), value=255, minimum=0, maximum=255) )
controlLayout.addWidget( leG := TTkSpinBox(pos=(13,1), size=(5,1), value=255, minimum=0, maximum=255) )
controlLayout.addWidget( leB := TTkSpinBox(pos=(19,1), size=(5,1), value=255, minimum=0, maximum=255) )
leHTML = TTkLineEdit(pos=(13,2), size=(8,1), parent=controlFrame, text="#FFFFFF")
controlLayout.addWidget( leHTML := TTkLineEdit(pos=(13,2), size=(8,1), text="#FFFFFF") )
okButton = TTkButton(pos=(7,3), size=(6,3), text="OK", parent=controlFrame, border=True)
cancelButton = TTkButton(pos=(14,3), size=(10,3), text="CANCEL", parent=controlFrame, border=True)
controlLayout.addWidget( okButton := TTkButton(pos=(7,3), size=(6,3), text="OK", border=True) )
controlLayout.addWidget( cancelButton := TTkButton(pos=(14,3), size=(10,3), text="CANCEL", border=True) )
TTkLabel(pos=(3,20), parent=controlFrame,text="Seriously?")
controlLayout.addWidget( TTkLabel(pos=(3,20), text="Seriously?") )
# TODO: Get Rid of groupMove
#controlLayout.groupMoveTo(1, 15)
@pyTTkSlot()
def _okPressed():
@ -323,39 +331,34 @@ class TTkColorDialogPicker(TTkWindow,TColor):
_controlSetColor(self.color)
# Palette Layout Widgets
basicColorsLayout = TTkGridLayout()
basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#ff0000'), border=True, maxSize=(8,3)),0,0)
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#ff0000'), border=True, maxSize=(8,3)),0,0,1,2)
b.colorClicked.connect(_controlSetColor)
basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#ffff00'), border=True, maxSize=(8,3)),0,1)
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#ffff00'), border=True, maxSize=(8,3)),0,2,1,2)
b.colorClicked.connect(_controlSetColor)
basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#00ff00'), border=True, maxSize=(8,3)),0,2)
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#00ff00'), border=True, maxSize=(8,3)),0,4,1,2)
b.colorClicked.connect(_controlSetColor)
basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#00ffff'), border=True, maxSize=(8,3)),1,0)
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#00ffff'), border=True, maxSize=(8,3)),1,0,1,2)
b.colorClicked.connect(_controlSetColor)
basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#0000ff'), border=True, maxSize=(8,3)),1,1)
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#0000ff'), border=True, maxSize=(8,3)),1,2,1,2)
b.colorClicked.connect(_controlSetColor)
basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#ff00ff'), border=True, maxSize=(8,3)),1,2)
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#ff00ff'), border=True, maxSize=(8,3)),1,4,1,2)
b.colorClicked.connect(_controlSetColor)
shadesOfGreyLayout = TTkGridLayout()
shadesOfGreyLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(4,3)),2,0)
# Shades of Grey
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(4,3)),2,0)
b.colorClicked.connect(_controlSetColor)
shadesOfGreyLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#dddddd'), border=True, maxSize=(4,3)),2,1)
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#dddddd'), border=True, maxSize=(4,3)),2,1)
b.colorClicked.connect(_controlSetColor)
shadesOfGreyLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#aaaaaa'), border=True, maxSize=(4,3)),2,2)
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#aaaaaa'), border=True, maxSize=(4,3)),2,2)
b.colorClicked.connect(_controlSetColor)
shadesOfGreyLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#666666'), border=True, maxSize=(4,3)),2,3)
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#666666'), border=True, maxSize=(4,3)),2,3)
b.colorClicked.connect(_controlSetColor)
shadesOfGreyLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#333333'), border=True, maxSize=(4,3)),2,4)
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#333333'), border=True, maxSize=(4,3)),2,4)
b.colorClicked.connect(_controlSetColor)
shadesOfGreyLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#000000'), border=True, maxSize=(4,3)),2,5)
paletteLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#000000'), border=True, maxSize=(4,3)),2,5)
b.colorClicked.connect(_controlSetColor)
paletteFrame.layout().addItem(basicColorsLayout,0,0)
paletteFrame.layout().addItem(shadesOfGreyLayout,1,0)
# Custom frame
customButtonsLayout = TTkGridLayout()
if TTkColorDialogPicker.customButtons is None:
TTkColorDialogPicker.customButtons = (
_TTkColorButton(color=TTkColor.bg('#ffffff'), custom=True, border=True, maxSize=(3,3)) ,
@ -368,25 +371,25 @@ class TTkColorDialogPicker(TTkWindow,TColor):
_TTkColorButton(color=TTkColor.bg('#ffffff'), custom=True, border=True, maxSize=(3,3)) )
customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[0],0,0)
customLayout.addWidget(b:=TTkColorDialogPicker.customButtons[0],0,0)
b.colorClicked.connect(_controlSetColor)
customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[1],0,1)
customLayout.addWidget(b:=TTkColorDialogPicker.customButtons[1],0,1)
b.colorClicked.connect(_controlSetColor)
customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[2],0,2)
customLayout.addWidget(b:=TTkColorDialogPicker.customButtons[2],0,2)
b.colorClicked.connect(_controlSetColor)
customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[3],0,3)
customLayout.addWidget(b:=TTkColorDialogPicker.customButtons[3],0,3)
b.colorClicked.connect(_controlSetColor)
customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[4],0,4)
customLayout.addWidget(b:=TTkColorDialogPicker.customButtons[4],0,4)
b.colorClicked.connect(_controlSetColor)
customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[5],0,5)
customLayout.addWidget(b:=TTkColorDialogPicker.customButtons[5],0,5)
b.colorClicked.connect(_controlSetColor)
customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[6],0,6)
customLayout.addWidget(b:=TTkColorDialogPicker.customButtons[6],0,6)
b.colorClicked.connect(_controlSetColor)
customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[7],0,7)
customLayout.addWidget(b:=TTkColorDialogPicker.customButtons[7],0,7)
b.colorClicked.connect(_controlSetColor)
customFrame.layout().addItem(customButtonsLayout,0,0)
customFrame.layout().addWidget(b:=TTkButton(border=False, text='Add to Custom Colors'),1,0)
customLayout.addWidget(b:=TTkButton(border=False, text='Add to Custom Colors'),1,0,1,8)
@pyTTkSlot()
def _addCustomPressed():
btn = _TTkColorButton.lastClicked
@ -401,11 +404,33 @@ class TTkColorDialogPicker(TTkWindow,TColor):
self._colorCanvas.colorPicked.connect(_controlSetRGBColor)
self.layout().addItem(leftLayout ,0,0)
self.layout().addItem(colorLayout,0,1)
self.layout().addItem(colorLayout ,0,1)
leftLayout.addWidget(paletteFrame,0,0)
leftLayout.addWidget(customFrame ,1,0)
leftLayout.addWidget(controlFrame,2,0)
leftLayout.addItem(paletteLayout)
leftLayout.addItem(customLayout)
leftLayout.addItem(controlLayout)
# TODO: Get Rid of groupMove
leftLayout.groupMoveTo(1,3)
controlLayout.groupMoveTo(2, 18)
def paintEvent(self):
TTkWindow.paintEvent(self)
if self.hasFocus():
color = TTkCfg.theme.windowBorderColorFocus
else:
color = TTkCfg.theme.windowBorderColor
self._canvas.drawGrid(
pos=(0,2),size=(26,self._height-2),
hlines=(10,15), vlines=(),
color=color, grid=6)
gg = TTkCfg.theme.grid[6]
self._canvas.drawChar(pos=(0,2), char=gg[0x08], color=color)
self._canvas.drawChar(pos=(25,2), char=gg[0x02], color=color)
self._canvas.drawChar(pos=(25,self._height-1), char=gg[0x0E], color=color)
self._canvas.drawBoxTitle(pos=(0,2) , size=(26,0), text=" Basic colors ", align=TTkK.CENTER_ALIGN, color=color, colorText=TTkCfg.theme.frameTitleColor)
self._canvas.drawBoxTitle(pos=(0,12), size=(26,0), text=" Custom colors ", align=TTkK.CENTER_ALIGN, color=color, colorText=TTkCfg.theme.frameTitleColor)
self._canvas.drawBoxTitle(pos=(0,17), size=(26,0), text=" Conrols ", align=TTkK.CENTER_ALIGN, color=color, colorText=TTkCfg.theme.frameTitleColor)
class TTkColorButtonPicker(_TTkColorButton):
__slots__ = ('_type')
@ -426,7 +451,7 @@ class TTkColorButtonPicker(_TTkColorButton):
@pyTTkSlot()
def _colorClicked(self):
colorPicker = TTkColorDialogPicker(pos = (3,3), size=(75,28), color=self._textColor, title="Test Color Picker", border=True)
colorPicker = TTkColorDialogPicker(pos = (3,3), size=(75,24), color=self._textColor, title="Test Color Picker", border=True)
colorPicker.colorSelected.connect(self.colorSelected)
TTkHelper.overlay(self, colorPicker, -1,-1)

24
TermTk/TTkWidgets/TTkPickers/dateTimePicker.py

@ -0,0 +1,24 @@
#!/usr/bin/env python3
# MIT License
#
# Copyright (c) 2021 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# 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.

2
TermTk/TTkWidgets/listwidget.py

@ -160,7 +160,7 @@ class TTkListWidget(TTkAbstractScrollView):
def viewDisplayedSize(self) -> (int, int):
return self.size()
def addItem(self, item, ):
def addItem(self, item):
if isinstance(item, str):
label = TTkAbstractListItem(text=item, width=max(len(item),self.width()))
label.listItemClicked.connect(self._labelSelectedHandler)

17
demo/showcase/colorpicker.py

@ -22,7 +22,7 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import sys, os
import sys, os, argparse
sys.path.append(os.path.join(sys.path[0],'../..'))
import TermTk as ttk
@ -51,10 +51,21 @@ def demoColorPicker(root=None):
return frame
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-f', help='Full Screen', action='store_true')
args = parser.parse_args()
ttk.TTkLog.use_default_file_logging()
root = ttk.TTk()
win1 = ttk.TTkWindow(parent=root,pos = (0,0), size=(120,50), title="Test Color Picker", border=True, layout=ttk.TTkGridLayout())
demoColorPicker(win1)
if args.f:
root.setLayout(ttk.TTkGridLayout())
winColor1 = root
else:
winColor1 = ttk.TTkWindow(parent=root,pos = (0,0), size=(120,50), title="Test Color Picker", border=True, layout=ttk.TTkGridLayout())
demoColorPicker(winColor1)
root.mainloop()
if __name__ == "__main__":

1
docs/MDNotes/TODO.md

@ -60,6 +60,7 @@
- [x] Add addLayout (adDItem) method - Nested layouts
- [x] Add Grid Layout
- [x] Add ColSpan / RowSpan
- [ ] Get rid of groupMoveTo
### AbstractScrollArea
- [x] Implement something that mimic the QAbstactScrollArea

Loading…
Cancel
Save