From 5db5d59e3073ce2fa2e0599c7332eaff39dc0c66 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Fri, 19 Mar 2021 23:52:55 +0000 Subject: [PATCH] Finalised the ColorPicker --- TermTk/TTkCore/color.py | 30 +++ TermTk/TTkCore/constant.py | 9 + TermTk/TTkGui/theme.py | 8 +- TermTk/TTkWidgets/TTkPickers/colorpicker.py | 261 +++++++++++++++----- TermTk/TTkWidgets/button.py | 22 +- TermTk/TTkWidgets/lineedit.py | 1 + TermTk/TTkWidgets/window.py | 8 +- demo/demo.py | 2 + demo/showcase/colorpicker.py | 25 +- docs/TODO.md | 5 +- 10 files changed, 287 insertions(+), 84 deletions(-) diff --git a/TermTk/TTkCore/color.py b/TermTk/TTkCore/color.py index 5a808859..a672e541 100644 --- a/TermTk/TTkCore/color.py +++ b/TermTk/TTkCore/color.py @@ -24,6 +24,7 @@ from TermTk.TTkCore.log import TTkLog from TermTk.TTkCore.cfg import TTkCfg +from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.helper import TTkHelper # Ansi Escape Codes: @@ -70,6 +71,35 @@ class _TTkColor: self._mod = mod self._colorMod = colorMod + def colorType(self): + return \ + ( TTkK.Foreground if self._fg != "" else TTkK.NONE ) | \ + ( TTkK.Background if self._bg != "" else TTkK.NONE ) | \ + ( TTkK.Modifier if self._mod != "" else TTkK.NONE ) + + def getHex(self, ctype): + if ctype == TTkK.Foreground: + r,g,b = self.fgToRGB() + else: + r,g,b = self.bgToRGB() + return "#{:06x}".format(r<<16|g<<8|b) + + def fgToRGB(self): + if self._fg == "": return 0xff,0xff,0xff + cc = self._fg.split(';') + r = int(cc[2]) + g = int(cc[3]) + b = int(cc[4][:-1]) + return r,g,b + + def bgToRGB(self): + if self._bg == "": return 0,0,0 + cc = self._bg.split(';') + r = int(cc[2]) + g = int(cc[3]) + b = int(cc[4][:-1]) + return r,g,b + def __str__(self): return self._fg+self._bg+self._mod diff --git a/TermTk/TTkCore/constant.py b/TermTk/TTkCore/constant.py index fd72f8bf..09088771 100644 --- a/TermTk/TTkCore/constant.py +++ b/TermTk/TTkCore/constant.py @@ -29,6 +29,15 @@ class TTkConstant: DEP_8: int = 0x08 DEP_24: int = 0x18 + # Color Type + class ColorType: + Foreground = 0x01 + Background = 0x02 + Modifier = 0x03 + Foreground = ColorType.Foreground + Background = ColorType.Background + Modifier = ColorType.Modifier + # Focus Policies NoFocus = 0x0000 ClickFocus = 0x0001 diff --git a/TermTk/TTkGui/theme.py b/TermTk/TTkGui/theme.py index 3d4d548b..26ed7c7d 100644 --- a/TermTk/TTkGui/theme.py +++ b/TermTk/TTkGui/theme.py @@ -195,14 +195,18 @@ class TTkTheme(): frameBorderColor = TTkColor.RST frameTitleColor = TTkColor.fg("#dddddd")+TTkColor.bg("#222222") + windowBorderColor = TTkColor.RST + windowBorderColorFocus = TTkColor.fg("#ffff55") + buttonBoxGrid = 1 buttonBoxGridClicked = 0 buttonTextColor = TTkColor.fg("#dddd88")+TTkColor.bg("#000044") - buttonBorderColor = TTkColor.fg("#dddd88") + buttonBorderColor = TTkColor.RST buttonTextColorClicked = TTkColor.fg("#ffffdd")+TTkColor.BOLD buttonBorderColorClicked = TTkColor.fg("#dddddd")+TTkColor.BOLD buttonTextColorFocus = buttonTextColor + TTkColor.BOLD - buttonBorderColorFocus = buttonBorderColor + TTkColor.BOLD + buttonBorderColorFocus = TTkColor.fg("#ffff00") + TTkColor.BOLD + menuButtonShortcutColor = TTkColor.fg("#dddddd") + TTkColor.UNDERLINE menuButtonColor = TTkColor.BOLD diff --git a/TermTk/TTkWidgets/TTkPickers/colorpicker.py b/TermTk/TTkWidgets/TTkPickers/colorpicker.py index ecf2f088..89911549 100644 --- a/TermTk/TTkWidgets/TTkPickers/colorpicker.py +++ b/TermTk/TTkWidgets/TTkPickers/colorpicker.py @@ -22,11 +22,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import re + from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.log import TTkLog from TermTk.TTkCore.cfg import TTkCfg from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal from TermTk.TTkCore.color import TTkColor +from TermTk.TTkCore.helper import TTkHelper from TermTk.TTkWidgets.widget import TTkWidget from TermTk.TTkWidgets.window import TTkWindow from TermTk.TTkWidgets.button import TTkButton @@ -36,14 +39,14 @@ from TermTk.TTkWidgets.lineedit import TTkLineEdit from TermTk.TTkLayouts.gridlayout import TTkGridLayout from TermTk.TTkTemplates.color import TColor -class TTkHueCanvas(TTkWidget): +class _TTkHueCanvas(TTkWidget): __slots__ = ('_hueList', '_selected', 'colorPicked') def __init__(self, *args, **kwargs): # signals self.colorPicked=pyTTkSignal(int) TTkWidget.__init__(self, *args, **kwargs) - self._name = kwargs.get('name' , 'TTkHueCanvas' ) + self._name = kwargs.get('name' , '_TTkHueCanvas' ) self.setMaximumHeight(1) self.setMinimumSize(6,1) @@ -63,6 +66,9 @@ class TTkHueCanvas(TTkWidget): self.update() return True + def mouseDragEvent(self, evt): + return self.mousePressEvent(evt) + def paintEvent(self): w,_ = self.size() self._hueList = [0x00]*(w+1) @@ -89,7 +95,7 @@ class TTkHueCanvas(TTkWidget): _printSlice(4, 0x0000ff, 0xff0000, True) _printSlice(5, 0xff0000, 0x0000ff, False) -class TTkColorCanvas(TTkWidget): +class _TTkColorCanvas(TTkWidget): __slots__ = ('_hue', 'colorPicked', '_selected') def __init__(self, *args, **kwargs): # signals @@ -110,9 +116,15 @@ class TTkColorCanvas(TTkWidget): x,y = evt.x, evt.y self._selected = (x,y) self.colorPicked.emit(self._colorAt(x,y,w,h)) + self.update() return True + def mouseDragEvent(self, evt): + return self.mousePressEvent(evt) + def _colorAt(self,x,y,w,h): + w-=1 + h-=1 def _linInt(a,b,x): return int(a*(1-x)+b*x) r = self._hue&0xff0000 @@ -136,11 +148,11 @@ class TTkColorCanvas(TTkWidget): else: self._canvas.drawText(pos=(x,y), text=" ", color=color) -class TTkShowColor(TTkWidget,TColor): +class _TTkShowColor(TTkWidget,TColor): def __init__(self, *args, **kwargs): TTkWidget.__init__(self, *args, **kwargs) TColor.__init__(self, *args, **kwargs) - self._name = kwargs.get('name' , 'TTkShowColor' ) + self._name = kwargs.get('name' , '_TTkShowColor' ) @pyTTkSlot(int) def setRGBColor(self, color): @@ -157,23 +169,36 @@ class TTkShowColor(TTkWidget,TColor): for y in range(h): self._canvas.drawText(pos=(0,y),text=" "*w, color=self.color) -class TTkColorButton(TTkButton,TColor): - __slots__ = ('colorClicked') +class _TTkColorButton(TTkButton): + lastClicked = None + __slots__ = ('colorClicked','_custom') def __init__(self, *args, **kwargs): self.colorClicked = pyTTkSignal(TTkColor) TTkButton.__init__(self, *args, **kwargs) TColor.__init__(self, *args, **kwargs) - self._name = kwargs.get('name' , 'TTkColorButton' ) + self._name = kwargs.get('name' , '_TTkColorButton' ) + self._custom = kwargs.get('custom', False) self.clicked.connect(self._clicked) + self._textColorFocus = self._textColor + + def setColor(self, color): + self._textColor = color + self._textColorFocus = color + self.update() + + def isCustom(self): + return self._custom @pyTTkSlot() def _clicked(self): + if self._custom: + _TTkColorButton.lastClicked = self self.colorClicked.emit(self._textColor) -class TTkColorPicker(TTkWindow): +class TTkColorDialogPicker(TTkWindow,TColor): ''' ### Color Picker Layout sizes: - Terminal window + Terminal window (More or less, It is too annoying to redraw this) ┌────────────────────────────────────────────────┐ │┌──────[Palette]───────┐┌────[Color]───────────┐│ ││┌──────┐┌─────┐┌─────┐││┌────────────────────┐││ @@ -201,12 +226,19 @@ class TTkColorPicker(TTkWindow): │└──────────────────────┘└──────────────────────┘│ └────────────────────────────────────────────────┘ ''' + customButtons = None __slots__ = ( + '_color', '_colorCanvas', '_hueCanvas', '_redLE', '_greenLE', '_blueRE', '_htmlLE', + # Signals + 'colorSelected' ) def __init__(self, *args, **kwargs): + # Signals + self.colorSelected = pyTTkSignal(TTkColor) TTkWindow.__init__(self, *args, **kwargs) + TColor.__init__(self, *args, **kwargs) self._name = kwargs.get('name' , 'TTkColorPicker' ) self.setLayout(TTkGridLayout()) @@ -215,81 +247,156 @@ class TTkColorPicker(TTkWindow): paletteFrame = TTkFrame(border=True, layout=TTkGridLayout(), title="Basic colors") customFrame = TTkFrame(border=True, layout=TTkGridLayout(), title="Custom colors") - controlFrame = TTkFrame(border=True, title="Conrols") + controlFrame = TTkFrame(border=True, minSize=(26,10) ,title="Conrols") # Color Layout Widgets - self._colorCanvas = TTkColorCanvas() - self._hueCanvas = TTkHueCanvas() + self._colorCanvas = _TTkColorCanvas() + self._hueCanvas = _TTkHueCanvas() colorLayout.addWidget(self._colorCanvas,0,0) colorLayout.addWidget(self._hueCanvas,1,0) self._hueCanvas.colorPicked.connect(self._colorCanvas.setHue) # Control - sc = TTkShowColor(pos=(1,1), size=(5,8), parent=controlFrame, color=TTkColor.bg('#ffffff')) + sc = _TTkShowColor(pos=(1,1), size=(5,8), parent=controlFrame, color=TTkColor.bg('#ffffff')) TTkLabel(pos=(7,2), parent=controlFrame,text="rgb:") TTkLabel(pos=(7,4), parent=controlFrame,text="HTML:") - TTkLineEdit(pos=(13,2), size=(3,1), parent=controlFrame, text="FF") - TTkLineEdit(pos=(17,2), size=(3,1), parent=controlFrame, text="FF") - TTkLineEdit(pos=(21,2), size=(3,1), parent=controlFrame, text="FF") + leR = TTkLineEdit(pos=(13,2), size=(3,1), parent=controlFrame, text="255", inputType=TTkK.Input_Number) + leG = TTkLineEdit(pos=(17,2), size=(3,1), parent=controlFrame, text="255", inputType=TTkK.Input_Number) + leB = TTkLineEdit(pos=(21,2), size=(3,1), parent=controlFrame, text="255", inputType=TTkK.Input_Number) + + leHTML = TTkLineEdit(pos=(13,4), size=(8,1), parent=controlFrame, text="#FFFFFF") + + okButton = TTkButton(pos=(7,6), size=(6,3), text="OK", parent=controlFrame, border=True) + cancelButton = TTkButton(pos=(14,6), size=(10,3), text="CANCEL", parent=controlFrame, border=True) + + TTkLabel(pos=(3,20), parent=controlFrame,text="Seriously?") + + @pyTTkSlot() + def _okPressed(): + self.color = sc.color + self.colorSelected.emit(self.color) + + okButton.clicked.connect(_okPressed) + + @pyTTkSlot() + def _cancelPressed(): + self.colorSelected.emit(self.color) - TTkLineEdit(pos=(13,4), size=(8,1), parent=controlFrame, text="#FFFFFF") + cancelButton.clicked.connect(_cancelPressed) - TTkButton(pos=(7,6), size=(6,3), text="OK", parent=controlFrame, border=True) - TTkButton(pos=(14,6), size=(10,3), text="CANCEL", parent=controlFrame, border=True) + @pyTTkSlot(int) + def _controlSetRGBColor(color): + sc.setRGBColor(color) + leR.setText(str((color&0xff0000)>>16)) + leG.setText(str((color&0x00ff00)>> 8)) + leB.setText(str((color&0x0000ff)>> 0)) + leHTML.setText("#{:06X}".format(color)) + + @pyTTkSlot(TTkColor) + def _controlSetColor(color): + r,g,b = color.bgToRGB() + numColor = r<<16|g<<8|b + _controlSetRGBColor(numColor) + + @pyTTkSlot() + def _leHTMLChanged(): + text = leHTML.text() + if re.match('#[a-f0-9]{6}', text.lower()): + _controlSetRGBColor(int(text[1:], 16)) + + leHTML.returnPressed.connect(_leHTMLChanged) + + @pyTTkSlot() + def _leRGBChanged(): + r = int(leR.text()) + g = int(leG.text()) + b = int(leB.text()) + if r&(~0xff) or r&(~0xff) or r&(~0xff): return + _controlSetRGBColor(r<<16|g<<8|b) + + leR.returnPressed.connect(_leRGBChanged) + leG.returnPressed.connect(_leRGBChanged) + leB.returnPressed.connect(_leRGBChanged) + + _controlSetColor(self.color) # Palette Layout Widgets - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#ff0000'), border=True, maxSize=(8,3)),0,0) - b.colorClicked.connect(sc.setColor) - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#ffff00'), border=True, maxSize=(8,3)),0,1) - b.colorClicked.connect(sc.setColor) - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#00ff00'), border=True, maxSize=(8,3)),0,2) - b.colorClicked.connect(sc.setColor) - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#00ffff'), border=True, maxSize=(8,3)),1,0) - b.colorClicked.connect(sc.setColor) - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#0000ff'), border=True, maxSize=(8,3)),1,1) - b.colorClicked.connect(sc.setColor) - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#ff00ff'), border=True, maxSize=(8,3)),1,2) - b.colorClicked.connect(sc.setColor) - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(8,3)),2,0) - b.colorClicked.connect(sc.setColor) - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#dddddd'), border=True, maxSize=(8,3)),2,1) - b.colorClicked.connect(sc.setColor) - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#aaaaaa'), border=True, maxSize=(8,3)),2,2) - b.colorClicked.connect(sc.setColor) - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#666666'), border=True, maxSize=(8,3)),3,0) - b.colorClicked.connect(sc.setColor) - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#333333'), border=True, maxSize=(8,3)),3,1) - b.colorClicked.connect(sc.setColor) - paletteFrame.layout().addWidget(b:=TTkColorButton(color=TTkColor.bg('#000000'), border=True, maxSize=(8,3)),3,2) - b.colorClicked.connect(sc.setColor) + basicColorsLayout = TTkGridLayout() + basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#ff0000'), border=True, maxSize=(8,3)),0,0) + b.colorClicked.connect(_controlSetColor) + basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#ffff00'), border=True, maxSize=(8,3)),0,1) + b.colorClicked.connect(_controlSetColor) + basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#00ff00'), border=True, maxSize=(8,3)),0,2) + b.colorClicked.connect(_controlSetColor) + basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#00ffff'), border=True, maxSize=(8,3)),1,0) + b.colorClicked.connect(_controlSetColor) + basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#0000ff'), border=True, maxSize=(8,3)),1,1) + b.colorClicked.connect(_controlSetColor) + basicColorsLayout.addWidget(b:=_TTkColorButton(color=TTkColor.bg('#ff00ff'), border=True, maxSize=(8,3)),1,2) + b.colorClicked.connect(_controlSetColor) + + shadesOfGreyLayout = TTkGridLayout() + shadesOfGreyLayout.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) + b.colorClicked.connect(_controlSetColor) + shadesOfGreyLayout.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) + b.colorClicked.connect(_controlSetColor) + shadesOfGreyLayout.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) + b.colorClicked.connect(_controlSetColor) + + paletteFrame.layout().addItem(basicColorsLayout,0,0) + paletteFrame.layout().addItem(shadesOfGreyLayout,1,0) # Custom frame customButtonsLayout = TTkGridLayout() - customButtonsLayout.addWidget(b:=TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(8,3)),0,0) - b.colorClicked.connect(sc.setColor) - customButtonsLayout.addWidget(b:=TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(8,3)),0,1) - b.colorClicked.connect(sc.setColor) - customButtonsLayout.addWidget(b:=TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(8,3)),0,2) - b.colorClicked.connect(sc.setColor) - customButtonsLayout.addWidget(b:=TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(8,3)),1,0) - b.colorClicked.connect(sc.setColor) - customButtonsLayout.addWidget(b:=TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(8,3)),1,1) - b.colorClicked.connect(sc.setColor) - customButtonsLayout.addWidget(b:=TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(8,3)),1,2) - b.colorClicked.connect(sc.setColor) - customButtonsLayout.addWidget(b:=TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(8,3)),2,0) - b.colorClicked.connect(sc.setColor) - customButtonsLayout.addWidget(b:=TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(8,3)),2,1) - b.colorClicked.connect(sc.setColor) - customButtonsLayout.addWidget(b:=TTkColorButton(color=TTkColor.bg('#ffffff'), border=True, maxSize=(8,3)),2,2) - b.colorClicked.connect(sc.setColor) + if TTkColorDialogPicker.customButtons is None: + TTkColorDialogPicker.customButtons = ( + _TTkColorButton(color=TTkColor.bg('#ffffff'), custom=True, border=True, maxSize=(3,3)) , + _TTkColorButton(color=TTkColor.bg('#ffffff'), custom=True, border=True, maxSize=(3,3)) , + _TTkColorButton(color=TTkColor.bg('#ffffff'), custom=True, border=True, maxSize=(3,3)) , + _TTkColorButton(color=TTkColor.bg('#ffffff'), custom=True, border=True, maxSize=(3,3)) , + _TTkColorButton(color=TTkColor.bg('#ffffff'), custom=True, border=True, maxSize=(3,3)) , + _TTkColorButton(color=TTkColor.bg('#ffffff'), custom=True, border=True, maxSize=(3,3)) , + _TTkColorButton(color=TTkColor.bg('#ffffff'), custom=True, border=True, maxSize=(3,3)) , + _TTkColorButton(color=TTkColor.bg('#ffffff'), custom=True, border=True, maxSize=(3,3)) ) + + + customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[0],0,0) + b.colorClicked.connect(_controlSetColor) + customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[1],0,1) + b.colorClicked.connect(_controlSetColor) + customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[2],0,2) + b.colorClicked.connect(_controlSetColor) + customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[3],0,3) + b.colorClicked.connect(_controlSetColor) + customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[4],0,4) + b.colorClicked.connect(_controlSetColor) + customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[5],0,5) + b.colorClicked.connect(_controlSetColor) + customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[6],0,6) + b.colorClicked.connect(_controlSetColor) + customButtonsLayout.addWidget(b:=TTkColorDialogPicker.customButtons[7],0,7) + b.colorClicked.connect(_controlSetColor) customFrame.layout().addItem(customButtonsLayout,0,0) - customFrame.layout().addWidget(TTkButton(border=False, text='Add to Custom Colors'),1,0) - + customFrame.layout().addWidget(b:=TTkButton(border=False, text='Add to Custom Colors'),1,0) + @pyTTkSlot() + def _addCustomPressed(): + btn = _TTkColorButton.lastClicked + TTkLog.debug(f"{btn}") + if btn is not None and \ + btn.isCustom(): + TTkLog.debug(f"2 {btn}") + btn.setColor(sc.color) + b.clicked.connect(_addCustomPressed) # Events - self._colorCanvas.colorPicked.connect(sc.setRGBColor) + self._colorCanvas.colorPicked.connect(_controlSetRGBColor) self.layout().addItem(leftLayout ,0,0) self.layout().addItem(colorLayout,0,1) @@ -297,3 +404,27 @@ class TTkColorPicker(TTkWindow): leftLayout.addWidget(paletteFrame,0,0) leftLayout.addWidget(customFrame ,1,0) leftLayout.addWidget(controlFrame,2,0) + +class TTkColorButtonPicker(_TTkColorButton): + __slots__ = ('_type') + def __init__(self, *args, **kwargs): + _TTkColorButton.__init__(self, *args, **kwargs) + self._name = kwargs.get('name' , 'TTkColorButtonPicker' ) + self._custom = False + self.clicked.connect(self._colorClicked) + self._type = self._textColor.colorType() + hexColor = self._textColor.getHex(self._type) + self.setColor(TTkColor.bg(hexColor)) + + @pyTTkSlot(TTkColor) + def colorSelected(self, color): + self.setColor(color) + self.setFocus() + self.update() + + @pyTTkSlot() + def _colorClicked(self): + colorPicker = TTkColorDialogPicker(pos = (3,3), size=(75,31), color=self._textColor, title="Test Color Picker", border=True) + colorPicker.colorSelected.connect(self.colorSelected) + TTkHelper.overlay(self, colorPicker, -1,-1) + diff --git a/TermTk/TTkWidgets/button.py b/TermTk/TTkWidgets/button.py index f4a95264..d1b2dcaf 100644 --- a/TermTk/TTkWidgets/button.py +++ b/TermTk/TTkWidgets/button.py @@ -29,17 +29,27 @@ from TermTk.TTkCore.color import TTkColor from TermTk.TTkWidgets.widget import * class TTkButton(TTkWidget): - __slots__ = ('_text', '_border', '_pressed', 'clicked', '_borderColor', '_textColor') + __slots__ = ( + '_text', '_border', '_pressed', 'clicked', + '_borderColor', '_textColor', + '_borderColorClicked', '_textColorClicked', + '_borderColorFocus', '_textColorFocus' + ) def __init__(self, *args, **kwargs): TTkWidget.__init__(self, *args, **kwargs) + self._name = kwargs.get('name' , 'TTkButton' ) # Define Signals self.clicked = pyTTkSignal() - self._name = kwargs.get('name' , 'TTkButton' ) self._text = kwargs.get('text', "" ) self._border = kwargs.get('border', False ) self._borderColor = kwargs.get('borderColor', TTkCfg.theme.buttonBorderColor ) self._textColor = kwargs.get('color', TTkCfg.theme.buttonTextColor ) + self._borderColorClicked = TTkCfg.theme.buttonBorderColorClicked + self._textColorClicked = TTkCfg.theme.buttonTextColorClicked + self._borderColorFocus = TTkCfg.theme.buttonBorderColorFocus + self._textColorFocus = TTkCfg.theme.buttonTextColorFocus + self._pressed = False if self._border: self.setMinimumSize(2+len(self._text), 3) @@ -50,9 +60,13 @@ class TTkButton(TTkWidget): def paintEvent(self): if self._pressed: - borderColor = TTkCfg.theme.buttonBorderColorClicked - textColor = TTkCfg.theme.buttonTextColorClicked + borderColor = self._borderColorClicked + textColor = self._textColorClicked grid = TTkCfg.theme.buttonBoxGridClicked + elif self.hasFocus(): + borderColor = self._borderColorFocus + textColor = self._textColorFocus + grid = TTkCfg.theme.buttonBoxGrid else: borderColor = self._borderColor textColor = self._textColor diff --git a/TermTk/TTkWidgets/lineedit.py b/TermTk/TTkWidgets/lineedit.py index f7e11e18..770cdd41 100644 --- a/TermTk/TTkWidgets/lineedit.py +++ b/TermTk/TTkWidgets/lineedit.py @@ -63,6 +63,7 @@ class TTkLineEdit(TTkWidget): if text != self._text: self.textChanged.emit(text) self._text = text + self.update() def text(self): return self._text diff --git a/TermTk/TTkWidgets/window.py b/TermTk/TTkWidgets/window.py index 26651ebf..385edad2 100644 --- a/TermTk/TTkWidgets/window.py +++ b/TermTk/TTkWidgets/window.py @@ -22,8 +22,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -from TermTk.TTkCore.cfg import * -from TermTk.TTkCore.constant import * +from TermTk.TTkCore.cfg import TTkCfg +from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.log import TTkLog from TermTk.TTkCore.color import TTkColor from TermTk.TTkWidgets.resizableframe import TTkResizableFrame @@ -44,9 +44,9 @@ class TTkWindow(TTkResizableFrame): def paintEvent(self): if self.hasFocus(): - color = TTkColor.fg("#ffff55") + color = TTkCfg.theme.windowBorderColorFocus else: - color = TTkColor.RST + color = TTkCfg.theme.windowBorderColor self._canvas.drawText(pos=(2,1),text=self._title) self._canvas.drawGrid( color=color, diff --git a/demo/demo.py b/demo/demo.py index a22f5391..8670870d 100755 --- a/demo/demo.py +++ b/demo/demo.py @@ -40,6 +40,7 @@ from showcase.formwidgets import demoFormWidgets from showcase.scrollarea import demoScrollArea from showcase.list import demoList from showcase.menubar import demoMenuBar +from showcase.colorpicker import demoColorPicker words = ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", "elit,", "sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore", "magna", "aliqua.", "Ut", "enim", "ad", "minim", "veniam,", "quis", "nostrud", "exercitation", "ullamco", "laboris", "nisi", "ut", "aliquip", "ex", "ea", "commodo", "consequat.", "Duis", "aute", "irure", "dolor", "in", "reprehenderit", "in", "voluptate", "velit", "esse", "cillum", "dolore", "eu", "fugiat", "nulla", "pariatur.", "Excepteur", "sint", "occaecat", "cupidatat", "non", "proident,", "sunt", "in", "culpa", "qui", "officia", "deserunt", "mollit", "anim", "id", "est", "laborum."] def getWord(): @@ -56,6 +57,7 @@ def demoShowcase(root=None, border=True): tabWidget1.addTab(demoMenuBar(), " MenuBar Test ") tabWidget1.addTab(demoFormWidgets(), " Form Test ") tabWidget1.addTab(demoList(), " List Test ") + tabWidget1.addTab(demoColorPicker(), " Color Picker ") tabWidget1.addTab(demoGraph(), " Graph Test ") tabWidget1.addTab(demoTable(), " Table Test ") tabWidget1.addTab(demoTree(), " Tree Test ") diff --git a/demo/showcase/colorpicker.py b/demo/showcase/colorpicker.py index 307fb7a3..91b7e7ae 100755 --- a/demo/showcase/colorpicker.py +++ b/demo/showcase/colorpicker.py @@ -28,22 +28,33 @@ sys.path.append(os.path.join(sys.path[0],'../..')) import TermTk as ttk -def demoWindows(root=None): +def demoColorPicker(root=None): frame = ttk.TTkFrame(parent=root, border=False) - win2_2 = ttk.TTkWindow(parent=frame,pos = (0,0), size=(40,20), title="Test Window 2.2", border=True) - win2_2.setLayout(ttk.TTkHBoxLayout()) - ttk.TTkTestWidget(parent=win2_2, border=False) + winCP = ttk.TTkWindow(parent=frame,pos = (0,0), size=(30,16), title="Test Color Pickers", border=True) + ttk.TTkColorButtonPicker(parent=winCP, pos=(1,3), size=(8,3), border=True, color=ttk.TTkColor.bg('#88ffff') ) + ttk.TTkColorButtonPicker(parent=winCP, pos=(1,6), size=(8,3), border=True, color=ttk.TTkColor.bg('#ff88ff') ) + ttk.TTkColorButtonPicker(parent=winCP, pos=(1,9), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffff88') ) + ttk.TTkColorButtonPicker(parent=winCP, pos=(1,12), size=(8,3), border=True, color=ttk.TTkColor.bg('#8888ff') ) + ttk.TTkColorButtonPicker(parent=winCP, pos=(11,3), size=(8,3), border=True, color=ttk.TTkColor.fg('#00ffff') ) + ttk.TTkColorButtonPicker(parent=winCP, pos=(11,6), size=(8,3), border=True, color=ttk.TTkColor.fg('#ff00ff') ) + ttk.TTkColorButtonPicker(parent=winCP, pos=(11,9), size=(8,3), border=True, color=ttk.TTkColor.fg('#ffff00') ) + ttk.TTkColorButtonPicker(parent=winCP, pos=(11,12),size=(8,3), border=True, color=ttk.TTkColor.fg('#0000ff') ) + ttk.TTkColorButtonPicker(parent=winCP, pos=(21,3), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') ) + ttk.TTkColorButtonPicker(parent=winCP, pos=(21,6), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') ) + ttk.TTkColorButtonPicker(parent=winCP, pos=(21,9), size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') ) + ttk.TTkColorButtonPicker(parent=winCP, pos=(21,12),size=(8,3), border=True, color=ttk.TTkColor.bg('#ffffff') ) - win2_1 = ttk.TTkColorPicker(parent=frame,pos = (3,3), size=(110,40), title="Test Color Picker", border=True) + + # win2_1 = ttk.TTkColorDialogPicker(parent=frame,pos = (3,3), size=(110,40), title="Test Color Picker", border=True) return frame def main(): ttk.TTkLog.use_default_file_logging() root = ttk.TTk() - win1 = ttk.TTkWindow(parent=root,pos = (0,0), size=(120,50), title="Test Window 1", border=True, layout=ttk.TTkGridLayout()) - demoWindows(win1) + win1 = ttk.TTkWindow(parent=root,pos = (0,0), size=(120,50), title="Test Color Picker", border=True, layout=ttk.TTkGridLayout()) + demoColorPicker(win1) root.mainloop() if __name__ == "__main__": diff --git a/docs/TODO.md b/docs/TODO.md index 8ecee13a..5a33b63b 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -134,9 +134,10 @@ ### Pickers #### Color Picker - - [ ] Basic Implementation - - [ ] Events (Signal/Slots) + - [x] Basic Implementation + - [x] Events (Signal/Slots) - [ ] Themes + - [ ] Use Spinbox for R G B #### File Picker - [ ] Basic Implementation - [ ] Events (Signal/Slots)