def update_usb_devices(self): model = QStandardItemModel() bus = dbus.SystemBus() self.iface = 'org.freedesktop.DBus.ObjectManager' #bus.add_signal_receiver(self.callback_function, signal, iface) proxy = bus.get_object("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2") self.iface = dbus.Interface(proxy, "org.freedesktop.UDisks2") self.iface.connect_to_signal('DeviceAdded', self.device_added_callback) self.iface.connect_to_signal('DeviceRemoved', self.device_removed_callback) self.iface.connect_to_signal('InterfacesAdded', self.device_changed_callback) dev1 = get_usb() items = get_usb() #for text, checked in items: for text in sorted(items): text_item = QStandardItem(text) #checked_item = QStandardItem() #checked_item.setData(QVariant(checked), Qt.CheckStateRole) model.appendRow(text_item) #([text_item, checked_item]) view = QTreeView() view.header().hide() view.setRootIsDecorated(False) combo = self.ui.comboBox_device combo.setView(view) combo.setModel(model) combo.show()
class Navigation(QWidget): """a navigation widget, displaying all known projects and samples """ changed_projects = pyqtSignal(str, str) changed_allele = pyqtSignal(str, int, str) change_view = pyqtSignal(int) refresh = pyqtSignal(str) def __init__(self, log, settings): self.log = log self.settings = settings super().__init__() self.init_UI() self.create_model() self.tree.expand(self.open_node) self.tree.clicked.connect(self.onClicked) self.tree.setContextMenuPolicy(Qt.CustomContextMenu) self.tree.customContextMenuRequested.connect(self.open_menu) def init_UI(self): """creates the UI """ self.log.debug("Setting up Navigation area UI...") self.tree = QTreeView() self.tree.doubleClicked.connect(self.onDoubleClick) self.grid = QGridLayout() self.setLayout(self.grid) self.header_lbl = QLabel("Projects and Samples:", self) self.header_lbl.setStyleSheet(general.label_style_2nd) self.grid.addWidget(self.header_lbl, 0,0) self.grid.addWidget(self.tree, 1, 0) header = self.tree.header() header.hide() self.log.debug("\t=> Done!") def create_model(self): """creates or recreates the model """ self.log.debug("Updating Navigation area...") root_node = Node("All") openNode = Node("Open", root_node) closedNode = Node("Closed", root_node) project_nodes = {} query = """select distinct sample_id_int, projects.project_name, project_status, allele_status, allele_nr from projects left join alleles on projects.project_name = alleles.project_name order by project_status desc, projects.project_name desc, sample_id_int """ q = QtSql.QSqlQuery() q.exec_(query) while q.next(): sample = q.value(0) project = q.value(1) pstatus = q.value(2) astatus = q.value(3) nr = q.value(4) try: pnode = project_nodes[project] except KeyError: if pstatus == "Closed": topnode = closedNode else: topnode = openNode pnode = Node(project, topnode, "Project") project_nodes[project] = pnode if sample: if nr != 1: sample = "{} ({})".format(sample, nr) Node(sample, pnode, "Sample", astatus) self.model = NavigationModel(root_node) self.tree.setModel(self.model) self.open_node = self.model.index(0, 0, QModelIndex()) self.closed_node = self.model.index(1, 0, QModelIndex()) self.root_node = self.open_node.parent() self.log.debug("\t=> Done!") @pyqtSlot(str, str) def expand_project(self, project, status = None): """expands the node of the given project, returns its index and parent-node's index """ self.log.debug("Expanding project {} ({})...".format(project, status)) if not status in (None, "Open", "Closed"): return None, None myindex = self.open_node myparent_node = self.open_node if status == "Open": self.log.debug("Open") parent_node = self.open_node self.tree.expand(parent_node) self.tree.collapse(self.closed_node) elif status == "Closed": self.log.debug("Closed") parent_node = self.closed_node self.tree.expand(parent_node) self.tree.collapse(self.open_node) else: # figure out whether project is open or closed self.log.debug("Status unknown...") try: for i in range(self.model.rowCount(self.root_node)): parent_node = self.model.index(i, 0, self.root_node) status = self.model.data(parent_node, Qt.DisplayRole) for row in range(self.model.rowCount(parent_node)): index = self.model.index(row, 0, parent_node) myproj = self.model.data(index, Qt.DisplayRole) if myproj == project: myindex = index myparent_node = parent_node self.tree.expand(myindex) except Exception as E: self.log.error(E) self.log.exception(E) self.select_project(project) self.log.debug("\t=> project found ({}) and successfully expanded".format(status)) return myindex, myparent_node @pyqtSlot(QModelIndex) def onClicked(self, index): """emits signals when a project or sample is selected """ data = self.model.data(index, Qt.DisplayRole) nodetype = self.model.nodeType(index) if nodetype == "Sample": if ("(") in data: data = data.split("(") sample = data[0].strip() nr = int(data[1].strip()[:-1]) else: sample = data nr = 1 project = self.model.data(self.model.parent(index), Qt.DisplayRole) self.changed_allele.emit(sample, nr, project) self.log.debug("Navigation emitted 'Allele changed to {} #{} (project {})'".format(sample, nr, project)) elif nodetype == "Project": status = self.model.data(self.model.parent(index), Qt.DisplayRole) self.changed_projects.emit(data, status) self.log.debug("Navigation emitted 'Project changed to {}'".format(data)) @pyqtSlot(QPoint) def open_menu(self, pos): """provides a context menu """ index = self.tree.indexAt(pos) nodetype = self.model.nodeType(index) self.log.debug("Opening navigation menu...") if nodetype == "Project": menu = QMenu() open_project_act = menu.addAction("Open Project View") action = menu.exec_(self.tree.mapToGlobal(pos)) if action == open_project_act: project = self.model.data(index, Qt.DisplayRole) status = self.model.data(self.model.parent(index), Qt.DisplayRole) self.changed_projects.emit(project, status) self.change_view.emit(3) self.log.debug("Navigation emitted changed_projects & change_view to ProjectView") elif nodetype == "Sample": menu = QMenu() open_sample_act = menu.addAction("Open Sample View") delete_sample_act = menu.addAction("Delete Allele (admin-only!)") action = menu.exec_(self.tree.mapToGlobal(pos)) if action: sample_list = self.model.data(index, Qt.DisplayRole).split() sample = sample_list[0] if len(sample_list) > 1: nr = int(sample_list[1][1:-1]) else: nr = 1 project = self.model.data(self.model.parent(index), Qt.DisplayRole) status = self.model.data(self.model.parent(self.model.parent(index)), Qt.DisplayRole) if action == open_sample_act: try: self.changed_allele.emit(sample, nr, project) self.change_view.emit(4) self.log.debug("Navigation emitted changed_alleles & change_view to AlleleView") except Exception as E: self.log.exception(E) elif action == delete_sample_act: self.log.info("Deleting {} #{} of project {}".format(sample, nr, project)) self.delete_sample(sample, nr, project, status) @pyqtSlot(QModelIndex) def onDoubleClick(self, index): """open SampleView or ProjectView """ nodetype = self.model.nodeType(index) if nodetype == "Project": project = self.model.data(index, Qt.DisplayRole) status = self.model.data(self.model.parent(index), Qt.DisplayRole) self.changed_projects.emit(project, status) self.change_view.emit(3) self.log.debug("Navigation emitted changed_projects & change_view to ProjectView") elif nodetype == "Sample": sample_list = self.model.data(index, Qt.DisplayRole).split() sample = sample_list[0] if len(sample_list) > 1: nr = int(sample_list[1][1:-1]) else: nr = 1 project = self.model.data(self.model.parent(index), Qt.DisplayRole) status = self.model.data(self.model.parent(self.model.parent(index)), Qt.DisplayRole) self.changed_allele.emit(sample, nr, project) self.change_view.emit(4) self.log.debug("Navigation emitted changed_alleles & change_view to AlleleView") @pyqtSlot(str) def select_project(self, project): """looks for <project> in the tree-model and selects it if found; selects it and returns its index """ for top_node in [self.open_node, self.closed_node]: index = self.model.findValue(top_node, project) if index.isValid(): self.tree.setCurrentIndex(index) return index return QModelIndex() @pyqtSlot(str) def select_sample(self, project, sample, nr): """looks for <sample> in <project> in the tree-model and selects it if found; selects it and returns its index """ pindex = self.select_project(project) if int(nr) > 1: sample = "{} ({})".format(sample, nr) index = self.model.findValue(pindex, sample) if index.isValid(): self.tree.setCurrentIndex(index) return index return QModelIndex() def delete_sample(self, sample, nr, project, status): """delete a sample from the database & file system """ self.log.debug("Attempting to delete sample '{}' allele {} of project '{}' from database...".format(sample, nr, project)) if self.settings["login"] == "admin": pass else: pwd, ok = QInputDialog.getText(self, "Enter Password", "Please provide password:"******"ichdarfdas": pass else: return else: return self.log.debug("Asking for confirmation before deleting allele...") reply = QMessageBox.question(self, 'Message', "Are you really sure you want to delete sample {} allele #{} from project {}?".format(sample, nr, project), QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: # delete from database: delete_q_alleles = "delete from alleles where sample_id_int = '{}' and allele_nr = {} and project_name = '{}'".format(sample, nr, project) success, _ = db_internal.execute_query(delete_q_alleles, 0, self.log, "Deleting sample {} allele #{} from ALLELES table".format(sample, nr), "Sample Deletion Error", self) if success: self.log.debug("\t=> Successfully deleted sample from table ALLELES") more_projects_query = "select project_name from alleles where sample_id_int = '{}'".format(sample) success, data = db_internal.execute_query(more_projects_query, 1, self.log, "Finding more rows with sample {} in ALLELES table".format(sample), "Sample Deletion Error", self) single_allele = False if success: if not data: # sample was only contained in this project and only had one allele single_allele = True delete_q_samples = "delete from SAMPLES where sample_id_int = '{}'".format(sample) success, _ = db_internal.execute_query(delete_q_samples, 0, self.log, "Deleting sample {} from SAMPLES table".format(sample), "Sample Deletion Error", self) if success: self.log.debug("\t=> Successfully deleted sample from table SAMPLES") files_q = "select raw_file, fasta, blast_xml, ena_file, ena_response_file, ipd_submission_file from FILES where sample_id_int = '{}' and allele_nr = {}".format(sample, nr) success, files = db_internal.execute_query(files_q, 6, self.log, "Getting files of sample {} #{} from FILES table".format(sample, nr), "Sample Deletion Error", self) if success: delete_q_files = "delete from FILES where sample_id_int = '{}' and allele_nr = {}".format(sample, nr) success, _ = db_internal.execute_query(delete_q_files, 0, self.log, "Deleting sample {} from FILES table".format(sample), "Sample Deletion Error", self) if success: self.log.debug("\t=> Successfully deleted sample from table FILES") # delete from disk space: self.log.debug("Attempting to delete sample {} allele #{} of project '{}' from file system...".format(sample, nr, project)) sample_dir = os.path.join(self.settings["projects_dir"], project, sample) if files: for myfile in files[0]: if myfile: self.log.debug("\tDeleting {}...".format(myfile)) try: os.remove(os.path.join(sample_dir, myfile)) except Exception: self.log.debug("\t\t=> Could not delete") if single_allele: self.log.debug("\tDeleting sample dir {}...".format(sample_dir)) os.removedirs(sample_dir) self.log.debug("=> Sample {} #{} of project {} successfully deleted from database and file system".format(sample, nr, project)) self.refresh.emit(project) self.changed_projects.emit(project, status)
class BookWarriorHomepage ( QWidget,Ui_BookWarriorHomepage): updateSelection = pyqtSignal() def __init__ (self,model,parent=None): super(BookWarriorHomepage,self).__init__(parent) self.setupUi(self) self.max_vignettes = 20 self.nb_col = 0 self.nb_row = 0 self.vignettes_liste = [] self.model = model self.settings = Config().instance.settings self.list_warrior = [] # utilise pour maj selection depuis warrrior layout def setLeftPage(self): self.treeView = QTreeView(self) self.treeView.setObjectName("treeView") self.left_page_Layout.addWidget(self.treeView) self.treeView.activated.connect(self.changeCurrentSet) self.tree_model = TreeModel(self.model) self.treeView.setModel(self.tree_model) self.treeView.setWindowTitle("Simple Tree Model") self.treeView.header().hide() self.treeView.setAlternatingRowColors(True) # i = 0 # self.treeKingdom.setColumnCount(3) # for faction in self.model.factions.values() : # item_f = QTreeWidgetItem(self.treeKingdom) # #self.treeKingdom.insertTopLevelItem(i,item_f) # item_f.setText(i,faction.name) # i = i +1 # for empire in faction.empires.values(): # item_e = QTreeWidgetItem() # item_e.setText(i,empire.name) # item_f.addChild(item_e) # for kingdom in empire.kingdoms.values(): # item_k = QTreeWidgetItem() # item_k.setText(i,kingdom.name) # item_e.addChild(item_k) # for groupe in kingdom.groupes.values(): # item_g = QTreeWidgetItem() # item_g.setText(i,groupe.name) # print ('groupe',groupe.name) # item_k.addChild(item_g) def setRightContent (self, list_warrior): self.list_warrior = list_warrior for v in self.vignettes_liste : v.setParent(None) self.gridLayout.removeWidget(v) # while self.gridLayout.takeAt(0) != None : # del self.gridLayout.takeAt(0).widget # item = self.gridLayout.takeAt(0) # print ('ll') # del item self.nb_col = 0 self.nb_row = 0 self.vignettes_liste = [] for i in range (min(len(list_warrior),self.max_vignettes)): self.addVignette(list_warrior[i],i) def updateContent(self): pass def addVignette (self,warrior,i): widget_vignette = QWidget(self.vignettes) layout_one_vignette = QVBoxLayout(widget_vignette) layout_one_vignette.setSpacing(0) layout_one_vignette.setContentsMargins(0, 0, 0, 0) warrior_button = QPushButton(widget_vignette) # on met plus car dans le cas du signal clicked on enverra True ou False (0 ou 1) warrior_button.setObjectName(str(i+2)) warrior_button.clicked.connect(self.parent().goWarriorPage) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) warrior_button.setFixedSize(QtCore.QSize(100,120)) warrior_button.setSizePolicy(sizePolicy) layout_one_vignette.addWidget(warrior_button) # label warrior_label = HerosLabel(warrior,widget_vignette) layout_one_vignette.addWidget(warrior_label) max_col = 3 groupe_name = warrior.groupe().name if warrior.masterGroupe() != None : groupe_name = warrior.masterGroupe().name+"/"+groupe_name #path = os.path.join(Config().instance.path_to_pic(),faction_name,empire_name,kingdom_name,"Picture",groupe_name,warrior_name icon = QIcon(warrior.thumb) #print (basepath+"/"+faction_name+"/"+empire_name+"/"+kingdom_name+"/Picture/"+groupe_name+"/"+warrior.name+"/portrait_thumbnail.jpg") warrior_button.setIcon(icon) warrior_button.setIconSize(QtCore.QSize(100,120)) if self.nb_col == 0: self.nb_row = self.nb_row + 1 self.gridLayout.addWidget(widget_vignette,self.nb_row,self.nb_col) self.vignettes_liste.append(widget_vignette) self.nb_col = (self.nb_col +1)%max_col def changeCurrentSet(self,index): print ('changecurrentset:') item = self.tree_model.metadata(index, QtCore.Qt.DecorationRole) list_warrior = item.getWarriorList() self.setRightContent(list_warrior) self.updateSelection.emit()