diff --git a/TermTk/TTkGui/fileicon_ascii.py b/TermTk/TTkGui/fileicon_ascii.py index c559ff93..bdda947e 100644 --- a/TermTk/TTkGui/fileicon_ascii.py +++ b/TermTk/TTkGui/fileicon_ascii.py @@ -21,8 +21,10 @@ # SOFTWARE. class FileIcon(): - folder_close = '+' - folder_open = '-' + folderClose = '+' + folderOpen = '-' + home = '-' + computer = '-' @staticmethod def getIcon(fileName): diff --git a/TermTk/TTkGui/fileicon_nerd.py b/TermTk/TTkGui/fileicon_nerd.py index 46ef7cb5..363540af 100644 --- a/TermTk/TTkGui/fileicon_nerd.py +++ b/TermTk/TTkGui/fileicon_nerd.py @@ -33,8 +33,10 @@ import os from TermTk.TTkCore.color import TTkColor class FileIcon(): - folder_close = '' - folder_open = '' + folderClose = '' + folderOpen = '' + home = '' + computer = '' file_node_exact_matches = ( ('.bashprofile' , ''), diff --git a/TermTk/TTkGui/fileicon_utf8.py b/TermTk/TTkGui/fileicon_utf8.py index 867df6e0..978f4d7f 100644 --- a/TermTk/TTkGui/fileicon_utf8.py +++ b/TermTk/TTkGui/fileicon_utf8.py @@ -21,8 +21,10 @@ # SOFTWARE. class FileIcon(): - folder_close = '+' - folder_open = '-' + folderClose = '+' + folderOpen = '-' + home = '∙' + computer = '∙' @staticmethod def getIcon(fileName): diff --git a/TermTk/TTkGui/theme.py b/TermTk/TTkGui/theme.py index ac2ae07c..5a819d1c 100644 --- a/TermTk/TTkGui/theme.py +++ b/TermTk/TTkGui/theme.py @@ -67,14 +67,7 @@ class TTkTheme(): folderIconColor = TTkColor.fg("#FFFFAA") # Yellowish '''Default to **TTkColor.fg("#FFFFAA") # Yellowish**''' - getIcon = fi_utf8.FileIcon.getIcon - folderIconClose = TTkString() + folderIconColor + fi_utf8.FileIcon.folder_close + TTkColor.RST - folderIconOpen = TTkString() + folderIconColor + fi_utf8.FileIcon.folder_open + TTkColor.RST - - - @staticmethod - def getFileIcon(file): - return TTkString() + TTkTheme.fileIconColor + TTkTheme.getIcon(file) + TTkColor.RST + fileIcon = fi_utf8.FileIcon @staticmethod def loadTheme(theme): @@ -90,10 +83,7 @@ class TTkTheme(): TTkTheme.tab = theme['draw'].TTkTheme.tab TTkTheme.braille = theme['draw'].TTkTheme.braille - TTkTheme.getIcon = theme['file'].FileIcon.getIcon - TTkTheme.folderIconClose = TTkString() + TTkTheme.folderIconColor + theme['file'].FileIcon.folder_close + TTkColor.RST - TTkTheme.folderIconOpen = TTkString() + TTkTheme.folderIconColor + theme['file'].FileIcon.folder_open + TTkColor.RST - + TTkTheme.fileIcon = theme['file'].FileIcon TTkHelper.updateAll() diff --git a/TermTk/TTkWidgets/TTkPickers/filepicker.py b/TermTk/TTkWidgets/TTkPickers/filepicker.py index 8b6d678f..b4496092 100644 --- a/TermTk/TTkWidgets/TTkPickers/filepicker.py +++ b/TermTk/TTkWidgets/TTkPickers/filepicker.py @@ -31,6 +31,7 @@ from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.log import TTkLog from TermTk.TTkCore.cfg import TTkCfg from TermTk.TTkCore.string import TTkString +from TermTk.TTkWidgets.lineedit import TTkLineEdit from TermTk.TTkWidgets.window import TTkWindow from TermTk.TTkWidgets.tree import TTkTree from TermTk.TTkWidgets.treewidgetitem import TTkTreeWidgetItem @@ -40,6 +41,7 @@ from TermTk.TTkWidgets.combobox import TTkComboBox from TermTk.TTkWidgets.button import TTkButton from TermTk.TTkWidgets.label import TTkLabel from TermTk.TTkWidgets.list_ import TTkList +from TermTk.TTkWidgets.listwidget import TTkAbstractListItem from TermTk.TTkLayouts.gridlayout import TTkGridLayout from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal @@ -78,7 +80,8 @@ class _FileTreeWidgetItem(TTkTreeWidgetItem): class TTkFileDialogPicker(TTkWindow): __slots__ = ('_path', '_recentPath', '_recentPathId', '_filter', '_caption', # Widgets - '_fileTree', '_lookPath', 'btnPrev', 'btnNext', 'btnUp', + '_fileTree', '_lookPath', '_btnPrev', '_btnNext', '_btnUp', + '_fileName', '_fileType', '_btnOpen', '_btnCancel', # Signals 'filePicked') @@ -103,34 +106,53 @@ class TTkFileDialogPicker(TTkWindow): topLayout = TTkGridLayout() self.layout().addItem(topLayout,0,0) - topLayout.addWidget(TTkLabel(text="Look in:",maxWidth=14), 0,0) - topLayout.addWidget(lookPath := TTkComboBox(textAlign=TTkK.LEFT_ALIGN), 0,1) - topLayout.addWidget(btnPrev := TTkButton(text="<",maxWidth=3,enabled=False), 0,2) - topLayout.addWidget(btnNext := TTkButton(text=">",maxWidth=3,enabled=False), 0,3) - topLayout.addWidget(btnUp := TTkButton(text="^",maxWidth=3,enabled=True), 0,4) - self._lookPath = lookPath - self._btnPrev = btnPrev - self._btnNext = btnNext - self._btnUp = btnUp + self._lookPath = TTkComboBox(textAlign=TTkK.LEFT_ALIGN) + self._btnPrev = TTkButton(text="<",maxWidth=3, enabled=False) + self._btnNext = TTkButton(text=">",maxWidth=3, enabled=False) + self._btnUp = TTkButton(text="^",maxWidth=3, enabled=True) self._btnPrev.clicked.connect(self._openPrev) self._btnNext.clicked.connect(self._openNext) self._btnUp.clicked.connect( self._openUp) + topLayout.addWidget(TTkLabel(text="Look in:",maxWidth=14), 0,0) + topLayout.addWidget(self._lookPath , 0,1) + topLayout.addWidget(self._btnPrev , 0,2) + topLayout.addWidget(self._btnNext , 0,3) + topLayout.addWidget(self._btnUp , 0,4) + # Bottom (File Name, Controls) + self._fileName = TTkLineEdit() + self._fileType = TTkComboBox() + self._btnOpen = TTkButton(text="Open", maxWidth=8, enabled=False) + self._btnCancel = TTkButton(text="Cancel",maxWidth=8) + + self._btnOpen.clicked.connect(self._open) + self._btnCancel.clicked.connect(self.close) + + self._fileName.returnPressed.connect(self._open) + self._fileName.textChanged.connect(self._checkFileName) + self._fileName.textEdited.connect(self._checkFileName) + bottomLayout = TTkGridLayout() self.layout().addItem(bottomLayout,2,0) bottomLayout.addWidget(TTkLabel(text="File name:" ,maxWidth=14), 0,0) bottomLayout.addWidget(TTkLabel(text="Files of type:" ,maxWidth=14), 1,0) - bottomLayout.addWidget(_xxyyzz := TTkComboBox(), 0,1) - bottomLayout.addWidget(_aabbcc := TTkComboBox(), 1,1) - bottomLayout.addWidget(btnOpen := TTkButton(text="Open", maxWidth=8), 0,2) - bottomLayout.addWidget(btnCancel := TTkButton(text="Cancel",maxWidth=8), 1,2) + bottomLayout.addWidget(self._fileName , 0,1) + bottomLayout.addWidget(self._fileType , 1,1) + bottomLayout.addWidget(self._btnOpen , 0,2) + bottomLayout.addWidget(self._btnCancel , 1,2) # Center (self._fileTree, Bookmarks) splitter = TTkSplitter(border=True) self.layout().addWidget(splitter,1,0) bookmarks = TTkList(parent=splitter) + bookmarks.addItem(TTkString() + TTkCfg.theme.fileIconColor + TTkCfg.theme.fileIcon.computer + TTkColor.RST+" Computer", data='/') + bookmarks.addItem(TTkString() + TTkCfg.theme.fileIconColor + TTkCfg.theme.fileIcon.home + TTkColor.RST+" Home", data=os.path.expanduser("~")) + def _bookmarksCallback(item): + self._openNewPath(item.data) + bookmarks.itemClicked.connect(_bookmarksCallback) + # Home Folder (Win Compatible): # os.path.expanduser("~") @@ -141,11 +163,31 @@ class TTkFileDialogPicker(TTkWindow): self._fileTree.itemExpanded.connect(TTkFileDialogPicker._folderExpanded) self._fileTree.itemCollapsed.connect(TTkFileDialogPicker._folderCollapsed) + self._fileTree.itemClicked.connect(self._selectedItem) self._fileTree.itemActivated.connect(self._activatedItem) self._lookPath.currentTextChanged.connect(self._openNewPath) self._openNewPath(self._path, True) + @pyTTkSlot(str) + def _checkFileName(self, fileName): + if os.path.exists(fileName): + self._btnOpen.setEnabled() + else: + self._btnOpen.setDisabled() + + @pyTTkSlot() + def _open(self): + fileName = self._fileName.text() + if not os.path.exists(fileName): return + self.filePicked.emit(fileName) + self.close() + + @pyTTkSlot(TTkTreeWidgetItem, int) + def _selectedItem(self, item, _): + if item.getType() != item.FILE: return + self._fileName.setText(item.path()) + @pyTTkSlot(TTkTreeWidgetItem, int) def _activatedItem(self, item, _): path = item.path() @@ -254,7 +296,7 @@ class TTkFileDialogPicker(TTkWindow): [ name, "", typef, time], path=nodePath, type=_FileTreeWidgetItem.DIR, - icon=TTkCfg.theme.folderIconClose, + icon=TTkString() + TTkCfg.theme.folderIconColor + TTkCfg.theme.fileIcon.folderClose + TTkColor.RST, childIndicatorPolicy=TTkK.ShowIndicator)) elif os.path.isfile(nodePath) or os.path.islink(nodePath): @@ -283,17 +325,17 @@ class TTkFileDialogPicker(TTkWindow): [ name, size, typef, time], path=nodePath, type=_FileTreeWidgetItem.FILE, - icon=TTkCfg.theme.getFileIcon(n), + icon=TTkString() + TTkCfg.theme.fileIconColor + TTkCfg.theme.fileIcon.getIcon(n) + TTkColor.RST, childIndicatorPolicy=TTkK.DontShowIndicator)) return ret @staticmethod def _folderExpanded(item): - item.setIcon(0, TTkCfg.theme.folderIconOpen) + item.setIcon(0, TTkString() + TTkCfg.theme.folderIconColor + TTkCfg.theme.fileIcon.folderOpen + TTkColor.RST,) @staticmethod def _folderCollapsed(item): - item.setIcon(0, TTkCfg.theme.folderIconClose) + item.setIcon(0, TTkString() + TTkCfg.theme.folderIconColor + TTkCfg.theme.fileIcon.folderClose + TTkColor.RST,) @staticmethod def _updateChildren(item): diff --git a/TermTk/TTkWidgets/label.py b/TermTk/TTkWidgets/label.py index 5b672c73..e76e9725 100644 --- a/TermTk/TTkWidgets/label.py +++ b/TermTk/TTkWidgets/label.py @@ -22,6 +22,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +from TermTk.TTkCore.color import TTkColor from TermTk.TTkCore.log import TTkLog from TermTk.TTkWidgets.widget import * from TermTk.TTkTemplates.color import TColor @@ -38,8 +39,9 @@ class TTkLabel(TTkWidget, TColor, TText): self.textUpdated(self.text) def paintEvent(self): - self._canvas.drawText(pos=(0,0), text=' '*self.width(), color=self.color) - self._canvas.drawText(pos=(0,0), text=self.text, color=self.color) + forceColor = self.color!=TTkColor.RST + self._canvas.drawText(pos=(0,0), text=' '*self.width(), color=self.color, forceColor=forceColor) + self._canvas.drawText(pos=(0,0), text=self.text, color=self.color, forceColor=forceColor) def textUpdated(self, text): w, h = self.size() diff --git a/TermTk/TTkWidgets/listwidget.py b/TermTk/TTkWidgets/listwidget.py index ad032ae5..cca0bd95 100644 --- a/TermTk/TTkWidgets/listwidget.py +++ b/TermTk/TTkWidgets/listwidget.py @@ -27,6 +27,7 @@ from TermTk.TTkCore.constant import TTkK from TermTk.TTkCore.log import TTkLog from TermTk.TTkCore.signal import pyTTkSlot, pyTTkSignal from TermTk.TTkCore.color import TTkColor +from TermTk.TTkCore.string import TTkString from TermTk.TTkWidgets.widget import TTkWidget from TermTk.TTkWidgets.label import TTkLabel from TermTk.TTkAbstract.abstractscrollview import TTkAbstractScrollView @@ -176,12 +177,12 @@ class TTkListWidget(TTkAbstractScrollView): minw = self.width() for item in self._items: minw = max(minw,item.minimumWidth()) - for y,item in enumerate(self._items): + for y,item in enumerate(self._items): item.setGeometry(0,y,minw,1) self.viewChanged.emit() def addItemAt(self, item, pos, data=None): - if isinstance(item, str): + if isinstance(item, str) or isinstance(item, TTkString): #label = TTkAbstractListItem(text=item, width=max(len(item),self.width())) label = TTkAbstractListItem(text=item, data=data) label.listItemClicked.connect(self._labelSelectedHandler)