diff --git a/TermTk/TTkUiTools/properties/__init__.py b/TermTk/TTkUiTools/properties/__init__.py index 1fd2c90c..6691f759 100644 --- a/TermTk/TTkUiTools/properties/__init__.py +++ b/TermTk/TTkUiTools/properties/__init__.py @@ -1,7 +1,6 @@ # from .about import from .button import TTkButtonProperties from .checkbox import TTkCheckboxProperties -from .colorpicker import TTkColorButtonPickerProperties from .combobox import TTkComboBoxProperties from .frame import TTkFrameProperties # from .graph import @@ -24,4 +23,9 @@ from .texedit import TTkTextEditProperties from .widget import TTkWidgetProperties from .window import TTkWindowProperties +# Pickers +from .colorpicker import TTkColorButtonPickerProperties +from .filepicker import TTkFileButtonPickerProperties + +# Layouts from .layout import TTkLayoutProperties diff --git a/TermTk/TTkUiTools/properties/filepicker.py b/TermTk/TTkUiTools/properties/filepicker.py new file mode 100644 index 00000000..435a994f --- /dev/null +++ b/TermTk/TTkUiTools/properties/filepicker.py @@ -0,0 +1,64 @@ +# MIT License +# +# Copyright (c) 2023 Eugenio Parodi +# +# 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. + +from TermTk.TTkCore.constant import TTkK +from TermTk.TTkCore.color import TTkColor +from TermTk.TTkWidgets.TTkPickers.filepicker import TTkFileButtonPicker + +TTkFileButtonPickerProperties = { + 'properties' : { + 'Path' : { + 'init': {'name':'path', 'type':str }, + 'get': {'cb':TTkFileButtonPicker.path, 'type':str } , + 'set': {'cb':TTkFileButtonPicker.setPath, 'type':str } }, + 'Caption' : { + 'init': {'name':'caption', 'type':str }, + 'get': {'cb':TTkFileButtonPicker.caption, 'type':str } , + 'set': {'cb':TTkFileButtonPicker.setCaption, 'type':str } }, + 'Filters' : { + 'init': {'name':'filter', 'type':str }, + 'get': {'cb':TTkFileButtonPicker.filter, 'type':str } , + 'set': {'cb':TTkFileButtonPicker.setFilter, 'type':str } }, + 'File Mode' : { + 'init': {'name':'fileMode', 'type':'singleflag', + 'flags': { + 'Any File' : TTkK.FileMode.AnyFile , + 'Existing File' : TTkK.FileMode.ExistingFile , + 'Directory' : TTkK.FileMode.Directory } }, + 'get': {'cb':TTkFileButtonPicker.fileMode, 'type':'singleflag', + 'flags': { + 'Any File' : TTkK.FileMode.AnyFile , + 'Existing File' : TTkK.FileMode.ExistingFile , + 'Directory' : TTkK.FileMode.Directory } }, + 'set': {'cb':TTkFileButtonPicker.setFileMode, 'type':'singleflag', + 'flags': { + 'Any File' : TTkK.FileMode.AnyFile , + 'Existing File' : TTkK.FileMode.ExistingFile , + 'Directory' : TTkK.FileMode.Directory } }, }, }, + 'signals' : { + 'pathPicked(str)' : {'name' : 'pathPicked' , 'type' : str}, + 'filePicked(str)' : {'name' : 'filePicked' , 'type' : str}, + 'folderPicked(str)' : {'name' : 'folderPicked', 'type' : str}, + }, + 'slots' : { + } +} diff --git a/TermTk/TTkUiTools/properties/label.py b/TermTk/TTkUiTools/properties/label.py index 1fe61b2f..a5a0fee6 100644 --- a/TermTk/TTkUiTools/properties/label.py +++ b/TermTk/TTkUiTools/properties/label.py @@ -59,6 +59,7 @@ TTkLabelProperties = { 'Justify' : TTkK.JUSTIFY } } }, },'signals' : { },'slots' : { - 'setText()' : {'name': 'setText', 'type':str}, - 'setAlignment()' : {'name': 'setAlignment', 'type':int}, - }} + 'setText(str)' : {'name': 'setText', 'type':str}, + 'setAlignment(Alignment)' : {'name': 'setAlignment', 'type':TTkK.Alignment}, + } +} diff --git a/TermTk/TTkUiTools/properties/texedit.py b/TermTk/TTkUiTools/properties/texedit.py index 20a2e48f..9f460fe6 100644 --- a/TermTk/TTkUiTools/properties/texedit.py +++ b/TermTk/TTkUiTools/properties/texedit.py @@ -47,6 +47,7 @@ TTkTextEditProperties = { 'textChanged()' : {'name': 'textChanged', 'type': None}, },'slots' : { 'setText(str)' : {'name':'setText', 'type':None}, + 'setColor(TTkColor)' : {'name':'setColor', 'type':TTkColor}, 'append(str)' : {'name':'append', 'type':None}, 'undo()' : {'name':'undo', 'type':None}, 'redo()' : {'name':'redo', 'type':None}, diff --git a/TermTk/TTkUiTools/uiproperties.py b/TermTk/TTkUiTools/uiproperties.py index ce673f17..2a2b5eb3 100644 --- a/TermTk/TTkUiTools/uiproperties.py +++ b/TermTk/TTkUiTools/uiproperties.py @@ -28,7 +28,6 @@ TTkUiProperties = { # Widgets TTkButton.__name__: TTkButtonProperties, TTkCheckbox.__name__: TTkCheckboxProperties, - TTkColorButtonPicker.__name__ : TTkColorButtonPickerProperties, TTkComboBox.__name__: TTkComboBoxProperties, TTkFrame.__name__: TTkFrameProperties, TTkLabel.__name__: TTkLabelProperties, @@ -42,6 +41,9 @@ TTkUiProperties = { TTkTextEdit.__name__: TTkTextEditProperties, TTkWidget.__name__: TTkWidgetProperties, TTkWindow.__name__: TTkWindowProperties, + # Pickers + TTkColorButtonPicker.__name__ : TTkColorButtonPickerProperties, + TTkFileButtonPicker.__name__ : TTkFileButtonPickerProperties, # Layouts TTkLayout.__name__: TTkLayoutProperties, } diff --git a/TermTk/TTkWidgets/TTkPickers/__init__.py b/TermTk/TTkWidgets/TTkPickers/__init__.py index f9a3b17b..0067baa2 100644 --- a/TermTk/TTkWidgets/TTkPickers/__init__.py +++ b/TermTk/TTkWidgets/TTkPickers/__init__.py @@ -1,4 +1,4 @@ from .colorpicker import TTkColorButtonPicker, TTkColorDialogPicker -from .filepicker import TTkFileDialog, TTkFileDialogPicker +from .filepicker import TTkFileDialog, TTkFileDialogPicker, TTkFileButtonPicker from .textpicker import TTkTextPicker, TTkTextDialogPicker from .messagebox import TTkMessageBox \ No newline at end of file diff --git a/TermTk/TTkWidgets/TTkPickers/filepicker.py b/TermTk/TTkWidgets/TTkPickers/filepicker.py index 9ddded53..e4fe2ef4 100644 --- a/TermTk/TTkWidgets/TTkPickers/filepicker.py +++ b/TermTk/TTkWidgets/TTkPickers/filepicker.py @@ -29,6 +29,7 @@ from TermTk.TTkCore.color import TTkColor from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.cfg import TTkCfg +from TermTk.TTkCore.helper import TTkHelper from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal from TermTk.TTkCore.string import TTkString from TermTk.TTkWidgets.lineedit import TTkLineEdit @@ -275,4 +276,46 @@ class TTkFileDialogPicker(TTkWindow): class TTkFileDialog: @staticmethod def getOpenFileName(caption, dir=".", filter="All Files (*)", options=None): - pass \ No newline at end of file + pass + +class TTkFileButtonPicker(TTkButton): + __slots__ = ('_filter', '_caption', '_fileMode', '_path' + # Signals + 'pathPicked', 'filePicked', 'filesPicked', 'folderPicked') + def __init__(self, *args, **kwargs): + # Signals + self.pathPicked = pyTTkSignal(str) + self.filePicked = pyTTkSignal(str) + self.filesPicked = pyTTkSignal(list) + self.folderPicked = pyTTkSignal(str) + super().__init__(*args, **kwargs) + self._path = kwargs.get('path','.') + self._filter = kwargs.get('filter','All Files (*)') + self._caption = kwargs.get('caption','File Dialog') + self._fileMode = kwargs.get('fileMode',TTkK.FileMode.ExistingFile) + self.clicked.connect(self._fileButtonClicked) + + def filter(self): return self._filter + def setFilter(self, filter): self._filter = filter + + def caption(self): return self._caption + def setCaption(self, caption): self._caption = caption + + def fileMode(self): return self._fileMode + def setFileMode(self, fm): self._fileMode = fm + + def path(self): return self._path + def setPath(self, path): self._path = path + + @pyTTkSlot() + def _fileButtonClicked(self): + filePicker = TTkFileDialogPicker(pos = (3,3), size=(80,30), + caption=self._caption, + path=self._path, + filter=self._filter, + fileMode=self._fileMode) + filePicker.pathPicked.connect(self.pathPicked.emit) + filePicker.filePicked.connect(self.filePicked.emit) + filePicker.filesPicked.connect(self.filesPicked.emit) + filePicker.folderPicked.connect(self.folderPicked.emit) + TTkHelper.overlay(None, filePicker, 5, 5, True) diff --git a/TermTk/TTkWidgets/texedit.py b/TermTk/TTkWidgets/texedit.py index 0e248526..8e0aacd3 100644 --- a/TermTk/TTkWidgets/texedit.py +++ b/TermTk/TTkWidgets/texedit.py @@ -293,6 +293,10 @@ class TTkTextEditView(TTkAbstractScrollView): self.viewChanged.emit() self.update() + @pyTTkSlot(TTkColor) + def setColor(self, color): + self.textCursor().setColor(color) + @pyTTkSlot(TTkTextCursor) def _cursorPositionChanged(self, cursor): if cursor == self._textCursor: @@ -579,8 +583,8 @@ class TTkTextEdit(TTkAbstractScrollArea): 'multiLine', 'lineWrapMode', 'setLineWrapMode', 'wordWrapMode', 'setWordWrapMode', - 'textCursor', 'setFocus', - 'copy', 'paste', + 'textCursor', 'setFocus', 'setColor', + 'cut', 'copy', 'paste', 'undo', 'redo', 'isUndoAvailable', 'isRedoAvailable', # Export Methods, 'toAnsi', 'toRawText', 'toPlainText', # 'toHtml', 'toMarkdown', @@ -613,6 +617,8 @@ class TTkTextEdit(TTkAbstractScrollArea): self.textCursor = self._textEditView.textCursor self.setFocus = self._textEditView.setFocus self.multiLine = self._textEditView.multiLine + self.setColor = self._textEditView.setColor + self.cut = self._textEditView.cut self.copy = self._textEditView.copy self.paste = self._textEditView.paste self.undo = self._textEditView.undo diff --git a/ttkDesigner/app/designer.py b/ttkDesigner/app/designer.py index 6e54b193..eddac93a 100644 --- a/ttkDesigner/app/designer.py +++ b/ttkDesigner/app/designer.py @@ -250,7 +250,7 @@ class TTkDesigner(TTkGridLayout): @pyTTkSlot() def save(self): - return self.saveAs() + return self._saveToFile(os.path.join(self._currentPath,self._fileName)) def _saveToFile(self, fileName): TTkLog.info(f"Saving to: {fileName}") diff --git a/ttkDesigner/app/widgetbox.py b/ttkDesigner/app/widgetbox.py index 14721621..3a23f847 100644 --- a/ttkDesigner/app/widgetbox.py +++ b/ttkDesigner/app/widgetbox.py @@ -60,8 +60,8 @@ dWidgets = { "Resizable Frame" : { "class":ttk.TTkResizableFrame, "params":{'size':(20,5)}}, }, 'Pickers':{ - "Color Picker" : { "class":ttk.TTkColorButtonPicker, "params":{'size':(6,3), 'border':True}}, - "File Picker" : { "class":ttk.TTkButton, "params":{'size':(20,3)}, "disabled": True}, + "Color Picker" : { "class":ttk.TTkColorButtonPicker, "params":{'size':( 6,3), 'border':True}}, + "File Picker" : { "class":ttk.TTkFileButtonPicker, "params":{'size':(20,3), 'border':True}}, "Date Picker" : { "class":ttk.TTkButton, "params":{'size':(20,3)}, "disabled": True}, "TtkString Picker" : { "class":ttk.TTkButton, "params":{'size':(20,3)}, "disabled": True}, },