def __init__(self, fileBrowser): QComboBox.__init__(self, fileBrowser) self._fileBrowser = fileBrowser self.setAttribute(Qt.WA_MacShowFocusRect, False) self.setAttribute(Qt.WA_MacSmallSize) self.setEditable(True) self.setMinimumContentsLength(1) self.setSizeAdjustPolicy( QComboBox.AdjustToMinimumContentsLengthWithIcon) self.lineEdit().setReadOnly(False) self._completionModel = QDirModel(self.lineEdit()) self._completionModel.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) self.lineEdit().setCompleter( QCompleter(self._completionModel, self.lineEdit())) #TODO QDirModel is deprecated but QCompleter does not yet handle #QFileSystemModel - please update when possible. self._count = 0 # Show popup action self._showPopupAction = QAction(QIcon(':enkiicons/filtered.png'), "File browser history", self) self._showPopupAction.setShortcut('Ctrl+H') core.actionManager().addAction("mNavigation/mFileBrowser/aMenuShow", self._showPopupAction) self._showPopupAction.triggered.connect(self._onShowPopup) # reconnected in self.updateComboItems() self.currentIndexChanged[int].connect(self._onItemSelected)
def flags(self, index): """ Can not remember what this is for """ if index.column() == 0: # make the first column checkable return QDirModel.flags(self, index) | Qt.ItemIsUserCheckable else: return QDirModel.flags(self, index)
def __init__(self): super(FilePath, self).__init__(None) self.setWindowTitle("FilePath") completer = QCompleter(self) dir_model = QDirModel() dir_model.setParent(self) completer.setModel(dir_model) self.setCompleter(completer)
def __init__(self, parent=None): QDirModel.__init__(self, parent) self.filter = QDir.AllDirs | QDir.Files | QDir.Drives | QDir.NoDotAndDotDot self.sortflags = QDir.Name | QDir.DirsFirst | \ QDir.IgnoreCase | QDir.LocaleAware self.nameFilter = ["*.py", "*.pyw"] self.setNameFilters(self.nameFilter) self.setFilter(self.filter) self.setSorting(self.sortflags)
class FileSystemBrowser(QTreeView): """simple file system browser, no actions yet""" def __init__(self): QTreeView.__init__(self) self.model = QDirModel() self.setModel(self.model) self.setSortingEnabled(True) i = self.model.index(os.getcwd()) self.scrollTo(i) self.expand(i) self.setCurrentIndex(i) for i in range(self.model.columnCount()): self.resizeColumnToContents(i)
class MainWindow(QMainWindow): m_model = QDirModel() def __init__(self): QMainWindow.__init__(self) self.m_fileView = QColumnView(self) self.m_media = None self.setCentralWidget(self.m_fileView) self.m_fileView.setModel(self.m_model) self.m_fileView.setFrameStyle(QFrame.NoFrame) self.connect(self.m_fileView, SIGNAL("updatePreviewWidget(const QModelIndex &)"), self.play) def play(self, index): self.delayedInit() # self.m_media.setCurrentSource(self.m_model.filePath(index)) self.m_media.setCurrentSource( Phonon.MediaSource(self.m_model.filePath(index))) self.m_media.play() def delayedInit(self): if not self.m_media: self.m_media = Phonon.MediaObject(self) audioOutput = Phonon.AudioOutput(Phonon.MusicCategory, self) Phonon.createPath(self.m_media, audioOutput)
def __init__(self, plugin): QFrame.__init__(self, core.workspace()) self._mode = None self.plugin = plugin from PyQt4 import uic # lazy import for better startup performance uic.loadUi(os.path.join(os.path.dirname(__file__), "SearchWidget.ui"), self) self.cbSearch.setCompleter(None) self.cbReplace.setCompleter(None) self.cbMask.setCompleter(None) self.fsModel = QDirModel(self.cbPath.lineEdit()) self.fsModel.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) self.cbPath.lineEdit().setCompleter(QCompleter(self.fsModel, self.cbPath.lineEdit())) # TODO QDirModel is deprecated but QCompleter does not yet handle # QFileSystemodel - please update when possible.""" self.cbSearch.setCompleter(None) self.pbSearchStop.setVisible(False) self.pbReplaceCheckedStop.setVisible(False) self._progress = QProgressBar(self) self._progress.setAlignment(Qt.AlignCenter) self._progress.setToolTip(self.tr("Search in progress...")) self._progress.setMaximumSize(QSize(80, 16)) core.mainWindow().statusBar().insertPermanentWidget(1, self._progress) self._progress.setVisible(False) # cd up action self.tbCdUp = QToolButton(self.cbPath.lineEdit()) self.tbCdUp.setIcon(QIcon(":/enkiicons/go-up.png")) self.tbCdUp.setCursor(Qt.ArrowCursor) self.tbCdUp.installEventFilter(self) # for drawing button self.cbSearch.installEventFilter(self) # for catching Tab and Shift+Tab self.cbReplace.installEventFilter(self) # for catching Tab and Shift+Tab self.cbPath.installEventFilter(self) # for catching Tab and Shift+Tab self.cbMask.installEventFilter(self) # for catching Tab and Shift+Tab self._closeShortcut = QShortcut(QKeySequence("Esc"), self) self._closeShortcut.setContext(Qt.WidgetWithChildrenShortcut) self._closeShortcut.activated.connect(self.hide) # connections self.cbSearch.lineEdit().textChanged.connect(self._onSearchRegExpChanged) self.cbSearch.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbReplace.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbPath.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbMask.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbRegularExpression.stateChanged.connect(self._onSearchRegExpChanged) self.cbCaseSensitive.stateChanged.connect(self._onSearchRegExpChanged) self.tbCdUp.clicked.connect(self._onCdUpPressed) core.mainWindow().hideAllWindows.connect(self.hide) core.workspace().currentDocumentChanged.connect( lambda old, new: self.setVisible(self.isVisible() and new is not None) )
def __init__(self, fileBrowser): QComboBox.__init__(self, fileBrowser) self._fileBrowser = fileBrowser self.setAttribute( Qt.WA_MacShowFocusRect, False ) self.setAttribute( Qt.WA_MacSmallSize ) self.setEditable(True) self.setMinimumContentsLength(1) self.setSizeAdjustPolicy(QComboBox.AdjustToMinimumContentsLengthWithIcon) self.lineEdit().setReadOnly( False ) self._completionModel = QDirModel(self.lineEdit()) self._completionModel.setFilter( QDir.AllDirs | QDir.NoDotAndDotDot ) self.lineEdit().setCompleter(QCompleter(self._completionModel, self.lineEdit())) #TODO QDirModel is deprecated but QCompleter does not yet handle #QFileSystemModel - please update when possible. self._count = 0 # Show popup action self._showPopupAction = QAction(QIcon(':enkiicons/filtered.png'), "File browser history", self) self._showPopupAction.setShortcut('Ctrl+H') core.actionManager().addAction("mNavigation/mFileBrowser/aMenuShow", self._showPopupAction) self._showPopupAction.triggered.connect(self._onShowPopup) # reconnected in self.updateComboItems() self.currentIndexChanged[int].connect(self._onItemSelected)
def __init__(self): QTreeView.__init__(self) self.model = QDirModel() self.setModel(self.model) self.setSortingEnabled(True) i = self.model.index(os.getcwd()) self.scrollTo(i) self.expand(i) self.setCurrentIndex(i) for i in range(self.model.columnCount()): self.resizeColumnToContents(i)
def __init__(self, parent=None, completionMode=QCompleter.PopupCompletion, showHidden=False): QCompleter.__init__(self, parent) self.__model = QDirModel(self) if showHidden: filters = QDir.Filters(QDir.Drives | QDir.AllDirs | QDir.Hidden) else: filters = QDir.Filters(QDir.Drives | QDir.AllDirs) self.__model.setFilter(filters) self.setModel(self.__model) self.setCompletionMode(completionMode) if parent: parent.setCompleter(self) return
def __init__(self): super(GeneralPreferences, self).__init__() grid = QGridLayout(self) grid.setSpacing(20) grid.setColumnStretch(1, 10) # directory auto completer completer = QCompleter(self) dirs = QDirModel(self) dirs.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) completer.setModel(dirs) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setCompletionMode(QCompleter.PopupCompletion) l = QLabel( u"<b>Ingresá el directorio donde descargar los videos...</b>") l.setTextFormat(Qt.RichText) grid.addWidget(l, 0, 0, 1, 2) grid.addWidget(QLabel(u"Descargar en:"), 1, 0, 2, 1) prv = config.get('downloaddir', '') self.downloaddir_entry = QLineEdit(prv) self.downloaddir_entry.setCompleter(completer) self.downloaddir_entry.setPlaceholderText(u'Ingresá un directorio') grid.addWidget(self.downloaddir_entry, 1, 1, 2, 2) self.downloaddir_buttn = QPushButton(u"Elegir un directorio") self.downloaddir_buttn.clicked.connect(self._choose_dir) grid.addWidget(self.downloaddir_buttn, 2, 1, 3, 2) self.autoreload_checkbox = QCheckBox( u"Recargar automáticamente la lista de episodios al iniciar") prv = config.get('autorefresh', False) self.autoreload_checkbox.setChecked(prv) grid.addWidget(self.autoreload_checkbox, 3, 0, 4, 2) self.shownotifs_checkbox = QCheckBox( u"Mostrar una notificación cuando termina cada descarga") prv = config.get('notification', True) self.shownotifs_checkbox.setChecked(prv) grid.addWidget(self.shownotifs_checkbox, 4, 0, 5, 2)
def setData(self, index, value, role): if role == Qt.CheckStateRole and index.column() == 0: self.layoutAboutToBeChanged.emit() for i, v in self.checks.items(): if are_parent_and_child(index, i): self.checks.pop(i) self.checks[index] = value #self.childCount(index) self.layoutChanged.emit() return True return QDirModel.setData(self, index, value, role)
class FileController(object): def __init__(self, manager, opusDataPath, parentWidget, listen_to_menu=True): self.addTree(opusDataPath, parentWidget) self.currentColumn = None self.currentIndex = None self.classification = "" self.manager = manager if listen_to_menu: QObject.connect( self.treeview, SIGNAL("customContextMenuRequested(const QPoint &)"), self.process_custom_menu) def addTree(self, opusDataPath, parentWidget): self.containerWidget = parentWidget self.opusDataPath = opusDataPath self.treeview = QTreeView() filters = QStringList() filters.append("*.*") #filters.append("*.py") #filters.append("*.shp") #filters.append("*.tif") self.model = QDirModel(filters, QDir.Files | QDir.AllDirs | QDir.NoDotAndDotDot, QDir.Name) self.treeview.setModel(self.model) if self.opusDataPath: self.treeview.setRootIndex(self.model.index(self.opusDataPath)) self.treeview.setColumnWidth(0, 200) self.treeview.hideColumn(2) self.treeview.hideColumn(3) self.containerWidget.layout().addWidget(self.treeview) # Hook up to the mousePressEvent and pressed self.treeview.setContextMenuPolicy(Qt.CustomContextMenu) def close(self): self.treeview.hide() self.containerWidget.layout().removeWidget(self.treeview) return True def process_custom_menu(self, position): raise Exception('Method processCustomMenu is not implemented')
class DirCompleter( QCompleter ): """ Completer for directory names """ def __init__( self, parent = None, completionMode = QCompleter.PopupCompletion, showHidden = False ): QCompleter.__init__( self, parent ) self.__model = QDirModel( self ) if showHidden: filters = QDir.Filters(QDir.Drives | QDir.AllDirs | QDir.Hidden) else: filters = QDir.Filters(QDir.Drives | QDir.AllDirs) self.__model.setFilter( filters ) self.setModel( self.__model ) self.setCompletionMode( completionMode ) if parent: parent.setCompleter( self ) return
class FileSystemBrowser(QTreeView): """simple file system browser""" def __init__(self): QTreeView.__init__(self) self.model = QDirModel() self.setModel(self.model) self.setSortingEnabled(True) self.setAlternatingRowColors(True) self.setEditTriggers(QAbstractItemView.NoEditTriggers) self.setContextMenuPolicy(Qt.CustomContextMenu) self.setAutoExpandDelay(500) i = self.model.index(os.getcwd()) self.scrollTo(i) self.expand(i) self.setCurrentIndex(i) for i in range(self.model.columnCount()): self.resizeColumnToContents(i) self.connect(self, SIGNAL("doubleClicked(QModelIndex)"), self.itemAction) self.connect(self, SIGNAL("customContextMenuRequested(QPoint)"), self.showContextMenu) def itemAction(self, mi): """default action (on doubleclick) for item at model index mi""" fi = self.model.fileInfo(mi) if self.model.isDir(mi): return path = str(fi.absoluteFilePath()) if not SimuVis4.Globals.fileTypeActions.openFile(path): self.openExternal(path) def showContextMenu(self, pos): """show context menu for item at pos""" mi = self.indexAt(pos) fi = self.model.fileInfo(mi) m = QMenu() self.path = str(fi.absoluteFilePath()) if self.model.isDir(mi): m.addAction(QCoreApplication.translate('DataBrowser', 'Refresh'), lambda x=mi: self.model.refresh(x)) else: for a in SimuVis4.Globals.fileTypeActions.getActions(self.path): # this is weird, ... but it works m.addAction(a[0], lambda x=a[1]: x(self.path)) m.addSeparator() m.addAction(QCoreApplication.translate('DataBrowser', 'Open external'), self.openExternal) a = m.exec_(self.mapToGlobal(pos)) def openExternal(self, path=None): if not path: path = self.path QDesktopServices.openUrl(QUrl.fromLocalFile(path))
def addTree(self, opusDataPath, parentWidget): self.containerWidget = parentWidget self.opusDataPath = opusDataPath self.treeview = QTreeView() filters = QStringList() filters.append("*.*") #filters.append("*.py") #filters.append("*.shp") #filters.append("*.tif") self.model = QDirModel(filters, QDir.Files | QDir.AllDirs | QDir.NoDotAndDotDot, QDir.Name) self.treeview.setModel(self.model) if self.opusDataPath: self.treeview.setRootIndex(self.model.index(self.opusDataPath)) self.treeview.setColumnWidth(0, 200) self.treeview.hideColumn(2) self.treeview.hideColumn(3) self.containerWidget.layout().addWidget(self.treeview) # Hook up to the mousePressEvent and pressed self.treeview.setContextMenuPolicy(Qt.CustomContextMenu)
class FileController(object): def __init__(self, manager, opusDataPath, parentWidget, listen_to_menu = True): self.addTree(opusDataPath, parentWidget) self.currentColumn = None self.currentIndex = None self.classification = "" self.manager = manager if listen_to_menu: QObject.connect(self.treeview, SIGNAL("customContextMenuRequested(const QPoint &)"), self.process_custom_menu) def addTree(self, opusDataPath, parentWidget): self.containerWidget = parentWidget self.opusDataPath = opusDataPath self.treeview = QTreeView() filters = QStringList() filters.append("*.*") #filters.append("*.py") #filters.append("*.shp") #filters.append("*.tif") self.model = QDirModel(filters, QDir.Files|QDir.AllDirs|QDir.NoDotAndDotDot, QDir.Name) self.treeview.setModel(self.model) if self.opusDataPath: self.treeview.setRootIndex(self.model.index(self.opusDataPath)) self.treeview.setColumnWidth(0,200) self.treeview.hideColumn(2) self.treeview.hideColumn(3) self.containerWidget.layout().addWidget(self.treeview) # Hook up to the mousePressEvent and pressed self.treeview.setContextMenuPolicy(Qt.CustomContextMenu) def close(self): self.treeview.hide() self.containerWidget.layout().removeWidget(self.treeview) return True def process_custom_menu(self, position): raise Exception('Method processCustomMenu is not implemented')
def __init__(self): QTreeView.__init__(self) self.model = QDirModel() self.setModel(self.model) self.setSortingEnabled(True) self.setAlternatingRowColors(True) self.setEditTriggers(QAbstractItemView.NoEditTriggers) self.setContextMenuPolicy(Qt.CustomContextMenu) self.setAutoExpandDelay(500) i = self.model.index(os.getcwd()) self.scrollTo(i) self.expand(i) self.setCurrentIndex(i) for i in range(self.model.columnCount()): self.resizeColumnToContents(i) self.connect(self, SIGNAL("doubleClicked(QModelIndex)"), self.itemAction) self.connect(self, SIGNAL("customContextMenuRequested(QPoint)"), self.showContextMenu)
def __init__(self, parent=None): QTreeView.__init__(self, parent) self.parent_widget = parent self.name_filters = None filters = QDir.AllDirs | QDir.Files | QDir.Drives | QDir.NoDotAndDotDot sort_flags = QDir.Name | QDir.DirsFirst | \ QDir.IgnoreCase | QDir.LocaleAware self.setModel(QDirModel(QStringList(), filters, sort_flags, self)) self.connect(self, SIGNAL('expanded(QModelIndex)'), lambda: self.resizeColumnToContents(0)) self.connect(self, SIGNAL('collapsed(QModelIndex)'), lambda: self.resizeColumnToContents(0)) self.setAnimated(False) self.setSortingEnabled(True) self.sortByColumn(0, Qt.AscendingOrder)
def __init__(self, parent): super(ManualInstallWidget, self).__init__() self._parent = parent vbox = QVBoxLayout(self) form = QFormLayout() self._txtName = QLineEdit() self._txtName.setPlaceholderText('my_plugin') self._txtVersion = QLineEdit() self._txtVersion.setPlaceholderText('0.1') form.addRow(translations.TR_PROJECT_NAME, self._txtName) form.addRow(translations.TR_VERSION, self._txtVersion) vbox.addLayout(form) hPath = QHBoxLayout() self._txtFilePath = QLineEdit() self._txtFilePath.setPlaceholderText( os.path.join(os.path.expanduser('~'), 'full', 'path', 'to', 'plugin.zip')) self._btnFilePath = QPushButton(QIcon(":img/open"), '') self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self._txtFilePath.setCompleter(self.completer) hPath.addWidget(QLabel(translations.TR_FILENAME)) hPath.addWidget(self._txtFilePath) hPath.addWidget(self._btnFilePath) vbox.addLayout(hPath) vbox.addSpacerItem( QSpacerItem(0, 1, QSizePolicy.Expanding, QSizePolicy.Expanding)) hbox = QHBoxLayout() hbox.addSpacerItem(QSpacerItem(1, 0, QSizePolicy.Expanding)) self._btnInstall = QPushButton(translations.TR_INSTALL) hbox.addWidget(self._btnInstall) vbox.addLayout(hbox) # Signals self.connect(self._btnFilePath, SIGNAL("clicked()"), self._load_plugin_path) self.connect(self._btnInstall, SIGNAL("clicked()"), self.install_plugin)
def addTree(self, opusDataPath, parentWidget): self.containerWidget = parentWidget self.opusDataPath = opusDataPath self.treeview = QTreeView() filters = QStringList() filters.append("*.*") #filters.append("*.py") #filters.append("*.shp") #filters.append("*.tif") self.model = QDirModel(filters, QDir.Files|QDir.AllDirs|QDir.NoDotAndDotDot, QDir.Name) self.treeview.setModel(self.model) if self.opusDataPath: self.treeview.setRootIndex(self.model.index(self.opusDataPath)) self.treeview.setColumnWidth(0,200) self.treeview.hideColumn(2) self.treeview.hideColumn(3) self.containerWidget.layout().addWidget(self.treeview) # Hook up to the mousePressEvent and pressed self.treeview.setContextMenuPolicy(Qt.CustomContextMenu)
def data(self, index, role=Qt.DisplayRole): """ This is called when mouse-over of the dirmodel sections """ if index.isValid() and (index.column() == 0) and (role == Qt.CheckStateRole): dir_now = unicode(self.filePath(index)) partial = self.__partial_check(dir_now) if partial is not None: return partial elif dir_now in self.check_list['includes']: return Qt.Checked elif self.recursive is True: par_dir = "/".join(unicode(dir_now).split("/")[:-1]) # the item is checked only if we have stored its path if dir_now in self.check_list['excludes']: return Qt.Unchecked elif par_dir in self.check_list['excludes']: return Qt.Unchecked else: # Recursively go down directory from parent to # see if it should be included checker = dir_now.split("/") for val in range(1, len(checker)): dir_part = "/".join(checker[:val+1]) if dir_part in self.check_list['includes']: return Qt.Checked # Nothing found return Qt.Unchecked else: return Qt.Unchecked # Standard QDirModel functionality else: return QDirModel.data(self, index, role)
def __init__(self, parent=None): QWidget.__init__(self, parent) # Components self.path_edit = QLineEdit(self) self.path_edit.setReadOnly(True) self.button = QToolButton(self) self.button.setIcon(QIcon.fromTheme("document-open-folder")) # Completer completer = QCompleter(self) completer.setModel(QDirModel(completer)) self.path_edit.setCompleter(completer) # Setup Widget self.setLayout(QHBoxLayout()) self.layout().setMargin(0) self.layout().setSpacing(0) self.layout().addWidget(self.path_edit) self.layout().addWidget(self.button) # Actions self.connect(self.button, SIGNAL('clicked()'), self.selectPath)
class MyMainWindow(QMainWindow): " Main Window " def __init__(self, parent=None): " Initialize QWidget inside MyMainWindow " super(MyMainWindow, self).__init__(parent) QWidget.__init__(self) self.statusBar().showMessage(" {}".format(__doc__)) self.setStyleSheet("QStatusBar{color:grey;}") self.setWindowTitle(__doc__) self.setWindowIcon(QIcon.fromTheme("face-monkey")) self.setFont(QFont("Ubuntu Light", 10)) self.setMaximumSize(QDesktopWidget().screenGeometry().width(), QDesktopWidget().screenGeometry().height()) # directory auto completer self.completer = QCompleter(self) self.dirs = QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) # Proxy support, by reading http_proxy os env variable proxy_url = QUrl(environ.get("http_proxy", "")) QNetworkProxy.setApplicationProxy( QNetworkProxy( QNetworkProxy.HttpProxy if str(proxy_url.scheme()).startswith("http") else QNetworkProxy.Socks5Proxy, proxy_url.host(), proxy_url.port(), proxy_url.userName(), proxy_url.password(), ) ) if "http_proxy" in environ else None print((" INFO: Proxy Auto-Config as " + str(proxy_url))) # basic widgets layouts and set up self.mainwidget = QTabWidget() self.mainwidget.setToolTip(__doc__) self.mainwidget.setContextMenuPolicy(Qt.CustomContextMenu) self.mainwidget.tabCloseRequested.connect(lambda: self.mainwidget.setTabPosition(randint(0, 3))) # if self.mainwidget.tabPosition() == 0 # else self.mainwidget.setTabPosition(0)) self.mainwidget.setStyleSheet("QTabBar{color:white;font-weight:bold;}") self.mainwidget.setTabBar(TabBar(self)) self.mainwidget.setMovable(True) self.mainwidget.setTabsClosable(True) self.mainwidget.setTabShape(QTabWidget.Triangular) self.setCentralWidget(self.mainwidget) self.dock1 = QDockWidget() self.dock2 = QDockWidget() self.dock3 = QDockWidget() for a in (self.dock1, self.dock2, self.dock3): a.setWindowModality(Qt.NonModal) a.setWindowOpacity(0.9) a.setWindowTitle(__doc__ if a.windowTitle() == "" else a.windowTitle()) a.setStyleSheet(" QDockWidget::title{text-align:center;}") self.mainwidget.addTab(a, QIcon.fromTheme("face-smile"), "Double Click Me") # Paleta de colores para pintar transparente self.palette().setBrush(QPalette.Base, Qt.transparent) self.setPalette(self.palette()) self.setAttribute(Qt.WA_OpaquePaintEvent, False) # toolbar and basic actions self.toolbar = QToolBar(self) self.toolbar.setIconSize(QSize(24, 24)) # spacer widget for left self.left_spacer = QWidget(self) self.left_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # spacer widget for right self.right_spacer = QWidget(self) self.right_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) qaqq = QAction(QIcon.fromTheme("application-exit"), "Quit", self) qaqq.setShortcut("Ctrl+Q") qaqq.triggered.connect(exit) qamin = QAction(QIcon.fromTheme("go-down"), "Minimize", self) qamin.triggered.connect(lambda: self.showMinimized()) qamax = QAction(QIcon.fromTheme("go-up"), "Maximize", self) qanor = QAction(QIcon.fromTheme("view-fullscreen"), "AutoCenter AutoResize", self) qanor.triggered.connect(self.center) qatim = QAction(QIcon.fromTheme("mail-signed-verified"), "View Date and Time", self) qatim.triggered.connect(self.timedate) qabug = QAction(QIcon.fromTheme("help-about"), "Report a Problem", self) qabug.triggered.connect( lambda: qabug.setDisabled(True) if not call("xdg-open mailto:" + "*****@*****.**".decode("rot13"), shell=True) else " ERROR " ) qamax.triggered.connect(lambda: self.showMaximized()) qaqt = QAction(QIcon.fromTheme("help-about"), "About Qt", self) qaqt.triggered.connect(lambda: QMessageBox.aboutQt(self)) qakde = QAction(QIcon.fromTheme("help-about"), "About KDE", self) if KDE: qakde.triggered.connect(KHelpMenu(self, "", False).aboutKDE) qaslf = QAction(QIcon.fromTheme("help-about"), "About Self", self) if KDE: qaslf.triggered.connect(KAboutApplicationDialog(aboutData, self).exec_) else: qaslf.triggered.connect( lambda: QMessageBox.about( self.mainwidget, __doc__, "".join( ( __doc__, linesep, "version ", __version__, ", (", __license__, "), by ", __author__, ", ( ", __email__, " )", linesep, ) ), ) ) qafnt = QAction(QIcon.fromTheme("tools-check-spelling"), "Set GUI Font", self) if KDE: font = QFont() qafnt.triggered.connect( lambda: self.setStyleSheet( "".join(("*{font-family:", str(font.toString()), "}")) if KFontDialog.getFont(font)[0] == QDialog.Accepted else "" ) ) else: qafnt.triggered.connect( lambda: self.setStyleSheet("".join(("*{font-family:", str(QFontDialog.getFont()[0].toString()), "}"))) ) qasrc = QAction(QIcon.fromTheme("applications-development"), "View Source Code", self) qasrc.triggered.connect(lambda: call("xdg-open {}".format(__file__), 1)) qakb = QAction(QIcon.fromTheme("input-keyboard"), "Keyboard Shortcuts", self) qakb.triggered.connect( lambda: QMessageBox.information(self.mainwidget, "Keyboard Shortcuts", " Ctrl+Q = Quit ") ) qapic = QAction(QIcon.fromTheme("camera-photo"), "Take a Screenshot", self) qapic.triggered.connect( lambda: QPixmap.grabWindow(QApplication.desktop().winId()).save( QFileDialog.getSaveFileName( self.mainwidget, " Save Screenshot As ...", path.expanduser("~"), ";;(*.png) PNG", "png" ) ) ) qatb = QAction(QIcon.fromTheme("go-top"), "Toggle ToolBar", self) qatb.triggered.connect(lambda: self.toolbar.hide() if self.toolbar.isVisible() is True else self.toolbar.show()) qati = QAction(QIcon.fromTheme("help-browser"), "Switch ToolBar Icon Size", self) qati.triggered.connect( lambda: self.toolbar.setIconSize(self.toolbar.iconSize() * 4) if self.toolbar.iconSize().width() * 4 == 24 else self.toolbar.setIconSize(self.toolbar.iconSize() / 4) ) qasb = QAction(QIcon.fromTheme("zoom-in"), "Toggle Tabs Bar", self) qasb.triggered.connect( lambda: self.mainwidget.tabBar().hide() if self.mainwidget.tabBar().isVisible() is True else self.mainwidget.tabBar().show() ) qadoc = QAction(QIcon.fromTheme("help-browser"), "On-line Docs", self) qadoc.triggered.connect(lambda: open_new_tab(__url__)) qapy = QAction(QIcon.fromTheme("help-about"), "About Python", self) qapy.triggered.connect(lambda: open_new_tab("http://python.org/about")) qali = QAction(QIcon.fromTheme("help-browser"), "Read Licence", self) qali.triggered.connect(lambda: open_new_tab(__full_licence__)) qacol = QAction(QIcon.fromTheme("preferences-system"), "Set GUI Colors", self) if KDE: color = QColor() qacol.triggered.connect( lambda: self.setStyleSheet("".join(("* { background-color: ", str(color.name()), "}"))) if KColorDialog.getColor(color, self) else "" ) else: qacol.triggered.connect( lambda: self.setStyleSheet( "".join((" * { background-color: ", str(QColorDialog.getColor().name()), " } ")) ) ) qatit = QAction(QIcon.fromTheme("preferences-system"), "Set the App Window Title", self) qatit.triggered.connect(self.seTitle) self.toolbar.addWidget(self.left_spacer) self.toolbar.addSeparator() for b in ( qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qatim, qatb, qafnt, qati, qasb, qatit, qapic, qadoc, qali, qaslf, qaqt, qakde, qapy, qabug, ): self.toolbar.addAction(b) self.addToolBar(Qt.TopToolBarArea, self.toolbar) self.toolbar.addSeparator() self.toolbar.addWidget(self.right_spacer) # define the menu menu = self.menuBar() # File menu items menu.addMenu("&File").addActions((qaqq,)) menu.addMenu("&Window").addActions((qamax, qanor, qamin)) # Settings menu menu.addMenu("&Settings").addActions((qasrc, qacol, qafnt, qatim, qatb, qati, qasb, qapic)) # Help menu items menu.addMenu("&Help").addActions((qadoc, qakb, qabug, qali, qaqt, qakde, qapy, qaslf)) # Tray Icon tray = QSystemTrayIcon(QIcon.fromTheme("face-devilish"), self) tray.setToolTip(__doc__) traymenu = QMenu() traymenu.addActions((qamax, qanor, qamin, qaqq)) tray.setContextMenu(traymenu) tray.show() def contextMenuRequested(point): " quick and dirty custom context menu " menu = QMenu() menu.addActions( ( qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qafnt, qati, qasb, qatb, qatim, qatit, qapic, qadoc, qali, qaslf, qaqt, qakde, qapy, qabug, ) ) menu.exec_(self.mapToGlobal(point)) self.mainwidget.customContextMenuRequested.connect(contextMenuRequested) def must_be_checked(widget_list): " widget tuple passed as argument should be checked as ON " for each_widget in widget_list: try: each_widget.setChecked(True) except: pass def must_have_tooltip(widget_list): " widget tuple passed as argument should have tooltips " for each_widget in widget_list: try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) finally: each_widget.setCursor(QCursor(Qt.PointingHandCursor)) def must_autofillbackground(widget_list): " widget tuple passed as argument should have filled background " for each_widget in widget_list: try: each_widget.setAutoFillBackground(True) except: pass def must_glow(widget_list): " apply an glow effect to the widget " for glow, each_widget in enumerate(widget_list): try: if each_widget.graphicsEffect() is None: glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) each_widget.setGraphicsEffect(glow) # glow.setEnabled(False) try: each_widget.clicked.connect( lambda: each_widget.graphicsEffect().setEnabled(True) if each_widget.graphicsEffect().isEnabled() is False else each_widget.graphicsEffect().setEnabled(False) ) except: each_widget.sliderPressed.connect( lambda: each_widget.graphicsEffect().setEnabled(True) if each_widget.graphicsEffect().isEnabled() is False else each_widget.graphicsEffect().setEnabled(False) ) except: pass ####################################################################### self.group1 = QGroupBox() self.group1.setTitle(__doc__) self.frmt = QComboBox(self.group1) self.frmt.addItems(["blah ", "blah blah", "blah blah blah"]) self.file1 = QLineEdit() self.file1.setPlaceholderText("/full/path/to/one_file.py") self.file1.setCompleter(self.completer) self.borig = QPushButton(QIcon.fromTheme("folder-open"), "Open") vboxg1 = QVBoxLayout(self.group1) for each_widget in ( QLabel('<b style="color:white;">some comment'), self.file1, self.borig, QLabel('<b style="color:white;">Lorem Impsum'), self.frmt, ): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle(__doc__) self.nwfl = QCheckBox("Be Awesome") self.smll = QCheckBox("Solve the Squaring of the Circle") self.lrgf = QCheckBox("Im just a QCheckBox") self.case = QCheckBox("Use Quantum Processing") vboxg2 = QVBoxLayout(self.group2) for each_widget in (self.nwfl, self.smll, self.lrgf, self.case): vboxg2.addWidget(each_widget) group3 = QGroupBox() group3.setTitle(__doc__) self.plai = QCheckBox("May the Force be with You") self.nocr = QCheckBox("Im just a Place Holder") self.ridt = QCheckBox("Lorem Impsum") self.nocm = QCheckBox("Divide by Zero") vboxg3 = QVBoxLayout(group3) for each_widget in (self.plai, self.nocr, self.ridt, self.nocm): vboxg3.addWidget(each_widget) container = QWidget() hbox = QHBoxLayout(container) for each_widget in (self.group2, self.group1, group3): hbox.addWidget(each_widget) self.dock1.setWidget(container) # dock 2 self.dock2.setWidget(QPlainTextEdit()) # dock 3 self.dock3.setWidget(QCalendarWidget()) # configure some widget settings must_be_checked((self.nwfl, self.smll, self.lrgf, self.plai)) must_have_tooltip((self.plai, self.nocr, self.ridt, self.nocm, self.nwfl, self.smll, self.lrgf, self.case)) must_autofillbackground( (self.plai, self.nocr, self.ridt, self.nocm, self.nwfl, self.smll, self.lrgf, self.case) ) must_glow((self.plai, self.nocr, self.ridt, self.nocm, self.nwfl)) def run(self): " run forest run " print((" INFO: Working at {}".format(str(datetime.datetime.now())))) ########################################################################### def paintEvent(self, event): "Paint semi-transparent background, animated pattern, background text" # because we are on 2012 !, its time to showcase how Qt we are ! QWidget.paintEvent(self, event) # make a painter p = QPainter(self) p.setRenderHint(QPainter.TextAntialiasing) p.setRenderHint(QPainter.HighQualityAntialiasing) # fill a rectangle with transparent painting p.fillRect(event.rect(), Qt.transparent) # animated random dots background pattern for i in range(4096): x = randint(9, self.size().width() - 9) y = randint(9, self.size().height() - 9) p.setPen(QPen(QColor(randint(9, 255), randint(9, 255), 255), 1)) p.drawPoint(x, y) # set pen to use white color p.setPen(QPen(QColor(randint(9, 255), randint(9, 255), 255), 1)) # Rotate painter 45 Degree p.rotate(30) # Set painter Font for text p.setFont(QFont("Ubuntu", 200)) # draw the background text, with antialiasing if KDE: p.drawText(99, 99, "PyKDE") else: p.drawText(99, 99, "PyQt") # Rotate -45 the QPen back ! p.rotate(-30) # set the pen to no pen p.setPen(Qt.NoPen) # Background Color p.setBrush(QColor(0, 0, 0)) # Background Opacity p.setOpacity(0.75) # Background Rounded Borders p.drawRoundedRect(self.rect(), 50, 50) # finalize the painter p.end() def seTitle(self): " set the title of the main window " dialog = QDialog(self) textEditInput = QLineEdit(" Type Title Here ") ok = QPushButton(" O K ") ok.clicked.connect(lambda: self.setWindowTitle(textEditInput.text())) ly = QVBoxLayout() [ly.addWidget(wdgt) for wdgt in (QLabel("Title:"), textEditInput, ok)] dialog.setLayout(ly) dialog.exec_() def timedate(self): " get the time and date " dialog = QDialog(self) clock = QLCDNumber() clock.setNumDigits(24) timer = QTimer() timer.timeout.connect(lambda: clock.display(datetime.now().strftime("%d-%m-%Y %H:%M:%S %p"))) timer.start(1000) clock.setToolTip(datetime.now().strftime("%c %x")) ok = QPushButton(" O K ") ok.clicked.connect(dialog.close) ly = QVBoxLayout() [ly.addWidget(wdgt) for wdgt in (QCalendarWidget(), clock, ok)] dialog.setLayout(ly) dialog.exec_() def closeEvent(self, event): " Ask to Quit " if ( QMessageBox.question(self, " Close ", " Quit ? ", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.Yes ): event.accept() else: event.ignore() def center(self): " Center and resize the window " self.showNormal() self.resize( QDesktopWidget().screenGeometry().width() // 1.25, QDesktopWidget().screenGeometry().height() // 1.25 ) qr = self.frameGeometry() qr.moveCenter(QDesktopWidget().availableGeometry().center()) self.move(qr.topLeft()) def nepomuk_set(self, file_tag=None, __tag="", _label="", _description=""): " Quick and Easy Nepomuk Taggify for Files " print( ( """ INFO: Semantic Desktop Experience is Tagging Files : {}, {}, {}, {})""".format( file_tag, __tag, _label, _description ) ) ) if Nepomuk.ResourceManager.instance().init() is 0: fle = Nepomuk.Resource(KUrl(QFileInfo(file_tag).absoluteFilePath())) _tag = Nepomuk.Tag(__tag) _tag.setLabel(_label) fle.addTag(_tag) fle.setDescription(_description) print(([str(a.label()) for a in fle.tags()], fle.description())) return ([str(a.label()) for a in fle.tags()], fle.description()) else: print(" ERROR: FAIL: Nepomuk is not running ! ") return def nepomuk_get(self, query_to_search): " Quick and Easy Nepomuk Query for Files " print( ( """ INFO: Semantic Desktop Experience is Quering Files : {} """.format( query_to_search ) ) ) results = [] nepo = Nepomuk.Query.QueryServiceClient() nepo.desktopQuery("hasTag:{}".format(query_to_search)) def _query(data): """ ('filename.ext', 'file description', ['list', 'of', 'tags']) """ results.append( ( [str(a.resource().genericLabel()) for a in data][0], [str(a.resource().description()) for a in data][0], [str(a.label()) for a in iter([a.resource().tags() for a in data][0])], ) ) nepo.newEntries.connect(_query) def _end(): """ [ ('filename.ext', 'file description', ['list', 'of', 'tags']), ('filename.ext', 'file description', ['list', 'of', 'tags']), ('filename.ext', 'file description', ['list', 'of', 'tags']) ] """ nepo.newEntries.disconnect print(results) return results nepo.finishedListing.connect(_end) def kio_get(self, url_string): " multi-threaded, multi-protocol, resumable, error-checked download " downloader_thread = KIO.storedGet(KUrl(str(url_string).strip())) def kio_job_data_or_error(job): " retrieve job data or job error " print((job.data() if not job.error() else job.error())) return job.data() if not job.error() else job.error() downloader_thread.result.connect(kio_job_data_or_error)
def initialize(self, *args, **kwargs): ' class init ' global CONFIG_DIR ec = ExplorerContainer() super(filexplorerPluginMain, self).initialize(*args, **kwargs) self.dock = QDockWidget() self.dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.dock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.dock.setWindowTitle("fileXplorer") self.dock.setStyleSheet('QDockWidget::title { text-align: center; }') # search for the truth self.srch = QLineEdit() #self.srch.resize(self.srch.size().height(), self.dock.size().width()) self.srch.setPlaceholderText(' Search for Python files Local or PyPI ') self.srch.returnPressed.connect(self.search) # Disk Usage Bar self.hdbar = QProgressBar() if sys.platform != 'win32': self.hdbar.setMaximum(statvfs(HOME).f_blocks * statvfs(HOME).f_frsize / 1024 / 1024 / 1024) self.hdbar.setValue(statvfs(HOME).f_bfree * statvfs(HOME).f_frsize / 1024 / 1024 / 1024) self.hdbar.setToolTip(str(self.hdbar.value()) + '% Total Disk Use ') #self.hdbar.setStyleSheet('''QProgressBar{background-color: #QLinearGradient(spread:pad,x1:0,y1:0,x2:1,y2:1,stop:0 rgba(255,0,0,99), #stop:1 rgba(9,255,9,200));color:#fff;border:none;border-radius:9px;} #QProgressBar::chunk{background-color:QLinearGradient(spread:pad,y1:0, #x1:0,y2:1,x2:0.27,stop:0 rgb(0,0,0),stop:1 rgb(9,99,255));padding:0; #border:none;border-radius:9px;height:9px;margin:1px;}''') self.model = QDirModel() self.fileView = QColumnView(self.dock) self.fileView.setAlternatingRowColors(True) # self.fileView.setFont(QFont(self.fileView.font().setBold(True))) self.fileView.setIconSize(QSize(32, 32)) self.fileView.setModel(self.model) self.fileView.updatePreviewWidget.connect(self.runfile) self.sli = QSlider() self.sli.setRange(16, 128) self.sli.setValue(32) self.sli.setToolTip('Icon Size: 32 px. Move Slider to change.') self.sli.setOrientation(Qt.Horizontal) self.sli.valueChanged.connect(lambda: self.fileView.setIconSize( QSize(self.sli.value(), self.sli.value()))) self.sli.sliderReleased.connect(lambda: self.sli.setToolTip('Icon Size: ' + str(self.sli.value()))) class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget((self.srch, self.dock, self.sli, self.hdbar)) ec.addTab(tw, "fileXplorer") #### self.process = QProcess() self.process.finished.connect(self.processFinished) self.preview = QLabel(self.fileView) self.preview.setTextFormat(0) self.preview.setStyleSheet('QLabel{font-size:9px;}') self.preview.setAutoFillBackground(True) self.fileView.setPreviewWidget(self.preview) self.dock.setWidget(self.fileView) # take a shot self.pic = QAction(QIcon.fromTheme("camera-photo"), 'Screenshot', self) self.pic.triggered.connect(lambda: QPixmap.grabWindow( QApplication.desktop().winId()).save(QFileDialog.getSaveFileName( self.dock, " Save Screenshot As ... ", HOME, ';;(*.png)'))) # copy time self.tim = QAction(QIcon.fromTheme("user-away"), 'Date and Time to Clipboard', self) self.tim.triggered.connect(lambda: QApplication.clipboard().setText( datetime.now().strftime(" %A %B %d-%m-%Y %H:%M:%S %p "))) # color chooser self.cl = QAction(QIcon.fromTheme("applications-graphics"), 'Color Chooser to Clipboard', self) self.cl.triggered.connect(lambda: QApplication.clipboard().setText( '{}'.format(QColorDialog.getColor().name()))) # icon chooser self.icn = QAction(QIcon.fromTheme("insert-image"), 'Icon Chooser to Clipboard', self) self.icn.triggered.connect(self.iconChooser) # tool bar with actions QToolBar(self.dock).addActions((self.cl, self.icn, self.tim, self.pic)) self.textBrowser = QTextBrowser(self.dock) self.textBrowser.setAutoFillBackground(True) self.textBrowser.setGeometry(self.dock.geometry()) self.textBrowser.hide()
def __init__(self, parent=None): QDirModel.__init__(self, None) self.checks = {} self.childs = 0 self.checked = 0
def __init__(self, parent, path = None, suffix = '', title = u"Sauver", multiple = False, mode = None): if type(suffix) == tuple or type(suffix) == list : sfilter="" for s in suffix : sfilter += "*"+s+" " self.filter=sfilter[:-1] # Si on a plusieur suffix, on prend le premier par défaut pour # la sauvegarde self.suffix = suffix[0] else : self.suffix = suffix self.filter = "*" + self.suffix QDialog.__init__(self, parent) self.setWindowTitle(title) self.multiple = multiple self.mode = mode if not path: if self.mode == "image" : path = EkdConfig.get("general", "image_output_path") elif self.mode == "video" : path = EkdConfig.get("general", "video_output_path") elif self.mode == "audio" : path = EkdConfig.get("general", "sound_output_path") else : path = unicode(QDir.homePath()) # Nom du répertoire courant self.location = QLabel("<b>%s</b>" % path) # Variable permettant de savoir à tout moment le répertoire courant. self.currentDir = path self.mkdirButton = QPushButton(u" Créer un répertoire") self.mkdirButton.setIcon(QIcon("Icones" + os.sep + "add_sub_task.png")) if int(EkdConfig.get("general", "show_hidden_files")) : #print "hidden shown" EkdPrint(u"hidden shown") shf = QDir.Hidden else : shf = QDir.Readable # Liste des fichiers self.dirList = QListView() sorting = QDir.DirsFirst if int(EkdConfig.get("general", "ignore_case")): sorting |= QDir.IgnoreCase self.sorting = sorting self.flags = QDir.Files | QDir.Readable | shf self.dirModel = QStandardItemModel() self.dirList.setModel(self.dirModel) self.updateDir(path) self.dirList.setWrapping(True) #panneau latéral self.dirTree = QTreeView() self.dirModelLight = QDirModel(QStringList(""), QDir.AllDirs | QDir.NoDotAndDotDot | shf, QDir.DirsFirst | QDir.Name | QDir.IgnoreCase) self.dirTree.setModel(self.dirModelLight) self.dirTree.setColumnHidden(1,True) self.dirTree.setColumnHidden(2,True) self.dirTree.setColumnHidden(3,True) self.dirTree.setMaximumWidth(200) self.dirTree.setMinimumWidth(150) self.dirTree.setCurrentIndex(self.dirModelLight.index(path)) self.dirTree.resizeColumnToContents(0) self.connect(self.dirTree, SIGNAL("pressed(QModelIndex)"), self.updateLatDir) self.connect(self.dirTree, SIGNAL("expanded(QModelIndex)"), self.treeMAJ) self.connect(self.dirTree, SIGNAL("collapsed(QModelIndex)"), self.treeMAJ) # Nom du fichier self.fileField = QLineEdit() # Nom du filtre self.filterField = QComboBox() self.filterField.addItems(QStringList(self.filter)) # Bouton de sauvegarde et d'annulation self.saveButton = QPushButton(_(u" Enregistrer")) self.saveButton.setIcon(QIcon("Icones" + os.sep + "action.png")) self.cancelButton = QPushButton(_(u" Annuler")) self.cancelButton.setIcon(QIcon("Icones" + os.sep + "annuler.png")) # Organisation des différents objets de la boite de dialogue self.layout = QHBoxLayout(self) self.layout.addWidget(self.dirTree) self.filelinelayout = QGridLayout() self.filelinelayout.addWidget(self.location, 0, 0, 1, 0) self.filelinelayout.addWidget(self.mkdirButton, 0, 2) self.filelinelayout.addWidget(self.dirList, 1, 0, 1, 0) self.filelinelayout.addWidget(QLabel(_("Nom de fichier : ")), 2, 0) self.filelinelayout.addWidget(self.fileField, 2, 1) self.filelinelayout.addWidget(self.saveButton, 2, 2) self.filelinelayout.addWidget(QLabel(_("Filtre extension : ")), 3, 0) self.filelinelayout.addWidget(self.filterField, 3, 1) self.filelinelayout.addWidget(self.cancelButton, 3, 2) self.layout.addLayout(self.filelinelayout) # Connexion des différents objets self.connect(self.dirList, SIGNAL("clicked(QModelIndex)"), self.updateFile) self.connect(self.saveButton, SIGNAL("clicked()"), self.accept) self.connect(self.cancelButton, SIGNAL("clicked()"), self.reject) self.connect(self.mkdirButton, SIGNAL("clicked()"), self.mkdir) self.connect(self.dirList, SIGNAL("indexesMoved (const QModelIndexList&)"), self.updateFile) self.connect(self.fileField, SIGNAL("textChanged (const QString&)"), self.activate) self.connect(self.fileField, SIGNAL("returnPressed()"), self.accept) # Taille minimum self.setMinimumSize(700, 480) # Par défaut, on désactive self.deactivate() # Completion des fichiers self.completion = QCompleter(self.dirModel, self.dirList)
def __init__(self): ' make a diff method with GUI ' self.dialog = QDialog() self.diff_path = None # directory auto completer self.completer = QCompleter(self.dialog) self.dirs = QDirModel(self.dialog) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) #self.completer.setCompletionMode(QCompleter.InlineCompletion) self.group1 = QGroupBox() self.group1.setTitle('Diff') self.frmt = QComboBox(self.group1) self.frmt.addItems(['Unified', 'Normal', 'Context']) self.file1 = QLineEdit() self.file1.setPlaceholderText('/full/path/to/one_file.py') self.file1.setCompleter(self.completer) self.file2 = QLineEdit() self.file2.setPlaceholderText('/full/path/to/another_file.py') self.file2.setCompleter(self.completer) self.fout = QLineEdit() self.fout.setText(''.join((path.join(gettempdir(), datetime.now().strftime('%d-%b-%Y_%H:%M:%S.diff'))))) self.fout.setPlaceholderText('/full/path/to/output_file.diff') self.fout.setCompleter(self.completer) self.regex = QLineEdit() self.regex.setPlaceholderText('DONT use unless you know what are doing') self.regex.setToolTip('Do NOT use unless you know what you are doing !') self.borig = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.borig.clicked.connect(lambda: self.file1.setText(str( QFileDialog.getOpenFileName(self.dialog, 'Open file to compare', path.expanduser("~"), ';;(*.*)')))) self.bmodi = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.bmodi.clicked.connect(lambda: self.file2.setText(str( QFileDialog.getOpenFileName(self.dialog, 'Open file to compare', path.expanduser("~"), ';;(*.*)')))) self.bout = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.bout.clicked.connect(lambda: self.fout.setText(str( QFileDialog.getSaveFileName(self.dialog, 'Save a Diff file', path.expanduser("~"), ';;(*.diff)')))) vboxg1 = QVBoxLayout(self.group1) for each_widget in (QLabel('Original file full path'), self.file1, self.borig, QLabel('Modified file full path'), self.file2, self.bmodi, QLabel('Output file full Path'), self.fout, self.bout, QLabel('Diff Output Format'), self.frmt, QLabel('Diff REGEX to Ignore (ADVANCED)'), self.regex): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle('Options') self.nwfl = QCheckBox('Treat new files as Empty') self.smll = QCheckBox('Look for smaller changes') self.lrgf = QCheckBox('Optimize for large files') self.case = QCheckBox('Ignore case changes on content') self.cnvt = QCheckBox('Convert Tabs to Spaces') self.blnk = QCheckBox('Ignore added or removed Blank lines') self.spac = QCheckBox('Ignore changes in amount of Spaces') self.whit = QCheckBox('Ignore ALL white Spaces') self.tabz = QCheckBox('Ignore changes by Tab expansions') self.sprs = QCheckBox('Remove Space or Tab before empty lines') self.filn = QCheckBox('Ignore case when comparing file names') self.tbs = QComboBox(self.group2) self.tbs.addItems(['4', '6', '8', '10', '2']) self.nice = QComboBox(self.group2) self.nice.addItems(['20', '15', '10', '5', '0']) vboxg2 = QVBoxLayout(self.group2) for each_widget in (self.nwfl, self.smll, self.lrgf, self.case, self.cnvt, self.blnk, self.spac, self.whit, self.tabz, self.sprs, self.filn, QLabel('Diff Tabs-to-Spaces Size'), self.tbs, QLabel('Diff Backend CPU Priority'), self.nice): vboxg2.addWidget(each_widget) try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) each_widget.setCursor(QCursor(Qt.PointingHandCursor)) group3 = QGroupBox() group3.setTitle('Even More Options') self.plai = QCheckBox('Force treat all files as plain text') self.nocr = QCheckBox('Force strip trailing carriage return') self.ridt = QCheckBox('Report when two files are identical') self.nocm = QCheckBox('Do not output common lines') self.rdif = QCheckBox('Report only when files differ') self.clip = QCheckBox('Copy Diff to Clipboard when done') self.noti = QCheckBox('Use system Notification when done') self.pret = QCheckBox('Align all Tabs by prepending a Tab') self.lolz = QCheckBox('Output Diff in two equal columns') self.odif = QCheckBox('Open Diff with Ninja-IDE when done') self.plac = QCheckBox('Make an Awesome Diff view when done') self.wdth = QComboBox(group3) self.wdth.addItems(['80', '100', '120', '130', '250', '500', '999999']) self.bcknd = QComboBox(group3) self.bcknd.addItems(['diff', 'diff.py']) self.bcknd.setDisabled(True) #TODO this feature needs work vboxg3 = QVBoxLayout(group3) for each_widget in (self.plai, self.nocr, self.ridt, self.nocm, self.rdif, self.pret, self.clip, self.noti, self.lolz, self.odif, self.plac, QLabel('Diff Maximum Total Width'), self.wdth, QLabel('Diff Backend (EXPERIMENTAL)'), self.bcknd): vboxg3.addWidget(each_widget) try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) each_widget.setCursor(QCursor(Qt.PointingHandCursor)) for widget_should_be_checked in (self.nwfl, self.smll, self.lrgf, self.clip, self.cnvt, self.plai, self.noti): widget_should_be_checked.setChecked(True) container = QWidget() hbox = QHBoxLayout(container) for each_widget in (self.group2, self.group1, group3): hbox.addWidget(each_widget) buttons = QDialogButtonBox() buttons.resize(self.dialog.size().width(), buttons.size().height() * 2) buttons.setOrientation(Qt.Horizontal) buttons.setStandardButtons( QDialogButtonBox.Ok | QDialogButtonBox.Cancel | QDialogButtonBox.Close | QDialogButtonBox.Help) buttons.setCenterButtons(False) buttons.helpRequested.connect(lambda: QMessageBox.about( self.dialog, __doc__, ''.join((__doc__, ' GUI and Visualizer Plugin,', linesep, 'version ', __version__, ', (', __license__, '), by ', linesep, __author__, ', ( ', __email__, ' ).', linesep)))) buttons.rejected.connect(self.dialog.close) buttons.accepted.connect(self.make_diff) info = QLabel(''.join(('<b> Current Backend Diff Engine: </b>', getoutput('diff --version').split(linesep)[0]))) vbox = QVBoxLayout(self.dialog) for each_widget in ( QLabel('<center><h2> Ninja IDE Diff and Patch </h2></center>'), container, info, buttons): vbox.addWidget(each_widget) self.dialog.resize(1024, self.dialog.size().height()) self.dialog.exec_()
def setData(self, index, value, role = Qt.EditRole): """ Things to do on user made changes """ # user trying to do something to the checkbox if index.isValid() and (index.column() == 0) and (role == Qt.CheckStateRole): dir_now = unicode(self.filePath(index)) # store checked paths, remove unchecked paths if value == Qt.Checked: if self.recursive is False: if dir_now not in self.check_list['includes']: self.check_list['includes'].append(dir_now) return True tmp_list = [] for dir in self.check_list['includes']: if dir_now in dir: tmp_list.append(dir) for dir in tmp_list: self.check_list['includes'].remove(dir) # No point adding if it's root dir is already there checker = dir_now.split("/") there = False for val in range(len(checker)): thing = "/".join(checker[:val+1]) if thing in self.check_list['includes']: there = True break try: tmp_list = [] for exc_dir in self.check_list['excludes']: if dir_now in exc_dir: tmp_list.append(exc_dir) for thing in tmp_list: self.check_list[1].remove(thing) except ValueError: # Doesn't exist yet pass if there is False: self.check_list['includes'].append(unicode(self.filePath(index))) self.needsRefresh.emit(index) return True # Want to exclude dir else: par_dir = "/".join(dir_now.split("/")[:-1]) tmp_list = (list(self.check_list['includes']), list(self.check_list['excludes'])) for item in tmp_list[0]: # removes if we've already checked it if dir_now in item: self.check_list['includes'].remove(item) # Only add to unchecked if anything above is checked checker = dir_now.split("/") for val in range(len(checker)): thing = "/".join(checker[:val+1]) if thing in self.check_list['includes']: self.check_list['excludes'].append(dir_now) self.needsRefresh.emit(index) return True # Standard QDirModel functionality else: return QDirModel.setData(self, index, value, role)
def __init__(self, parent=None): " Initialize QWidget inside MyMainWindow " super(MyMainWindow, self).__init__(parent) QWidget.__init__(self) self.statusBar().showMessage(" {}".format(__doc__)) self.setStyleSheet("QStatusBar{color:grey;}") self.setWindowTitle(__doc__) self.setWindowIcon(QIcon.fromTheme("face-monkey")) self.setFont(QFont("Ubuntu Light", 10)) self.setMaximumSize(QDesktopWidget().screenGeometry().width(), QDesktopWidget().screenGeometry().height()) # directory auto completer self.completer = QCompleter(self) self.dirs = QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) # Proxy support, by reading http_proxy os env variable proxy_url = QUrl(environ.get("http_proxy", "")) QNetworkProxy.setApplicationProxy( QNetworkProxy( QNetworkProxy.HttpProxy if str(proxy_url.scheme()).startswith("http") else QNetworkProxy.Socks5Proxy, proxy_url.host(), proxy_url.port(), proxy_url.userName(), proxy_url.password(), ) ) if "http_proxy" in environ else None print((" INFO: Proxy Auto-Config as " + str(proxy_url))) # basic widgets layouts and set up self.mainwidget = QTabWidget() self.mainwidget.setToolTip(__doc__) self.mainwidget.setContextMenuPolicy(Qt.CustomContextMenu) self.mainwidget.tabCloseRequested.connect(lambda: self.mainwidget.setTabPosition(randint(0, 3))) # if self.mainwidget.tabPosition() == 0 # else self.mainwidget.setTabPosition(0)) self.mainwidget.setStyleSheet("QTabBar{color:white;font-weight:bold;}") self.mainwidget.setTabBar(TabBar(self)) self.mainwidget.setMovable(True) self.mainwidget.setTabsClosable(True) self.mainwidget.setTabShape(QTabWidget.Triangular) self.setCentralWidget(self.mainwidget) self.dock1 = QDockWidget() self.dock2 = QDockWidget() self.dock3 = QDockWidget() for a in (self.dock1, self.dock2, self.dock3): a.setWindowModality(Qt.NonModal) a.setWindowOpacity(0.9) a.setWindowTitle(__doc__ if a.windowTitle() == "" else a.windowTitle()) a.setStyleSheet(" QDockWidget::title{text-align:center;}") self.mainwidget.addTab(a, QIcon.fromTheme("face-smile"), "Double Click Me") # Paleta de colores para pintar transparente self.palette().setBrush(QPalette.Base, Qt.transparent) self.setPalette(self.palette()) self.setAttribute(Qt.WA_OpaquePaintEvent, False) # toolbar and basic actions self.toolbar = QToolBar(self) self.toolbar.setIconSize(QSize(24, 24)) # spacer widget for left self.left_spacer = QWidget(self) self.left_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # spacer widget for right self.right_spacer = QWidget(self) self.right_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) qaqq = QAction(QIcon.fromTheme("application-exit"), "Quit", self) qaqq.setShortcut("Ctrl+Q") qaqq.triggered.connect(exit) qamin = QAction(QIcon.fromTheme("go-down"), "Minimize", self) qamin.triggered.connect(lambda: self.showMinimized()) qamax = QAction(QIcon.fromTheme("go-up"), "Maximize", self) qanor = QAction(QIcon.fromTheme("view-fullscreen"), "AutoCenter AutoResize", self) qanor.triggered.connect(self.center) qatim = QAction(QIcon.fromTheme("mail-signed-verified"), "View Date and Time", self) qatim.triggered.connect(self.timedate) qabug = QAction(QIcon.fromTheme("help-about"), "Report a Problem", self) qabug.triggered.connect( lambda: qabug.setDisabled(True) if not call("xdg-open mailto:" + "*****@*****.**".decode("rot13"), shell=True) else " ERROR " ) qamax.triggered.connect(lambda: self.showMaximized()) qaqt = QAction(QIcon.fromTheme("help-about"), "About Qt", self) qaqt.triggered.connect(lambda: QMessageBox.aboutQt(self)) qakde = QAction(QIcon.fromTheme("help-about"), "About KDE", self) if KDE: qakde.triggered.connect(KHelpMenu(self, "", False).aboutKDE) qaslf = QAction(QIcon.fromTheme("help-about"), "About Self", self) if KDE: qaslf.triggered.connect(KAboutApplicationDialog(aboutData, self).exec_) else: qaslf.triggered.connect( lambda: QMessageBox.about( self.mainwidget, __doc__, "".join( ( __doc__, linesep, "version ", __version__, ", (", __license__, "), by ", __author__, ", ( ", __email__, " )", linesep, ) ), ) ) qafnt = QAction(QIcon.fromTheme("tools-check-spelling"), "Set GUI Font", self) if KDE: font = QFont() qafnt.triggered.connect( lambda: self.setStyleSheet( "".join(("*{font-family:", str(font.toString()), "}")) if KFontDialog.getFont(font)[0] == QDialog.Accepted else "" ) ) else: qafnt.triggered.connect( lambda: self.setStyleSheet("".join(("*{font-family:", str(QFontDialog.getFont()[0].toString()), "}"))) ) qasrc = QAction(QIcon.fromTheme("applications-development"), "View Source Code", self) qasrc.triggered.connect(lambda: call("xdg-open {}".format(__file__), 1)) qakb = QAction(QIcon.fromTheme("input-keyboard"), "Keyboard Shortcuts", self) qakb.triggered.connect( lambda: QMessageBox.information(self.mainwidget, "Keyboard Shortcuts", " Ctrl+Q = Quit ") ) qapic = QAction(QIcon.fromTheme("camera-photo"), "Take a Screenshot", self) qapic.triggered.connect( lambda: QPixmap.grabWindow(QApplication.desktop().winId()).save( QFileDialog.getSaveFileName( self.mainwidget, " Save Screenshot As ...", path.expanduser("~"), ";;(*.png) PNG", "png" ) ) ) qatb = QAction(QIcon.fromTheme("go-top"), "Toggle ToolBar", self) qatb.triggered.connect(lambda: self.toolbar.hide() if self.toolbar.isVisible() is True else self.toolbar.show()) qati = QAction(QIcon.fromTheme("help-browser"), "Switch ToolBar Icon Size", self) qati.triggered.connect( lambda: self.toolbar.setIconSize(self.toolbar.iconSize() * 4) if self.toolbar.iconSize().width() * 4 == 24 else self.toolbar.setIconSize(self.toolbar.iconSize() / 4) ) qasb = QAction(QIcon.fromTheme("zoom-in"), "Toggle Tabs Bar", self) qasb.triggered.connect( lambda: self.mainwidget.tabBar().hide() if self.mainwidget.tabBar().isVisible() is True else self.mainwidget.tabBar().show() ) qadoc = QAction(QIcon.fromTheme("help-browser"), "On-line Docs", self) qadoc.triggered.connect(lambda: open_new_tab(__url__)) qapy = QAction(QIcon.fromTheme("help-about"), "About Python", self) qapy.triggered.connect(lambda: open_new_tab("http://python.org/about")) qali = QAction(QIcon.fromTheme("help-browser"), "Read Licence", self) qali.triggered.connect(lambda: open_new_tab(__full_licence__)) qacol = QAction(QIcon.fromTheme("preferences-system"), "Set GUI Colors", self) if KDE: color = QColor() qacol.triggered.connect( lambda: self.setStyleSheet("".join(("* { background-color: ", str(color.name()), "}"))) if KColorDialog.getColor(color, self) else "" ) else: qacol.triggered.connect( lambda: self.setStyleSheet( "".join((" * { background-color: ", str(QColorDialog.getColor().name()), " } ")) ) ) qatit = QAction(QIcon.fromTheme("preferences-system"), "Set the App Window Title", self) qatit.triggered.connect(self.seTitle) self.toolbar.addWidget(self.left_spacer) self.toolbar.addSeparator() for b in ( qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qatim, qatb, qafnt, qati, qasb, qatit, qapic, qadoc, qali, qaslf, qaqt, qakde, qapy, qabug, ): self.toolbar.addAction(b) self.addToolBar(Qt.TopToolBarArea, self.toolbar) self.toolbar.addSeparator() self.toolbar.addWidget(self.right_spacer) # define the menu menu = self.menuBar() # File menu items menu.addMenu("&File").addActions((qaqq,)) menu.addMenu("&Window").addActions((qamax, qanor, qamin)) # Settings menu menu.addMenu("&Settings").addActions((qasrc, qacol, qafnt, qatim, qatb, qati, qasb, qapic)) # Help menu items menu.addMenu("&Help").addActions((qadoc, qakb, qabug, qali, qaqt, qakde, qapy, qaslf)) # Tray Icon tray = QSystemTrayIcon(QIcon.fromTheme("face-devilish"), self) tray.setToolTip(__doc__) traymenu = QMenu() traymenu.addActions((qamax, qanor, qamin, qaqq)) tray.setContextMenu(traymenu) tray.show() def contextMenuRequested(point): " quick and dirty custom context menu " menu = QMenu() menu.addActions( ( qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qafnt, qati, qasb, qatb, qatim, qatit, qapic, qadoc, qali, qaslf, qaqt, qakde, qapy, qabug, ) ) menu.exec_(self.mapToGlobal(point)) self.mainwidget.customContextMenuRequested.connect(contextMenuRequested) def must_be_checked(widget_list): " widget tuple passed as argument should be checked as ON " for each_widget in widget_list: try: each_widget.setChecked(True) except: pass def must_have_tooltip(widget_list): " widget tuple passed as argument should have tooltips " for each_widget in widget_list: try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) finally: each_widget.setCursor(QCursor(Qt.PointingHandCursor)) def must_autofillbackground(widget_list): " widget tuple passed as argument should have filled background " for each_widget in widget_list: try: each_widget.setAutoFillBackground(True) except: pass def must_glow(widget_list): " apply an glow effect to the widget " for glow, each_widget in enumerate(widget_list): try: if each_widget.graphicsEffect() is None: glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) each_widget.setGraphicsEffect(glow) # glow.setEnabled(False) try: each_widget.clicked.connect( lambda: each_widget.graphicsEffect().setEnabled(True) if each_widget.graphicsEffect().isEnabled() is False else each_widget.graphicsEffect().setEnabled(False) ) except: each_widget.sliderPressed.connect( lambda: each_widget.graphicsEffect().setEnabled(True) if each_widget.graphicsEffect().isEnabled() is False else each_widget.graphicsEffect().setEnabled(False) ) except: pass ####################################################################### self.group1 = QGroupBox() self.group1.setTitle(__doc__) self.frmt = QComboBox(self.group1) self.frmt.addItems(["blah ", "blah blah", "blah blah blah"]) self.file1 = QLineEdit() self.file1.setPlaceholderText("/full/path/to/one_file.py") self.file1.setCompleter(self.completer) self.borig = QPushButton(QIcon.fromTheme("folder-open"), "Open") vboxg1 = QVBoxLayout(self.group1) for each_widget in ( QLabel('<b style="color:white;">some comment'), self.file1, self.borig, QLabel('<b style="color:white;">Lorem Impsum'), self.frmt, ): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle(__doc__) self.nwfl = QCheckBox("Be Awesome") self.smll = QCheckBox("Solve the Squaring of the Circle") self.lrgf = QCheckBox("Im just a QCheckBox") self.case = QCheckBox("Use Quantum Processing") vboxg2 = QVBoxLayout(self.group2) for each_widget in (self.nwfl, self.smll, self.lrgf, self.case): vboxg2.addWidget(each_widget) group3 = QGroupBox() group3.setTitle(__doc__) self.plai = QCheckBox("May the Force be with You") self.nocr = QCheckBox("Im just a Place Holder") self.ridt = QCheckBox("Lorem Impsum") self.nocm = QCheckBox("Divide by Zero") vboxg3 = QVBoxLayout(group3) for each_widget in (self.plai, self.nocr, self.ridt, self.nocm): vboxg3.addWidget(each_widget) container = QWidget() hbox = QHBoxLayout(container) for each_widget in (self.group2, self.group1, group3): hbox.addWidget(each_widget) self.dock1.setWidget(container) # dock 2 self.dock2.setWidget(QPlainTextEdit()) # dock 3 self.dock3.setWidget(QCalendarWidget()) # configure some widget settings must_be_checked((self.nwfl, self.smll, self.lrgf, self.plai)) must_have_tooltip((self.plai, self.nocr, self.ridt, self.nocm, self.nwfl, self.smll, self.lrgf, self.case)) must_autofillbackground( (self.plai, self.nocr, self.ridt, self.nocm, self.nwfl, self.smll, self.lrgf, self.case) ) must_glow((self.plai, self.nocr, self.ridt, self.nocm, self.nwfl))
def __init__(self): ' make a diff method with GUI ' self.dialog = QDialog() self.diff_path = None # directory auto completer self.completer = QCompleter(self.dialog) self.dirs = QDirModel(self.dialog) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.group1 = QGroupBox() self.group1.setTitle('Diff') self.frmt = QComboBox(self.group1) self.frmt.addItems(['Unified', 'Normal', 'Context']) self.file1 = QLineEdit() self.file1.setPlaceholderText('/full/path/to/one_file.py') self.file1.setCompleter(self.completer) self.file2 = QLineEdit() self.file2.setPlaceholderText('/full/path/to/another_file.py') self.file2.setCompleter(self.completer) self.fout = QLineEdit() self.fout.setText(''.join((path.join(gettempdir(), datetime.now().strftime('%d-%b-%Y_%H:%M:%S.diff'))))) self.fout.setPlaceholderText('/full/path/to/output_file.diff') self.fout.setCompleter(self.completer) self.regex = QLineEdit() self.regex.setPlaceholderText('DONT use unless you know what are doing') self.regex.setToolTip('Do NOT use unless you know what you are doing !') self.borig = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.borig.clicked.connect(lambda: self.file1.setText(str( QFileDialog.getOpenFileName(self.dialog, 'Open file to compare', path.expanduser("~"), ';;(*.*)')))) self.bmodi = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.bmodi.clicked.connect(lambda: self.file2.setText(str( QFileDialog.getOpenFileName(self.dialog, 'Open file to compare', path.expanduser("~"), ';;(*.*)')))) self.bout = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.bout.clicked.connect(lambda: self.fout.setText(str( QFileDialog.getSaveFileName(self.dialog, 'Save a Diff file', path.expanduser("~"), ';;(*.diff)')))) vboxg1 = QVBoxLayout(self.group1) for each_widget in (QLabel('Original file full path'), self.file1, self.borig, QLabel('Modified file full path'), self.file2, self.bmodi, QLabel('Output file full Path'), self.fout, self.bout, QLabel('Diff Output Format'), self.frmt, QLabel('Diff REGEX to Ignore (ADVANCED)'), self.regex): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle('Options') self.nwfl = QCheckBox('Treat new files as Empty') self.smll = QCheckBox('Look for smaller changes') self.lrgf = QCheckBox('Optimize for large files') self.case = QCheckBox('Ignore case changes on content') self.cnvt = QCheckBox('Convert Tabs to Spaces') self.blnk = QCheckBox('Ignore added or removed Blank lines') self.spac = QCheckBox('Ignore changes in amount of Spaces') self.whit = QCheckBox('Ignore ALL white Spaces') self.tabz = QCheckBox('Ignore changes by Tab expansions') self.sprs = QCheckBox('Remove Space or Tab before empty lines') self.filn = QCheckBox('Ignore case when comparing file names') self.tbs = QComboBox(self.group2) self.tbs.addItems(['4', '6', '8', '10', '2']) self.nice = QComboBox(self.group2) self.nice.addItems(['20', '15', '10', '5', '0']) vboxg2 = QVBoxLayout(self.group2) for each_widget in (self.nwfl, self.smll, self.lrgf, self.case, self.cnvt, self.blnk, self.spac, self.whit, self.tabz, self.sprs, self.filn, QLabel('Diff Tabs-to-Spaces Size'), self.tbs, QLabel('Diff Backend CPU Priority'), self.nice): vboxg2.addWidget(each_widget) try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) each_widget.setCursor(QCursor(Qt.PointingHandCursor)) group3 = QGroupBox() group3.setTitle('Even More Options') self.plai = QCheckBox('Force treat all files as plain text') self.nocr = QCheckBox('Force strip trailing carriage return') self.ridt = QCheckBox('Report when two files are identical') self.nocm = QCheckBox('Do not output common lines') self.rdif = QCheckBox('Report only when files differ') self.clip = QCheckBox('Copy Diff to Clipboard when done') self.noti = QCheckBox('Use system Notification when done') self.pret = QCheckBox('Align all Tabs by prepending a Tab') self.lolz = QCheckBox('Output Diff in two equal columns') self.odif = QCheckBox('Open Diff with Ninja-IDE when done') self.plac = QCheckBox('Make an Awesome Diff view when done') self.wdth = QComboBox(group3) self.wdth.addItems(['80', '100', '120', '130', '250', '500', '9999999']) self.bcknd = QComboBox(group3) self.bcknd.addItems(['diff', 'diff.py']) self.bcknd.setDisabled(True) # TODO this feature needs work vboxg3 = QVBoxLayout(group3) for each_widget in (self.plai, self.nocr, self.ridt, self.nocm, self.rdif, self.pret, self.clip, self.noti, self.lolz, self.odif, self.plac, QLabel('Diff Maximum Total Width'), self.wdth, QLabel('Diff Backend (EXPERIMENTAL)'), self.bcknd): vboxg3.addWidget(each_widget) try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) each_widget.setCursor(QCursor(Qt.PointingHandCursor)) for widget_should_be_checked in (self.nwfl, self.smll, self.lrgf, self.clip, self.cnvt, self.plai, self.noti): widget_should_be_checked.setChecked(True) container = QWidget() hbox = QHBoxLayout(container) for each_widget in (self.group2, self.group1, group3): hbox.addWidget(each_widget) buttons = QDialogButtonBox() buttons.resize(self.dialog.size().width(), buttons.size().height() * 2) buttons.setOrientation(Qt.Horizontal) buttons.setStandardButtons( QDialogButtonBox.Ok | QDialogButtonBox.Cancel | QDialogButtonBox.Close | QDialogButtonBox.Help) buttons.setCenterButtons(False) buttons.helpRequested.connect(lambda: QMessageBox.about( self.dialog, __doc__, ''.join((__doc__, ' GUI and Visualizer Plugin,', linesep, 'version ', __version__, ', (', __license__, '), by ', linesep, __author__, ', ( ', __email__, ' ).', linesep)))) buttons.rejected.connect(self.dialog.close) buttons.accepted.connect(self.make_diff) info = QLabel(''.join(('<b> Current Backend Diff Engine: </b>', getoutput('diff --version').split(linesep)[0]))) vbox = QVBoxLayout(self.dialog) for each_widget in ( QLabel('<center><h2> Ninja IDE Diff and Patch </h2></center>'), container, info, buttons): vbox.addWidget(each_widget) self.dialog.resize(1024, self.dialog.size().height()) self.dialog.exec_()
def __init__(self, parent=None): ' Initialize QWidget inside MyMainWindow ' super(MyMainWindow, self).__init__(parent) self.statusBar().showMessage(__doc__.title()) self.setWindowTitle(__doc__) self.setMinimumSize(600, 800) self.setMaximumSize(2048, 1024) self.resize(1024, 800) self.setWindowIcon(QIcon.fromTheme("face-monkey")) if not A11Y: self.setStyleSheet('''QWidget{color:#fff;font-family:Oxygen} QWidget:item:hover, QWidget:item:selected { background-color: cyan; color: #000 } QWidget:disabled { color: #404040; background-color: #323232 } QWidget:focus { border: 1px solid cyan } QPushButton { background-color: gray; padding: 3px; border: 1px solid gray; border-radius: 9px; margin: 0;font-size: 12px; padding-left: 5px; padding-right: 5px } QLineEdit, QTextEdit { background-color: #4a4a4a; border: 1px solid gray; border-radius: 0; font-size: 12px; } QPushButton:pressed { background-color: #323232 } QComboBox { background-color: #4a4a4a; padding-left: 9px; border: 1px solid gray; border-radius: 5px; } QComboBox:pressed { background-color: gray } QComboBox QAbstractItemView, QMenu { border: 1px solid #4a4a4a; background:grey; selection-background-color: cyan; selection-color: #000; } QSlider { padding: 3px; font-size: 8px; padding-left: 2px; padding-right: 2px; border: 5px solid #1e1e1e } QSlider::sub-page:vertical { background-color: QLinearGradient(spread:pad, x1:0, y1:0, x2:1, y2:0.27, stop:0 rgba(255, 0, 0, 255), stop:1 rgba(50, 0, 0, 200)); border: 4px solid #1e1e1e; border-radius: 5px } QSlider::add-page:vertical { background-color: QLinearGradient(spread:pad, x1:0, y1:0, x2:1, y2:0.27, stop:0 rgba(0, 255, 0, 255), stop:1 rgba(0, 99, 0, 255)); border: 4px solid #1e1e1e; border-radius: 5px; } QSlider::handle:vertical { background-color: QLinearGradient(spread:pad, x1:0, y1:0, x2:1, y2:0.273, stop:0 rgba(0, 0, 0, 255), stop:1 gray); height: 5px; border: 1px dotted #fff; text-align: center; border-top-left-radius: 2px; border-bottom-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius 2px; margin-left: 2px; margin-right: 2px; } QSlider::handle:vertical:hover { border: 1px solid cyan } QSlider::sub-page:vertical:disabled { background: #bbb; border-color: #999; } QSlider::add-page:vertical:disabled { background: #eee; border-color: #999; } QSlider::handle:vertical:disabled { background: #eee; border: 1px solid #aaa; border-radius: 4px; } QToolBar, QStatusBar, QDockWidget::title{background-color:#323232;} QToolBar::handle, QToolBar::handle:vertical, QToolBar::handle:horizontal { border: 1px solid gray; border-radius: 9px; width: 19px; height: 19px; margin: 0.5px } QGroupBox { border: 1px solid gray; border-radius: 9px; padding-top: 9px; } QStatusBar, QToolBar::separator:horizontal, QToolBar::separator:vertical {color:gray} QScrollBar:vertical{ background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #212121,stop: 1.0 #323232); width: 10px; } QScrollBar:horizontal{ background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #212121,stop: 1.0 #323232); height: 10px; } QScrollBar::handle:vertical{ padding: 2px; min-height: 50px; background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #585858,stop: 1.0 #404040); border-radius: 5px; border: 1px solid #191919; } QScrollBar::handle:horizontal{ padding: 2px; min-width: 50px; background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #585858,stop: 1.0 #404040); border-radius: 5px; border: 1px solid #191919; } QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical, QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical, QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal, QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { background: none; border: none; } QDockWidget::close-button, QDockWidget::float-button { border: 1px solid gray; border-radius: 3px; background: darkgray; }''') self.process = QProcess() self.process.readyReadStandardOutput.connect(self.read_output) self.process.readyReadStandardError.connect(self.read_errors) self.process.finished.connect(self._process_finished) self.process.error.connect(self._process_finished) self.group0, self.group1 = QGroupBox("Options"), QGroupBox("Paths") self.group2 = QGroupBox("Nodes") self.group3 = QGroupBox("Python Code") self.group4, self.group5 = QGroupBox("Logs"), QGroupBox("Backend") g0grid, g1vlay = QGridLayout(self.group0), QVBoxLayout(self.group1) g5vlay = QVBoxLayout(self.group5) self.treeview_nodes, self.textedit_source = QTextEdit(), QTextEdit() self.dock1, self.dock2 = QDockWidget(), QDockWidget() self.output, self.dock3 = QTextEdit(), QDockWidget() self.treeview_nodes.setAutoFormatting(QTextEdit.AutoAll) self.treeview_nodes.setWordWrapMode(QTextOption.NoWrap) self.dock1.setWidget(self.treeview_nodes) self.dock2.setWidget(self.textedit_source) self.dock3.setWidget(self.output) self.dock1.setWindowTitle("Tree") self.dock2.setWindowTitle("Sources") self.dock3.setWindowTitle("STDOutput") featur = QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable self.dock1.setFeatures(featur) self.dock2.setFeatures(featur) self.dock3.setFeatures(featur) QVBoxLayout(self.group2).addWidget(self.dock1) QVBoxLayout(self.group3).addWidget(self.dock2) QVBoxLayout(self.group4).addWidget(self.dock3) self.slider1, self.slider2 = QSlider(), QSlider() g0grid.addWidget(self.slider1, 0, 0) g0grid.addWidget(QLabel('Use Debug'), 0, 1) self.slider2.setValue(1) g0grid.addWidget(self.slider2, 1, 0) g0grid.addWidget(QLabel('Use verbose'), 1, 1) self.slider3, self.slider4 = QSlider(), QSlider() self.slider3.setValue(1) g0grid.addWidget(self.slider3, 2, 0) g0grid.addWidget(QLabel('Show compiling progress'), 2, 1) self.slider4.setValue(1) g0grid.addWidget(self.slider4, 3, 0) g0grid.addWidget(QLabel('Show Scons building debug'), 3, 1) self.slider5, self.slider6 = QSlider(), QSlider() g0grid.addWidget(self.slider5, 4, 0) g0grid.addWidget(QLabel('Keep debug unstriped binary'), 4, 1) g0grid.addWidget(self.slider6, 5, 0) g0grid.addWidget(QLabel('Traced execution outputs'), 5, 1) self.slider7, self.slider8 = QSlider(), QSlider() self.slider7.setValue(1) g0grid.addWidget(self.slider7, 6, 0) g0grid.addWidget(QLabel('Remove the build folder'), 6, 1) g0grid.addWidget(self.slider8, 7, 0) g0grid.addWidget(QLabel('No Python Optimizations'), 7, 1) self.slider9, self.slider10 = QSlider(), QSlider() g0grid.addWidget(self.slider9, 8, 0) g0grid.addWidget(QLabel('No Statements line numbers'), 8, 1) g0grid.addWidget(self.slider10, 9, 0) g0grid.addWidget(QLabel('Execute the output binary'), 9, 1) self.slider11, self.slider12 = QSlider(), QSlider() g0grid.addWidget(self.slider11, 10, 0) g0grid.addWidget(QLabel('Warning detected implicit exceptions'), 10, 1) g0grid.addWidget(self.slider12, 11, 0) g0grid.addWidget(QLabel('Keep the PYTHONPATH, do not Reset it'), 11, 1) self.slider13 = QSlider() g0grid.addWidget(self.slider13, 12, 0) g0grid.addWidget(QLabel('Enhance compile, CPython incompatible'), 12, 1) self.slider1a, self.slider2a = QSlider(), QSlider() g0grid.addWidget(self.slider1a, 0, 2) g0grid.addWidget(QLabel('Descendent Recursive Compile'), 0, 3) self.slider2a.setValue(1) g0grid.addWidget(self.slider2a, 1, 2) g0grid.addWidget(QLabel('Force non recursive compile'), 1, 3) self.slider3a, self.slider4a = QSlider(), QSlider() g0grid.addWidget(self.slider3a, 2, 2) g0grid.addWidget(QLabel('STD Lib Recursive Compile'), 2, 3) g0grid.addWidget(self.slider4a, 3, 2) g0grid.addWidget(QLabel('Enforce the use of Clang'), 3, 3) self.slider5a, self.slider6a = QSlider(), QSlider() self.slider5a.setValue(1) g0grid.addWidget(self.slider5a, 4, 2) g0grid.addWidget(QLabel('Use G++ link time optimizations'), 4, 3) g0grid.addWidget(self.slider6a, 5, 2) g0grid.addWidget(QLabel('Disable the console window'), 5, 3) self.slider7a, self.slider8a = QSlider(), QSlider() g0grid.addWidget(self.slider7a, 6, 2) g0grid.addWidget(QLabel('Force compile for MS Windows'), 6, 3) g0grid.addWidget(self.slider8a, 7, 2) g0grid.addWidget(QLabel('Use Python Debug versions'), 7, 3) self.slider9a, self.slider10a = QSlider(), QSlider() self.slider9a.setValue(1) g0grid.addWidget(self.slider9a, 8, 2) g0grid.addWidget(QLabel('Create standalone executable'), 8, 3) g0grid.addWidget(self.slider10a, 9, 2) g0grid.addWidget(QLabel('Enable Standalone mode build'), 9, 3) self.slider11a, self.slider12a = QSlider(), QSlider() g0grid.addWidget(self.slider11a, 10, 2) g0grid.addWidget(QLabel('Make module executable instead of app'), 10, 3) g0grid.addWidget(self.slider12a, 11, 2) g0grid.addWidget(QLabel('No froze module of stdlib as bytecode'), 11, 3) self.slider13a = QSlider() g0grid.addWidget(self.slider13a, 12, 2) g0grid.addWidget(QLabel('Force use of MinGW on MS Windows'), 12, 3) for each_widget in (self.slider1, self.slider2, self.slider3, self.slider4, self.slider5, self.slider6, self.slider7, self.slider8, self.slider9, self.slider10, self.slider11, self.slider12, self.slider13, self.slider1a, self.slider2a, self.slider3a, self.slider4a, self.slider5a, self.slider6a, self.slider7a, self.slider8a, self.slider9a, self.slider10a, self.slider11a, self.slider12a, self.slider13a): each_widget.setRange(0, 1) each_widget.setCursor(QCursor(Qt.OpenHandCursor)) each_widget.setTickInterval(1) each_widget.TickPosition(QSlider.TicksBothSides) self.combo1 = QComboBox() self.combo1.addItems(('2.7', '2.6', '3.2', '3.3')) g5vlay.addWidget(QLabel('Python Version')) g5vlay.addWidget(self.combo1) self.combo2 = QComboBox() self.combo2.addItems(('Default', 'Low', 'High')) g5vlay.addWidget(QLabel('CPU priority')) g5vlay.addWidget(self.combo2) self.combo3 = QComboBox() self.combo3.addItems(('1', '2', '3', '4', '5', '6', '7', '8', '9')) g5vlay.addWidget(QLabel('MultiProcessing Workers')) g5vlay.addWidget(self.combo3) self.outdir = QLineEdit() self.outdir.setStyleSheet("QLineEdit{margin-left:25px}") self.clearButton = QToolButton(self.outdir) self.clearButton.setIcon(QIcon.fromTheme("edit-clear")) self.clearButton.setIconSize(QSize(25, 25)) self.clearButton.setStyleSheet("QToolButton{border:none}") self.clearButton.hide() self.clearButton.clicked.connect(self.outdir.clear) self.outdir.textChanged.connect( lambda: self.clearButton.setVisible(True)) self.clearButton.clicked.connect( lambda: self.clearButton.setVisible(False)) self.outdir.setPlaceholderText('Output Directory') if path.isfile('.nuitka-output-dir.txt'): self.outdir.setText(open('.nuitka-output-dir.txt', 'r').read()) else: self.outdir.setText(path.expanduser("~")) self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.Dirs | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.completer.popup().setStyleSheet( """border:1px solid #4a4a4a;background:grey; selection-background-color:cyan;selection-color:#000""") self.completer.popup().setVerticalScrollBarPolicy( Qt.ScrollBarAlwaysOff) self.outdir.setCompleter(self.completer) self.btn1 = QPushButton(QIcon.fromTheme("document-open"), 'Open' if IS_WIN else '') self.btn1.clicked.connect( lambda: open('.nuitka-output-dir.txt', 'w').write( str( QFileDialog.getExistingDirectory( None, 'Open Output Directory', path.expanduser("~"))))) self.btn1.released.connect(lambda: self.outdir.setText( open('.nuitka-output-dir.txt', 'r').read())) g1vlay.addWidget(QLabel('Output Directory')) g1vlay.addWidget(self.outdir) g1vlay.addWidget(self.btn1) self.target = QLineEdit() self.target.setStyleSheet("QLineEdit{margin-left:25px}") self.clearButton2 = QToolButton(self.target) self.clearButton2.setIcon(QIcon.fromTheme("edit-clear")) self.clearButton2.setIconSize(QSize(25, 25)) self.clearButton2.setStyleSheet("QToolButton{border:none}") self.clearButton2.hide() self.clearButton2.clicked.connect(self.target.clear) self.target.textChanged.connect( lambda: self.clearButton2.setVisible(True)) self.clearButton2.clicked.connect( lambda: self.clearButton2.setVisible(False)) self.target.setPlaceholderText('Target Python App to Binary Compile') self.target.setCompleter(self.completer) self.btn2 = QPushButton(QIcon.fromTheme("document-open"), 'Open' if IS_WIN else '') self.btn2.clicked.connect(lambda: self.target.setText( str( QFileDialog.getOpenFileName( None, "Open", path.expanduser("~"), ';;'.join([ '{}(*.{})'.format(e.upper(), e) for e in ('py', 'pyw', '*') ]))))) g1vlay.addWidget(QLabel('Input File')) g1vlay.addWidget(self.target) g1vlay.addWidget(self.btn2) self.icon, self.icon_label = QLineEdit(), QLabel('Icon File') self.icon.setStyleSheet("QLineEdit{margin-left:25px}") self.clearButton3 = QToolButton(self.icon) self.clearButton3.setIcon(QIcon.fromTheme("edit-clear")) self.clearButton3.setIconSize(QSize(25, 25)) self.clearButton3.setStyleSheet("QToolButton{border:none}") self.clearButton3.hide() self.clearButton3.clicked.connect(self.icon.clear) self.icon.textChanged.connect( lambda: self.clearButton3.setVisible(True)) self.clearButton3.clicked.connect( lambda: self.clearButton3.setVisible(False)) self.icon.setPlaceholderText('Path to Icon file for your App') self.icon.setCompleter(self.completer) self.btn3 = QPushButton(QIcon.fromTheme("document-open"), 'Open' if IS_WIN else '') self.btn3.clicked.connect(lambda: self.icon.setText( str( QFileDialog.getOpenFileName( None, "Open", path.expanduser("~"), ';;'.join([ '{}(*.{})'.format(e.upper(), e) for e in ('ico', 'png', 'bmp', 'svg', '*') ]))))) g1vlay.addWidget(self.icon_label) g1vlay.addWidget(self.icon) g1vlay.addWidget(self.btn3) # Menu Bar inicialization and detail definitions menu_salir = QAction(QIcon.fromTheme("application-exit"), 'Quit', self) menu_salir.setStatusTip('Quit') menu_salir.triggered.connect(exit) menu_minimize = QAction(QIcon.fromTheme("go-down"), 'Minimize', self) menu_minimize.setStatusTip('Minimize') menu_minimize.triggered.connect(lambda: self.showMinimized()) menu_qt = QAction(QIcon.fromTheme("help-about"), 'About Qt', self) menu_qt.setStatusTip('About Qt...') menu_qt.triggered.connect(lambda: QMessageBox.aboutQt(self)) menu_dev = QAction(QIcon.fromTheme("applications-development"), 'Developer Manual PDF', self) menu_dev.setStatusTip('Open Nuitka Developer Manual PDF...') menu_dev.triggered.connect(lambda: call( OPEN + '/usr/share/doc/nuitka/Developer_Manual.pdf.gz', shell=True) ) menu_usr = QAction(QIcon.fromTheme("help-contents"), 'User Docs', self) menu_usr.setStatusTip('Open Nuitka End User Manual PDF...') menu_usr.triggered.connect(lambda: call( OPEN + '/usr/share/doc/nuitka/README.pdf.gz', shell=True)) menu_odoc = QAction(QIcon.fromTheme("help-browser"), 'OnLine Doc', self) menu_odoc.setStatusTip('Open Nuitka on line Documentation pages...') menu_odoc.triggered.connect( lambda: open_new_tab('http://nuitka.net/doc/user-manual.html')) menu_man = QAction(QIcon.fromTheme("utilities-terminal"), 'Man', self) menu_man.setStatusTip('Open Nuitka technical command line Man Pages..') menu_man.triggered.connect( lambda: call('xterm -e "man nuitka"', shell=True)) menu_tra = QAction(QIcon.fromTheme("applications-development"), 'View Nuitka-GUI Source Code', self) menu_tra.setStatusTip('View, study, edit Nuitka-GUI Libre Source Code') menu_tra.triggered.connect(lambda: call(OPEN + __file__, shell=True)) menu_foo = QAction(QIcon.fromTheme("folder"), 'Open Output Dir', self) menu_foo.setStatusTip('Open the actual Output Directory location...') menu_foo.triggered.connect( lambda: call(OPEN + str(self.outdir.text()), shell=True)) menu_pic = QAction(QIcon.fromTheme("camera-photo"), 'Screenshot', self) menu_pic.setStatusTip('Take a Screenshot for Documentation purposes..') menu_pic.triggered.connect( lambda: QPixmap.grabWindow(QApplication.desktop().winId()).save( QFileDialog.getSaveFileName(None, "Save", path.expanduser("~"), 'PNG(*.png)', 'png'))) menu_don = QAction(QIcon.fromTheme("emblem-favorite"), 'Help Nuitka', self) menu_don.setStatusTip('Help the Nuitka Open Source Libre Free Project') menu_don.triggered.connect( lambda: open_new_tab('http://nuitka.net/pages/donations.html')) # movable draggable toolbar self.toolbar = QToolBar(self) self.toolbar.setIconSize(QSize(16, 16)) self.toolbar.toggleViewAction().setText("Show/Hide Toolbar") l_spacer, r_spacer = QWidget(self), QWidget(self) l_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) r_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.toolbar.addWidget(l_spacer) self.toolbar.addSeparator() self.toolbar.addActions((menu_salir, menu_minimize, menu_qt, menu_odoc, menu_foo, menu_pic, menu_don)) if not IS_WIN: self.toolbar.addActions((menu_man, menu_dev, menu_tra, menu_usr)) self.toolbar.addSeparator() self.toolbar.addWidget(r_spacer) self.addToolBar(Qt.BottomToolBarArea, self.toolbar) # Bottom Buttons Bar self.buttonBox = QDialogButtonBox(self) self.buttonBox.setStandardButtons(QDialogButtonBox.Ok | QDialogButtonBox.Close) self.buttonBox.rejected.connect(exit) self.buttonBox.accepted.connect(self.run) self.guimode = QComboBox() self.guimode.addItems(('Full UX / UI', 'Simple UX / UI')) self.guimode.setStyleSheet( """QComboBox{background:transparent;border:0; margin-left:25px;color:gray;text-decoration:underline}""") self.guimode.currentIndexChanged.connect(self.set_guimode) container = QWidget() container_layout = QGridLayout(container) # Y, X container_layout.addWidget(self.guimode, 0, 1) container_layout.addWidget(self.group2, 1, 0) container_layout.addWidget(self.group3, 2, 0) container_layout.addWidget(self.group0, 1, 1) container_layout.addWidget(self.group1, 2, 1) container_layout.addWidget(self.group4, 1, 2) container_layout.addWidget(self.group5, 2, 2) container_layout.addWidget(self.buttonBox, 3, 1) self.setCentralWidget(container) # Paleta de colores para pintar transparente if not A11Y: palette = self.palette() palette.setBrush(QPalette.Base, Qt.transparent) self.setPalette(palette) self.setAttribute(Qt.WA_OpaquePaintEvent, False)
def initialize(self, *args, **kwargs): " Init Main Class " super(Main, self).initialize(*args, **kwargs) # directory auto completer self.completer = QCompleter(self) self.dirs = QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) # tab widget self.mainwidget = QTabWidget() self.mainwidget.setToolTip(__doc__) self.mainwidget.setTabShape(QTabWidget.Triangular) self.mainwidget.setMovable(True) self.mainwidget.setTabsClosable(True) self.mainwidget.tabCloseRequested.connect(lambda: self.mainwidget.setTabPosition(1) if self.mainwidget.tabPosition() == 0 else self.mainwidget.setTabPosition(0)) self.dock1 = QDockWidget() self.dock2 = QDockWidget() for indx, a in enumerate((self.dock1, self.dock2)): a.setWindowModality(Qt.NonModal) a.setWindowOpacity(0.9) a.setWindowTitle('Semantic Files' if indx == 0 else 'Simple Query') a.setStyleSheet('QDockWidget::title{text-align:center;}') self.mainwidget.addTab(a, QIcon.fromTheme("nepomuk"), 'Semantic Files' if indx == 0 else 'Simple Query') QPushButton(QIcon.fromTheme("help-about"), 'Help About', self.dock1 ).clicked.connect(lambda: QMessageBox.information(self.dock1, __doc__, HELPMSG)) # Group of widgets for each tab self.group1 = QGroupBox() self.filename = QLineEdit() self.filename.setPlaceholderText('/full/path/to/one_file.py') self.filename.setCompleter(self.completer) self.filebttn = QPushButton(QIcon.fromTheme("folder-open"), 'Open File') self.filebttn.clicked.connect(lambda: self.filename.setText(str( QFileDialog.getOpenFileName(self.mainwidget, " Please, open a .py file to add Semantics ", path.expanduser("~"), ';;'.join(['(*.{}) {}'.format(e, e.upper()) for e in ['*', 'py']]))) )) self.group1a = QGroupBox() self.filetag = QLineEdit() self.filetag.setPlaceholderText('Type a short Tag for the choosen File') self.filelbl = QLineEdit() self.filelbl.setPlaceholderText('Type a descriptive Label for the Tag') self.filedsc = QLineEdit() self.filedsc.setPlaceholderText('Type a large and detailed Description') self.filerat = KRatingWidget() self.filerat.setToolTip('Set a File Rating') vboxg1a = QHBoxLayout(self.group1a) for each_widget in (QLabel('<b>File Tag'), self.filetag, QLabel('<b>Tag Label'), self.filelbl, QLabel('<b>Description'), self.filedsc, QLabel('<b>File Rating'), self.filerat): vboxg1a.addWidget(each_widget) self.nepobtn = QPushButton(QIcon.fromTheme("nepomuk"), 'Add Semantics') self.nepobtn.setMinimumSize(self.nepobtn.size().width(), 50) self.nepobtn.clicked.connect(lambda: self.nepomuk_set( str(self.filename.text()).strip(), str(self.filetag.text()).strip(), str(self.filelbl.text()).strip(), str(self.filedsc.text()).strip())) vboxg1 = QVBoxLayout(self.group1) for each_widget in ( QLabel('<b>Choose a File'), self.filename, self.filebttn, self.group1a, self.nepobtn): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle('Sorry!, this Tab is not Ready yet...') QLabel('<b style="color:red;"><i>Not Ready Yet!', self.dock2) self.search = QLineEdit() self.search.setPlaceholderText('Type to Query...') self.srcbtn = QPushButton(QIcon.fromTheme("folder-open"), 'Query') self.result = QTextEdit() self.srcbtn.clicked.connect(lambda: self.nepomuk_get(str(self.search.text()).strip().lower())) vboxg2 = QVBoxLayout(self.group2) for each_widget in ( QLabel('<b>Type for a Semantic Query'), self.search, self.srcbtn, QLabel('<b>Semantic Query Results'), self.result): vboxg2.addWidget(each_widget) # pack the group of widgets on the gui self.dock1.setWidget(self.group1) self.dock2.setWidget(self.group2) # pack the plugin on ninja-ide gui self.locator.get_service('misc').add_widget( self.mainwidget, QIcon.fromTheme("nepomuk"), __doc__) def must_have_tooltip(widget_list): ' widget tuple passed as argument should have tooltips ' for each_widget in widget_list: try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) finally: each_widget.setCursor(QCursor(Qt.PointingHandCursor)) def must_glow(widget_list): ' apply an glow effect to the widget ' for glow, each_widget in enumerate(widget_list): try: if each_widget.graphicsEffect() is None: glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) each_widget.setGraphicsEffect(glow) # glow.setEnabled(False) try: each_widget.clicked.connect(lambda: each_widget.graphicsEffect().setEnabled(True) if each_widget.graphicsEffect().isEnabled() is False else each_widget.graphicsEffect().setEnabled(False)) except: each_widget.sliderPressed.connect(lambda: each_widget.graphicsEffect().setEnabled(True) if each_widget.graphicsEffect().isEnabled() is False else each_widget.graphicsEffect().setEnabled(False)) except: pass must_have_tooltip((self.filebttn, self.nepobtn, self.srcbtn, )) must_glow((self.nepobtn, self.srcbtn, ))
class ComboBox(QComboBox): """File browser combo box. Widget and functionality """ def __init__(self, fileBrowser): QComboBox.__init__(self, fileBrowser) self._fileBrowser = fileBrowser self.setAttribute( Qt.WA_MacShowFocusRect, False ) self.setAttribute( Qt.WA_MacSmallSize ) self.setEditable(True) self.setMinimumContentsLength(1) self.setSizeAdjustPolicy(QComboBox.AdjustToMinimumContentsLengthWithIcon) self.lineEdit().setReadOnly( False ) self._completionModel = QDirModel(self.lineEdit()) self._completionModel.setFilter( QDir.AllDirs | QDir.NoDotAndDotDot ) self.lineEdit().setCompleter(QCompleter(self._completionModel, self.lineEdit())) #TODO QDirModel is deprecated but QCompleter does not yet handle #QFileSystemModel - please update when possible. self._count = 0 # Show popup action self._showPopupAction = QAction(QIcon(':enkiicons/filtered.png'), "File browser history", self) self._showPopupAction.setShortcut('Ctrl+H') core.actionManager().addAction("mNavigation/mFileBrowser/aMenuShow", self._showPopupAction) self._showPopupAction.triggered.connect(self._onShowPopup) # reconnected in self.updateComboItems() self.currentIndexChanged[int].connect(self._onItemSelected) def del_(self): """Explicitly called destructor """ core.actionManager().removeAction(self._showPopupAction) def _onShowPopup(self, triggered): """Handler for self._showPopupAction """ self.showPopup() @pyqtSlot(int) def _onItemSelected(self, index): """Handler of item selection in the combo box """ if self.count() > self._count: # It is user input path = self.itemText(index) if os.path.isdir(path): self._fileBrowser.setCurrentPath(path) else: path = self.itemData(index) self._fileBrowser.setCurrentPath(path) def updateItems(self, items): """Update items in the combo box according to current history """ self.currentIndexChanged[int].disconnect() self.clear() # Current text self.addItem(self._fileBrowser.currentPath()) self.setItemData(0, self._fileBrowser.currentPath()) self.insertSeparator(self.count()) for index, path in enumerate(items): self.addItem(path) self.setItemData(index + 2, path) self._count = self.count() self.currentIndexChanged[int].connect(self._onItemSelected)
def initialize(self, *args, **kwargs): " Init Main Class " super(Main, self).initialize(*args, **kwargs) self.infile = QLineEdit(path.expanduser("~")) self.infile.setPlaceholderText(' /full/path/to/file ') self.infile.returnPressed.connect(self.run) self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.infile.setCompleter(self.completer) self.menu = QMenu('Base64') self.menu.aboutToShow.connect(self.build_submenu) self.ex_locator = self.locator.get_service('explorer') self.ex_locator.add_project_menu(self.menu, lang='all') self.open = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.open.setCursor(QCursor(Qt.PointingHandCursor)) self.open.clicked.connect(lambda: self.infile.setText(str( QFileDialog.getOpenFileName(self.dock, "Open a File to Encode...", path.expanduser("~"), ';;'.join(['{}(*.{})'.format(e.upper(), e) for e in ['*', 'jpg', 'png', 'webp', 'svg', 'gif', 'webm']]))))) self.chckbx1 = QCheckBox('Use basic Caesar Cipher (ROT13)') self.chckbx1.setToolTip('Use "string".decode("rot13") to Decipher ! ') self.chckbx2 = QCheckBox('Use "data:type/subtype;base64,..."') self.chckbx2.setChecked(True) self.chckbx3 = QCheckBox('Copy encoded output to Clipboard') self.chckbx4 = QCheckBox('Use URL-Safe Base64 Encoder') self.combo1 = QComboBox() self.combo1.addItems(['Do Not Generate Code', 'Generate CSS embed Code', 'Generate Python Embed Code', 'Generate HTML embed Code', 'Generate JS embed Code', 'Generate QML embed Code']) self.combo1.currentIndexChanged.connect(self.combo_changed) self.output = QTextEdit(''' We can only see a short distance ahead, but we can see plenty there that needs to be done. - Alan Turing ''') self.output.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.button = QPushButton(QIcon.fromTheme("face-cool"), 'Encode BASE64') self.button.setCursor(QCursor(Qt.PointingHandCursor)) self.button.setMinimumSize(100, 50) self.button.clicked.connect(self.run) glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) self.button.setGraphicsEffect(glow) glow.setEnabled(True) class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget((QLabel('<i>Encode file as plain text string</i>'), QLabel('<b>File to Encode:'), self.infile, self.open, self.chckbx2, self.chckbx3, self.chckbx1, self.chckbx4, QLabel('<b>Embedding Template Code:'), self.combo1, QLabel(' <b>Base64 String Output: '), self.output, QLabel('<center><small><i>' + ''.join((__doc__, __version__, __license__, 'by', __author__))), self.button )) self.scrollable, self.dock = QScrollArea(), QDockWidget() self.scrollable.setWidgetResizable(True) self.scrollable.setWidget(tw) self.dock.setWindowTitle(__doc__) self.dock.setStyleSheet('QDockWidget::title{text-align: center;}') self.dock.setWidget(self.scrollable) ExplorerContainer().addTab(self.dock, "Base64") self.guimode = QComboBox(self.dock) self.guimode.addItems(['Full Mode', 'Simple Mode']) self.guimode.currentIndexChanged.connect(self.guimode_change)
class MyMainWindow(QMainWindow): ' Main Window ' def __init__(self, AUTO): ' Initialize QWidget inside MyMainWindow ' super(MyMainWindow, self).__init__() QWidget.__init__(self) self.auto = AUTO self.statusBar().showMessage(' {}'.format(__doc__)) self.setStyleSheet('QStatusBar{color:grey;}') self.setWindowTitle(__doc__) self.setWindowIcon(QIcon.fromTheme("face-monkey")) self.setFont(QFont('Ubuntu Light', 10)) self.setMaximumSize(QDesktopWidget().screenGeometry().width(), QDesktopWidget().screenGeometry().height()) self.base = path.abspath(path.join(getcwd(), str(datetime.now().year))) # directory auto completer self.completer = QCompleter(self) self.dirs = QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) # process self.process1 = None self.process2 = None self.cmd1 = 'nice -n {n} arecord{v} -f {f} -c {c} -r {b} -t raw' self.cmd2 = 'oggenc - -r -C {c} -R {b} -q {q} {d}{t}{a} -o {o}' self.process3 = QProcess(self) #self.process3.finished.connect(self.on_process3_finished) #self.process3.error.connect(self.on_process3_error) self.cmd3 = ('nice -n 20 ' + 'sox "{o}" -n spectrogram -x {x} -y {y} -z 99 -t "{o}" -o "{o}.png"') self.actual_file = '' # re starting timers, one stops, one starts self.timerFirst = QTimer(self) self.timerFirst.timeout.connect(self.end) self.timerSecond = QTimer(self) self.timerSecond.timeout.connect(self.run) # Proxy support, by reading http_proxy os env variable proxy_url = QUrl(environ.get('http_proxy', '')) QNetworkProxy.setApplicationProxy(QNetworkProxy(QNetworkProxy.HttpProxy if str(proxy_url.scheme()).startswith('http') else QNetworkProxy.Socks5Proxy, proxy_url.host(), proxy_url.port(), proxy_url.userName(), proxy_url.password())) \ if 'http_proxy' in environ else None print((' INFO: Proxy Auto-Config as ' + str(proxy_url))) # basic widgets layouts and set up self.mainwidget = QTabWidget() self.mainwidget.setToolTip(__doc__) self.mainwidget.setMovable(True) self.mainwidget.setTabShape(QTabWidget.Triangular) self.mainwidget.setContextMenuPolicy(Qt.CustomContextMenu) self.mainwidget.setStyleSheet('QTabBar{color:white;font-weight:bold;}') self.mainwidget.setTabBar(TabBar(self)) self.mainwidget.setTabsClosable(False) self.setCentralWidget(self.mainwidget) self.dock1 = QDockWidget() self.dock2 = QDockWidget() self.dock3 = QDockWidget() self.dock4 = QDockWidget() self.dock5 = QDockWidget() for a in (self.dock1, self.dock2, self.dock3, self.dock4, self.dock5): a.setWindowModality(Qt.NonModal) # a.setWindowOpacity(0.9) a.setWindowTitle(__doc__ if a.windowTitle() == '' else a.windowTitle()) a.setStyleSheet('QDockWidget::title{text-align:center;}') self.mainwidget.addTab(a, QIcon.fromTheme("face-smile"), 'Double Click Me') # Paleta de colores para pintar transparente self.palette().setBrush(QPalette.Base, Qt.transparent) self.setPalette(self.palette()) self.setAttribute(Qt.WA_OpaquePaintEvent, False) # toolbar and basic actions self.toolbar = QToolBar(self) self.toolbar.setIconSize(QSize(24, 24)) # spacer widget for left self.left_spacer = QWidget(self) self.left_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # spacer widget for right self.right_spacer = QWidget(self) self.right_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) qaqq = QAction(QIcon.fromTheme("application-exit"), 'Quit', self) qaqq.setShortcut('Ctrl+Q') qaqq.triggered.connect(exit) qamin = QAction(QIcon.fromTheme("go-down"), 'Minimize', self) qamin.triggered.connect(lambda: self.showMinimized()) qamax = QAction(QIcon.fromTheme("go-up"), 'Maximize', self) qanor = QAction(QIcon.fromTheme("view-fullscreen"), 'AutoCenter AutoResize', self) qanor.triggered.connect(self.center) qatim = QAction(QIcon.fromTheme("mail-signed-verified"), 'View Date and Time', self) qatim.triggered.connect(self.timedate) qabug = QAction(QIcon.fromTheme("help-about"), 'Report a Problem', self) qabug.triggered.connect(lambda: qabug.setDisabled(True) if not call( 'xdg-open mailto:' + '*****@*****.**'.decode('rot13'), shell=True) else ' ERROR ') qamax.triggered.connect(lambda: self.showMaximized()) qaqt = QAction(QIcon.fromTheme("help-about"), 'About Qt', self) qaqt.triggered.connect(lambda: QMessageBox.aboutQt(self)) qakde = QAction(QIcon.fromTheme("help-about"), 'About KDE', self) if KDE: qakde.triggered.connect(KHelpMenu(self, "", False).aboutKDE) qaslf = QAction(QIcon.fromTheme("help-about"), 'About Self', self) if KDE: qaslf.triggered.connect( KAboutApplicationDialog(aboutData, self).exec_) else: qaslf.triggered.connect(lambda: QMessageBox.about(self.mainwidget, __doc__, ''.join((__doc__, linesep, 'version ', __version__, ', (', __license__, '), by ', __author__, ', ( ', __email__, ' )', linesep )))) qafnt = QAction(QIcon.fromTheme("tools-check-spelling"), 'Set GUI Font', self) if KDE: font = QFont() qafnt.triggered.connect(lambda: self.setStyleSheet(''.join(( '*{font-family:', str(font.toString()), '}')) if KFontDialog.getFont(font)[0] == QDialog.Accepted else '')) else: qafnt.triggered.connect(lambda: self.setStyleSheet(''.join(('*{font-family:', str(QFontDialog.getFont()[0].toString()), '}')))) qasrc = QAction(QIcon.fromTheme("applications-development"), 'View Source Code', self) qasrc.triggered.connect(lambda: call('xdg-open {}'.format(__file__), shell=True)) qakb = QAction(QIcon.fromTheme("input-keyboard"), 'Keyboard Shortcuts', self) qakb.triggered.connect(lambda: QMessageBox.information(self.mainwidget, 'Keyboard Shortcuts', ' Ctrl+Q = Quit ')) qapic = QAction(QIcon.fromTheme("camera-photo"), 'Take a Screenshot', self) qapic.triggered.connect(lambda: QPixmap.grabWindow( QApplication.desktop().winId()).save(QFileDialog.getSaveFileName( self.mainwidget, " Save Screenshot As ...", path.expanduser("~"), ';;(*.png) PNG', 'png'))) qatb = QAction(QIcon.fromTheme("go-top"), 'Toggle ToolBar', self) qatb.triggered.connect(lambda: self.toolbar.hide() if self.toolbar.isVisible() is True else self.toolbar.show()) qati = QAction(QIcon.fromTheme("zoom-in"), 'Switch ToolBar Icon Size', self) qati.triggered.connect(lambda: self.toolbar.setIconSize(self.toolbar.iconSize() * 4) if self.toolbar.iconSize().width() * 4 == 24 else self.toolbar.setIconSize(self.toolbar.iconSize() / 4)) qasb = QAction(QIcon.fromTheme("preferences-other"), 'Toggle Tabs Bar', self) qasb.triggered.connect(lambda: self.mainwidget.tabBar().hide() if self.mainwidget.tabBar().isVisible() is True else self.mainwidget.tabBar().show()) qadoc = QAction(QIcon.fromTheme("help-browser"), 'On-line Docs', self) qadoc.triggered.connect(lambda: open_new_tab(str(__url__).strip())) qapy = QAction(QIcon.fromTheme("help-about"), 'About Python', self) qapy.triggered.connect(lambda: open_new_tab('http://python.org/about')) qali = QAction(QIcon.fromTheme("help-browser"), 'Read Licence', self) qali.triggered.connect(lambda: open_new_tab(__full_licence__)) qacol = QAction(QIcon.fromTheme("preferences-system"), 'Set GUI Colors', self) if KDE: color = QColor() qacol.triggered.connect(lambda: self.setStyleSheet(''.join(('* { background-color: ', str(color.name()), '}'))) if KColorDialog.getColor(color, self) else '') else: qacol.triggered.connect(lambda: self.setStyleSheet(''.join(( ' * { background-color: ', str(QColorDialog.getColor().name()), ' } ')))) qatit = QAction(QIcon.fromTheme("preferences-system"), 'Set the App Window Title', self) qatit.triggered.connect(self.seTitle) self.toolbar.addWidget(self.left_spacer) self.toolbar.addSeparator() self.toolbar.addActions((qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qatim, qatb, qafnt, qati, qasb, qatit, qapic, qadoc, qali, qaslf, qaqt, qakde, qapy, qabug)) self.addToolBar(Qt.TopToolBarArea, self.toolbar) self.toolbar.addSeparator() self.toolbar.addWidget(self.right_spacer) # define the menu menu = self.menuBar() # File menu items menu.addMenu('&File').addActions((qaqq, )) menu.addMenu('&Window').addActions((qamax, qanor, qamin)) # Settings menu menu.addMenu('&Settings').addActions((qasrc, qacol, qafnt, qatim, qatb, qati, qasb, qapic)) # Help menu items menu.addMenu('&Help').addActions((qadoc, qakb, qabug, qali, qaqt, qakde, qapy, qaslf)) # Tray Icon tray = QSystemTrayIcon(QIcon.fromTheme("face-devilish"), self) tray.setToolTip(__doc__) traymenu = QMenu() traymenu.addActions((qamax, qanor, qamin, qaqq)) tray.setContextMenu(traymenu) tray.show() def contextMenuRequested(point): ' quick and dirty custom context menu ' menu = QMenu() menu.addActions((qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qafnt, qati, qasb, qatb, qatim, qatit, qapic, qadoc, qali, qaslf, qaqt, qakde, qapy, qabug)) menu.exec_(self.mapToGlobal(point)) self.mainwidget.customContextMenuRequested.connect(contextMenuRequested) def must_be_checked(widget_list): ' widget tuple passed as argument should be checked as ON ' for each_widget in widget_list: try: each_widget.setChecked(True) except: pass def must_have_tooltip(widget_list): ' widget tuple passed as argument should have tooltips ' for each_widget in widget_list: try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) finally: each_widget.setCursor(QCursor(Qt.PointingHandCursor)) def must_autofillbackground(widget_list): ' widget tuple passed as argument should have filled background ' for each_widget in widget_list: try: each_widget.setAutoFillBackground(True) except: pass def must_glow(widget_list): ' apply an glow effect to the widget ' for glow, each_widget in enumerate(widget_list): try: if each_widget.graphicsEffect() is None: glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) each_widget.setGraphicsEffect(glow) # glow.setEnabled(False) try: each_widget.clicked.connect(lambda: each_widget.graphicsEffect().setEnabled(True) if each_widget.graphicsEffect().isEnabled() is False else each_widget.graphicsEffect().setEnabled(False)) except: each_widget.sliderPressed.connect(lambda: each_widget.graphicsEffect().setEnabled(True) if each_widget.graphicsEffect().isEnabled() is False else each_widget.graphicsEffect().setEnabled(False)) except: pass ####################################################################### # dock 1 QLabel('<h1 style="color:white;"> Record !</h1>', self.dock1).resize( self.dock3.size().width() / 4, 25) self.group1 = QGroupBox() self.group1.setTitle(__doc__) self.spec = QPushButton(self) self.spec.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.spec.setMinimumSize(self.spec.size().width(), 250) self.spec.setFlat(True) self.spec.clicked.connect(self.spectro) self.clock = QLCDNumber() self.clock.setSegmentStyle(QLCDNumber.Flat) self.clock.setMinimumSize(self.clock.size().width(), 50) self.clock.setNumDigits(25) self.timer1 = QTimer(self) self.timer1.timeout.connect(lambda: self.clock.display( datetime.now().strftime("%d-%m-%Y %H:%M:%S %p"))) self.timer1.start(1000) self.clock.setToolTip(datetime.now().strftime("%c %x")) self.clock.setCursor(QCursor(Qt.CrossCursor)) self.diskBar = QProgressBar() self.diskBar.setMinimum(0) self.diskBar.setMaximum(statvfs(HOME).f_blocks * statvfs(HOME).f_frsize / 1024 / 1024 / 1024) self.diskBar.setValue(statvfs(HOME).f_bfree * statvfs(HOME).f_frsize / 1024 / 1024 / 1024) self.diskBar.setToolTip(str(statvfs(HOME).f_bfree * statvfs(HOME).f_frsize / 1024 / 1024 / 1024) + ' Gigabytes free') self.feedback = QPlainTextEdit(''.join(('<center><h3>', __doc__, ', version', __version__, __license__, ' <br> by ', __author__, ' <i>(Dev)</i>, Radio Comunitaria FM Reconquista <i>(Q.A.)</i><br>', 'FMReconquista.org.ar & GitHub.com/JuanCarlosPaco/Cinta-Testigo'))) self.rec = QPushButton(QIcon.fromTheme("media-record"), 'Record') self.rec.setMinimumSize(self.rec.size().width(), 50) self.rec.clicked.connect(self.go) # self.run self.stop = QPushButton(QIcon.fromTheme("media-playback-stop"), 'Stop') self.stop.clicked.connect(self.end) self.kill = QPushButton(QIcon.fromTheme("process-stop"), 'Kill') self.kill.clicked.connect(self.killer) vboxg1 = QVBoxLayout(self.group1) for each_widget in ( QLabel('<b style="color:white;"> Spectro'), self.spec, QLabel('<b style="color:white;"> Time '), self.clock, QLabel('<b style="color:white;"> Disk '), self.diskBar, QLabel('<b style="color:white;"> STDOUT + STDIN '), self.feedback, QLabel('<b style="color:white;"> Record '), self.rec, self.stop, self.kill): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle(__doc__) self.slider = QSlider(self) self.slid_l = QLabel(self.slider) self.slider.setCursor(QCursor(Qt.OpenHandCursor)) self.slider.sliderPressed.connect(lambda: self.slider.setCursor(QCursor(Qt.ClosedHandCursor))) self.slider.sliderReleased.connect(lambda: self.slider.setCursor(QCursor(Qt.OpenHandCursor))) self.slider.valueChanged.connect(lambda: self.slider.setToolTip(str(self.slider.value()))) self.slider.valueChanged.connect(lambda: self.slid_l.setText( '<h2 style="color:white;">{}'.format(self.slider.value()))) self.slider.setMinimum(10) self.slider.setMaximum(99) self.slider.setValue(30) self.slider.setOrientation(Qt.Vertical) self.slider.setTickPosition(QSlider.TicksBothSides) self.slider.setTickInterval(2) self.slider.setSingleStep(10) self.slider.setPageStep(10) vboxg2 = QVBoxLayout(self.group2) for each_widget in ( QLabel('<b style="color:white;">MINUTES of recording'), self.slider, QLabel('<b style="color:white;"> Default: 30 Min')): vboxg2.addWidget(each_widget) group3 = QGroupBox() group3.setTitle(__doc__) try: self.label2 = QLabel(getoutput('sox --version', shell=True)) self.label4 = QLabel(getoutput('arecord --version', shell=1)[:25]) self.label6 = QLabel(str(getoutput('oggenc --version', shell=True))) except: print(''' ERROR: No SOX, OGGenc avaliable ! ( sudo apt-get install vorbis-tools sox alsa-utils ) ''') exit() self.button5 = QPushButton(QIcon.fromTheme("audio-x-generic"), 'OGG --> ZIP') self.button5.clicked.connect(lambda: make_archive( str(QFileDialog.getSaveFileName(self, "Save OGG to ZIP file As...", getcwd(), ';;(*.zip)', 'zip')).replace('.zip', ''), "zip", path.abspath(path.join(getcwd(), str(datetime.now().year))))) self.button1 = QPushButton(QIcon.fromTheme("folder-open"), 'Files') self.button1.clicked.connect(lambda: call('xdg-open ' + getcwd(), shell=True)) self.button0 = QPushButton( QIcon.fromTheme("preferences-desktop-screensaver"), 'LCD OFF') self.button0.clicked.connect(lambda: call('sleep 3 ; xset dpms force off', shell=True)) vboxg3 = QVBoxLayout(group3) for each_widget in ( QLabel('<b style="color:white;"> OGG Output Codec '), self.label6, QLabel('<b style="color:white;"> Raw Record Backend '), self.label4, QLabel('<b style="color:white;"> Helper Libs '), self.label2, QLabel('<b style="color:white;"> OGG ZIP '), self.button5, QLabel('<b style="color:white;"> Files '), self.button1, QLabel('<b style="color:white;"> LCD '), self.button0): vboxg3.addWidget(each_widget) container = QWidget() hbox = QHBoxLayout(container) for each_widget in (self.group2, self.group1, group3): hbox.addWidget(each_widget) self.dock1.setWidget(container) # dock 2 QLabel('<h1 style="color:white;"> Hardware !</h1>', self.dock2).resize( self.dock2.size().width() / 4, 25) try: audioDriverStr = {Solid.AudioInterface.Alsa: "ALSA", Solid.AudioInterface.OpenSoundSystem: "Open Sound", Solid.AudioInterface.UnknownAudioDriver: "Unknown?"} audioInterfaceTypeStr = { Solid.AudioInterface.AudioControl: "Control", Solid.AudioInterface.UnknownAudioInterfaceType: "Unknown?", Solid.AudioInterface.AudioInput: "In", Solid.AudioInterface.AudioOutput: "Out"} soundcardTypeStr = { Solid.AudioInterface.InternalSoundcard: "Internal", Solid.AudioInterface.UsbSoundcard: "USB3", Solid.AudioInterface.FirewireSoundcard: "FireWire", Solid.AudioInterface.Headset: "Headsets", Solid.AudioInterface.Modem: "Modem"} display = QTreeWidget() display.setAlternatingRowColors(True) display.setHeaderLabels(["Items", "ID", "Drivers", "I / O", "Type"]) display.setColumnWidth(0, 350) display.setColumnWidth(1, 350) display.setColumnWidth(3, 75) # retrieve a list of Solid.Device for this machine deviceList = Solid.Device.allDevices() # filter the list of all devices and display matching results # note that we never create a Solid.AudioInterface object, but # receive one from the 'asDeviceInterface' call for device in deviceList: if device.isDeviceInterface( Solid.DeviceInterface.AudioInterface): audio = device.asDeviceInterface( Solid.DeviceInterface.AudioInterface) devtype = audio.deviceType() devstr = [] for key in audioInterfaceTypeStr: flag = key & devtype if flag: devstr.append(audioInterfaceTypeStr[key]) QTreeWidgetItem(display, [device.product(), audio.name(), audioDriverStr[audio.driver()], "/".join(devstr), soundcardTypeStr[audio.soundcardType()]]) self.dock2.setWidget(display) except: self.dock2.setWidget(QLabel(""" <center style='color:white;'> <h1>:(<br>ERROR: Please, install PyKDE !</h1><br> <br><i> (Sorry, can not use non-Qt Libs). Thanks </i><center>""")) ## dock 3 QLabel('<h1 style="color:white;"> Previews !</h1>', self.dock3).resize( self.dock3.size().width() / 4, 25) self.fileView = QColumnView() self.fileView.updatePreviewWidget.connect(self.play) self.fileView.setToolTip(' Browse and Preview Files ') self.media = None self.model = QDirModel() self.fileView.setModel(self.model) self.dock3.setWidget(self.fileView) # dock4 QLabel('<h1 style="color:white;"> Setup !</h1>', self.dock4).resize( self.dock4.size().width() / 4, 25) self.group4 = QGroupBox() self.group4.setTitle(__doc__) self.combo0 = QComboBox() self.combo0.addItems(['S16_LE', 'S32_LE', 'S16_BE', 'U16_LE', 'U16_BE', 'S24_LE', 'S24_BE', 'U24_LE', 'U24_BE', 'S32_BE', 'U32_LE', 'U32_BE']) self.combo1 = QComboBox() self.combo1.addItems(['1', '-1', '0', '2', '3', '4', '5', '6', '7', '8', '9', '10']) self.combo2 = QComboBox() self.combo2.addItems(['128', '256', '512', '1024', '64', '32', '16']) self.combo3 = QComboBox(self) self.combo3.addItems(['MONO', 'STEREO', 'Surround']) self.combo4 = QComboBox() self.combo4.addItems(['44100', '96000', '48000', '32000', '22050', '16000', '11025', '8000']) self.combo5 = QComboBox(self) self.combo5.addItems(['20', '19', '18', '17', '16', '15', '14', '13', '12', '10', '9', '8', '7', '6', '5', '4', '3', '2', '1', '0']) self.nepochoose = QCheckBox('Auto-Tag Files using Nepomuk Semantic') self.chckbx0 = QCheckBox('Disable Software based Volume Control') self.chckbx1 = QCheckBox('Output Sound Stereo-to-Mono Downmix') self.chckbx2 = QCheckBox('Add Date and Time MetaData to Sound files') self.chckbx3 = QCheckBox('Add Yourself as the Author Artist of Sound') vboxg4 = QVBoxLayout(self.group4) for each_widget in ( QLabel('<b style="color:white;"> Sound OGG Quality'), self.combo1, QLabel('<b style="color:white;"> Sound Record Format'), self.combo0, QLabel('<b style="color:white;"> Sound KBps '), self.combo2, QLabel('<b style="color:white;"> Sound Channels '), self.combo3, QLabel('<b style="color:white;"> Sound Sample Rate '), self.combo4, QLabel('<b style="color:white;"> Sound Volume'), self.chckbx0, QLabel('<b style="color:white;"> Sound Mix'), self.chckbx1, QLabel('<b style="color:white;"> Sound Meta'), self.chckbx2, QLabel('<b style="color:white;"> Sound Authorship'), self.chckbx3, QLabel('<b style="color:white;"> CPUs Priority'), self.combo5, QLabel('<b style="color:white;">Nepomuk Semantic User Experience'), self.nepochoose): vboxg4.addWidget(each_widget) self.dock4.setWidget(self.group4) # dock 5 QLabel('<h1 style="color:white;"> Voice Changer ! </h1>', self.dock5 ).resize(self.dock5.size().width() / 3, 25) self.group5 = QGroupBox() self.group5.setTitle(__doc__) self.dial = QDial() self.dial.setCursor(QCursor(Qt.OpenHandCursor)) self.di_l = QLabel(self.dial) self.di_l.resize(self.dial.size() / 8) self.dial.sliderPressed.connect(lambda: self.dial.setCursor(QCursor(Qt.ClosedHandCursor))) self.dial.sliderReleased.connect(lambda: self.dial.setCursor(QCursor(Qt.OpenHandCursor))) self.dial.valueChanged.connect(lambda: self.dial.setToolTip(str(self.dial.value()))) self.dial.valueChanged.connect(lambda: self.di_l.setText( '<h1 style="color:white;">{}'.format(self.dial.value()))) self.dial.setValue(0) self.dial.setMinimum(-999) self.dial.setMaximum(999) self.dial.setSingleStep(100) self.dial.setPageStep(100) self.dial.setWrapping(False) self.dial.setNotchesVisible(True) self.defo = QPushButton(QIcon.fromTheme("media-playback-start"), 'Run') self.defo.setMinimumSize(self.defo.size().width(), 50) self.defo.clicked.connect(lambda: self.process3.start( 'play -q -V0 "|rec -q -V0 -n -d -R riaa pitch {} "' .format(self.dial.value()) if int(self.dial.value()) != 0 else 'play -q -V0 "|rec -q -V0 --multi-threaded -n -d -R bend {} "' .format(' 3,2500,3 3,-2500,3 ' * 999))) self.qq = QPushButton(QIcon.fromTheme("media-playback-stop"), 'Stop') self.qq.clicked.connect(self.process3.kill) self.die = QPushButton(QIcon.fromTheme("process-stop"), 'Kill') self.die.clicked.connect(lambda: call('killall rec', shell=True)) vboxg5 = QVBoxLayout(self.group5) for each_widget in (self.dial, self.defo, self.qq, self.die): vboxg5.addWidget(each_widget) self.dock5.setWidget(self.group5) # configure some widget settings must_be_checked((self.nepochoose, self.chckbx1, self.chckbx2, self.chckbx3)) must_have_tooltip((self.label2, self.label4, self.label6, self.combo0, self.nepochoose, self.combo1, self.combo2, self.combo3, self.combo4, self.combo5, self.chckbx0, self.chckbx1, self.chckbx2, self.chckbx3, self.rec, self.stop, self.defo, self.qq, self.die, self.kill, self.button0, self.button1, self.button5)) must_autofillbackground((self.clock, self.label2, self.label4, self.label6, self.nepochoose, self.chckbx0, self.chckbx1, self.chckbx2, self.chckbx3)) must_glow((self.rec, self.dial, self.combo1)) self.nepomuk_get('testigo') if self.auto is True: self.go() def play(self, index): ' play with delay ' if not self.media: self.media = Phonon.MediaObject(self) audioOutput = Phonon.AudioOutput(Phonon.MusicCategory, self) Phonon.createPath(self.media, audioOutput) self.media.setCurrentSource(Phonon.MediaSource( self.model.filePath(index))) self.media.play() def end(self): ' kill it with fire ' print((' INFO: Stoping Processes at {}'.format(str(datetime.now())))) self.process1.terminate() self.process2.terminate() self.feedback.setText(''' <h5>Errors for RECORDER QProcess 1:</h5>{}<hr> <h5>Errors for ENCODER QProcess 2:</h5>{}<hr> <h5>Output for RECORDER QProcess 1:</h5>{}<hr> <h5>Output for ENCODER QProcess 2:</h5>{}<hr> '''.format(self.process1.readAllStandardError(), self.process2.readAllStandardError(), self.process1.readAllStandardOutput(), self.process2.readAllStandardOutput(), )) def killer(self): ' kill -9 ' QMessageBox.information(self.mainwidget, __doc__, ' KILL -9 was sent to the multi-process backend ! ') self.process1.kill() self.process2.kill() def go(self): ' run timeout re-starting timers ' self.timerFirst.start(int(self.slider.value()) * 60 * 1000 + 2000) self.timerSecond.start(int(self.slider.value()) * 60 * 1000 + 2010) self.run() def run(self): ' run forest run ' print((' INFO: Working at {}'.format(str(datetime.now())))) chnl = 1 if self.combo3.currentText() == 'MONO' else 2 print((' INFO: Using {} Channels . . . '.format(chnl))) btrt = int(self.combo4.currentText()) print((' INFO: Using {} Hz per Second . . . '.format(btrt))) threshold = int(self.dial.value()) print((' INFO: Using Thresold of {} . . . '.format(threshold))) print((' INFO: Using Recording time of {}'.format(self.slider.value()))) frmt = str(self.combo0.currentText()).strip() print((' INFO: Using Recording quality of {} ...'.format(frmt))) qlt = str(self.combo1.currentText()).strip() print((' INFO: Using Recording quality of {} ...'.format(qlt))) prio = str(self.combo5.currentText()).strip() print((' INFO: Using CPU Priority of {} ...'.format(prio))) downmix = '--downmix ' if self.chckbx1.isChecked() is True else '' print((' INFO: Using Downmix is {} ...'.format(downmix))) aut = '-a ' + getuser() if self.chckbx3.isChecked() is True else '' print((' INFO: The Author Artist of this sound is: {}'.format(aut))) T = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") tim = '--date {} '.format(T) if self.chckbx2.isChecked() is True else '' print((' INFO: The Date and Time of this sound is: {}'.format(tim))) vol = ' --disable-softvol' if self.chckbx0.isChecked() is True else '' print((' INFO: Software based Volume Control is: {}'.format(vol))) # make base directory try: mkdir(self.base) print((' INFO: Base Directory path created {}'.format(self.base))) except OSError: print((' INFO: Base Directory already exist {}'.format(self.base))) except: print((' ERROR: Can not create Directory ?, {}'.format(self.base))) # make directory tree try: for dr in range(1, 13): mkdir(path.abspath(path.join(self.base, str(dr)))) print((' INFO:Directory created {}/{}'.format(self.base, dr))) except OSError: print((' INFO: Directory already exist {}/1,12'.format(self.base))) except: print((' ERROR: Cant create Directory?, {}/1,12'.format(self.base))) # make new filename flnm = path.abspath(path.join(self.base, str(datetime.now().month), datetime.now().strftime("%Y-%m-%d_%H:%M:%S.ogg"))) self.actual_file = flnm print((' INFO: Recording on the file {}'.format(flnm))) # make custom commands cmd1 = self.cmd1.format(n=prio, f=frmt, c=chnl, b=btrt, v=vol) cmd2 = self.cmd2.format(c=chnl, b=btrt, q=qlt, d=downmix, o=flnm, a=aut, t=tim) print((cmd1, cmd2)) # multiprocess recording loop pipe self.process1 = QProcess(self) self.process2 = QProcess(self) self.process1.setStandardOutputProcess(self.process2) self.process1.start(cmd1) if not self.process1.waitForStarted(): print((" ERROR: RECORDER QProcess 1 Failed: \n {} ".format(cmd1))) self.process2.start(cmd2) if not self.process2.waitForStarted(): print((" ERROR: ENCODER QProcess 2 Failed: \n {} ".format(cmd2))) self.nepomuk_set(flnm, 'testigo', 'testigo', 'AutoTag by Cinta-Testigo') def spectro(self): ' spectrometer ' wid = self.spec.size().width() hei = self.spec.size().height() command = self.cmd3.format(o=self.actual_file, x=wid, y=hei) print(' INFO: Spectrometer is deleting OLD .ogg.png Files on target ') call('rm --verbose --force {}/*/*.ogg.png'.format(self.base), shell=1) print(' INFO: Spectrometer finished Deleting Files, Starting Render ') call(command, shell=True) print((''' INFO: Spectrometer finished Rendering Sound using: {}{} OutPut: {}'''.format(command, linesep, self.actual_file))) self.spec.setIcon(QIcon('{o}.png'.format(o=self.actual_file))) self.spec.setIconSize(QSize(wid, hei)) self.spec.resize(wid, hei) ########################################################################### def paintEvent(self, event): 'Paint semi-transparent background, animated pattern, background text' QWidget.paintEvent(self, event) # make a painter p = QPainter(self) p.setRenderHint(QPainter.TextAntialiasing) p.setRenderHint(QPainter.HighQualityAntialiasing) # fill a rectangle with transparent painting p.fillRect(event.rect(), Qt.transparent) # animated random dots background pattern for i in range(4096): x = randint(9, self.size().width() - 9) y = randint(9, self.size().height() - 9) p.setPen(QPen(QColor(randint(200, 255), randint(200, 255), 255), 1)) p.drawPoint(x, y) # set pen to use white color p.setPen(QPen(QColor(randint(9, 255), randint(9, 255), 255), 1)) # Rotate painter 45 Degree p.rotate(35) # Set painter Font for text p.setFont(QFont('Ubuntu', 300)) # draw the background text, with antialiasing p.drawText(99, 199, "Radio") # Rotate -45 the QPen back ! p.rotate(-35) # set the pen to no pen p.setPen(Qt.NoPen) # Background Color p.setBrush(QColor(0, 0, 0)) # Background Opacity p.setOpacity(0.75) # Background Rounded Borders p.drawRoundedRect(self.rect(), 50, 50) # finalize the painter p.end() def seTitle(self): ' set the title of the main window ' dialog = QDialog(self) textEditInput = QLineEdit(' Type Title Here ') ok = QPushButton(' O K ') ok.clicked.connect(lambda: self.setWindowTitle(textEditInput.text())) ly = QVBoxLayout() [ly.addWidget(wdgt) for wdgt in (QLabel('Title:'), textEditInput, ok)] dialog.setLayout(ly) dialog.exec_() def timedate(self): ' get the time and date ' dialog = QDialog(self) clock = QLCDNumber() clock.setNumDigits(24) timer = QTimer() timer.timeout.connect(lambda: clock.display( datetime.now().strftime("%d-%m-%Y %H:%M:%S %p"))) timer.start(1000) clock.setToolTip(datetime.now().strftime("%c %x")) ok = QPushButton(' O K ') ok.clicked.connect(dialog.close) ly = QVBoxLayout() [ly.addWidget(wdgt) for wdgt in (QCalendarWidget(), clock, ok)] dialog.setLayout(ly) dialog.exec_() def closeEvent(self, event): ' Ask to Quit ' if QMessageBox.question(self, ' Close ', ' Quit ? ', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.Yes: event.accept() else: event.ignore() def center(self): ' Center and resize the window ' self.showNormal() self.resize(QDesktopWidget().screenGeometry().width() // 1.25, QDesktopWidget().screenGeometry().height() // 1.25) qr = self.frameGeometry() qr.moveCenter(QDesktopWidget().availableGeometry().center()) self.move(qr.topLeft()) def nepomuk_set(self, file_tag=None, __tag='', _label='', _description=''): ' Quick and Easy Nepomuk Taggify for Files ' print((''' INFO: Semantic Desktop Experience is Tagging Files : {}, {}, {}, {})'''.format(file_tag, __tag, _label, _description))) if Nepomuk.ResourceManager.instance().init() is 0: fle = Nepomuk.Resource(KUrl(QFileInfo(file_tag).absoluteFilePath())) _tag = Nepomuk.Tag(__tag) _tag.setLabel(_label) fle.addTag(_tag) fle.setDescription(_description) print(([str(a.label()) for a in fle.tags()], fle.description())) return ([str(a.label()) for a in fle.tags()], fle.description()) else: print(" ERROR: FAIL: Nepomuk is not running ! ") def nepomuk_get(self, query_to_search): ' Quick and Easy Nepomuk Query for Files ' print((''' INFO: Semantic Desktop Experience is Quering Files : {} '''.format(query_to_search))) results = [] nepo = Nepomuk.Query.QueryServiceClient() nepo.desktopQuery("hasTag:{}".format(query_to_search)) def _query(data): ''' ('filename.ext', 'file description', ['list', 'of', 'tags']) ''' results.append(([str(a.resource().genericLabel()) for a in data][0], [str(a.resource().description()) for a in data][0], [str(a.label()) for a in iter([a.resource().tags() for a in data][0] )])) nepo.newEntries.connect(_query) def _end(): ''' [ ('filename.ext', 'file description', ['list', 'of', 'tags']), ('filename.ext', 'file description', ['list', 'of', 'tags']), ('filename.ext', 'file description', ['list', 'of', 'tags']) ] ''' nepo.newEntries.disconnect print(results) return results nepo.finishedListing.connect(_end)
def __init__(self, parent): super(ProjectExecution, self).__init__() self._parent = parent grid = QGridLayout(self) grid.addWidget(QLabel(self.tr("Main File:")), 0, 0) self.path = QLineEdit() ui_tools.LineEditButton( self.path, self.path.clear, self.style().standardPixmap(self.style().SP_TrashIcon)) self.path.setText(self._parent._item.mainFile) self.path.setReadOnly(True) self.btnBrowse = QPushButton( QIcon(self.style().standardPixmap(self.style().SP_FileIcon)), '') grid.addWidget(self.path, 0, 1) grid.addWidget(self.btnBrowse, 0, 2) # this should be changed, and ALL pythonPath names to # python_custom_interpreter or something like that. this is NOT the # PYTHONPATH self.txtPythonPath = QLineEdit() self.txtPythonPath.setText(self._parent._item.pythonPath) self.btnPythonPath = QPushButton(QIcon(":img/open"), '') grid.addWidget(QLabel(self.tr("Python Custom Interpreter:")), 1, 0) grid.addWidget(self.txtPythonPath, 1, 1) grid.addWidget(self.btnPythonPath, 1, 2) # THIS IS THE MODAFUCKA REAL PYTHONPATH BRO, YEAH !!! grid.addWidget(QLabel(self.tr("Custom PYTHONPATH:")), 2, 0) self.PYTHONPATH = QPlainTextEdit() # TODO : better widget self.PYTHONPATH.setPlainText(self._parent._item.PYTHONPATH) self.PYTHONPATH.setToolTip(self.tr("One path per line")) grid.addWidget(self.PYTHONPATH, 2, 1) # Additional builtins/globals for pyflakes grid.addWidget(QLabel(self.tr("Additional builtins/globals:")), 3, 0) self.additional_builtins = QLineEdit() self.additional_builtins.setText(' '.join( self._parent._item.additional_builtins)) self.additional_builtins.setToolTip( self.tr( "Space-separated list of symbols that will be considered as " "builtin in every file")) grid.addWidget(self.additional_builtins, 3, 1) self.txtPreExec = QLineEdit() ui_tools.LineEditButton( self.txtPreExec, self.txtPreExec.clear, self.style().standardPixmap(self.style().SP_TrashIcon)) self.txtPreExec.setReadOnly(True) self.txtPreExec.setText(self._parent._item.preExecScript) self.btnPreExec = QPushButton(QIcon(":img/open"), '') grid.addWidget(QLabel(self.tr("Pre-exec Script:")), 4, 0) grid.addWidget(self.txtPreExec, 4, 1) grid.addWidget(self.btnPreExec, 4, 2) self.txtPostExec = QLineEdit() ui_tools.LineEditButton( self.txtPostExec, self.txtPostExec.clear, self.style().standardPixmap(self.style().SP_TrashIcon)) self.txtPostExec.setReadOnly(True) self.txtPostExec.setText(self._parent._item.postExecScript) self.btnPostExec = QPushButton(QIcon(":img/open"), '') grid.addWidget(QLabel(self.tr("Post-exec Script:")), 5, 0) grid.addWidget(self.txtPostExec, 5, 1) grid.addWidget(self.btnPostExec, 5, 2) grid.addItem( QSpacerItem(5, 10, QSizePolicy.Expanding, QSizePolicy.Expanding), 6, 0) # Properties grid.addWidget(QLabel(self.tr("Properties:")), 7, 0) self.txtParams = QLineEdit() self.txtParams.setToolTip( self.tr("Separate the params with commas (ie: help, verbose)")) self.txtParams.setText(self._parent._item.programParams) grid.addWidget(QLabel(self.tr("Params (comma separated):")), 8, 0) grid.addWidget(self.txtParams, 8, 1) #Widgets for virtualenv properties self.txtVenvPath = QLineEdit() ui_tools.LineEditButton( self.txtVenvPath, self.txtVenvPath.clear, self.style().standardPixmap(self.style().SP_TrashIcon)) self.txtVenvPath.setText(self._parent._item.venv) self._dir_completer = QCompleter() self._dir_completer.setModel(QDirModel(self._dir_completer)) self.txtVenvPath.setCompleter(self._dir_completer) self.btnVenvPath = QPushButton(QIcon(":img/open"), '') grid.addWidget(QLabel(self.tr("Virtualenv Folder:")), 9, 0) grid.addWidget(self.txtVenvPath, 9, 1) grid.addWidget(self.btnVenvPath, 9, 2) self.connect(self.btnBrowse, SIGNAL("clicked()"), self.select_file) self.connect(self.btnPythonPath, SIGNAL("clicked()"), self._load_python_path) self.connect(self.btnVenvPath, SIGNAL("clicked()"), self._load_python_venv) self.connect(self.btnPreExec, SIGNAL("clicked()"), self.select_pre_exec_script) self.connect(self.btnPostExec, SIGNAL("clicked()"), self.select_post_exec_script)
class ComboBox(QComboBox): """File browser combo box. Widget and functionality """ def __init__(self, fileBrowser): QComboBox.__init__(self, fileBrowser) self._fileBrowser = fileBrowser self.setAttribute(Qt.WA_MacShowFocusRect, False) self.setAttribute(Qt.WA_MacSmallSize) self.setEditable(True) self.setMinimumContentsLength(1) self.setSizeAdjustPolicy( QComboBox.AdjustToMinimumContentsLengthWithIcon) self.lineEdit().setReadOnly(False) self._completionModel = QDirModel(self.lineEdit()) self._completionModel.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) self.lineEdit().setCompleter( QCompleter(self._completionModel, self.lineEdit())) #TODO QDirModel is deprecated but QCompleter does not yet handle #QFileSystemModel - please update when possible. self._count = 0 # Show popup action self._showPopupAction = QAction(QIcon(':enkiicons/filtered.png'), "File browser history", self) self._showPopupAction.setShortcut('Ctrl+H') core.actionManager().addAction("mNavigation/mFileBrowser/aMenuShow", self._showPopupAction) self._showPopupAction.triggered.connect(self._onShowPopup) # reconnected in self.updateComboItems() self.currentIndexChanged[int].connect(self._onItemSelected) def del_(self): """Explicitly called destructor """ core.actionManager().removeAction(self._showPopupAction) def _onShowPopup(self, triggered): """Handler for self._showPopupAction """ self.showPopup() @pyqtSlot(int) def _onItemSelected(self, index): """Handler of item selection in the combo box """ if self.count() > self._count: # It is user input path = self.itemText(index) if os.path.isdir(path): self._fileBrowser.setCurrentPath(path) else: path = self.itemData(index).toString() self._fileBrowser.setCurrentPath(path) def updateItems(self, items): """Update items in the combo box according to current history """ self.currentIndexChanged[int].disconnect() self.clear() # Current text self.addItem(self._fileBrowser.currentPath()) self.setItemData(0, self._fileBrowser.currentPath()) self.insertSeparator(self.count()) for index, path in enumerate(items): self.addItem(path) self.setItemData(index + 2, path) self._count = self.count() self.currentIndexChanged[int].connect(self._onItemSelected)
def __init__(self, plugin): QFrame.__init__(self, core.workspace()) self._mode = None self.plugin = plugin from PyQt4 import uic # lazy import for better startup performance uic.loadUi(os.path.join(os.path.dirname(__file__), 'SearchWidget.ui'), self) self.cbSearch.setCompleter(None) self.cbReplace.setCompleter(None) self.cbMask.setCompleter(None) self.fsModel = QDirModel(self.cbPath.lineEdit()) self.fsModel.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) self.cbPath.lineEdit().setCompleter( QCompleter(self.fsModel, self.cbPath.lineEdit())) # TODO QDirModel is deprecated but QCompleter does not yet handle # QFileSystemodel - please update when possible.""" self.cbSearch.setCompleter(None) self.pbSearchStop.setVisible(False) self.pbReplaceCheckedStop.setVisible(False) self._progress = QProgressBar(self) self._progress.setAlignment(Qt.AlignCenter) self._progress.setToolTip(self.tr("Search in progress...")) self._progress.setMaximumSize(QSize(80, 16)) core.mainWindow().statusBar().insertPermanentWidget(1, self._progress) self._progress.setVisible(False) # cd up action self.tbCdUp = QToolButton(self.cbPath.lineEdit()) self.tbCdUp.setIcon(QIcon(":/enkiicons/go-up.png")) self.tbCdUp.setCursor(Qt.ArrowCursor) self.tbCdUp.installEventFilter(self) # for drawing button self.cbSearch.installEventFilter( self) # for catching Tab and Shift+Tab self.cbReplace.installEventFilter( self) # for catching Tab and Shift+Tab self.cbPath.installEventFilter(self) # for catching Tab and Shift+Tab self.cbMask.installEventFilter(self) # for catching Tab and Shift+Tab self._closeShortcut = QShortcut(QKeySequence("Esc"), self) self._closeShortcut.setContext(Qt.WidgetWithChildrenShortcut) self._closeShortcut.activated.connect(self.hide) # connections self.cbSearch.lineEdit().textChanged.connect( self._onSearchRegExpChanged) self.cbSearch.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbReplace.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbPath.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbMask.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbRegularExpression.stateChanged.connect( self._onSearchRegExpChanged) self.cbCaseSensitive.stateChanged.connect(self._onSearchRegExpChanged) self.cbWholeWord.stateChanged.connect(self._onSearchRegExpChanged) self.tbCdUp.clicked.connect(self._onCdUpPressed) self.pbNext.pressed.connect(self.searchNext) self.pbPrevious.pressed.connect(self.searchPrevious) self.pbSearchStop.pressed.connect(self.searchInDirectoryStopPressed) self.pbReplaceCheckedStop.pressed.connect( self.replaceCheckedStopPressed) core.mainWindow().hideAllWindows.connect(self.hide) core.workspace().escPressed.connect(self.hide) core.workspace().currentDocumentChanged.connect( \ lambda old, new: self.setVisible(self.isVisible() and new is not None))
def __init__(self): QWizardPage.__init__(self) self.setTitle(self.tr("New Project Data")) self.setSubTitle(self.tr( "Complete the following fields to create the Project Structure")) gbox = QGridLayout(self) #Names of the fields to complete self.lblName = QLabel(self.tr("New Project Name (*):")) self.lblPlace = QLabel(self.tr("Project Location (*):")) self.lblDescription = QLabel(self.tr("Project Description:")) self.lblLicense = QLabel(self.tr("Project License:")) self.lblVenvFolder = QLabel(self.tr("Virtualenv Folder:")) gbox.addWidget(self.lblName, 0, 0, Qt.AlignRight) gbox.addWidget(self.lblPlace, 1, 0, Qt.AlignRight) gbox.addWidget(self.lblDescription, 2, 0, Qt.AlignTop) gbox.addWidget(self.lblLicense, 3, 0, Qt.AlignRight) gbox.addWidget(self.lblVenvFolder, 4, 0, Qt.AlignRight) #Fields on de right of the grid #Name self.txtName = QLineEdit() #Location hPlace = QHBoxLayout() self.txtPlace = QLineEdit() self.txtPlace.setReadOnly(True) self.btnExamine = QPushButton(self.tr("Browse...")) hPlace.addWidget(self.txtPlace) hPlace.addWidget(self.btnExamine) #Virtualenv vPlace = QHBoxLayout() self.vtxtPlace = QLineEdit() self._dir_completer = QCompleter() self._dir_completer.setModel(QDirModel(self._dir_completer)) self.vtxtPlace.setCompleter(self._dir_completer) self.vbtnExamine = QPushButton(self.tr("Browse...")) vPlace.addWidget(self.vtxtPlace) vPlace.addWidget(self.vbtnExamine) #Project Description self.txtDescription = QPlainTextEdit() #Project License self.cboLicense = QComboBox() self.cboLicense.setFixedWidth(250) self.cboLicense.addItem('Apache License 2.0') self.cboLicense.addItem('Artistic License/GPL') self.cboLicense.addItem('Eclipse Public License 1.0') self.cboLicense.addItem('GNU General Public License v2') self.cboLicense.addItem('GNU General Public License v3') self.cboLicense.addItem('GNU Lesser General Public License') self.cboLicense.addItem('MIT License') self.cboLicense.addItem('Mozilla Public License 1.1') self.cboLicense.addItem('Mozilla Public License 2.0') self.cboLicense.addItem('New BSD License') self.cboLicense.addItem('Other Open Source') self.cboLicense.addItem('Other') self.cboLicense.setCurrentIndex(4) #Add to Grid gbox.addWidget(self.txtName, 0, 1) gbox.addLayout(hPlace, 1, 1) gbox.addWidget(self.txtDescription, 2, 1) gbox.addWidget(self.cboLicense, 3, 1) gbox.addLayout(vPlace, 4, 1) #Signal self.connect(self.btnExamine, SIGNAL('clicked()'), self.load_folder) self.connect(self.vbtnExamine, SIGNAL('clicked()'), self.load_folder_venv) self.connect(self.txtName, SIGNAL('textChanged(const QString&)'), lambda: self.emit(SIGNAL("completeChanged()")))
class SearchWidget(QFrame): """Widget, appeared, when Ctrl+F pressed. Has different forms for different search modes """ Normal = 'normal' Good = 'good' Bad = 'bad' Incorrect = 'incorrect' visibilityChanged = pyqtSignal(bool) """ visibilityChanged(visible) **Signal** emitted, when widget has been shown or hidden """ # pylint: disable=W0105 searchInDirectoryStartPressed = pyqtSignal(type(re.compile('')), list, unicode) """ searchInDirectoryStartPressed(regEx, mask, path) **Signal** emitted, when 'search in directory' button had been pressed """ # pylint: disable=W0105 searchInDirectoryStopPressed = pyqtSignal() """ searchInDirectoryStopPressed() **Signal** emitted, when 'stop search in directory' button had been pressed """ # pylint: disable=W0105 replaceCheckedStartPressed = pyqtSignal(unicode) """ replaceCheckedStartPressed(replText) **Signal** emitted, when 'replace checked' button had been pressed """ # pylint: disable=W0105 replaceCheckedStopPressed = pyqtSignal() """ replaceCheckedStartPressed() **Signal** emitted, when 'stop replacing checked' button had been pressed """ # pylint: disable=W0105 searchRegExpChanged = pyqtSignal(type(re.compile(''))) """ searchRegExpValidStateChanged(regEx) **Signal** emitted, when search regexp has been changed. If reg exp is invalid - regEx object contains empty pattern """ # pylint: disable=W0105 searchNext = pyqtSignal() """ searchNext() **Signal** emitted, when 'Search Next' had been pressed """ # pylint: disable=W0105 searchPrevious = pyqtSignal() """ searchPrevious() **Signal** emitted, when 'Search Previous' had been pressed """ # pylint: disable=W0105 replaceFileOne = pyqtSignal(unicode) """ replaceFileOne(replText) **Signal** emitted, when 'Replace' had been pressed """ # pylint: disable=W0105 replaceFileAll = pyqtSignal(unicode) """ replaceFileAll(replText) **Signal** emitted, when 'Replace All' had been pressed """ # pylint: disable=W0105 def __init__(self, plugin): QFrame.__init__(self, core.workspace()) self._mode = None self.plugin = plugin from PyQt4 import uic # lazy import for better startup performance uic.loadUi(os.path.join(os.path.dirname(__file__), 'SearchWidget.ui'), self) self.cbSearch.setCompleter(None) self.cbReplace.setCompleter(None) self.cbMask.setCompleter(None) self.fsModel = QDirModel(self.cbPath.lineEdit()) self.fsModel.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) self.cbPath.lineEdit().setCompleter( QCompleter(self.fsModel, self.cbPath.lineEdit())) # TODO QDirModel is deprecated but QCompleter does not yet handle # QFileSystemodel - please update when possible.""" self.cbSearch.setCompleter(None) self.pbSearchStop.setVisible(False) self.pbReplaceCheckedStop.setVisible(False) self._progress = QProgressBar(self) self._progress.setAlignment(Qt.AlignCenter) self._progress.setToolTip(self.tr("Search in progress...")) self._progress.setMaximumSize(QSize(80, 16)) core.mainWindow().statusBar().insertPermanentWidget(1, self._progress) self._progress.setVisible(False) # cd up action self.tbCdUp = QToolButton(self.cbPath.lineEdit()) self.tbCdUp.setIcon(QIcon(":/enkiicons/go-up.png")) self.tbCdUp.setCursor(Qt.ArrowCursor) self.tbCdUp.installEventFilter(self) # for drawing button self.cbSearch.installEventFilter( self) # for catching Tab and Shift+Tab self.cbReplace.installEventFilter( self) # for catching Tab and Shift+Tab self.cbPath.installEventFilter(self) # for catching Tab and Shift+Tab self.cbMask.installEventFilter(self) # for catching Tab and Shift+Tab self._closeShortcut = QShortcut(QKeySequence("Esc"), self) self._closeShortcut.setContext(Qt.WidgetWithChildrenShortcut) self._closeShortcut.activated.connect(self.hide) # connections self.cbSearch.lineEdit().textChanged.connect( self._onSearchRegExpChanged) self.cbSearch.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbReplace.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbPath.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbMask.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbRegularExpression.stateChanged.connect( self._onSearchRegExpChanged) self.cbCaseSensitive.stateChanged.connect(self._onSearchRegExpChanged) self.cbWholeWord.stateChanged.connect(self._onSearchRegExpChanged) self.tbCdUp.clicked.connect(self._onCdUpPressed) self.pbNext.pressed.connect(self.searchNext) self.pbPrevious.pressed.connect(self.searchPrevious) self.pbSearchStop.pressed.connect(self.searchInDirectoryStopPressed) self.pbReplaceCheckedStop.pressed.connect( self.replaceCheckedStopPressed) core.mainWindow().hideAllWindows.connect(self.hide) core.workspace().escPressed.connect(self.hide) core.workspace().currentDocumentChanged.connect( \ lambda old, new: self.setVisible(self.isVisible() and new is not None)) def show(self): """Reimplemented function. Sends signal """ super(SearchWidget, self).show() self.visibilityChanged.emit(self.isVisible()) def hide(self): """Reimplemented function. Sends signal, returns focus to workspace """ super(SearchWidget, self).hide() core.workspace().focusCurrentDocument() self.visibilityChanged.emit(self.isVisible()) def setVisible(self, visible): """Reimplemented function. Sends signal """ super(SearchWidget, self).setVisible(visible) self.visibilityChanged.emit(self.isVisible()) def _regExEscape(self, text): """Improved version of re.escape() Doesn't escape space, comma, underscore. Escapes \n and \t """ text = re.escape(text) # re.escape escapes space, comma, underscore, but, it is not necessary and makes text not readable for symbol in (' ,_=\'"/:@#%&'): text = text.replace('\\' + symbol, symbol) text = text.replace('\\\n', '\\n') text = text.replace('\\\t', '\\t') return text def _makeEscapeSeqsVisible(self, text): """Replace invisible \n and \t with escape sequences """ text = text.replace('\\', '\\\\') text = text.replace('\t', '\\t') text = text.replace('\n', '\\n') return text def setMode(self, mode): """Change search mode. i.e. from "Search file" to "Replace directory" """ if self._mode == mode and self.isVisible(): if core.workspace().currentDocument() is not None and \ not core.workspace().currentDocument().hasFocus(): self.cbSearch.lineEdit().selectAll() self.cbSearch.setFocus() self._mode = mode # Set Search and Replace text document = core.workspace().currentDocument() if document is not None and \ document.hasFocus() and \ document.qutepart.selectedText: searchText = document.qutepart.selectedText self.cbReplace.setEditText(self._makeEscapeSeqsVisible(searchText)) if self.cbRegularExpression.checkState() == Qt.Checked: searchText = self._regExEscape(searchText) self.cbSearch.setEditText(searchText) if not self.cbReplace.lineEdit().text() and \ self.cbSearch.lineEdit().text() and \ not self.cbRegularExpression.checkState() == Qt.Checked: replaceText = self.cbSearch.lineEdit().text().replace('\\', '\\\\') self.cbReplace.setEditText(replaceText) # Move focus to Search edit self.cbSearch.setFocus() self.cbSearch.lineEdit().selectAll() # Set search path if mode & MODE_FLAG_DIRECTORY and \ not (self.isVisible() and self.cbPath.isVisible()): try: searchPath = os.path.abspath(unicode(os.path.curdir)) self.cbPath.setEditText(searchPath) except OSError: # current directory might have been deleted pass # Set widgets visibility flag according to state widgets = (self.wSearch, self.pbPrevious, self.pbNext, self.pbSearch, self.wReplace, self.wPath, \ self.pbReplace, self.pbReplaceAll, self.pbReplaceChecked, self.wOptions, self.wMask) # wSear pbPrev pbNext pbSear wRepl wPath pbRep pbRAll pbRCHK wOpti wMask visible = \ {MODE_SEARCH : (1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,), MODE_REPLACE: (1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0,), MODE_SEARCH_DIRECTORY: (1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1,), MODE_REPLACE_DIRECTORY: (1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1,), MODE_SEARCH_OPENED_FILES: (1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1,), MODE_REPLACE_OPENED_FILES: (1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1,)} for i, widget in enumerate(widgets): widget.setVisible(visible[mode][i]) # Search next button text if mode == MODE_REPLACE: self.pbNext.setText('Next') else: self.pbNext.setText(u'Next↵') # Finaly show all with valid size self.show() # show before updating widgets and labels self._updateLabels() self._updateWidgets() def eventFilter(self, object_, event): """ Event filter for mode switch tool button Draws icons in the search and path lineEdits """ if event.type( ) == QEvent.Paint and object_ is self.tbCdUp: # draw CdUp button in search path QLineEdit toolButton = object_ lineEdit = self.cbPath.lineEdit() lineEdit.setContentsMargins(lineEdit.height(), 0, 0, 0) height = lineEdit.height() availableRect = QRect(0, 0, height, height) if toolButton.rect() != availableRect: toolButton.setGeometry(availableRect) painter = QPainter(toolButton) toolButton.icon().paint(painter, availableRect) return True elif event.type( ) == QEvent.KeyPress: # Tab and Shift+Tab in QLineEdits if event.key() == Qt.Key_Tab: self._moveFocus(1) return True elif event.key() == Qt.Key_Backtab: self._moveFocus(-1) return True return QFrame.eventFilter(self, object_, event) def _onReturnPressed(self): """Return or Enter pressed on widget. Search next or Replace next """ if self.pbReplace.isVisible(): self.pbReplace.click() elif self.pbNext.isVisible(): self.pbNext.click() elif self.pbSearch.isVisible(): self.pbSearch.click() elif self.pbSearchStop.isVisible(): self.pbSearchStop.click() def _moveFocus(self, step): """Move focus forward or backward according to step. Standard Qt Keyboard focus algorithm doesn't allow circular navigation """ allFocusableWidgets = (self.cbSearch, self.cbReplace, self.cbPath, self.cbMask) visibleWidgets = [widget for widget in allFocusableWidgets \ if widget.isVisible()] try: focusedIndex = visibleWidgets.index(QApplication.focusWidget()) except ValueError: print >> sys.stderr, 'Invalid focused widget in Search Widget' return nextFocusedIndex = (focusedIndex + step) % len(visibleWidgets) visibleWidgets[nextFocusedIndex].setFocus() visibleWidgets[nextFocusedIndex].lineEdit().selectAll() def _updateLabels(self): """Update 'Search' 'Replace' 'Path' labels geometry """ width = 0 if self.lSearch.isVisible(): width = max(width, self.lSearch.minimumSizeHint().width()) if self.lReplace.isVisible(): width = max(width, self.lReplace.minimumSizeHint().width()) if self.lPath.isVisible(): width = max(width, self.lPath.minimumSizeHint().width()) self.lSearch.setMinimumWidth(width) self.lReplace.setMinimumWidth(width) self.lPath.setMinimumWidth(width) def _updateWidgets(self): """Update geometry of widgets with buttons """ width = 0 if self.wSearchRight.isVisible(): width = max(width, self.wSearchRight.minimumSizeHint().width()) if self.wReplaceRight.isVisible(): width = max(width, self.wReplaceRight.minimumSizeHint().width()) if self.wPathRight.isVisible(): width = max(width, self.wPathRight.minimumSizeHint().width()) self.wSearchRight.setMinimumWidth(width) self.wReplaceRight.setMinimumWidth(width) self.wPathRight.setMinimumWidth(width) def updateComboBoxes(self): """Update comboboxes with last used texts """ searchText = self.cbSearch.currentText() replaceText = self.cbReplace.currentText() maskText = self.cbMask.currentText() # search if searchText: index = self.cbSearch.findText(searchText) if index == -1: self.cbSearch.addItem(searchText) # replace if replaceText: index = self.cbReplace.findText(replaceText) if index == -1: self.cbReplace.addItem(replaceText) # mask if maskText: index = self.cbMask.findText(maskText) if index == -1: self.cbMask.addItem(maskText) def _searchPatternTextAndFlags(self): """Get search pattern and flags """ pattern = self.cbSearch.currentText() pattern = pattern.replace( u'\u2029', '\n') # replace unicode paragraph separator with habitual \n if not self.cbRegularExpression.checkState() == Qt.Checked: pattern = re.escape(pattern) if self.cbWholeWord.checkState() == Qt.Checked: pattern = r'\b' + pattern + r'\b' flags = 0 if not self.cbCaseSensitive.checkState() == Qt.Checked: flags = re.IGNORECASE return pattern, flags def getRegExp(self): """Read search parameters from controls and present it as a regular expression """ pattern, flags = self._searchPatternTextAndFlags() return re.compile(pattern, flags) def isSearchRegExpValid(self): """Try to compile search pattern to check if it is valid Returns bool result and text error """ pattern, flags = self._searchPatternTextAndFlags() try: re.compile(pattern, flags) except re.error, ex: return False, unicode(ex) return True, None
def initialize(self, *args, **kwargs): " Init Main Class " super(Main, self).initialize(*args, **kwargs) self.process = QProcess() self.process.readyReadStandardOutput.connect(self.readOutput) self.process.readyReadStandardError.connect(self.readErrors) self.process.finished.connect(self._process_finished) self.process.error.connect(self._process_finished) # directory auto completer self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.group0 = QGroupBox() self.group0.setTitle(' Source ') self.source, self.infile = QComboBox(), QLineEdit(path.expanduser("~")) self.source.addItems(['Local File', 'Remote URL']) self.source.currentIndexChanged.connect(self.on_source_changed) self.infile.setPlaceholderText(' /full/path/to/file.html ') self.infile.setCompleter(self.completer) self.open = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.open.setCursor(QCursor(Qt.PointingHandCursor)) self.open.clicked.connect(lambda: self.infile.setText( str( QFileDialog.getOpenFileName( self.dock, "Open a File to read from", path.expanduser( "~"), ';;'.join([ '{}(*.{})'.format(e.upper(), e) for e in ['html', 'webp', 'webm', 'svg', 'css', 'js', '*'] ]))))) self.inurl, self.output = QLineEdit('http://www.'), QTextEdit() self.inurl.setPlaceholderText( 'http://www.full/url/to/remote/file.html') self.inurl.hide() vboxg0 = QVBoxLayout(self.group0) for each_widget in (self.source, self.infile, self.open, self.inurl): vboxg0.addWidget(each_widget) self.group1 = QGroupBox() self.group1.setTitle(' Mobile ') self.ckcss1 = QCheckBox('Run in full screen using current resolution') self.ckcss2 = QCheckBox('Disable touch mode and use keypad mode') self.ckcss3 = QCheckBox( 'Disable touch mode but allow to use the mouse') self.ckcss4 = QCheckBox( 'Enable mouse,disable pointer & zoom emulation') self.ckcss5 = QCheckBox('Start the Mobile version of the browser') self.ckcss6 = QCheckBox('Start the Tablet version of the browser') self.ckcss7 = QCheckBox('Emulate hardware with Menu and Back keys') self.ckcss8 = QCheckBox('Start the browser in Kiosk mode') self.width, self.height = QSpinBox(), QSpinBox() self.zoom, self.ram, self.dpi = QSpinBox(), QSpinBox(), QSpinBox() self.cpulag, self.gpulag = QSpinBox(), QSpinBox() self.lang, self.agent = QComboBox(), QComboBox() self.lang.addItems(['EN', 'ES', 'PT', 'JA', 'ZH', 'DE', 'RU', 'FR']) self.agent.addItems(['Default', 'Android', 'MeeGo', 'Desktop']) self.fonts = QLineEdit() self.width.setMaximum(9999) self.width.setMinimum(100) self.width.setValue(480) self.height.setMaximum(9999) self.height.setMinimum(100) self.height.setValue(800) self.zoom.setMaximum(999) self.zoom.setMinimum(1) self.zoom.setValue(100) self.ram.setMaximum(999) self.ram.setMinimum(1) self.ram.setValue(100) self.dpi.setMaximum(200) self.dpi.setMinimum(50) self.dpi.setValue(96) self.cpulag.setMaximum(9999) self.cpulag.setMinimum(0) self.cpulag.setValue(1) self.gpulag.setMaximum(9999) self.gpulag.setMinimum(0) self.gpulag.setValue(1) vboxg1 = QVBoxLayout(self.group1) for each_widget in ( self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, QLabel('Width Pixels of the emulated device screen'), self.width, QLabel('Height Pixels of the emulated device screen'), self.height, QLabel('Zoom Percentage of emulated screen'), self.zoom, QLabel('RAM MegaBytes of the emulated device'), self.ram, QLabel('Language of the emulated device'), self.lang, QLabel('D.P.I. of the emulated device'), self.dpi, QLabel('User-Agent of the emulated device'), self.agent, QLabel('CPU Core Lag Miliseconds of emulated device'), self.cpulag, QLabel('GPU Video Lag Miliseconds of emulated device'), self.gpulag, QLabel('Extra Fonts Directory Full Path'), self.fonts): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle(' General ') self.nice, self.opera = QSpinBox(), QLineEdit(path.expanduser("~")) self.nice.setValue(20) self.nice.setMaximum(20) self.nice.setMinimum(0) self.opera.setCompleter(self.completer) if path.exists(CONFIG_FILE): with codecs.open(CONFIG_FILE, encoding='utf-8') as fp: self.opera.setText(fp.read()) self.open2 = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.open2.setCursor(QCursor(Qt.PointingHandCursor)) self.open2.clicked.connect(lambda: self.opera.setText( str( QFileDialog.getOpenFileName( self.dock, "Open Opera Mobile Emulator", path.expanduser("~"), 'Opera Mobile Emulator Executable(opera-mobile-emulator)')) )) self.help1 = QLabel('''<a href= "http://www.opera.com/developer/mobile-emulator"> <small><center>Download Opera Mobile Emulator !</a>''') self.help1.setTextInteractionFlags(Qt.LinksAccessibleByMouse) self.help1.setOpenExternalLinks(True) vboxg4 = QVBoxLayout(self.group2) for each_widget in (QLabel(' Backend CPU priority: '), self.nice, QLabel(' Opera Mobile Emulator Full Path: '), self.opera, self.open2, self.help1): vboxg4.addWidget(each_widget) self.button = QPushButton('Preview on Mobile') self.button.setCursor(QCursor(Qt.PointingHandCursor)) self.button.setMinimumSize(100, 50) self.button.clicked.connect(self.run) glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) self.button.setGraphicsEffect(glow) glow.setEnabled(True) class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget(( QLabel('<b>Mobile Browser Emulator'), self.group0, self.group1, self.group2, self.output, self.button, )) self.scrollable, self.dock = QScrollArea(), QDockWidget() self.scrollable.setWidgetResizable(True) self.scrollable.setWidget(tw) self.dock.setWindowTitle(__doc__) self.dock.setStyleSheet('QDockWidget::title{text-align: center;}') self.dock.setWidget(self.scrollable) ExplorerContainer().addTab(self.dock, "Mobile") QPushButton( QIcon.fromTheme("help-about"), 'About', self.dock).clicked.connect( lambda: QMessageBox.information(self.dock, __doc__, HELPMSG))
def flags(self, index): return QDirModel.flags(self, index) | Qt.ItemIsUserCheckable
class EkdSaveDialog(QDialog): ''' EkdSaveDialog : Classe représentant la boite de dialogue utiliser lors de l'enregistrement des modification sur un fichier donné attributs : suffix - Suffix utilisé en filtre filter - Filtre (déduit à partir du suffix) chemin - Chemin du dernier fichier enregistré multiple - va-t-on enregistrer plus d'un fichier ? (ex: extraction d'image d'une vidéo) méthodes : getFile - Invoque la boite de dialogue et retourne le fichier saisi ''' ### Pourquoi avoir réimplémenté cette classe au lieu de passer par ### QFileDialog ? ## Correction du bug de consommation mémoire ## ## Explication du problème : ## Par défaut un QFileDialog utilise un QFileSystemModel qui lui ## crée un QWatchFileSystem ## Hors QWatchFileSystem scan régulièrement les changement ## dans le répertoire courant ## Ce phénomène provoque une réaction en chaine : ## 1 - je choisi mon répertoire de destination d'enregistrement ## de mes images ## 2 - ffmpeg se lance ## 3 - ffmpeg crée un fichier dans l'arborescence ## 4 - QWatchFileSystem (est toujours dans le répertoire courant) ## détecte un changement ## et recharge l'ensemble du contenue du répertoire ## 5 - goto 3 jusqu'à plus de mémoire ou fin du process ffmpeg ## ## def __init__(self, parent, path = None, suffix = '', title = u"Sauver", multiple = False, mode = None): if type(suffix) == tuple or type(suffix) == list : sfilter="" for s in suffix : sfilter += "*"+s+" " self.filter=sfilter[:-1] # Si on a plusieur suffix, on prend le premier par défaut pour # la sauvegarde self.suffix = suffix[0] else : self.suffix = suffix self.filter = "*" + self.suffix QDialog.__init__(self, parent) self.setWindowTitle(title) self.multiple = multiple self.mode = mode if not path: if self.mode == "image" : path = EkdConfig.get("general", "image_output_path") elif self.mode == "video" : path = EkdConfig.get("general", "video_output_path") elif self.mode == "audio" : path = EkdConfig.get("general", "sound_output_path") else : path = unicode(QDir.homePath()) # Nom du répertoire courant self.location = QLabel("<b>%s</b>" % path) # Variable permettant de savoir à tout moment le répertoire courant. self.currentDir = path self.mkdirButton = QPushButton(u" Créer un répertoire") self.mkdirButton.setIcon(QIcon("Icones" + os.sep + "add_sub_task.png")) if int(EkdConfig.get("general", "show_hidden_files")) : #print "hidden shown" EkdPrint(u"hidden shown") shf = QDir.Hidden else : shf = QDir.Readable # Liste des fichiers self.dirList = QListView() sorting = QDir.DirsFirst if int(EkdConfig.get("general", "ignore_case")): sorting |= QDir.IgnoreCase self.sorting = sorting self.flags = QDir.Files | QDir.Readable | shf self.dirModel = QStandardItemModel() self.dirList.setModel(self.dirModel) self.updateDir(path) self.dirList.setWrapping(True) #panneau latéral self.dirTree = QTreeView() self.dirModelLight = QDirModel(QStringList(""), QDir.AllDirs | QDir.NoDotAndDotDot | shf, QDir.DirsFirst | QDir.Name | QDir.IgnoreCase) self.dirTree.setModel(self.dirModelLight) self.dirTree.setColumnHidden(1,True) self.dirTree.setColumnHidden(2,True) self.dirTree.setColumnHidden(3,True) self.dirTree.setMaximumWidth(200) self.dirTree.setMinimumWidth(150) self.dirTree.setCurrentIndex(self.dirModelLight.index(path)) self.dirTree.resizeColumnToContents(0) self.connect(self.dirTree, SIGNAL("pressed(QModelIndex)"), self.updateLatDir) self.connect(self.dirTree, SIGNAL("expanded(QModelIndex)"), self.treeMAJ) self.connect(self.dirTree, SIGNAL("collapsed(QModelIndex)"), self.treeMAJ) # Nom du fichier self.fileField = QLineEdit() # Nom du filtre self.filterField = QComboBox() self.filterField.addItems(QStringList(self.filter)) # Bouton de sauvegarde et d'annulation self.saveButton = QPushButton(_(u" Enregistrer")) self.saveButton.setIcon(QIcon("Icones" + os.sep + "action.png")) self.cancelButton = QPushButton(_(u" Annuler")) self.cancelButton.setIcon(QIcon("Icones" + os.sep + "annuler.png")) # Organisation des différents objets de la boite de dialogue self.layout = QHBoxLayout(self) self.layout.addWidget(self.dirTree) self.filelinelayout = QGridLayout() self.filelinelayout.addWidget(self.location, 0, 0, 1, 0) self.filelinelayout.addWidget(self.mkdirButton, 0, 2) self.filelinelayout.addWidget(self.dirList, 1, 0, 1, 0) self.filelinelayout.addWidget(QLabel(_("Nom de fichier : ")), 2, 0) self.filelinelayout.addWidget(self.fileField, 2, 1) self.filelinelayout.addWidget(self.saveButton, 2, 2) self.filelinelayout.addWidget(QLabel(_("Filtre extension : ")), 3, 0) self.filelinelayout.addWidget(self.filterField, 3, 1) self.filelinelayout.addWidget(self.cancelButton, 3, 2) self.layout.addLayout(self.filelinelayout) # Connexion des différents objets self.connect(self.dirList, SIGNAL("clicked(QModelIndex)"), self.updateFile) self.connect(self.saveButton, SIGNAL("clicked()"), self.accept) self.connect(self.cancelButton, SIGNAL("clicked()"), self.reject) self.connect(self.mkdirButton, SIGNAL("clicked()"), self.mkdir) self.connect(self.dirList, SIGNAL("indexesMoved (const QModelIndexList&)"), self.updateFile) self.connect(self.fileField, SIGNAL("textChanged (const QString&)"), self.activate) self.connect(self.fileField, SIGNAL("returnPressed()"), self.accept) # Taille minimum self.setMinimumSize(700, 480) # Par défaut, on désactive self.deactivate() # Completion des fichiers self.completion = QCompleter(self.dirModel, self.dirList) def updateLatDir(self, item) : """ Fonction permettant de naviguer dans la listes des répertoires """ self.updateDir(self.dirModelLight.filePath(item)) def treeMAJ(self, item) : self.dirTree.resizeColumnToContents(0) def activate(self, filename=None): """ Activation des boutton de sauvegarde """ self.dirList.clearSelection() if filename != "": self.saveButton.setEnabled(True) else: self.saveButton.setEnabled(False) def deactivate(self): """ Désactivation des boutton de sauvegarde """ self.saveButton.setEnabled(False) def updateDir(self, path = None): """ Fonction permettant de naviguer dans la listes des répertoires """ if path : self.currentDir = path self.location.setText("<b>%s</b>" % path) self.dirModel.clear() self.tmpdir = QDir() self.tmpdir.setPath(self.currentDir) self.tmpdir.setNameFilters(QStringList(self.filter)) # Une icône pour les images, un autre icône pour les vidéos, et # une pour audio if self.mode == "image" : icone = QIcon("Icones" + os.sep + "image_image.png") elif self.mode == "video" : icone = QIcon("Icones" + os.sep + "image_video.png") elif self.mode == "audio" : icone = QIcon("Icones" + os.sep + "image_audio.png") else: icone = QIcon("Icones" + os.sep + "image_default.png") for wlfile in self.tmpdir.entryList(QDir.Files): if self.mode == "image" : icone = QIcon(EkdPreview("Icones" + os.sep + "image_default.png").get_preview()) item = QStandardItem(icone, QString(wlfile)) item.setToolTip(wlfile) item.setData(QVariant(self.tmpdir.absolutePath() + os.sep + wlfile), Qt.UserRole + 2) item.setData(QVariant(wlfile), Qt.UserRole + 3) self.dirModel.appendRow(item) def updateFile(self, item): """ Fonction appelée par la listView lors d'un changement de repertoire""" # On récupère le QModel parent du QModelItem path = "%s" % item.data(Qt.UserRole + 2).toString() name = os.path.basename(path) self.fileField.selectAll() self.fileField.setFocus() self.fileField.setText(name) self.activate(name) def selectedFile(self): """ Renvoi le fichier selectionné pour la sauvegarde""" # Récupération du fichier selectionné fichier = self.fileField.text() output = "%s%s%s" % (self.currentDir, os.sep, fichier) info = QFileInfo(output) # Si l'utilisateur n'a pas spécifié de suffix, on l'ajoute if info.suffix() != self.suffix[1:]: output = "%s%s" % (output, self.suffix) return output def mkdir(self): """ Crée un répertoire dans le répertoire courant """ (dirname, ok) = QInputDialog.getText(self, _(u"Nouveau répertoire"), _(u"Nom du répertoire"), QLineEdit.Normal, _(u"Nouveau répertoire")) if ok : try : os.mkdir("%s%s%s" % (self.currentDir, os.sep,dirname)) #print u"Création de : %s%s%s" % (self.currentDir, os.sep, dirname) EkdPrint(u"Création de : %s%s%s" % (self.currentDir, os.sep, dirname)) self.updateDir() self.dirModelLight.refresh() except Exception, e: #print _(u"Impossible de crée un nouveau répertoire : %s" % e) EkdPrint(_(u"Impossible de crée un nouveau répertoire : %s" % e))
def __init__(self): QDirModel.__init__(self) self.setFilter(QDir.Dirs | QDir.NoDotAndDotDot | QDir.Files)
def __init__(self, parent): super(GeneralExecution, self).__init__() self._preferences = parent vbox = QVBoxLayout(self) groupExecution = QGroupBox(translations.TR_WORKSPACE_PROJECTS) grid = QVBoxLayout(groupExecution) #Python Path hPath = QHBoxLayout() self._txtPythonPath = QLineEdit() self._btnPythonPath = QPushButton(QIcon(':img/open'), '') self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self._txtPythonPath.setCompleter(self.completer) hPath.addWidget(QLabel(translations.TR_SELECT_PYTHON_EXEC)) hPath.addWidget(self._txtPythonPath) hPath.addWidget(self._btnPythonPath) grid.addLayout(hPath) #Python Miscellaneous Execution options self.check_B = QCheckBox(translations.TR_SELECT_EXEC_OPTION_B) self.check_d = QCheckBox(translations.TR_SELECT_EXEC_OPTION_D) self.check_E = QCheckBox(translations.TR_SELECT_EXEC_OPTION_E) self.check_O = QCheckBox(translations.TR_SELECT_EXEC_OPTION_O) self.check_OO = QCheckBox(translations.TR_SELECT_EXEC_OPTION_OO) self.check_Q = QCheckBox(translations.TR_SELECT_EXEC_OPTION_Q) self.comboDivision = QComboBox() self.comboDivision.addItems(['old', 'new', 'warn', 'warnall']) self.check_s = QCheckBox(translations.TR_SELECT_EXEC_OPTION_s) self.check_S = QCheckBox(translations.TR_SELECT_EXEC_OPTION_S) self.check_t = QCheckBox(translations.TR_SELECT_EXEC_OPTION_T) self.check_tt = QCheckBox(translations.TR_SELECT_EXEC_OPTION_TT) self.check_v = QCheckBox(translations.TR_SELECT_EXEC_OPTION_V) self.check_W = QCheckBox(translations.TR_SELECT_EXEC_OPTION_W) self.comboWarning = QComboBox() self.comboWarning.addItems( ['default', 'ignore', 'all', 'module', 'once', 'error']) self.check_x = QCheckBox(translations.TR_SELECT_EXEC_OPTION_X) self.check_3 = QCheckBox(translations.TR_SELECT_EXEC_OPTION_3) grid.addWidget(self.check_B) grid.addWidget(self.check_d) grid.addWidget(self.check_E) grid.addWidget(self.check_O) grid.addWidget(self.check_OO) hDiv = QHBoxLayout() hDiv.addWidget(self.check_Q) hDiv.addWidget(self.comboDivision) grid.addLayout(hDiv) grid.addWidget(self.check_s) grid.addWidget(self.check_S) grid.addWidget(self.check_t) grid.addWidget(self.check_tt) grid.addWidget(self.check_v) hWarn = QHBoxLayout() hWarn.addWidget(self.check_W) hWarn.addWidget(self.comboWarning) grid.addLayout(hWarn) grid.addWidget(self.check_x) grid.addWidget(self.check_3) #Settings self._txtPythonPath.setText(settings.PYTHON_EXEC) options = settings.EXECUTION_OPTIONS.split() if '-B' in options: self.check_B.setChecked(True) if '-d' in options: self.check_d.setChecked(True) if '-E' in options: self.check_E.setChecked(True) if '-O' in options: self.check_O.setChecked(True) if '-OO' in options: self.check_OO.setChecked(True) if settings.EXECUTION_OPTIONS.find('-Q') > -1: self.check_Q.setChecked(True) index = settings.EXECUTION_OPTIONS.find('-Q') opt = settings.EXECUTION_OPTIONS[index + 2:].split(' ', 1)[0] index = self.comboDivision.findText(opt) self.comboDivision.setCurrentIndex(index) if '-s' in options: self.check_s.setChecked(True) if '-S' in options: self.check_S.setChecked(True) if '-t' in options: self.check_t.setChecked(True) if '-tt' in options: self.check_tt.setChecked(True) if '-v' in options: self.check_v.setChecked(True) if settings.EXECUTION_OPTIONS.find('-W') > -1: self.check_W.setChecked(True) index = settings.EXECUTION_OPTIONS.find('-W') opt = settings.EXECUTION_OPTIONS[index + 2:].split(' ', 1)[0] index = self.comboWarning.findText(opt) self.comboWarning.setCurrentIndex(index) if '-x' in options: self.check_x.setChecked(True) if '-3' in options: self.check_3.setChecked(True) vbox.addWidget(groupExecution) #Signals self.connect(self._btnPythonPath, SIGNAL("clicked()"), self._load_python_path) self.connect(self._preferences, SIGNAL("savePreferences()"), self.save)
class SearchWidget(QFrame): """Widget, appeared, when Ctrl+F pressed. Has different forms for different search modes """ Normal = "normal" Good = "good" Bad = "bad" Incorrect = "incorrect" visibilityChanged = pyqtSignal(bool) """ visibilityChanged(visible) **Signal** emitted, when widget has been shown or hidden """ # pylint: disable=W0105 searchInDirectoryStartPressed = pyqtSignal(type(re.compile("")), list, unicode) """ searchInDirectoryStartPressed(regEx, mask, path) **Signal** emitted, when 'search in directory' button had been pressed """ # pylint: disable=W0105 searchInDirectoryStopPressed = pyqtSignal() """ searchInDirectoryStopPressed() **Signal** emitted, when 'stop search in directory' button had been pressed """ # pylint: disable=W0105 replaceCheckedStartPressed = pyqtSignal(unicode) """ replaceCheckedStartPressed(replText) **Signal** emitted, when 'replace checked' button had been pressed """ # pylint: disable=W0105 replaceCheckedStopPressed = pyqtSignal() """ replaceCheckedStartPressed() **Signal** emitted, when 'stop replacing checked' button had been pressed """ # pylint: disable=W0105 searchRegExpChanged = pyqtSignal(type(re.compile(""))) """ searchRegExpValidStateChanged(regEx) **Signal** emitted, when search regexp has been changed. If reg exp is invalid - regEx object contains empty pattern """ # pylint: disable=W0105 searchNext = pyqtSignal() """ searchNext() **Signal** emitted, when 'Search Next' had been pressed """ # pylint: disable=W0105 searchPrevious = pyqtSignal() """ searchPrevious() **Signal** emitted, when 'Search Previous' had been pressed """ # pylint: disable=W0105 replaceFileOne = pyqtSignal(unicode) """ replaceFileOne(replText) **Signal** emitted, when 'Replace' had been pressed """ # pylint: disable=W0105 replaceFileAll = pyqtSignal(unicode) """ replaceFileAll(replText) **Signal** emitted, when 'Replace All' had been pressed """ # pylint: disable=W0105 def __init__(self, plugin): QFrame.__init__(self, core.workspace()) self._mode = None self.plugin = plugin from PyQt4 import uic # lazy import for better startup performance uic.loadUi(os.path.join(os.path.dirname(__file__), "SearchWidget.ui"), self) self.cbSearch.setCompleter(None) self.cbReplace.setCompleter(None) self.cbMask.setCompleter(None) self.fsModel = QDirModel(self.cbPath.lineEdit()) self.fsModel.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) self.cbPath.lineEdit().setCompleter(QCompleter(self.fsModel, self.cbPath.lineEdit())) # TODO QDirModel is deprecated but QCompleter does not yet handle # QFileSystemodel - please update when possible.""" self.cbSearch.setCompleter(None) self.pbSearchStop.setVisible(False) self.pbReplaceCheckedStop.setVisible(False) self._progress = QProgressBar(self) self._progress.setAlignment(Qt.AlignCenter) self._progress.setToolTip(self.tr("Search in progress...")) self._progress.setMaximumSize(QSize(80, 16)) core.mainWindow().statusBar().insertPermanentWidget(1, self._progress) self._progress.setVisible(False) # cd up action self.tbCdUp = QToolButton(self.cbPath.lineEdit()) self.tbCdUp.setIcon(QIcon(":/enkiicons/go-up.png")) self.tbCdUp.setCursor(Qt.ArrowCursor) self.tbCdUp.installEventFilter(self) # for drawing button self.cbSearch.installEventFilter(self) # for catching Tab and Shift+Tab self.cbReplace.installEventFilter(self) # for catching Tab and Shift+Tab self.cbPath.installEventFilter(self) # for catching Tab and Shift+Tab self.cbMask.installEventFilter(self) # for catching Tab and Shift+Tab self._closeShortcut = QShortcut(QKeySequence("Esc"), self) self._closeShortcut.setContext(Qt.WidgetWithChildrenShortcut) self._closeShortcut.activated.connect(self.hide) # connections self.cbSearch.lineEdit().textChanged.connect(self._onSearchRegExpChanged) self.cbSearch.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbReplace.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbPath.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbMask.lineEdit().returnPressed.connect(self._onReturnPressed) self.cbRegularExpression.stateChanged.connect(self._onSearchRegExpChanged) self.cbCaseSensitive.stateChanged.connect(self._onSearchRegExpChanged) self.tbCdUp.clicked.connect(self._onCdUpPressed) core.mainWindow().hideAllWindows.connect(self.hide) core.workspace().currentDocumentChanged.connect( lambda old, new: self.setVisible(self.isVisible() and new is not None) ) def show(self): """Reimplemented function. Sends signal """ super(SearchWidget, self).show() self.visibilityChanged.emit(self.isVisible()) def hide(self): """Reimplemented function. Sends signal, returns focus to workspace """ super(SearchWidget, self).hide() core.workspace().focusCurrentDocument() self.visibilityChanged.emit(self.isVisible()) def setVisible(self, visible): """Reimplemented function. Sends signal """ super(SearchWidget, self).setVisible(visible) self.visibilityChanged.emit(self.isVisible()) def _regExEscape(self, text): """Improved version of re.escape() Doesn't escape space, comma, underscore. Escapes \n and \t """ text = re.escape(text) # re.escape escapes space, comma, underscore, but, it is not necessary and makes text not readable for symbol in " ,_='\"/:@#%&": text = text.replace("\\" + symbol, symbol) text = text.replace("\\\n", "\\n") text = text.replace("\\\t", "\\t") return text def _makeEscapeSeqsVisible(self, text): """Replace invisible \n and \t with escape sequences """ text = text.replace("\t", "\\t") text = text.replace("\n", "\\n") return text def setMode(self, mode): """Change search mode. i.e. from "Search file" to "Replace directory" """ if self._mode == mode and self.isVisible(): if core.workspace().currentDocument() is not None and not core.workspace().currentDocument().hasFocus(): self.cbSearch.lineEdit().selectAll() self.cbSearch.setFocus() self._mode = mode # Set Search and Replace text if ( core.workspace().currentDocument() is not None and core.workspace().currentDocument().hasFocus() and core.workspace().currentDocument().selectedText() ): searchText = core.workspace().currentDocument().selectedText() self.cbReplace.setEditText(self._makeEscapeSeqsVisible(searchText)) if self.cbRegularExpression.checkState() == Qt.Checked: searchText = self._regExEscape(searchText) self.cbSearch.setEditText(searchText) if ( not self.cbReplace.lineEdit().text() and self.cbSearch.lineEdit().text() and not self.cbRegularExpression.checkState() == Qt.Checked ): self.cbReplace.setEditText(self.cbSearch.lineEdit().text()) # Move focus to Search edit self.cbSearch.setFocus() self.cbSearch.lineEdit().selectAll() # Set search path if mode & ModeFlagDirectory and not (self.isVisible() and self.cbPath.isVisible()): try: searchPath = os.path.abspath(unicode(os.path.curdir)) self.cbPath.setEditText(searchPath) except OSError: # current directory might have been deleted pass # Set widgets visibility flag according to state widgets = ( self.wSearch, self.pbPrevious, self.pbNext, self.pbSearch, self.wReplace, self.wPath, self.pbReplace, self.pbReplaceAll, self.pbReplaceChecked, self.wOptions, self.wMask, ) # wSear pbPrev pbNext pbSear wRepl wPath pbRep pbRAll pbRCHK wOpti wMask visible = { ModeSearch: (1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0), ModeReplace: (1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0), ModeSearchDirectory: (1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1), ModeReplaceDirectory: (1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1), ModeSearchOpenedFiles: (1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1), ModeReplaceOpenedFiles: (1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1), } for i, widget in enumerate(widgets): widget.setVisible(visible[mode][i]) # Search next button text if mode == ModeReplace: self.pbNext.setText("Next") else: self.pbNext.setText(u"Next↵") # Finaly show all with valid size self.show() # show before updating widgets and labels self._updateLabels() self._updateWidgets() def eventFilter(self, object_, event): """ Event filter for mode switch tool button Draws icons in the search and path lineEdits """ if event.type() == QEvent.Paint and object_ is self.tbCdUp: # draw CdUp button in search path QLineEdit toolButton = object_ lineEdit = self.cbPath.lineEdit() lineEdit.setContentsMargins(lineEdit.height(), 0, 0, 0) height = lineEdit.height() availableRect = QRect(0, 0, height, height) if toolButton.rect() != availableRect: toolButton.setGeometry(availableRect) painter = QPainter(toolButton) toolButton.icon().paint(painter, availableRect) return True elif event.type() == QEvent.KeyPress: # Tab and Shift+Tab in QLineEdits if event.key() == Qt.Key_Tab: self._moveFocus(1) return True elif event.key() == Qt.Key_Backtab: self._moveFocus(-1) return True return QFrame.eventFilter(self, object_, event) def _onReturnPressed(self): """Return or Enter pressed on widget. Search next or Replace next """ if self.pbReplace.isVisible(): self.pbReplace.click() elif self.pbNext.isVisible(): self.pbNext.click() elif self.pbSearch.isVisible(): self.pbSearch.click() elif self.pbSearchStop.isVisible(): self.pbSearchStop.click() def _moveFocus(self, step): """Move focus forward or backward according to step. Standard Qt Keyboard focus algorithm doesn't allow circular navigation """ allFocusableWidgets = (self.cbSearch, self.cbReplace, self.cbPath, self.cbMask) visibleWidgets = [widget for widget in allFocusableWidgets if widget.isVisible()] try: focusedIndex = visibleWidgets.index(QApplication.focusWidget()) except ValueError: print >>sys.stderr, "Invalid focused widget in Search Widget" return nextFocusedIndex = (focusedIndex + step) % len(visibleWidgets) visibleWidgets[nextFocusedIndex].setFocus() visibleWidgets[nextFocusedIndex].lineEdit().selectAll() def _updateLabels(self): """Update 'Search' 'Replace' 'Path' labels geometry """ width = 0 if self.lSearch.isVisible(): width = max(width, self.lSearch.minimumSizeHint().width()) if self.lReplace.isVisible(): width = max(width, self.lReplace.minimumSizeHint().width()) if self.lPath.isVisible(): width = max(width, self.lPath.minimumSizeHint().width()) self.lSearch.setMinimumWidth(width) self.lReplace.setMinimumWidth(width) self.lPath.setMinimumWidth(width) def _updateWidgets(self): """Update geometry of widgets with buttons """ width = 0 if self.wSearchRight.isVisible(): width = max(width, self.wSearchRight.minimumSizeHint().width()) if self.wReplaceRight.isVisible(): width = max(width, self.wReplaceRight.minimumSizeHint().width()) if self.wPathRight.isVisible(): width = max(width, self.wPathRight.minimumSizeHint().width()) self.wSearchRight.setMinimumWidth(width) self.wReplaceRight.setMinimumWidth(width) self.wPathRight.setMinimumWidth(width) def _updateComboBoxes(self): """Update comboboxes with last used texts """ searchText = self.cbSearch.currentText() replaceText = self.cbReplace.currentText() maskText = self.cbMask.currentText() # search if searchText: index = self.cbSearch.findText(searchText) if index == -1: self.cbSearch.addItem(searchText) # replace if replaceText: index = self.cbReplace.findText(replaceText) if index == -1: self.cbReplace.addItem(replaceText) # mask if maskText: index = self.cbMask.findText(maskText) if index == -1: self.cbMask.addItem(maskText) def _searchPatternTextAndFlags(self): """Get search pattern and flags """ pattern = self.cbSearch.currentText() if not self.cbRegularExpression.checkState() == Qt.Checked: pattern = re.escape(pattern) flags = 0 if not self.cbCaseSensitive.checkState() == Qt.Checked: flags = re.IGNORECASE return pattern, flags def getRegExp(self): """Read search parameters from controls and present it as a regular expression """ pattern, flags = self._searchPatternTextAndFlags() return re.compile(pattern, flags) def isSearchRegExpValid(self): """Try to compile search pattern to check if it is valid Returns bool result and text error """ pattern, flags = self._searchPatternTextAndFlags() try: re.compile(pattern, flags) except re.error, ex: return False, unicode(ex) return True, None
def data(self, index, role=Qt.DisplayRole): if role == Qt.CheckStateRole and index.column() == 0: return self.checkState(index) return QDirModel.data(self, index, role)
def __init__(self, AUTO): ' Initialize QWidget inside MyMainWindow ' super(MyMainWindow, self).__init__() QWidget.__init__(self) self.auto = AUTO self.statusBar().showMessage(' {}'.format(__doc__)) self.setStyleSheet('QStatusBar{color:grey;}') self.setWindowTitle(__doc__) self.setWindowIcon(QIcon.fromTheme("face-monkey")) self.setFont(QFont('Ubuntu Light', 10)) self.setMaximumSize(QDesktopWidget().screenGeometry().width(), QDesktopWidget().screenGeometry().height()) self.base = path.abspath(path.join(getcwd(), str(datetime.now().year))) # directory auto completer self.completer = QCompleter(self) self.dirs = QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) # process self.process1 = None self.process2 = None self.cmd1 = 'nice -n {n} arecord{v} -f {f} -c {c} -r {b} -t raw' self.cmd2 = 'oggenc - -r -C {c} -R {b} -q {q} {d}{t}{a} -o {o}' self.process3 = QProcess(self) #self.process3.finished.connect(self.on_process3_finished) #self.process3.error.connect(self.on_process3_error) self.cmd3 = ('nice -n 20 ' + 'sox "{o}" -n spectrogram -x {x} -y {y} -z 99 -t "{o}" -o "{o}.png"') self.actual_file = '' # re starting timers, one stops, one starts self.timerFirst = QTimer(self) self.timerFirst.timeout.connect(self.end) self.timerSecond = QTimer(self) self.timerSecond.timeout.connect(self.run) # Proxy support, by reading http_proxy os env variable proxy_url = QUrl(environ.get('http_proxy', '')) QNetworkProxy.setApplicationProxy(QNetworkProxy(QNetworkProxy.HttpProxy if str(proxy_url.scheme()).startswith('http') else QNetworkProxy.Socks5Proxy, proxy_url.host(), proxy_url.port(), proxy_url.userName(), proxy_url.password())) \ if 'http_proxy' in environ else None print((' INFO: Proxy Auto-Config as ' + str(proxy_url))) # basic widgets layouts and set up self.mainwidget = QTabWidget() self.mainwidget.setToolTip(__doc__) self.mainwidget.setMovable(True) self.mainwidget.setTabShape(QTabWidget.Triangular) self.mainwidget.setContextMenuPolicy(Qt.CustomContextMenu) self.mainwidget.setStyleSheet('QTabBar{color:white;font-weight:bold;}') self.mainwidget.setTabBar(TabBar(self)) self.mainwidget.setTabsClosable(False) self.setCentralWidget(self.mainwidget) self.dock1 = QDockWidget() self.dock2 = QDockWidget() self.dock3 = QDockWidget() self.dock4 = QDockWidget() self.dock5 = QDockWidget() for a in (self.dock1, self.dock2, self.dock3, self.dock4, self.dock5): a.setWindowModality(Qt.NonModal) # a.setWindowOpacity(0.9) a.setWindowTitle(__doc__ if a.windowTitle() == '' else a.windowTitle()) a.setStyleSheet('QDockWidget::title{text-align:center;}') self.mainwidget.addTab(a, QIcon.fromTheme("face-smile"), 'Double Click Me') # Paleta de colores para pintar transparente self.palette().setBrush(QPalette.Base, Qt.transparent) self.setPalette(self.palette()) self.setAttribute(Qt.WA_OpaquePaintEvent, False) # toolbar and basic actions self.toolbar = QToolBar(self) self.toolbar.setIconSize(QSize(24, 24)) # spacer widget for left self.left_spacer = QWidget(self) self.left_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # spacer widget for right self.right_spacer = QWidget(self) self.right_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) qaqq = QAction(QIcon.fromTheme("application-exit"), 'Quit', self) qaqq.setShortcut('Ctrl+Q') qaqq.triggered.connect(exit) qamin = QAction(QIcon.fromTheme("go-down"), 'Minimize', self) qamin.triggered.connect(lambda: self.showMinimized()) qamax = QAction(QIcon.fromTheme("go-up"), 'Maximize', self) qanor = QAction(QIcon.fromTheme("view-fullscreen"), 'AutoCenter AutoResize', self) qanor.triggered.connect(self.center) qatim = QAction(QIcon.fromTheme("mail-signed-verified"), 'View Date and Time', self) qatim.triggered.connect(self.timedate) qabug = QAction(QIcon.fromTheme("help-about"), 'Report a Problem', self) qabug.triggered.connect(lambda: qabug.setDisabled(True) if not call( 'xdg-open mailto:' + '*****@*****.**'.decode('rot13'), shell=True) else ' ERROR ') qamax.triggered.connect(lambda: self.showMaximized()) qaqt = QAction(QIcon.fromTheme("help-about"), 'About Qt', self) qaqt.triggered.connect(lambda: QMessageBox.aboutQt(self)) qakde = QAction(QIcon.fromTheme("help-about"), 'About KDE', self) if KDE: qakde.triggered.connect(KHelpMenu(self, "", False).aboutKDE) qaslf = QAction(QIcon.fromTheme("help-about"), 'About Self', self) if KDE: qaslf.triggered.connect( KAboutApplicationDialog(aboutData, self).exec_) else: qaslf.triggered.connect(lambda: QMessageBox.about(self.mainwidget, __doc__, ''.join((__doc__, linesep, 'version ', __version__, ', (', __license__, '), by ', __author__, ', ( ', __email__, ' )', linesep )))) qafnt = QAction(QIcon.fromTheme("tools-check-spelling"), 'Set GUI Font', self) if KDE: font = QFont() qafnt.triggered.connect(lambda: self.setStyleSheet(''.join(( '*{font-family:', str(font.toString()), '}')) if KFontDialog.getFont(font)[0] == QDialog.Accepted else '')) else: qafnt.triggered.connect(lambda: self.setStyleSheet(''.join(('*{font-family:', str(QFontDialog.getFont()[0].toString()), '}')))) qasrc = QAction(QIcon.fromTheme("applications-development"), 'View Source Code', self) qasrc.triggered.connect(lambda: call('xdg-open {}'.format(__file__), shell=True)) qakb = QAction(QIcon.fromTheme("input-keyboard"), 'Keyboard Shortcuts', self) qakb.triggered.connect(lambda: QMessageBox.information(self.mainwidget, 'Keyboard Shortcuts', ' Ctrl+Q = Quit ')) qapic = QAction(QIcon.fromTheme("camera-photo"), 'Take a Screenshot', self) qapic.triggered.connect(lambda: QPixmap.grabWindow( QApplication.desktop().winId()).save(QFileDialog.getSaveFileName( self.mainwidget, " Save Screenshot As ...", path.expanduser("~"), ';;(*.png) PNG', 'png'))) qatb = QAction(QIcon.fromTheme("go-top"), 'Toggle ToolBar', self) qatb.triggered.connect(lambda: self.toolbar.hide() if self.toolbar.isVisible() is True else self.toolbar.show()) qati = QAction(QIcon.fromTheme("zoom-in"), 'Switch ToolBar Icon Size', self) qati.triggered.connect(lambda: self.toolbar.setIconSize(self.toolbar.iconSize() * 4) if self.toolbar.iconSize().width() * 4 == 24 else self.toolbar.setIconSize(self.toolbar.iconSize() / 4)) qasb = QAction(QIcon.fromTheme("preferences-other"), 'Toggle Tabs Bar', self) qasb.triggered.connect(lambda: self.mainwidget.tabBar().hide() if self.mainwidget.tabBar().isVisible() is True else self.mainwidget.tabBar().show()) qadoc = QAction(QIcon.fromTheme("help-browser"), 'On-line Docs', self) qadoc.triggered.connect(lambda: open_new_tab(str(__url__).strip())) qapy = QAction(QIcon.fromTheme("help-about"), 'About Python', self) qapy.triggered.connect(lambda: open_new_tab('http://python.org/about')) qali = QAction(QIcon.fromTheme("help-browser"), 'Read Licence', self) qali.triggered.connect(lambda: open_new_tab(__full_licence__)) qacol = QAction(QIcon.fromTheme("preferences-system"), 'Set GUI Colors', self) if KDE: color = QColor() qacol.triggered.connect(lambda: self.setStyleSheet(''.join(('* { background-color: ', str(color.name()), '}'))) if KColorDialog.getColor(color, self) else '') else: qacol.triggered.connect(lambda: self.setStyleSheet(''.join(( ' * { background-color: ', str(QColorDialog.getColor().name()), ' } ')))) qatit = QAction(QIcon.fromTheme("preferences-system"), 'Set the App Window Title', self) qatit.triggered.connect(self.seTitle) self.toolbar.addWidget(self.left_spacer) self.toolbar.addSeparator() self.toolbar.addActions((qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qatim, qatb, qafnt, qati, qasb, qatit, qapic, qadoc, qali, qaslf, qaqt, qakde, qapy, qabug)) self.addToolBar(Qt.TopToolBarArea, self.toolbar) self.toolbar.addSeparator() self.toolbar.addWidget(self.right_spacer) # define the menu menu = self.menuBar() # File menu items menu.addMenu('&File').addActions((qaqq, )) menu.addMenu('&Window').addActions((qamax, qanor, qamin)) # Settings menu menu.addMenu('&Settings').addActions((qasrc, qacol, qafnt, qatim, qatb, qati, qasb, qapic)) # Help menu items menu.addMenu('&Help').addActions((qadoc, qakb, qabug, qali, qaqt, qakde, qapy, qaslf)) # Tray Icon tray = QSystemTrayIcon(QIcon.fromTheme("face-devilish"), self) tray.setToolTip(__doc__) traymenu = QMenu() traymenu.addActions((qamax, qanor, qamin, qaqq)) tray.setContextMenu(traymenu) tray.show() def contextMenuRequested(point): ' quick and dirty custom context menu ' menu = QMenu() menu.addActions((qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qafnt, qati, qasb, qatb, qatim, qatit, qapic, qadoc, qali, qaslf, qaqt, qakde, qapy, qabug)) menu.exec_(self.mapToGlobal(point)) self.mainwidget.customContextMenuRequested.connect(contextMenuRequested) def must_be_checked(widget_list): ' widget tuple passed as argument should be checked as ON ' for each_widget in widget_list: try: each_widget.setChecked(True) except: pass def must_have_tooltip(widget_list): ' widget tuple passed as argument should have tooltips ' for each_widget in widget_list: try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) finally: each_widget.setCursor(QCursor(Qt.PointingHandCursor)) def must_autofillbackground(widget_list): ' widget tuple passed as argument should have filled background ' for each_widget in widget_list: try: each_widget.setAutoFillBackground(True) except: pass def must_glow(widget_list): ' apply an glow effect to the widget ' for glow, each_widget in enumerate(widget_list): try: if each_widget.graphicsEffect() is None: glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) each_widget.setGraphicsEffect(glow) # glow.setEnabled(False) try: each_widget.clicked.connect(lambda: each_widget.graphicsEffect().setEnabled(True) if each_widget.graphicsEffect().isEnabled() is False else each_widget.graphicsEffect().setEnabled(False)) except: each_widget.sliderPressed.connect(lambda: each_widget.graphicsEffect().setEnabled(True) if each_widget.graphicsEffect().isEnabled() is False else each_widget.graphicsEffect().setEnabled(False)) except: pass ####################################################################### # dock 1 QLabel('<h1 style="color:white;"> Record !</h1>', self.dock1).resize( self.dock3.size().width() / 4, 25) self.group1 = QGroupBox() self.group1.setTitle(__doc__) self.spec = QPushButton(self) self.spec.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.spec.setMinimumSize(self.spec.size().width(), 250) self.spec.setFlat(True) self.spec.clicked.connect(self.spectro) self.clock = QLCDNumber() self.clock.setSegmentStyle(QLCDNumber.Flat) self.clock.setMinimumSize(self.clock.size().width(), 50) self.clock.setNumDigits(25) self.timer1 = QTimer(self) self.timer1.timeout.connect(lambda: self.clock.display( datetime.now().strftime("%d-%m-%Y %H:%M:%S %p"))) self.timer1.start(1000) self.clock.setToolTip(datetime.now().strftime("%c %x")) self.clock.setCursor(QCursor(Qt.CrossCursor)) self.diskBar = QProgressBar() self.diskBar.setMinimum(0) self.diskBar.setMaximum(statvfs(HOME).f_blocks * statvfs(HOME).f_frsize / 1024 / 1024 / 1024) self.diskBar.setValue(statvfs(HOME).f_bfree * statvfs(HOME).f_frsize / 1024 / 1024 / 1024) self.diskBar.setToolTip(str(statvfs(HOME).f_bfree * statvfs(HOME).f_frsize / 1024 / 1024 / 1024) + ' Gigabytes free') self.feedback = QPlainTextEdit(''.join(('<center><h3>', __doc__, ', version', __version__, __license__, ' <br> by ', __author__, ' <i>(Dev)</i>, Radio Comunitaria FM Reconquista <i>(Q.A.)</i><br>', 'FMReconquista.org.ar & GitHub.com/JuanCarlosPaco/Cinta-Testigo'))) self.rec = QPushButton(QIcon.fromTheme("media-record"), 'Record') self.rec.setMinimumSize(self.rec.size().width(), 50) self.rec.clicked.connect(self.go) # self.run self.stop = QPushButton(QIcon.fromTheme("media-playback-stop"), 'Stop') self.stop.clicked.connect(self.end) self.kill = QPushButton(QIcon.fromTheme("process-stop"), 'Kill') self.kill.clicked.connect(self.killer) vboxg1 = QVBoxLayout(self.group1) for each_widget in ( QLabel('<b style="color:white;"> Spectro'), self.spec, QLabel('<b style="color:white;"> Time '), self.clock, QLabel('<b style="color:white;"> Disk '), self.diskBar, QLabel('<b style="color:white;"> STDOUT + STDIN '), self.feedback, QLabel('<b style="color:white;"> Record '), self.rec, self.stop, self.kill): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle(__doc__) self.slider = QSlider(self) self.slid_l = QLabel(self.slider) self.slider.setCursor(QCursor(Qt.OpenHandCursor)) self.slider.sliderPressed.connect(lambda: self.slider.setCursor(QCursor(Qt.ClosedHandCursor))) self.slider.sliderReleased.connect(lambda: self.slider.setCursor(QCursor(Qt.OpenHandCursor))) self.slider.valueChanged.connect(lambda: self.slider.setToolTip(str(self.slider.value()))) self.slider.valueChanged.connect(lambda: self.slid_l.setText( '<h2 style="color:white;">{}'.format(self.slider.value()))) self.slider.setMinimum(10) self.slider.setMaximum(99) self.slider.setValue(30) self.slider.setOrientation(Qt.Vertical) self.slider.setTickPosition(QSlider.TicksBothSides) self.slider.setTickInterval(2) self.slider.setSingleStep(10) self.slider.setPageStep(10) vboxg2 = QVBoxLayout(self.group2) for each_widget in ( QLabel('<b style="color:white;">MINUTES of recording'), self.slider, QLabel('<b style="color:white;"> Default: 30 Min')): vboxg2.addWidget(each_widget) group3 = QGroupBox() group3.setTitle(__doc__) try: self.label2 = QLabel(getoutput('sox --version', shell=True)) self.label4 = QLabel(getoutput('arecord --version', shell=1)[:25]) self.label6 = QLabel(str(getoutput('oggenc --version', shell=True))) except: print(''' ERROR: No SOX, OGGenc avaliable ! ( sudo apt-get install vorbis-tools sox alsa-utils ) ''') exit() self.button5 = QPushButton(QIcon.fromTheme("audio-x-generic"), 'OGG --> ZIP') self.button5.clicked.connect(lambda: make_archive( str(QFileDialog.getSaveFileName(self, "Save OGG to ZIP file As...", getcwd(), ';;(*.zip)', 'zip')).replace('.zip', ''), "zip", path.abspath(path.join(getcwd(), str(datetime.now().year))))) self.button1 = QPushButton(QIcon.fromTheme("folder-open"), 'Files') self.button1.clicked.connect(lambda: call('xdg-open ' + getcwd(), shell=True)) self.button0 = QPushButton( QIcon.fromTheme("preferences-desktop-screensaver"), 'LCD OFF') self.button0.clicked.connect(lambda: call('sleep 3 ; xset dpms force off', shell=True)) vboxg3 = QVBoxLayout(group3) for each_widget in ( QLabel('<b style="color:white;"> OGG Output Codec '), self.label6, QLabel('<b style="color:white;"> Raw Record Backend '), self.label4, QLabel('<b style="color:white;"> Helper Libs '), self.label2, QLabel('<b style="color:white;"> OGG ZIP '), self.button5, QLabel('<b style="color:white;"> Files '), self.button1, QLabel('<b style="color:white;"> LCD '), self.button0): vboxg3.addWidget(each_widget) container = QWidget() hbox = QHBoxLayout(container) for each_widget in (self.group2, self.group1, group3): hbox.addWidget(each_widget) self.dock1.setWidget(container) # dock 2 QLabel('<h1 style="color:white;"> Hardware !</h1>', self.dock2).resize( self.dock2.size().width() / 4, 25) try: audioDriverStr = {Solid.AudioInterface.Alsa: "ALSA", Solid.AudioInterface.OpenSoundSystem: "Open Sound", Solid.AudioInterface.UnknownAudioDriver: "Unknown?"} audioInterfaceTypeStr = { Solid.AudioInterface.AudioControl: "Control", Solid.AudioInterface.UnknownAudioInterfaceType: "Unknown?", Solid.AudioInterface.AudioInput: "In", Solid.AudioInterface.AudioOutput: "Out"} soundcardTypeStr = { Solid.AudioInterface.InternalSoundcard: "Internal", Solid.AudioInterface.UsbSoundcard: "USB3", Solid.AudioInterface.FirewireSoundcard: "FireWire", Solid.AudioInterface.Headset: "Headsets", Solid.AudioInterface.Modem: "Modem"} display = QTreeWidget() display.setAlternatingRowColors(True) display.setHeaderLabels(["Items", "ID", "Drivers", "I / O", "Type"]) display.setColumnWidth(0, 350) display.setColumnWidth(1, 350) display.setColumnWidth(3, 75) # retrieve a list of Solid.Device for this machine deviceList = Solid.Device.allDevices() # filter the list of all devices and display matching results # note that we never create a Solid.AudioInterface object, but # receive one from the 'asDeviceInterface' call for device in deviceList: if device.isDeviceInterface( Solid.DeviceInterface.AudioInterface): audio = device.asDeviceInterface( Solid.DeviceInterface.AudioInterface) devtype = audio.deviceType() devstr = [] for key in audioInterfaceTypeStr: flag = key & devtype if flag: devstr.append(audioInterfaceTypeStr[key]) QTreeWidgetItem(display, [device.product(), audio.name(), audioDriverStr[audio.driver()], "/".join(devstr), soundcardTypeStr[audio.soundcardType()]]) self.dock2.setWidget(display) except: self.dock2.setWidget(QLabel(""" <center style='color:white;'> <h1>:(<br>ERROR: Please, install PyKDE !</h1><br> <br><i> (Sorry, can not use non-Qt Libs). Thanks </i><center>""")) ## dock 3 QLabel('<h1 style="color:white;"> Previews !</h1>', self.dock3).resize( self.dock3.size().width() / 4, 25) self.fileView = QColumnView() self.fileView.updatePreviewWidget.connect(self.play) self.fileView.setToolTip(' Browse and Preview Files ') self.media = None self.model = QDirModel() self.fileView.setModel(self.model) self.dock3.setWidget(self.fileView) # dock4 QLabel('<h1 style="color:white;"> Setup !</h1>', self.dock4).resize( self.dock4.size().width() / 4, 25) self.group4 = QGroupBox() self.group4.setTitle(__doc__) self.combo0 = QComboBox() self.combo0.addItems(['S16_LE', 'S32_LE', 'S16_BE', 'U16_LE', 'U16_BE', 'S24_LE', 'S24_BE', 'U24_LE', 'U24_BE', 'S32_BE', 'U32_LE', 'U32_BE']) self.combo1 = QComboBox() self.combo1.addItems(['1', '-1', '0', '2', '3', '4', '5', '6', '7', '8', '9', '10']) self.combo2 = QComboBox() self.combo2.addItems(['128', '256', '512', '1024', '64', '32', '16']) self.combo3 = QComboBox(self) self.combo3.addItems(['MONO', 'STEREO', 'Surround']) self.combo4 = QComboBox() self.combo4.addItems(['44100', '96000', '48000', '32000', '22050', '16000', '11025', '8000']) self.combo5 = QComboBox(self) self.combo5.addItems(['20', '19', '18', '17', '16', '15', '14', '13', '12', '10', '9', '8', '7', '6', '5', '4', '3', '2', '1', '0']) self.nepochoose = QCheckBox('Auto-Tag Files using Nepomuk Semantic') self.chckbx0 = QCheckBox('Disable Software based Volume Control') self.chckbx1 = QCheckBox('Output Sound Stereo-to-Mono Downmix') self.chckbx2 = QCheckBox('Add Date and Time MetaData to Sound files') self.chckbx3 = QCheckBox('Add Yourself as the Author Artist of Sound') vboxg4 = QVBoxLayout(self.group4) for each_widget in ( QLabel('<b style="color:white;"> Sound OGG Quality'), self.combo1, QLabel('<b style="color:white;"> Sound Record Format'), self.combo0, QLabel('<b style="color:white;"> Sound KBps '), self.combo2, QLabel('<b style="color:white;"> Sound Channels '), self.combo3, QLabel('<b style="color:white;"> Sound Sample Rate '), self.combo4, QLabel('<b style="color:white;"> Sound Volume'), self.chckbx0, QLabel('<b style="color:white;"> Sound Mix'), self.chckbx1, QLabel('<b style="color:white;"> Sound Meta'), self.chckbx2, QLabel('<b style="color:white;"> Sound Authorship'), self.chckbx3, QLabel('<b style="color:white;"> CPUs Priority'), self.combo5, QLabel('<b style="color:white;">Nepomuk Semantic User Experience'), self.nepochoose): vboxg4.addWidget(each_widget) self.dock4.setWidget(self.group4) # dock 5 QLabel('<h1 style="color:white;"> Voice Changer ! </h1>', self.dock5 ).resize(self.dock5.size().width() / 3, 25) self.group5 = QGroupBox() self.group5.setTitle(__doc__) self.dial = QDial() self.dial.setCursor(QCursor(Qt.OpenHandCursor)) self.di_l = QLabel(self.dial) self.di_l.resize(self.dial.size() / 8) self.dial.sliderPressed.connect(lambda: self.dial.setCursor(QCursor(Qt.ClosedHandCursor))) self.dial.sliderReleased.connect(lambda: self.dial.setCursor(QCursor(Qt.OpenHandCursor))) self.dial.valueChanged.connect(lambda: self.dial.setToolTip(str(self.dial.value()))) self.dial.valueChanged.connect(lambda: self.di_l.setText( '<h1 style="color:white;">{}'.format(self.dial.value()))) self.dial.setValue(0) self.dial.setMinimum(-999) self.dial.setMaximum(999) self.dial.setSingleStep(100) self.dial.setPageStep(100) self.dial.setWrapping(False) self.dial.setNotchesVisible(True) self.defo = QPushButton(QIcon.fromTheme("media-playback-start"), 'Run') self.defo.setMinimumSize(self.defo.size().width(), 50) self.defo.clicked.connect(lambda: self.process3.start( 'play -q -V0 "|rec -q -V0 -n -d -R riaa pitch {} "' .format(self.dial.value()) if int(self.dial.value()) != 0 else 'play -q -V0 "|rec -q -V0 --multi-threaded -n -d -R bend {} "' .format(' 3,2500,3 3,-2500,3 ' * 999))) self.qq = QPushButton(QIcon.fromTheme("media-playback-stop"), 'Stop') self.qq.clicked.connect(self.process3.kill) self.die = QPushButton(QIcon.fromTheme("process-stop"), 'Kill') self.die.clicked.connect(lambda: call('killall rec', shell=True)) vboxg5 = QVBoxLayout(self.group5) for each_widget in (self.dial, self.defo, self.qq, self.die): vboxg5.addWidget(each_widget) self.dock5.setWidget(self.group5) # configure some widget settings must_be_checked((self.nepochoose, self.chckbx1, self.chckbx2, self.chckbx3)) must_have_tooltip((self.label2, self.label4, self.label6, self.combo0, self.nepochoose, self.combo1, self.combo2, self.combo3, self.combo4, self.combo5, self.chckbx0, self.chckbx1, self.chckbx2, self.chckbx3, self.rec, self.stop, self.defo, self.qq, self.die, self.kill, self.button0, self.button1, self.button5)) must_autofillbackground((self.clock, self.label2, self.label4, self.label6, self.nepochoose, self.chckbx0, self.chckbx1, self.chckbx2, self.chckbx3)) must_glow((self.rec, self.dial, self.combo1)) self.nepomuk_get('testigo') if self.auto is True: self.go()
def initialize(self, *args, **kwargs): " Init Main Class " ec = ExplorerContainer() super(Main, self).initialize(*args, **kwargs) self.editor_s = self.locator.get_service('editor') # directory auto completer self.completer = QCompleter(self) self.dirs = QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.group0 = QGroupBox() self.group0.setTitle(' Source ') self.source = QComboBox() self.source.addItems(['Clipboard', 'Local File', 'Remote URL', 'Ninja']) self.source.currentIndexChanged.connect(self.on_source_changed) self.infile = QLineEdit(path.expanduser("~")) self.infile.setPlaceholderText(' /full/path/to/file.html ') self.infile.setCompleter(self.completer) self.open = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.open.setCursor(QCursor(Qt.PointingHandCursor)) self.open.clicked.connect(lambda: self.infile.setText(str( QFileDialog.getOpenFileName(self.dock, "Open a File to read from", path.expanduser("~"), ';;'.join(['{}(*.{})'.format(e.upper(), e) for e in ['css', 'html', 'js', 'txt', '*']]))))) self.inurl = QLineEdit('http://www.') self.inurl.setPlaceholderText('http://www.full/url/to/remote/file.html') self.output = QPlainTextEdit(SAMPLE_TEXT) vboxg0 = QVBoxLayout(self.group0) for each_widget in (self.source, self.infile, self.open, self.inurl, self.output, ): vboxg0.addWidget(each_widget) [a.hide() for a in iter((self.infile, self.open, self.inurl))] self.group1 = QGroupBox() self.group1.setTitle(' CSS3 ') self.group1.setCheckable(True) self.group1.setGraphicsEffect(QGraphicsBlurEffect(self)) self.group1.graphicsEffect().setEnabled(False) self.group1.toggled.connect(self.toggle_css_group) self.ckcss1 = QCheckBox('Remove unnecessary Comments') self.ckcss2 = QCheckBox('Remove unnecessary Whitespace characters') self.ckcss3 = QCheckBox('Remove unnecessary Semicolons') self.ckcss4 = QCheckBox('Remove unnecessary Empty rules') self.ckcss5 = QCheckBox('Condense and Convert Colors from RGB to HEX') self.ckcss6 = QCheckBox('Condense all Zero units') self.ckcss7 = QCheckBox('Condense Multidimensional Zero units') self.ckcss8 = QCheckBox('Condense Floating point numbers') self.ckcss9 = QCheckBox('Condense HEX Colors') self.ckcss10 = QCheckBox('Condense multiple adjacent Whitespace chars') self.ckcss11 = QCheckBox('Condense multiple adjacent semicolon chars') self.ckcss12 = QCheckBox('Wrap the lines of the to 80 character length') self.ckcss13 = QCheckBox('Condense Font Weight values') self.ckcss14 = QCheckBox('Condense the 17 Standard Named Colors values') self.ckcss15 = QCheckBox('Condense the 124 Extra Named Colors values') self.ckcss16 = QCheckBox('Condense all Percentages values when posible') self.ckcss17 = QCheckBox('Condense all Pixels values when posible') self.ckcss18 = QCheckBox('Remove unnecessary quotes from url()') self.ckcss19 = QCheckBox('Add standard Encoding Declaration if missing') vboxg1 = QVBoxLayout(self.group1) for each_widget in (self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss9, self.ckcss10, self.ckcss11, self.ckcss12, self.ckcss13, self.ckcss14, self.ckcss15, self.ckcss16, self.ckcss17, self.ckcss18, self.ckcss19): vboxg1.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group2 = QGroupBox() self.group2.setTitle(' HTML5 ') self.group2.setCheckable(True) self.group2.setGraphicsEffect(QGraphicsBlurEffect(self)) self.group2.graphicsEffect().setEnabled(False) self.group2.toggled.connect(self.toggle_html_group) self.ckhtml0 = QCheckBox('Condense Style and Script HTML Tags') self.ckhtml1 = QCheckBox('Condense DOCTYPE to new HTML5 Tags') self.ckhtml2 = QCheckBox('Condense Href and Src to protocol agnostic') self.ckhtml4 = QCheckBox('Remove unnecessary Tags but keep HTML valid') self.help1 = QLabel('''<a href= "https://developers.google.com/speed/articles/optimizing-html"> <small><center>Help about Unneeded Unnecessary HTML tags ?</a>''') self.help1.setTextInteractionFlags(Qt.LinksAccessibleByMouse) self.help1.setOpenExternalLinks(True) vboxg2 = QVBoxLayout(self.group2) for each_widget in (self.ckhtml0, self.ckhtml1, self.ckhtml2, self.ckhtml4, self.help1, ): vboxg2.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group3 = QGroupBox() self.group3.setTitle(' Javascript ') self.ckjs0 = QCheckBox('Condense and Compress Javascript') self.ckjs1 = QCheckBox('Condense $(document).ready(function(){ });') vboxg2 = QVBoxLayout(self.group3) for each_widget in (self.ckjs0, self.ckjs1): vboxg2.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) self.group4 = QGroupBox() self.group4.setTitle(' General ') self.chckbx1 = QCheckBox('Lower case ALL the text') self.chckbx2 = QCheckBox('Remove Spaces, Tabs, New Lines, Empty Lines') self.befor, self.after = QProgressBar(), QProgressBar() self.befor.setFormat("%v Chars") self.after.setFormat("%v Chars") vboxg4 = QVBoxLayout(self.group4) for each_widget in (self.chckbx1, self.chckbx2, QLabel('<b>Before:'), self.befor, QLabel('<b>After:'), self.after): vboxg4.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) [a.setChecked(True) for a in iter((self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss9, self.ckcss10, self.ckcss11, self.ckcss12, self.ckcss13, self.ckcss14, self.ckcss15, self.ckcss16, self.ckcss17, self.ckcss18, self.ckcss19, self.ckjs1, self.ckhtml0, self.ckhtml1, self.ckhtml2, self.ckhtml4, self.chckbx1, self.chckbx2))] self.button = QPushButton(QIcon.fromTheme("face-cool"), 'Process Text') self.button.setCursor(QCursor(Qt.PointingHandCursor)) self.button.setMinimumSize(100, 50) self.button.clicked.connect(self.run) def must_glow(widget_list): ' apply an glow effect to the widget ' for glow, each_widget in enumerate(widget_list): try: if each_widget.graphicsEffect() is None: glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) each_widget.setGraphicsEffect(glow) glow.setEnabled(True) except: pass must_glow((self.button, )) class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget((QLabel('<b>HTML5/CSS3/JS Optimizer Compressor'), self.group0, self.group1, self.group2, self.group3, self.group4, self.button, )) self.scrollable = QScrollArea() self.scrollable.setWidgetResizable(True) self.scrollable.setWidget(tw) self.dock = QDockWidget() self.dock.setWindowTitle(__doc__) self.dock.setStyleSheet('QDockWidget::title{text-align: center;}') self.dock.setMinimumWidth(350) self.dock.setWidget(self.scrollable) ec.addTab(self.dock, "Web") QPushButton(QIcon.fromTheme("help-about"), 'About', self.dock ).clicked.connect(lambda: QMessageBox.information(self.dock, __doc__, HELPMSG))
class MyMainWindow(QMainWindow): " Main Window " def __init__(self, parent=None): " Initialize QWidget inside MyMainWindow " super(MyMainWindow, self).__init__(parent) QWidget.__init__(self) self.statusBar().showMessage(" " + __doc__) self.setStyleSheet("QStatusBar{color:grey;}") self.setWindowTitle(__doc__) self.setWindowIcon(QIcon.fromTheme("face-monkey")) self.setFont(QFont("Ubuntu Light", 10)) self.setMaximumSize(QDesktopWidget().screenGeometry().width(), QDesktopWidget().screenGeometry().height()) # directory auto completer self.completer = QCompleter(self) self.dirs = QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) # process self.process = QProcess(self) # self.process.finished.connect(self.on_process_finished) # self.process.error.connect(self.on_process_error) # Proxy support, by reading http_proxy os env variable proxy_url = QUrl(environ.get("http_proxy", "")) QNetworkProxy.setApplicationProxy( QNetworkProxy( QNetworkProxy.HttpProxy if str(proxy_url.scheme()).startswith("http") else QNetworkProxy.Socks5Proxy, proxy_url.host(), proxy_url.port(), proxy_url.userName(), proxy_url.password(), ) ) if "http_proxy" in environ else None print((" INFO: Proxy Auto-Config as " + str(proxy_url))) # basic widgets layouts and set up self.mainwidget = QTabWidget() self.mainwidget.setToolTip(__doc__) self.mainwidget.setMovable(True) self.mainwidget.setTabShape(QTabWidget.Triangular) self.mainwidget.setTabsClosable(True) self.mainwidget.setContextMenuPolicy(Qt.CustomContextMenu) self.mainwidget.tabCloseRequested.connect( lambda: self.mainwidget.setTabPosition(1) if self.mainwidget.tabPosition() == 0 else self.mainwidget.setTabPosition(0) ) self.setCentralWidget(self.mainwidget) self.dock1 = QDockWidget() self.dock2 = QDockWidget() self.dock3 = QDockWidget() for a in (self.dock1, self.dock2, self.dock3): a.setWindowModality(Qt.NonModal) a.setWindowOpacity(0.9) a.setWindowTitle(__doc__ if a.windowTitle() == "" else a.windowTitle()) a.setStyleSheet(" QDockWidget::title{text-align:center;}") a.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.mainwidget.addTab(a, QIcon.fromTheme("face-cool"), str(a.windowTitle()).strip().lower()) # Paleta de colores para pintar transparente self.palette().setBrush(QPalette.Base, Qt.transparent) self.setPalette(self.palette()) self.setAttribute(Qt.WA_OpaquePaintEvent, False) # toolbar and basic actions self.toolbar = QToolBar(self) self.toolbar.setIconSize(QSize(24, 24)) # spacer widget for left self.left_spacer = QWidget(self) self.left_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # spacer widget for right self.right_spacer = QWidget(self) self.right_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) qaqq = QAction(QIcon.fromTheme("application-exit"), "Quit", self) qaqq.setShortcut("Ctrl+Q") qaqq.triggered.connect(exit) qamin = QAction(QIcon.fromTheme("go-down"), "Minimize", self) qamin.triggered.connect(lambda: self.showMinimized()) qamax = QAction(QIcon.fromTheme("go-up"), "Maximize", self) qanor = QAction(QIcon.fromTheme("go-up"), "AutoCenter AutoResize", self) qanor.triggered.connect(self.center) qatim = QAction(QIcon.fromTheme("go-up"), "View Date and Time", self) qatim.triggered.connect(self.timedate) qabug = QAction(QIcon.fromTheme("help-about"), "Report a Problem", self) qabug.triggered.connect( lambda: qabug.setDisabled(True) if not call("xdg-open mailto:" + "*****@*****.**".decode("rot13"), shell=True) else " ERROR " ) qamax.triggered.connect(lambda: self.showMaximized()) qaqt = QAction(QIcon.fromTheme("help-about"), "About Qt", self) qaqt.triggered.connect(lambda: QMessageBox.aboutQt(self)) qaslf = QAction(QIcon.fromTheme("help-about"), "About Self", self) qaslf.triggered.connect( lambda: QMessageBox.about( self.mainwidget, __doc__, "".join( ( __doc__, linesep, "version ", __version__, ", (", __license__, "), by ", __author__, ", ( ", __email__, " )", linesep, ) ), ) ) qasrc = QAction(QIcon.fromTheme("applications-development"), "View Source Code", self) qasrc.triggered.connect(lambda: call("xdg-open " + __file__, shell=1)) qakb = QAction(QIcon.fromTheme("input-keyboard"), "Keyboard Shortcuts", self) qakb.triggered.connect( lambda: QMessageBox.information(self.mainwidget, "Keyboard Shortcuts", " Ctrl+Q = Quit ") ) qapic = QAction(QIcon.fromTheme("camera-photo"), "Take a Screenshot", self) qapic.triggered.connect( lambda: QPixmap.grabWindow(QApplication.desktop().winId()).save( QFileDialog.getSaveFileName( self.mainwidget, " Save Screenshot As ...", path.expanduser("~"), ";;(*.png) PNG", "png" ) ) ) qatb = QAction(QIcon.fromTheme("help-browser"), "Toggle ToolBar", self) qatb.triggered.connect(lambda: self.toolbar.hide() if self.toolbar.isVisible() is True else self.toolbar.show()) qati = QAction(QIcon.fromTheme("help-browser"), "Switch ToolBar Icon Size", self) qati.triggered.connect( lambda: self.toolbar.setIconSize(self.toolbar.iconSize() * 4) if self.toolbar.iconSize().width() * 4 == 24 else self.toolbar.setIconSize(self.toolbar.iconSize() / 4) ) qasb = QAction(QIcon.fromTheme("help-browser"), "Toggle Tabs Bar", self) qasb.triggered.connect( lambda: self.mainwidget.tabBar().hide() if self.mainwidget.tabBar().isVisible() is True else self.mainwidget.tabBar().show() ) qadoc = QAction(QIcon.fromTheme("help-browser"), "On-line Docs", self) qadoc.triggered.connect(lambda: open_new_tab(__url__)) qapy = QAction(QIcon.fromTheme("help-browser"), "About Python", self) qapy.triggered.connect(lambda: open_new_tab("http://python.org/about")) qali = QAction(QIcon.fromTheme("help-browser"), "Read Licence", self) qali.triggered.connect(lambda: open_new_tab(__full_licence__)) qacol = QAction(QIcon.fromTheme("preferences-system"), "Set GUI Colors", self) qacol.triggered.connect( lambda: self.setStyleSheet( """ * { background-color: %s } """ % QColorDialog.getColor().name() ) ) qatit = QAction(QIcon.fromTheme("preferences-system"), "Set the App Window Title", self) qatit.triggered.connect(self.seTitle) qafnt = QAction(QIcon.fromTheme("help-about"), "Set GUI Font", self) if KDE: font = QFont() qafnt.triggered.connect( lambda: self.setStyleSheet("*{font-family: %s}" % font.toString()) if KFontDialog.getFont(font)[0] == QDialog.Accepted else "" ) else: qafnt.triggered.connect( lambda: self.setStyleSheet("*{font-family: %s}" % QFontDialog.getFont()[0].toString()) ) self.toolbar.addWidget(self.left_spacer) self.toolbar.addSeparator() for b in ( qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qatim, qatb, qati, qasb, qatit, qafnt, qapic, qadoc, qali, qaslf, qaqt, qapy, qabug, ): self.toolbar.addAction(b) self.addToolBar(Qt.TopToolBarArea, self.toolbar) self.toolbar.addSeparator() self.toolbar.addWidget(self.right_spacer) def contextMenuRequested(point): " quick and dirty custom context menu " menu = QMenu() menu.addActions( ( qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qati, qasb, qatb, qatim, qatit, qafnt, qapic, qadoc, qali, qaslf, qaqt, qapy, qabug, ) ) menu.exec_(self.mapToGlobal(point)) self.mainwidget.customContextMenuRequested.connect(contextMenuRequested) def must_be_checked(widget_list): " widget tuple passed as argument should be checked as ON " for each_widget in widget_list: try: each_widget.setChecked(True) except: pass def must_have_tooltip(widget_list): " widget tuple passed as argument should have tooltips " for each_widget in widget_list: try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) finally: each_widget.setCursor(QCursor(Qt.PointingHandCursor)) def must_autofillbackground(widget_list): " widget tuple passed as argument should have filled background " for each_widget in widget_list: try: each_widget.setAutoFillBackground(True) except: pass ####################################################################### self.group1 = QGroupBox() self.group1.setTitle(" Blender ") self.arch = QLabel("<center><b>" + architecture()[0]) self.ost = QLabel("<center><b>" + sys.platform) self.downf = QLineEdit(path.join(path.expanduser("~"), "blender")) self.downf.setCompleter(self.completer) self.borig = QPushButton(QIcon.fromTheme("folder-open"), "Open") self.borig.clicked.connect( lambda: self.downf.setText( path.join( str(QFileDialog.getExistingDirectory(self.mainwidget, "Open a Folder", path.expanduser("~"))), "blender", ) ) ) self.bugs = QPushButton(QIcon.fromTheme("help-faq"), "Report Bugs!") self.bugs.clicked.connect(lambda: open_new_tab("http://www.blender.org/development/report-a-bug")) self.go = QPushButton(QIcon.fromTheme("emblem-favorite"), "Run Blender") self.go.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.go.clicked.connect(self.run) vboxg1 = QVBoxLayout(self.group1) for each_widget in ( self.go, QLabel(""), QLabel('<h3 style="color:white;"> Download Folder Path: </h3>'), self.downf, self.borig, QLabel('<h3 style="color:white;"> Bugs: </h3>'), self.bugs, QLabel('<h3 style="color:white;"> OS: </h3>'), self.ost, QLabel('<h3 style="color:white;"> Architexture: </h3>'), self.arch, QLabel( """<i style="color:white;"> Warning: this builds arent as stable as releases, use at your own risk</i>""" ), ): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle("Options") self.nwfl = QCheckBox("Force opening with borders") self.smll = QCheckBox("Auto Center and Auto Resize the Window") self.lrgf = QCheckBox("Start with the console window open") self.case = QCheckBox("BGE: Run on 50 hertz without dropping frames") self.cnvt = QCheckBox("BGE: Use Vertex Arrays for rendering") self.blnk = QCheckBox("BGE: No Texture Mipmapping") self.spac = QCheckBox("BGE: Linear Texture Mipmap instead of Nearest") self.whit = QCheckBox("Turn Debugging ON") self.tabz = QCheckBox("Enable floating point exceptions") self.sprs = QCheckBox("Disable the crash handler") self.filn = QCheckBox("Enable debug messages from FFmpeg library") self.plac = QCheckBox("Enable debug messages for python") self.plac = QCheckBox("Enable debug messages for the event system") self.plac = QCheckBox("Enable debug messages for event handling") self.plac = QCheckBox("Enable debug messages for the window manager") self.tbs = QComboBox(self.group2) self.tbs.addItems(["0", "1", "2", "3"]) self.nice = QComboBox(self.group2) self.nice.addItems(["0", "1", "2", "3"]) vboxg2 = QVBoxLayout(self.group2) for each_widget in ( self.nwfl, self.smll, self.lrgf, self.case, self.cnvt, self.blnk, self.spac, self.whit, self.tabz, self.sprs, self.filn, QLabel("BLAH BLAH BLAH"), self.tbs, QLabel("BLAH BLAH BLAH"), self.nice, ): vboxg2.addWidget(each_widget) group3 = QGroupBox() group3.setTitle("Even More Options") self.plai = QCheckBox("Enable debug messages from libmv library") self.nocr = QCheckBox("Skip reading the startup.blend in the home dir") self.ridt = QCheckBox("Set BLENDER_SYSTEM_DATAFILES environment var") self.nocm = QCheckBox("Set BLENDER_SYSTEM_SCRIPTS environment var") self.rdif = QCheckBox("Set BLENDER_SYSTEM_PYTHON environment var") self.clip = QCheckBox("Disable joystick support") self.noti = QCheckBox("Disable GLSL shading") self.pret = QCheckBox("Force sound system to None") self.lolz = QCheckBox("Disable automatic python script execution") self.odif = QCheckBox("Run blender with an interactive console") self.plac = QCheckBox("Enable all debug messages, excludes libmv") self.plac = QCheckBox("Enable time profiling for background jobs") self.plac = QCheckBox("Do not use native pixel size for high res") self.wdth = QComboBox(group3) self.wdth.addItems(["OPENAL", "NULL", "SDL", "JACK"]) self.bcknd = QComboBox(group3) self.bcknd.addItems(["0", "5", "10", "15", "20"]) vboxg3 = QVBoxLayout(group3) for each_widget in ( self.plai, self.nocr, self.ridt, self.nocm, self.rdif, self.pret, self.clip, self.noti, self.lolz, self.odif, self.plac, QLabel('<b style="color:white">Force sound system to specific device'), self.wdth, QLabel('<b style="color:white">CPU Priority'), self.bcknd, ): vboxg3.addWidget(each_widget) # dock 2 the waterfall scrollable = QScrollArea() scrollable.setWidget(QLabel("".join((urlopen("http://builder.blender.org/waterfall").readlines()[23:])))) self.dock2.setWidget(scrollable) # dock 3 the build status stats = QLabel( "<center>" + "".join((urlopen("http://builder.blender.org/one_line_per_build").readlines()[23:])).strip() + "</center>" ) self.dock3.setWidget(stats) # configure some widget settings must_be_checked((self.nwfl, self.smll, self.lrgf, self.clip, self.cnvt, self.plai, self.noti)) must_have_tooltip( ( self.plai, self.nocr, self.ridt, self.nocm, self.rdif, self.pret, self.clip, self.noti, self.lolz, self.odif, self.plac, self.wdth, self.bcknd, self.nwfl, self.smll, self.lrgf, self.case, self.cnvt, self.blnk, self.spac, self.whit, self.tabz, self.sprs, self.filn, self.tbs, self.nice, self.arch, self.ost, ) ) must_autofillbackground( ( self.plai, self.nocr, self.ridt, self.nocm, self.rdif, self.pret, self.clip, self.noti, self.lolz, self.odif, self.plac, self.wdth, self.bcknd, self.nwfl, self.smll, self.lrgf, self.case, self.cnvt, self.blnk, self.spac, self.whit, self.tabz, self.sprs, self.filn, self.tbs, self.nice, scrollable, stats, self.arch, self.ost, ) ) container = QWidget() hbox = QHBoxLayout(container) for each_widget in (self.group2, self.group1, group3): hbox.addWidget(each_widget) self.dock1.setWidget(container) def run(self): " run the actual conversion " print((" INFO: Working at " + str(datetime.now()))) print(" INFO: Loading Blender awesomeness . . . ") self.go.setDisabled(True) # create the output directory try: mkdir(str(self.downf.text())) print((" INFO: Preparing Directory " + str(self.downf.text()))) except: print((" INFO: Preparing Directory " + str(self.downf.text()))) # parse local system architecture architecturez = "x86_64" if "64bit" in architecture()[0] else "i686" print((" INFO: System Architecture is " + architecturez)) # parse remote blender filename blenderfile = [ a.strip().lower().replace('<td><a href="', "").replace("</a></td>", "").split('">')[0] for a in urlopen("http://builder.blender.org/download/").readlines()[40:80] if '<td><a href="blender-' in a and sub("[^a-z]", "", str(sys.platform).lower()) in a and architecturez in a ][0] print((" INFO: System OS is " + sys.platform)) print((" INFO: Blender Remote Filename is " + blenderfile)) if path.isfile(path.join(str(self.downf.text()), blenderfile)): print((" INFO: Blender Local Filename is " + blenderfile)) print(" INFO: Local and Remote Files are similar, Skiping Download") else: print(" INFO: Local and Remote Files differ, Requesting Download") print((" INFO: URL is builder.blender.org/download/" + blenderfile)) # get the file downloader = Downloader( self.mainwidget, "http://builder.blender.org/download/" + blenderfile, str(self.downf.text()) ) downloader.show() ########################################################################### def paintEvent(self, event): "Paint semi-transparent background, animated pattern, background text" # because we are on 2012 !, its time to showcase how Qt we are ! QWidget.paintEvent(self, event) # make a painter p = QPainter(self) p.setRenderHint(QPainter.TextAntialiasing) p.setRenderHint(QPainter.HighQualityAntialiasing) # fill a rectangle with transparent painting p.fillRect(event.rect(), Qt.transparent) # animated random dots background pattern for i in range(8192): x = randint(9, self.size().width() - 9) y = randint(9, self.size().height() - 9) p.setPen(QPen(QColor(randint(9, 255), randint(9, 255), 255), 1)) p.drawPoint(x, y) # set pen to use white color p.setPen(QPen(QColor(randint(9, 255), randint(9, 255), 255), 1)) # Rotate painter 45 Degree p.rotate(30) # Set painter Font for text p.setFont(QFont("Ubuntu", 200)) # draw the background text, with antialiasing p.drawText(99, 99, "Blender") # Rotate -45 the QPen back ! p.rotate(-30) # set the pen to no pen p.setPen(Qt.NoPen) # Background Color p.setBrush(QColor(0, 0, 0)) # Background Opacity p.setOpacity(0.75) # Background Rounded Borders p.drawRoundedRect(self.rect(), 50, 50) # finalize the painter p.end() def seTitle(self): " set the title of the main window " dialog = QDialog(self) textEditInput = QLineEdit(" Type Title Here ") ok = QPushButton(" O K ") ok.clicked.connect(lambda: self.setWindowTitle(textEditInput.text())) ly = QVBoxLayout() [ly.addWidget(wdgt) for wdgt in (QLabel("Title:"), textEditInput, ok)] dialog.setLayout(ly) dialog.exec_() def timedate(self): " get the time and date " dialog = QDialog(self) clock = QLCDNumber() clock.setNumDigits(24) timer = QTimer() timer.timeout.connect(lambda: clock.display(datetime.now().strftime("%d-%m-%Y %H:%M:%S %p"))) timer.start(1000) clock.setToolTip(datetime.now().strftime("%c %x")) ok = QPushButton(" O K ") ok.clicked.connect(dialog.close) ly = QVBoxLayout() [ly.addWidget(wdgt) for wdgt in (QCalendarWidget(), clock, ok)] dialog.setLayout(ly) dialog.exec_() def closeEvent(self, event): " Ask to Quit " if ( QMessageBox.question(self, " Close ", " Quit ? ", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.Yes ): event.accept() else: event.ignore() def center(self): " Center and resize the window " self.resize( QDesktopWidget().screenGeometry().width() // 1.25, QDesktopWidget().screenGeometry().height() // 1.25 ) qr = self.frameGeometry() qr.moveCenter(QDesktopWidget().availableGeometry().center()) self.move(qr.topLeft())
def initialize(self, *args, **kwargs): " Init Main Class " ec = ExplorerContainer() super(Main, self).initialize(*args, **kwargs) # directory auto completer self.completer, self.dirs = QCompleter(self), QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.RUNS, self.FAILS = 0, 0 self.group0 = QGroupBox() self.group0.setTitle(' Source and Target ') self.baseurl = QLineEdit('http://google.com') self.outfile = QLineEdit(path.join(path.expanduser("~"), 'test.py')) self.outfile.setCompleter(self.completer) self.open = QPushButton(QIcon.fromTheme("folder-open"), 'Open') self.open.clicked.connect(lambda: self.outfile.setText( QFileDialog.getSaveFileName(self.dock, "Save", path.expanduser( "~"), 'PYTHON(*.py)'))) vboxg0 = QVBoxLayout(self.group0) for each_widget in (QLabel('<b>Base URL'), self.baseurl, QLabel('<b>Local File Target'), self.outfile, self.open): vboxg0.addWidget(each_widget) self.group1 = QGroupBox() self.group1.setTitle(' Selenium ') self.group1.setCheckable(True) self.group1.setGraphicsEffect(QGraphicsBlurEffect(self)) self.group1.graphicsEffect().setEnabled(False) self.group1.toggled.connect(self.toggle_group) self.ckcss1 = QCheckBox('Test for correct Page Loading behaviour') self.ckcss2 = QCheckBox('Test for Sucessfull Status Code return') self.ckcss3 = QCheckBox('Test for valid Title of the web page') self.ckcss4 = QCheckBox('Test for Cookies Basic functionality') self.ckcss5 = QCheckBox('Test for Back, Forward, Reload behaviour') self.ckcss6 = QCheckBox('Take a Screenshot of page (CSS Debug)') self.ckcss7 = QCheckBox('Test for Search Form Field of the page') self.ckcss8 = QCheckBox( 'Test for Arbitrary Javascript (User provided)') self.ckcss9 = QCheckBox('Test for iFrame of the web page') self.ckcss10 = QCheckBox('Test for HTML5 Canvas element on the page') self.ckcss11 = QCheckBox('Test for HTML5 SVG element on the page') self.ckcss12 = QCheckBox('Test for HTML5 Audio element on the page') self.ckcss13 = QCheckBox('Test for HTML5 Video element on the page') self.ckcss14 = QCheckBox('Test for File Upload form on the page') self.ckcss15 = QCheckBox('Add ChromeDriver path to sys.path') self.webdriver = QComboBox() self.webdriver.addItems( ['firefox', 'chrome', 'zope.testbrowser', 'phantomjs']) self.titletxt = QLineEdit('Google') self.javascript = QLineEdit('console.log("test")') self.authdata, self.formdata = QLineEdit(), QLineEdit() self.authdata.setPlaceholderText( "{'username':'******','password':'******'}") self.formdata.setPlaceholderText("{'name': 'Joe', 'age': '25'}") self.iframurl = QLineEdit() self.chrmedrv = QLineEdit('/usr/bin/chromedriver') self.timeout = QSpinBox() self.timeout.setMaximum(99) self.timeout.setMinimum(0) self.timeout.setValue(9) vboxg1 = QVBoxLayout(self.group1) for each_widget in ( self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss9, self.ckcss10, self.ckcss11, self.ckcss12, self.ckcss13, self.ckcss14, self.ckcss15, QLabel('<b>WebDriver'), self.webdriver, QLabel('''<center><small><i>Firefox is only Driver that dont require additional configuration'''), QLabel('<b>Title Content must contain'), self.titletxt, QLabel('<b>Minified Javascript for Test'), self.javascript, QLabel('<b>Arbitrary Authentication Data for Test'), self.authdata, QLabel('<b>Arbitrary Form Data for Test'), self.formdata, QLabel('<b>iFrame URL for Test'), self.iframurl, QLabel('<b>Chrome Driver'), self.chrmedrv, QLabel('<b>Timeout Timer Limit'), self.timeout): vboxg1.addWidget(each_widget) try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) self.group4 = QGroupBox() self.group4.setTitle(' General ') self.chckbx1 = QCheckBox('Run the Tests after Writing') self.chckbx2 = QCheckBox('Open the Tests with Ninja after Writing') self.chckbx3 = QCheckBox('Add SheBang, Encoding and Metadata to Tests') self.nice = QSpinBox() self.nice.setMaximum(20) self.nice.setMinimum(0) self.nice.setValue(20) self.help1 = QLabel( '''<a href="http://splinter.cobrateam.info/docs/api" ><center><b>API Reference</a>''') self.help1.setTextInteractionFlags(Qt.LinksAccessibleByMouse) self.help1.setOpenExternalLinks(True) vboxg4 = QVBoxLayout(self.group4) for each_widget in (self.chckbx1, self.chckbx2, self.chckbx3, QLabel('Backend CPU priority:'), self.nice, self.help1): vboxg4.addWidget(each_widget) each_widget.setToolTip(each_widget.text()) [ a.setChecked(True) for a in (self.ckcss1, self.ckcss2, self.ckcss3, self.ckcss4, self.ckcss5, self.ckcss6, self.ckcss7, self.ckcss8, self.ckcss15, self.chckbx1, self.chckbx2, self.chckbx3) ] self.button = QPushButton(QIcon.fromTheme("face-cool"), 'Write and Run Test') self.button.setCursor(QCursor(Qt.PointingHandCursor)) self.button.setMinimumSize(100, 50) self.button.clicked.connect(self.run) glow = QGraphicsDropShadowEffect(self) glow.setOffset(0) glow.setBlurRadius(99) glow.setColor(QColor(99, 255, 255)) self.button.setGraphicsEffect(glow) glow.setEnabled(True) self.output = QPlainTextEdit() self.runs = QLabel('<font color="green"><b>Runs: 0') self.failures = QLabel('<font color="red"><b>Failures: 0') class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget( (QLabel('<b>Selenium Tests'), self.group0, self.group1, self.group4, QLabel('<b>Log'), self.output, self.runs, self.failures, self.button)) self.scrollable, self.dock = QScrollArea(), QDockWidget() self.scrollable.setWidgetResizable(True) self.scrollable.setWidget(tw) self.dock.setWindowTitle(__doc__) self.dock.setStyleSheet('QDockWidget::title{text-align: center;}') self.dock.setWidget(self.scrollable) ec.addTab(self.dock, "Selenium") QPushButton( QIcon.fromTheme("help-about"), 'About', self.dock).clicked.connect( lambda: QMessageBox.information(self.dock, __doc__, HELPMSG)) QPushButton( QIcon.fromTheme("media-record"), 'Record', self.group1, ).clicked.connect(lambda: QMessageBox.information( self.dock, __doc__, 'Not working. If you know how to make it Record, send me Pull Request' ))
def __init__(self, parent=None): " Initialize QWidget inside MyMainWindow " super(MyMainWindow, self).__init__(parent) QWidget.__init__(self) self.statusBar().showMessage(" " + __doc__) self.setStyleSheet("QStatusBar{color:grey;}") self.setWindowTitle(__doc__) self.setWindowIcon(QIcon.fromTheme("face-monkey")) self.setFont(QFont("Ubuntu Light", 10)) self.setMaximumSize(QDesktopWidget().screenGeometry().width(), QDesktopWidget().screenGeometry().height()) # directory auto completer self.completer = QCompleter(self) self.dirs = QDirModel(self) self.dirs.setFilter(QDir.AllEntries | QDir.NoDotAndDotDot) self.completer.setModel(self.dirs) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(QCompleter.PopupCompletion) # process self.process = QProcess(self) # self.process.finished.connect(self.on_process_finished) # self.process.error.connect(self.on_process_error) # Proxy support, by reading http_proxy os env variable proxy_url = QUrl(environ.get("http_proxy", "")) QNetworkProxy.setApplicationProxy( QNetworkProxy( QNetworkProxy.HttpProxy if str(proxy_url.scheme()).startswith("http") else QNetworkProxy.Socks5Proxy, proxy_url.host(), proxy_url.port(), proxy_url.userName(), proxy_url.password(), ) ) if "http_proxy" in environ else None print((" INFO: Proxy Auto-Config as " + str(proxy_url))) # basic widgets layouts and set up self.mainwidget = QTabWidget() self.mainwidget.setToolTip(__doc__) self.mainwidget.setMovable(True) self.mainwidget.setTabShape(QTabWidget.Triangular) self.mainwidget.setTabsClosable(True) self.mainwidget.setContextMenuPolicy(Qt.CustomContextMenu) self.mainwidget.tabCloseRequested.connect( lambda: self.mainwidget.setTabPosition(1) if self.mainwidget.tabPosition() == 0 else self.mainwidget.setTabPosition(0) ) self.setCentralWidget(self.mainwidget) self.dock1 = QDockWidget() self.dock2 = QDockWidget() self.dock3 = QDockWidget() for a in (self.dock1, self.dock2, self.dock3): a.setWindowModality(Qt.NonModal) a.setWindowOpacity(0.9) a.setWindowTitle(__doc__ if a.windowTitle() == "" else a.windowTitle()) a.setStyleSheet(" QDockWidget::title{text-align:center;}") a.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.mainwidget.addTab(a, QIcon.fromTheme("face-cool"), str(a.windowTitle()).strip().lower()) # Paleta de colores para pintar transparente self.palette().setBrush(QPalette.Base, Qt.transparent) self.setPalette(self.palette()) self.setAttribute(Qt.WA_OpaquePaintEvent, False) # toolbar and basic actions self.toolbar = QToolBar(self) self.toolbar.setIconSize(QSize(24, 24)) # spacer widget for left self.left_spacer = QWidget(self) self.left_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # spacer widget for right self.right_spacer = QWidget(self) self.right_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) qaqq = QAction(QIcon.fromTheme("application-exit"), "Quit", self) qaqq.setShortcut("Ctrl+Q") qaqq.triggered.connect(exit) qamin = QAction(QIcon.fromTheme("go-down"), "Minimize", self) qamin.triggered.connect(lambda: self.showMinimized()) qamax = QAction(QIcon.fromTheme("go-up"), "Maximize", self) qanor = QAction(QIcon.fromTheme("go-up"), "AutoCenter AutoResize", self) qanor.triggered.connect(self.center) qatim = QAction(QIcon.fromTheme("go-up"), "View Date and Time", self) qatim.triggered.connect(self.timedate) qabug = QAction(QIcon.fromTheme("help-about"), "Report a Problem", self) qabug.triggered.connect( lambda: qabug.setDisabled(True) if not call("xdg-open mailto:" + "*****@*****.**".decode("rot13"), shell=True) else " ERROR " ) qamax.triggered.connect(lambda: self.showMaximized()) qaqt = QAction(QIcon.fromTheme("help-about"), "About Qt", self) qaqt.triggered.connect(lambda: QMessageBox.aboutQt(self)) qaslf = QAction(QIcon.fromTheme("help-about"), "About Self", self) qaslf.triggered.connect( lambda: QMessageBox.about( self.mainwidget, __doc__, "".join( ( __doc__, linesep, "version ", __version__, ", (", __license__, "), by ", __author__, ", ( ", __email__, " )", linesep, ) ), ) ) qasrc = QAction(QIcon.fromTheme("applications-development"), "View Source Code", self) qasrc.triggered.connect(lambda: call("xdg-open " + __file__, shell=1)) qakb = QAction(QIcon.fromTheme("input-keyboard"), "Keyboard Shortcuts", self) qakb.triggered.connect( lambda: QMessageBox.information(self.mainwidget, "Keyboard Shortcuts", " Ctrl+Q = Quit ") ) qapic = QAction(QIcon.fromTheme("camera-photo"), "Take a Screenshot", self) qapic.triggered.connect( lambda: QPixmap.grabWindow(QApplication.desktop().winId()).save( QFileDialog.getSaveFileName( self.mainwidget, " Save Screenshot As ...", path.expanduser("~"), ";;(*.png) PNG", "png" ) ) ) qatb = QAction(QIcon.fromTheme("help-browser"), "Toggle ToolBar", self) qatb.triggered.connect(lambda: self.toolbar.hide() if self.toolbar.isVisible() is True else self.toolbar.show()) qati = QAction(QIcon.fromTheme("help-browser"), "Switch ToolBar Icon Size", self) qati.triggered.connect( lambda: self.toolbar.setIconSize(self.toolbar.iconSize() * 4) if self.toolbar.iconSize().width() * 4 == 24 else self.toolbar.setIconSize(self.toolbar.iconSize() / 4) ) qasb = QAction(QIcon.fromTheme("help-browser"), "Toggle Tabs Bar", self) qasb.triggered.connect( lambda: self.mainwidget.tabBar().hide() if self.mainwidget.tabBar().isVisible() is True else self.mainwidget.tabBar().show() ) qadoc = QAction(QIcon.fromTheme("help-browser"), "On-line Docs", self) qadoc.triggered.connect(lambda: open_new_tab(__url__)) qapy = QAction(QIcon.fromTheme("help-browser"), "About Python", self) qapy.triggered.connect(lambda: open_new_tab("http://python.org/about")) qali = QAction(QIcon.fromTheme("help-browser"), "Read Licence", self) qali.triggered.connect(lambda: open_new_tab(__full_licence__)) qacol = QAction(QIcon.fromTheme("preferences-system"), "Set GUI Colors", self) qacol.triggered.connect( lambda: self.setStyleSheet( """ * { background-color: %s } """ % QColorDialog.getColor().name() ) ) qatit = QAction(QIcon.fromTheme("preferences-system"), "Set the App Window Title", self) qatit.triggered.connect(self.seTitle) qafnt = QAction(QIcon.fromTheme("help-about"), "Set GUI Font", self) if KDE: font = QFont() qafnt.triggered.connect( lambda: self.setStyleSheet("*{font-family: %s}" % font.toString()) if KFontDialog.getFont(font)[0] == QDialog.Accepted else "" ) else: qafnt.triggered.connect( lambda: self.setStyleSheet("*{font-family: %s}" % QFontDialog.getFont()[0].toString()) ) self.toolbar.addWidget(self.left_spacer) self.toolbar.addSeparator() for b in ( qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qatim, qatb, qati, qasb, qatit, qafnt, qapic, qadoc, qali, qaslf, qaqt, qapy, qabug, ): self.toolbar.addAction(b) self.addToolBar(Qt.TopToolBarArea, self.toolbar) self.toolbar.addSeparator() self.toolbar.addWidget(self.right_spacer) def contextMenuRequested(point): " quick and dirty custom context menu " menu = QMenu() menu.addActions( ( qaqq, qamin, qanor, qamax, qasrc, qakb, qacol, qati, qasb, qatb, qatim, qatit, qafnt, qapic, qadoc, qali, qaslf, qaqt, qapy, qabug, ) ) menu.exec_(self.mapToGlobal(point)) self.mainwidget.customContextMenuRequested.connect(contextMenuRequested) def must_be_checked(widget_list): " widget tuple passed as argument should be checked as ON " for each_widget in widget_list: try: each_widget.setChecked(True) except: pass def must_have_tooltip(widget_list): " widget tuple passed as argument should have tooltips " for each_widget in widget_list: try: each_widget.setToolTip(each_widget.text()) except: each_widget.setToolTip(each_widget.currentText()) finally: each_widget.setCursor(QCursor(Qt.PointingHandCursor)) def must_autofillbackground(widget_list): " widget tuple passed as argument should have filled background " for each_widget in widget_list: try: each_widget.setAutoFillBackground(True) except: pass ####################################################################### self.group1 = QGroupBox() self.group1.setTitle(" Blender ") self.arch = QLabel("<center><b>" + architecture()[0]) self.ost = QLabel("<center><b>" + sys.platform) self.downf = QLineEdit(path.join(path.expanduser("~"), "blender")) self.downf.setCompleter(self.completer) self.borig = QPushButton(QIcon.fromTheme("folder-open"), "Open") self.borig.clicked.connect( lambda: self.downf.setText( path.join( str(QFileDialog.getExistingDirectory(self.mainwidget, "Open a Folder", path.expanduser("~"))), "blender", ) ) ) self.bugs = QPushButton(QIcon.fromTheme("help-faq"), "Report Bugs!") self.bugs.clicked.connect(lambda: open_new_tab("http://www.blender.org/development/report-a-bug")) self.go = QPushButton(QIcon.fromTheme("emblem-favorite"), "Run Blender") self.go.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.go.clicked.connect(self.run) vboxg1 = QVBoxLayout(self.group1) for each_widget in ( self.go, QLabel(""), QLabel('<h3 style="color:white;"> Download Folder Path: </h3>'), self.downf, self.borig, QLabel('<h3 style="color:white;"> Bugs: </h3>'), self.bugs, QLabel('<h3 style="color:white;"> OS: </h3>'), self.ost, QLabel('<h3 style="color:white;"> Architexture: </h3>'), self.arch, QLabel( """<i style="color:white;"> Warning: this builds arent as stable as releases, use at your own risk</i>""" ), ): vboxg1.addWidget(each_widget) self.group2 = QGroupBox() self.group2.setTitle("Options") self.nwfl = QCheckBox("Force opening with borders") self.smll = QCheckBox("Auto Center and Auto Resize the Window") self.lrgf = QCheckBox("Start with the console window open") self.case = QCheckBox("BGE: Run on 50 hertz without dropping frames") self.cnvt = QCheckBox("BGE: Use Vertex Arrays for rendering") self.blnk = QCheckBox("BGE: No Texture Mipmapping") self.spac = QCheckBox("BGE: Linear Texture Mipmap instead of Nearest") self.whit = QCheckBox("Turn Debugging ON") self.tabz = QCheckBox("Enable floating point exceptions") self.sprs = QCheckBox("Disable the crash handler") self.filn = QCheckBox("Enable debug messages from FFmpeg library") self.plac = QCheckBox("Enable debug messages for python") self.plac = QCheckBox("Enable debug messages for the event system") self.plac = QCheckBox("Enable debug messages for event handling") self.plac = QCheckBox("Enable debug messages for the window manager") self.tbs = QComboBox(self.group2) self.tbs.addItems(["0", "1", "2", "3"]) self.nice = QComboBox(self.group2) self.nice.addItems(["0", "1", "2", "3"]) vboxg2 = QVBoxLayout(self.group2) for each_widget in ( self.nwfl, self.smll, self.lrgf, self.case, self.cnvt, self.blnk, self.spac, self.whit, self.tabz, self.sprs, self.filn, QLabel("BLAH BLAH BLAH"), self.tbs, QLabel("BLAH BLAH BLAH"), self.nice, ): vboxg2.addWidget(each_widget) group3 = QGroupBox() group3.setTitle("Even More Options") self.plai = QCheckBox("Enable debug messages from libmv library") self.nocr = QCheckBox("Skip reading the startup.blend in the home dir") self.ridt = QCheckBox("Set BLENDER_SYSTEM_DATAFILES environment var") self.nocm = QCheckBox("Set BLENDER_SYSTEM_SCRIPTS environment var") self.rdif = QCheckBox("Set BLENDER_SYSTEM_PYTHON environment var") self.clip = QCheckBox("Disable joystick support") self.noti = QCheckBox("Disable GLSL shading") self.pret = QCheckBox("Force sound system to None") self.lolz = QCheckBox("Disable automatic python script execution") self.odif = QCheckBox("Run blender with an interactive console") self.plac = QCheckBox("Enable all debug messages, excludes libmv") self.plac = QCheckBox("Enable time profiling for background jobs") self.plac = QCheckBox("Do not use native pixel size for high res") self.wdth = QComboBox(group3) self.wdth.addItems(["OPENAL", "NULL", "SDL", "JACK"]) self.bcknd = QComboBox(group3) self.bcknd.addItems(["0", "5", "10", "15", "20"]) vboxg3 = QVBoxLayout(group3) for each_widget in ( self.plai, self.nocr, self.ridt, self.nocm, self.rdif, self.pret, self.clip, self.noti, self.lolz, self.odif, self.plac, QLabel('<b style="color:white">Force sound system to specific device'), self.wdth, QLabel('<b style="color:white">CPU Priority'), self.bcknd, ): vboxg3.addWidget(each_widget) # dock 2 the waterfall scrollable = QScrollArea() scrollable.setWidget(QLabel("".join((urlopen("http://builder.blender.org/waterfall").readlines()[23:])))) self.dock2.setWidget(scrollable) # dock 3 the build status stats = QLabel( "<center>" + "".join((urlopen("http://builder.blender.org/one_line_per_build").readlines()[23:])).strip() + "</center>" ) self.dock3.setWidget(stats) # configure some widget settings must_be_checked((self.nwfl, self.smll, self.lrgf, self.clip, self.cnvt, self.plai, self.noti)) must_have_tooltip( ( self.plai, self.nocr, self.ridt, self.nocm, self.rdif, self.pret, self.clip, self.noti, self.lolz, self.odif, self.plac, self.wdth, self.bcknd, self.nwfl, self.smll, self.lrgf, self.case, self.cnvt, self.blnk, self.spac, self.whit, self.tabz, self.sprs, self.filn, self.tbs, self.nice, self.arch, self.ost, ) ) must_autofillbackground( ( self.plai, self.nocr, self.ridt, self.nocm, self.rdif, self.pret, self.clip, self.noti, self.lolz, self.odif, self.plac, self.wdth, self.bcknd, self.nwfl, self.smll, self.lrgf, self.case, self.cnvt, self.blnk, self.spac, self.whit, self.tabz, self.sprs, self.filn, self.tbs, self.nice, scrollable, stats, self.arch, self.ost, ) ) container = QWidget() hbox = QHBoxLayout(container) for each_widget in (self.group2, self.group1, group3): hbox.addWidget(each_widget) self.dock1.setWidget(container)
class filexplorerPluginMain(plugin.Plugin): ' main class for plugin ' def initialize(self, *args, **kwargs): ' class init ' global CONFIG_DIR ec = ExplorerContainer() super(filexplorerPluginMain, self).initialize(*args, **kwargs) self.dock = QDockWidget() self.dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.dock.setFeatures(QDockWidget.DockWidgetFloatable | QDockWidget.DockWidgetMovable) self.dock.setWindowTitle("fileXplorer") self.dock.setStyleSheet('QDockWidget::title { text-align: center; }') # search for the truth self.srch = QLineEdit() #self.srch.resize(self.srch.size().height(), self.dock.size().width()) self.srch.setPlaceholderText(' Search for Python files Local or PyPI ') self.srch.returnPressed.connect(self.search) # Disk Usage Bar self.hdbar = QProgressBar() if sys.platform != 'win32': self.hdbar.setMaximum(statvfs(HOME).f_blocks * statvfs(HOME).f_frsize / 1024 / 1024 / 1024) self.hdbar.setValue(statvfs(HOME).f_bfree * statvfs(HOME).f_frsize / 1024 / 1024 / 1024) self.hdbar.setToolTip(str(self.hdbar.value()) + '% Total Disk Use ') #self.hdbar.setStyleSheet('''QProgressBar{background-color: #QLinearGradient(spread:pad,x1:0,y1:0,x2:1,y2:1,stop:0 rgba(255,0,0,99), #stop:1 rgba(9,255,9,200));color:#fff;border:none;border-radius:9px;} #QProgressBar::chunk{background-color:QLinearGradient(spread:pad,y1:0, #x1:0,y2:1,x2:0.27,stop:0 rgb(0,0,0),stop:1 rgb(9,99,255));padding:0; #border:none;border-radius:9px;height:9px;margin:1px;}''') self.model = QDirModel() self.fileView = QColumnView(self.dock) self.fileView.setAlternatingRowColors(True) # self.fileView.setFont(QFont(self.fileView.font().setBold(True))) self.fileView.setIconSize(QSize(32, 32)) self.fileView.setModel(self.model) self.fileView.updatePreviewWidget.connect(self.runfile) self.sli = QSlider() self.sli.setRange(16, 128) self.sli.setValue(32) self.sli.setToolTip('Icon Size: 32 px. Move Slider to change.') self.sli.setOrientation(Qt.Horizontal) self.sli.valueChanged.connect(lambda: self.fileView.setIconSize( QSize(self.sli.value(), self.sli.value()))) self.sli.sliderReleased.connect(lambda: self.sli.setToolTip('Icon Size: ' + str(self.sli.value()))) class TransientWidget(QWidget): ' persistant widget thingy ' def __init__(self, widget_list): ' init sub class ' super(TransientWidget, self).__init__() vbox = QVBoxLayout(self) for each_widget in widget_list: vbox.addWidget(each_widget) tw = TransientWidget((self.srch, self.dock, self.sli, self.hdbar)) ec.addTab(tw, "fileXplorer") #### self.process = QProcess() self.process.finished.connect(self.processFinished) self.preview = QLabel(self.fileView) self.preview.setTextFormat(0) self.preview.setStyleSheet('QLabel{font-size:9px;}') self.preview.setAutoFillBackground(True) self.fileView.setPreviewWidget(self.preview) self.dock.setWidget(self.fileView) # take a shot self.pic = QAction(QIcon.fromTheme("camera-photo"), 'Screenshot', self) self.pic.triggered.connect(lambda: QPixmap.grabWindow( QApplication.desktop().winId()).save(QFileDialog.getSaveFileName( self.dock, " Save Screenshot As ... ", HOME, ';;(*.png)'))) # copy time self.tim = QAction(QIcon.fromTheme("user-away"), 'Date and Time to Clipboard', self) self.tim.triggered.connect(lambda: QApplication.clipboard().setText( datetime.now().strftime(" %A %B %d-%m-%Y %H:%M:%S %p "))) # color chooser self.cl = QAction(QIcon.fromTheme("applications-graphics"), 'Color Chooser to Clipboard', self) self.cl.triggered.connect(lambda: QApplication.clipboard().setText( '{}'.format(QColorDialog.getColor().name()))) # icon chooser self.icn = QAction(QIcon.fromTheme("insert-image"), 'Icon Chooser to Clipboard', self) self.icn.triggered.connect(self.iconChooser) # tool bar with actions QToolBar(self.dock).addActions((self.cl, self.icn, self.tim, self.pic)) self.textBrowser = QTextBrowser(self.dock) self.textBrowser.setAutoFillBackground(True) self.textBrowser.setGeometry(self.dock.geometry()) self.textBrowser.hide() def processFinished(self): ' print info of finished processes ' print(" INFO: OK: QProcess finished . . . ") def search(self): ' function to search python files ' # get search results of python filenames local or remote pypi_url = 'http://pypi.python.org/pypi' # pypi query pypi = xmlrpclib.ServerProxy(pypi_url, transport=ProxyTransport()) try: pypi_query = pypi.search({'name': str(self.srch.text()).lower()}) pypi_fls = list(set(['pypi.python.org/pypi/' + a['name'] + ' | pip install ' + a['name'] for a in pypi_query])) except: pypi_fls = '<b> ERROR: Internet not available! ಠ_ಠ </b>' s_out = ('<br> <br> <br> <h3> Search Local Python files: </h3> <hr> ' + # Jedi list comprehension for LOCAL search str(["{}/{}".format(root, f) for root, f in list(itertools.chain(* [list(itertools.product([root], files)) for root, dirs, files in walk(str( QFileDialog.getExistingDirectory(self.dock, 'Open Directory to Search', path.expanduser("~"))))])) if f.endswith(('.py', '.pyw', '.pth')) and not f.startswith('.') and str(self.srch.text()).lower().strip() in f] ).replace(',', '<br>') + '<hr><h3> Search PyPI Python files: </h3>' + # wraped pypi query REMOTE search str(pypi_fls).replace(',', '<br>') + '<hr>Auto-Proxy:ON,DoNotTrack:ON') # print(s_out) try: call('notify-send fileXplorer Searching...', shell=True) except: pass self.srch.clear() self.textBrowser.setGeometry(self.dock.geometry()) self.textBrowser.setHtml(s_out) self.textBrowser.show() tmr = QTimer(self.fileView) tmr.timeout.connect(self.textBrowser.hide) tmr.start(20000) def iconChooser(self): ' Choose a Icon and copy it to clipboard ' # from .std_icon_naming import std_icon_naming as a # prv = QDialog(self.dock) prv.setWindowFlags(Qt.FramelessWindowHint) prv.setAutoFillBackground(True) prv.setGeometry(self.fileView.geometry()) table = QTableWidget(prv) table.setColumnCount(1) table.setRowCount(len(a)) table.verticalHeader().setVisible(True) table.horizontalHeader().setVisible(False) table.setShowGrid(True) table.setIconSize(QSize(128, 128)) for index, icon in enumerate(a): item = QTableWidgetItem(QIcon.fromTheme(icon), '') # item.setData(Qt.UserRole, '') item.setToolTip(icon) table.setItem(index, 0, item) table.clicked.connect(lambda: QApplication.clipboard().setText( 'QtGui.QIcon.fromTheme("{}")'.format(table.currentItem().toolTip()))) table.doubleClicked.connect(prv.close) table.resizeColumnsToContents() table.resizeRowsToContents() QLabel('<h3> <br> 1 Click Copy, 2 Clicks Close </h3>', table) table.resize(prv.size()) prv.exec_() def runfile(self, index): ' run the choosed file ' s = str(file(self.model.filePath(index), 'r').read().strip()) f = str(self.model.filePath(index)) # ctime is NOT crossplatform,metadata change on *nix,creation on Window # http://docs.python.org/library/os.path.html#os.path.getctime m = ''.join((f, N, str(path.getsize(f) / 1024), ' Kilobytes', N, str(len(file(f, 'r').readlines())), ' Lines', N, str(len(s.replace(N, ''))), ' Characters', N, str(len([a for a in sub('[^a-zA-Z0-9 ]', '', s).split(' ') if a != ''])), ' Words', N, str(len([a for a in s if a in punctuation])), ' Punctuation', N, oct(stat(f).st_mode)[-3:], ' Permissions', N, time.ctime(path.getatime(f)), ' Accessed', N, time.ctime(path.getmtime(f)), ' Modified', N, 'Owner: ', str(self.model.fileInfo(index).owner()), N, 'Is Writable: ', str(self.model.fileInfo(index).isWritable()), N, 'Is Executable: ', str(self.model.fileInfo(index).isExecutable()), N, 'Is Hidden: ', str(self.model.fileInfo(index).isHidden()), N, 'Is SymLink: ', str(self.model.fileInfo(index).isSymLink()), N, 'File Extension: ', str(self.model.fileInfo(index).suffix()) )) #print(m) self.preview.setToolTip(m) self.preview.setText(s) self.preview.resize(self.preview.size().width(), self.dock.size().height()) self.process.start('xdg-open {}'.format(f)) if not self.process.waitForStarted(): print((" ERROR: Process {} Failed ! ".format(str(f)))) return
def __init__(self, parent): super(ProjectExecution, self).__init__() self._parent = parent grid = QGridLayout(self) grid.addWidget(QLabel(translations.TR_PROJECT_MAIN_FILE), 0, 0) self.path = QLineEdit() self.path.setPlaceholderText( os.path.join(os.path.expanduser("~"), 'path', 'to', 'main.py')) ui_tools.LineEditButton( self.path, self.path.clear, self.style().standardPixmap(self.style().SP_TrashIcon)) self.path.setText(self._parent.project.main_file) self.path.setReadOnly(True) self.btnBrowse = QPushButton( QIcon(self.style().standardPixmap(self.style().SP_FileIcon)), '') grid.addWidget(self.path, 0, 1) grid.addWidget(self.btnBrowse, 0, 2) # this should be changed, and ALL pythonPath names to # python_custom_interpreter or something like that. this is NOT the # PYTHONPATH self.txtPythonInterpreter = QLineEdit() self.txtPythonInterpreter.setText(self._parent.project.python_exec) self.txtPythonInterpreter.setCompleter( QCompleter( ('python', 'python2', 'python3', 'python.exe', 'pythonw.exe'))) self.txtPythonInterpreter.setPlaceholderText("python") self.btnPythonPath = QPushButton(QIcon(":img/open"), '') grid.addWidget(QLabel(translations.TR_PROJECT_PYTHON_INTERPRETER), 1, 0) grid.addWidget(self.txtPythonInterpreter, 1, 1) grid.addWidget(self.btnPythonPath, 1, 2) grid.addWidget(QLabel(translations.TR_PROJECT_PYTHON_PATH), 2, 0) self.txtPythonPath = QPlainTextEdit() # TODO : better widget self.txtPythonPath.setPlainText(self._parent.project.python_path) self.txtPythonPath.setToolTip(translations.TR_PROJECT_PATH_PER_LINE) grid.addWidget(self.txtPythonPath, 2, 1) # Additional builtins/globals for pyflakes grid.addWidget(QLabel(translations.TR_PROJECT_BUILTINS), 3, 0) self.additional_builtins = QLineEdit() self.additional_builtins.setText(' '.join( self._parent.project.additional_builtins)) self.additional_builtins.setToolTip( translations.TR_PROJECT_BUILTINS_TOOLTIP) grid.addWidget(self.additional_builtins, 3, 1) self.txtPreExec = QLineEdit() ui_tools.LineEditButton( self.txtPreExec, self.txtPreExec.clear, self.style().standardPixmap(self.style().SP_TrashIcon)) self.txtPreExec.setReadOnly(True) self.txtPreExec.setText(self._parent.project.pre_exec_script) self.txtPreExec.setPlaceholderText( os.path.join(os.path.expanduser("~"), 'path', 'to', 'script.sh')) self.btnPreExec = QPushButton(QIcon(":img/open"), '') grid.addWidget(QLabel(translations.TR_PROJECT_PRE_EXEC), 4, 0) grid.addWidget(self.txtPreExec, 4, 1) grid.addWidget(self.btnPreExec, 4, 2) self.txtPostExec = QLineEdit() ui_tools.LineEditButton( self.txtPostExec, self.txtPostExec.clear, self.style().standardPixmap(self.style().SP_TrashIcon)) self.txtPostExec.setReadOnly(True) self.txtPostExec.setText(self._parent.project.post_exec_script) self.txtPostExec.setPlaceholderText( os.path.join(os.path.expanduser("~"), 'path', 'to', 'script.sh')) self.btnPostExec = QPushButton(QIcon(":img/open"), '') grid.addWidget(QLabel(translations.TR_PROJECT_POST_EXEC), 5, 0) grid.addWidget(self.txtPostExec, 5, 1) grid.addWidget(self.btnPostExec, 5, 2) grid.addItem( QSpacerItem(5, 10, QSizePolicy.Expanding, QSizePolicy.Expanding), 6, 0) # Properties grid.addWidget(QLabel(translations.TR_PROJECT_PROPERTIES), 7, 0) self.txtParams = QLineEdit() self.txtParams.setToolTip(translations.TR_PROJECT_PARAMS_TOOLTIP) self.txtParams.setText(self._parent.project.program_params) self.txtParams.setPlaceholderText('verbose, debug, force') grid.addWidget(QLabel(translations.TR_PROJECT_PARAMS), 8, 0) grid.addWidget(self.txtParams, 8, 1) #Widgets for virtualenv properties self.txtVenvPath = QLineEdit() ui_tools.LineEditButton( self.txtVenvPath, self.txtVenvPath.clear, self.style().standardPixmap(self.style().SP_TrashIcon)) self.txtVenvPath.setText(self._parent.project.venv) self._dir_completer = QCompleter() self._dir_completer.setModel(QDirModel(self._dir_completer)) self.txtVenvPath.setCompleter(self._dir_completer) self.txtVenvPath.setPlaceholderText( os.path.join(os.path.expanduser("~"), 'path', 'to', 'virtualenv')) self.btnVenvPath = QPushButton(QIcon(":img/open"), '') grid.addWidget(QLabel(translations.TR_PROJECT_VIRTUALENV), 9, 0) grid.addWidget(self.txtVenvPath, 9, 1) grid.addWidget(self.btnVenvPath, 9, 2) self.connect(self.btnBrowse, SIGNAL("clicked()"), self.select_file) self.connect(self.btnPythonPath, SIGNAL("clicked()"), self._load_python_path) self.connect(self.btnVenvPath, SIGNAL("clicked()"), self._load_python_venv) self.connect(self.btnPreExec, SIGNAL("clicked()"), self.select_pre_exec_script) self.connect(self.btnPostExec, SIGNAL("clicked()"), self.select_post_exec_script)