class FileSystemOpener(QWidget): def __init__(self): QWidget.__init__(self) hbox = QHBoxLayout(self) hbox.setContentsMargins(0, 0, 0, 0) self.btnClose = QPushButton( self.style().standardIcon(QStyle.SP_DialogCloseButton), '') self.completer = QCompleter(self) self.pathLine = ui_tools.LineEditTabCompleter(self.completer) fileModel = QFileSystemModel(self.completer) fileModel.setRootPath("") self.completer.setModel(fileModel) self.pathLine.setCompleter(self.completer) self.btnOpen = QPushButton( self.style().standardIcon(QStyle.SP_ArrowRight), 'Open!') hbox.addWidget(self.btnClose) hbox.addWidget(QLabel(self.tr("Path:"))) hbox.addWidget(self.pathLine) hbox.addWidget(self.btnOpen) self.connect(self.pathLine, SIGNAL("returnPressed()"), self._open_file) self.connect(self.btnOpen, SIGNAL("clicked()"), self._open_file) def _open_file(self): path = self.pathLine.text() main_container.MainContainer().open_file(path) self.emit(SIGNAL("requestHide()")) def showEvent(self, event): super(FileSystemOpener, self).showEvent(event) self.pathLine.selectAll()
def __init__(self): WizardPage.__init__(self) self.fetch_config = None self.app_model = QStringListModel( REGISTRY.names( lambda klass: not getattr(klass, 'disable_in_gui', None))) self.ui.app_combo.setModel(self.app_model) if mozinfo.bits == 64: if mozinfo.os == 'mac': self.bits_model = QStringListModel(['64']) bits_index = 0 else: self.bits_model = QStringListModel(['32', '64']) bits_index = 1 elif mozinfo.bits == 32: self.bits_model = QStringListModel(['32']) bits_index = 0 self.ui.bits_combo.setModel(self.bits_model) self.ui.bits_combo.setCurrentIndex(bits_index) self.build_type_model = QStringListModel() self.ui.app_combo.currentIndexChanged.connect(self._set_fetch_config) self.ui.bits_combo.currentIndexChanged.connect(self._set_fetch_config) self.ui.app_combo.setCurrentIndex( self.ui.app_combo.findText("firefox")) completer = QCompleter() completer.setModel(QStringListModel(branches.get_branches( include_aliases=True), self)) completer.setCaseSensitivity(Qt.CaseInsensitive) self.ui.repository.setCompleter(completer)
def create_QNewStrategy(self): self.__q_new_strategy = QNewStrategy() completer = QCompleter() if self.get_got_list_instrument_info(): model = QStringListModel() model.setStringList(self.get_list_instrument_id()) completer.setModel(model) else: print(">>> CTPManager.create_QNewStrategy() 查询合约信息失败") self.__q_new_strategy.lineEdit_a_instrument.setCompleter(completer) self.__q_new_strategy.lineEdit_b_instrument.setCompleter(completer) self.__q_new_strategy.set_ClientMain( self.__client_main) # CTPManager设置为新建策略窗口属性 self.__q_new_strategy.set_CTPManager(self) # CTPManager设置为新建策略窗口属性 self.__q_new_strategy.set_SocketManager( self.__socket_manager) # SocketManager设置为新建策略窗口属性 self.__q_new_strategy.set_trader_id(self.__trader_id) # 设置trade_id属性 self.set_QNewStrategy(self.__q_new_strategy) # 新建策略窗口设置为CTPManager属性 self.__client_main.set_QNewStrategy( self.__q_new_strategy) # 新建策略窗口设置为ClientMain属性 self.signal_hide_QNewStrategy.connect( self.get_QNewStrategy().hide) # 绑定信号槽,新创建策略成功后隐藏“新建策略弹窗” # 绑定信号槽:新建策略窗新建策略指令 -> SocketManager.slot_send_msg self.__q_new_strategy.signal_send_msg.connect( self.__socket_manager.slot_send_msg)
class FileSystemOpener(QWidget): def __init__(self): QWidget.__init__(self) hbox = QHBoxLayout(self) hbox.setContentsMargins(0, 0, 0, 0) self.btnClose = QPushButton( self.style().standardIcon(QStyle.SP_DialogCloseButton), '') self.completer = QCompleter(self) self.pathLine = ui_tools.LineEditTabCompleter(self.completer) fileModel = QFileSystemModel(self.completer) fileModel.setRootPath("") self.completer.setModel(fileModel) self.pathLine.setCompleter(self.completer) self.btnOpen = QPushButton( self.style().standardIcon(QStyle.SP_ArrowRight), 'Open!') hbox.addWidget(self.btnClose) hbox.addWidget(QLabel(self.trUtf8("Path:"))) hbox.addWidget(self.pathLine) hbox.addWidget(self.btnOpen) self.connect(self.pathLine, SIGNAL("returnPressed()"), self._open_file) self.connect(self.btnOpen, SIGNAL("clicked()"), self._open_file) def _open_file(self): path = self.pathLine.text() main_container.MainContainer().open_file(path) self.emit(SIGNAL("requestHide()")) def showEvent(self, event): super(FileSystemOpener, self).showEvent(event) self.pathLine.selectAll()
def __init__(self, parent=None): super(self.__class__, self).__init__() self.parent = parent self.setupUi(self) self.setWindowTitle("OPC Test Client- Create Group") connected_server = connections.server() opc.connect(connected_server) self.comboData = ['None'] self.comboBox.addItem(" Select") self.treeWidget.setHeaderHidden(True) connected_server = connections.server() data = connections.read_from_db(connected_server) for con1 in data: group_list.append(con1[0]) s_ind = 0 Tag_list = opc.list('*', recursive=True) for x in Tag_list: str_list = x.split('.') tag = str_list[0] if tag in Main_Tags: print "Exist" else: ind = Tag_list.index(x) array = Tag_list[s_ind:ind] if not array: print "do nothing" else: Sub_Tags.append([array]) Main_Tags.append(tag) s_ind = ind for y in Main_Tags: self.comboBox.addItem(y) edit = self.lineEdit_searchTag completer = QCompleter() edit.setCompleter(completer) model = QStringListModel() completer.setModel(model) self.get_data(model, Tag_list) line_g = self.lineEdit_GroupName regex = QtCore.QRegExp("[a-z-A-Z-0-9-@-#-$_]+") validator = QtGui.QRegExpValidator(regex) line_g.setValidator(validator) line_update = self.lineEdit_UpdateRate regex2 = QtCore.QRegExp("[0-9]+") validator2 = QtGui.QRegExpValidator(regex2) line_update.setValidator(validator2) self.comboBox.activated[str].connect(self.onActivate) self.button_cancel.clicked.connect( QtCore.QCoreApplication.instance().quit) self.button_createGroup.clicked.connect(self.load_tree) self.button_searchTag.clicked.connect(self.search) self.button_deleteTag.clicked.connect(self.delete_Tag) self.connect(self.treeWidget, QtCore.SIGNAL("itemDoubleClicked(QTreeWidgetItem *,int)"), self.check_condition)
class ManualInstallWidget(QWidget): 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(self.tr("Plugin Name:"), self._txtName) form.addRow(self.tr("Plugin 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(self.tr("Plugin File:"))) 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(self.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 _load_plugin_path(self): path = QFileDialog.getOpenFileName(self, self.tr("Select Plugin Path")) if path: self._txtFilePath.setText(path) def install_plugin(self): if self._txtFilePath.text() and self._txtName.text(): plug = [] plug.append(self._txtName.text()) plug.append(self._txtVersion.text()) plug.append('') plug.append('') plug.append('') plug.append(self._txtFilePath.text()) self._parent.install_plugins_manually([plug])
def __init__(self,parent=None): super(QtGui.QLineEdit, self).__init__(parent) model = QStringListModel() completer = QCompleter() completer.setModel(model) model.setStringList(cmd.cmdset) self.setCompleter(completer)
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)
class ManualInstallWidget(QWidget): 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(self.tr("Plugin Name:"), self._txtName) form.addRow(self.tr("Plugin 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(self.tr("Plugin File:"))) 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(self.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 _load_plugin_path(self): path = QFileDialog.getOpenFileName(self, self.tr("Select Plugin Path")) if path: self._txtFilePath.setText(path) def install_plugin(self): if self._txtFilePath.text() and self._txtName.text(): plug = [] plug.append(self._txtName.text()) plug.append(self._txtVersion.text()) plug.append('') plug.append('') plug.append('') plug.append(self._txtFilePath.text()) self._parent.install_plugins_manually([plug])
def moveToShotsPage(self): self.getProjectsBanner() self.slideView(self.ui.ShotInfoPage, "right") # Set the model for the presets # If no current project is set, send error if not self.ui.ProjectsEDIT.currentProject: pass else: shotGroupModel = ShotGroupModel(self.ui.ProjectsEDIT.currentProject) completer = QCompleter() self.ui.ShotGroupEDIT.setCompleter(completer) completer.setModel(shotGroupModel)
def __init__(self,expdat): super(DBAnnotateSave, self).__init__() print("DBAnnotateSave") uic.loadUi(os.path.join(hs.heatsequerdir,'ui/manualdata.py'), self) self.bplus.clicked.connect(self.plus) self.bminus.clicked.connect(self.minus) self.bontoinput.returnPressed.connect(self.plus) self.bstudyinfo.clicked.connect(self.studyinfo) self.bisa.toggled.connect(self.radiotoggle) self.bdiffpres.toggled.connect(self.radiotoggle) self.bisatype.currentIndexChanged.connect(self.isatypechanged) self.bhistory.clicked.connect(self.history) self.cexp=expdat self.lnumbact.setText(str(len(expdat.selectedseqs))) completer = QCompleter() self.bontoinput.setCompleter(completer) scdb=hs.scdb self.scdb=scdb self.dataid=hs.supercooldb.finddataid(scdb,datamd5=self.cexp.datamd5,mapmd5=self.cexp.mapmd5) model = QStringListModel() completer.setModel(model) # completer.setCompletionMode(QCompleter.InlineCompletion) completer.maxVisibleItems=10 completer.setCaseSensitivity(Qt.CaseInsensitive) # make the completer selection also erase the text edit completer.activated.connect(self.cleartext,type=Qt.QueuedConnection) # in qt5 should work with middle complete as well... # completer.setFilterMode(Qt.MatchContains) if not hs.scdb.ontologyfromid: hs.scdb=hs.supercooldb.loaddbonto(hs.scdb) self.ontology=hs.scdb.ontology self.ontologyfromid=hs.scdb.ontologyfromid nlist=list(self.ontology.keys()) # nlist=sorted(nlist) nlist=sorted(nlist, key=lambda s: s.lower()) print("sorted ontology") model.setStringList(nlist) self.setWindowTitle(self.cexp.studyname) try: tt=hs.lastdatamd5 except: hs.lastdatamd5='' if self.cexp.datamd5==hs.lastdatamd5: self.fillfromcuration(hs.lastcurations[-1],onlyall=True) self.prefillinfo() self.bontoinput.setFocus()
def __init__(self): super(AddNewWord, self).__init__(None) self.setWindowTitle("AddNewWord") completer = QCompleter(self) self.string_list_model = QStringListModel(self) completer.setCaseSensitivity(Qt.CaseInsensitive) completer.setModel(self.string_list_model) self.setCompleter(completer) self.connect(self, SIGNAL("editingFinished()"), self.editComplete) self.word_list = QStringList()
def __init__(self, parent=None, settings={}, commands={}): super(CommandWindow, self).__init__(parent) self.settings = settings self.commands = commands self.push_button_run = QtGui.QPushButton(self) self.push_button_run.setText("Run") self.push_button_run.clicked.connect(self.on_push_button_run_clicked) self.push_button_run.setAutoDefault(True) self.line_edit_command = QtGui.QLineEdit(self) self.line_edit_command.returnPressed.connect( self.push_button_run.click) completer = QCompleter() self.line_edit_command.setCompleter(completer) self.line_edit_command.setFocus() model = QStringListModel() completer.setModel(model) model.setStringList(self.commands.keys()) self.message_label = QtGui.QLabel() self.message_label.setText("<i>please enter command</i>") self.message_label.setStyleSheet("color: #333333") self.error_label = QtGui.QLabel() self.error_label.setStyleSheet("color: red") self.error_label.hide() self.output_label = QtGui.QLabel() self.output_label.setStyleSheet( "font-family: monospace; background-color: #eeeeee; color: green") self.output_label.hide() self.layoutHorizontal = QtGui.QHBoxLayout() self.layoutHorizontal.addWidget(self.line_edit_command) self.layoutHorizontal.addWidget(self.push_button_run) self.layout_vertical = QtGui.QVBoxLayout(self) self.layout_vertical.addWidget(self.message_label) self.layout_vertical.addLayout(self.layoutHorizontal) self.layout_vertical.addWidget(self.error_label) self.layout_vertical.addWidget(self.output_label) self.installEventFilter(self) # self.resize(640, 480) self.center()
def _load_labels(self): labels = self.github.get_labels() model = QStringListModel() completer_model = model compl = QCompleter() compl.setModel(model) compl.setCaseSensitivity(Qt.CaseInsensitive) compl.setMaxVisibleItems(50) compl.setModelSorting(QCompleter.CaseInsensitivelySortedModel) compl.setCompletionMode(QCompleter.UnfilteredPopupCompletion) completer_model.setStringList(labels) self.LabelsLineEdit.setCompleter(compl) self.LabelsLineEdit.setText("")
class ExtendedComboBox(QComboBox): def __init__(self, parent=None): super(ExtendedComboBox, self).__init__(parent) self.setFocusPolicy(Qt.StrongFocus) self.setEditable(True) self.setCurrentIndex(-1) # self.activated.connect(self.on_completer_activated) # add a filter model to filter matching items self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.pFilterModel.setSourceModel(self.model()) # add a completer, which uses the filter model self.completer = QCompleter(self.pFilterModel, self) # always show all (filtered) completions self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) self.setCompleter(self.completer) # connect signals # self.lineEdit().textEdited[unicode].connect(self.pFilterModel.setFilterFixedString) # self.completer.activated.connect(self.on_completer_activated) # # on selection of an item from the completer, select the corresponding item from combobox # def on_completer_activated(self, received): # # if type( received ) != int: # # index = self.findText(received) # # self.setCurrentIndex(index) # # print "Es el texto: %s & index: %s" % (self.itemText(index), index) # print "Es el texto como viene: %s" % received # return received # else: # print "Es el texto extraido del numero enviado: %s " % self.itemText(received) # return self.itemText(received) # on model change, update the models of the filter and completer as well def setModel(self, model): super(ExtendedComboBox, self).setModel(model) self.pFilterModel.setSourceModel(model) self.completer.setModel(self.pFilterModel) # on model column change, update the model column of the filter and completer as well def setModelColumn(self, column): self.completer.setCompletionColumn(column) self.pFilterModel.setFilterKeyColumn(column) super(ExtendedComboBox, self).setModelColumn(column)
class ExtendedCombo(QComboBox): def __init__(self, parent=None): """Default constructor """ super(ExtendedCombo, self).__init__(parent) self.setFocusPolicy(Qt.StrongFocus) self.setEditable(True) # add a filter model to filter matching items self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.pFilterModel.setSourceModel(self.model()) # add a completer, which uses the filter model self.completer = QCompleter(self.pFilterModel, self) # always show all (filtered) completions self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) self.setCompleter(self.completer) # connect signals self.lineEdit().textEdited[unicode].connect( self.pFilterModel.setFilterFixedString) self.completer.activated.connect(self.on_completer_activated) # on selection of an item from the completer, select the corresponding item from combobox def on_completer_activated(self, text): """ """ if text: index = self.findText(text) self.setCurrentIndex(index) # on model change, update the models of the filter and completer as well def setModel(self, model): """ """ super(ExtendedCombo, self).setModel(model) self.pFilterModel.setSourceModel(model) self.completer.setModel(self.pFilterModel) # on model column change, update the model column of the filter and completer as well def setModelColumn(self, column): """ """ self.completer.setCompletionColumn(column) self.pFilterModel.setFilterKeyColumn(column) super(ExtendedCombo, self).setModelColumn(column)
def __init__(self, parent=None): QtCore.QThread.__init__(self) QtGui.QWidget.__init__(self, parent) self.ui = Ui_Form() self.ui.setupUi(self) QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL("clicked()"), self.filebrower) #for input file QtCore.QObject.connect(self.ui.pushButton_2, QtCore.SIGNAL("clicked()"), self.submit) #submit QtCore.QObject.connect(self.ui.pushButton_3, QtCore.SIGNAL("clicked()"), self.reset) #reset QtCore.QObject.connect(self.ui.pushButton_4, QtCore.SIGNAL("clicked()"), self.add_taxid1) #add taxid to include QtCore.QObject.connect(self.ui.pushButton_5, QtCore.SIGNAL("clicked()"), self.add_taxid2) #add taxid to exclude QtCore.QObject.connect(self.ui.pushButton_6, QtCore.SIGNAL("clicked()"), self.advance) #add taxid to exclude self.ui.progressBar.hide() self.ui.progressBar.setProperty("value", 0) self.ui.lineEdit_add3 = QtGui.QLineEdit(self.ui.groupBox_2) self.ui.lineEdit_add3.setGeometry(QtCore.QRect(70, 20, 281, 21)) self.ui.lineEdit_add3.setObjectName("lineEdit_3") self.ui.lineEdit_add3.setText(QtGui.QApplication.translate("Form", "", None, QtGui.QApplication.UnicodeUTF8)) completer = QCompleter() self.ui.lineEdit_add3.setCompleter(completer) model = QStringListModel() completer.setModel(model) completer.setModelSorting(QCompleter.CaseInsensitivelySortedModel) Expar.get_data(model) self.ui.lineEdit_add2 = QtGui.QLineEdit(self.ui.groupBox_4) self.ui.lineEdit_add2.setGeometry(QtCore.QRect(70, 19, 281, 21)) self.ui.lineEdit_add2.setObjectName("lineEdit_2") self.ui.lineEdit_add2.setText(QtGui.QApplication.translate("Form", "", None, QtGui.QApplication.UnicodeUTF8)) completer = QCompleter() self.ui.lineEdit_add2.setCompleter(completer) model = QStringListModel() completer.setModel(model) completer.setModelSorting(QCompleter.CaseInsensitivelySortedModel) Expar.get_data(model) self.dbdir=os.path.join(os.path.expanduser("~"),".pyqtodo") self.dbfile=os.path.join(self.dbdir,str(int(time.time()))+"tasks.sqlite") if not os.path.isdir(self.dbdir): os.mkdir(self.dbdir) # Set up the Elixir internal thingamajigs elixir.metadata.bind = "sqlite:///%s"%self.dbfile elixir.setup_all() if not os.path.exists(self.dbfile): elixir.create_all() global saveData if elixir.__version__ < "0.6": saveData=elixir.session.flush else: saveData=elixir.session.commit saveData()
def set_model_by_list(string_list, widget, proxy_model): """ Set the model according to the list """ model = QStringListModel() model.setStringList(string_list) proxy_model.setSourceModel(model) proxy_model.setFilterKeyColumn(0) proxy_model_aux = QSortFilterProxyModel() proxy_model_aux.setSourceModel(model) proxy_model_aux.setFilterKeyColumn(0) widget.setModel(proxy_model_aux) widget.setModelColumn(0) completer = QCompleter() completer.setModel(proxy_model) completer.setCompletionColumn(0) completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) widget.setCompleter(completer)
class ExtendedCombo(QComboBox): def __init__(self, parent=None): super(ExtendedCombo, self).__init__(parent) self.setFocusPolicy(Qt.StrongFocus) self.setEditable(True) self.completer = QCompleter(self) self.selected_id = None # always show all completions self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion ) self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.completer.setPopup(self.view()) self.setCompleter(self.completer) self.lineEdit().textEdited[unicode].connect(self.pFilterModel.setFilterFixedString) self.completer.activated.connect(self.setTextIfCompleterIsClicked) self.currentIndexChanged.connect(self.currentSelected) def setModel( self, model ): super(ExtendedCombo, self).setModel( model ) self.pFilterModel.setSourceModel( model ) self.completer.setModel(self.pFilterModel) def setModelColumn( self, column): self.completer.setCompletionColumn( column ) self.pFilterModel.setFilterKeyColumn( column ) super(ExtendedCombo, self).setModelColumn( column ) def view(self): return self.completer.popup() def index(self): return self.currentIndex() def setTextIfCompleterIsClicked(self, text): if text: index = self.findText(text) self.setCurrentIndex(index) def currentSelected(self, text): if text: self.selected_id = self.currentText()
def set_model_by_list(self, string_list, widget): model = QStringListModel() model.setStringList(string_list) self.proxy_model = QSortFilterProxyModel() self.proxy_model.setSourceModel(model) self.proxy_model.setFilterKeyColumn(0) proxy_model_aux = QSortFilterProxyModel() proxy_model_aux.setSourceModel(model) proxy_model_aux.setFilterKeyColumn(0) widget.setModel(proxy_model_aux) widget.setModelColumn(0) completer = QCompleter() completer.setModel(self.proxy_model) completer.setCompletionColumn(0) completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) widget.setCompleter(completer)
class FSLineEdit(QLineEdit): """ A line edit with auto completion for file system folders. """ def __init__(self, parent=None): QLineEdit.__init__(self, parent) self.fsmodel = QFileSystemModel() self.fsmodel.setRootPath("") self.completer = QCompleter() self.completer.setModel(self.fsmodel) self.setCompleter(self.completer) self.fsmodel.setFilter(QDir.Drives | QDir.AllDirs | QDir.Hidden | QDir.NoDotAndDotDot) def setPath(self, path): self.setText(path) self.fsmodel.setRootPath(path)
class FSLineEdit(QLineEdit): """ A line edit with auto completion for file system folders. """ def __init__(self, parent=None): QLineEdit.__init__(self, parent) self.fsmodel = QFileSystemModel() self.fsmodel.setRootPath("") self.completer = QCompleter() self.completer.setModel(self.fsmodel) self.setCompleter(self.completer) self.fsmodel.setFilter(QDir.Drives | QDir.AllDirs | QDir.Hidden | QDir.NoDotAndDotDot) def setPath(self, path): self.setText(path) self.fsmodel.setRootPath(path)
class ExtendedComboBox(QComboBox): """ Based off the extension of the combo box from below: http://stackoverflow.com/questions/4827207/how-do-i-filter-the-pyqt-qcombobox-items-based-on-the-text-input """ def __init__(self, parent=None): super(ExtendedComboBox, self).__init__(parent) self.setFocusPolicy(Qt.StrongFocus) self.setEditable(True) self.setEditable(True) self.completer = QCompleter(self) # always show all completions self.completer.setCompletionMode(QCompleter.PopupCompletion) self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.completer.setPopup(self.view()) self.setCompleter(self.completer) self.lineEdit().textEdited[unicode].connect( self.pFilterModel.setFilterFixedString) self.completer.activated.connect(self.setTextIfCompleterIsClicked) def setModel(self, model): super(ExtendedComboBox, self).setModel(model) self.pFilterModel.setSourceModel(model) self.completer.setModel(self.pFilterModel) def setModelColumn(self, column): self.completer.setCompletionColumn(column) self.pFilterModel.setFilterKeyColumn(column) super(ExtendedComboBox, self).setModelColumn(column) def view(self): return self.completer.popup() def index(self): return self.currentIndex() def setTextIfCompleterIsClicked(self, text): if text: index = self.findText(text) self.setCurrentIndex(index)
class ExtendedComboBox(QComboBox): """ Based off the extension of the combo box from below: http://stackoverflow.com/questions/4827207/how-do-i-filter-the-pyqt-qcombobox-items-based-on-the-text-input """ def __init__(self, parent = None): super(ExtendedComboBox, self).__init__(parent) self.setFocusPolicy(Qt.StrongFocus) self.setEditable(True) self.setEditable(True) self.completer = QCompleter(self) # always show all completions self.completer.setCompletionMode(QCompleter.PopupCompletion) self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.completer.setPopup(self.view()) self.setCompleter(self.completer) self.lineEdit().textEdited[unicode].connect(self.pFilterModel.setFilterFixedString) self.completer.activated.connect(self.setTextIfCompleterIsClicked) def setModel(self, model): super(ExtendedComboBox, self).setModel( model ) self.pFilterModel.setSourceModel( model ) self.completer.setModel(self.pFilterModel) def setModelColumn(self, column): self.completer.setCompletionColumn(column) self.pFilterModel.setFilterKeyColumn(column) super(ExtendedComboBox, self).setModelColumn(column) def view(self): return self.completer.popup() def index(self): return self.currentIndex() def setTextIfCompleterIsClicked(self, text): if text: index = self.findText(text) self.setCurrentIndex(index)
class ExtendedComboBox(QComboBox): def __init__(self, parent=None): super(ExtendedComboBox, self).__init__(parent) self.setFocusPolicy(Qt.StrongFocus) self.setEditable(True) # add a filter model to filter matching items self.pFilterModel = QSortFilterProxyModel(self) self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.pFilterModel.setSourceModel(self.model()) # add a completer, which uses the filter model self.completer = QCompleter(self.pFilterModel, self) # always show all (filtered) completions self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion) self.setCompleter(self.completer) # connect signals self.lineEdit().textEdited[unicode].connect(self.pFilterModel.setFilterFixedString) self.completer.activated.connect(self.on_completer_activated) # on selection of an item from the completer, select the corresponding item from combobox def on_completer_activated(self, text): if text: index = self.findText(text) self.setCurrentIndex(index) # on model change, update the models of the filter and completer as well def setModel(self, model): super(ExtendedComboBox, self).setModel(model) self.pFilterModel.setSourceModel(model) self.completer.setModel(self.pFilterModel) # on model column change, update the model column of the filter and completer as well def setModelColumn(self, column): self.completer.setCompletionColumn(column) self.pFilterModel.setFilterKeyColumn(column) super(ExtendedComboBox, self).setModelColumn(column)
def create_QNewStrategy(self): self.__q_new_strategy = QNewStrategy() completer = QCompleter() if self.get_got_list_instrument_info(): model = QStringListModel() model.setStringList(self.get_list_instrument_id()) completer.setModel(model) else: print(">>> CTPManager.create_QNewStrategy() 查询合约信息失败") self.__q_new_strategy.lineEdit_a_instrument.setCompleter(completer) self.__q_new_strategy.lineEdit_b_instrument.setCompleter(completer) self.__q_new_strategy.set_ClientMain(self.__client_main) # CTPManager设置为新建策略窗口属性 self.__q_new_strategy.set_CTPManager(self) # CTPManager设置为新建策略窗口属性 self.__q_new_strategy.set_SocketManager(self.__socket_manager) # SocketManager设置为新建策略窗口属性 self.__q_new_strategy.set_trader_id(self.__trader_id) # 设置trade_id属性 self.set_QNewStrategy(self.__q_new_strategy) # 新建策略窗口设置为CTPManager属性 self.__client_main.set_QNewStrategy(self.__q_new_strategy) # 新建策略窗口设置为ClientMain属性 self.signal_hide_QNewStrategy.connect(self.get_QNewStrategy().hide) # 绑定信号槽,新创建策略成功后隐藏“新建策略弹窗” # 绑定信号槽:新建策略窗新建策略指令 -> SocketManager.slot_send_msg self.__q_new_strategy.signal_send_msg.connect(self.__socket_manager.slot_send_msg)
class FileSystemOpener(QWidget): """Widget to handle opening files through path write with completion.""" def __init__(self): super(FileSystemOpener, self).__init__() hbox = QHBoxLayout(self) hbox.setContentsMargins(0, 0, 0, 0) self.btnClose = QPushButton( self.style().standardIcon(QStyle.SP_DialogCloseButton), '') self.btnClose self.completer = QCompleter(self) self.pathLine = ui_tools.LineEditTabCompleter(self.completer) fileModel = QFileSystemModel(self.completer) fileModel.setRootPath("") self.completer.setModel(fileModel) self.pathLine.setCompleter(self.completer) self.btnOpen = QPushButton( self.style().standardIcon(QStyle.SP_ArrowRight), 'Open!') hbox.addWidget(self.btnClose) hbox.addWidget(QLabel(self.trUtf8("Path:"))) hbox.addWidget(self.pathLine) hbox.addWidget(self.btnOpen) self.connect(self.pathLine, SIGNAL("returnPressed()"), self._open_file) self.connect(self.btnOpen, SIGNAL("clicked()"), self._open_file) def _open_file(self): """Open the file selected.""" path = self.pathLine.text() main_container = IDE.get_service("main_container") if main_container: main_container.open_file(path) self.emit(SIGNAL("requestHide()")) def showEvent(self, event): """Show the FileSystemOpener widget and select all the text.""" super(FileSystemOpener, self).showEvent(event) self.pathLine.selectAll()
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 __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)
class LayerLoaderDialog(QDialog, FORM_CLASS): def __init__(self, parent=None): """Constructor.""" super(LayerLoaderDialog, self).__init__(parent) self.setupUi(self) self.completer = QCompleter(self) self.fsmodel = QFileSystemModel(self.completer) self.fsmodel.setNameFilters(['*.qlf']) self.completer.setModel(self.fsmodel) self.filename.setCompleter(self.completer) self.searchdir.clicked.connect(self.opensearchform) def opensearchform(self): dn = QFileDialog.getOpenFileName(self, self.tr('Choose target directory for layers'), self.filename.text(), '*.qlf' ) if dn: self.filename.setText(dn) def set_target_directory(self, dn): self.filename.setText(dn) def layer(self): return self.filename.text()
class ExtendedComboBox( QComboBox ): def __init__( self, parent = None): super( ExtendedComboBox, self ).__init__( parent ) self.setFocusPolicy( Qt.StrongFocus ) self.setEditable( True ) # add a filter model to filter matching items self.pFilterModel = QSortFilterProxyModel( self ) self.pFilterModel.setFilterCaseSensitivity( Qt.CaseInsensitive ) self.pFilterModel.setSourceModel(self.model()) # add a completer, which uses the filter model self.completer = QCompleter(self.pFilterModel, self) # always show all completions self.completer.setCompletionMode( QCompleter.UnfilteredPopupCompletion ) self.completer.setPopup( self.view() ) self.setCompleter( self.completer ) self.lineEdit().textEdited[unicode].connect( self.pFilterModel.setFilterFixedString ) self.completer.activated.connect(self.on_completer_activated) def setModel( self, model ): super(ExtendedComboBox, self).setModel( model ) self.pFilterModel.setSourceModel( model ) self.completer.setModel(self.pFilterModel) def setModelColumn( self, column ): self.completer.setCompletionColumn( column ) self.pFilterModel.setFilterKeyColumn( column ) super(ExtendedComboBox, self).setModelColumn( column ) def view( self ): return self.completer.popup() def index( self ): return self.currentIndex() def on_completer_activated(self, text): if text: index = self.findText(text) self.setCurrentIndex(index)
class FileChooser(QWidget, Ui_FileChooser): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.__completer = QCompleter(self) self.__completer.setModel(QDirModel(self.__completer)) self.lineEdit.setCompleter(self.__completer) def fileName(self): return str(self.lineEdit.text()) def setDefaultPath(self, path): self.lineEdit.setText(QFileInfo(path).canonicalFilePath()) def setLabel(self, label): self.label.setText(label) @pyqtSlot(name="on_button_clicked") def _openFileDialog(self): filename = QFileDialog.getOpenFileName(self, "Choose configuration file") if filename: self.lineEdit.setText(QFileInfo(filename).canonicalFilePath())
class FileSystemOpener(QWidget): """Widget to handle opening files through path write with completion.""" def __init__(self): super(FileSystemOpener, self).__init__() hbox = QHBoxLayout(self) hbox.setContentsMargins(0, 0, 0, 0) self.btnClose = QPushButton( self.style().standardIcon(QStyle.SP_DialogCloseButton), '') self.btnClose self.completer = QCompleter(self) self.pathLine = ui_tools.LineEditTabCompleter(self.completer) fileModel = QFileSystemModel(self.completer) fileModel.setRootPath("") self.completer.setModel(fileModel) self.pathLine.setCompleter(self.completer) self.btnOpen = QPushButton( self.style().standardIcon(QStyle.SP_ArrowRight), 'Open!') hbox.addWidget(self.btnClose) hbox.addWidget(QLabel(self.trUtf8("Path:"))) hbox.addWidget(self.pathLine) hbox.addWidget(self.btnOpen) self.connect(self.pathLine, SIGNAL("returnPressed()"), self._open_file) self.connect(self.btnOpen, SIGNAL("clicked()"), self._open_file) def _open_file(self): """Open the file selected.""" path = self.pathLine.text() main_container = IDE.get_service("main_container") if main_container: main_container.open_file(path) self.emit(SIGNAL("requestHide()")) def showEvent(self, event): """Show the FileSystemOpener widget and select all the text.""" super(FileSystemOpener, self).showEvent(event) self.pathLine.selectAll()
def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_Form() self.ui.setupUi(self) self.ui.progressBar.hide() self.ui.pushButton_2.hide() self.ui.label_2.hide() QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL("clicked()"), self.filebrower) #for input file QtCore.QObject.connect(self.ui.buttonBox, QtCore.SIGNAL(("accepted()")), self.submit) #submit QtCore.QObject.connect(self.ui.buttonBox, QtCore.SIGNAL(("rejected()")), self.reset) #submit QtCore.QObject.connect(self.ui.pushButton_6, QtCore.SIGNAL("clicked()"), self.advance) #advanced setting QtCore.QObject.connect(self.ui.pushButton_4, QtCore.SIGNAL("clicked()"), self.add_taxid1) #add taxid to include QtCore.QObject.connect(self.ui.pushButton_5, QtCore.SIGNAL("clicked()"), self.add_taxid2) #add taxid to exclude QtCore.QObject.connect(self.ui.pushButton_2, QtCore.SIGNAL("clicked()"), self.savefilebrower_all) #for input file self.ui.lineEdit_3 = QtGui.QLineEdit(self.ui.groupBox_2) self.ui.lineEdit_3.setGeometry(QtCore.QRect(70, 20, 270, 21)) self.ui.lineEdit_3.setObjectName("lineEdit_3") self.ui.lineEdit_3.setText(QtGui.QApplication.translate("Form", "", None, QtGui.QApplication.UnicodeUTF8)) completer = QCompleter() self.ui.lineEdit_3.setCompleter(completer) model = QStringListModel() completer.setModel(model) completer.setModelSorting(QCompleter.CaseInsensitivelySortedModel) Proxar_GUI3.get_data(model) self.ui.lineEdit_13 = QtGui.QLineEdit(self.ui.groupBox_4) self.ui.lineEdit_13.setGeometry(QtCore.QRect(70, 20, 270, 21)) self.ui.lineEdit_13.setObjectName("lineEdit_13") self.ui.lineEdit_13.setText(QtGui.QApplication.translate("Form", "", None, QtGui.QApplication.UnicodeUTF8)) completer = QCompleter() self.ui.lineEdit_13.setCompleter(completer) model = QStringListModel() completer.setModel(model) completer.setModelSorting(QCompleter.CaseInsensitivelySortedModel) Proxar_GUI3.get_data(model) #self.ui.lineEdit_5.setText('Mycobacterium avium (taxid:1764) OR Mycobacterium bovis (taxid:1765)')# include list #self.ui.lineEdit_15.setText('h**o sapiens (taxid:9606)') self.ui.lineEdit.setText('short_example206.txt')
class LineEdit(QLineEdit): """Cursom QLineEdit with tab completion""" def __init__(self, parent=None): QLineEdit.__init__(self, parent) self.completer = QCompleter() self.setCompleter(self.completer) self.model = QStringListModel() self.completer.setModel(self.model) #get_data(model) self.completions = None self.parent = parent def keyPressEvent(self, event): """Handle keypress event""" text = self.text() if event.key() == Qt.Key_Tab: current_text = self.text() if current_text != '': for item in self.completions: if item.startswith(current_text): self.setText(item) break event.accept() elif event.key() == Qt.Key_Return: if text != '': self.window().process_command(text) self.setText('') event.accept() else: QLineEdit.keyPressEvent(self, event) def set_completions(self, completions): """Set completions""" self.completions = completions self.model.setStringList(completions)
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 )
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)
def updateEditModels( self ): # Rellenar el combobox de los proveedores self.providersModel.setQuery( """ SELECT idpersona , nombre AS proveedor FROM personas WHERE tipopersona = 2 """ ) if not self.providersModel.rowCount( QModelIndex() ) > 0: raise UserWarning( "No existen proveedores en la base de datos" ) self.cbProvider.setModel( self.providersModel ) self.cbProvider.setModelColumn( 1 ) completer = QCompleter() completer.setCaseSensitivity( Qt.CaseInsensitive ) completer.setModel( self.providersModel ) completer.setCompletionColumn( 1 ) self.editmodel.providerId = self.providersModel.record( self.cbProvider.currentIndex() ).value( "idpersona" ).toInt()[0] query = QSqlQuery( """ SELECT idarticulo, Descripcion as descripcion FROM vw_articulosdescritos """ ) if not query.size() > 0: raise UserWarning( "No existen productos en la base de datos" ) prods = SingleSelectionModel() query.exec_() while query.next(): prods.items.append( [ query.value( 0 ).toInt()[0], query.value( 1 ).toString() ] ) prods.headers = ["idarticulo", "Articulo"] self.delegate.prods = prods
def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.setEnabled(True) Dialog.resize(1080, 747) self.formLayout = QtGui.QFormLayout(Dialog) self.formLayout.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow) self.formLayout.setObjectName(_fromUtf8("formLayout")) self.gridLayout_6 = QtGui.QGridLayout() self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6")) self.input_filename = QtGui.QLineEdit(Dialog) self.input_filename.setObjectName(_fromUtf8("input_filename")) self.gridLayout_6.addWidget(self.input_filename, 1, 1, 1, 1) self.label_14 = QtGui.QLabel(Dialog) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.label_14.setFont(font) self.label_14.setObjectName(_fromUtf8("label_14")) self.gridLayout_6.addWidget(self.label_14, 1, 0, 1, 1) self.pushButton_input = QtGui.QPushButton(Dialog) self.pushButton_input.setEnabled(True) self.pushButton_input.setObjectName(_fromUtf8("pushButton_input")) self.gridLayout_6.addWidget(self.pushButton_input, 1, 2, 1, 1) self.formLayout.setLayout(0, QtGui.QFormLayout.SpanningRole, self.gridLayout_6) self.length = QtGui.QGroupBox(Dialog) self.length.setEnabled(True) self.length.setObjectName(_fromUtf8("length")) self.gridLayout = QtGui.QGridLayout(self.length) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.label = QtGui.QLabel(self.length) self.label.setEnabled(True) self.label.setObjectName(_fromUtf8("label")) self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.max_70 = QtGui.QLineEdit(self.length) self.max_70.setEnabled(True) self.max_70.setObjectName(_fromUtf8("max_70")) self.gridLayout.addWidget(self.max_70, 3, 2, 1, 1) self.label_16 = QtGui.QLabel(self.length) self.label_16.setEnabled(True) self.label_16.setObjectName(_fromUtf8("label_16")) self.gridLayout.addWidget(self.label_16, 2, 2, 1, 1) self.max_5 = QtGui.QLineEdit(self.length) self.max_5.setEnabled(True) self.max_5.setObjectName(_fromUtf8("max_5")) self.gridLayout.addWidget(self.max_5, 1, 2, 1, 1) self.label_2 = QtGui.QLabel(self.length) self.label_2.setEnabled(True) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout.addWidget(self.label_2, 0, 2, 1, 1) self.primer_length_max = QtGui.QLineEdit(self.length) self.primer_length_max.setEnabled(True) self.primer_length_max.setObjectName(_fromUtf8("primer_length_max")) self.gridLayout.addWidget(self.primer_length_max, 1, 1, 1, 1) self.label_3 = QtGui.QLabel(self.length) self.label_3.setEnabled(True) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridLayout.addWidget(self.label_3, 0, 1, 1, 1) self.min_30 = QtGui.QLineEdit(self.length) self.min_30.setEnabled(True) self.min_30.setObjectName(_fromUtf8("min_30")) self.gridLayout.addWidget(self.min_30, 3, 0, 1, 1) self.primer_length_min = QtGui.QLineEdit(self.length) self.primer_length_min.setEnabled(True) self.primer_length_min.setObjectName(_fromUtf8("primer_length_min")) self.gridLayout.addWidget(self.primer_length_min, 1, 0, 1, 1) self.label_15 = QtGui.QLabel(self.length) self.label_15.setEnabled(True) self.label_15.setObjectName(_fromUtf8("label_15")) self.gridLayout.addWidget(self.label_15, 2, 0, 1, 1) self.formLayout.setWidget(1, QtGui.QFormLayout.SpanningRole, self.length) self.groupBox_2 = QtGui.QGroupBox(Dialog) self.groupBox_2.setEnabled(True) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.gridLayout_5 = QtGui.QGridLayout(self.groupBox_2) self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) self.Mg = QtGui.QLineEdit(self.groupBox_2) self.Mg.setEnabled(True) self.Mg.setObjectName(_fromUtf8("Mg")) self.gridLayout_5.addWidget(self.Mg, 1, 1, 1, 1) self.label_5 = QtGui.QLabel(self.groupBox_2) self.label_5.setEnabled(True) self.label_5.setObjectName(_fromUtf8("label_5")) self.gridLayout_5.addWidget(self.label_5, 0, 1, 1, 1) self.label_4 = QtGui.QLabel(self.groupBox_2) self.label_4.setEnabled(True) self.label_4.setObjectName(_fromUtf8("label_4")) self.gridLayout_5.addWidget(self.label_4, 0, 0, 1, 1) self.oligo = QtGui.QLineEdit(self.groupBox_2) self.oligo.setEnabled(True) self.oligo.setObjectName(_fromUtf8("oligo")) self.gridLayout_5.addWidget(self.oligo, 1, 2, 1, 1) self.label_6 = QtGui.QLabel(self.groupBox_2) self.label_6.setEnabled(True) self.label_6.setObjectName(_fromUtf8("label_6")) self.gridLayout_5.addWidget(self.label_6, 0, 2, 1, 1) self.label_7 = QtGui.QLabel(self.groupBox_2) self.label_7.setEnabled(True) self.label_7.setObjectName(_fromUtf8("label_7")) self.gridLayout_5.addWidget(self.label_7, 0, 3, 1, 1) self.dNTP = QtGui.QLineEdit(self.groupBox_2) self.dNTP.setObjectName(_fromUtf8("dNTP")) self.gridLayout_5.addWidget(self.dNTP, 1, 3, 1, 1) self.salt = QtGui.QLineEdit(self.groupBox_2) self.salt.setEnabled(True) self.salt.setObjectName(_fromUtf8("salt")) self.gridLayout_5.addWidget(self.salt, 1, 0, 1, 1) self.formLayout.setWidget(5, QtGui.QFormLayout.SpanningRole, self.groupBox_2) self.bool_conservation = QtGui.QCheckBox(Dialog) self.bool_conservation.setEnabled(True) self.bool_conservation.setObjectName(_fromUtf8("bool_conservation")) self.formLayout.setWidget(8, QtGui.QFormLayout.LabelRole, self.bool_conservation) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.label_19 = QtGui.QLabel(Dialog) self.label_19.setEnabled(False) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.label_19.setFont(font) self.label_19.setObjectName(_fromUtf8("label_19")) self.horizontalLayout_2.addWidget(self.label_19) self.snp_fname = QtGui.QLineEdit(Dialog) self.snp_fname.setEnabled(False) self.snp_fname.setObjectName(_fromUtf8("snp_fname")) self.horizontalLayout_2.addWidget(self.snp_fname) self.pushButton_snpfile = QtGui.QPushButton(Dialog) self.pushButton_snpfile.setEnabled(False) self.pushButton_snpfile.setObjectName(_fromUtf8("pushButton_snpfile")) self.horizontalLayout_2.addWidget(self.pushButton_snpfile) self.formLayout.setLayout(9, QtGui.QFormLayout.FieldRole, self.horizontalLayout_2) self.groupBox_3 = QtGui.QGroupBox(Dialog) self.groupBox_3.setEnabled(True) self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) self.gridLayout_4 = QtGui.QGridLayout(self.groupBox_3) self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) self.maxTm = QtGui.QLineEdit(self.groupBox_3) self.maxTm.setEnabled(True) self.maxTm.setObjectName(_fromUtf8("maxTm")) self.gridLayout_4.addWidget(self.maxTm, 1, 1, 1, 1) self.minTm = QtGui.QLineEdit(self.groupBox_3) self.minTm.setEnabled(True) self.minTm.setObjectName(_fromUtf8("minTm")) self.gridLayout_4.addWidget(self.minTm, 1, 0, 1, 1) self.label_11 = QtGui.QLabel(self.groupBox_3) self.label_11.setEnabled(False) self.label_11.setObjectName(_fromUtf8("label_11")) self.gridLayout_4.addWidget(self.label_11, 0, 5, 1, 1) self.label_10 = QtGui.QLabel(self.groupBox_3) self.label_10.setEnabled(True) self.label_10.setObjectName(_fromUtf8("label_10")) self.gridLayout_4.addWidget(self.label_10, 0, 3, 1, 1) self.label_23 = QtGui.QLabel(self.groupBox_3) self.label_23.setEnabled(True) self.label_23.setObjectName(_fromUtf8("label_23")) self.gridLayout_4.addWidget(self.label_23, 0, 4, 1, 1) self.label_18 = QtGui.QLabel(self.groupBox_3) self.label_18.setEnabled(True) self.label_18.setObjectName(_fromUtf8("label_18")) self.gridLayout_4.addWidget(self.label_18, 0, 1, 1, 1) self.maxDG5 = QtGui.QLineEdit(self.groupBox_3) self.maxDG5.setEnabled(True) self.maxDG5.setObjectName(_fromUtf8("maxDG5")) self.gridLayout_4.addWidget(self.maxDG5, 1, 2, 1, 1) self.label_17 = QtGui.QLabel(self.groupBox_3) self.label_17.setEnabled(True) self.label_17.setObjectName(_fromUtf8("label_17")) self.gridLayout_4.addWidget(self.label_17, 0, 0, 1, 1) self.max_snp = QtGui.QLineEdit(self.groupBox_3) self.max_snp.setEnabled(False) self.max_snp.setObjectName(_fromUtf8("max_snp")) self.gridLayout_4.addWidget(self.max_snp, 1, 5, 1, 1) self.hairpin = QtGui.QLineEdit(self.groupBox_3) self.hairpin.setEnabled(True) self.hairpin.setObjectName(_fromUtf8("hairpin")) self.gridLayout_4.addWidget(self.hairpin, 1, 4, 1, 1) self.label_8 = QtGui.QLabel(self.groupBox_3) self.label_8.setEnabled(True) self.label_8.setObjectName(_fromUtf8("label_8")) self.gridLayout_4.addWidget(self.label_8, 0, 2, 1, 1) self.self_dimer = QtGui.QLineEdit(self.groupBox_3) self.self_dimer.setEnabled(True) self.self_dimer.setObjectName(_fromUtf8("self_dimer")) self.gridLayout_4.addWidget(self.self_dimer, 1, 3, 1, 1) self.formLayout.setWidget(10, QtGui.QFormLayout.SpanningRole, self.groupBox_3) self.no_cross_check_radio = QtGui.QRadioButton(Dialog) self.no_cross_check_radio.setChecked(True) self.no_cross_check_radio.setObjectName(_fromUtf8("no_cross_check_radio")) self.formLayout.setWidget(14, QtGui.QFormLayout.LabelRole, self.no_cross_check_radio) self.human_cross_check_radio = QtGui.QRadioButton(Dialog) self.human_cross_check_radio.setObjectName(_fromUtf8("human_cross_check_radio")) self.formLayout.setWidget(14, QtGui.QFormLayout.FieldRole, self.human_cross_check_radio) self.customer_cross_check_radio = QtGui.QRadioButton(Dialog) self.customer_cross_check_radio.setObjectName(_fromUtf8("customer_cross_check_radio")) self.formLayout.setWidget(15, QtGui.QFormLayout.FieldRole, self.customer_cross_check_radio) self.input_organ = QtGui.QLineEdit(Dialog) self.input_organ.setEnabled(False) self.input_organ.setObjectName(_fromUtf8("input_organ")) self.formLayout.setWidget(16, QtGui.QFormLayout.FieldRole, self.input_organ) completer = QCompleter() self.input_organ.setCompleter(completer) model = QStringListModel() completer.setModel(model) completer.setModelSorting(QCompleter.CaseInsensitivelySortedModel) CPA.get_data(model) self.input_organ2 = QtGui.QLineEdit(Dialog) self.input_organ2.setEnabled(False) self.input_organ2.setObjectName(_fromUtf8("input_organ2")) self.formLayout.setWidget(19, QtGui.QFormLayout.FieldRole, self.input_organ2) self.label_21 = QtGui.QLabel(Dialog) self.label_21.setEnabled(True) self.label_21.setMaximumSize(QtCore.QSize(16777215, 10)) self.label_21.setObjectName(_fromUtf8("label_21")) self.formLayout.setWidget(23, QtGui.QFormLayout.LabelRole, self.label_21) self.max_human = QtGui.QLineEdit(Dialog) self.max_human.setEnabled(False) self.max_human.setObjectName(_fromUtf8("max_human")) self.formLayout.setWidget(23, QtGui.QFormLayout.FieldRole, self.max_human) self.groupBox_4 = QtGui.QGroupBox(Dialog) self.groupBox_4.setEnabled(True) self.groupBox_4.setObjectName(_fromUtf8("groupBox_4")) self.gridLayout_3 = QtGui.QGridLayout(self.groupBox_4) self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) self.label_13 = QtGui.QLabel(self.groupBox_4) self.label_13.setEnabled(False) self.label_13.setObjectName(_fromUtf8("label_13")) self.gridLayout_3.addWidget(self.label_13, 0, 0, 1, 1) self.set_max_snp = QtGui.QLineEdit(self.groupBox_4) self.set_max_snp.setEnabled(False) self.set_max_snp.setObjectName(_fromUtf8("set_max_snp")) self.gridLayout_3.addWidget(self.set_max_snp, 1, 0, 1, 1) self.cross_dimer = QtGui.QLineEdit(self.groupBox_4) self.cross_dimer.setEnabled(True) self.cross_dimer.setObjectName(_fromUtf8("cross_dimer")) self.gridLayout_3.addWidget(self.cross_dimer, 1, 1, 1, 1) self.set_max_human = QtGui.QLineEdit(self.groupBox_4) self.set_max_human.setEnabled(False) self.set_max_human.setObjectName(_fromUtf8("set_max_human")) self.gridLayout_3.addWidget(self.set_max_human, 1, 2, 1, 1) self.label_22 = QtGui.QLabel(self.groupBox_4) self.label_22.setEnabled(False) self.label_22.setObjectName(_fromUtf8("label_22")) self.gridLayout_3.addWidget(self.label_22, 0, 2, 1, 1) self.label_25 = QtGui.QLabel(self.groupBox_4) self.label_25.setEnabled(True) self.label_25.setObjectName(_fromUtf8("label_25")) self.gridLayout_3.addWidget(self.label_25, 0, 1, 1, 1) self.formLayout.setWidget(24, QtGui.QFormLayout.SpanningRole, self.groupBox_4) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.label_20 = QtGui.QLabel(Dialog) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.label_20.setFont(font) self.label_20.setObjectName(_fromUtf8("label_20")) self.horizontalLayout_4.addWidget(self.label_20) self.output_fname = QtGui.QLineEdit(Dialog) self.output_fname.setObjectName(_fromUtf8("output_fname")) self.horizontalLayout_4.addWidget(self.output_fname) self.pushButton_output = QtGui.QPushButton(Dialog) self.pushButton_output.setEnabled(True) self.pushButton_output.setObjectName(_fromUtf8("pushButton_output")) self.horizontalLayout_4.addWidget(self.pushButton_output) self.formLayout.setLayout(26, QtGui.QFormLayout.SpanningRole, self.horizontalLayout_4) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.pushButton_help = QtGui.QPushButton(Dialog) self.pushButton_help.setEnabled(True) self.pushButton_help.setObjectName(_fromUtf8("pushButton_help")) self.horizontalLayout.addWidget(self.pushButton_help) self.buttonBox_gui = QtGui.QDialogButtonBox(Dialog) self.buttonBox_gui.setOrientation(QtCore.Qt.Horizontal) self.buttonBox_gui.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox_gui.setObjectName(_fromUtf8("buttonBox_gui")) self.horizontalLayout.addWidget(self.buttonBox_gui) self.formLayout.setLayout(27, QtGui.QFormLayout.SpanningRole, self.horizontalLayout) self.add_button = QtGui.QPushButton(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.add_button.sizePolicy().hasHeightForWidth()) self.add_button.setSizePolicy(sizePolicy) self.add_button.setObjectName(_fromUtf8("add_button")) self.formLayout.setWidget(18, QtGui.QFormLayout.FieldRole, self.add_button) self.label_19.setBuddy(self.snp_fname) self.label_11.setBuddy(self.max_snp) self.label_21.setBuddy(self.max_human) self.label_13.setBuddy(self.set_max_snp) self.label_22.setBuddy(self.set_max_human) # self.ui.lineEdit_add3 = QtGui.QLineEdit(Dialog) # self.ui.lineEdit_add3.setGeometry(QtCore.QRect(70, 20, 281, 21)) # self.ui.lineEdit_add3.setObjectName("lineEdit_3") # self.ui.lineEdit_add3.setText(QtGui.QApplication.translate("Form", "", None, QtGui.QApplication.UnicodeUTF8)) # completer = QCompleter() # self.ui.lineEdit_add3.setCompleter(completer) # model = QStringListModel() # completer.setModel(model) # completer.setModelSorting(QCompleter.CaseInsensitivelySortedModel) # Expar.get_data(model) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox_gui, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox_gui, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.label_19.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.snp_fname.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.pushButton_snpfile.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.max_snp.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.label_13.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.set_max_snp.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.label_11.setEnabled) QtCore.QObject.connect(Dialog, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.hide) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ.setDisabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ2.setDisabled) QtCore.QObject.connect(self.human_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.max_human.setEnabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.max_human.setDisabled) QtCore.QObject.connect(self.no_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ.setDisabled) QtCore.QObject.connect(self.no_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ2.setDisabled) QtCore.QObject.connect(self.no_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.max_human.setDisabled) QtCore.QObject.connect(self.human_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ.setDisabled) QtCore.QObject.connect(self.human_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ2.setDisabled) QtCore.QObject.connect(self.human_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.max_human.setEnabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ.setEnabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.max_human.setEnabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), Dialog.setEnabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ2.setEnabled) QtCore.QMetaObject.connectSlotsByName(Dialog)
class ProjectExecution(QWidget): 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(resources.IMAGES['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(resources.IMAGES['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(resources.IMAGES['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(resources.IMAGES['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) def _load_python_path(self): path = QFileDialog.getOpenFileName( self, self.tr("Select Python Path")) self.txtPythonPath.setText(path) def _load_python_venv(self): venv = QFileDialog.getExistingDirectory( self, self.tr("Select Virtualenv Folder")) if sys.platform == 'win32': venv = os.path.join(venv, 'Scripts', 'python.exe') else: venv = os.path.join(venv, 'bin', 'python') #check if venv folder exists if not os.path.exists(venv): QMessageBox.information(self, self.tr("Virtualenv Folder"), self.tr("This is not a valid Virtualenv Folder")) self.txtVenvPath.setText("") else: self.txtVenvPath.setText(venv) def select_file(self): fileName = QFileDialog.getOpenFileName( self, self.tr("Select Main File"), self._parent._item.path, '(*.py);;(*.*)') if fileName != '': fileName = file_manager.convert_to_relative( self._parent._item.path, fileName) self.path.setText(fileName) def select_pre_exec_script(self): fileName = QFileDialog.getOpenFileName( self, self.tr("Select Pre Execution Script File"), self._parent._item.path, '(*.*)') if fileName != '': fileName = file_manager.convert_to_relative( self._parent._item.path, fileName) self.txtPreExec.setText(fileName) def select_post_exec_script(self): fileName = QFileDialog.getOpenFileName( self, self.tr("Select Post Execution Script File"), self._parent._item.path, '(*.*)') if fileName != '': fileName = file_manager.convert_to_relative( self._parent._item.path, fileName) self.txtPostExec.setText(fileName)
class MyMainWindow(QMainWindow): ' Main Window ' 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 get_fake_tree(self, target): """Return the fake tree.""" try: fake_tree = check_output(NUITKA + ' --dump-xml ' + target, shell=True) except: fake_tree = "ERROR: Failed to get Tree Dump." finally: return fake_tree.strip() def run(self): ' run the actual backend process ' self.treeview_nodes.clear() self.textedit_source.clear() self.output.clear() self.statusBar().showMessage('WAIT!, Working...') target = str(self.target.text()).strip() self.treeview_nodes.setText(self.get_fake_tree(target)) self.textedit_source.setText(open(target, "r").read().strip()) conditional_1 = sys.platform.startswith('linux') conditional_2 = self.combo3.currentIndex() != 2 command_to_run_nuitka = " ".join( ('chrt -i 0' if conditional_1 and conditional_2 else '', NUITKA, '--debug' if self.slider1.value() else '', '--verbose' if self.slider2.value() else '', '--show-progress' if self.slider3.value() else '', '--show-scons --show-modules' if self.slider4.value() else '', '--unstriped' if self.slider5.value() else '', '--trace-execution' if self.slider6.value() else '', '--remove-output' if self.slider7.value() else '', '--no-optimization' if self.slider8.value() else '', '--code-gen-no-statement-lines' if self.slider9.value() else '', '--execute' if self.slider10.value() else '', '--recurse-all' if self.slider1a.value() else '', '--recurse-none' if self.slider2a.value() else '', '--recurse-stdlib' if self.slider3a.value() else '', '--clang' if self.slider4a.value() else '', '--lto' if self.slider5a.value() else '', '--windows-disable-console' if self.slider6a.value() else '', '--windows-target' if self.slider7a.value() else '', '--python-debug' if self.slider8a.value() else '', '--exe' if self.slider9a.value() else '', '--standalone' if self.slider10a.value() else '', '--module' if self.slider11a.value() else '', '--nofreeze-stdlib' if self.slider12a.value() else '', '--mingw' if self.slider13a.value() else '', '--warn-implicit-exceptions' if self.slider11.value() else '', '--execute-with-pythonpath' if self.slider12.value() else '', '--enhanced' if self.slider13.value() else '', '--icon="{}"'.format(self.icon.text()) if self.icon.text() else '', '--python-version={}'.format( self.combo1.currentText()), '--jobs={}'.format( self.combo3.currentText()), '--output-dir="{}"'.format( self.outdir.text()), "{}".format(target))) if DEBUG: print(command_to_run_nuitka) self.process.start(command_to_run_nuitka) if not self.process.waitForStarted() and not IS_WIN: return # ERROR ! self.statusBar().showMessage(__doc__.title()) def _process_finished(self): """finished sucessfully""" self.output.setFocus() self.output.selectAll() def read_output(self): """Read and append output to the log""" self.output.append(str(self.process.readAllStandardOutput())) def read_errors(self): """Read and append errors to the log""" self.output.append(str(self.process.readAllStandardError())) def paintEvent(self, event): """Paint semi-transparent background,animated pattern,background text""" if not A11Y: p = QPainter(self) p.setRenderHint(QPainter.Antialiasing) p.setRenderHint(QPainter.TextAntialiasing) p.setRenderHint(QPainter.HighQualityAntialiasing) p.fillRect(event.rect(), Qt.transparent) # animated random dots background pattern for i in range(4096): x = randint(25, self.size().width() - 25) y = randint(25, self.size().height() - 25) # p.setPen(QPen(QColor(randint(9, 255), 255, 255), 1)) p.drawPoint(x, y) p.setPen(QPen(Qt.white, 1)) p.rotate(40) p.setFont(QFont('Ubuntu', 250)) p.drawText(200, 99, "Nuitka") p.rotate(-40) p.setPen(Qt.NoPen) p.setBrush(QColor(0, 0, 0)) p.setOpacity(0.8) p.drawRoundedRect(self.rect(), 9, 9) p.end() def set_guimode(self): """Switch between simple and full UX""" for widget in (self.group2, self.group3, self.group4, self.group5, self.icon, self.icon_label, self.btn3, self.toolbar, self.statusBar()): widget.hide() if self.guimode.currentIndex() else widget.show()
class tbFactura( QTabWidget ,Ui_tbFactura ): """ Implementacion de la interfaz grafica para facturas """ web = "facturas.php?doc=" DATE_FORMAT = "dd/MM/yyyy" def __init__( self ): ''' Constructor ''' super( tbFactura, self ).__init__( ) # ESTABLECER LA INTERFAZ AL FORMULARIO self.setupUi(self) # VALIDADOR DE MODO DE EDICION self.readOnly = True self.editmodel = None #ESTABLECER LA FECHA INICIAL , (establecida al dia de mañana) self.categoriesview.headers = ["Descripcion", "Precio", "Unidades","Existencia","","",""] # Crear el modelo para cargar catalogo de clientes self.clientesModel = QSqlQueryModel() # Crear lista de autocompletado para el combo de clientes self.clienteCompleter = QCompleter() # Modelo que carga el catalogo de productos self.existenciaModel = QSqlQueryModel() # Establecer todos los controles en modo de edicion self.setControls( False ) # Crear la conexion a la base de datos self.database = QSqlDatabase.database() self.vistaprevia = False # Cargar los modelos del modo de edicion self.updateEditModels() self.parent = self.parent() def newDocument( self ): """ activar todos los controles, llenar los modelos necesarios, crear el modelo FacturaModel, aniadir una linea a la tabla """ self.readOnly = False if not self.updateEditModels(): return self.status = False self.dtPicker.setDate( self.parentWindow.datosSesion.fecha ) def updateEditModels( self ): """ Este metodo actualiza los modelos usados en el modo edición """ resultado = False try: if not self.database.isOpen(): if not self.database.open(): raise UserWarning( u"No se pudo abrir la conexión "\ + "con la base de datos" ) self.clientesModel.setQuery( """ SELECT idpersona , nombre AS cliente FROM personas WHERE escliente = 1 """) self.cbcliente.setModel( self.clientesModel ) self.cbcliente.setModelColumn( 1 ) self.clienteCompleter.setCaseSensitivity( Qt.CaseInsensitive ) self.clienteCompleter.setModel( self.clientesModel ) self.clienteCompleter.setCompletionColumn( 1 ) self.cbcliente.setCompleter( self.clienteCompleter ) self.editmodel = FacturaModel( ) # Cargar el numero de la factura actual query = QSqlQuery( """ SELECT MAX(CAST( IFNULL(referencia,0) AS SIGNED)) FROM documentos d WHERE idtipodoc =%d; """ % constantes.IDFACTURA ) if not query.exec_(): raise Exception( "No se pudo obtener el numero de la factura" ) query.first() if query.size()==0: n =1 else: n = str(int(query.value(0)) + 1) self.editmodel.printedDocumentNumber = str(int(query.value(0)) + 1) self.lblnumero.setText(n) # if self.clientesModel.rowCount() == 0: # raise UserWarning( "No existen clientes en la"\ # + " base de datos" ) # return self.clienteCompleter.setModel(self.clientesModel) self.cbcliente.setModel(self.clientesModel) self.cbcliente.setCompleter(self.clienteCompleter) # #Crear el delegado con los articulo y verificar si existen articulos self.existenciaModel.setQuery( QSqlQuery( """ SELECT categoria, descripcion, precio, unidadesxcaja, -- cajas, 100 as cajas, idprecioproducto FROM vw_articulos -- WHERE existencia >0 """ ) ) self.categoriesview.update(""" SELECT categoria, descripcion, precio, unidadesxcaja, -- cajas, 100 as cajas, idprecioproducto FROM vw_articulos WHERE idprecioproducto IS NOT NULL -- WHERE existencia >0 """) self.categoriesview.expandAll() self.categoriesview.setColumnHidden(3,True) self.categoriesview.setColumnHidden(4,True) self.categoriesview.setColumnWidth(0,150) self.categoriesview.setColumnWidth(1,60) self.categoriesview.setColumnWidth(2,20) self.proxyexistenciaModel = SingleSelectionModel() self.proxyexistenciaModel.setSourceModel( self.existenciaModel ) # self.proxyexistenciaModel.setFilterKeyColumn( IDBODEGAEX ) if self.proxyexistenciaModel.rowCount() == 0: raise UserWarning( "No hay articulos en bodega" ) delegate = FacturaDelegate( self.proxyexistenciaModel ) self.tabledetails.setItemDelegate( delegate ) self.tabledetails.setModel( self.editmodel ) self.tabledetails.setColumnHidden(0,True) # self.editmodel.insertRow(1) self.editmodel.dataChanged[QModelIndex, QModelIndex].connect( self.updateLabels ) self.txtobservaciones.setPlainText( "" ) self.dtPicker.setDate(QDate.currentDate().addDays(1)) self.editmodel.fecha = QDate.currentDate().addDays(1) self.cbcliente.setCurrentIndex( -1 ) resultado = True except UserWarning as inst: logging.error( unicode( inst ) ) QMessageBox.critical( self, qApp.organizationName(), unicode( inst ) ) finally: if self.database.isOpen(): self.database.close() return resultado def addActionsToToolBar( self ): self.actionRefresh = self.createAction( text = "Actualizar", icon = QIcon.fromTheme( 'view-refresh', QIcon( ":/icons/res/view-refresh.png" ) ), slot = self.refresh, shortcut = Qt.Key_F5 ) self.toolBar.addActions( [ self.actionNew, self.actionRefresh, self.actionPreview, self.actionPrint, self.actionSave, self.actionCancel, ] ) self.toolBar.addSeparator() self.toolBar.addActions( [ self.actionGoFirst, self.actionGoPrevious, self.actionGoLast, self.actionGoNext, self.actionGoLast ] ) def refresh( self ): """ Actualizar los modelos de edición """ if not self.status: if QMessageBox.question( self, qApp.organizationName(), u"Se perderán todos los cambios en la factura. ¿Esta seguro que desea actualizar?", QMessageBox.Yes | QMessageBox.No ) == QMessageBox.No: return self.updateEditModels() else: if self.updateModels(): QMessageBox.information( None, "Factura", u"Los datos fueron actualizados con éxito" ) def printDocument1(self): html = u"" date = QDate.currentDate().toString(self.DATE_FORMAT) address = Qt.escape("Bario francisco mesa").replace(",","<br>") contact = Qt.escape("Luis Mejia") balance = 5000 html += ("<p align=right><img src=':/logo.png'></p>" "<p> align = right>Greasy hands ltd." "<br>New Lombard Street" "<br>London<br>WC13 4PX<br>%s</p>" "<p>%s</p><p>Dear %s, </p>" "<p>The balance of your account is %s.")% ( date, address, contact, QString("$ %L1").arg(float(balance),0,"f",2)) if balance <0 : html += ("<p><font color =red><b> Please remit the amount owing immediately.</b></font>") else: html += "We are delighted to have done business with you." html += ("</p><p> </p><p>" "<table border=1 cellpadding=2 cellspacing=2><tr><td colspan=3>Transaction</td></tr>") transactions = [ (QDate.currentDate(),500), (QDate.currentDate(),500), (QDate.currentDate(),-500), (QDate.currentDate(),500) ] for date, amount in transactions: color, status = "black", "Credit" if amount <0: color, status = "red", "Debid" html += ("<tr>" "<td align= right>%s</td>" "<td>%s</td><td align=right><font color=%s>%s</font></td></tr>" % ( date.toString(self.DATE_FORMAT), status,color, QString("$ %L1").arg(float(abs(amount)), 0, "f",2))) html += ("</table></p><p style='page-break-after=always;'>" "We hope to continue doing business with you</p>") pdialog = QPrintDialog() if pdialog.exec_() == QDialog.Accepted: printer = pdialog.printer() document = QTextDocument() document.setHtml(html) document.print_(printer) def printDocument2(self): dialog = QPrintDialog() if not dialog.exec_(): return self.printer = dialog.printer() headFormat = QTextBlockFormat() headFormat.setAlignment(Qt.AlignLeft) headFormat.setTextIndent( self.printer.pageRect().width()-216) bodyFormat = QTextBlockFormat() bodyFormat.setAlignment(Qt.AlignJustify) lastParaBodyFormat = QTextBlockFormat(bodyFormat) lastParaBodyFormat.setPageBreakPolicy(QTextFormat.PageBreak_AlwaysAfter) rightBodyFormat = QTextBlockFormat() rightBodyFormat.setAlignment(Qt.AlignRight) headCharFormat = QTextCharFormat() headCharFormat.setFont(QFont("Helvetica",10)) bodyCharFormat = QTextCharFormat() bodyCharFormat.setFont(QFont("Times",11)) redBodyCharFormat = QTextCharFormat(bodyCharFormat) redBodyCharFormat.setForeground(Qt.red) tableFormat = QTextTableFormat() tableFormat.setBorder(1) tableFormat.setCellPadding(2) document = QTextDocument() cursor = QTextCursor(document) mainFrame = cursor.currentFrame() page = 1 cursor.insertBlock(headFormat, headCharFormat) for text in ("Greasy Hands Ltd.", "New Lombard Street","London" , "WC13", QDate.currentDate().toString(self.DATE_FORMAT)): cursor.insertBlock(headFormat,headCharFormat) cursor.insertText(text) cursor.insertBlock(bodyFormat,bodyCharFormat) cursor.insertText("Barrio Francisco Meza") cursor.insertBlock(bodyFormat) cursor.insertBlock(bodyFormat,bodyCharFormat) cursor.insertText("Dear Lyuis") cursor.insertBlock(bodyFormat) cursor.insertBlock(bodyFormat,bodyCharFormat) cursor.insertText(QString("The balance of your account is $ %L1.").arg(float(500.987),0,"f",2)) cursor.insertBlock(bodyFormat,redBodyCharFormat) cursor.insertText("Please remit the amount") cursor.insertBlock(bodyFormat,bodyCharFormat) cursor.insertText("Transaction") transactions = [ (QDate.currentDate(),500), (QDate.currentDate(),500), (QDate.currentDate(),-500), (QDate.currentDate(),500) ] table = cursor.insertTable(len(transactions), 3, tableFormat) row = 0 for date, amount in transactions: cellCursor = table.cellAt(row,0).firstCursorPosition() cellCursor.setBlockFormat(rightBodyFormat) cellCursor.insertText(date.toString(self.DATE_FORMAT),bodyCharFormat) cellCursor = table.cellAt(row,1).firstCursorPosition() cellCursor.insertText("Credit",bodyCharFormat) cellCursor = table.cellAt(row,2).firstCursorPosition() cellCursor.setBlockFormat(rightBodyFormat) cellCursor.insertText(QString("The balance of your account is $ %L1.").arg(float(amount),0,"f",2),redBodyCharFormat) row += 1 cursor.setPosition(mainFrame.lastPosition()) cursor.insertBlock(bodyFormat,bodyCharFormat) cursor.insertText("We hope") document.print_(self.printer) def printDocument(self): dialog = QPrintDialog() if not dialog.exec_(): return self.printer = dialog.printer() self.imprimir(self.printer) self.document.load(self.editmodel) def preview(self): self.vistaprevia = True preview = frmImpresion(self) preview.exec_() def save( self ): """ Guardar el documento actual @rtype: bool """ result = False try: if not self.valid: return False if QMessageBox.question( self, qApp.organizationName(), u"¿Esta seguro que desea guardar la factura?", QMessageBox.Yes | QMessageBox.No ) == QMessageBox.Yes: if not self.database.isOpen(): if not self.database.open(): raise UserWarning( u"No se pudo conectar con la base de datos" ) self.editmodel.observaciones = self.txtobservaciones.toPlainText() if not self.editmodel.save(): raise UserWarning( "No se ha podido guardar la factura" ) QMessageBox.information( None, qApp.organizationName() , u"""El documento se ha guardado con éxito""" ) self.readOnly = True self.updateModels() # self.navigate( 'last' ) # self.status = True result = True except UserWarning as inst: logging.error( unicode( inst ) ) QMessageBox.critical( self, qApp.organizationName(), unicode( inst ) ) except Exception as inst: logging.critical( unicode( inst ) ) QMessageBox.critical( self, qApp.organizationName(), u"Hubo un error al guardar la factura" ) finally: if self.database.isOpen(): self.database.close() return result # @pyqtSlot(QModelIndex) # def on_categoriesview_doubleClicked(self,index): @pyqtSlot(QModelIndex) def on_categoriesview_activated(self,index): articulo = self.categoriesview.model().asRecord(index) if len(articulo)>0: nuevo = True for i, line in enumerate(self.editmodel.lines): if line.itemId == articulo [5]: nuevo = False fila = i line = self.editmodel.lines[self.editmodel.rowCount()-1] if nuevo: fila = self.editmodel.rowCount() self.editmodel.insertRow(fila) self.parent.saveAct.setEnabled(True) linea = self.editmodel.lines[fila] linea.itemDescription = articulo[0] + " " + articulo [1] linea.itemPrice = Decimal(articulo[2]) linea.itemId = articulo[5] linea.quantityperbox = int(articulo[3]) self.editmodel.lines[fila].quantity += 1 self.editmodel.lines[fila].existencia = int(articulo[4]) - self.editmodel.lines[fila].quantity indice =self.editmodel.index( fila,2) self.editmodel.dataChanged.emit( indice, indice ) indice =self.editmodel.index( fila,3) self.editmodel.dataChanged.emit( indice, indice ) indice =self.editmodel.index( fila,5) self.editmodel.dataChanged.emit( indice, indice ) @pyqtSlot() def on_btneditar_clicked( self ): articulo = dlgArticulo(self) articulo.exec_() self.updateEditModels() @pyqtSlot( int ) def on_cbcliente_currentIndexChanged( self, index ): """ asignar proveedor al objeto self.editmodel """ if self.editmodel is not None: numero = self.clientesModel.record( index ).value( "idpersona" ) self.editmodel.clienteId = int(numero) if numero is not None else 0 @pyqtSlot( unicode ) def on_cbcliente_editTextChanged( self, text ): """ asignar proveedor al objeto self.editmodel """ if self.editmodel is not None: self.editmodel.cliente =str( text) @pyqtSlot( int ) def on_cbvendedor_currentIndexChanged( self, index ): """ asignar proveedor al objeto self.editmodel """ self.editmodel.vendedorId = self.vendedoresModel.record( index ).value( "idpersona" ).toInt()[0] @pyqtSlot( QDate) def on_dtPicker_dateChanged( self, date ): if self.editmodel is not None: self.editmodel.fecha = date @pyqtSlot( bool ) def on_rbcontado_toggled( self, on ): """ Asignar las observaciones al objeto editmodel """ self.editmodel.escontado = 1 if on else 0 def on_txtSearch_textChanged( self, text ): """ Cambiar el filtro de busqueda """ self.filtermodel.setFilterRegExp( text ) def setControls( self, status ): """ @param status: false = editando true = navegando """ # self.actionPrint.setVisible( status ) self.readOnly = status self.txtobservaciones.setReadOnly( status ) # self.actionPreview.setVisible( status ) # self.actionAnular.setVisible( status ) # self.toolBar.setVisible(status) # self.lblnfac.setText( self.editmodel.printedDocumentNumber ) self.swcliente.setCurrentIndex( 0 ) self.lbltotal.setText( "C$ 0.00" ) self.tabledetails.setEditTriggers( QAbstractItemView.AllEditTriggers ) # self.lblanulado.setHidden( True ) self.tabledetails.horizontalHeader().setStretchLastSection(True) self.tabledetails.setColumnHidden( IDARTICULO, True ) self.tabledetails.setColumnHidden( IDDOCUMENTOT, True ) def updateLabels( self ): self.lbltotal.setText( moneyfmt( self.editmodel.total, 2, "C$ " ) ) @property def valid( self ): """ Un documento es valido cuando self.printedDocumentNumber != "" self.providerId !=0 self.validLines >0 self.ivaId !=0 self.uid != 0 self.warehouseId != 0 """ if int( self.editmodel.clienteId) == 0 and self.editmodel.cliente == "": QMessageBox.warning( self, qApp.organizationName(), "Por favor elija el cliente" ) self.cbcliente.setFocus() elif self.editmodel.rowCount() == 0: QMessageBox.warning( self, qApp.organizationName(), "Por favor agregue algun articulo a la factura" ) else: return True return False def imprimir(self,printer): leftMargin = 72 widthCol = 100 arialFont = QFont("Helvetica",16,3) fuente =QFontMetrics(arialFont) arialLineHeight = fuente.height() fondo = QPixmap(":/images/res/fondo.png") painter = QPainter(printer) pageRect = printer.pageRect() page = 1 painter.save() if self.vistaprevia: painter.drawPixmap(0, 0, 530, 830, fondo) painter.setFont(arialFont) y = 180 x = 35 painter.drawText(x,y,self.editmodel.fecha.toString("dd MM yy")) y = 210 x = 85 painter.drawText(x,y, self.editmodel.cliente) painter.setFont(arialFont) cajasFont = QFont("Helvetica",10,2) x = -5 y = 295 painter.setFont(cajasFont) painter.drawText(x,y - arialLineHeight - 1,"Cajas") for row in self.editmodel.lines: painter.setFont(cajasFont) x = 2 painter.drawText(x,y,row.cantidad()) painter.setFont(arialFont) total = moneyfmt(row.total,2,"") x = 470 - fuente.width(total) painter.drawText(x,y,total) x =310 painter.drawText(x,y,moneyfmt(row.itemPrice,2,"")) x = 30 painter.drawText(x,y,row.unidades()) x = 80 painter.drawText(x,y,row.itemDescription) y+= arialLineHeight total = moneyfmt(self.editmodel.total,2,"") y= 690 x = 470 - fuente.width(total) painter.drawText(x,y,total) painter.setPen(Qt.black) # printer.newPage() painter.restore()
class OWGEODatasets(OWWidget): name = "GEO Data Sets" description = DESCRIPTION icon = "../widgets/icons/GEODataSets.svg" priority = PRIORITY inputs = [] outputs = [("Expression Data", Orange.data.Table)] settingsList = ["outputRows", "mergeSpots", "gdsSelectionStates", "splitterSettings", "currentGds", "autoCommit", "datasetNames"] outputRows = Setting(False) mergeSpots = Setting(True) gdsSelectionStates = Setting({}) currentGds = Setting(None) datasetNames = Setting({}) splitterSettings = Setting( (b'\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x01\xea\x00\x00\x00\xd7\x01\x00\x00\x00\x07\x01\x00\x00\x00\x02', b'\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x01\xb5\x00\x00\x02\x10\x01\x00\x00\x00\x07\x01\x00\x00\x00\x01') ) autoCommit = Setting(True) def __init__(self, parent=None, signalManager=None, name=" GEO Data Sets"): OWWidget.__init__(self, parent, signalManager, name) self.selectionChanged = False self.filterString = "" self.datasetName = "" ## GUI box = gui.widgetBox(self.controlArea, "Info", addSpace=True) self.infoBox = gui.widgetLabel(box, "Initializing\n\n") box = gui.widgetBox(self.controlArea, "Output", addSpace=True) gui.radioButtonsInBox(box, self, "outputRows", ["Genes or spots", "Samples"], "Rows", callback=self.commitIf) gui.checkBox(box, self, "mergeSpots", "Merge spots of same gene", callback=self.commitIf) gui.separator(box) self.nameEdit = gui.lineEdit( box, self, "datasetName", "Data set name", tooltip="Override the default output data set name", callback=self.onNameEdited ) self.nameEdit.setPlaceholderText("") if sys.version_info < (3, ): box = gui.widgetBox(self.controlArea, "Commit", addSpace=True) self.commitButton = gui.button( box, self, "Commit", callback=self.commit) cb = gui.checkBox(box, self, "autoCommit", "Commit on any change") gui.setStopper(self, self.commitButton, cb, "selectionChanged", self.commit) else: gui.auto_commit(self.controlArea, self, "autoCommit", "Commit", box="Commit") gui.rubber(self.controlArea) # self.filterLineEdit = OWGUIEx.lineEditHint( # self.mainArea, self, "filterString", "Filter", # caseSensitive=False, matchAnywhere=True, # callback=self.filter, delimiters=" ") gui.widgetLabel(self.mainArea, "Filter") self.filterLineEdit = QLineEdit( textChanged=self.filter ) self.completer = QCompleter( caseSensitivity=Qt.CaseInsensitive ) self.completer.setModel(QStringListModel(self)) self.filterLineEdit.setCompleter(self.completer) self.mainArea.layout().addWidget(self.filterLineEdit) splitter = QSplitter(Qt.Vertical, self.mainArea) self.mainArea.layout().addWidget(splitter) self.treeWidget = QTreeView(splitter) self.treeWidget.setSelectionMode(QTreeView.SingleSelection) self.treeWidget.setRootIsDecorated(False) self.treeWidget.setSortingEnabled(True) self.treeWidget.setAlternatingRowColors(True) self.treeWidget.setUniformRowHeights(True) self.treeWidget.setEditTriggers(QTreeView.NoEditTriggers) linkdelegate = LinkStyledItemDelegate(self.treeWidget) self.treeWidget.setItemDelegateForColumn(1, linkdelegate) self.treeWidget.setItemDelegateForColumn(8, linkdelegate) self.treeWidget.setItemDelegateForColumn( 0, gui.IndicatorItemDelegate(self.treeWidget, role=Qt.DisplayRole)) proxyModel = MySortFilterProxyModel(self.treeWidget) self.treeWidget.setModel(proxyModel) self.treeWidget.selectionModel().selectionChanged.connect( self.updateSelection ) self.treeWidget.viewport().setMouseTracking(True) splitterH = QSplitter(Qt.Horizontal, splitter) box = gui.widgetBox(splitterH, "Description") self.infoGDS = gui.widgetLabel(box, "") self.infoGDS.setWordWrap(True) gui.rubber(box) box = gui.widgetBox(splitterH, "Sample Annotations") self.annotationsTree = QTreeWidget(box) self.annotationsTree.setHeaderLabels( ["Type (Sample annotations)", "Sample count"] ) self.annotationsTree.setRootIsDecorated(True) box.layout().addWidget(self.annotationsTree) self.annotationsTree.itemChanged.connect( self.annotationSelectionChanged ) self._annotationsUpdating = False self.splitters = splitter, splitterH for sp, setting in zip(self.splitters, self.splitterSettings): sp.splitterMoved.connect(self.splitterMoved) sp.restoreState(setting) self.searchKeys = ["dataset_id", "title", "platform_organism", "description"] self.gds = [] self.gds_info = None self.resize(1000, 600) self.setBlocking(True) self.setEnabled(False) self.progressBarInit() self._executor = ThreadExecutor() func = partial(get_gds_model, methodinvoke(self, "_setProgress", (float,))) self._inittask = Task(function=func) self._inittask.finished.connect(self._initializemodel) self._executor.submit(self._inittask) self._datatask = None @Slot(float) def _setProgress(self, value): self.progressBarValue = value def _initializemodel(self): assert self.thread() is QThread.currentThread() model, self.gds_info, self.gds = self._inittask.result() model.setParent(self) proxy = self.treeWidget.model() proxy.setFilterKeyColumn(0) proxy.setFilterRole(TextFilterRole) proxy.setFilterCaseSensitivity(False) proxy.setFilterFixedString(self.filterString) proxy.setSourceModel(model) proxy.sort(0, Qt.DescendingOrder) self.progressBarFinished() self.setBlocking(False) self.setEnabled(True) filter_items = " ".join( gds[key] for gds in self.gds for key in self.searchKeys ) tr_chars = ",.:;!?(){}[]_-+\\|/%#@$^&*<>~`" tr_table = str.maketrans(tr_chars, " " * len(tr_chars)) filter_items = filter_items.translate(tr_table) filter_items = sorted(set(filter_items.split(" "))) filter_items = [item for item in filter_items if len(item) > 3] self.completer.model().setStringList(filter_items) # self.filterLineEdit.setItems(filter_items) if self.currentGds: current_id = self.currentGds["dataset_id"] gdss = [(i, qunpack(proxy.data(proxy.index(i, 1), Qt.DisplayRole))) for i in range(proxy.rowCount())] current = [i for i, data in gdss if data and data == current_id] if current: current_index = proxy.index(current[0], 0) self.treeWidget.selectionModel().select( current_index, QItemSelectionModel.Select | QItemSelectionModel.Rows ) self.treeWidget.scrollTo( current_index, QTreeView.PositionAtCenter) for i in range(8): self.treeWidget.resizeColumnToContents(i) self.treeWidget.setColumnWidth( 1, min(self.treeWidget.columnWidth(1), 300)) self.treeWidget.setColumnWidth( 2, min(self.treeWidget.columnWidth(2), 200)) self.updateInfo() def updateInfo(self): gds_info = self.gds_info text = ("%i datasets\n%i datasets cached\n" % (len(gds_info), len(glob.glob(serverfiles.localpath("GEO") + "/GDS*")))) filtered = self.treeWidget.model().rowCount() if len(self.gds) != filtered: text += ("%i after filtering") % filtered self.infoBox.setText(text) def updateSelection(self, *args): current = self.treeWidget.selectedIndexes() mapToSource = self.treeWidget.model().mapToSource current = [mapToSource(index).row() for index in current] if current: self.currentGds = self.gds[current[0]] self.setAnnotations(self.currentGds) self.infoGDS.setText(self.currentGds.get("description", "")) self.nameEdit.setPlaceholderText(self.currentGds["title"]) self.datasetName = \ self.datasetNames.get(self.currentGds["dataset_id"], "") else: self.currentGds = None self.nameEdit.setPlaceholderText("") self.datasetName = "" self.commitIf() def setAnnotations(self, gds): self._annotationsUpdating = True self.annotationsTree.clear() annotations = defaultdict(set) subsetscount = {} for desc in gds["subsets"]: annotations[desc["type"]].add(desc["description"]) subsetscount[desc["description"]] = str(len(desc["sample_id"])) for type, subsets in annotations.items(): key = (gds["dataset_id"], type) subsetItem = QTreeWidgetItem(self.annotationsTree, [type]) subsetItem.setFlags(subsetItem.flags() | Qt.ItemIsUserCheckable | Qt.ItemIsTristate) subsetItem.setCheckState( 0, self.gdsSelectionStates.get(key, Qt.Checked) ) subsetItem.key = key for subset in subsets: key = (gds["dataset_id"], type, subset) item = QTreeWidgetItem( subsetItem, [subset, subsetscount.get(subset, "")] ) item.setFlags(item.flags() | Qt.ItemIsUserCheckable) item.setCheckState( 0, self.gdsSelectionStates.get(key, Qt.Checked) ) item.key = key self._annotationsUpdating = False self.annotationsTree.expandAll() for i in range(self.annotationsTree.columnCount()): self.annotationsTree.resizeColumnToContents(i) def annotationSelectionChanged(self, item, column): if self._annotationsUpdating: return for i in range(self.annotationsTree.topLevelItemCount()): item = self.annotationsTree.topLevelItem(i) self.gdsSelectionStates[item.key] = item.checkState(0) for j in range(item.childCount()): child = item.child(j) self.gdsSelectionStates[child.key] = child.checkState(0) def filter(self): filter_string = unicode(self.filterLineEdit.text()) proxyModel = self.treeWidget.model() if proxyModel: strings = filter_string.lower().strip().split() proxyModel.setFilterFixedStrings(strings) self.updateInfo() def selectedSamples(self): """ Return the currently selected sample annotations. The return value is a list of selected (sample type, sample value) tuples. .. note:: if some Sample annotation type has no selected values. this method will return all values for it. """ samples = [] unused_types = [] used_types = [] for stype in childiter(self.annotationsTree.invisibleRootItem()): selected_values = [] all_values = [] for sval in childiter(stype): value = (str(stype.text(0)), str(sval.text(0))) if self.gdsSelectionStates.get(sval.key, True): selected_values.append(value) all_values.append(value) if selected_values: samples.extend(selected_values) used_types.append(str(stype.text(0))) else: # If no sample of sample type is selected we don't filter # on it. samples.extend(all_values) unused_types.append(str(stype.text(0))) return samples, used_types def commitIf(self): if self.autoCommit: self.commit() else: self.selectionChanged = True def commit(self): if self.currentGds: self.error(0) sample_type = None self.progressBarInit() self.progressBarSet(10) _, groups = self.selectedSamples() if len(groups) == 1 and self.outputRows: sample_type = groups[0] self.setEnabled(False) self.setBlocking(True) def get_data(gds_id, report_genes, transpose, sample_type, title): gds = geo.GDS(gds_id) data = gds.getdata( report_genes=report_genes, transpose=transpose, sample_type=sample_type ) data.name = title return data get_data = partial( get_data, self.currentGds["dataset_id"], report_genes=self.mergeSpots, transpose=self.outputRows, sample_type=sample_type, title=self.datasetName or self.currentGds["title"] ) self._datatask = Task(function=get_data) self._datatask.finished.connect(self._on_dataready) self._executor.submit(self._datatask) def _on_dataready(self): self.setEnabled(True) self.setBlocking(False) self.progressBarSet(50) try: data = self._datatask.result() except urlrequest.URLError as error: self.error(0, "Error while connecting to the NCBI ftp server! %r" % error) self._datatask = None self.progressBarFinished() return self._datatask = None data_name = data.name samples, _ = self.selectedSamples() self.warning(0) message = None if self.outputRows: def samplesinst(ex): out = [] for meta in data.domain.metas: out.append((meta.name, ex[meta].value)) if data.domain.class_var.name != 'class': out.append((data.domain.class_var.name, ex[data.domain.class_var].value)) return out samples = set(samples) mask = [samples.issuperset(samplesinst(ex)) for ex in data] data = data[numpy.array(mask, dtype=bool)] if len(data) == 0: message = "No samples with selected sample annotations." else: samples = set(samples) domain = Orange.data.Domain( [attr for attr in data.domain.attributes if samples.issuperset(attr.attributes.items())], data.domain.class_var, data.domain.metas ) # domain.addmetas(data.domain.getmetas()) if len(domain.attributes) == 0: message = "No samples with selected sample annotations." stypes = set(s[0] for s in samples) for attr in domain.attributes: attr.attributes = dict( (key, value) for key, value in attr.attributes.items() if key in stypes ) data = Orange.data.Table(domain, data) if message is not None: self.warning(0, message) data_hints.set_hint(data, "taxid", self.currentGds.get("taxid", ""), 10.0) data_hints.set_hint(data, "genesinrows", self.outputRows, 10.0) self.progressBarFinished() data.name = data_name self.send("Expression Data", data) model = self.treeWidget.model().sourceModel() row = self.gds.index(self.currentGds) model.setData(model.index(row, 0), " ", Qt.DisplayRole) self.updateInfo() self.selectionChanged = False def splitterMoved(self, *args): self.splitterSettings = [str(sp.saveState()) for sp in self.splitters] def onDeleteWidget(self): if self._inittask: self._inittask.future().cancel() self._inittask.finished.disconnect(self._initializemodel) if self._datatask: self._datatask.future().cancel() self._datatask.finished.disconnect(self._on_dataready) self._executor.shutdown(wait=False) super(OWGEODatasets, self).onDeleteWidget() def onNameEdited(self): if self.currentGds: gds_id = self.currentGds["dataset_id"] self.datasetNames[gds_id] = unicode(self.nameEdit.text()) self.commitIf()
class ManualInstallWidget(QWidget): """Manually Installed plugins widget""" 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 _load_plugin_path(self): """Ask the user a plugin filename""" path = QFileDialog.getOpenFileName(self, translations.TR_SELECT_PLUGIN_PATH) if path: self._txtFilePath.setText(path) def install_plugin(self): """Install a plugin manually""" if self._txtFilePath.text() and self._txtName.text(): plug = [] plug.append(self._txtName.text()) plug.append(self._txtVersion.text()) plug.append('') plug.append('') plug.append('') plug.append(self._txtFilePath.text()) self._parent.install_plugins_manually([plug])
class ProjectExecution(QWidget): 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.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) def _load_python_path(self): path = QFileDialog.getOpenFileName( translations.TR_PROJECT_SELECT_PYTHON_PATH) self.txtPythonInterpreter.setText(path) def _load_python_venv(self): venv = QFileDialog.getExistingDirectory( translations.TR_PROJECT_SELECT_VIRTUALENV) if sys.platform == 'win32': venv = os.path.join(venv, 'Scripts', 'python.exe') else: venv = os.path.join(venv, 'bin', 'python') #check if venv folder exists if not os.path.exists(venv): QMessageBox.information(self, translations.TR_PROJECT_SELECT_VIRTUALENV_MESSAGE_TITLE, translations.TR_PROJECT_SELECT_VIRTUALENV_MESSAGE_BODY) self.txtVenvPath.setText("") else: self.txtVenvPath.setText(venv) def select_file(self): fileName = QFileDialog.getOpenFileName( self, translations.TR_PROJECT_SELECT_MAIN_FILE, self._parent.project.path, 'PY(*.py);;*(*.*)') if fileName != '': fileName = file_manager.convert_to_relative( self._parent.project.path, fileName) self.path.setText(fileName) def select_pre_exec_script(self): fileName = QFileDialog.getOpenFileName( self, translations.TR_PROJECT_SELECT_PRE_SCRIPT, self._parent.project.path, '(*.*)') if fileName != '': fileName = file_manager.convert_to_relative( self._parent.project.path, fileName) self.txtPreExec.setText(fileName) def select_post_exec_script(self): fileName = QFileDialog.getOpenFileName( self, translations.TR_PROJECT_SELECT_POST_SCRIPT, self._parent.project.path, '(*.*)') if fileName != '': fileName = file_manager.convert_to_relative( self._parent.project.path, fileName) self.txtPostExec.setText(fileName)
class Edit(ParentAction): def __init__(self, iface, settings, controller, plugin_dir): """ Class to control toolbar 'edit' """ self.minor_version = "3.0" ParentAction.__init__(self, iface, settings, controller, plugin_dir) # Get tables or views specified in 'db' config section self.table_arc = self.settings.value('db/table_arc', 'v_edit_arc') self.table_node = self.settings.value('db/table_node', 'v_edit_node') self.table_connec = self.settings.value('db/table_connec', 'v_edit_connec') self.table_gully = self.settings.value('db/table_gully', 'v_edit_gully') self.table_man_arc = self.settings.value('db/table_man_arc', 'v_edit_man_arc') self.table_man_node = self.settings.value('db/table_man_node', 'v_edit_man_node') self.table_man_connec = self.settings.value('db/table_man_connec', 'v_edit_man_connec') self.table_man_gully = self.settings.value('db/table_man_gully', 'v_edit_man_gully') self.table_version = self.settings.value('db/table_version', 'version') # Tables connec_group self.table_wjoin = self.settings.value('db/table_wjoin', 'v_edit_man_wjoin') self.table_tap = self.settings.value('db/table_tap', 'v_edit_man_tap') self.table_greentap = self.settings.value('db/table_greentap', 'v_edit_man_greentap') self.table_fountain = self.settings.value('db/table_fountain', 'v_edit_man_fountain') # Tables node_group self.table_tank = self.settings.value('db/table_tank', 'v_edit_man_tank') self.table_pump = self.settings.value('db/table_pump', 'v_edit_man_pump') self.table_source = self.settings.value('db/table_source', 'v_edit_man_source') self.table_meter = self.settings.value('db/table_meter', 'v_edit_man_meter') self.table_junction = self.settings.value('db/table_junction', 'v_edit_man_junction') self.table_waterwell = self.settings.value('db/table_waterwell', 'v_edit_man_waterwell') self.table_reduction = self.settings.value('db/table_reduction', 'v_edit_man_reduction') self.table_hydrant = self.settings.value('db/table_hydrant', 'v_edit_man_hydrant') self.table_valve = self.settings.value('db/table_valve', 'v_edit_man_valve') self.table_manhole = self.settings.value('db/table_manhole', 'v_edit_man_manhole') # Tables arc_group self.table_varc = self.settings.value('db/table_varc', 'v_edit_man_varc') self.table_siphon = self.settings.value('db/table_siphon', 'v_edit_man_siphon') self.table_conduit = self.settings.value('db/table_conduit', 'v_edit_man_conduit') self.table_waccel = self.settings.value('db/table_waccel', 'v_edit_man_waccel') self.table_chamber = self.settings.value('db/table_chamber', 'v_edit_man_chamber') self.table_chamber_pol = self.settings.value('db/table_chamber', 'v_edit_man_chamber_pol') self.table_netgully = self.settings.value('db/table_netgully', 'v_edit_man_netgully') self.table_netgully_pol = self.settings.value('db/table_netgully_pol', 'v_edit_man_netgully_pol') self.table_netinit = self.settings.value('db/table_netinit', 'v_edit_man_netinit') self.table_wjump = self.settings.value('db/table_wjump', 'v_edit_man_wjump') self.table_wwtp = self.settings.value('db/table_wwtp', 'v_edit_man_wwtp') self.table_wwtp_pol = self.settings.value('db/table_wwtp_pol', 'v_edit_man_wwtp_pol') self.table_storage = self.settings.value('db/table_storage', 'v_edit_man_storage') self.table_storage_pol = self.settings.value('db/table_storage_pol', 'v_edit_man_storage_pol') self.table_outfall = self.settings.value('db/table_outfall', 'v_edit_man_outfall') def set_project_type(self, project_type): self.project_type = project_type def edit_add_feature(self, layername): """ Button 01, 02: Add 'node' or 'arc' """ # Set active layer and triggers action Add Feature layer = self.controller.get_layer_by_layername(layername) if layer: self.iface.setActiveLayer(layer) layer.startEditing() self.iface.actionAddFeature().trigger() def edit_arc_topo_repair(self): """ Button 19: Topology repair """ # Create dialog to check wich topology functions we want to execute self.dlg = TopologyTools() if self.project_type == 'ws': self.dlg.tab_review.removeTab(1) # Set signals self.dlg.btn_accept.clicked.connect(self.edit_arc_topo_repair_accept) self.dlg.btn_cancel.clicked.connect(self.close_dialog) # Manage i18n of the form and open it self.controller.translate_form(self.dlg, 'topology_tools') self.dlg.exec_() def edit_arc_topo_repair_accept(self): """ Button 19: Executes functions that are selected """ # Review/Utils if self.dlg.check_node_orphan.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_anl_node_orphan();" self.controller.execute_sql(sql) if self.dlg.check_node_duplicated.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_anl_node_duplicated();" self.controller.execute_sql(sql) if self.dlg.check_topology_coherence.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_anl_node_topological_consistency();" self.controller.execute_sql(sql) if self.dlg.check_arc_same_start_end.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_anl_arc_same_startend();" self.controller.execute_sql(sql) if self.dlg.check_arcs_without_nodes_start_end.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_anl_arc_no_startend_node();" self.controller.execute_sql(sql) if self.dlg.check_connec_duplicated.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_anl_connec_duplicated();" self.controller.execute_sql(sql) # Review/UD if self.dlg.check_node_sink.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_anl_node_sink();" self.controller.execute_sql(sql) if self.dlg.check_node_flow_regulator.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_anl_node_flowregulator();" self.controller.execute_sql(sql) if self.dlg.check_node_exit_upper_node_entry.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_anl_node_exit_upper_intro();" self.controller.execute_sql(sql) if self.dlg.check_arc_intersection_without_node.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_anl_arc_intersection();" self.controller.execute_sql(sql) if self.dlg.check_inverted_arcs.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_anl_arc_inverted();" self.controller.execute_sql(sql) # Builder if self.dlg.check_create_nodes_from_arcs.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_built_nodefromarc();" self.controller.execute_sql(sql) # Repair if self.dlg.check_arc_searchnodes.isChecked(): sql = "SELECT "+self.schema_name+".gw_fct_repair_arc_searchnodes();" self.controller.execute_sql(sql) # Close the dialog self.close_dialog() # Refresh map canvas self.refresh_map_canvas() def edit_add_element(self): """ Button 33: Add element """ # Create the dialog and signals self.dlg = AddElement() utils_giswater.setDialog(self.dlg) self.set_icon(self.dlg.add_geom, "129") self.dlg.btn_accept.pressed.connect(self.ed_add_element_accept) self.dlg.btn_cancel.pressed.connect(self.close_dialog) # Manage i18n of the form self.controller.translate_form(self.dlg, 'element') # Check if we have at least one feature selected if not self.edit_check(): return # Fill combo boxes self.populate_combo("elementcat_id", "cat_element") self.populate_combo("state", "value_state") self.populate_combo("location_type", "man_type_location") self.populate_combo("workcat_id", "cat_work") self.populate_combo("buildercat_id", "cat_builder") self.populate_combo("ownercat_id", "cat_owner") self.populate_combo("verified", "value_verified") self.populate_combo("workcat_id_end", "cat_work") # Adding auto-completion to a QLineEdit self.edit = self.dlg.findChild(QLineEdit, "element_id") self.completer = QCompleter() self.edit.setCompleter(self.completer) model = QStringListModel() sql = "SELECT DISTINCT(element_id) FROM " + self.schema_name + ".element " row = self.dao.get_rows(sql) for i in range(0, len(row)): aux = row[i] row[i] = str(aux[0]) model.setStringList(row) self.completer.setModel(model) # Set signal to reach selected value from QCompleter self.completer.activated.connect(self.ed_add_el_autocomplete) self.dlg.add_geom.pressed.connect(self.add_point) # Open the dialog self.dlg.setWindowFlags(Qt.WindowStaysOnTopHint) self.dlg.open() def edit_add_file(self): """ Button 34: Add document """ # Create the dialog and signals self.dlg = AddDoc() utils_giswater.setDialog(self.dlg) self.dlg.btn_accept.pressed.connect(self.edit_add_file_accept) self.dlg.btn_cancel.pressed.connect(self.close_dialog) # Get widgets self.dlg.path_url.clicked.connect(partial(self.open_web_browser, "path")) self.dlg.path_doc.clicked.connect(partial(self.get_file_dialog, "path")) # Manage i18n of the form self.controller.translate_form(self.dlg, 'file') # Check if we have at least one feature selected if not self.edit_check(): return # Fill combo boxes self.populate_combo("doc_type", "doc_type") # Adding auto-completion to a QLineEdit self.completer = QCompleter() self.dlg.doc_id.setCompleter(self.completer) model = QStringListModel() sql = "SELECT DISTINCT(id) FROM " + self.schema_name + ".doc " row = self.dao.get_rows(sql) for i in range(0, len(row)): aux = row[i] row[i] = str(aux[0]) model.setStringList(row) self.completer.setModel(model) # Set signal to reach selected value from QCompleter self.completer.activated.connect(self.edit_add_file_autocomplete) # Open the dialog self.dlg.exec_() def edit_add_file_autocomplete(self): """ Once we select 'element_id' using autocomplete, fill widgets with current values """ self.dlg.doc_id.setCompleter(self.completer) doc_id = utils_giswater.getWidgetText("doc_id") # Get values from database sql = "SELECT doc_type, tagcat_id, observ, path" sql += " FROM " + self.schema_name + ".doc" sql += " WHERE id = '" + doc_id + "'" row = self.dao.get_row(sql) # Fill widgets columns_length = self.dao.get_columns_length() for i in range(0, columns_length): column_name = self.dao.get_column_name(i) utils_giswater.setWidgetText(column_name, row[column_name]) def edit_add_file_accept(self): """ Insert or update table 'document'. Add document to selected feature """ # Get values from dialog doc_id = utils_giswater.getWidgetText("doc_id") doc_type = utils_giswater.getWidgetText("doc_type") tagcat_id = utils_giswater.getWidgetText("tagcat_id") observ = utils_giswater.getWidgetText("observ") path = utils_giswater.getWidgetText("path") if doc_id == 'null': # Show warning message message = "You need to insert doc_id" self.controller.show_warning(message) return # Check if this document already exists sql = "SELECT DISTINCT(id) FROM " + self.schema_name + ".doc WHERE id = '" + doc_id + "'" row = self.dao.get_row(sql) # If document already exist perform an UPDATE if row: answer = self.controller.ask_question("Are you sure you want change the data?") if answer: sql = "UPDATE " + self.schema_name + ".doc " sql += " SET doc_type = '" + doc_type + "', observ = '" + observ + "', path = '" + path + "'" sql += " WHERE id = '" + doc_id + "'" status = self.controller.execute_sql(sql) if status: self.ed_add_to_feature("doc", doc_id) message = "Values has been updated" self.controller.show_info(message) # If document doesn't exist perform an INSERT else: sql = "INSERT INTO " + self.schema_name + ".doc (id, doc_type, path, observ) " sql += " VALUES ('" + doc_id + "', '" + doc_type + "', '" + path + "', '" + observ + "')" status = self.controller.execute_sql(sql) if status: self.ed_add_to_feature("doc", doc_id) message = "Values has been updated" self.controller.show_info(message) if not status: message = "Error inserting element in table, you need to review data" self.controller.show_warning(message) return self.close_dialog() def add_point(self): """ Create the appropriate map tool and connect to the corresponding signal """ map_canvas = self.iface.mapCanvas() self.emit_point = QgsMapToolEmitPoint(map_canvas) map_canvas.setMapTool(self.emit_point) self.emit_point.canvasClicked.connect(partial(self.get_xy)) def get_xy(self, point): self.x = point.x() self.y = point.y() self.emit_point.canvasClicked.disconnect() def ed_add_el_autocomplete(self): """ Once we select 'element_id' using autocomplete, fill widgets with current values """ self.dlg.element_id.setCompleter(self.completer) element_id = utils_giswater.getWidgetText("element_id") # Get values from database sql = "SELECT elementcat_id, location_type, ownercat_id, state, workcat_id," sql += " buildercat_id, annotation, observ, comment, link, verified, rotation" sql += " FROM " + self.schema_name + ".element" sql += " WHERE element_id = '" + element_id + "'" row = self.dao.get_row(sql) # Fill widgets columns_length = self.dao.get_columns_length() for i in range(0, columns_length): column_name = self.dao.get_column_name(i) utils_giswater.setWidgetText(column_name, row[column_name]) def ed_add_element_accept(self): """ Insert or update table 'element'. Add element to selected features """ # Get values from dialog element_id = utils_giswater.getWidgetText("element_id") elementcat_id = utils_giswater.getWidgetText("elementcat_id") workcat_id_end = utils_giswater.getWidgetText("workcat_id_end") state = utils_giswater.getWidgetText("state") annotation = utils_giswater.getWidgetText("annotation") observ = utils_giswater.getWidgetText("observ") comment = utils_giswater.getWidgetText("comment") location_type = utils_giswater.getWidgetText("location_type") workcat_id = utils_giswater.getWidgetText("workcat_id") buildercat_id = utils_giswater.getWidgetText("buildercat_id") ownercat_id = utils_giswater.getWidgetText("ownercat_id") rotation = utils_giswater.getWidgetText("rotation") link = utils_giswater.getWidgetText("link") verified = utils_giswater.getWidgetText("verified") if element_id == 'null': # Show warning message message = "You need to insert element_id" self.controller.show_warning(message) return # Get SRID srid = self.controller.plugin_settings_value('srid') # Check if we already have data with selected element_id sql = "SELECT DISTINCT(element_id) FROM " + self.schema_name + ".element WHERE element_id = '" + str(element_id) + "'" row = self.dao.get_row(sql) # If element already exist perform an UPDATE if row: answer = self.controller.ask_question("Are you sure you want change the data?") if answer: sql = "UPDATE " + self.schema_name + ".element" sql += " SET elementcat_id = '" + elementcat_id + "', state = '" + state + "', location_type = '" + location_type + "'" sql += ", workcat_id_end = '" + workcat_id_end + "', workcat_id = '" + workcat_id + "', buildercat_id = '" + buildercat_id + "', ownercat_id = '" + ownercat_id + "'" sql += ", rotation = '" + rotation + "',comment = '" + comment + "', annotation = '" + annotation + "', observ = '" + observ + "', link = '" + link + "', verified = '" + verified + "'" sql += ", the_geom = ST_SetSRID(ST_MakePoint(" + str(self.x) + "," + str(self.y) + "), " + str(srid) +")" sql += " WHERE element_id = '" + element_id + "'" status = self.controller.execute_sql(sql) if status: self.ed_add_to_feature("element", element_id) message = "Values has been updated" self.controller.show_info(message) # If element doesn't exist perform an INSERT else: sql = "INSERT INTO " + self.schema_name + ".element (element_id, elementcat_id, state, location_type" sql += ", workcat_id, buildercat_id, ownercat_id, rotation, comment, annotation, observ, link, verified, workcat_id_end, the_geom) " sql += " VALUES ('" + element_id + "', '" + elementcat_id + "', '" + state + "', '" + location_type + "', '" sql += workcat_id + "', '" + buildercat_id + "', '" + ownercat_id + "', '" + rotation + "', '" + comment + "', '" sql += annotation + "','" + observ + "','" + link + "','" + verified + "','" + workcat_id_end + "'," sql += "ST_SetSRID(ST_MakePoint(" + str(self.x) + "," + str(self.y) + "), " + str(srid) +")" status = self.controller.execute_sql(sql) if status: self.ed_add_to_feature("element", element_id) message = "Values has been updated" self.controller.show_info(message) if not status: message = "Error inserting element in table, you need to review data" self.controller.show_warning(message) return self.close_dialog(self.dlg) self.refresh_map_canvas() def ed_add_to_feature(self, table_name, value_id): """ Add document or element to selected features """ # Get schema and table name of selected layer layer_source = self.controller.get_layer_source(self.layer) uri_table = layer_source['table'] if uri_table is None: msg = "Error getting table name from selected layer" self.controller.show_warning(msg) return elem_type = None field_id = None if self.table_arc in uri_table: elem_type = "arc" field_id = "arc_id" if self.table_node in uri_table: elem_type = "node" field_id = "node_id" if self.table_connec in uri_table: elem_type = "connec" field_id = "connec_id" if self.table_gully in uri_table: elem_type = "gully" field_id = "gully_id" if self.table_man_arc in uri_table: elem_type = "arc" field_id = "arc_id" if self.table_man_node in uri_table: elem_type = "node" field_id = "node_id" if self.table_man_connec in uri_table: elem_type = "connec" field_id = "connec_id" if self.table_man_gully in uri_table: elem_type = "gully" field_id = "gully_id" if self.table_wjoin in uri_table: elem_type = "connec" field_id = "connec_id" if self.table_tap in uri_table: elem_type = "connec" field_id = "connec_id" if self.table_greentap in uri_table: elem_type = "connec" field_id = "connec_id" if self.table_fountain in uri_table: elem_type = "connec" field_id = "connec_id" if self.table_tank in uri_table: elem_type = "node" field_id = "node_id" if self.table_pump in uri_table: elem_type = "node" field_id = "node_id" if self.table_source in uri_table: elem_type = "node" field_id = "node_id" if self.table_meter in uri_table: elem_type = "node" field_id = "node_id" if self.table_junction in uri_table: elem_type = "node" field_id = "node_id" if self.table_waterwell in uri_table: elem_type = "node" field_id = "node_id" if self.table_reduction in uri_table: elem_type = "node" field_id = "node_id" if self.table_hydrant in uri_table: elem_type = "node" field_id = "node_id" if self.table_valve in uri_table: elem_type = "node" field_id = "node_id" if self.table_manhole in uri_table: elem_type = "node" field_id = "node_id" if self.table_chamber in uri_table: elem_type = "node" field_id = "node_id" if self.table_chamber_pol in uri_table: elem_type = "node" field_id = "node_id" if self.table_netgully in uri_table: elem_type = "node" field_id = "node_id" if self.table_netgully_pol in uri_table: elem_type = "node" field_id = "node_id" if self.table_netinit in uri_table: elem_type = "node" field_id = "node_id" if self.table_wjump in uri_table: elem_type = "node" field_id = "node_id" if self.table_wwtp in uri_table: elem_type = "node" field_id = "node_id" if self.table_wwtp_pol in uri_table: elem_type = "node" field_id = "node_id" if self.table_storage in uri_table: elem_type = "node" field_id = "node_id" if self.table_storage_pol in uri_table: elem_type = "node" field_id = "node_id" if self.table_outfall in uri_table: elem_type = "node" field_id = "node_id" if self.table_varc in uri_table: elem_type = "arc" field_id = "arc_id" if self.table_siphon in uri_table: elem_type = "arc" field_id = "arc_id" if self.table_conduit in uri_table: elem_type = "arc" field_id = "arc_id" if self.table_waccel in uri_table: elem_type = "arc" field_id = "arc_id" if 'v_edit_man_pipe' in uri_table: elem_type = "arc" field_id = "arc_id" if field_id is None: self.controller.show_info("Current active layer is different than selected features") return # Get selected features features = self.layer.selectedFeatures() for feature in features: elem_id = feature.attribute(field_id) sql = "SELECT * FROM " + self.schema_name + "." + table_name + "_x_" + elem_type sql += " WHERE " + field_id + " = '" + elem_id + "' AND " + value_id + " = " + table_name + "_id" row = self.dao.get_row(sql) if row is None: sql = "INSERT INTO " + self.schema_name + "." + table_name + "_x_" + elem_type + " (" + field_id + ", " + table_name + "_id) " sql += " VALUES ('" + elem_id + "', '" + value_id + "')" self.controller.execute_sql(sql) def edit_check(self): """ Initial check for buttons 33 and 34 """ # Check if at least one node is checked self.layer = self.iface.activeLayer() if self.layer is None: message = "You have to select a layer" self.controller.show_info(message) return False count = self.layer.selectedFeatureCount() if count == 0: message = "You have to select at least one feature!" self.controller.show_info(message) return False return True def edit_config_edit(self): """ Button 98: Open a dialog showing data from table 'config_param_user' """ # Create the dialog and signals self.dlg = ConfigEdit() utils_giswater.setDialog(self.dlg) self.load_settings(self.dlg) self.dlg.btn_accept.pressed.connect(self.edit_config_edit_accept) self.dlg.btn_cancel.pressed.connect(partial(self.close_dialog, self.dlg)) self.dlg.rejected.connect(partial(self.save_settings, self.dlg)) # Set values from widgets of type QComboBox and dates sql = "SELECT DISTINCT(name) FROM " + self.schema_name + ".value_state ORDER BY name" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("state_vdefault", rows) sql = "SELECT id FROM " + self.schema_name + ".cat_work ORDER BY id" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("workcat_vdefault", rows) sql = "SELECT id FROM " + self.schema_name + ".value_verified ORDER BY id" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("verified_vdefault", rows) sql = 'SELECT value FROM ' + self.schema_name + '.config_param_user' sql += ' WHERE "cur_user" = current_user AND parameter = ' + "'builtdate_vdefault'" row = self.controller.get_row(sql) if row is not None: date_value = datetime.strptime(row[0], '%Y-%m-%d') else: date_value = QDate.currentDate() utils_giswater.setCalendarDate("builtdate_vdefault", date_value) sql = 'SELECT value FROM ' + self.schema_name + '.config_param_user' sql += ' WHERE "cur_user" = current_user AND parameter = ' + "'enddate_vdefault'" row = self.controller.get_row(sql) if row is not None: date_value = datetime.strptime(row[0], '%Y-%m-%d') else: date_value = QDate.currentDate() utils_giswater.setCalendarDate("enddate_vdefault", date_value) sql = "SELECT id FROM " + self.schema_name + ".cat_arc ORDER BY id" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("arccat_vdefault", rows) sql = "SELECT id FROM " + self.schema_name + ".cat_node ORDER BY id" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("nodecat_vdefault", rows) sql = "SELECT id FROM " + self.schema_name + ".cat_connec ORDER BY id" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("connecat_vdefault", rows) sql = "SELECT id FROM " + self.schema_name + ".cat_element ORDER BY id" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("elementcat_vdefault", rows) sql = "SELECT DISTINCT(name) FROM " + self.schema_name + ".exploitation ORDER BY name" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("exploitation_vdefault", rows) sql = "SELECT DISTINCT(name) FROM " + self.schema_name + ".ext_municipality ORDER BY name" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("municipality_vdefault", rows) sql = "SELECT DISTINCT(name) FROM " + self.schema_name + ".om_visit_cat ORDER BY name" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("visitcat_vdefault", rows) # UD sql = "SELECT id FROM " + self.schema_name + ".node_type ORDER BY id" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("nodetype_vdefault", rows) sql = "SELECT id FROM " + self.schema_name + ".arc_type ORDER BY id" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("arctype_vdefault", rows) sql = "SELECT id FROM " + self.schema_name + ".connec_type ORDER BY id" rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("connectype_vdefault", rows) # Set current values sql = "SELECT parameter, value FROM " + self.schema_name + ".config_param_user WHERE cur_user = current_user" rows = self.controller.get_rows(sql) for row in rows: utils_giswater.setWidgetText(str(row[0]), str(row[1])) utils_giswater.setChecked("chk_" + str(row[0]), True) # TODO PARAMETRIZAR ESTO!!!!! # Manage parameters 'state_vdefault', 'exploitation_vdefault', 'municipality_vdefault', 'visitcat_vdefault' sql = "SELECT name FROM " + self.schema_name + ".value_state WHERE id::text = " sql += "(SELECT value FROM " + self.schema_name + ".config_param_user WHERE parameter = 'state_vdefault')::text" row = self.controller.get_row(sql) if row: utils_giswater.setWidgetText("state_vdefault", str(row[0])) sql = "SELECT name FROM " + self.schema_name + ".exploitation WHERE expl_id::text = " sql += "(SELECT value FROM " + self.schema_name + ".config_param_user WHERE parameter = 'exploitation_vdefault')::text" row = self.controller.get_row(sql) if row: utils_giswater.setWidgetText("exploitation_vdefault", str(row[0])) sql = "SELECT name FROM " + self.schema_name + ".ext_municipality WHERE muni_id::text = " sql += "(SELECT value FROM " + self.schema_name + ".config_param_user WHERE parameter = 'municipality_vdefault')::text" row = self.controller.get_row(sql) if row: utils_giswater.setWidgetText("municipality_vdefault", str(row[0])) sql = "SELECT name FROM " + self.schema_name + ".om_visit_cat WHERE id::text = " sql += "(SELECT value FROM " + self.schema_name + ".config_param_user WHERE parameter = 'visitcat_vdefault')::text" row = self.controller.get_row(sql) if row: utils_giswater.setWidgetText("visitcat_vdefault", str(row[0])) if self.project_type == 'ws': self.dlg.tab_config.removeTab(1) self.dlg.tab_config.removeTab(1) elif self.project_type == 'ud': self.dlg.tab_config.removeTab(1) self.dlg.exec_() def edit_config_edit_accept(self): if utils_giswater.isChecked("chk_state_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.state_vdefault, "state_vdefault", "config_param_user") else: self.delete_row("state_vdefault", "config_param_user") if utils_giswater.isChecked("chk_workcat_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.workcat_vdefault, "workcat_vdefault", "config_param_user") else: self.delete_row("workcat_vdefault", "config_param_user") if utils_giswater.isChecked("chk_verified_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.verified_vdefault, "verified_vdefault", "config_param_user") else: self.delete_row("verified_vdefault", "config_param_user") if utils_giswater.isChecked("chk_builtdate_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.builtdate_vdefault, "builtdate_vdefault", "config_param_user") else: self.delete_row("builtdate_vdefault", "config_param_user") if utils_giswater.isChecked("chk_enddate_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.enddate_vdefault, "enddate_vdefault", "config_param_user") else: self.delete_row("enddate_vdefault", "config_param_user") if utils_giswater.isChecked("chk_arccat_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.arccat_vdefault, "arccat_vdefault", "config_param_user") else: self.delete_row("arccat_vdefault", "config_param_user") if utils_giswater.isChecked("chk_nodecat_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.nodecat_vdefault, "nodecat_vdefault", "config_param_user") else: self.delete_row("nodecat_vdefault", "config_param_user") if utils_giswater.isChecked("chk_connecat_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.connecat_vdefault, "connecat_vdefault", "config_param_user") else: self.delete_row("connecat_vdefault", "config_param_user") if utils_giswater.isChecked("chk_elementcat_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.elementcat_vdefault, "elementcat_vdefault", "config_param_user") else: self.delete_row("elementcat_vdefault", "config_param_user") if utils_giswater.isChecked("chk_exploitation_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.exploitation_vdefault, "exploitation_vdefault", "config_param_user") else: self.delete_row("exploitation_vdefault", "config_param_user") if utils_giswater.isChecked("chk_municipality_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.municipality_vdefault, "municipality_vdefault", "config_param_user") else: self.delete_row("municipality_vdefault", "config_param_user") if utils_giswater.isChecked("chk_visitcat_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.visitcat_vdefault, "visitcat_vdefault", "config_param_user") else: self.delete_row("visitcat_vdefault", "config_param_user") # UD if utils_giswater.isChecked("chk_nodetype_vdefault"): sql = "SELECT name FROM " + self.schema_name + ".value_state WHERE id::text = " sql += "(SELECT value FROM " + self.schema_name + ".config_param_user WHERE parameter = 'exploitation_vdefault')::text" row = self.controller.get_row(sql) if row: utils_giswater.setWidgetText("exploitation_vdefault", str(row[0])) self.insert_or_update_config_param_curuser(self.dlg.nodetype_vdefault, "nodetype_vdefault", "config_param_user") else: self.delete_row("nodetype_vdefault", "config_param_user") if utils_giswater.isChecked("chk_arctype_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.arctype_vdefault, "arctype_vdefault", "config_param_user") else: self.delete_row("arctype_vdefault", "config_param_user") if utils_giswater.isChecked("chk_connectype_vdefault"): self.insert_or_update_config_param_curuser(self.dlg.connectype_vdefault, "connectype_vdefault", "config_param_user") else: self.delete_row("connectype_vdefault", "config_param_user") message = "Values has been updated" self.controller.show_info(message) self.close_dialog(self.dlg) def insert_or_update_config_param_curuser(self, widget, parameter, tablename): """ Insert or update value of @parameter in @tablename with current_user control """ sql = ("SELECT parameter FROM " + self.schema_name + "." + tablename + "" " WHERE cur_user = current_user AND parameter = '" + str(parameter) + "'") exist_param = self.controller.get_row(sql) if type(widget) != QDateEdit: if widget.currentText() != "": if exist_param: sql = "UPDATE " + self.schema_name + "." + tablename + " SET value = " if widget.objectName() == 'state_vdefault': sql += "(SELECT id FROM " + self.schema_name + ".value_state WHERE name = '" + widget.currentText() + "')" sql += " WHERE parameter = 'state_vdefault' " elif widget.objectName() == 'exploitation_vdefault': sql += "(SELECT expl_id FROM " + self.schema_name + ".exploitation WHERE name = '" + widget.currentText() + "')" sql += " WHERE parameter = 'exploitation_vdefault' " elif widget.objectName() == 'municipality_vdefault': sql += "(SELECT muni_id FROM " + self.schema_name + ".ext_municipality WHERE name = '" + widget.currentText() + "')" sql += " WHERE parameter = 'municipality_vdefault' " elif widget.objectName() == 'visitcat_vdefault': sql += "(SELECT id FROM " + self.schema_name + ".om_visit_cat WHERE name = '" + widget.currentText() + "')" sql += " WHERE parameter = 'visitcat_vdefault' " else: sql += "'" + widget.currentText() + "' WHERE parameter = '" + parameter + "'" else: sql = 'INSERT INTO ' + self.schema_name + '.' + tablename + '(parameter, value, cur_user)' if widget.objectName() == 'state_vdefault': sql += " VALUES ('" + parameter + "', (SELECT id FROM " + self.schema_name + ".value_state WHERE name ='" + widget.currentText() + "'), current_user)" elif widget.objectName() == 'exploitation_vdefault': sql += " VALUES ('" + parameter + "', (SELECT expl_id FROM " + self.schema_name + ".exploitation WHERE name ='" + widget.currentText() + "'), current_user)" elif widget.objectName() == 'municipality_vdefault': sql += " VALUES ('" + parameter + "', (SELECT muni_id FROM " + self.schema_name + ".ext_municipality WHERE name ='" + widget.currentText() + "'), current_user)" elif widget.objectName() == 'visitcat_vdefault': sql += " VALUES ('" + parameter + "', (SELECT id FROM " + self.schema_name + ".om_visit_cat WHERE name ='" + widget.currentText() + "'), current_user)" else: sql += " VALUES ('" + parameter + "', '" + widget.currentText() + "', current_user)" else: if exist_param: sql = "UPDATE " + self.schema_name + "." + tablename + " SET value = " _date = widget.dateTime().toString('yyyy-MM-dd') sql += "'" + str(_date) + "' WHERE parameter = '" + parameter + "'" else: sql = 'INSERT INTO ' + self.schema_name + '.' + tablename + '(parameter, value, cur_user)' _date = widget.dateTime().toString('yyyy-MM-dd') sql += " VALUES ('" + parameter + "', '" + _date + "', current_user)" self.controller.execute_sql(sql) def delete_row(self, parameter, tablename): """ Delete value of @parameter in @tablename with current_user control """ sql = 'DELETE FROM ' + self.schema_name + '.' + tablename sql += ' WHERE "cur_user" = current_user AND parameter = ' + "'" + parameter + "'" self.controller.execute_sql(sql) def populate_combo(self, widget, table_name, field_name="id"): """ Executes query and fill combo box """ sql = "SELECT " + field_name sql += " FROM " + self.schema_name + "." + table_name + " ORDER BY " + field_name rows = self.dao.get_rows(sql) utils_giswater.fillComboBox(widget, rows) if len(rows) > 0: utils_giswater.setCurrentIndex(widget, 1) def edit_dimensions(self): """ Button 39: Dimensioning """ layer = self.controller.get_layer_by_tablename("v_edit_dimensions", show_warning=True) if layer: self.iface.setActiveLayer(layer) layer.startEditing() # Implement the Add Feature button self.iface.actionAddFeature().trigger()
class ProjectExecution(QWidget): 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) def _load_python_path(self): path = QFileDialog.getOpenFileName(self, self.tr("Select Python Path")) self.txtPythonPath.setText(path) def _load_python_venv(self): venv = QFileDialog.getExistingDirectory( self, self.tr("Select Virtualenv Folder")) if sys.platform == 'win32': venv = os.path.join(venv, 'Scripts', 'python.exe') else: venv = os.path.join(venv, 'bin', 'python') #check if venv folder exists if not os.path.exists(venv): QMessageBox.information( self, self.tr("Virtualenv Folder"), self.tr("This is not a valid Virtualenv Folder")) self.txtVenvPath.setText("") else: self.txtVenvPath.setText(venv) def select_file(self): fileName = QFileDialog.getOpenFileName(self, self.tr("Select Main File"), self._parent._item.path, '(*.py);;(*.*)') if fileName != '': fileName = file_manager.convert_to_relative( self._parent._item.path, fileName) self.path.setText(fileName) def select_pre_exec_script(self): fileName = QFileDialog.getOpenFileName( self, self.tr("Select Pre Execution Script File"), self._parent._item.path, '(*.*)') if fileName != '': fileName = file_manager.convert_to_relative( self._parent._item.path, fileName) self.txtPreExec.setText(fileName) def select_post_exec_script(self): fileName = QFileDialog.getOpenFileName( self, self.tr("Select Post Execution Script File"), self._parent._item.path, '(*.*)') if fileName != '': fileName = file_manager.convert_to_relative( self._parent._item.path, fileName) self.txtPostExec.setText(fileName)
def connectProjectsEdit(self): completer = QCompleter() self.ui.ProjectsEDIT.setCompleter(completer) model = ProjectsModel() completer.setModel(model)
def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.setEnabled(True) Dialog.resize(1080, 747) self.formLayout = QtGui.QFormLayout(Dialog) self.formLayout.setFieldGrowthPolicy( QtGui.QFormLayout.AllNonFixedFieldsGrow) self.formLayout.setObjectName(_fromUtf8("formLayout")) self.gridLayout_6 = QtGui.QGridLayout() self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6")) self.input_filename = QtGui.QLineEdit(Dialog) self.input_filename.setObjectName(_fromUtf8("input_filename")) self.gridLayout_6.addWidget(self.input_filename, 1, 1, 1, 1) self.label_14 = QtGui.QLabel(Dialog) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.label_14.setFont(font) self.label_14.setObjectName(_fromUtf8("label_14")) self.gridLayout_6.addWidget(self.label_14, 1, 0, 1, 1) self.pushButton_input = QtGui.QPushButton(Dialog) self.pushButton_input.setEnabled(True) self.pushButton_input.setObjectName(_fromUtf8("pushButton_input")) self.gridLayout_6.addWidget(self.pushButton_input, 1, 2, 1, 1) self.formLayout.setLayout(0, QtGui.QFormLayout.SpanningRole, self.gridLayout_6) self.length = QtGui.QGroupBox(Dialog) self.length.setEnabled(True) self.length.setObjectName(_fromUtf8("length")) self.gridLayout = QtGui.QGridLayout(self.length) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.label = QtGui.QLabel(self.length) self.label.setEnabled(True) self.label.setObjectName(_fromUtf8("label")) self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.max_70 = QtGui.QLineEdit(self.length) self.max_70.setEnabled(True) self.max_70.setObjectName(_fromUtf8("max_70")) self.gridLayout.addWidget(self.max_70, 3, 2, 1, 1) self.label_16 = QtGui.QLabel(self.length) self.label_16.setEnabled(True) self.label_16.setObjectName(_fromUtf8("label_16")) self.gridLayout.addWidget(self.label_16, 2, 2, 1, 1) self.max_5 = QtGui.QLineEdit(self.length) self.max_5.setEnabled(True) self.max_5.setObjectName(_fromUtf8("max_5")) self.gridLayout.addWidget(self.max_5, 1, 2, 1, 1) self.label_2 = QtGui.QLabel(self.length) self.label_2.setEnabled(True) self.label_2.setObjectName(_fromUtf8("label_2")) self.gridLayout.addWidget(self.label_2, 0, 2, 1, 1) self.primer_length_max = QtGui.QLineEdit(self.length) self.primer_length_max.setEnabled(True) self.primer_length_max.setObjectName(_fromUtf8("primer_length_max")) self.gridLayout.addWidget(self.primer_length_max, 1, 1, 1, 1) self.label_3 = QtGui.QLabel(self.length) self.label_3.setEnabled(True) self.label_3.setObjectName(_fromUtf8("label_3")) self.gridLayout.addWidget(self.label_3, 0, 1, 1, 1) self.min_30 = QtGui.QLineEdit(self.length) self.min_30.setEnabled(True) self.min_30.setObjectName(_fromUtf8("min_30")) self.gridLayout.addWidget(self.min_30, 3, 0, 1, 1) self.primer_length_min = QtGui.QLineEdit(self.length) self.primer_length_min.setEnabled(True) self.primer_length_min.setObjectName(_fromUtf8("primer_length_min")) self.gridLayout.addWidget(self.primer_length_min, 1, 0, 1, 1) self.label_15 = QtGui.QLabel(self.length) self.label_15.setEnabled(True) self.label_15.setObjectName(_fromUtf8("label_15")) self.gridLayout.addWidget(self.label_15, 2, 0, 1, 1) self.formLayout.setWidget(1, QtGui.QFormLayout.SpanningRole, self.length) self.groupBox_2 = QtGui.QGroupBox(Dialog) self.groupBox_2.setEnabled(True) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.gridLayout_5 = QtGui.QGridLayout(self.groupBox_2) self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) self.Mg = QtGui.QLineEdit(self.groupBox_2) self.Mg.setEnabled(True) self.Mg.setObjectName(_fromUtf8("Mg")) self.gridLayout_5.addWidget(self.Mg, 1, 1, 1, 1) self.label_5 = QtGui.QLabel(self.groupBox_2) self.label_5.setEnabled(True) self.label_5.setObjectName(_fromUtf8("label_5")) self.gridLayout_5.addWidget(self.label_5, 0, 1, 1, 1) self.label_4 = QtGui.QLabel(self.groupBox_2) self.label_4.setEnabled(True) self.label_4.setObjectName(_fromUtf8("label_4")) self.gridLayout_5.addWidget(self.label_4, 0, 0, 1, 1) self.oligo = QtGui.QLineEdit(self.groupBox_2) self.oligo.setEnabled(True) self.oligo.setObjectName(_fromUtf8("oligo")) self.gridLayout_5.addWidget(self.oligo, 1, 2, 1, 1) self.label_6 = QtGui.QLabel(self.groupBox_2) self.label_6.setEnabled(True) self.label_6.setObjectName(_fromUtf8("label_6")) self.gridLayout_5.addWidget(self.label_6, 0, 2, 1, 1) self.label_7 = QtGui.QLabel(self.groupBox_2) self.label_7.setEnabled(True) self.label_7.setObjectName(_fromUtf8("label_7")) self.gridLayout_5.addWidget(self.label_7, 0, 3, 1, 1) self.dNTP = QtGui.QLineEdit(self.groupBox_2) self.dNTP.setObjectName(_fromUtf8("dNTP")) self.gridLayout_5.addWidget(self.dNTP, 1, 3, 1, 1) self.salt = QtGui.QLineEdit(self.groupBox_2) self.salt.setEnabled(True) self.salt.setObjectName(_fromUtf8("salt")) self.gridLayout_5.addWidget(self.salt, 1, 0, 1, 1) self.formLayout.setWidget(5, QtGui.QFormLayout.SpanningRole, self.groupBox_2) self.bool_conservation = QtGui.QCheckBox(Dialog) self.bool_conservation.setEnabled(True) self.bool_conservation.setObjectName(_fromUtf8("bool_conservation")) self.formLayout.setWidget(8, QtGui.QFormLayout.LabelRole, self.bool_conservation) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.label_19 = QtGui.QLabel(Dialog) self.label_19.setEnabled(False) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.label_19.setFont(font) self.label_19.setObjectName(_fromUtf8("label_19")) self.horizontalLayout_2.addWidget(self.label_19) self.snp_fname = QtGui.QLineEdit(Dialog) self.snp_fname.setEnabled(False) self.snp_fname.setObjectName(_fromUtf8("snp_fname")) self.horizontalLayout_2.addWidget(self.snp_fname) self.pushButton_snpfile = QtGui.QPushButton(Dialog) self.pushButton_snpfile.setEnabled(False) self.pushButton_snpfile.setObjectName(_fromUtf8("pushButton_snpfile")) self.horizontalLayout_2.addWidget(self.pushButton_snpfile) self.formLayout.setLayout(9, QtGui.QFormLayout.FieldRole, self.horizontalLayout_2) self.groupBox_3 = QtGui.QGroupBox(Dialog) self.groupBox_3.setEnabled(True) self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) self.gridLayout_4 = QtGui.QGridLayout(self.groupBox_3) self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) self.maxTm = QtGui.QLineEdit(self.groupBox_3) self.maxTm.setEnabled(True) self.maxTm.setObjectName(_fromUtf8("maxTm")) self.gridLayout_4.addWidget(self.maxTm, 1, 1, 1, 1) self.minTm = QtGui.QLineEdit(self.groupBox_3) self.minTm.setEnabled(True) self.minTm.setObjectName(_fromUtf8("minTm")) self.gridLayout_4.addWidget(self.minTm, 1, 0, 1, 1) self.label_11 = QtGui.QLabel(self.groupBox_3) self.label_11.setEnabled(False) self.label_11.setObjectName(_fromUtf8("label_11")) self.gridLayout_4.addWidget(self.label_11, 0, 5, 1, 1) self.label_10 = QtGui.QLabel(self.groupBox_3) self.label_10.setEnabled(True) self.label_10.setObjectName(_fromUtf8("label_10")) self.gridLayout_4.addWidget(self.label_10, 0, 3, 1, 1) self.label_23 = QtGui.QLabel(self.groupBox_3) self.label_23.setEnabled(True) self.label_23.setObjectName(_fromUtf8("label_23")) self.gridLayout_4.addWidget(self.label_23, 0, 4, 1, 1) self.label_18 = QtGui.QLabel(self.groupBox_3) self.label_18.setEnabled(True) self.label_18.setObjectName(_fromUtf8("label_18")) self.gridLayout_4.addWidget(self.label_18, 0, 1, 1, 1) self.maxDG5 = QtGui.QLineEdit(self.groupBox_3) self.maxDG5.setEnabled(True) self.maxDG5.setObjectName(_fromUtf8("maxDG5")) self.gridLayout_4.addWidget(self.maxDG5, 1, 2, 1, 1) self.label_17 = QtGui.QLabel(self.groupBox_3) self.label_17.setEnabled(True) self.label_17.setObjectName(_fromUtf8("label_17")) self.gridLayout_4.addWidget(self.label_17, 0, 0, 1, 1) self.max_snp = QtGui.QLineEdit(self.groupBox_3) self.max_snp.setEnabled(False) self.max_snp.setObjectName(_fromUtf8("max_snp")) self.gridLayout_4.addWidget(self.max_snp, 1, 5, 1, 1) self.hairpin = QtGui.QLineEdit(self.groupBox_3) self.hairpin.setEnabled(True) self.hairpin.setObjectName(_fromUtf8("hairpin")) self.gridLayout_4.addWidget(self.hairpin, 1, 4, 1, 1) self.label_8 = QtGui.QLabel(self.groupBox_3) self.label_8.setEnabled(True) self.label_8.setObjectName(_fromUtf8("label_8")) self.gridLayout_4.addWidget(self.label_8, 0, 2, 1, 1) self.self_dimer = QtGui.QLineEdit(self.groupBox_3) self.self_dimer.setEnabled(True) self.self_dimer.setObjectName(_fromUtf8("self_dimer")) self.gridLayout_4.addWidget(self.self_dimer, 1, 3, 1, 1) self.formLayout.setWidget(10, QtGui.QFormLayout.SpanningRole, self.groupBox_3) self.no_cross_check_radio = QtGui.QRadioButton(Dialog) self.no_cross_check_radio.setChecked(True) self.no_cross_check_radio.setObjectName( _fromUtf8("no_cross_check_radio")) self.formLayout.setWidget(14, QtGui.QFormLayout.LabelRole, self.no_cross_check_radio) self.human_cross_check_radio = QtGui.QRadioButton(Dialog) self.human_cross_check_radio.setObjectName( _fromUtf8("human_cross_check_radio")) self.formLayout.setWidget(14, QtGui.QFormLayout.FieldRole, self.human_cross_check_radio) self.customer_cross_check_radio = QtGui.QRadioButton(Dialog) self.customer_cross_check_radio.setObjectName( _fromUtf8("customer_cross_check_radio")) self.formLayout.setWidget(15, QtGui.QFormLayout.FieldRole, self.customer_cross_check_radio) self.input_organ = QtGui.QLineEdit(Dialog) self.input_organ.setEnabled(False) self.input_organ.setObjectName(_fromUtf8("input_organ")) self.formLayout.setWidget(16, QtGui.QFormLayout.FieldRole, self.input_organ) completer = QCompleter() self.input_organ.setCompleter(completer) model = QStringListModel() completer.setModel(model) completer.setModelSorting(QCompleter.CaseInsensitivelySortedModel) CPA.get_data(model) self.input_organ2 = QtGui.QLineEdit(Dialog) self.input_organ2.setEnabled(False) self.input_organ2.setObjectName(_fromUtf8("input_organ2")) self.formLayout.setWidget(19, QtGui.QFormLayout.FieldRole, self.input_organ2) self.label_21 = QtGui.QLabel(Dialog) self.label_21.setEnabled(True) self.label_21.setMaximumSize(QtCore.QSize(16777215, 10)) self.label_21.setObjectName(_fromUtf8("label_21")) self.formLayout.setWidget(23, QtGui.QFormLayout.LabelRole, self.label_21) self.max_human = QtGui.QLineEdit(Dialog) self.max_human.setEnabled(False) self.max_human.setObjectName(_fromUtf8("max_human")) self.formLayout.setWidget(23, QtGui.QFormLayout.FieldRole, self.max_human) self.groupBox_4 = QtGui.QGroupBox(Dialog) self.groupBox_4.setEnabled(True) self.groupBox_4.setObjectName(_fromUtf8("groupBox_4")) self.gridLayout_3 = QtGui.QGridLayout(self.groupBox_4) self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) self.label_13 = QtGui.QLabel(self.groupBox_4) self.label_13.setEnabled(False) self.label_13.setObjectName(_fromUtf8("label_13")) self.gridLayout_3.addWidget(self.label_13, 0, 0, 1, 1) self.set_max_snp = QtGui.QLineEdit(self.groupBox_4) self.set_max_snp.setEnabled(False) self.set_max_snp.setObjectName(_fromUtf8("set_max_snp")) self.gridLayout_3.addWidget(self.set_max_snp, 1, 0, 1, 1) self.cross_dimer = QtGui.QLineEdit(self.groupBox_4) self.cross_dimer.setEnabled(True) self.cross_dimer.setObjectName(_fromUtf8("cross_dimer")) self.gridLayout_3.addWidget(self.cross_dimer, 1, 1, 1, 1) self.set_max_human = QtGui.QLineEdit(self.groupBox_4) self.set_max_human.setEnabled(False) self.set_max_human.setObjectName(_fromUtf8("set_max_human")) self.gridLayout_3.addWidget(self.set_max_human, 1, 2, 1, 1) self.label_22 = QtGui.QLabel(self.groupBox_4) self.label_22.setEnabled(False) self.label_22.setObjectName(_fromUtf8("label_22")) self.gridLayout_3.addWidget(self.label_22, 0, 2, 1, 1) self.label_25 = QtGui.QLabel(self.groupBox_4) self.label_25.setEnabled(True) self.label_25.setObjectName(_fromUtf8("label_25")) self.gridLayout_3.addWidget(self.label_25, 0, 1, 1, 1) self.formLayout.setWidget(24, QtGui.QFormLayout.SpanningRole, self.groupBox_4) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.label_20 = QtGui.QLabel(Dialog) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.label_20.setFont(font) self.label_20.setObjectName(_fromUtf8("label_20")) self.horizontalLayout_4.addWidget(self.label_20) self.output_fname = QtGui.QLineEdit(Dialog) self.output_fname.setObjectName(_fromUtf8("output_fname")) self.horizontalLayout_4.addWidget(self.output_fname) self.pushButton_output = QtGui.QPushButton(Dialog) self.pushButton_output.setEnabled(True) self.pushButton_output.setObjectName(_fromUtf8("pushButton_output")) self.horizontalLayout_4.addWidget(self.pushButton_output) self.formLayout.setLayout(26, QtGui.QFormLayout.SpanningRole, self.horizontalLayout_4) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.pushButton_help = QtGui.QPushButton(Dialog) self.pushButton_help.setEnabled(True) self.pushButton_help.setObjectName(_fromUtf8("pushButton_help")) self.horizontalLayout.addWidget(self.pushButton_help) self.buttonBox_gui = QtGui.QDialogButtonBox(Dialog) self.buttonBox_gui.setOrientation(QtCore.Qt.Horizontal) self.buttonBox_gui.setStandardButtons(QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok) self.buttonBox_gui.setObjectName(_fromUtf8("buttonBox_gui")) self.horizontalLayout.addWidget(self.buttonBox_gui) self.formLayout.setLayout(27, QtGui.QFormLayout.SpanningRole, self.horizontalLayout) self.add_button = QtGui.QPushButton(Dialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.add_button.sizePolicy().hasHeightForWidth()) self.add_button.setSizePolicy(sizePolicy) self.add_button.setObjectName(_fromUtf8("add_button")) self.formLayout.setWidget(18, QtGui.QFormLayout.FieldRole, self.add_button) self.label_19.setBuddy(self.snp_fname) self.label_11.setBuddy(self.max_snp) self.label_21.setBuddy(self.max_human) self.label_13.setBuddy(self.set_max_snp) self.label_22.setBuddy(self.set_max_human) # self.ui.lineEdit_add3 = QtGui.QLineEdit(Dialog) # self.ui.lineEdit_add3.setGeometry(QtCore.QRect(70, 20, 281, 21)) # self.ui.lineEdit_add3.setObjectName("lineEdit_3") # self.ui.lineEdit_add3.setText(QtGui.QApplication.translate("Form", "", None, QtGui.QApplication.UnicodeUTF8)) # completer = QCompleter() # self.ui.lineEdit_add3.setCompleter(completer) # model = QStringListModel() # completer.setModel(model) # completer.setModelSorting(QCompleter.CaseInsensitivelySortedModel) # Expar.get_data(model) self.retranslateUi(Dialog) QtCore.QObject.connect(self.buttonBox_gui, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) QtCore.QObject.connect(self.buttonBox_gui, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.label_19.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.snp_fname.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.pushButton_snpfile.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.max_snp.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.label_13.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.set_max_snp.setEnabled) QtCore.QObject.connect(self.bool_conservation, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.label_11.setEnabled) QtCore.QObject.connect(Dialog, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.hide) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ.setDisabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ2.setDisabled) QtCore.QObject.connect(self.human_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.max_human.setEnabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.max_human.setDisabled) QtCore.QObject.connect(self.no_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ.setDisabled) QtCore.QObject.connect(self.no_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ2.setDisabled) QtCore.QObject.connect(self.no_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.max_human.setDisabled) QtCore.QObject.connect(self.human_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ.setDisabled) QtCore.QObject.connect(self.human_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ2.setDisabled) QtCore.QObject.connect(self.human_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.max_human.setEnabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ.setEnabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.max_human.setEnabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), Dialog.setEnabled) QtCore.QObject.connect(self.customer_cross_check_radio, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.input_organ2.setEnabled) QtCore.QMetaObject.connectSlotsByName(Dialog)
class MincutConfig(ParentAction): def __init__(self, mincut): """ Class constructor """ self.mincut = mincut self.controller = self.mincut.controller self.schema_name = self.controller.schema_name def config(self): """ B5-99: Config """ # Dialog multi_selector self.dlg_multi = Multi_selector() utils_giswater.setDialog(self.dlg_multi) self.tbl_config = self.dlg_multi.findChild(QTableView, "tbl") self.btn_insert = self.dlg_multi.findChild(QPushButton, "btn_insert") self.btn_delete = self.dlg_multi.findChild(QPushButton, "btn_delete") table = "anl_mincut_selector_valve" self.menu_valve = QMenu() self.dlg_multi.btn_insert.pressed.connect( partial(self.fill_insert_menu, table)) btn_cancel = self.dlg_multi.findChild(QPushButton, "btn_cancel") btn_cancel.pressed.connect(partial(self.close_dialog, self.dlg_multi)) self.menu_valve.clear() self.dlg_multi.btn_insert.setMenu(self.menu_valve) self.dlg_multi.btn_delete.pressed.connect( partial(self.delete_records_config, self.tbl_config, table)) self.fill_table_config(self.tbl_config, self.schema_name + "." + table) # Open form self.dlg_multi.setWindowFlags(Qt.WindowStaysOnTopHint) self.dlg_multi.open() def fill_insert_menu(self, table): """ Insert menu on QPushButton->QMenu """ self.menu_valve.clear() node_type = "VALVE" sql = ("SELECT id FROM " + self.schema_name + ".node_type" " WHERE type = '" + node_type + "' ORDER BY id") rows = self.controller.get_rows(sql) if not rows: return # Fill menu for row in rows: elem = row[0] # If not exist in table _selector_state insert to menu # Check if we already have data with selected id sql = "SELECT id FROM " + self.schema_name + "." + table + " WHERE id = '" + elem + "'" rows = self.controller.get_rows(sql) if not rows: self.menu_valve.addAction(elem, partial(self.insert, elem, table)) def insert(self, id_action, table): """ On action(select value from menu) execute SQL """ # Insert value into database sql = "INSERT INTO " + self.schema_name + "." + table + " (id) VALUES ('" + id_action + "')" self.controller.execute_sql(sql) self.fill_table_config(self.tbl_config, self.schema_name + "." + table) def fill_table_config(self, widget, table_name): """ Set a model with selected filter. Attach that model to selected table """ # Set model model = QSqlTableModel() model.setTable(table_name) model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.select() # Check for errors if model.lastError().isValid(): self.controller.show_warning(model.lastError().text()) # Attach model to table view widget.setModel(model) def delete_records_config(self, widget, table_name): """ Delete selected elements of the table """ # Get selected rows selected_list = widget.selectionModel().selectedRows() if len(selected_list) == 0: message = "Any record selected" self.controller.show_warning(message) return inf_text = "" list_id = "" for i in range(0, len(selected_list)): row = selected_list[i].row() id_ = widget.model().record(row).value("id") inf_text += str(id_) + ", " list_id = list_id + "'" + str(id_) + "', " inf_text = inf_text[:-2] list_id = list_id[:-2] message = "Are you sure you want to delete these records?" title = "Delete records" answer = self.controller.ask_question(message, title, inf_text) if answer: sql = ("DELETE FROM " + self.schema_name + "." + table_name + "" " WHERE id IN (" + list_id + ")") self.controller.execute_sql(sql) widget.model().select() def mg_mincut_management(self): """ Button 27: Mincut management """ self.action = "mg_mincut_management" # Create the dialog and signals self.dlg_min_edit = Mincut_edit() utils_giswater.setDialog(self.dlg_min_edit) self.load_settings(self.dlg_min_edit) self.tbl_mincut_edit = self.dlg_min_edit.findChild( QTableView, "tbl_mincut_edit") self.txt_mincut_id = self.dlg_min_edit.findChild( QLineEdit, "txt_mincut_id") self.tbl_mincut_edit.setSelectionBehavior(QAbstractItemView.SelectRows) # Adding auto-completion to a QLineEdit self.completer = QCompleter() self.txt_mincut_id.setCompleter(self.completer) model = QStringListModel() sql = "SELECT DISTINCT(id) FROM " + self.schema_name + ".v_ui_anl_mincut_result_cat " rows = self.controller.get_rows(sql) values = [] for row in rows: values.append(str(row[0])) model.setStringList(values) self.completer.setModel(model) self.txt_mincut_id.textChanged.connect( partial(self.filter_by_id, self.tbl_mincut_edit, self.txt_mincut_id, "v_ui_anl_mincut_result_cat")) self.dlg_min_edit.tbl_mincut_edit.doubleClicked.connect( self.open_mincut) self.dlg_min_edit.btn_cancel.pressed.connect( partial(self.close_dialog, self.dlg_min_edit)) self.dlg_min_edit.rejected.connect( partial(self.close_dialog, self.dlg_min_edit)) self.dlg_min_edit.btn_delete.clicked.connect( partial(self.delete_mincut_management, self.tbl_mincut_edit, "v_ui_anl_mincut_result_cat", "id")) # Fill ComboBox state sql = ("SELECT name" " FROM " + self.schema_name + ".anl_mincut_cat_state" " ORDER BY name") rows = self.controller.get_rows(sql) utils_giswater.fillComboBox("state_edit", rows) self.dlg_min_edit.state_edit.activated.connect( partial(self.filter_by_state, self.tbl_mincut_edit, self.dlg_min_edit.state_edit, "v_ui_anl_mincut_result_cat")) self.controller.log_info("test 1") # Set a model with selected filter. Attach that model to selected table self.fill_table_mincut_management( self.tbl_mincut_edit, self.schema_name + ".v_ui_anl_mincut_result_cat") self.set_table_columns(self.tbl_mincut_edit, "v_ui_anl_mincut_result_cat") self.controller.log_info( "test set table columns for mincut management ") #self.mincut.set_table_columns(self.tbl_mincut_edit, "v_ui_anl_mincut_result_cat") # Open the dialog self.dlg_min_edit.setWindowFlags(Qt.WindowStaysOnTopHint) self.dlg_min_edit.show() def open_mincut(self): """ Open mincut form with selected record of the table """ selected_list = self.tbl_mincut_edit.selectionModel().selectedRows() if len(selected_list) == 0: message = "Any record selected" self.controller.show_warning(message) return row = selected_list[0].row() # Get mincut_id from selected row result_mincut_id = self.tbl_mincut_edit.model().record(row).value("id") # Close this dialog and open selected mincut self.close_dialog(self.dlg_min_edit) self.mincut.init_mincut_form() self.mincut.load_mincut(result_mincut_id) def filter_by_id(self, table, widget_txt, tablename): id_ = utils_giswater.getWidgetText(widget_txt) if id_ != 'null': expr = " id = '" + id_ + "'" # Refresh model with selected filter table.model().setFilter(expr) table.model().select() else: self.fill_table_mincut_management( self.tbl_mincut_edit, self.schema_name + "." + tablename) def filter_by_state(self, table, widget, tablename): state = utils_giswater.getWidgetText(widget) if state != 'null': expr_filter = " state = '" + str(state) + "'" self.controller.log_info(str(expr_filter)) # Refresh model with selected expr_filter table.model().setFilter(expr_filter) table.model().select() else: self.fill_table_mincut_management( self.tbl_mincut_edit, self.schema_name + "." + tablename) def fill_table_mincut_management(self, widget, table_name): """ Set a model with selected filter. Attach that model to selected table """ # Set model model = QSqlTableModel() model.setTable(table_name) model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.sort(0, 1) model.select() # Check for errors if model.lastError().isValid(): self.controller.show_warning(model.lastError().text()) # Attach model to table view widget.setModel(model) def delete_mincut_management(self, widget, table_name, column_id): """ Delete selected elements of the table (by id) """ # Get selected rows selected_list = widget.selectionModel().selectedRows() if len(selected_list) == 0: message = "Any record selected" self.controller.show_warning(message) return inf_text = "" list_id = "" for i in range(0, len(selected_list)): row = selected_list[i].row() id_ = widget.model().record(row).value(str(column_id)) inf_text += str(id_) + ", " list_id = list_id + "'" + str(id_) + "', " inf_text = inf_text[:-2] list_id = list_id[:-2] message = "Are you sure you want to delete these records?" title = "Delete records" answer = self.controller.ask_question(message, title, inf_text) if answer: sql = ("DELETE FROM " + self.schema_name + "." + table_name + "" " WHERE " + column_id + " IN (" + list_id + ")") self.controller.execute_sql(sql) widget.model().select()
def newDocument( self ): """ activar todos los controles, llenar los modelos necesarios, crear el modelo EntradaCompraModel, aniadir una linea a la tabla """ try: if not self.database.isOpen(): if not self.database.open(): raise UserWarning( u"No se pudo establecer la conexión"\ + " con la base de datos" ) self.facturasmodel.setQuery( """ SELECT s.iddocumento, s.ndocimpreso, s.Saldo, s.tasaiva, s.idpersona FROM vw_saldofacturas s WHERE s.saldo>0 and s.idestado = %d ; """ % constantes.CONFIRMADO ) self.tablefacturas.setModel( self.facturasproxymodel ) self.tablefacturas.setColumnHidden( IDDOCUMENTO, True ) # self.tablefacturas.setColumnHidden( 3, True ) # Rellenar el combobox de los CLLIENTES self.clientesModel = QSqlQueryModel() self.clientesModel.setQuery( """ SELECT s.idpersona, s.nombre FROM vw_saldofacturas s WHERE s.idestado = %d GROUP BY s.idpersona HAVING SUM(s.saldo)>0 ORDER BY s.nombre """ % constantes.CONFIRMADO ) #Verificar si existen clientes morosos if self.clientesModel.rowCount() == 0: raise UserWarning( "No existen clientes morosos" ) # Rellenar el combobox de las CONCEPTOS self.conceptosModel = QSqlQueryModel() self.conceptosModel.setQuery( """ SELECT idconcepto, descripcion FROM conceptos c WHERE idtipodoc = %d; """ % constantes.IDRECIBO ) if self.conceptosModel.rowCount() == 0: raise UserWarning( "No existen conceptos para los recibos,"\ + " por favor cree uno" ) self.cbcliente.setModel( self.clientesModel ) self.cbcliente.setCurrentIndex( -1 ) self.cbcliente.setModelColumn( 1 ) completer = QCompleter() completer.setCaseSensitivity( Qt.CaseInsensitive ) completer.setModel( self.clientesModel ) completer.setCompletionColumn( 1 ) self.cbconcepto.setModel( self.conceptosModel ) self.cbconcepto.setCurrentIndex( -1 ) self.cbconcepto.setModelColumn( 1 ) completerconcepto = QCompleter() completerconcepto.setCaseSensitivity( Qt.CaseInsensitive ) completerconcepto.setModel( self.conceptosModel ) completerconcepto.setCompletionColumn( 1 ) self.datosRecibo = DatosRecibo( self.parentWindow.datosSesion ) self.editmodel = ReciboModel( self.datosRecibo.lineas, self.datosRecibo.datosSesion.tipoCambioBanco ) self.abonoeditmodel = AbonoModel( self.datosRecibo.lineasAbonos ) self.datosRecibo.cargarRetenciones( self.cbtasaret ) if self.datosRecibo.retencionModel.rowCount() == 0: raise UserWarning( u"No existe ninguna tasa de retención."\ + " Por favor contacte al administrador"\ + " del sistema" ) # Asigno el modelo del recibo self.datosRecibo.cargarNumeros( self ) self.tablefacturas.setSelectionMode( QAbstractItemView.SingleSelection ) self.tablefacturas.setSelectionBehavior( QAbstractItemView.SelectRows ) self.tableabonos.setModel( self.abonoeditmodel ) self.tabledetails.setModel( self.editmodel ) # ASIGNO EL DELEGADO A LA TABLA DE LOS PAGO delegate = ReciboDelegate() self.tabledetails.setItemDelegate( delegate ) # ASIGNO EL DELEGADO A LA TABLA DE LOS ABONOS delegado = AbonoDelegate() self.tableabonos.setItemDelegate( delegado ) self.status = False self.frbotones.setVisible( True ) self.updateFacturasFilter() self.abonoeditmodel.dataChanged[QModelIndex, QModelIndex].connect( self.updateLabels ) except UserWarning as inst: logging.error( unicode( inst ) ) QMessageBox.critical( self, qApp.organizationName(), unicode( inst ) ) except Exception as inst: logging.critical( unicode( inst ) ) QMessageBox.critical( self, qApp.organizationName(), u"Hubo un error al tratar de obtener los datos" ) finally: if self.database.isOpen(): self.database.close()
class TagCompleterWidget(QObject): """ widget in lineEdit-style with integrated qcompleter """ def __init__(self, max_tags, expiry_prefix=None, tag_list=None, parent=None, separator=",", show_datestamp=False): QWidget.__init__(self, parent) self.__completer_active = False self.__max_tags = max_tags self.__tag_separator = separator self.__tag_list = tag_list self.__parent = parent self.__tag_line = QLineEdit(self.__parent) #self.__tag_line = TagLineEdit(self.__parent) self.__show_datestamp = show_datestamp self.__datestamp_format = TsConstants.DATESTAMP_FORMAT_DAY self.__expiry_prefix = expiry_prefix ## flag, if the line should be checked of emptiness self.__check_not_empty = False self.__check_tag_limit = False self.__restricted_vocabulary = False ## the latest activated suggestion self.__activated_text = None # value of the actual datestamp self.__datestamp = None self.__datestamp_hidden = False self.__completer = QCompleter(self.__tag_list, self); self.__completer.setCaseSensitivity(Qt.CaseInsensitive) self.__completer.setWidget(self.__tag_line) #self.__handle_datestamp() self.connect(self.__tag_line, SIGNAL("textChanged(QString)"), self.__text_changed_by_user) self.connect(self.__completer, SIGNAL("activated(QString)"), self.__text_activated) self.connect(self.__completer, SIGNAL("highlighted(QString)"), self.__text_highlighted) def __text_highlighted(self, item_name): """ a suggestion has been selected in the dropdownbox """ # set this variable to True just to know, that # this value comes from the completer and not from the user self.__completer_active = True self.__text_selected(item_name) self.__completer_active = False def __handle_datestamp(self, is_hidden): """ if the show_datestamp flag is set to True, provide an automatic datestamp on the tagline """ if self.__show_datestamp: self.__datestamp = time.strftime(self.__datestamp_format) if not is_hidden: self.__tag_line.clear() self.__tag_line.setText(self.__datestamp) def set_datestamp_format(self, format, is_hidden): self.__datestamp_format = format self.__datestamp_hidden = is_hidden self.__handle_datestamp(is_hidden) def show_datestamp(self, show): self.__show_datestamp = show self.__handle_datestamp(show) def clear_line(self): """ clear the tagline ... if auto datestamp is set to "on" a fresh stamp will be placed into the tagline """ self.__tag_line.clear() if self.__show_datestamp: self.__handle_datestamp(self.__datestamp_hidden) def set_check_not_empty(self, check_necessary): """ set this to True, if there should be sent a signal that indicates that the tagline is not empty anymore """ self.__check_not_empty = True def set_restricted_vocabulary(self, is_restricted): """ use True/False to turn the restricted function on/off """ self.__restricted_vocabulary = is_restricted def select_line(self): """ select the tagline ... """ self.__tag_line.selectAll() self.__tag_line.setFocus(QtCore.Qt.OtherFocusReason) def __text_changed_by_user(self, text): # create a QByteArray in utf8 all_text = text.toUtf8() # make a python string out of it all_text = str(all_text) # convert the python string tu unicode utf-8 all_text = unicode(all_text, "utf-8") if self.__check_not_empty: if all_text is not None and all_text != "": self.emit(QtCore.SIGNAL("line_empty"), False) else: self.emit(QtCore.SIGNAL("line_empty"), True) text = all_text[:self.__tag_line.cursorPosition()] ## remove whitespace and filter out duplicates by using a set tag_set = set([]) for tag in all_text.split(self.__tag_separator): strip_tag = tag.strip() if strip_tag != "": tag_set.add(strip_tag) max_tags = self.__max_tags if self.__datestamp_hidden: max_tags = max_tags - 1; ## do not proceed if the max tag count is reached if len(tag_set) > max_tags: self.emit(QtCore.SIGNAL("tag_limit_reached"), True) self.__check_tag_limit = True return else: if self.__check_tag_limit: self.emit(QtCore.SIGNAL("tag_limit_reached"), False) self.__check_tag_limit = False prefix = text.split(self.__tag_separator)[-1].strip() if not self.__completer_active: self.__update_completer(tag_set, prefix) def __update_completer(self, tag_set, completion_prefix): if self.__tag_list is None: return tags = list(set(self.__tag_list).difference(tag_set)) #tags = list(self.__tag_list) model = QStringListModel(tags, self) self.__completer.setModel(model) self.__completer.setCompletionPrefix(completion_prefix) if self.__restricted_vocabulary: self.__check_vocabulary(tag_set, completion_prefix) if completion_prefix.strip() != '': ## use the default completion algorithm self.__completer.complete() def __check_finished_tags(self, typed_tags_list): """ use this method to control all typed tags. this means all tags terminated with a comma """ pass def __check_in_completion_list(self, tag): """ if a written tag equals a tag of the completion list - the tag will be removed from the completion list so the completer will return a completion count of 0 for this tag. in this case there would be displayed an error message at the dialog (when controlled vocab is activated) so check manually, if the provided tag is contained in the suggestion_list """ #for sug_tag in self.__tag_list: # if sug_tag == tag: # return True #return False return tag in self.__tag_list def __check_vocabulary(self, tag_set, completion_prefix): """ have a look at the entered tag to be completed. if restricted vocabulary is turned on: datestamps do not have to be checked. """ not_allowed_tags_count = 0 no_completion_found = False stripped_text = unicode(self.__tag_line.text()).strip() ##when a tag separator is on the last position, there should have been entered a new tag ##check this tag for its correctness if len(stripped_text) > 0: ##check if all written tags are allowed (incl. datestamps an expiry tags) for tag in tag_set: ## tag can be a datestamp -> OK if not SpecialCharHelper.is_datestamp(tag) and tag != "": ## tag can be an expiry tag -> OK # if self.__expiry_prefix is not None and not SpecialCharHelper.is_expiry_tag(self.__expiry_prefix, tag): if self.__expiry_prefix is None or not SpecialCharHelper.is_partial_expiry_tag(self.__expiry_prefix, tag): if unicode(tag) not in self.__tag_list: not_allowed_tags_count += 1 if(completion_prefix.strip() == ""): ## if the prefix is an empty string - manually set the completion_count to 0 ## because the completer would return the whole number of tags in its suggestion list completion_count = 0 else: completion_count = self.__completer.completionCount() if self.__restricted_vocabulary and completion_count == 0: ## additionally check if the prefix equals a tag from the suggestion list ## this has to be done, because we do not get a completionCount > 0 if the prefix equals a given tag #if completion_prefix not in self.__tag_list: if completion_prefix is not None and len(completion_prefix) > 0 and completion_prefix.strip() != "": ## just send the signal if the tag is no datestamp AND if it is no full tag if not SpecialCharHelper.is_datestamp(completion_prefix) and not self.__check_in_completion_list(completion_prefix): if not SpecialCharHelper.is_partial_expiry_tag(self.__expiry_prefix, completion_prefix): no_completion_found = True ## there are tags (terminated with comma) which are not in the allowed tag_list if not_allowed_tags_count > 1: self.emit(QtCore.SIGNAL("no_completion_found"), True) return if not_allowed_tags_count > 0: ## in this case the user has entered a not allowed tag and terminated it with a comma to mark it as a tag ## the completion count is 0 because there is nothing after the last comma in the taglist if completion_count == 0: self.emit(QtCore.SIGNAL("no_completion_found"), True) return ## it could be the case, that the user is still typing an allowed tag ## so check, if the completer has a possible completion ## if not -> send the signal if no_completion_found: self.emit(QtCore.SIGNAL("no_completion_found"), True) return ## everytime there is no completion found, emit the signal elif no_completion_found: self.emit(QtCore.SIGNAL("no_completion_found"), True) return ## in this case everything is fine self.emit(QtCore.SIGNAL("no_completion_found"), False) def __text_selected(self, text): self.__activated_text = text cursor_pos = self.__tag_line.cursorPosition() before_text = unicode(self.__tag_line.text())[:cursor_pos] #after_text = unicode(self.__tag_line.text())[cursor_pos:] prefix_len = len(before_text.split(self.__tag_separator)[-1].strip()) self.__tag_line.setText("%s%s" % (before_text[:cursor_pos - prefix_len], text)) self.__tag_line.setCursorPosition(cursor_pos - prefix_len + len(text) + 2) def __text_activated(self, text): """ a suggestion has been choosen by the user """ self.__text_selected(text) self.emit(QtCore.SIGNAL("activated")) def get_tag_list(self): tag_string = unicode(self.__tag_line.text()) result = set([]) tag_list = tag_string.split(self.__tag_separator) for tag in tag_list: strip_tag = tag.strip() if strip_tag != "": result.add(strip_tag) # if the datestamp is hidden, add it manually to the taglist if self.__datestamp_hidden: result.add(self.__datestamp) return result def get_tag_line(self): return self.__tag_line def get_completer(self): return self.__completer def set_enabled(self, enable): self.__tag_line.setEnabled(enable) def set_text(self, text): self.__tag_line.setText(text) def set_tag_completion_list(self, tag_list): self.__tag_list = tag_list self.__completer.setModel(QtGui.QStringListModel(QtCore.QStringList(tag_list))) def get_tag_completion_list(self): return self.__tag_list def is_empty(self): if self.__tag_line.text() == "": return True else: return False def set_place_holder_text(self, text): self.__tag_line.setPlaceholderText(text)
class ParentAction(object): def __init__(self, iface, settings, controller, plugin_dir): """ Class constructor """ # Initialize instance attributes self.giswater_version = "3.1" self.iface = iface self.canvas = self.iface.mapCanvas() self.settings = settings self.controller = controller self.plugin_dir = plugin_dir self.dao = self.controller.dao self.schema_name = self.controller.schema_name self.project_type = None self.file_gsw = None self.gsw_settings = None # Get files to execute giswater jar (only in Windows) if 'nt' in sys.builtin_module_names: self.plugin_version = self.get_plugin_version() self.java_exe = self.get_java_exe() (self.giswater_file_path, self.giswater_build_version) = self.get_giswater_jar() def set_controller(self, controller): """ Set controller class """ self.controller = controller self.schema_name = self.controller.schema_name def get_plugin_version(self): """ Get plugin version from metadata.txt file """ # Check if metadata file exists metadata_file = os.path.join(self.plugin_dir, 'metadata.txt') if not os.path.exists(metadata_file): message = "Metadata file not found" + metadata_file self.controller.show_warning(message, parameter=metadata_file) return None metadata = ConfigParser.ConfigParser() metadata.read(metadata_file) plugin_version = metadata.get('general', 'version') if plugin_version is None: message = "Plugin version not found" self.controller.show_warning(message) return plugin_version def get_giswater_jar(self): """ Get executable Giswater file and build version from windows registry """ reg_hkey = "HKEY_LOCAL_MACHINE" reg_path = "SOFTWARE\\Giswater\\" + self.giswater_version reg_name = "InstallFolder" giswater_folder = utils_giswater.get_reg(reg_hkey, reg_path, reg_name) if giswater_folder is None: message = "Cannot get giswater folder from windows registry" self.controller.log_info(message, parameter=reg_path) return (None, None) # Check if giswater folder exists if not os.path.exists(giswater_folder): message = "Giswater folder not found" self.controller.log_info(message, parameter=giswater_folder) return (None, None) # Check if giswater executable file file exists giswater_file_path = giswater_folder + "\giswater.jar" if not os.path.exists(giswater_file_path): message = "Giswater executable file not found" self.controller.log_info(message, parameter=giswater_file_path) return (None, None) # Get giswater major version reg_name = "MajorVersion" major_version = utils_giswater.get_reg(reg_hkey, reg_path, reg_name) if major_version is None: message = "Cannot get giswater major version from windows registry" self.controller.log_info(message, parameter=reg_path) return (giswater_file_path, None) # Get giswater minor version reg_name = "MinorVersion" minor_version = utils_giswater.get_reg(reg_hkey, reg_path, reg_name) if minor_version is None: message = "Cannot get giswater minor version from windows registry" + reg_path self.controller.log_info(message, parameter=reg_path) return (giswater_file_path, None) # Get giswater build version reg_name = "BuildVersion" build_version = utils_giswater.get_reg(reg_hkey, reg_path, reg_name) if build_version is None: message = "Cannot get giswater build version from windows registry" self.controller.log_info(message, parameter=reg_path) return (giswater_file_path, None) giswater_build_version = major_version + '.' + minor_version + '.' + build_version return (giswater_file_path, giswater_build_version) def get_java_exe(self): """ Get executable Java file from windows registry """ reg_hkey = "HKEY_LOCAL_MACHINE" reg_path = "SOFTWARE\\JavaSoft\\Java Runtime Environment" reg_name = "CurrentVersion" java_version = utils_giswater.get_reg(reg_hkey, reg_path, reg_name) # Check if java version exists (64 bits) if java_version is None: reg_path = "SOFTWARE\\Wow6432Node\\JavaSoft\\Java Runtime Environment" java_version = utils_giswater.get_reg(reg_hkey, reg_path, reg_name) # Check if java version exists (32 bits) if java_version is None: message = "Cannot get current Java version from windows registry" self.controller.log_info(message, parameter=reg_path) return None # Get java folder reg_path += "\\" + java_version reg_name = "JavaHome" java_folder = utils_giswater.get_reg(reg_hkey, reg_path, reg_name) if java_folder is None: message = "Cannot get Java folder from windows registry" self.controller.log_info(message, parameter=reg_path) return None # Check if java folder exists if not os.path.exists(java_folder): message = "Java folder not found" self.controller.log_info(message, parameter=java_folder) return None # Check if java executable file exists java_exe = java_folder + "/bin/java.exe" if not os.path.exists(java_exe): message = "Java executable file not found" self.controller.log_info(message, parameter=java_exe) return None return java_exe def execute_giswater(self, parameter): """ Executes giswater with selected parameter """ if self.giswater_file_path is None or self.java_exe is None: return # Save database connection parameters into GSW file self.save_database_parameters() # Check if gsw file exists. If not giswater will open with the last .gsw file if self.file_gsw is None: self.file_gsw = "" if self.file_gsw: if self.file_gsw != "" and not os.path.exists(self.file_gsw): message = "GSW file not found" self.controller.show_info(message, parameter=self.file_gsw) self.file_gsw = "" # Start program aux = '"' + self.giswater_file_path + '"' if self.file_gsw != "": aux += ' "' + self.file_gsw + '"' program = [ self.java_exe, "-jar", self.giswater_file_path, self.file_gsw, parameter ] else: program = [ self.java_exe, "-jar", self.giswater_file_path, "", parameter ] self.controller.start_program(program) # Compare Java and Plugin versions if self.plugin_version <> self.giswater_build_version: msg = ("Giswater and plugin versions are different. " "Giswater version: " + self.giswater_build_version + "" " - Plugin version: " + self.plugin_version) self.controller.show_info(msg, 10) # Show information message else: message = "Executing..." self.controller.show_info(message, parameter=aux) def set_java_settings(self, show_warning=True): # Get giswater properties file users_home = os.path.expanduser("~") filename = "giswater_" + self.giswater_version + ".properties" java_properties_path = users_home + os.sep + "giswater" + os.sep + "config" + os.sep + filename if not os.path.exists(java_properties_path): message = "Giswater properties file not found" if show_warning: self.controller.show_warning( message, parameter=str(java_properties_path)) return False self.java_settings = QSettings(java_properties_path, QSettings.IniFormat) self.java_settings.setIniCodec(sys.getfilesystemencoding()) self.file_gsw = utils_giswater.get_settings_value( self.java_settings, 'FILE_GSW') def set_gsw_settings(self): if not self.file_gsw: self.set_java_settings(False) self.gsw_settings = QSettings(self.file_gsw, QSettings.IniFormat) def save_database_parameters(self): """ Save database connection parameters into GSW file """ if self.gsw_settings is None: self.set_gsw_settings() # Get layer version layer = self.controller.get_layer_by_tablename('version') if not layer: return # Get database connection paramaters and save them into GSW file layer_source = self.controller.get_layer_source_from_credentials() if layer_source is None: return self.gsw_settings.setValue('POSTGIS_DATABASE', layer_source['db']) self.gsw_settings.setValue('POSTGIS_HOST', layer_source['host']) self.gsw_settings.setValue('POSTGIS_PORT', layer_source['port']) self.gsw_settings.setValue('POSTGIS_USER', layer_source['user']) self.gsw_settings.setValue('POSTGIS_USESSL', 'false') def open_web_browser(self, dialog, widget=None): """ Display url using the default browser """ if widget is not None: url = utils_giswater.getWidgetText(dialog, widget) if url == 'null': url = 'www.giswater.org' else: url = 'www.giswater.org' webbrowser.open(url) def get_file_dialog(self, dialog, widget): """ Get file dialog """ # Check if selected file exists. Set default value if necessary file_path = utils_giswater.getWidgetText(dialog, widget) if file_path is None or file_path == 'null' or not os.path.exists( str(file_path)): folder_path = self.plugin_dir else: folder_path = os.path.dirname(file_path) # Open dialog to select file os.chdir(folder_path) file_dialog = QFileDialog() file_dialog.setFileMode(QFileDialog.AnyFile) message = "Select file" folder_path = file_dialog.getOpenFileName( parent=None, caption=self.controller.tr(message)) if folder_path: utils_giswater.setWidgetText(dialog, widget, str(folder_path)) def get_folder_dialog(self, dialog, widget): """ Get folder dialog """ # Check if selected folder exists. Set default value if necessary folder_path = utils_giswater.getWidgetText(dialog, widget) if folder_path is None or folder_path == 'null' or not os.path.exists( folder_path): folder_path = os.path.expanduser("~") # Open dialog to select folder os.chdir(folder_path) file_dialog = QFileDialog() file_dialog.setFileMode(QFileDialog.Directory) message = "Select folder" folder_path = file_dialog.getExistingDirectory( parent=None, caption=self.controller.tr(message), directory=folder_path) if folder_path: utils_giswater.setWidgetText(dialog, widget, str(folder_path)) def load_settings(self, dialog=None): """ Load QGIS settings related with dialog position and size """ if dialog is None: dialog = self.dlg try: x = self.controller.plugin_settings_value(dialog.objectName() + "_x") y = self.controller.plugin_settings_value(dialog.objectName() + "_y") width = self.controller.plugin_settings_value( dialog.objectName() + "_width", dialog.property('width')) height = self.controller.plugin_settings_value( dialog.objectName() + "_height", dialog.property('height')) if int(x) < 0 or int(y) < 0: dialog.resize(int(width), int(height)) else: screens = ctypes.windll.user32 screen_x = screens.GetSystemMetrics(78) screen_y = screens.GetSystemMetrics(79) if int(x) > screen_x: x = int(screen_x) - int(width) if int(y) > screen_y: y = int(screen_y) dialog.setGeometry(int(x), int(y), int(width), int(height)) except: pass def save_settings(self, dialog=None): """ Save QGIS settings related with dialog position and size """ if dialog is None: dialog = self.dlg self.controller.plugin_settings_set_value( dialog.objectName() + "_width", dialog.property('width')) self.controller.plugin_settings_set_value( dialog.objectName() + "_height", dialog.property('height')) self.controller.plugin_settings_set_value(dialog.objectName() + "_x", dialog.pos().x() + 8) self.controller.plugin_settings_set_value(dialog.objectName() + "_y", dialog.pos().y() + 31) def open_dialog(self, dlg=None, dlg_name=None, maximize_button=True, stay_on_top=True): """ Open dialog """ if dlg is None or type(dlg) is bool: dlg = self.dlg # Manage i18n of the dialog if dlg_name: self.controller.manage_translation(dlg_name, dlg) # Manage stay on top and maximize button if maximize_button and stay_on_top: dlg.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint) elif not maximize_button and stay_on_top: dlg.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowStaysOnTopHint) elif maximize_button and not stay_on_top: dlg.setWindowFlags(Qt.WindowMaximizeButtonHint) # Open dialog dlg.open() def close_dialog(self, dlg=None): """ Close dialog """ if dlg is None or type(dlg) is bool: dlg = self.dlg try: self.save_settings(dlg) dlg.close() map_tool = self.canvas.mapTool() # If selected map tool is from the plugin, set 'Pan' as current one if map_tool.toolName() == '': self.iface.actionPan().trigger() except AttributeError: pass def multi_row_selector(self, dialog, tableleft, tableright, field_id_left, field_id_right, name='name', index=[ 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 ]): # fill QTableView all_rows tbl_all_rows = dialog.findChild(QTableView, "all_rows") tbl_all_rows.setSelectionBehavior(QAbstractItemView.SelectRows) query_left = "SELECT * FROM " + self.schema_name + "." + tableleft + " WHERE " + name + " NOT IN " query_left += "(SELECT " + tableleft + "." + name + " FROM " + self.schema_name + "." + tableleft query_left += " RIGHT JOIN " + self.schema_name + "." + tableright + " ON " + tableleft + "." + field_id_left + " = " + tableright + "." + field_id_right query_left += " WHERE cur_user = current_user)" self.fill_table_by_query(tbl_all_rows, query_left) self.hide_colums(tbl_all_rows, index) tbl_all_rows.setColumnWidth(1, 200) # fill QTableView selected_rows tbl_selected_rows = dialog.findChild(QTableView, "selected_rows") tbl_selected_rows.setSelectionBehavior(QAbstractItemView.SelectRows) query_right = "SELECT " + tableleft + "." + name + ", cur_user, " + tableleft + "." + field_id_left + ", " + tableright + "." + field_id_right + " FROM " + self.schema_name + "." + tableleft query_right += " JOIN " + self.schema_name + "." + tableright + " ON " + tableleft + "." + field_id_left + " = " + tableright + "." + field_id_right query_right += " WHERE cur_user = current_user" self.fill_table_by_query(tbl_selected_rows, query_right) self.hide_colums(tbl_selected_rows, [1, 2, 3]) tbl_selected_rows.setColumnWidth(0, 200) # Button select dialog.btn_select.clicked.connect( partial(self.multi_rows_selector, tbl_all_rows, tbl_selected_rows, field_id_left, tableright, field_id_right, query_left, query_right, field_id_right)) # Button unselect query_delete = "DELETE FROM " + self.schema_name + "." + tableright query_delete += " WHERE current_user = cur_user AND " + tableright + "." + field_id_right + "=" dialog.btn_unselect.clicked.connect( partial(self.unselector, tbl_all_rows, tbl_selected_rows, query_delete, query_left, query_right, field_id_right)) # QLineEdit dialog.txt_name.textChanged.connect( partial(self.query_like_widget_text, dialog, dialog.txt_name, tbl_all_rows, tableleft, tableright, field_id_right, field_id_left, name)) def hide_colums(self, widget, comuns_to_hide): for i in range(0, len(comuns_to_hide)): widget.hideColumn(comuns_to_hide[i]) def unselector(self, qtable_left, qtable_right, query_delete, query_left, query_right, field_id_right): selected_list = qtable_right.selectionModel().selectedRows() if len(selected_list) == 0: message = "Any record selected" self.controller.show_warning(message) return expl_id = [] for i in range(0, len(selected_list)): row = selected_list[i].row() id_ = str(qtable_right.model().record(row).value(field_id_right)) expl_id.append(id_) for i in range(0, len(expl_id)): self.controller.execute_sql(query_delete + str(expl_id[i])) # Refresh self.fill_table_by_query(qtable_left, query_left) self.fill_table_by_query(qtable_right, query_right) self.refresh_map_canvas() def multi_rows_selector(self, qtable_left, qtable_right, id_ori, tablename_des, id_des, query_left, query_right, field_id): """ :param qtable_left: QTableView origin :param qtable_right: QTableView destini :param id_ori: Refers to the id of the source table :param tablename_des: table destini :param id_des: Refers to the id of the target table, on which the query will be made :param query_right: :param query_left: :param field_id: """ selected_list = qtable_left.selectionModel().selectedRows() if len(selected_list) == 0: message = "Any record selected" self.controller.show_warning(message) return expl_id = [] curuser_list = [] for i in range(0, len(selected_list)): row = selected_list[i].row() id_ = qtable_left.model().record(row).value(id_ori) expl_id.append(id_) curuser = qtable_left.model().record(row).value("cur_user") curuser_list.append(curuser) for i in range(0, len(expl_id)): # Check if expl_id already exists in expl_selector sql = ("SELECT DISTINCT(" + id_des + ", cur_user)" " FROM " + self.schema_name + "." + tablename_des + "" " WHERE " + id_des + " = '" + str(expl_id[i]) + "' AND cur_user = current_user") row = self.controller.get_row(sql) if row: # if exist - show warning message = "Id already selected" self.controller.show_info_box(message, "Info", parameter=str(expl_id[i])) else: sql = ("INSERT INTO " + self.schema_name + "." + tablename_des + " (" + field_id + ", cur_user) " " VALUES (" + str(expl_id[i]) + ", current_user)") self.controller.execute_sql(sql) # Refresh self.fill_table_by_query(qtable_right, query_right) self.fill_table_by_query(qtable_left, query_left) self.refresh_map_canvas() def fill_table_psector(self, widget, table_name, set_edit_strategy=QSqlTableModel.OnManualSubmit): """ Set a model with selected @table_name. Attach that model to selected table """ if self.schema_name not in table_name: table_name = self.schema_name + "." + table_name # Set model self.model = QSqlTableModel() self.model.setTable(table_name) self.model.setEditStrategy(set_edit_strategy) self.model.setSort(0, 0) self.model.select() # Check for errors if self.model.lastError().isValid(): self.controller.show_warning(self.model.lastError().text()) # Attach model to table view widget.setModel(self.model) def fill_table(self, widget, table_name, set_edit_strategy=QSqlTableModel.OnManualSubmit): """ Set a model with selected filter. Attach that model to selected table """ if self.schema_name not in table_name: table_name = self.schema_name + "." + table_name # Set model self.model = QSqlTableModel() self.model.setTable(table_name) self.model.setEditStrategy(set_edit_strategy) self.model.setSort(0, 0) self.model.select() # Check for errors if self.model.lastError().isValid(): self.controller.show_warning(self.model.lastError().text()) # Attach model to table view widget.setModel(self.model) def fill_table_by_query(self, qtable, query): """ :param qtable: QTableView to show :param query: query to set model """ model = QSqlQueryModel() model.setQuery(query) qtable.setModel(model) qtable.show() # Check for errors if model.lastError().isValid(): self.controller.show_warning(model.lastError().text()) def query_like_widget_text(self, dialog, text_line, qtable, tableleft, tableright, field_id_r, field_id_l, name='name'): """ Fill the QTableView by filtering through the QLineEdit""" query = utils_giswater.getWidgetText(dialog, text_line, return_string_null=False).lower() sql = ("SELECT * FROM " + self.schema_name + "." + tableleft + " WHERE " + name + " NOT IN " "(SELECT " + tableleft + "." + name + " FROM " + self.schema_name + "." + tableleft + "" " RIGHT JOIN " + self.schema_name + "." + tableright + "" " ON " + tableleft + "." + field_id_l + " = " + tableright + "." + field_id_r + "" " WHERE cur_user = current_user) AND LOWER(" + name + "::text) LIKE '%" + query + "%'") self.fill_table_by_query(qtable, sql) def set_icon(self, widget, icon): """ Set @icon to selected @widget """ # Get icons folder icons_folder = os.path.join(self.plugin_dir, 'icons') icon_path = os.path.join(icons_folder, str(icon) + ".png") if os.path.exists(icon_path): widget.setIcon(QIcon(icon_path)) else: self.controller.log_info("File not found", parameter=icon_path) def check_expression(self, expr_filter, log_info=False): """ Check if expression filter @expr_filter is valid """ if log_info: self.controller.log_info(expr_filter) expr = QgsExpression(expr_filter) if expr.hasParserError(): message = "Expression Error" self.controller.log_warning(message, parameter=expr_filter) return (False, expr) return (True, expr) def refresh_map_canvas(self, restore_cursor=False): """ Refresh all layers present in map canvas """ self.canvas.refreshAllLayers() for layer_refresh in self.canvas.layers(): layer_refresh.triggerRepaint() if restore_cursor: self.set_cursor_restore() def set_cursor_wait(self): """ Change cursor to 'WaitCursor' """ QApplication.setOverrideCursor(Qt.WaitCursor) def set_cursor_restore(self): """ Restore to previous cursors """ QApplication.restoreOverrideCursor() def get_cursor_multiple_selection(self): """ Set cursor for multiple selection """ path_folder = os.path.join(os.path.dirname(__file__), os.pardir) path_cursor = os.path.join(path_folder, 'icons', '201.png') if os.path.exists(path_cursor): cursor = QCursor(QPixmap(path_cursor)) else: cursor = QCursor(Qt.ArrowCursor) return cursor def set_table_columns(self, dialog, widget, table_name): """ Configuration of tables. Set visibility and width of columns """ widget = utils_giswater.getWidget(dialog, widget) if not widget: return # Set width and alias of visible columns columns_to_delete = [] sql = ("SELECT column_index, width, alias, status" " FROM " + self.schema_name + ".config_client_forms" " WHERE table_id = '" + table_name + "'" " ORDER BY column_index") rows = self.controller.get_rows(sql, log_info=False) if not rows: return for row in rows: if not row['status']: columns_to_delete.append(row['column_index'] - 1) else: width = row['width'] if width is None: width = 100 widget.setColumnWidth(row['column_index'] - 1, width) widget.model().setHeaderData(row['column_index'] - 1, Qt.Horizontal, row['alias']) # Set order # widget.model().setSort(0, Qt.AscendingOrder) widget.model().select() # Delete columns for column in columns_to_delete: widget.hideColumn(column) def connect_signal_selection_changed(self, option): """ Connect signal selectionChanged """ try: if option == "mincut_connec": self.canvas.selectionChanged.connect( partial(self.snapping_selection_connec)) elif option == "mincut_hydro": self.canvas.selectionChanged.connect( partial(self.snapping_selection_hydro)) except Exception: pass def disconnect_signal_selection_changed(self): """ Disconnect signal selectionChanged """ try: self.canvas.selectionChanged.disconnect() except Exception: pass def set_label_current_psector(self, dialog): sql = ( "SELECT t1.name FROM " + self.schema_name + ".plan_psector AS t1 " " INNER JOIN " + self.schema_name + ".config_param_user AS t2 ON t1.psector_id::text = t2.value " " WHERE t2.parameter='psector_vdefault' AND cur_user = current_user" ) row = self.controller.get_row(sql) if not row: return utils_giswater.setWidgetText(dialog, 'lbl_vdefault_psector', row[0]) def multi_rows_delete(self, widget, table_name, column_id): """ Delete selected elements of the table :param QTableView widget: origin :param table_name: table origin :param column_id: Refers to the id of the source table """ # Get selected rows selected_list = widget.selectionModel().selectedRows() if len(selected_list) == 0: message = "Any record selected" self.controller.show_warning(message) return inf_text = "" list_id = "" for i in range(0, len(selected_list)): row = selected_list[i].row() id_ = widget.model().record(row).value(str(column_id)) inf_text += str(id_) + ", " list_id = list_id + "'" + str(id_) + "', " inf_text = inf_text[:-2] list_id = list_id[:-2] message = "Are you sure you want to delete these records?" title = "Delete records" answer = self.controller.ask_question(message, title, inf_text) if answer: sql = "DELETE FROM " + self.schema_name + "." + table_name sql += " WHERE " + column_id + " IN (" + list_id + ")" self.controller.execute_sql(sql) widget.model().select() def select_features_by_expr(self, layer, expr): """ Select features of @layer applying @expr """ if expr is None: layer.removeSelection() else: it = layer.getFeatures(QgsFeatureRequest(expr)) # Build a list of feature id's from the previous result and select them id_list = [i.id() for i in it] if len(id_list) > 0: layer.selectByIds(id_list) else: layer.removeSelection() def zoom_to_selected_features(self, layer, geom_type=None, zoom=None): """ Zoom to selected features of the @layer with @geom_type """ if not layer: return self.iface.setActiveLayer(layer) self.iface.actionZoomToSelected().trigger() if geom_type: # Set scale = scale_zoom if geom_type in ('node', 'connec', 'gully'): scale = self.scale_zoom # Set scale = max(current_scale, scale_zoom) elif geom_type == 'arc': scale = self.iface.mapCanvas().scale() if int(scale) < int(self.scale_zoom): scale = self.scale_zoom else: scale = 5000 if zoom is not None: scale = zoom self.iface.mapCanvas().zoomScale(float(scale)) def set_completer(self, tablename, widget, field_search, color='black'): """ Set autocomplete of widget @table_object + "_id" getting id's from selected @table_object """ if not widget: return # Set SQL sql = ("SELECT DISTINCT(" + field_search + ")" " FROM " + self.schema_name + "." + tablename + "" " ORDER BY " + field_search + "") row = self.controller.get_rows(sql) for i in range(0, len(row)): aux = row[i] row[i] = str(aux[0]) # Set completer and model: add autocomplete in the widget self.completer = QCompleter() self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.setCompletionMode(0) self.completer.popup().setStyleSheet("color: " + color + ";") widget.setCompleter(self.completer) model = QStringListModel() model.setStringList(row) self.completer.setModel(model) def zoom_to_rectangle(self, x1, y1, x2, y2, margin=5): # rect = QgsRectangle(float(x1)+10, float(y1)+10, float(x2)-10, float(y2)-10) rect = QgsRectangle( float(x1) - margin, float(y1) - margin, float(x2) + margin, float(y2) + margin) self.canvas.setExtent(rect) self.canvas.refresh() def create_action(self, action_name, action_group, icon_num=None, text=None): """ Creates a new action with selected parameters """ icon = None icon_folder = self.plugin_dir + '/icons/' icon_path = icon_folder + icon_num + '.png' if os.path.exists(icon_path): icon = QIcon(icon_path) if icon is None: action = QAction(text, action_group) else: action = QAction(icon, text, action_group) action.setObjectName(action_name) return action
class GeneralExecution(QWidget): """General Execution widget class""" 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) def _load_python_path(self): """Ask the user for a Python Path""" path = QFileDialog.getOpenFileName( self, translations.TR_SELECT_SELECT_PYTHON_EXEC) if path: self._txtPythonPath.setText(path) def save(self): """Save all the Execution Preferences""" qsettings = IDE.ninja_settings() qsettings.beginGroup('preferences') qsettings.beginGroup('execution') qsettings.setValue('pythonPath', self._txtPythonPath.text()) settings.PYTHON_PATH = self._txtPythonPath.text() options = '' if self.check_B.isChecked(): options += ' -B' if self.check_d.isChecked(): options += ' -d' if self.check_E.isChecked(): options += ' -E' if self.check_O.isChecked(): options += ' -O' if self.check_OO.isChecked(): options += ' -OO' if self.check_Q.isChecked(): options += ' -Q' + self.comboDivision.currentText() if self.check_s.isChecked(): options += ' -s' if self.check_S.isChecked(): options += ' -S' if self.check_t.isChecked(): options += ' -t' if self.check_tt.isChecked(): options += ' -tt' if self.check_v.isChecked(): options += ' -v' if self.check_W.isChecked(): options += ' -W' + self.comboWarning.currentText() if self.check_x.isChecked(): options += ' -x' if self.check_3.isChecked(): options += ' -3' settings.EXECUTION_OPTIONS = options qsettings.setValue('executionOptions', options) qsettings.endGroup() qsettings.endGroup()
#!/usr/bin/env python import sys from PyQt4.QtCore import Qt from PyQt4.QtGui import QApplication, QCompleter, QLineEdit, QStringListModel, QSortFilterProxyModel def get_data(model): model.setStringList(["Paola Llosa", "Pedro Cardozo", "wara", "here"]) if __name__ == "__main__": app = QApplication(sys.argv) edit = QLineEdit() model = QStringListModel() completer = QCompleter() completer.setModel(model) completer.setCaseSensitivity(Qt.CaseInsensitive) edit.setCompleter(completer) get_data(model) edit.show() sys.exit(app.exec_())
class AddNewLot(ParentManage): def __init__(self, iface, settings, controller, plugin_dir): """ Class to control 'Add basic visit' of toolbar 'edit' """ ParentManage.__init__(self, iface, settings, controller, plugin_dir) self.ids = [] def manage_lot(self, lot_id=None, is_new=True, visitclass_id=None): # turnoff autocommit of this and base class. Commit will be done at dialog button box level management self.autocommit = True self.remove_ids = False self.is_new_lot = is_new self.chk_position = 5 # Variable used to set the position of the QCheckBox in the relations table # Get layers of every geom_type self.reset_lists() self.reset_layers() self.layers['arc'] = [ self.controller.get_layer_by_tablename('v_edit_arc') ] self.layers['node'] = [ self.controller.get_layer_by_tablename('v_edit_node') ] self.layers['connec'] = [ self.controller.get_layer_by_tablename('v_edit_connec') ] # Remove 'gully' for 'WS' if self.controller.get_project_type() != 'ws': self.layers['gully'] = self.controller.get_group_layers('gully') self.dlg_lot = AddLot() self.load_settings(self.dlg_lot) self.dropdown = self.dlg_lot.findChild(QToolButton, 'action_selector') self.dropdown.setPopupMode(QToolButton.MenuButtonPopup) # Create action and put into QToolButton action_by_expression = self.create_action('action_by_expression', self.dlg_lot.action_selector, '204', 'Select by expression') action_by_polygon = self.create_action('action_by_polygon', self.dlg_lot.action_selector, '205', 'Select by polygon') self.dropdown.addAction(action_by_expression) self.dropdown.addAction(action_by_polygon) self.dropdown.setDefaultAction(action_by_expression) self.dlg_lot.open() # Set icons self.set_icon(self.dlg_lot.btn_feature_insert, "111") self.set_icon(self.dlg_lot.btn_feature_delete, "112") self.set_icon(self.dlg_lot.btn_feature_snapping, "137") self.lot_id = self.dlg_lot.findChild(QLineEdit, "lot_id") self.id_val = self.dlg_lot.findChild(QLineEdit, "txt_idval") self.user_name = self.dlg_lot.findChild(QLineEdit, "user_name") self.visit_class = self.dlg_lot.findChild(QComboBox, "cmb_visit_class") # Tab 'Relations' self.feature_type = self.dlg_lot.findChild(QComboBox, "feature_type") self.tbl_relation = self.dlg_lot.findChild(QTableView, "tbl_relation") utils_giswater.set_qtv_config(self.tbl_relation) utils_giswater.set_qtv_config(self.dlg_lot.tbl_visit) self.feature_type.setEnabled(False) # Fill QWidgets of the form self.fill_fields() new_lot_id = lot_id if lot_id is None: new_lot_id = self.get_next_id('om_visit_lot', 'id') utils_giswater.setWidgetText(self.dlg_lot, self.lot_id, new_lot_id) self.geom_type = utils_giswater.get_item_data(self.dlg_lot, self.visit_class, 2).lower() viewname = "v_edit_" + self.geom_type self.set_completer_feature_id(self.dlg_lot.feature_id, self.geom_type, viewname) self.clear_selection() # Set actions signals action_by_expression.triggered.connect( partial(self.activate_selection, self.dlg_lot, action_by_expression, 'mActionSelectByExpression')) action_by_polygon.triggered.connect( partial(self.activate_selection, self.dlg_lot, action_by_polygon, 'mActionSelectPolygon')) # Set widgets signals self.dlg_lot.btn_feature_insert.clicked.connect( partial(self.insert_row)) self.dlg_lot.btn_feature_delete.clicked.connect( partial(self.remove_selection, self.dlg_lot, self.tbl_relation)) self.dlg_lot.btn_feature_snapping.clicked.connect( partial(self.set_active_layer)) self.dlg_lot.btn_feature_snapping.clicked.connect( partial(self.selection_init, self.dlg_lot)) self.dlg_lot.cmb_visit_class.currentIndexChanged.connect( self.set_feature_type_cmb) self.dlg_lot.cmb_visit_class.currentIndexChanged.connect( self.set_active_layer) self.dlg_lot.cmb_visit_class.currentIndexChanged.connect( partial(self.event_feature_type_selected, self.dlg_lot)) self.dlg_lot.cmb_visit_class.currentIndexChanged.connect( partial(self.reload_table_visit)) self.dlg_lot.txt_filter.textChanged.connect( partial(self.reload_table_visit)) self.dlg_lot.date_event_from.dateChanged.connect( partial(self.reload_table_visit)) self.dlg_lot.date_event_to.dateChanged.connect( partial(self.reload_table_visit)) self.dlg_lot.tbl_relation.doubleClicked.connect( partial(self.zoom_to_feature)) self.dlg_lot.btn_cancel.clicked.connect(partial(self.manage_rejected)) self.dlg_lot.rejected.connect(partial(self.manage_rejected)) self.dlg_lot.btn_accept.clicked.connect(partial(self.save_lot)) self.set_headers(self.tbl_relation) if lot_id is not None: utils_giswater.set_combo_itemData(self.visit_class, str(visitclass_id), 0) self.geom_type = utils_giswater.get_item_data( self.dlg_lot, self.visit_class, 2).lower() self.set_values(lot_id) self.populate_table_relations(lot_id) self.update_id_list() sql = ("SELECT * FROM " + self.schema_name + ".om_visit_lot_x_" + str(self.geom_type) + "" " WHERE lot_id ='" + str(lot_id) + "'") rows = self.controller.get_rows(sql, log_sql=True) self.put_checkbox(self.tbl_relation, rows, 'status', 3) self.set_dates() self.reload_table_visit() self.enable_feature_type(self.dlg_lot) self.set_feature_type_cmb() # Set autocompleters of the form self.set_completers() # Set model signals self.tbl_relation.model().rowsInserted.connect(self.set_dates) self.tbl_relation.model().rowsInserted.connect(self.reload_table_visit) self.tbl_relation.model().rowsRemoved.connect(self.set_dates) self.tbl_relation.model().rowsRemoved.connect(self.reload_table_visit) # Open the dialog self.open_dialog(self.dlg_lot, dlg_name="add_lot") def test(self): self.controller.log_info(str("HOLAs")) def read_standaritemmodel(self, qtable): headers = self.get_headers(qtable) rows = [] model = qtable.model() for x in range(0, model.rowCount()): row = {} for c in range(0, model.columnCount() - 1): index = model.index(x, c) item = model.data(index) row[headers[c]] = item widget_cell = qtable.model().index(x, self.chk_position) widget = qtable.indexWidget(widget_cell) chk_list = widget.findChildren(QCheckBox) if chk_list[0].isChecked(): row['status'] = '3' rows.append(row) return rows def fill_fields(self): """ Fill combo boxes of the form """ # Visit tab # Set current date and time current_date = QDate.currentDate() self.dlg_lot.startdate.setDate(current_date) self.dlg_lot.enddate.setDate(current_date) # Set current user sql = "SELECT current_user" row = self.controller.get_row(sql, commit=self.autocommit) utils_giswater.setWidgetText(self.dlg_lot, self.user_name, row[0]) # Fill ComboBox cmb_visit_class sql = ("SELECT id, idval, feature_type" " FROM " + self.schema_name + ".om_visit_class " " WHERE ismultifeature is False" " ORDER BY idval") visitclass_ids = self.controller.get_rows(sql, commit=self.autocommit) if visitclass_ids: utils_giswater.set_item_data(self.dlg_lot.cmb_visit_class, visitclass_ids, 1) # Fill ComboBox cmb_assigned_to sql = ("SELECT id, idval" " FROM " + self.schema_name + ".cat_team " " WHERE active is True " " ORDER BY idval") users = self.controller.get_rows(sql, commit=self.autocommit) if users: utils_giswater.set_item_data(self.dlg_lot.cmb_assigned_to, users, 1) # TODO fill combo with correct table # Fill ComboBox cmb_status sql = ("SELECT id, idval" " FROM " + self.schema_name + ".om_visit_class " " ORDER BY idval") status = self.controller.get_rows(sql, commit=self.autocommit) status = [(0, 'PLANIFICAT'), (1, 'EXITOS'), (2, 'FAIL'), (3, 'VALIDAT')] if status: utils_giswater.set_item_data(self.dlg_lot.cmb_status, status, 1, sort_combo=False) # Relations tab # fill feature_type sql = ("SELECT id, id" " FROM " + self.schema_name + ".sys_feature_type" " WHERE net_category = 1" " ORDER BY id") feature_type = self.controller.get_rows(sql, log_sql=False, commit=self.autocommit) if feature_type: utils_giswater.set_item_data(self.dlg_lot.feature_type, feature_type, 1) def get_next_id(self, table_name, pk): sql = ("SELECT max(" + pk + "::integer) FROM " + self.schema_name + "." + table_name + ";") row = self.controller.get_row(sql, log_sql=False) if not row or not row[0]: return 0 else: return row[0] + 1 def event_feature_type_selected(self, dialog): """Manage selection change in feature_type combo box. THis means that have to set completer for feature_id QTextLine and setup model for features to select table.""" # 1) set the model linked to selecte features # 2) check if there are features related to the current visit # 3) if so, select them => would appear in the table associated to the model self.geom_type = self.feature_type.currentText().lower() viewname = "v_edit_" + self.geom_type self.set_completer_feature_id(dialog.feature_id, self.geom_type, viewname) # set table model and completer # set a fake where expression to avoid to set model to None # fake_filter = '{}_id IN ("-1")'.format(self.geom_type) # self.set_table_model(dialog, self.tbl_relation, self.geom_type, fake_filter) self.set_headers(self.tbl_relation) def clear_selection(self, remove_groups=True): """ Remove all previous selections """ layer = self.controller.get_layer_by_tablename("v_edit_arc") if layer: layer.removeSelection() layer = self.controller.get_layer_by_tablename("v_edit_node") if layer: layer.removeSelection() layer = self.controller.get_layer_by_tablename("v_edit_connec") if layer: layer.removeSelection() layer = self.controller.get_layer_by_tablename("v_edit_element") if layer: layer.removeSelection() if self.project_type == 'ud': layer = self.controller.get_layer_by_tablename("v_edit_gully") if layer: layer.removeSelection() try: if remove_groups: for layer in self.layers['arc']: layer.removeSelection() for layer in self.layers['node']: layer.removeSelection() for layer in self.layers['connec']: layer.removeSelection() for layer in self.layers['gully']: layer.removeSelection() for layer in self.layers['element']: layer.removeSelection() except: pass self.canvas.refresh() def set_values(self, lot_id): sql = ("SELECT * FROM " + self.schema_name + ".om_visit_lot " " WHERE id ='" + str(lot_id) + "'") lot = self.controller.get_row(sql, log_sql=False) if lot is not None: utils_giswater.setWidgetText(self.dlg_lot, 'txt_idval', lot['idval']) utils_giswater.setCalendarDate(self.dlg_lot, 'startdate', lot['startdate']) utils_giswater.setCalendarDate(self.dlg_lot, 'enddate', lot['enddate']) utils_giswater.set_combo_itemData(self.dlg_lot.cmb_visit_class, lot['visitclass_id'], 0) utils_giswater.set_combo_itemData(self.dlg_lot.cmb_assigned_to, lot['team_id'], 0) utils_giswater.setWidgetText(self.dlg_lot, 'descript', lot['descript']) utils_giswater.set_combo_itemData(self.dlg_lot.cmb_status, lot['status'], 0) self.controller.log_info(str(lot['status'])) if lot['status'] not in (0, None): self.dlg_lot.cmb_status.setEnabled(False) utils_giswater.set_combo_itemData(self.dlg_lot.feature_type, lot['feature_type'], 0) feature_type = utils_giswater.get_item_data(self.dlg_lot, self.dlg_lot.feature_type, 1).lower() table_name = "v_edit_" + str(feature_type) self.set_headers(self.tbl_relation) self.set_table_columns(self.dlg_lot, self.dlg_lot.tbl_relation, table_name) def set_headers(self, qtable): feature_type = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.cmb_visit_class, 2).lower() columns_name = self.controller.get_columns_list('om_visit_lot_x_' + str(feature_type)) columns_name.append(['validate']) standard_model = QStandardItemModel() qtable.setModel(standard_model) qtable.horizontalHeader().setStretchLastSection(True) # # Get headers headers = [] for x in columns_name: headers.append(x[0]) # Set headers standard_model.setHorizontalHeaderLabels(headers) def populate_table_relations(self, lot_id): standard_model = self.tbl_relation.model() feature_type = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.cmb_visit_class, 2).lower() sql = ("SELECT * FROM " + self.schema_name + ".om_visit_lot_x_" + str(feature_type) + "" " WHERE lot_id ='" + str(lot_id) + "'") rows = self.controller.get_rows(sql, log_sql=True) for row in rows: item = [] for value in row: if value is not None: item.append(QStandardItem(str(value))) else: item.append(QStandardItem(None)) if len(row) > 0: standard_model.appendRow(item) def populate_visits(self, widget, table_name, expr_filter=None): """ Set a model with selected filter. Attach that model to selected table """ if self.schema_name not in table_name: table_name = self.schema_name + "." + table_name # Set model #model = CustomSqlModel() model = QSqlTableModel() model.setTable(table_name) model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.sort(0, 1) if expr_filter: model.setFilter(expr_filter) model.select() # Check for errors if model.lastError().isValid(): self.controller.show_warning(model.lastError().text()) # Attach model to table view widget.setModel(model) def update_id_list(self): feature_type = utils_giswater.get_item_data(self.dlg_lot, self.dlg_lot.feature_type, 1).lower() list_ids = self.get_table_values(self.tbl_relation, feature_type) for id_ in list_ids: if id_ not in self.ids: self.ids.append(id_) def get_table_values(self, qtable, geom_type): column_index = utils_giswater.get_col_index_by_col_name( qtable, geom_type + '_id') model = qtable.model() id_list = [] for i in range(0, model.rowCount()): i = model.index(i, column_index) id_list.append(i.data()) return id_list def activate_selection(self, dialog, action, action_name): self.set_active_layer() self.dropdown.setDefaultAction(action) self.disconnect_signal_selection_changed() self.iface.mainWindow().findChild( QAction, action_name).triggered.connect( partial(self.selection_changed_by_expr, dialog, self.layer_lot, self.geom_type)) self.iface.mainWindow().findChild(QAction, action_name).trigger() def selection_changed_by_expr(self, dialog, layer, geom_type): # "arc_id" = '2020' self.canvas.selectionChanged.connect( partial(self.manage_selection, dialog, layer, geom_type)) def manage_selection(self, dialog, layer, geom_type): """ Slot function for signal 'canvas.selectionChanged' """ field_id = geom_type + "_id" # Iterate over layer if layer.selectedFeatureCount() > 0: # Get selected features of the layer features = layer.selectedFeatures() for feature in features: # Append 'feature_id' into the list selected_id = feature.attribute(field_id) if selected_id not in self.ids: self.ids.append(selected_id) self.reload_table_relations() self.enable_combos(dialog) def enable_combos(self, dialog): assigned_to = dialog.findChild(QComboBox, 'cmb_assigned_to') visit_class = dialog.findChild(QComboBox, 'cmb_visit_class') if len(self.ids) > 0: assigned_to.setEnabled(False) visit_class.setEnabled(False) else: assigned_to.setEnabled(True) visit_class.setEnabled(True) def reload_table_relations(self): """ Reload @widget with contents of @tablename applying selected @expr_filter """ standard_model = self.tbl_relation.model() feature_type = utils_giswater.get_item_data(self.dlg_lot, self.dlg_lot.feature_type, 1).lower() lot_id = utils_giswater.getWidgetText(self.dlg_lot, self.lot_id) id_list = self.get_table_values(self.tbl_relation, feature_type) layer_name = 'v_edit_' + utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.feature_type, 0).lower() field_id = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.feature_type, 0).lower() + str('_id') layer = self.controller.get_layer_by_tablename(layer_name) for feature_id in self.ids: feature = self.get_feature_by_id(layer, feature_id, field_id) item = [] if feature_id not in id_list: row = [] item.append(lot_id) item.append(feature_id) item.append(feature.attribute('code')) item.append(0) for value in item: row.append(QStandardItem(str(value))) if len(row) > 0: standard_model.appendRow(row) self.insert_single_checkbox(self.tbl_relation) def insert_row(self): """ Inser single row into QStandardItemModel """ standard_model = self.tbl_relation.model() feature_id = utils_giswater.getWidgetText(self.dlg_lot, self.dlg_lot.feature_id) lot_id = utils_giswater.getWidgetText(self.dlg_lot, self.lot_id) layer_name = 'v_edit_' + utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.feature_type, 0).lower() field_id = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.feature_type, 0).lower() + str('_id') layer = self.controller.get_layer_by_tablename(layer_name) feature = self.get_feature_by_id(layer, feature_id, field_id) if feature is False: return if feature_id not in self.ids: item = [lot_id, feature_id, feature.attribute('code'), 0] row = [] for value in item: if value not in ('', None) and type(value) != QPyNullVariant: row.append(QStandardItem(str(value))) else: row.append(QStandardItem(None)) if len(row) > 0: standard_model.appendRow(row) self.ids.append(feature_id) self.insert_single_checkbox(self.tbl_relation) def get_feature_by_id(self, layer, id, field_id): iter = layer.getFeatures() for feature in iter: if feature[field_id] == id: return feature return False def insert_single_checkbox(self, qtable): """ Create one QCheckBox and put into QTableView at position @self.chk_position """ cell_widget = QWidget() chk = QCheckBox() lay_out = QHBoxLayout(cell_widget) lay_out.addWidget(chk) lay_out.setAlignment(Qt.AlignCenter) lay_out.setContentsMargins(0, 0, 0, 0) cell_widget.setLayout(lay_out) i = qtable.model().index(qtable.model().rowCount() - 1, self.chk_position) qtable.setIndexWidget(i, cell_widget) def remove_selection(self, dialog, qtable): self.disconnect_signal_selection_changed() feature_type = utils_giswater.get_item_data(self.dlg_lot, self.dlg_lot.feature_type, 0).lower() # Get selected rows index_list = qtable.selectionModel().selectedRows() if len(index_list) == 0: message = "Any record selected" self.controller.show_info_box(message) return index = index_list[0] model = qtable.model() for i in range(len(index_list) - 1, -1, -1): row = index_list[i].row() column_index = utils_giswater.get_col_index_by_col_name( qtable, feature_type + '_id') feature_id = index.sibling(row, column_index).data() self.ids.remove(feature_id) model.takeRow(row) self.enable_combos(dialog) def set_active_layer(self): self.current_layer = self.iface.activeLayer() # Set active layer layer_name = 'v_edit_' + utils_giswater.get_item_data( self.dlg_lot, self.visit_class, 2).lower() self.layer_lot = self.controller.get_layer_by_tablename(layer_name) self.iface.setActiveLayer(self.layer_lot) self.iface.legendInterface().setLayerVisible(self.layer_lot, True) def selection_init(self, dialog): """ Set canvas map tool to an instance of class 'MultipleSelection' """ self.disconnect_signal_selection_changed() self.iface.actionSelect().trigger() self.connect_signal_selection_changed(dialog) def connect_signal_selection_changed(self, dialog): """ Connect signal selectionChanged """ try: self.canvas.selectionChanged.connect( partial(self.manage_selection, dialog, self.layer_lot, self.geom_type)) except Exception: pass def set_feature_type_cmb(self): feature_type = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.cmb_visit_class, 2) utils_giswater.set_combo_itemData(self.feature_type, feature_type, 1) self.feature_type.setEnabled(False) def set_dates(self): visit_class_id = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.cmb_visit_class, 0) sql = ("SELECT visitclass_id, formname, tablename FROM " + self.schema_name + ".config_api_visit " " WHERE visitclass_id ='" + str(visit_class_id) + "'") row = self.controller.get_row(sql, log_sql=True) sql = ("SELECT MIN(startdate), MAX(enddate)" " FROM {}.{}".format(self.schema_name, row['tablename'])) row = self.controller.get_row(sql) if row: if row[0]: self.dlg_lot.date_event_from.setDate(row[0]) else: current_date = QDate.currentDate() self.dlg_lot.date_event_from.setDate(current_date) if row[1]: self.dlg_lot.date_event_to.setDate(row[1]) else: current_date = QDate.currentDate() self.dlg_lot.date_event_to.setDate(current_date) def reload_table_visit(self): feature_type = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.cmb_visit_class, 2) object_id = utils_giswater.getWidgetText(self.dlg_lot, self.dlg_lot.txt_filter) visit_start = self.dlg_lot.date_event_from.date() visit_end = self.dlg_lot.date_event_to.date() # Get selected dates date_from = visit_start.toString('yyyyMMdd 00:00:00') date_to = visit_end.toString('yyyyMMdd 23:59:59') if date_from > date_to: message = "Selected date interval is not valid" self.controller.show_warning(message) return visit_class_id = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.cmb_visit_class, 0) sql = ("SELECT visitclass_id, formname, tablename FROM " + self.schema_name + ".config_api_visit " " WHERE visitclass_id ='" + str(visit_class_id) + "'") row = self.controller.get_row(sql, log_sql=False) table_name = row['tablename'] if self.schema_name not in table_name: table_name = self.schema_name + "." + table_name # Create interval dates format_low = 'yyyy-MM-dd 00:00:00.000' format_high = 'yyyy-MM-dd 23:59:59.999' interval = "'{}'::timestamp AND '{}'::timestamp".format( visit_start.toString(format_low), visit_end.toString(format_high)) expr_filter = ("(startdate BETWEEN {0}) AND (enddate BETWEEN {0})". format(interval)) if object_id != 'null': expr_filter += " AND " + str( feature_type) + "_id::TEXT ILIKE '%" + str(object_id) + "%'" expr_filter += " AND " + str(feature_type) + "_id IN ('0', " for i in range(len(self.ids)): expr_filter += "'" + str(self.ids[i]) + "', " expr_filter = expr_filter[:-2] + ")" model = QSqlTableModel() model.setTable(table_name) model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.setFilter(expr_filter) model.sort(0, 1) model.select() # Check for errors if model.lastError().isValid(): self.controller.show_warning(model.lastError().text()) # Attach model to table view self.dlg_lot.tbl_visit.setModel(model) def get_dialog(self): visit_class_id = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.cmb_visit_class, 0) sql = ("SELECT visitclass_id, formname, tablename FROM " + self.schema_name + ".config_api_visit " " WHERE visitclass_id ='" + str(visit_class_id) + "'") row = self.controller.get_row(sql, log_sql=True) self.controller.log_info(str("TODO: ABRIR FORMULARIOS")) self.controller.log_info(str(row)) def save_lot(self): lot = {} lot['idval'] = utils_giswater.getWidgetText(self.dlg_lot, 'txt_idval', False, False) lot['startdate'] = utils_giswater.getCalendarDate( self.dlg_lot, 'startdate') lot['enddate'] = utils_giswater.getCalendarDate( self.dlg_lot, 'enddate') lot['visitclass_id'] = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.cmb_visit_class, 0) lot['descript'] = utils_giswater.getWidgetText(self.dlg_lot, 'descript', False, False) lot['status'] = utils_giswater.get_item_data(self.dlg_lot, self.dlg_lot.cmb_status, 0) lot['feature_type'] = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.cmb_visit_class, 2).lower() lot['team_id'] = utils_giswater.get_item_data( self.dlg_lot, self.dlg_lot.cmb_assigned_to, 0) keys = "" values = "" update = "" for key, value in lot.items(): if value != '': keys += "" + key + ", " if type(value) in (int, bool): values += "$$" + str(value) + "$$, " update += str(key) + "=$$" + str(value) + "$$, " else: values += "$$" + value + "$$, " update += str(key) + "=$$" + value + "$$, " keys = keys[:-2] values = values[:-2] update = update[:-2] if self.is_new_lot is True: sql = ("INSERT INTO " + self.schema_name + ".om_visit_lot(" + keys + ") " " VALUES (" + values + ") RETURNING id") row = self.controller.execute_returning(sql, log_sql=False) lot_id = row[0] else: lot_id = utils_giswater.getWidgetText(self.dlg_lot, 'lot_id', False, False) sql = ("UPDATE " + self.schema_name + ".om_visit_lot " " SET " + str(update) + "" " WHERE id = '" + str(lot_id) + "'; \n") self.controller.execute_sql(sql, log_sql=False) sql = ("DELETE FROM " + self.schema_name + ".om_visit_lot_x_" + lot['feature_type'] + " " " WHERE lot_id = '" + str(lot_id) + "'; \n") model_rows = self.read_standaritemmodel(self.tbl_relation) for item in model_rows: keys = "lot_id, " values = "$$" + str(lot_id) + "$$, " for key, value in item.items(): if key != 'lot_id': if value not in ('', None) and type(value) != QPyNullVariant: keys += "" + key + ", " if type(value) in (int, bool): values += "$$" + str(value) + "$$, " else: values += "$$" + value + "$$, " keys = keys[:-2] values = values[:-2] sql += ("INSERT INTO " + self.schema_name + ".om_visit_lot_x_" + lot['feature_type'] + "(" + keys + ") " " VALUES (" + values + "); \n") status = self.controller.execute_sql(sql, log_sql=False) if status: self.manage_rejected() def set_completers(self): """ Set autocompleters of the form """ # Adding auto-completion to a QLineEdit - lot_id self.completer = QCompleter() self.dlg_lot.lot_id.setCompleter(self.completer) model = QStringListModel() sql = "SELECT DISTINCT(id) FROM " + self.schema_name + ".om_visit" rows = self.controller.get_rows(sql, commit=self.autocommit) values = [] if rows: for row in rows: values.append(str(row[0])) model.setStringList(values) self.completer.setModel(model) def zoom_to_feature(self): feature_type = utils_giswater.get_item_data(self.dlg_lot, self.visit_class, 2).lower() selected_list = self.tbl_relation.selectionModel().selectedRows() if len(selected_list) == 0: message = "Any record selected" self.controller.show_warning(message) return index = selected_list[0] row = index.row() column_index = utils_giswater.get_col_index_by_col_name( self.tbl_relation, feature_type + '_id') feature_id = index.sibling(row, column_index).data() expr_filter = '"{}_id" IN ({})'.format(self.geom_type, "'" + feature_id + "'") # Check expression (is_valid, expr) = self.check_expression(expr_filter) self.select_features_by_ids(feature_type, expr) self.iface.actionZoomToSelected().trigger() def manage_rejected(self): self.disconnect_signal_selection_changed() self.close_dialog(self.dlg_lot) def put_checkbox(self, qtable, rows, checker, value): """ Set one column of a QtableView as QCheckBox with values from database. """ for x in range(0, len(rows)): row = rows[x] cell_widget = QWidget() chk = QCheckBox() if row[checker] == value: chk.setCheckState(Qt.Checked) lay_out = QHBoxLayout(cell_widget) lay_out.addWidget(chk) lay_out.setAlignment(Qt.AlignCenter) lay_out.setContentsMargins(0, 0, 0, 0) cell_widget.setLayout(lay_out) i = qtable.model().index(x, self.chk_position) qtable.setIndexWidget(i, cell_widget) def get_headers(self, qtable): headers = [] for x in range(0, qtable.model().columnCount()): headers.append(qtable.model().headerData(x, Qt.Horizontal)) return headers # def edit_visit(self): # """ Button 65: Edit visit """ # # # Create the dialog # self.dlg_man = VisitManagement() # self.load_settings(self.dlg_man) # # save previous dialog and set new one. # # previous dialog will be set exiting the current one # # self.previous_dialog = utils_giswater.dialog() # self.dlg_man.tbl_visit.setSelectionBehavior(QAbstractItemView.SelectRows) # # # Set a model with selected filter. Attach that model to selected table # table_object = "v_ui_om_visitman_x_" + str(geom_type) # expr_filter = geom_type + "_id = '" + feature_id + "'" # # Refresh model with selected filter # self.fill_table_object(self.dlg_man.tbl_visit, self.schema_name + "." + table_object, expr_filter) # self.set_table_columns(self.dlg_man, self.dlg_man.tbl_visit, table_object) # # # manage save and rollback when closing the dialog # self.dlg_man.rejected.connect(partial(self.close_dialog, self.dlg_man)) # self.dlg_man.accepted.connect( # partial(self.open_selected_object, self.dlg_man, self.dlg_man.tbl_visit, table_object)) # # # Set dignals # self.dlg_man.tbl_visit.doubleClicked.connect( # partial(self.open_selected_object, self.dlg_man, self.dlg_man.tbl_visit, table_object)) # self.dlg_man.btn_open.clicked.connect( # partial(self.open_selected_object, self.dlg_man, self.dlg_man.tbl_visit, table_object)) # self.dlg_man.btn_delete.clicked.connect( # partial(self.delete_selected_object, self.dlg_man.tbl_visit, table_object)) # self.dlg_man.txt_filter.textChanged.connect( # partial(self.filter_visit, self.dlg_man, self.dlg_man.tbl_visit, self.dlg_man.txt_filter, table_object, # expr_filter)) # # # set timeStart and timeEnd as the min/max dave values get from model # current_date = QDate.currentDate() # sql = ("SELECT MIN(startdate), MAX(enddate)" # " FROM {}.{}".format(self.schema_name, 'om_visit')) # row = self.controller.get_row(sql, log_info=False, commit=self.autocommit) # if row: # if row[0]: # self.dlg_man.date_event_from.setDate(row[0]) # if row[1]: # self.dlg_man.date_event_to.setDate(row[1]) # else: # self.dlg_man.date_event_to.setDate(current_date) # # # set date events # self.dlg_man.date_event_from.dateChanged.connect( # partial(self.filter_visit, self.dlg_man, self.dlg_man.tbl_visit, self.dlg_man.txt_filter, table_object, # expr_filter)) # self.dlg_man.date_event_to.dateChanged.connect( # partial(self.filter_visit, self.dlg_man, self.dlg_man.tbl_visit, self.dlg_man.txt_filter, table_object, # expr_filter)) # # # Open form # self.open_dialog(self.dlg_man, dlg_name="visit_management") # Attach model to table view # def fill_custom_model(self, widget, table_name, expr_filter=None): # """ Set a model with selected filter. Attach that model to selected table """ # if self.schema_name not in table_name: # table_name = self.schema_name + "." + table_name # # Set model # # model = CustomSqlModel() # model.setTable(table_name) # model.setEditStrategy(QSqlTableModel.OnManualSubmit) # model.sort(0, 1) # if expr_filter: # model.setFilter(expr_filter) # model.select() # # # Check for errors # if model.lastError().isValid(): # self.controller.show_warning(model.lastError().text()) # # # Attach model to table view # widget.setModel(model) def lot_manager(self): """ Button 75: Lot manager """ # Create the dialog self.dlg_lot_man = VisitManagement() self.load_settings(self.dlg_lot_man) self.dlg_lot_man.setWindowTitle("Lot management") self.dlg_lot_man.lbl_filter.setText('Filter by idval: ') self.dlg_lot_man.btn_open.setText('Open lot') self.dlg_lot_man.btn_delete.setText('Delete lot') # save previous dialog and set new one. # previous dialog will be set exiting the current one # self.previous_dialog = utils_giswater.dialog() self.dlg_lot_man.tbl_visit.setSelectionBehavior( QAbstractItemView.SelectRows) # Set a model with selected filter. Attach that model to selected table table_object = "om_visit_lot" self.fill_table_object(self.dlg_lot_man.tbl_visit, self.schema_name + "." + table_object) self.set_table_columns(self.dlg_lot_man, self.dlg_lot_man.tbl_visit, table_object) # manage save and rollback when closing the dialog self.dlg_lot_man.rejected.connect( partial(self.close_dialog, self.dlg_lot_man)) self.dlg_lot_man.accepted.connect( partial(self.open_lot, self.dlg_lot_man, self.dlg_lot_man.tbl_visit, table_object)) # Set signals self.dlg_lot_man.tbl_visit.doubleClicked.connect( partial(self.open_lot, self.dlg_lot_man, self.dlg_lot_man.tbl_visit)) self.dlg_lot_man.btn_open.clicked.connect( partial(self.open_lot, self.dlg_lot_man, self.dlg_lot_man.tbl_visit)) self.dlg_lot_man.btn_delete.clicked.connect( partial(self.delete_lot, self.dlg_lot_man.tbl_visit)) self.dlg_lot_man.txt_filter.textChanged.connect( partial(self.filter_lot, self.dlg_lot_man, self.dlg_lot_man.tbl_visit, self.dlg_lot_man.txt_filter)) # set timeStart and timeEnd as the min/max dave values get from model current_date = QDate.currentDate() sql = ("SELECT MIN(startdate), MAX(enddate)" " FROM {}.{}".format(self.schema_name, table_object)) row = self.controller.get_row(sql, log_info=True, commit=self.autocommit) if row: if row[0]: self.dlg_lot_man.date_event_from.setDate(row[0]) if row[1]: self.dlg_lot_man.date_event_to.setDate(row[1]) else: self.dlg_lot_man.date_event_to.setDate(current_date) # set date events self.dlg_lot_man.date_event_from.dateChanged.connect( partial(self.filter_lot, self.dlg_lot_man, self.dlg_lot_man.tbl_visit, self.dlg_lot_man.txt_filter)) self.dlg_lot_man.date_event_to.dateChanged.connect( partial(self.filter_lot, self.dlg_lot_man, self.dlg_lot_man.tbl_visit, self.dlg_lot_man.txt_filter)) # Open form self.open_dialog(self.dlg_lot_man, dlg_name="visit_management") def delete_lot(self, qtable): selected_list = qtable.selectionModel().selectedRows() if len(selected_list) == 0: message = "Any record selected" self.controller.show_warning(message) return for x in range(0, len(selected_list)): row = selected_list[x].row() _id = qtable.model().record(row).value('id') feature_type = qtable.model().record(row).value('feature_type') sql = ("DELETE FROM " + self.schema_name + ".om_visit_lot_x_" + str(feature_type) + " " " WHERE lot_id = '" + str(_id) + "'; \n " "DELETE FROM " + self.schema_name + ".om_visit_lot " " WHERE id ='" + str(_id) + "'") self.controller.execute_sql(sql, log_sql=False) self.filter_lot(self.dlg_lot_man, self.dlg_lot_man.tbl_visit, self.dlg_lot_man.txt_filter) def open_lot(self, dialog, widget): """ Open object form with selected record of the table """ selected_list = widget.selectionModel().selectedRows() if len(selected_list) == 0: message = "Any record selected" self.controller.show_warning(message) return row = selected_list[0].row() # Get object_id from selected row selected_object_id = widget.model().record(row).value('id') visitclass_id = widget.model().record(row).value('visitclass_id') # Close this dialog and open selected object dialog.close() # set previous dialog # if hasattr(self, 'previous_dialog'): self.manage_lot(selected_object_id, is_new=False, visitclass_id=visitclass_id) def filter_lot(self, dialog, widget_table, widget_txt): """ Filter om_visit in self.dlg_lot_man.tbl_visit based on (id AND text AND between dates)""" object_id = utils_giswater.getWidgetText(dialog, widget_txt) visit_start = dialog.date_event_from.date() visit_end = dialog.date_event_to.date() if visit_start > visit_end: message = "Selected date interval is not valid" self.controller.show_warning(message) return # Create interval dates format_low = 'yyyy-MM-dd 00:00:00.000' format_high = 'yyyy-MM-dd 23:59:59.999' interval = "'{}'::timestamp AND '{}'::timestamp".format( visit_start.toString(format_low), visit_end.toString(format_high)) expr_filter = ( "(startdate BETWEEN {0}) AND (enddate BETWEEN {0} or enddate is null)" .format(interval)) if object_id != 'null': expr_filter += " AND idval::TEXT ILIKE '%" + str(object_id) + "%'" # Refresh model with selected filter widget_table.model().setFilter(expr_filter) widget_table.model().select()
class DiffGUI(object): ' diff gui class ' 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 make_diff(self): ' make the diff ' diff_command = ''.join(( 'nice --adjustment=', str(self.nice.currentText()).strip(), ' ', str(self.bcknd.currentText()).strip(), ' --', str(self.frmt.currentText()).strip().lower(), ' --new-file ' if self.nwfl.isChecked() is True else '', ' --minimal ' if self.smll.isChecked() is True else '', ' --speed-large-files ' if self.lrgf.isChecked() is True else '', ' --ignore-self.case ' if self.case.isChecked() is True else '', ' --expand-tabs ' if self.cnvt.isChecked() is True else '', ' --ignore-blank-lines ' if self.blnk.isChecked() is True else '', ' --ignore-space-change ' if self.spac.isChecked() is True else '', ' --ignore-all-space ' if self.whit.isChecked() is True else '', ' --ignore-tab-expansion ' if self.tabz.isChecked() is True else '', ' --suppress-blank-empty ' if self.sprs.isChecked() is True else '', ' --ignore-file-name-case ' if self.filn.isChecked() is True else '', ' --text ' if self.plai.isChecked() is True else '', ' --strip-trailing-cr ' if self.nocr.isChecked() is True else '', ' --suppress-common-lines ' if self.nocm.isChecked() is True else '', ' --initial-tab ' if self.pret.isChecked() is True else '', ' --side-by-side ' if self.lolz.isChecked() is True else '', ' --tabsize=', str(self.tbs.currentText()).strip(), ' --width=', str(self.wdth.currentText()).strip(), str(' --ignore-matching-lines=' + str(self.regex.text()).strip()) if str(self.regex.text()).strip() is not '' else '', ' ', path.abspath(str(self.file1.text())) if str(self.file1.text()).strip() is not '' else __file__, ' ', path.abspath(str(self.file2.text())) if str(self.file2.text()).strip() is not '' else __file__ )) print(diff_command) diff_output = getoutput(diff_command) try: print(' INFO: OK, Saving new Diff to disk...') output_file = file(path.abspath(str(self.fout.text())), 'w') output_file.write(diff_output) output_file.close() except: print(' ERROR: FAIL, Can not save Diff to disk!') if self.clip.isChecked() is True: print(' INFO: OK, Diff Copied to Clipboard...') QApplication.clipboard().setText(diff_output) if self.noti.isChecked() is True: call('notify-send [Ninja-IDE] ¡Diff_is_Ready!', shell=True) if self.odif.isChecked() is True: print(' INFO: OK, Opening Diff with Ninja-IDE') call('ninja-ide ' + path.abspath(str(self.fout.text())), shell=True) self.diff_path = path.abspath(str(self.fout.text())) return self.diff_path
class PageProjectProperties(QWizardPage): 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()"))) def isComplete(self): name = self.txtName.text().strip() place = self.txtPlace.text().strip() return (len(name) > 0) and (len(place) > 0) def load_folder(self): self.txtPlace.setText(QFileDialog.getExistingDirectory( self, self.tr("New Project Folder"))) self.emit(SIGNAL("completeChanged()")) def load_folder_venv(self): self.vtxtPlace.setText(QFileDialog.getExistingDirectory( self, self.tr("Select Virtualenv Folder")))