--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Preferences/ToolConfigurationDialog.py Mon Dec 28 16:03:33 2009 +0000 @@ -0,0 +1,392 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2002 - 2009 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a configuration dialog for the tools menu. +""" + +import sys +import os +import copy + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +from E4Gui.E4Completers import E4FileCompleter + +from Ui_ToolConfigurationDialog import Ui_ToolConfigurationDialog +import Utilities + +class ToolConfigurationDialog(QDialog, Ui_ToolConfigurationDialog): + """ + Class implementing a configuration dialog for the tools menu. + """ + def __init__(self, toollist, parent=None): + """ + Constructor + + @param toollist list of configured tools + @param parent parent widget (QWidget) + """ + QDialog.__init__(self, parent) + self.setupUi(self) + + self.iconCompleter = E4FileCompleter(self.iconEdit) + self.executableCompleter = E4FileCompleter(self.executableEdit) + + self.redirectionModes = [ + ("no", self.trUtf8("no redirection")), + ("show", self.trUtf8("show output")), + ("insert", self.trUtf8("insert into current editor")), + ("replaceSelection", self.trUtf8("replace selection of current editor")), + ] + + self.toollist = copy.deepcopy(toollist) + for tool in toollist: + self.toolsList.addItem(tool['menutext']) + + for mode in self.redirectionModes: + self.redirectCombo.addItem(mode[1]) + + if len(toollist): + self.toolsList.setCurrentRow(0) + self.on_toolsList_currentRowChanged(0) + + t = self.argumentsEdit.whatsThis() + if t: + t += Utilities.getPercentReplacementHelp() + self.argumentsEdit.setWhatsThis(t) + + def __findModeIndex(self, shortName): + """ + Private method to find the mode index by its short name. + + @param shortName short name of the mode (string) + @return index of the mode (integer) + """ + ind = 0 + for mode in self.redirectionModes: + if mode[0] == shortName: + return ind + ind += 1 + return 1 # default is "show output" + + @pyqtSlot() + def on_newButton_clicked(self): + """ + Private slot to clear all entry fields. + """ + self.executableEdit.clear() + self.menuEdit.clear() + self.iconEdit.clear() + self.argumentsEdit.clear() + self.redirectCombo.setCurrentIndex(1) + + @pyqtSlot() + def on_addButton_clicked(self): + """ + Private slot to add a new entry. + """ + menutext = self.menuEdit.text() + icon = self.iconEdit.text() + executable = self.executableEdit.text() + arguments = self.argumentsEdit.text() + redirect = self.redirectionModes[self.redirectCombo.currentIndex()][0] + + if not executable: + QMessageBox.critical(self, + self.trUtf8("Add tool entry"), + self.trUtf8("You have to set an executable to add to the" + " Tools-Menu first.")) + return + + if not menutext: + QMessageBox.critical(self, + self.trUtf8("Add tool entry"), + self.trUtf8("You have to insert a menuentry text to add the" + " selected program to the Tools-Menu first.")) + return + + if not Utilities.isinpath(executable): + QMessageBox.critical(self, + self.trUtf8("Add tool entry"), + self.trUtf8("The selected file could not be found or" + " is not an executable." + " Please choose an executable filename.")) + return + + if len(self.toolsList.findItems(menutext, Qt.MatchFlags(Qt.MatchExactly))): + QMessageBox.critical(self, + self.trUtf8("Add tool entry"), + self.trUtf8("An entry for the menu text {0} already exists.")\ + .format(menutext)) + return + + self.toolsList.addItem(menutext) + tool = { + 'menutext' : unicode(menutext), + 'icon' : unicode(icon), + 'executable' : executable, + 'arguments' : unicode(arguments), + 'redirect' : redirect, + } + self.toollist.append(tool) + + @pyqtSlot() + def on_changeButton_clicked(self): + """ + Private slot to change an entry. + """ + row = self.toolsList.currentRow() + if row < 0: + return + + menutext = self.menuEdit.text() + icon = self.iconEdit.text() + executable = self.executableEdit.text() + arguments = self.argumentsEdit.text() + redirect = self.redirectionModes[self.redirectCombo.currentIndex()][0] + + if not executable: + QMessageBox.critical(self, + self.trUtf8("Change tool entry"), + self.trUtf8("You have to set an executable to change the" + " Tools-Menu entry.")) + return + + if not menutext: + QMessageBox.critical(self, + self.trUtf8("Change tool entry"), + self.trUtf8("You have to insert a menuentry text to change the" + " selected Tools-Menu entry.")) + return + + if not Utilities.isinpath(executable): + QMessageBox.critical(self, + self.trUtf8("Change tool entry"), + self.trUtf8("The selected file could not be found or" + " is not an executable." + " Please choose an existing executable filename.")) + return + + self.toollist[row] = { + 'menutext' : menutext, + 'icon' : icon, + 'executable' : executable, + 'arguments' : arguments, + 'redirect' : redirect, + } + self.toolsList.currentItem().setText(menutext) + self.changeButton.setEnabled(False) + + @pyqtSlot() + def on_deleteButton_clicked(self): + """ + Private slot to delete the selected entry. + """ + row = self.toolsList.currentRow() + if row < 0: + return + + del self.toollist[row] + itm = self.toolsList.takeItem(row) + del itm + if row >= len(self.toollist): + row -= 1 + self.toolsList.setCurrentRow(row) + self.on_toolsList_currentRowChanged(row) + + @pyqtSlot() + def on_downButton_clicked(self): + """ + Private slot to move an entry down in the list. + """ + curr = self.toolsList.currentRow() + self.__swap(curr, curr + 1) + self.toolsList.clear() + for tool in self.toollist: + self.toolsList.addItem(tool['menutext']) + self.toolsList.setCurrentRow(curr + 1) + if curr + 1 == len(self.toollist): + self.downButton.setEnabled(False) + self.upButton.setEnabled(True) + + @pyqtSlot() + def on_upButton_clicked(self): + """ + Private slot to move an entry up in the list. + """ + curr = self.toolsList.currentRow() + self.__swap(curr - 1, curr) + self.toolsList.clear() + for tool in self.toollist: + self.toolsList.addItem(tool['menutext']) + self.toolsList.setCurrentRow(curr - 1) + if curr - 1 == 0: + self.upButton.setEnabled(False) + self.downButton.setEnabled(True) + + @pyqtSlot() + def on_separatorButton_clicked(self): + """ + Private slot to add a menu separator. + """ + self.toolsList.addItem('--') + tool = { + 'menutext' : '--', + 'icon' : '', + 'executable' : '', + 'arguments' : '', + 'redirect' : 'no', + } + self.toollist.append(tool) + + @pyqtSlot() + def on_executableButton_clicked(self): + """ + Private slot to handle the executable selection via a file selection dialog. + """ + execfile = QFileDialog.getOpenFileName(\ + self, + self.trUtf8("Select executable"), + self.executableEdit.text(), + "") + if execfile: + execfile = Utilities.toNativeSeparators(execfile) + if not Utilities.isinpath(execfile): + QMessageBox.critical(self, + self.trUtf8("Select executable"), + self.trUtf8("The selected file is not an executable." + " Please choose an executable filename.")) + return + + self.executableEdit.setText(execfile) + + @pyqtSlot() + def on_iconButton_clicked(self): + """ + Private slot to handle the icon selection via a file selection dialog. + """ + icon = QFileDialog.getOpenFileName(\ + self, + self.trUtf8("Select icon file"), + self.iconEdit.text(), + self.trUtf8("Icon files (*.png)")) + if icon: + self.iconEdit.setText(icon) + + def on_toolsList_currentRowChanged(self, row): + """ + Private slot to set the lineedits depending on the selected entry. + + @param row the row of the selected entry (integer) + """ + if row >= 0 and row < len(self.toollist): + if self.toollist[row]['menutext'] == '--': + self.executableEdit.clear() + self.menuEdit.clear() + self.iconEdit.clear() + self.argumentsEdit.clear() + self.redirectCombo.setCurrentIndex(0) + else: + tool = self.toollist[row] + self.menuEdit.setText(tool['menutext']) + self.iconEdit.setText(tool['icon']) + self.executableEdit.setText(tool['executable']) + self.argumentsEdit.setText(tool['arguments']) + self.redirectCombo.setCurrentIndex(self.__findModeIndex(tool['redirect'])) + + self.changeButton.setEnabled(False) + self.deleteButton.setEnabled(True) + + if row != 0: + self.upButton.setEnabled(True) + else: + self.upButton.setEnabled(False) + + if row+1 != len(self.toollist): + self.downButton.setEnabled(True) + else: + self.downButton.setEnabled(False) + else: + self.executableEdit.clear() + self.menuEdit.clear() + self.iconEdit.clear() + self.argumentsEdit.clear() + self.downButton.setEnabled(False) + self.upButton.setEnabled(False) + self.deleteButton.setEnabled(False) + self.changeButton.setEnabled(False) + + def __toolEntryChanged(self): + """ + Private slot to perform actions when a tool entry was changed. + """ + row = self.toolsList.currentRow() + if row >= 0 and \ + row < len(self.toollist) and \ + self.toollist[row]['menutext'] != '--': + self.changeButton.setEnabled(True) + + def on_menuEdit_textChanged(self, text): + """ + Private slot called, when the menu text was changed. + + @param text the new text (string) (ignored) + """ + self.__toolEntryChanged() + + def on_iconEdit_textChanged(self, text): + """ + Private slot called, when the icon path was changed. + + @param text the new text (string) (ignored) + """ + self.__toolEntryChanged() + + def on_executableEdit_textChanged(self, text): + """ + Private slot called, when the executable was changed. + + @param text the new text (string) (ignored) + """ + self.__toolEntryChanged() + + def on_argumentsEdit_textChanged(self, text): + """ + Private slot called, when the arguments string was changed. + + @param text the new text (string) (ignored) + """ + self.__toolEntryChanged() + + @pyqtSlot(int) + def on_redirectCombo_currentIndexChanged(self, index): + """ + Private slot called, when the redirection mode was changed. + + @param index the selected mode index (integer) (ignored) + """ + self.__toolEntryChanged() + + def getToollist(self): + """ + Public method to retrieve the tools list. + + @return a list of tuples containing the menu text, the executable, + the executables arguments and a redirection flag + """ + return self.toollist[:] + + def __swap(self, itm1, itm2): + """ + Private method used two swap two list entries given by their index. + + @param itm1 index of first entry (int) + @param itm2 index of second entry (int) + """ + tmp = self.toollist[itm1] + self.toollist[itm1] = self.toollist[itm2] + self.toollist[itm2] = tmp