Browse Source

Added hasBackground,hasForeground as olor method and adapted the sources to it

pull/292/head
Eugenio Parodi 1 year ago
parent
commit
39c98423e6
  1. 4
      TermTk/TTkCore/canvas.py
  2. 16
      TermTk/TTkCore/color.py
  3. 25
      TermTk/TTkCore/constant.py
  4. 2
      TermTk/TTkTestWidgets/testwidgetsizes.py
  5. 42
      TermTk/TTkWidgets/TTkModelView/tablewidget.py
  6. 18
      TermTk/TTkWidgets/TTkPickers/colorpicker.py
  7. 4
      TermTk/TTkWidgets/TTkPickers/textpicker.py
  8. 4
      demo/showcase/textedit.py
  9. 4
      tests/t.ui/test.ui.020.TextEdit.01.UndoRedo.py
  10. 4
      tools/dumb.image.tool.py
  11. 32
      tools/dumbPaintTool/app/canvaslayer.py
  12. 5
      tools/dumbPaintTool/app/importimage.py
  13. 8
      tools/dumbPaintTool/app/paintarea.py
  14. 4
      tools/dumbPaintTool/app/painttoolkit.py
  15. 4
      tools/dumbPaintTool/app/textarea.py
  16. 4
      tools/dumbPaintTool/app/toolspanel.py
  17. 4
      tools/ttkDesigner/app/notepad.py

4
TermTk/TTkCore/canvas.py

@ -157,7 +157,7 @@ class TTkCanvas():
fillCh = [char]*(fxb-fxa) fillCh = [char]*(fxb-fxa)
for iy in range(fya,fyb): for iy in range(fya,fyb):
self._data[iy][fxa:fxb] = fillCh self._data[iy][fxa:fxb] = fillCh
if color.colorType() & TTkK.Modifier: if color.colorType() & TTkK.ColorType.ColorModifier:
for iy in range(fya,fyb): for iy in range(fya,fyb):
for ix in range(fxa,fxb): for ix in range(fxa,fxb):
self._colors[iy][ix] = color.mod(fxa+ix,fya+iy) self._colors[iy][ix] = color.mod(fxa+ix,fya+iy)
@ -240,7 +240,7 @@ class TTkCanvas():
self._data[y][x+i] = txt[i] self._data[y][x+i] = txt[i]
if colors[i] == TTkColor.RST != color: if colors[i] == TTkColor.RST != color:
self._colors[y][x+i] = color.mod(x+i,y) self._colors[y][x+i] = color.mod(x+i,y)
elif (not colors[i].background()) and color.background(): elif (not colors[i].hasBackground()) and color.hasBackground():
self._colors[y][x+i] = (color + colors[i]).mod(x+i,y) self._colors[y][x+i] = (color + colors[i]).mod(x+i,y)
else: else:
self._colors[y][x+i] = colors[i].mod(x+i,y) self._colors[y][x+i] = colors[i].mod(x+i,y)

16
TermTk/TTkCore/color.py

@ -21,6 +21,7 @@
# SOFTWARE. # SOFTWARE.
__all__ = ['TTkColor', __all__ = ['TTkColor',
'TTkColorModifier',
'TTkColorGradient', 'TTkLinearGradient', 'TTkAlternateColor'] 'TTkColorGradient', 'TTkLinearGradient', 'TTkAlternateColor']
from TermTk.TTkCore.TTkTerm.colors import TTkTermColor from TermTk.TTkCore.TTkTerm.colors import TTkTermColor
@ -112,8 +113,9 @@ class _TTkColor:
def colorType(self): def colorType(self):
return ( return (
( TTkK.Foreground if self._fg else TTkK.NONE ) | ( TTkK.ColorType.ColorModifier if self._colorMod else TTkK.NONE ) |
( TTkK.Background if self._bg else TTkK.NONE ) ) ( TTkK.ColorType.Foreground if self._fg else TTkK.NONE ) |
( TTkK.ColorType.Background if self._bg else TTkK.NONE ) )
@staticmethod @staticmethod
def rgb2hsl(rgb): def rgb2hsl(rgb):
@ -458,12 +460,12 @@ class _TTkColor_mod_link(_TTkColor_mod):
return ret return ret
class _TTkColorModifier(): class TTkColorModifier():
def __init__(self, *args, **kwargs) -> None: pass def __init__(self, *args, **kwargs) -> None: pass
def setParam(self, *args, **kwargs) -> None: pass def setParam(self, *args, **kwargs) -> None: pass
def copy(self): return self def copy(self): return self
class TTkColorGradient(_TTkColorModifier): class TTkColorGradient(TTkColorModifier):
'''TTkColorGradient''' '''TTkColorGradient'''
__slots__ = ('_fgincrement', '_bgincrement', '_val', '_step', '_buffer', '_orientation') __slots__ = ('_fgincrement', '_bgincrement', '_val', '_step', '_buffer', '_orientation')
@ -515,7 +517,7 @@ class TTkColorGradient(_TTkColorModifier):
def copy(self): def copy(self):
return self return self
class TTkLinearGradient(_TTkColorModifier): class TTkLinearGradient(TTkColorModifier):
'''TTkLinearGradient''' '''TTkLinearGradient'''
__slots__ = ( __slots__ = (
@ -740,7 +742,7 @@ class TTkColor(_TTkColor):
return _TTkColor(bg=TTkColor.hexToRGB(color), colorMod=mod) return _TTkColor(bg=TTkColor.hexToRGB(color), colorMod=mod)
@staticmethod @staticmethod
def fgbg(fg:str='', bg:str='', link:str='', modifier:_TTkColorModifier=None): def fgbg(fg:str='', bg:str='', link:str='', modifier:TTkColorModifier=None):
''' Helper to generate a Background color ''' Helper to generate a Background color
Example: Example:
@ -765,7 +767,7 @@ class TTkColor(_TTkColor):
else: else:
return _TTkColor(fg=TTkColor.hexToRGB(fg), bg=TTkColor.hexToRGB(bg), colorMod=modifier) return _TTkColor(fg=TTkColor.hexToRGB(fg), bg=TTkColor.hexToRGB(bg), colorMod=modifier)
class TTkAlternateColor(_TTkColorModifier): class TTkAlternateColor(TTkColorModifier):
'''TTkAlternateColor''' '''TTkAlternateColor'''
__slots__ = ('_alternateColor') __slots__ = ('_alternateColor')

25
TermTk/TTkCore/constant.py

@ -35,14 +35,29 @@ class TTkConstant:
# Color Type # Color Type
class ColorType(int): class ColorType(int):
Foreground = 0x01 '''
Background = 0x02 This Class type defines the various elements included in :py:class:`TTkColor`.
Modifier = 0x04
Link = 0x08 .. autosummary::
Foreground
Background
Modifier
Link
ColorModifier
'''
Foreground = 0x01
'''The :py:class:`TTkColor` has a foreground color defined'''
Background = 0x02
'''The :py:class:`TTkColor` has a background color defined'''
Modifier = 0x04
'''The :py:class:`TTkColor` include one or more of **BOLD**, **ITALIC**, **UNDERLINE**, **STRIKETROUGH**, **BLINKING**'''
Link = 0x08
'''The :py:class:`TTkColor` include an hyperlink'''
ColorModifier = 0x08
'''The :py:class:`TTkColor` include a color modifier based on :py:class:`TTkColorModifier`'''
Foreground = ColorType.Foreground Foreground = ColorType.Foreground
Background = ColorType.Background Background = ColorType.Background
Modifier = ColorType.Modifier Modifier = ColorType.Modifier
Link = ColorType.Link
class FocusPolicy(int): class FocusPolicy(int):
''' '''

2
TermTk/TTkTestWidgets/testwidgetsizes.py

@ -38,7 +38,7 @@ class TTkTestWidgetSizes(TTkFrame):
w,h = self.size() w,h = self.size()
style = self.currentStyle() style = self.currentStyle()
color = style['color'] color = style['color']
if color.background(): if color.hasBackground():
canvas.fill(pos=(0,0), size=(w,h), color=color) canvas.fill(pos=(0,0), size=(w,h), color=color)
borderColor = style['borderColor'] borderColor = style['borderColor']
canvas.drawText(pos=(l,t+0), color=color, text=f"Test Widget [{self._name}]") canvas.drawText(pos=(l,t+0), color=color, text=f"Test Widget [{self._name}]")

42
TermTk/TTkWidgets/TTkModelView/tablewidget.py

@ -1588,14 +1588,14 @@ class TTkTableWidget(TTkAbstractScrollView):
_sa = self._selected[_row ][_col ] _sa = self._selected[_row ][_col ]
_sb = self._selected[_row+1][_col ] _sb = self._selected[_row+1][_col ]
if (showHS and showVS) and _sa and not _sb: if (showHS and showVS) and _sa and not _sb:
_bgA:TTkColor = c if (c:=cellColor.background()) else TTkColor.RST _bgA:TTkColor = cellColor.background()
_bgB:TTkColor = TTkColor.RST _bgB:TTkColor = TTkColor.RST
elif (showHS and showVS) and not _sa and _sb: elif (showHS and showVS) and not _sa and _sb:
_bgA:TTkColor = TTkColor.RST _bgA:TTkColor = TTkColor.RST
_bgB:TTkColor = c if (c:=_belowColor.background()) else TTkColor.RST _bgB:TTkColor = _belowColor.background()
else: else:
_bgA:TTkColor = c if (c:=cellColor.background()) else TTkColor.RST _bgA:TTkColor = cellColor.background()
_bgB:TTkColor = c if (c:=_belowColor.background()) else TTkColor.RST _bgB:TTkColor = _belowColor.background()
if _bgA == _bgB: if _bgA == _bgB:
_char='' _char=''
@ -1610,13 +1610,12 @@ class TTkTableWidget(TTkAbstractScrollView):
_char='' _char=''
_color=_bgB + _bgA.invertFgBg() _color=_bgB + _bgA.invertFgBg()
else: else:
_bgA:TTkColor = c if (c:=cellColor.background()) else TTkColor.RST
if self._selected[_row ][_col ]: if self._selected[_row ][_col ]:
_char='' _char=''
_color=selectedColorInv _color=selectedColorInv
elif _bgA:=cellColor.background(): elif cellColor.hasBackground():
_char='' _char=''
_color=_bgA.invertFgBg() _color=cellColor.background().invertFgBg()
else: else:
_char='' _char=''
_color=lineColor _color=lineColor
@ -1631,14 +1630,14 @@ class TTkTableWidget(TTkAbstractScrollView):
_sa = self._selected[_row ][_col ] _sa = self._selected[_row ][_col ]
_sc = self._selected[_row ][_col+1] _sc = self._selected[_row ][_col+1]
if (showHS and showVS) and _sa and not _sc: if (showHS and showVS) and _sa and not _sc:
_bgA:TTkColor = c if (c:=cellColor.background()) else TTkColor.RST _bgA:TTkColor = cellColor.background()
_bgC:TTkColor = TTkColor.RST _bgC:TTkColor = TTkColor.RST
elif (showHS and showVS) and not _sa and _sc: elif (showHS and showVS) and not _sa and _sc:
_bgA:TTkColor = TTkColor.RST _bgA:TTkColor = TTkColor.RST
_bgC:TTkColor = c if (c:=_rightColor.background()) else TTkColor.RST _bgC:TTkColor = _rightColor.background()
else: else:
_bgA:TTkColor = c if (c:=cellColor.background()) else TTkColor.RST _bgA:TTkColor = cellColor.background()
_bgC:TTkColor = c if (c:=_rightColor.background()) else TTkColor.RST _bgC:TTkColor = _rightColor.background()
if _bgA == _bgC: if _bgA == _bgC:
_char='' _char=''
@ -1653,13 +1652,12 @@ class TTkTableWidget(TTkAbstractScrollView):
_char='' _char=''
_color=_bgC + _bgA.invertFgBg() _color=_bgC + _bgA.invertFgBg()
else: else:
_bgA:TTkColor = c if (c:=cellColor.background()) else TTkColor.RST
if self._selected[_row ][_col ]: if self._selected[_row ][_col ]:
_char='' _char=''
_color=selectedColorInv _color=selectedColorInv
elif _bgA:=cellColor.background(): elif cellColor.hasBackground():
_char=' ' _char=' '
_color=_bgA _color=cellColor.background()
else: else:
_char='' _char=''
_color=lineColor _color=lineColor
@ -1688,8 +1686,8 @@ class TTkTableWidget(TTkAbstractScrollView):
0x08 * self._selected[_row+1][_col+1] ) 0x08 * self._selected[_row+1][_col+1] )
if chId==0x00 or chId==0x0F: if chId==0x00 or chId==0x0F:
_belowColor:TTkColor = _colorCache2d[_row+1-rowa][_col-cola] _belowColor:TTkColor = _colorCache2d[_row+1-rowa][_col-cola]
_bgA:TTkColor = c if (c:=cellColor.background()) else TTkColor.RST _bgA:TTkColor = cellColor.background()
_bgB:TTkColor = c if (c:=_belowColor.background()) else TTkColor.RST _bgB:TTkColor = _belowColor.background()
if _bgA == _bgB: if _bgA == _bgB:
_color = lineColor if _bgA == TTkColor.RST else _bgA + lineColor _color = lineColor if _bgA == TTkColor.RST else _bgA + lineColor
@ -1714,9 +1712,9 @@ class TTkTableWidget(TTkAbstractScrollView):
if chId: if chId:
_char = _charList[chId] _char = _charList[chId]
_color=selectedColorInv _color=selectedColorInv
elif _c:=cellColor.background(): elif cellColor.hasBackground():
_char='' _char=''
_color = _c.invertFgBg() _color = cellColor.background().invertFgBg()
else: else:
_char = '' _char = ''
_color = lineColor _color = lineColor
@ -1725,8 +1723,8 @@ class TTkTableWidget(TTkAbstractScrollView):
(0x01) * self._selected[row ][col ] + (0x01) * self._selected[row ][col ] +
(0x04) * self._selected[row+1][col ] ) (0x04) * self._selected[row+1][col ] )
_belowColor:TTkColor = _colorCache2d[_row+1-rowa][_col-cola] _belowColor:TTkColor = _colorCache2d[_row+1-rowa][_col-cola]
_bgA:TTkColor = c if (c:=cellColor.background()) else TTkColor.RST _bgA:TTkColor = cellColor.background()
_bgB:TTkColor = c if (c:=_belowColor.background()) else TTkColor.RST _bgB:TTkColor = _belowColor.background()
if chId: if chId:
_char = _charList[chId] _char = _charList[chId]
@ -1749,9 +1747,9 @@ class TTkTableWidget(TTkAbstractScrollView):
if chId: if chId:
_char = _charList[chId] _char = _charList[chId]
_color=selectedColorInv _color=selectedColorInv
elif _c:=cellColor.background(): elif cellColor.hasBackground():
_char='' _char=''
_color = _c.invertFgBg() _color = cellColor.background().invertFgBg()
else: else:
_char = '' _char = ''
_color = lineColor _color = lineColor

18
TermTk/TTkWidgets/TTkPickers/colorpicker.py

@ -207,9 +207,9 @@ class _TTkColorButton(TTkButton):
style = self.style() style = self.style()
for t in style: for t in style:
if 'color' in style[t]: if 'color' in style[t]:
if TTkK.ColorType.Foreground & (colorType := color.colorType()): if color.hasForeground():
style[t]['color'] = color.foreground().invertFgBg() style[t]['color'] = color.foreground().invertFgBg()
elif TTkK.ColorType.Background & colorType: elif color.hasBackground():
style[t]['color'] = color.background() style[t]['color'] = color.background()
else: else:
style[t]['color'] = TTkColor.BG_BLACK style[t]['color'] = TTkColor.BG_BLACK
@ -224,12 +224,12 @@ class _TTkColorButton(TTkButton):
def color(self) -> TTkColor: def color(self) -> TTkColor:
if self._returnType==TTkK.ColorPickerReturnType.Foreground: if self._returnType==TTkK.ColorPickerReturnType.Foreground:
if self._color.colorType() & TTkK.ColorType.Foreground: if self._color.hasForeground():
return self._color.foreground() return self._color.foreground()
else: else:
return self._color.background().invertFgBg() return self._color.background().invertFgBg()
if self._returnType==TTkK.ColorPickerReturnType.Background: if self._returnType==TTkK.ColorPickerReturnType.Background:
if self._color.colorType() & TTkK.ColorType.Background: if self._color.hasBackground():
return self._color.background() return self._color.background()
else: else:
return self._color.foreground().invertFgBg() return self._color.foreground().invertFgBg()
@ -367,7 +367,7 @@ class TTkColorDialogPicker(TTkWindow):
self.colorSelected = pyTTkSignal(TTkColor) self.colorSelected = pyTTkSignal(TTkColor)
self._returnType=returnType self._returnType=returnType
self._color:TTkColor=color if color and color!=TTkColor.RST else TTkColor.BLACK self._color:TTkColor=color if color and color!=TTkColor.RST else TTkColor.BLACK
self._isForeground:bool = not (color.colorType()&TTkK.Background)!=0 self._isForeground:bool = color.hasForeground() or not color.hasBackground()
super().__init__(**kwargs) super().__init__(**kwargs)
self.setWindowFlag(TTkK.WindowFlag.WindowMaximizeButtonHint | TTkK.WindowFlag.WindowCloseButtonHint) self.setWindowFlag(TTkK.WindowFlag.WindowMaximizeButtonHint | TTkK.WindowFlag.WindowCloseButtonHint)
self.setLayout(TTkGridLayout()) self.setLayout(TTkGridLayout())
@ -554,12 +554,12 @@ class TTkColorDialogPicker(TTkWindow):
:rtype: :py:class:`TTkColor` :rtype: :py:class:`TTkColor`
''' '''
if self._returnType==TTkK.ColorPickerReturnType.Foreground: if self._returnType==TTkK.ColorPickerReturnType.Foreground:
if self._color.colorType() & TTkK.ColorType.Foreground: if self._color.hasForeground():
return self._color.foreground() return self._color.foreground()
else: else:
return self._color.background().invertFgBg() return self._color.background().invertFgBg()
if self._returnType==TTkK.ColorPickerReturnType.Background: if self._returnType==TTkK.ColorPickerReturnType.Background:
if self._color.colorType() & TTkK.ColorType.Background: if self._color.hasBackground():
return self._color.background() return self._color.background()
else: else:
return self._color.foreground().invertFgBg() return self._color.foreground().invertFgBg()
@ -671,10 +671,10 @@ class TTkColorButtonPicker(_TTkColorButton):
@pyTTkSlot(TTkColor) @pyTTkSlot(TTkColor)
def _processColorSelected(self, color:TTkColor): def _processColorSelected(self, color:TTkColor):
if TTkK.ColorType.Foreground & (colorType := color.colorType()): if color.hasForeground():
fg = color.foreground() fg = color.foreground()
bg = color.foreground().invertFgBg() bg = color.foreground().invertFgBg()
elif TTkK.ColorType.Background & colorType: elif color.hasBackground():
fg = color.background().invertFgBg() fg = color.background().invertFgBg()
bg = color.background() bg = color.background()
else: else:

4
TermTk/TTkWidgets/TTkPickers/textpicker.py

@ -173,7 +173,7 @@ class TTkTextDialogPicker(TTkWindow):
@pyTTkSlot(TTkColor) @pyTTkSlot(TTkColor)
def _currentColorChangedCB(format:TTkColor): def _currentColorChangedCB(format:TTkColor):
if TTkK.ColorType.Foreground & (colorType := format.colorType()): if format.hasForeground():
cb_fg.setCheckState(TTkK.Checked) cb_fg.setCheckState(TTkK.Checked)
btn_fgColor.setEnabled() btn_fgColor.setEnabled()
btn_fgColor.setColor(format.foreground()) btn_fgColor.setColor(format.foreground())
@ -181,7 +181,7 @@ class TTkTextDialogPicker(TTkWindow):
cb_fg.setCheckState(TTkK.Unchecked) cb_fg.setCheckState(TTkK.Unchecked)
btn_fgColor.setDisabled() btn_fgColor.setDisabled()
if TTkK.ColorType.Background & colorType: if format.hasBackground():
cb_bg.setCheckState(TTkK.Checked) cb_bg.setCheckState(TTkK.Checked)
btn_bgColor.setEnabled() btn_bgColor.setEnabled()
btn_bgColor.setColor(format.background()) btn_bgColor.setColor(format.background())

4
demo/showcase/textedit.py

@ -158,7 +158,7 @@ def demoTextEdit(root=None, document=None):
@ttk.pyTTkSlot(ttk.TTkColor) @ttk.pyTTkSlot(ttk.TTkColor)
def _currentColorChangedCB(format:ttk.TTkColor): def _currentColorChangedCB(format:ttk.TTkColor):
if ttk.TTkK.ColorType.Foreground & (colorType := format.colorType()): if format.hasForeground():
cb_fg.setCheckState(ttk.TTkK.Checked) cb_fg.setCheckState(ttk.TTkK.Checked)
btn_fgColor.setEnabled() btn_fgColor.setEnabled()
btn_fgColor.setColor(format.foreground()) btn_fgColor.setColor(format.foreground())
@ -166,7 +166,7 @@ def demoTextEdit(root=None, document=None):
cb_fg.setCheckState(ttk.TTkK.Unchecked) cb_fg.setCheckState(ttk.TTkK.Unchecked)
btn_fgColor.setDisabled() btn_fgColor.setDisabled()
if ttk.TTkK.ColorType.Background & colorType: if format.hasBackground():
cb_bg.setCheckState(ttk.TTkK.Checked) cb_bg.setCheckState(ttk.TTkK.Checked)
btn_bgColor.setEnabled() btn_bgColor.setEnabled()
btn_bgColor.setColor(format.background()) btn_bgColor.setColor(format.background())

4
tests/t.ui/test.ui.020.TextEdit.01.UndoRedo.py

@ -77,7 +77,7 @@ def demoTextEdit(root=None, document=None):
@ttk.pyTTkSlot(ttk.TTkColor) @ttk.pyTTkSlot(ttk.TTkColor)
def _currentColorChangedCB(format:ttk.TTkColor): def _currentColorChangedCB(format:ttk.TTkColor):
if ttk.TTkK.ColorType.Foreground & (colorType := format.colorType()): if format.hasForeground():
cb_fg.setCheckState(ttk.TTkK.Checked) cb_fg.setCheckState(ttk.TTkK.Checked)
btn_fgColor.setEnabled() btn_fgColor.setEnabled()
btn_fgColor.setColor(format.foreground()) btn_fgColor.setColor(format.foreground())
@ -85,7 +85,7 @@ def demoTextEdit(root=None, document=None):
cb_fg.setCheckState(ttk.TTkK.Unchecked) cb_fg.setCheckState(ttk.TTkK.Unchecked)
btn_fgColor.setDisabled() btn_fgColor.setDisabled()
if ttk.TTkK.ColorType.Background & colorType: if format.hasBackground():
cb_bg.setCheckState(ttk.TTkK.Checked) cb_bg.setCheckState(ttk.TTkK.Checked)
btn_bgColor.setEnabled() btn_bgColor.setEnabled()
btn_bgColor.setColor(format.background()) btn_bgColor.setColor(format.background())

4
tools/dumb.image.tool.py

@ -85,7 +85,7 @@ class Ansieditor(ttk.TTkGridLayout):
@ttk.pyTTkSlot(ttk.TTkColor) @ttk.pyTTkSlot(ttk.TTkColor)
def _currentColorChangedCB(format:ttk.TTkColor): def _currentColorChangedCB(format:ttk.TTkColor):
if ttk.TTkK.ColorType.Foreground & (colorType := format.colorType()): if format.hasForeground():
cb_fg.setCheckState(ttk.TTkK.Checked) cb_fg.setCheckState(ttk.TTkK.Checked)
btn_fgColor.setEnabled() btn_fgColor.setEnabled()
btn_fgColor.setColor(format.foreground()) btn_fgColor.setColor(format.foreground())
@ -93,7 +93,7 @@ class Ansieditor(ttk.TTkGridLayout):
cb_fg.setCheckState(ttk.TTkK.Unchecked) cb_fg.setCheckState(ttk.TTkK.Unchecked)
btn_fgColor.setDisabled() btn_fgColor.setDisabled()
if ttk.TTkK.ColorType.Background & colorType: if format.hasBackground():
cb_bg.setCheckState(ttk.TTkK.Checked) cb_bg.setCheckState(ttk.TTkK.Checked)
btn_bgColor.setEnabled() btn_bgColor.setEnabled()
btn_bgColor.setColor(format.background()) btn_bgColor.setColor(format.background())

32
tools/dumbPaintTool/app/canvaslayer.py

@ -148,7 +148,7 @@ class CanvasLayer():
data = self._data data = self._data
colors = self._colors colors = self._colors
if 0<=x<w and 0<=y<h: if 0<=x<w and 0<=y<h:
return data[oy+y][ox+x] != ' ' or colors[oy+y][ox+x].background() return data[oy+y][ox+x] != ' ' or colors[oy+y][ox+x].hasBackground()
return False return False
def move(self,x,y): def move(self,x,y):
@ -251,7 +251,7 @@ class CanvasLayer():
xa,xb,ya,yb = 0x10000,0,0x10000,0 xa,xb,ya,yb = 0x10000,0,0x10000,0
for y,(drow,crow) in enumerate(zip(data,colors)): for y,(drow,crow) in enumerate(zip(data,colors)):
for x,(d,c) in enumerate(zip(drow,crow)): for x,(d,c) in enumerate(zip(drow,crow)):
if d != ' ' or c.background(): if d != ' ' or c.hasBackground():
xa,xb = min(x,xa),max(x,xb) xa,xb = min(x,xa),max(x,xb)
ya,yb = min(y,ya),max(y,yb) ya,yb = min(y,ya),max(y,yb)
if (xa,xb,ya,yb) == (0x10000,0,0x10000,0): if (xa,xb,ya,yb) == (0x10000,0,0x10000,0):
@ -278,9 +278,8 @@ class CanvasLayer():
palette = outData['palette'] = [] palette = outData['palette'] = []
for row in colors: for row in colors:
for c in row: for c in row:
colorType = c.colorType() fg = f"{c.getHex(ttk.TTkK.ColorType.Foreground)}" if c.hasForeground() else None
fg = f"{c.getHex(ttk.TTkK.ColorType.Foreground)}" if (colorType&ttk.TTkK.ColorType.Foreground) else None bg = f"{c.getHex(ttk.TTkK.ColorType.Background)}" if c.hasBackground() else None
bg = f"{c.getHex(ttk.TTkK.ColorType.Background)}" if (colorType&ttk.TTkK.ColorType.Background) else None
if (pc:=(fg,bg)) not in palette: if (pc:=(fg,bg)) not in palette:
palette.append(pc) palette.append(pc)
@ -297,9 +296,8 @@ class CanvasLayer():
for row in colors[hslice]: for row in colors[hslice]:
outData['colors'].append([]) outData['colors'].append([])
for c in row[wslice]: for c in row[wslice]:
colorType = c.colorType() fg = f"{c.getHex(ttk.TTkK.ColorType.Foreground)}" if c.hasForeground() else None
fg = f"{c.getHex(ttk.TTkK.ColorType.Foreground)}" if (colorType&ttk.TTkK.ColorType.Foreground) else None bg = f"{c.getHex(ttk.TTkK.ColorType.Background)}" if c.hasBackground() else None
bg = f"{c.getHex(ttk.TTkK.ColorType.Background)}" if (colorType&ttk.TTkK.ColorType.Background) else None
if palette: if palette:
outData['colors'][-1].append(palette.index((fg,bg))) outData['colors'][-1].append(palette.index((fg,bg)))
else: else:
@ -387,7 +385,7 @@ class CanvasLayer():
xa,xb,ya,yb = 0x10000,0,0x10000,0 xa,xb,ya,yb = 0x10000,0,0x10000,0
for y,(drow,crow) in enumerate(zip(tmpd,tmpc)): for y,(drow,crow) in enumerate(zip(tmpd,tmpc)):
for x,(d,c) in enumerate(zip(drow,crow)): for x,(d,c) in enumerate(zip(drow,crow)):
if d != ' ' or c.background(): if d != ' ' or c.hasBackground():
xa,xb = min(x,xa),max(x,xb) xa,xb = min(x,xa),max(x,xb)
ya,yb = min(y,ya),max(y,yb) ya,yb = min(y,ya),max(y,yb)
if (xa,xb,ya,yb) == (0x10000,0,0x10000,0): if (xa,xb,ya,yb) == (0x10000,0,0x10000,0):
@ -414,7 +412,7 @@ class CanvasLayer():
xa,xb,ya,yb = 0x10000,0,0x10000,0 xa,xb,ya,yb = 0x10000,0,0x10000,0
for y,(drow,crow) in enumerate(zip(tmpd,tmpc)): for y,(drow,crow) in enumerate(zip(tmpd,tmpc)):
for x,(d,c) in enumerate(zip(drow,crow)): for x,(d,c) in enumerate(zip(drow,crow)):
if d != ' ' or c.background(): if d != ' ' or c.hasBackground():
xa,xb = min(x,xa),max(x,xb) xa,xb = min(x,xa),max(x,xb)
ya,yb = min(y,ya),max(y,yb) ya,yb = min(y,ya),max(y,yb)
if (xa,xb,ya,yb) == (0x10000,0,0x10000,0): if (xa,xb,ya,yb) == (0x10000,0,0x10000,0):
@ -495,14 +493,14 @@ class CanvasLayer():
colors[oy+y][ox+x] = color colors[oy+y][ox+x] = color
else: else:
glyph = data[ oy+y][ox+x] glyph = data[ oy+y][ox+x]
oColorType = (oc:=colors[oy+y][ox+x]).colorType() oc = colors[oy+y][ox+x]
nColorType = (nc:=color).colorType() nc = color
if glyph==' ': if glyph==' ':
if oColorType & ttk.TTkK.ColorType.Background: if oc.hasBackground():
colors[oy+y][ox+x] = nc.background() colors[oy+y][ox+x] = oc.background()
else: else:
fg = nc.foreground() if ttk.TTkK.ColorType.Foreground & nColorType else oc.foreground() fg = nc.foreground() if nc.hasForeground() else oc.foreground()
bg = nc.background() if ttk.TTkK.ColorType.Background & nColorType & oColorType else oc.background() if ttk.TTkK.ColorType.Background & oColorType else fg bg = nc.background() if nc.hasBackground() and oc.hasBackground() else oc.background() if oc.hasBackground() else fg
color = fg+bg color = fg+bg
colors[oy+y][ox+x] = color colors[oy+y][ox+x] = color
return True return True
@ -530,7 +528,7 @@ class CanvasLayer():
for _y,(darow,carow) in enumerate(zip(darea,carea),oy+y): for _y,(darow,carow) in enumerate(zip(darea,carea),oy+y):
for _x,(da,ca) in enumerate(zip(darow,carow),ox+x): for _x,(da,ca) in enumerate(zip(darow,carow),ox+x):
if 0<=_x<w and 0<=_y<h and ( da!=' ' or ca.background()): if 0<=_x<w and 0<=_y<h and ( da!=' ' or ca.hasBackground()):
if not transparent or (da==' ' and ca._bg): if not transparent or (da==' ' and ca._bg):
data[_y][_x] = da data[_y][_x] = da
colors[_y][_x] = ca colors[_y][_x] = ca

5
tools/dumbPaintTool/app/importimage.py

@ -323,13 +323,12 @@ class TTkImageNew(ttk.TTkWidget):
s = (0,0,w,h) s = (0,0,w,h)
for y,(rowd,rowc) in enumerate(zip(self._canvasImage._data[:h],self._canvasImage._colors[:h])): for y,(rowd,rowc) in enumerate(zip(self._canvasImage._data[:h],self._canvasImage._colors[:h])):
for x,(gl,c) in enumerate(zip(rowd[:w],rowc[:w])): for x,(gl,c) in enumerate(zip(rowd[:w],rowc[:w])):
nColorType = c.colorType() if gl == ' ' and not c.hasBackground():
if gl == ' ' and not (nColorType & ttk.TTkK.ColorType.Background):
continue continue
elif gl == ' ': elif gl == ' ':
canvas._data[ y][x] = ' ' canvas._data[ y][x] = ' '
canvas._colors[y][x] = c.background() canvas._colors[y][x] = c.background()
elif not (nColorType & ttk.TTkK.ColorType.Background): elif not c.hasBackground():
nbg = canvas._colors[y][x].background() nbg = canvas._colors[y][x].background()
canvas._data[ y][x] = gl canvas._data[ y][x] = gl
canvas._colors[y][x] = c.foreground() + nbg canvas._colors[y][x] = c.foreground() + nbg

8
tools/dumbPaintTool/app/paintarea.py

@ -209,10 +209,10 @@ class PaintArea(ttk.TTkAbstractScrollView):
if not glyph and color == ttk.TTkColor.RST: if not glyph and color == ttk.TTkColor.RST:
glyph = _gl glyph = _gl
color = _co color = _co
elif color.background() == ttk.TTkColor.RST: elif color.hasBackground():
if _co.background() != ttk.TTkColor.RST: if _co.hasBackground():
if (_fg:=color.foreground()) != ttk.TTkColor.RST: if color.hasForeground():
color = _fg + _co.background() color = color.foreground() + _co.background()
else: else:
color = _co.background() color = _co.background()
else: else:

4
tools/dumbPaintTool/app/painttoolkit.py

@ -143,7 +143,7 @@ class PaintToolKit(ttk.TTkContainer):
@ttk.pyTTkSlot(ttk.TTkColor) @ttk.pyTTkSlot(ttk.TTkColor)
def setColor(self, color:ttk.TTkColor): def setColor(self, color:ttk.TTkColor):
if ttk.TTkK.ColorType.Foreground & (colorType := color.colorType()): if color.hasForeground():
self._cbFg.setCheckState(ttk.TTkK.Checked) self._cbFg.setCheckState(ttk.TTkK.Checked)
self._bpFg.setEnabled() self._bpFg.setEnabled()
self._bpFg.setColor(color.foreground()) self._bpFg.setColor(color.foreground())
@ -151,7 +151,7 @@ class PaintToolKit(ttk.TTkContainer):
self._cbFg.setCheckState(ttk.TTkK.Unchecked) self._cbFg.setCheckState(ttk.TTkK.Unchecked)
self._bpFg.setDisabled() self._bpFg.setDisabled()
if ttk.TTkK.ColorType.Background & colorType: if color.hasBackground():
self._cbBg.setCheckState(ttk.TTkK.Checked) self._cbBg.setCheckState(ttk.TTkK.Checked)
self._bpBg.setEnabled() self._bpBg.setEnabled()
self._bpBg.setColor(color.background()) self._bpBg.setColor(color.background())

4
tools/dumbPaintTool/app/textarea.py

@ -134,7 +134,7 @@ class TextArea(ttk.TTkGridLayout):
@ttk.pyTTkSlot(ttk.TTkColor) @ttk.pyTTkSlot(ttk.TTkColor)
def _currentColorChangedCB(format:ttk.TTkColor): def _currentColorChangedCB(format:ttk.TTkColor):
if ttk.TTkK.ColorType.Foreground & (colorType := format.colorType()): if format.hasForeground():
cb_fg.setCheckState(ttk.TTkK.Checked) cb_fg.setCheckState(ttk.TTkK.Checked)
btn_fgColor.setEnabled() btn_fgColor.setEnabled()
btn_fgColor.setColor(format.foreground()) btn_fgColor.setColor(format.foreground())
@ -142,7 +142,7 @@ class TextArea(ttk.TTkGridLayout):
cb_fg.setCheckState(ttk.TTkK.Unchecked) cb_fg.setCheckState(ttk.TTkK.Unchecked)
btn_fgColor.setDisabled() btn_fgColor.setDisabled()
if ttk.TTkK.ColorType.Background & colorType: if format.hasBackground():
cb_bg.setCheckState(ttk.TTkK.Checked) cb_bg.setCheckState(ttk.TTkK.Checked)
btn_bgColor.setEnabled() btn_bgColor.setEnabled()
btn_bgColor.setColor(format.background()) btn_bgColor.setColor(format.background())

4
tools/dumbPaintTool/app/toolspanel.py

@ -212,8 +212,8 @@ class ToolsPanel(ttk.TTkVBoxLayout):
ttk.TTkString("Glyph: '") + ttk.TTkString("Glyph: '") +
ttk.TTkString(glyph,color) + ttk.TTkString(glyph,color) +
ttk.TTkString("'")) ttk.TTkString("'"))
self._cb_p_fg.setChecked(ttk.TTkColor.RST != color.foreground()) self._cb_p_fg.setChecked(color.hasForeground())
self._cb_p_bg.setChecked(ttk.TTkColor.RST != color.background()) self._cb_p_bg.setChecked(color.hasBackground())
@ttk.pyTTkSlot(ttk.TTkColor) @ttk.pyTTkSlot(ttk.TTkColor)
def setColor(self, color:ttk.TTkColor): def setColor(self, color:ttk.TTkColor):

4
tools/ttkDesigner/app/notepad.py

@ -82,7 +82,7 @@ class NotePad(ttk.TTkGridLayout):
@ttk.pyTTkSlot(ttk.TTkColor) @ttk.pyTTkSlot(ttk.TTkColor)
def _currentColorChangedCB(format:ttk.TTkColor): def _currentColorChangedCB(format:ttk.TTkColor):
if ttk.TTkK.ColorType.Foreground & (colorType := format.colorType()): if format.hasForeground():
cb_fg.setCheckState(ttk.TTkK.Checked) cb_fg.setCheckState(ttk.TTkK.Checked)
btn_fgColor.setEnabled() btn_fgColor.setEnabled()
btn_fgColor.setColor(format.foreground()) btn_fgColor.setColor(format.foreground())
@ -90,7 +90,7 @@ class NotePad(ttk.TTkGridLayout):
cb_fg.setCheckState(ttk.TTkK.Unchecked) cb_fg.setCheckState(ttk.TTkK.Unchecked)
btn_fgColor.setDisabled() btn_fgColor.setDisabled()
if ttk.TTkK.ColorType.Background & colorType: if format.hasBackground():
cb_bg.setCheckState(ttk.TTkK.Checked) cb_bg.setCheckState(ttk.TTkK.Checked)
btn_bgColor.setEnabled() btn_bgColor.setEnabled()
btn_bgColor.setColor(format.background()) btn_bgColor.setColor(format.background())

Loading…
Cancel
Save