class VMWidget(QWidget): def __init__(self,parent = None): super(VMWidget,self).__init__(parent) #self.setStyleSheet("QToolTip{background-color:white;color:black;font-size:12px;}") #self.setFont(QFont(u"微软雅黑",12)) self.vmInfoList = [] self.oldVmInfoList = [] self.vmOffInfoList = [] self.threadMap = {} self.processMap = {} self.parent = parent self.domainManager = DomainManager() self.progressMonitor = ProgressThread() self.vmstatusTimer = QTimer() #self.vmstatusTimer.start(7000) self.connect(self.vmstatusTimer, SIGNAL("timeout()"),self.postStatusToServer) self.startVmInfo = None if common.SCROLL_TYPE != "slider": self.scrollArea = QScrollArea(self) self.scrollArea.setStyleSheet("background-color:transparent;border:0px") self.vmButtonList = [] self.vmTableWidget = QTableWidget() self.setTableWidgetStyle() self.mainLayout = QVBoxLayout() self.mainLayout.setMargin(0) self.mainLayout.setSpacing(0) self.mainLayout.addWidget(self.scrollArea) self.mainLayout.addSpacing(10) self.setLayout(self.mainLayout) self.downloadingList = [] if common.SCROLL_TYPE == "slider": #三个自定义button,用于显示相应的虚拟机 self.firstVM = CustomVMButton(self) self.secondVM = CustomVMButton(self) self.thirdVM = CustomVMButton(self) self.vmButtonList = [self.firstVM, self.secondVM, self.thirdVM] for i in range(len(self.vmButtonList)): self.vmButtonList[i].setIcon(QIcon("images/windows.png")) self.vmButtonList[i].setIconSize(QSize(100,100)) self.vmButtonList[i].setFlat(True) self.vmButtonList[i].setFont(QFont("Times", 15, QFont.Bold)) #设置滑动条的样式 self.slider = QSlider(Qt.Vertical,self) self.slider.setStyleSheet( "QSlider::groove:vertical { " "border: 1px solid #4A708B; " "background: #C0C0C0; " "width: 5px; " "border-radius: 1px; " "padding-left:-1px; " "padding-right:-1px; " "padding-top:-1px; " "padding-bottom:-1px; " "}" "QSlider::handle:vertical {" "height: 100px;" "background: white;" "margin: 0 -4px;" "}" ) self.btnLayout = QHBoxLayout(self) self.btnLayout.addStretch() self.btnLayout.addWidget(self.firstVM) self.btnLayout.addWidget(self.secondVM) self.btnLayout.addWidget(self.thirdVM) self.btnLayout.addStretch() self.btnLayout.addSpacing(10) self.btnLayout.addWidget(self.slider) self.btnLayout.setSpacing(10) self.btnLayout.setMargin(10) self.setLayout(self.btnLayout) def setTableWidgetStyle(self): #self.vmTableWidget.setColumnCount(3) #self.vmTableWidget.setRowCount(1) self.vmTableWidget.setFrameShape(QFrame.NoFrame) self.vmTableWidget.setEditTriggers(QTableWidget.NoEditTriggers)#不能编辑 self.vmTableWidget.setSelectionMode(QAbstractItemView.NoSelection) self.vmTableWidget.verticalHeader().setVisible(False)#设置垂直头不可见 self.vmTableWidget.horizontalHeader().setVisible(False)#设置垂直头不可见 self.vmTableWidget.setShowGrid(False) self.vmTableWidget.setFocusPolicy(Qt.NoFocus) self.vmTableWidget.setStyleSheet("QTableWidget{background-color: rgb(235, 235, 235,0);}") def getVmList(self): vmList = [] vmInfo = {} vmInfo["name"] = "15615123021654541" vmInfo["status"] = "offline" vmInfo["name"] = "offline" vmInfo["os_distro"] = "windows_7" vmInfo1 = {} vmInfo1["name"] = "1561545421654541" vmInfo1["status"] = "offline" vmInfo1["name"] = "offline" vmInfo2 = {} vmInfo2["name"] = "1561afew21654541" vmInfo2["status"] = "offline" vmInfo2["name"] = "windows_7" vmInfo3 = {} vmInfo3["name"] = "afewfdsafewfa" vmInfo3["status"] = "offline" vmInfo3["name"] = "windows_7" vmList.append(vmInfo) vmList.append(vmInfo1) vmList.append(vmInfo2) vmList.append(vmInfo3) vmList.append(vmInfo1) vmList.append(vmInfo2) vmList.append(vmInfo3) return vmList def postStatusToServer(self): '''serverState = VMInfoManager.instance().getCurCloudServerState() if serverState != "enable": return''' postInfo = {} state = self.domainManager.getStatus() if self.vmOffInfoList == [] or len(self.downloadingList) != 0: #self.processMap.clear() #self.threadMap.clear() return if len(state) == 0: postInfo["state"] = "shutdown" postInfo["vmname"] = self.vmOffInfoList[0]["vmname"] else: for item in state: postInfo["state"] = "running" if state[item].has_key("disk_io"): postInfo["io_throughput"] = state[item]["disk_io"] if state[item].has_key("max_disk_io"): postInfo["io_throughput_peak"] = state[item]["max_disk_io"] if state[item].has_key("net_io"): postInfo["net_throughput"] = state[item]["net_io"] if state[item].has_key("max_net_io"): postInfo["net_throughput_peak"] = state[item]["max_net_io"] if state[item].has_key("memory_size"): postInfo["memory"] = state[item]["memory_size"]*1024 if state[item].has_key("vmname"): postInfo["vmname"] = state[item]["vmname"] if state[item].has_key("name"): postInfo["coursename"] = state[item]["name"] if state[item].has_key("cpu"): postInfo["cpu_utilization"] = state[item]["cpu"] self.emit(SIGNAL("vmstateinfo"),postInfo) def showVmList(self): subWidget = QWidget() if self.vmstatusTimer.isActive(): pass else: #if globalvariable.CLASS_STATUS: self.vmstatusTimer.start(7000) #self.connect(self.vmstatusTimer, SIGNAL("timeout()"),self.postStatusToServer) if self.scrollArea.widget(): self.scrollArea.takeWidget() self.vmTableWidget = QTableWidget() self.setTableWidgetStyle() #if self.vmTableWidget self.vmTableWidget.clear() #self.vmInfoList = self.getVmList() num = len(self.vmInfoList) columnCount = 1 rowCount = 1 if num == 0: return if num <=3: #self.scrollArea.verticalScrollBar().hide() rowCount = 1 if num == 1: columnCount = 1 elif num == 2: columnCount = 2 elif num == 3: columnCount = 3 else: rowCount = num/3 rest = num%3 if (rowCount == 2 and rest == 0) or rowCount == 1 : pass if rest > 0: rowCount+=1 columnCount = 3 parentWidth = self.parent.width() resolutionValue = StoreInfoParser.instance().getResolutionValue() if resolutionValue: if len(resolutionValue.split("x")) >= 2: parentWidth = int(resolutionValue.split("x")[0])*5/9.0 ratio = parentWidth/800.0 tableWidth = (parentWidth - 20*2 -50*2*ratio)/3 + 5 if len(self.vmInfoList) > 3: tableWidth = (parentWidth - 20*2 -50*2*ratio)/3 - 20*(1 - ratio) + 5 self.vmTableWidget.setColumnCount(columnCount) self.vmTableWidget.setRowCount(rowCount) self.vmTableWidget.setFixedWidth(parentWidth-100) self.vmTableWidget.setFixedHeight((tableWidth+10)*rowCount) self.vmTableWidget.verticalHeader().setDefaultSectionSize(tableWidth+10) self.vmTableWidget.horizontalHeader().setDefaultSectionSize((parentWidth-100)/columnCount) #self.setWidget("status") if columnCount <= 3 and rowCount == 1: for i in range(columnCount): self.setRowColumnWidget(0,i,self.vmInfoList[i]["name"]) else: for i in range(rowCount): for j in range(3): if i*3 + j <= num-1: self.setRowColumnWidget(i, j, self.vmInfoList[i*3+j]["name"]) mainLayout = QHBoxLayout() mainLayout.setMargin(0) mainLayout.addWidget(self.vmTableWidget) subWidget.setLayout(mainLayout) #if self.scrollArea.widget(): #self.scrollArea.takeWidget() self.scrollArea.setWidget(subWidget) self.scrollArea.setWidgetResizable(True) #self.scrollArea.horizontalScrollBar().hide() def setRowColumnWidget(self,row,column,vmid): status = "sfw" #self.vmTableWidget.clear() mainWidget = QWidget() #self.vmTableWidget.hideColumn() #vmRowButtonList = [] parentWidth = self.parent.width() resolutionValue = StoreInfoParser.instance().getResolutionValue() if resolutionValue: if len(resolutionValue.split("x")) >= 2: parentWidth = int(resolutionValue.split("x")[0])*5/9.0 ratio = parentWidth/800.0 vmWidth = (parentWidth - 20*2 -50*2*ratio)/3 if len(self.vmInfoList) > 3: vmWidth = (parentWidth - 20*2 -50*2*ratio)/3 - 20*(1 - ratio) vmButton = CustomVMButton() vmButton.setFixedSize(QSize(vmWidth, vmWidth + 5)) vmButton.setIconSize(QSize(vmWidth - 60*ratio,vmWidth - 30*ratio)) vmButton.setText(self.vmInfoList[row*3 + column]["name"]) vmButton.setFlat(True) vmButton.setFont(QFont("Times", 15, QFont.Bold)) vmInfo = self.vmInfoList[row*3 + column] vmButton.setVMInfo(vmInfo) imageName = "other.png" if self.vmInfoList[row*3 + column].has_key("os_distro"): if common.imageMap.has_key(self.vmInfoList[row*3 + column]["os_distro"]): imageName = common.imageMap[self.vmInfoList[row*3 + column]["os_distro"]] else: LogRecord.instance().logger.info(u'common.imageMap中未找到键值%s' % self.vmInfoList[row*3 + column]["os_distro"]) vmButton.setIcon(QIcon("images/systemImage/%s" % imageName)) # if globalvariable.CLASS_STATUS and not globalvariable.TICHU_STATUS: # self.connect(vmButton, SIGNAL("clicked()"),self.slotOpenVMLesson) # self.connect(vmButton, SIGNAL("controlvm"),self.slotControlVM) # else: # self.connect(vmButton, SIGNAL("clicked()"),self.slotCreateVMLesson) #vmRowButtonList.append(vmButton) self.vmButtonList.append(vmButton) #firMybutton.setStatus("undownload") vmButton.setObjectName(vmid + ":" + QString.number(row) + ":" + QString.number(column)) self.connect(vmButton, SIGNAL("clicked()"),self.startDomain) progressBar = WidgetProgress() progressBar.setFixedSize(vmWidth, vmWidth + 5) #progressBar.progressBar.setValue(0) progressBar.setVmName(self.vmInfoList[row*3 + column]["name"]) progressBar.setObjectName(vmid + ":" + QString.number(row) + ":" + QString.number(column)) #progressBar.objectName() #self.firMybutton.setText(self.tr("确萨")) #progressBar = QProgressBar() myLayout = QHBoxLayout() myLayout.setMargin(0) myLayout.addStretch() myLayout.addWidget(vmButton) myLayout.addWidget(progressBar) myLayout.addStretch() if vmid in self.downloadingList: vmButton.hide() else: progressBar.hide() #firMybutton.hide() mainWidget.setLayout(myLayout) self.vmTableWidget.setCellWidget(row, column, mainWidget) #self.mainLayout.addWidget(mainWidget) def setVMInfoList(self, vmInfoList, vmOffInfoList): self.oldVmInfoList = LocalImgManager.instance().getCompleteList() self.vmInfoList = vmInfoList self.vmOffInfoList = vmOffInfoList self.domainManager.deleteImgList(vmOffInfoList) # needDeleteList = self.compareDelete(self.oldVmInfoList, vmOffInfoList) if self.vmOffInfoList == []: #self.progressMonitor.stop() #self.threadMap.clear() for item in self.processMap: self.processMap[item].stop() if self.processMap[item].isRunning(): self.processMap[item].exit() for item in self.threadMap: if self.threadMap[item].isRunning(): self.threadMap[item].exit() self.processMap.clear() self.threadMap.clear() #self.killRsyncThread() # if len(needDeleteList) == 0: # return # else: # self.domainManager.deleteImgList(needDeleteList) def stopAllDownload(self): for item in self.processMap: self.processMap[item].stop() if self.processMap[item].isRunning(): self.processMap[item].exit() self.killScpThread() for item in self.threadMap: #self.threadMap[item].stop() if self.threadMap[item].isRunning(): self.threadMap[item].exit() self.downloadingList = [] self.processMap.clear() self.threadMap.clear() def killScpThread(self): pidList = self.getScpsProcessId() #sshPidList = self.getSshProcessId() for item in pidList: self.killVmId(item) '''for mtem in sshPidList: self.killVmId(mtem)''' def killVmId(self,killid): cmd = "kill -9 " + killid os.system(str(cmd)) def getScpsProcessId(self):#得到运行虚拟机的进程号序列,可用于关闭某个虚拟机 idList = [] cmd = "ps aux | grep scp" output = "" statusOutput = [] statusOutput = commands.getstatusoutput(cmd) if statusOutput[0] == 0: output = statusOutput[1] else: output = "" result = output.split("\n") for i in range(len(result)): if QString(result[i]).contains("scp"): idList.append(QString(result[i]).simplified().split(" ")[1]) return idList def getSshProcessId(self):#得到运行虚拟机的进程号序列,可用于关闭某个虚拟机 idList = [] cmd = "ps aux | grep /usr/bin/ssh" output = "" statusOutput = [] statusOutput = commands.getstatusoutput(cmd) if statusOutput[0] == 0: output = statusOutput[1] else: output = "" result = output.split("\n") for i in range(len(result)): if QString(result[i]).contains("/usr/bin/ssh"): idList.append(QString(result[i]).simplified().split(" ")[1]) return idList def compareDelete(self,oldList,newList): nameList = [] deleteList = [] for item in newList: nameList.append(item["name"]) for name in oldList: if name not in nameList: deleteList.append(name) return deleteList def autoStartDownload(self): #return num = len(self.vmInfoList) if num == 0: return else: #self.progressMonitor.setVmInfoList(self.vmInfoList) #self.progressMonitor.start() #self.connect(self.progressMonitor, SIGNAL("downloadover"),self.slotDownloadOver) imgMap = LocalImgManager.instance().getCompliteListSize() for i in range(len(self.vmInfoList)): mark = 0 for item in imgMap: if item == self.vmInfoList[i]["name"] and imgMap[item] == self.vmInfoList[i]["img_file_size"]: mark = 1 if mark == 1: continue row = i/3 column = i%3 self.downloadingList.append(self.vmInfoList[i]["name"]) # self.downloadThread = DownloadThread() # self.progressThread = ProgressThread() threadid = self.vmInfoList[i]["name"] + ":" + QString.number(row) + ":" + QString.number(column) # self.downloadThread.setProcessId(threadid + ":" + QString.number(self.vmInfoList[i]["img_file_size"])) # self.progressThread.setProcessId(threadid + ":" + QString.number(self.vmInfoList[i]["img_file_size"])) # self.connect(self.progressThread, SIGNAL("currentprogress"),self.updateProgressBar) # self.connect(self.progressThread, SIGNAL("downloadover"),self.slotDownloadOver) # self.downloadThread.start() # self.progressThread.start() self.setRowColumnWidget(int(row), int(column), self.vmInfoList[i]["name"]) self.createThread(threadid,self.vmInfoList[i]) #time.sleep(1) #return self.startFirstThread() def startFirstThread(self): for item in self.threadMap: self.threadMap[item].start() self.processMap[item].start() self.connect(self.processMap[item], SIGNAL("currentprogress"),self.updateProgressBar) #self.connect(self.processMap[item], SIGNAL("downloadover"),self.slotDownloadOver) self.connect(self.threadMap[item], SIGNAL("downloadover"),self.slotDownloadOver) self.connect(self.threadMap[item], SIGNAL("downloaderror"),self.slotDownloadError) return def slotDownloadError(self,signalid): pass def createThread(self,threadid,vmInfo): if self.threadMap.has_key(threadid): if self.threadMap[threadid].isRunning(): self.threadMap[threadid].exit() self.threadMap.pop(threadid) if self.processMap.has_key(threadid): if self.processMap[threadid].isRunning(): self.processMap[threadid].exit() self.processMap.pop(threadid) downloadThread = DownloadThread() progressThread = ProgressThread() self.threadMap[threadid] = downloadThread self.processMap[threadid] = progressThread self.threadMap[threadid].setProcessId(threadid + ":" + str(vmInfo["img_file_size"])) self.processMap[threadid].setProcessId(threadid + ":" + str(vmInfo["img_file_size"])) #self.threadMap[threadid].start() #self.processMap[threadid].start() #self.connect(self.processMap[threadid], SIGNAL("currentprogress"),self.updateProgressBar) #self.connect(self.processMap[threadid], SIGNAL("downloadover"),self.slotDownloadOver) def checkAddDownload(self): #return num = len(self.vmInfoList) #existImgList = LocalImgManager.instance().getCompleteList() existImgList = LocalImgManager.instance().getCompliteListSize() if num == 0: return else: count = 0 for i in range(len(self.vmInfoList)): row = i/3 column = i%3 if existImgList.has_key(self.vmInfoList[i]["name"]) and existImgList.get(self.vmInfoList[i]["name"]) == self.vmInfoList[i]["img_file_size"]: pass elif self.vmInfoList[i]["name"] in self.downloadingList: pass elif existImgList.has_key(self.vmInfoList[i]["name"]) and self.domainManager.getDom() != None and self.startVmInfo != None and self.startVmInfo == self.domainManager.getDomainInfo(): pass else: if self.vmInfoList[i]["name"] not in self.downloadingList: self.downloadingList.append(self.vmInfoList[i]["name"]) threadid = self.vmInfoList[i]["name"] + ":" + QString.number(row) + ":" + QString.number(column) self.createThread(threadid, self.vmInfoList[i]) self.setRowColumnWidget(int(row), int(column), self.vmInfoList[i]["name"]) count+= 1 if len(self.threadMap) == count: self.startFirstThread() if count > 0: self.emit(SIGNAL("startadddownload")) def startDomain(self): pbp = CustomVMButton().sender() buttonName = pbp.objectName() vmInfo = pbp.vmInfo for item in self.vmOffInfoList: if item["name"] == vmInfo["name"]: self.startVmInfo = item #return vmid = buttonName.split(":")[0] row = buttonName.split(":")[1] column = buttonName.split(":")[2] self.domainManager.setDomainInfo(self.startVmInfo) LogRecord.instance().logger.info(u"开始开启虚拟机-----------------------------------------------00") self.domainManager.startDomainByName() LogRecord.instance().logger.info(u"结束开启虚拟机-----------------------------------------------11") def updateProgressBar(self,count,objectname): #if self.threadMap[objectname].isRunning(): # for i in range(len(self.downloadingList)): # if objectname == self.downloadingList[i]: # progress=self.vmTableWidget.findChild((WidgetProgress, ),objectname) # progress.progressBar.setValue(count) progress=self.vmTableWidget.findChild((WidgetProgress, ),objectname) if not progress: return progress.progressBar.setValue(count) def slotDownloadOver(self,count,name): serverState = VMInfoManager.instance().getCurCloudServerState() if serverState != "enable": return if self.processMap.has_key(name): self.processMap[name].stop() #self.processMap.pop(name) #self.threadMap.pop(name) vmid = name.split(":")[0] row = name.split(":")[1] column = name.split(":")[2] self.downloadingList = [] self.setRowColumnWidget(int(row), int(column), vmid) time.sleep(4) if self.processMap.has_key(name) and self.processMap[name].isRunning: self.processMap[name].exit() if self.threadMap.has_key(name) and self.threadMap[name].isRunning: self.threadMap[name].exit() self.processMap.pop(name) self.threadMap.pop(name) self.emit(SIGNAL("avmdownloadover")) # for item in self.threadMap: # self.threadMap[item].start() # self.processMap[item].start() # self.connect(self.processMap[item], SIGNAL("currentprogress"),self.updateProgressBar) # self.connect(self.processMap[item], SIGNAL("downloadover"),self.slotDownloadOver) # return def getDownloadingList(self): return self.downloadingList def updateVMList(self): language = StoreInfoParser.instance().getLanguage() m_pTranslator = QTranslator() exePath = "./" if language == "chinese": QmName = "zh_CN.qm" StoreInfoParser.instance().setLanguage("chinese") else: QmName = "en_US.qm" if(m_pTranslator.load(QmName, exePath)): QCoreApplication.instance().installTranslator(m_pTranslator) if self.vmstatusTimer.isActive(): self.vmstatusTimer.stop() else: pass subWidget = QWidget() vmNum = len(self.vmInfoList) rowNum = 0 subMainLayout = QVBoxLayout() subMainLayout.setMargin(0) #subMainLayout.addStretch() #subMainLayout.addSpacing(10) #subMainLayout.setSpacing(10) self.vmButtonList = [] if vmNum % 3 != 0: rowNum = vmNum / 3 + 1 else: rowNum = vmNum / 3 for i in range(rowNum): indexEnd = 3 if i == rowNum - 1: indexEnd = vmNum - (i*3) parentWidth = self.parent.width() resolutionValue = StoreInfoParser.instance().getResolutionValue() if resolutionValue: if len(resolutionValue.split("x")) >= 2: parentWidth = int(resolutionValue.split("x")[0])*5/9.0 ratio = parentWidth/800.0 vmWidth = (parentWidth - 20*2 -50*2*ratio)/3 if vmNum > 3: vmWidth = (parentWidth - 20*2 -50*2*ratio)/3 - 20*(1 - ratio) vmRowButtonList = [] for j in range(indexEnd): vmButton = CustomVMButton(self) vmButton.setFixedSize(QSize(vmWidth, vmWidth + 5)) vmButton.setIconSize(QSize(vmWidth - 60*ratio,vmWidth - 30*ratio)) vmButton.setText(self.vmInfoList[i*3 + j]["name"]) vmButton.setToolTip(self.tr("course: ") + self.vmInfoList[i*3 + j]["name"]) vmButton.setStyleSheet(u"QToolTip{border-radius:5px;background-color:white;color:black;font-size:20px;font-family:微软雅黑;}") vmButton.setFlat(True) vmButton.setFont(QFont("Times", 15, QFont.Bold)) vmInfo = self.vmInfoList[i*3 + j] vmButton.setVMInfo(vmInfo) imageName = "other.png" if self.vmInfoList[i*3 + j].has_key("os_distro"): if common.imageMap.has_key(self.vmInfoList[i*3 + j]["os_distro"]): imageName = common.imageMap[self.vmInfoList[i*3 + j]["os_distro"]] else: LogRecord.instance().logger.info(u'common.imageMap中未找到键值%s' % self.vmInfoList[i*3 + j]["os_distro"]) vmButton.setIcon(QIcon("images/systemImage/%s" % imageName)) if globalvariable.CLASS_STATUS and not globalvariable.TICHU_STATUS: self.connect(vmButton, SIGNAL("clicked()"),self.slotOpenVMLesson) self.connect(vmButton, SIGNAL("controlvm"),self.slotControlVM) else: self.connect(vmButton, SIGNAL("clicked()"),self.slotCreateVMLesson) vmRowButtonList.append(vmButton) self.vmButtonList.append(vmButton) btnLayout = QHBoxLayout() if vmNum > 3: btnLayout.setSpacing(10) #btnLayout.setMargin(10) btnLayout.addSpacing(30) for vmbtn in vmRowButtonList: btnLayout.addWidget(vmbtn) btnLayout.addStretch() subMainLayout.addLayout(btnLayout) #subMainLayout.addStretch() subWidget.setLayout(subMainLayout) if self.scrollArea.widget(): self.scrollArea.takeWidget() self.scrollArea.setWidgetResizable(False) self.scrollArea.setWidget(subWidget) def startVM(self): return def autoOpenVMLesson(self, vmName, allflag = False): LogRecord.instance().logger.info(u'自动打开相应的虚拟机') if self.vmButtonList: vmInfo = self.vmButtonList[0].getVMInfo() VMOperation.instance().setCurrentVMInfo(vmInfo) #thread.start_new_thread(VMOperation.instance().openVM,()) if allflag == True: if VMOperation.instance().openVM(): LogRecord.instance().logger.info(u'start the lesson') else: if VMOperation.instance().openVM(): LogRecord.instance().logger.info(u'start the lesson') else: LogRecord.instance().logger.info(u'未监测到虚拟机%s的信息' % vmName) def autoOpenOffVMLesson(self): LogRecord.instance().logger.info(u'自动打开相应的虚拟机') if len(self.vmInfoList) == 1: if self.vmInfoList[0]["name"] in self.downloadingList: return else: self.startVmInfo = self.vmInfoList[0] self.domainManager.setDomainInfo(self.startVmInfo) self.domainManager.startDomainByName() else: return def checkDownloadOver(self): if self.autoCourse in self.downloadingList: pass else: self.courseTimer.stop() #self.autoCourse = "" for item in self.vmOffInfoList: if self.autoCourse == item["name"]: vmInfo = item self.domainManager.setDomainInfo(vmInfo) self.domainManager.startDomainByName() return def autoOpenCourse(self,name,classid = None): LogRecord.instance().logger.info(u'自动打开相应的虚拟机') self.autoCourse = name if name in self.downloadingList: self.courseTimer = QTimer() self.courseTimer.start(1000) self.connect(self.courseTimer, SIGNAL("timeout()"),self.checkDownloadOver) else: for item in self.vmOffInfoList: if name == item["name"]: vmInfo = item if classid != None: vmInfo["classid"] = classid self.domainManager.setDomainInfo(vmInfo) self.domainManager.startDomainByName() return def slotCreateVMLesson(self): vmBtn = self.sender() if vmBtn: LogRecord.instance().logger.info(u'开始创建虚拟机') if globalvariable.VM_IS_CREATE_STATUS: LogRecord.instance().logger.info(u'重复点击!') return else: globalvariable.VM_IS_CREATE_STATUS = True LogRecord.instance().logger.info(u'准备获取虚拟机信息!') paramInfo = vmBtn.getVMInfo() LogRecord.instance().logger.info(u'准备获取虚拟机信息完成!') try: vmName = VMOperation.instance().createVMLesson(paramInfo) except: LogRecord.instance().logger.info(u'创建虚拟机异常.........!') LogRecord.instance().logger.info(u'得到创建的虚拟机信息!') if vmName: LogRecord.instance().logger.info(u'创建虚拟机%s成功' % vmName) vmInfo = NetworkManager.instance().getVMInfo(vmName) if vmInfo == None: globalvariable.VM_IS_CREATE_STATUS = False return if len(vmInfo) == 0: globalvariable.VM_IS_CREATE_STATUS = False return vmInfo[0]["vmname"] = vmInfo[0]["name"] if vmInfo: VMOperation.instance().setCurrentVMInfo(vmInfo[0]) if VMOperation.instance().openVM(True): #保存开启虚拟机的名称 #globalvariable.VM_IS_CREATE_STATUS = False WindowMonitor.instance().insertVmId(vmName) else: globalvariable.VM_IS_CREATE_STATUS = False #删除没有成功运行的虚拟机 if VMOperation.instance().removeVMLesson(vmName): LogRecord.instance().logger.info(u"删除后台相应的虚拟机成功") else: LogRecord.instance().logger.info(u'未查询到相应的虚拟机:%s' % vmName) globalvariable.VM_IS_CREATE_STATUS = False else: LogRecord.instance().logger.info(u'创建虚拟机失败') globalvariable.VM_IS_CREATE_STATUS = False #刷新虚拟机界面 self.emit(SIGNAL("refreshVMS")) def slotControlVM(self, action): vmBtn = self.sender() if vmBtn: vmInfo = vmBtn.getVMInfo() VMOperation.instance().setCurrentVMInfo(vmInfo) VMOperation.instance().controlVM(action) vmInfos = globalvariable.VM_INFO self.setVMInfoList(vmInfos,[]) self.updateVMList() def slotOpenVMLesson(self): #vmInfo = [] vmBtn = self.sender() if vmBtn: btnVMInfo = vmBtn.getVMInfo() VMOperation.instance().setCurrentVMInfo(btnVMInfo) VMOperation.instance().openVM(True) # if globalvariable.CLASS_STATUS: # vmInfo = globalvariable.VM_INFO # else: # vmInfo = VMInfoManager.instance().getLessonListInfo() # #self.setVMInfoList(vmInfo,[]) #self.updateVMList() #slider def setSliderMaxValue(self, value): """设在滑动条的最大值""" maxValue = 1 if value % 3 == 0: maxValue = (value / 3) else: maxValue = (value / 3 + 1) maxValue = maxValue - 1 self.slider.setMinimum(1) self.slider.setMaximum(maxValue*3) self.slider.setValue(self.slider.maximum()) self.currentIndex = maxValue self.maxValue = maxValue self.updateVMList() def paintEvent(self,event): if common.SCROLL_TYPE == "slider": self.setNodeSize(QSize(self.geometry().width()*4/15,self.geometry().height()*4/9)) elif len(self.vmInfoList) <= 6: subWidget = self.scrollArea.widget() if subWidget != None: if len(self.vmInfoList) <= 3: subWidget.move((self.geometry().width() - subWidget.width())/2, (self.geometry().height() - subWidget.height())/2 - 20) else: subWidget.move((self.geometry().width() - subWidget.width())/2 - 15, (self.geometry().height() - subWidget.height())/2) QWidget.paintEvent(self, event) #slider def setNodeSize(self,size): self.btnLayout.setSpacing(size.width()/20) self.btnLayout.setMargin(size.width()*3/20) self.firstVM.setIconSize(size) self.secondVM.setIconSize(size) self.thirdVM.setIconSize(size) self.slider.resize(QSize(self.slider.frameGeometry().width(),self.height()-100)) def wheelEvent(self,event): """鼠标滚轮滚动事件,显示对应的虚拟机""" if common.SCROLL_TYPE == "slider": if event.delta() < 0 and self.currentIndex > 0: self.currentIndex -= 1 self.updateVMListSlider() elif event.delta() > 0 and self.currentIndex < self.maxValue: self.currentIndex += 1 self.updateVMListSlider() self.slider.wheelEvent(event) else: maxValue = self.scrollArea.verticalScrollBar().maximum() minValue = self.scrollArea.verticalScrollBar().minimum() currentValue = self.scrollArea.verticalScrollBar().value() if event.delta() < 0 and currentValue < maxValue: self.scrollArea.wheelEvent(event) elif event.delta() > 0 and currentValue > minValue: self.scrollArea.wheelEvent(event) #slider def updateVMListSlider(self): """更新虚拟机列表""" for i in range(len(self.vmButtonList)): self.vmButtonList[i].hide() vmsInfoList = VMInfoManager.instance().getVMSInfo() if vmsInfoList: self.slider.show() startIndex = (self.maxValue - self.currentIndex) * 3 if startIndex/3 == (self.maxValue): endIndex = len(vmsInfoList) else: endIndex = startIndex + 3 for i in range(startIndex, endIndex): self.vmButtonList[i - startIndex].setText(vmsInfoList[i]) self.vmButtonList[i - startIndex].show() else: self.slider.hide() """ echo <graphics type='sdl display='$DISPLAY' xauth='$XAUTHORITY'/>
def create_table_widget(table, parent): formats = table.getColFormats() names = table.getColNames() indices_of_visible_columns = [j for (j, f) in enumerate(formats) if f is not None] headers = ["ok"] + [names[j] for j in indices_of_visible_columns] n_rows = len(table) widget = QTableWidget(n_rows, 1 + len(indices_of_visible_columns), parent=parent) widget.setHorizontalHeaderLabels(headers) widget.setMinimumSize(200, 200) widget.horizontalHeader().setResizeMode(QHeaderView.Interactive) for i, row in enumerate(table.rows): item = QTableWidgetItem() item.setCheckState(Qt.Unchecked) item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsUserCheckable) widget.setItem(i, 0, item) for j0, j in enumerate(indices_of_visible_columns): value = row[j] formatter = table.colFormatters[j] item = QTableWidgetItem(formatter(value)) item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) widget.setItem(i, j0 + 1, item) return widget
def iconChooser(self): ' Choose a Icon and copy it to clipboard ' # from .std_icon_naming import std_icon_naming as a # prv = QDialog(self.dock) prv.setWindowFlags(Qt.FramelessWindowHint) prv.setAutoFillBackground(True) prv.setGeometry(self.fileView.geometry()) table = QTableWidget(prv) table.setColumnCount(1) table.setRowCount(len(a)) table.verticalHeader().setVisible(True) table.horizontalHeader().setVisible(False) table.setShowGrid(True) table.setIconSize(QSize(128, 128)) for index, icon in enumerate(a): item = QTableWidgetItem(QIcon.fromTheme(icon), '') # item.setData(Qt.UserRole, '') item.setToolTip(icon) table.setItem(index, 0, item) table.clicked.connect(lambda: QApplication.clipboard().setText( 'QtGui.QIcon.fromTheme("{}")'.format(table.currentItem().toolTip()))) table.doubleClicked.connect(prv.close) table.resizeColumnsToContents() table.resizeRowsToContents() QLabel('<h3> <br> 1 Click Copy, 2 Clicks Close </h3>', table) table.resize(prv.size()) prv.exec_()
def create_table_widget(table, parent): formats = table.getColFormats() names = table.getColNames() indices_of_visible_columns = [ j for (j, f) in enumerate(formats) if f is not None ] headers = ["ok"] + [names[j] for j in indices_of_visible_columns] n_rows = len(table) widget = QTableWidget(n_rows, 1 + len(indices_of_visible_columns), parent=parent) widget.setHorizontalHeaderLabels(headers) widget.setMinimumSize(200, 200) widget.horizontalHeader().setResizeMode(QHeaderView.Interactive) for i, row in enumerate(table.rows): item = QTableWidgetItem() item.setCheckState(Qt.Unchecked) item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsUserCheckable) widget.setItem(i, 0, item) for j0, j in enumerate(indices_of_visible_columns): value = row[j] formatter = table.colFormatters[j] item = QTableWidgetItem(formatter(value)) item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) widget.setItem(i, j0 + 1, item) return widget
class FindHandleDialog(QDialog): def __init__(self, model, parent): super().__init__(parent) self.model = model self.setModal(False) self.setAttribute(Qt.WA_DeleteOnClose) # QDialogs at least in GNOME do not have a close button by default self.setWindowFlags(Qt.Window | Qt.WindowSystemMenuHint | Qt.WindowCloseButtonHint) self.setWindowTitle('Linux Process Explorer Search') self.setGeometry(0, 0, 900, 500) self.move((parent.width() - self.width()) / 2 + parent.x(), (parent.height() - self.height()) / 2 + parent.y()) lblSearch = QLabel('Descriptor or Lib substring:') self.txtSearch = QLineEdit() btnSearch = QPushButton('&Search') btnSearch.clicked.connect(self.onBtnSearchClicked) btnCancel = QPushButton('&Cancel') searchLayout = QHBoxLayout() searchLayout.addWidget(lblSearch) searchLayout.addWidget(self.txtSearch) searchLayout.addWidget(btnSearch) searchLayout.addWidget(btnCancel) self.tblResults = QTableWidget(0, 4) self.tblResults.setHorizontalHeaderLabels(('Process', 'PID', 'Type', 'Name')) self.tblResults.horizontalHeader().setStretchLastSection(True) self.tblResults.verticalHeader().setVisible(False) self.tblResults.setShowGrid(False) self.tblResults.setSelectionBehavior(QTableWidget.SelectRows) self.tblResults.verticalHeader().setDefaultSectionSize(24) mainLayout = QVBoxLayout() mainLayout.addLayout(searchLayout) mainLayout.addWidget(self.tblResults) self.setLayout(mainLayout) @pyqtSlot(bool) def onBtnSearchClicked(self, checked=False): handleSubstr = self.txtSearch.text() if handleSubstr: results = self.model.findHandlesBySubstr(handleSubstr) self.tblResults.setRowCount(len(results)) for row, res in enumerate(results): for col, prop in enumerate(res): item = QTableWidgetItem(str(prop)) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.tblResults.setItem(row, col, item) def keyPressEvent(self, event): if event.key() == Qt.Key_Enter and self.txtSearch.hasFocus(): self.onBtnSearchClicked() return super().keyPressEvent(event)
class AccountManagerDialog(QDialog): def __init__(self, emails, types, parent): self.emails, self.types = emails, types QDialog.__init__(self, parent) self.resize(560, 350) self.gridLayout = QGridLayout(self) self.tableWidget = QTableWidget(0, 2, self) self.tableWidget.setAlternatingRowColors(True) self.tableWidget.setSelectionBehavior(1) # Rows self.tableWidget.setSelectionMode(1) # Single self.tableWidget.horizontalHeader().setResizeMode(0, 1) # 1 = Stretch self.tableWidget.setHorizontalHeaderLabels(['Email', 'Type']) self.addBtn = QPushButton('+', self) self.removeBtn = QPushButton('-', self) self.closeBtn = QPushButton('Close', self) self.spacer = QWidget(self) self.spacer.setSizePolicy(1 | 2 | 4, 1 | 4) self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 4) self.gridLayout.addWidget(self.addBtn, 1, 0, 1, 1) self.gridLayout.addWidget(self.removeBtn, 1, 1, 1, 1) self.gridLayout.addWidget(self.spacer, 1, 2, 1, 1) self.gridLayout.addWidget(self.closeBtn, 1, 3, 1, 1) self.addBtn.clicked.connect(self.addAccount) self.removeBtn.clicked.connect(self.removeAccount) self.closeBtn.clicked.connect(self.accept) for i in range(len(self.emails)): self.tableWidget.insertRow(i) self.tableWidget.setItem(i, 0, QTableWidgetItem(emails[i])) self.tableWidget.setItem(i, 1, QTableWidgetItem(types[i])) def addAccount(self): dialog = AddAccountDialog(self) if dialog.exec_() != QDialog.Accepted: return email = unicode(dialog.emailEdit.text()) passwd = unicode(dialog.passwordEdit.text()) ac_type = unicode(dialog.typeCombo.currentText()) self.tableWidget.insertRow(0) self.tableWidget.setItem(0, 0, QTableWidgetItem(email)) self.tableWidget.setItem(0, 1, QTableWidgetItem(ac_type)) self.emails.insert(0, email) self.types.insert(0, ac_type) kr = Keyring() kr.setPassword(email, passwd) def removeAccount(self): row = self.tableWidget.selectionModel().selectedRows()[0].row() email = self.tableWidget.item(row, 0).text() kr = Keyring() kr.deletePassword(email) self.tableWidget.removeRow(row) self.emails.pop(row) self.types.pop(row)
class FoldableTable(QFrame): def __init__(self, parent = None): QFrame.__init__(self, parent) self.setFrameStyle(QFrame.Box | QFrame.Raised); self.setupWidget() self.folded = False self.connect(self.folding_button, SIGNAL("clicked()"), self.toggleVisible) self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) def setupWidget(self): self.plus_icon = QIcon() self.plus_icon.addPixmap(QPixmap(":/icons/add.png")) self.minus_icon = QIcon() self.minus_icon.addPixmap(QPixmap(":/icons/moins.png")) self.layout = QGridLayout(self) self.folding_button = QPushButton(self.minus_icon, "", self) self.folding_button.setMaximumSize(QSize(30,30)) self.layout.addWidget(self.folding_button, 0, 0) self.label = QLabel("") self.layout.addWidget(self.label, 0, 1) self.table = QTableWidget(self) self.layout.addWidget(self.table, 1, 1) self.table.horizontalHeader().setStretchLastSection(1) self.font = self.label.font() self.font.setBold(True) self.font.setPointSize(self.font.pointSize() * 1.5) self.label.setFont(self.font) ## resize table to contents ## set column stretch to ensure first column won't expand when table ## is hidden self.layout.setColumnStretch(1, 10) def toggleVisible(self): self.folded = not self.folded if self.folded: self.folding_button.setIcon(self.plus_icon) self.table.hide() else: self.folding_button.setIcon(self.minus_icon) self.table.show() def setLabel(self, text): self.label.setText(text)
def __init__(self, parent=None, vertical_header=list(), horizontal_header=list(), data=list()): super(Table, self).__init__(parent) layout = QHBoxLayout() resultTable = QTableWidget() resultTable.setRowCount(len(vertical_header)) resultTable.setColumnCount(len(horizontal_header)) resultTable.setHorizontalHeaderLabels(horizontal_header) resultTable.setVerticalHeaderLabels(vertical_header) resultTable.horizontalHeader().setResizeMode(1) resultTable.verticalHeader().setResizeMode(1) resultTable.setEditTriggers(QAbstractItemView.NoEditTriggers) for x, row in enumerate(data): for y, item in enumerate(row): resultTable.setItem(x, y, QTableWidgetItem(str(item))) self.table = resultTable layout.addWidget(self.table) self.setLayout(layout) self.setMinimumWidth(min(len(horizontal_header) * 250, 800)) self.setMinimumHeight(min(len(vertical_header) * 70, 800)) self.setWindowTitle("Report result")
def build_preview(self): data = self.t.light_parser(self.node) self.layout.addWidget(QLabel("File name : " + data['File'])) tmp_widget = QWidget() tmp_layout = QHBoxLayout(tmp_widget) tmp_layout.addWidget(QLabel("Oldest chunk : " + data['Oldest'])) tmp_layout.addWidget(QLabel("Current chunk : " + data['Current'])) tmp_layout.addWidget(QLabel("Next record : " + data['Next'])) tmp_layout.addWidget( QLabel("Version : " + data['Maj'] + "." + data['Min'])) tmp_layout.addWidget(QLabel("Chunk number : " + data['chunk_nb'])) self.layout.addWidget(tmp_widget) data_list = QTableWidget() data_list.setColumnCount(4) data_list.setHorizontalHeaderLabels( ['Chunk number', 'First record', 'Last record', 'Offset']) data_list.horizontalHeader().setStretchLastSection(True) data_list.verticalHeader().hide() data_list.setSortingEnabled(False) data_list.setSelectionBehavior(QAbstractItemView.SelectRows) data_list.setEditTriggers(QAbstractItemView.NoEditTriggers) data_list.setRowCount(int(data['chunk_nb'])) for chunk_count in range(int(data['chunk_nb'])): rec = data[str(chunk_count)] data_list.setItem(chunk_count, 0, QTableWidgetItem(str(chunk_count))) data_list.setItem(chunk_count, 1, QTableWidgetItem(rec[0])) data_list.setItem(chunk_count, 2, QTableWidgetItem(rec[1])) data_list.setItem(chunk_count, 3, QTableWidgetItem(rec[2])) self.layout.addWidget(data_list)
def addWidgets(self): layout = QVBoxLayout() self.setLayout(layout) preamble = QLabel(self) layout.addWidget(preamble) self.preamble = preamble layout.addSpacing(10) table = QTableWidget(self) layout.addWidget(table) table.setShowGrid(False) table.setSelectionBehavior(QTableWidget.SelectRows) table.setSelectionMode(QTableWidget.SingleSelection) table.setMinimumWidth(400) table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) table.setColumnCount(4) table.hideColumn(0) table.setHorizontalHeaderLabels( ['ID', 'Vault', '# of Items', '# of Peers']) table.setFocusPolicy(Qt.NoFocus) table.itemSelectionChanged.connect(self.rowSelected) hhead = table.horizontalHeader() hhead.setResizeMode(QHeaderView.Stretch) hhead.setHighlightSections(False) vhead = table.verticalHeader() vhead.hide() self.table = table hbox = QHBoxLayout() layout.addLayout(hbox) button = QPushButton('Create Vault', self) button.clicked.connect(self.createVault) hbox.addWidget(button) button = QPushButton('Connect to Vault', self) backend = QApplication.instance().backend() available = backend.locator_is_available() if available: button.clicked.connect(self.connectVault) else: button.setEnabled(False) hbox.addWidget(button) removebtn = QPushButton('Remove Vault', self) removebtn.setEnabled(False) removebtn.clicked.connect(self.removeVault) self.removebtn = removebtn hbox.addWidget(removebtn)
def addWidgets(self): layout = QVBoxLayout() self.setLayout(layout) preamble = QLabel(self) layout.addWidget(preamble) self.preamble = preamble layout.addSpacing(10) table = QTableWidget(self) layout.addWidget(table) table.setShowGrid(False) table.setSelectionBehavior(QTableWidget.SelectRows) table.setSelectionMode(QTableWidget.SingleSelection) table.setMinimumWidth(400) table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) table.setColumnCount(4) table.hideColumn(0) table.setHorizontalHeaderLabels(['ID', 'Vault', '# of Items', '# of Peers']) table.setFocusPolicy(Qt.NoFocus) table.itemSelectionChanged.connect(self.rowSelected) hhead = table.horizontalHeader() hhead.setResizeMode(QHeaderView.Stretch) hhead.setHighlightSections(False) vhead = table.verticalHeader() vhead.hide() self.table = table hbox = QHBoxLayout() layout.addLayout(hbox) button = QPushButton('Create Vault', self) button.clicked.connect(self.createVault) hbox.addWidget(button) button = QPushButton('Connect to Vault', self) backend = QApplication.instance().backend() available = backend.locator_is_available() if available: button.clicked.connect(self.connectVault) else: button.setEnabled(False) hbox.addWidget(button) removebtn = QPushButton('Remove Vault', self) removebtn.setEnabled(False) removebtn.clicked.connect(self.removeVault) self.removebtn = removebtn hbox.addWidget(removebtn)
def addWidgets(self): layout = QVBoxLayout() self.setLayout(layout) preamble = QLabel(self) preamble.setWordWrap(True) layout.addWidget(preamble) self.preamble = preamble layout.addSpacing(10) table = QTableWidget(self) layout.addWidget(table) table.setShowGrid(False) table.setSelectionBehavior(QTableWidget.SelectRows) table.setSelectionMode(QTableWidget.SingleSelection) table.setMinimumWidth(400) table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) table.setColumnCount(4) table.hideColumn(0) table.setHorizontalHeaderLabels(['ID', 'Vault', 'Source', 'On Node']) table.setFocusPolicy(Qt.NoFocus) table.itemSelectionChanged.connect(self.rowSelected) hhead = table.horizontalHeader() hhead.setResizeMode(QHeaderView.Stretch) hhead.setHighlightSections(False) vhead = table.verticalHeader() vhead.hide() self.table = table hbox = QHBoxLayout() layout.addLayout(hbox) cancelbtn = QPushButton('Cancel', self) cancelbtn.clicked.connect(self.vaultmgr.hide) hbox.addWidget(cancelbtn) self.cancelbtn = cancelbtn connectbtn = QPushButton('Connect', self) connectbtn.setEnabled(False) connectbtn.clicked.connect(self.connectVault) hbox.addWidget(connectbtn) self.connectbtn = connectbtn hbox.addStretch(100)
def addWidgets(self): layout = QVBoxLayout() self.setLayout(layout) preamble = QLabel(self) preamble.setWordWrap(True) layout.addWidget(preamble) self.preamble = preamble layout.addSpacing(10) table = QTableWidget(self) layout.addWidget(table) table.setShowGrid(False) table.setSelectionBehavior(QTableWidget.SelectRows) table.setSelectionMode(QTableWidget.SingleSelection) table.setMinimumWidth(400) table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) table.setColumnCount(4) table.hideColumn(0) table.setHorizontalHeaderLabels(['ID', 'Vault', 'Source', 'On Node']) table.setFocusPolicy(Qt.NoFocus) table.itemSelectionChanged.connect(self.rowSelected) hhead = table.horizontalHeader() hhead.setResizeMode(QHeaderView.Stretch) hhead.setHighlightSections(False) vhead = table.verticalHeader(); vhead.hide() self.table = table hbox = QHBoxLayout() layout.addLayout(hbox) cancelbtn = QPushButton('Cancel', self) cancelbtn.clicked.connect(self.vaultmgr.hide) hbox.addWidget(cancelbtn) self.cancelbtn = cancelbtn connectbtn = QPushButton('Connect', self) connectbtn.setEnabled(False) connectbtn.clicked.connect(self.connectVault) hbox.addWidget(connectbtn) self.connectbtn = connectbtn hbox.addStretch(100)
class MainWidget(QMainWindow): def __init__(self, parent=None): super(MainWidget, self).__init__( parent, windowTitle='GithubRemote', windowIcon=QIcon(image_path('git.png')), geometry=QRect(300, 300, 600, 372)) self.repo_pixmap = QPixmap(image_path('book_16.png')) self.big_repo_pixmap = QPixmap(image_path('book_32.png')) self.repo_fork_pixmap = QPixmap(image_path('book_fork_16.png')) self.star_pixmap = QPixmap(image_path('star_16.png')) self.big_star_pixmap = QPixmap(image_path('star_32.png')) self.fork_pixmap = QPixmap(image_path('fork_16.png')) self.eye_pixmap = QPixmap(image_path('eye_16.png')) self.github = None # Actions self.repoAddAction = QAction( QIcon(image_path('plus_48.png')), '&Add Repo', self, statusTip='Add a new repo') self.repoAddAction.triggered.connect(self.repoAdd) self.repoRemoveAction = QAction( QIcon(image_path('minus.png')), '&Remove Repo', self, statusTip='Remove repo') self.repoRemoveAction.triggered.connect(self.repoRemove) self.repoRefreshAction = QAction( QIcon(image_path('refresh.png')), 'Refresh', self, statusTip='Refresh list of repos') self.repoRefreshAction.triggered.connect(self.reposRefresh) self.repoRefreshAction.triggered.connect(self.starsRefresh) self.addAccountAction = QAction( 'Add Account', self, statusTip='Add Account') self.addAccountAction.triggered.connect(self.addAccount) # userPushButton - Displays the current active username and # image on the top right of the toolbar. self.userButtonMenu = UserButtonMenu(32,32) # ToolBar self.toolBar = self.addToolBar('Main') self.toolBar.setMovable(False) self.toolBar.setFloatable(False) spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.toolBar.addAction(self.repoAddAction) self.toolBar.addAction(self.repoRemoveAction) self.toolBar.addAction(self.repoRefreshAction) self.toolBar.addWidget(spacer) self.toolBar.addWidget(self.userButtonMenu) # Menu menuBar = self.menuBar() fileMenu = menuBar.addMenu('&File') actionMenu = menuBar.addMenu('&Action') fileMenu.addAction(self.addAccountAction) actionMenu.addAction(self.repoAddAction) actionMenu.addAction(self.repoRemoveAction) actionMenu.addAction(self.repoRefreshAction) # StatusBar statusBar = self.statusBar() self.setStatusBar(statusBar) # reposTableWidget - Displays a list of the users repositories self.reposTableWidget = QTableWidget(0, 5, selectionBehavior = QAbstractItemView.SelectRows, selectionMode = QAbstractItemView.SingleSelection, editTriggers = QAbstractItemView.NoEditTriggers, itemSelectionChanged = self.actionsUpdate) self.reposTableWidget.horizontalHeader().setResizeMode( QHeaderView.ResizeToContents) self.reposTableWidget.horizontalHeader().setResizeMode(1, QHeaderView.Stretch) self.reposTableWidget.horizontalHeader().setVisible(False) self.reposTableWidget.verticalHeader().setVisible(False) self.reposTableWidget.setShowGrid(False) self.reposTableWidget.verticalHeader().setMinimumSectionSize(25) # repoTab - Layout reposTab = QWidget() reposTabLayout = QVBoxLayout(reposTab) reposTabLayout.addWidget(self.reposTableWidget) reposTab.setLayout(reposTabLayout) # starsTableWidget - Displays a list of the users repositories self.starsTableWidget = QTableWidget(0, 5, selectionBehavior = QAbstractItemView.SelectRows, selectionMode = QAbstractItemView.SingleSelection, editTriggers = QAbstractItemView.NoEditTriggers, itemSelectionChanged = self.actionsUpdate) self.starsTableWidget.horizontalHeader().setResizeMode( QHeaderView.ResizeToContents) self.starsTableWidget.horizontalHeader().setResizeMode(1, QHeaderView.Stretch) self.starsTableWidget.horizontalHeader().setVisible(False) self.starsTableWidget.verticalHeader().setVisible(False) self.starsTableWidget.setShowGrid(False) self.starsTableWidget.verticalHeader().setMinimumSectionSize(25) # repoTab - Layout starsTab = QWidget() starsTabLayout = QVBoxLayout(starsTab) starsTabLayout.addWidget(self.starsTableWidget) starsTab.setLayout(starsTabLayout) # Tab Widget self.tabs = QTabWidget() self.tabs.setTabBar(FlippedTabBar(self)) self.tabs.addTab(reposTab, QIcon(self.big_repo_pixmap), "repos") self.tabs.addTab(starsTab, QIcon(self.big_star_pixmap), "stars") self.tabs.setTabPosition(QTabWidget.West) # Layout self.setCentralWidget(self.tabs) self.actionsUpdate() self.show() # Update self.loadUserMenu() if self.activeUserAction: self.activeUserAction.setVisible(False) self.authenticate() self.actionsUpdate() self.reposRefresh() self.starsRefresh() self.updateImage() @waiting_effects def updateImage(self): try: url = self.github.get_user().avatar_url except (GithubException, AttributeError): return data = urllib.urlopen(url).read() pixmap = QPixmap() pixmap.loadFromData(data) self.activeUserAction.setIcon(QIcon(pixmap)) self.userButtonMenu.setPixmap(pixmap) self.userButtonMenu.setText(self.github.get_user().login) @waiting_effects def loadUserMenu(self): action = None for _, username, token in generate_tokens(CONFIG_PATH, 'github'): try: url = Github(token).get_user().avatar_url except (GithubException, AttributeError): action = QAction(username, self, triggered=self.changeActive) self.userButtonMenu.addAction(action) continue data = urllib.urlopen(url).read() pixmap = QPixmap() pixmap.loadFromData(data) action = QAction(QIcon(pixmap), username, self, triggered=self.changeActive) action.setIconVisibleInMenu(True) self.userButtonMenu.addAction(action) self.activeUserAction = action def changeActive(self): sender = self.sender() self.activeUserAction.setVisible(True) self.activeUserAction = sender self.activeUserAction.setVisible(False) self.authenticate() self.actionsUpdate() self.reposRefresh() self.starsRefresh() self.updateImage() @waiting_effects def reposRefresh(self): self.reposTableWidget.clearContents() try: repos = self.github.get_user().get_repos() self.reposTableWidget.setRowCount(self.github.get_user().public_repos) except (GithubException, AttributeError): return for row, repo in enumerate(repos): imageLabel = QLabel() if repo.fork: imageLabel.setPixmap(self.repo_fork_pixmap) else: imageLabel.setPixmap(self.repo_pixmap) imageLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) imageLabel.setMargin(5) self.reposTableWidget.setCellWidget(row, 0, imageLabel) label = QLabel('<b>{}</b><br />{}'.format( str(repo.name), str(repo.description))) label.setAlignment(Qt.AlignVCenter) label.setMargin(5) label.setWordWrap(True) self.reposTableWidget.setCellWidget(row, 1, label) self.reposTableWidget.setItem(row, 2, QTableWidgetItem(QIcon(self.star_pixmap), str(repo.stargazers_count))) self.reposTableWidget.setItem(row, 3, QTableWidgetItem(QIcon(self.eye_pixmap), str(repo.watchers_count))) self.reposTableWidget.setItem(row, 4, QTableWidgetItem(QIcon(self.fork_pixmap), str(repo.forks_count))) self.reposTableWidget.resizeRowsToContents() @waiting_effects def starsRefresh(self): self.starsTableWidget.clearContents() try: starred = self.github.get_user().get_starred() self.starsTableWidget.setRowCount(self.github.get_user().public_repos) except (GithubException, AttributeError): return for row, repo in enumerate(starred): imageLabel = QLabel() if repo.fork: imageLabel.setPixmap(self.repo_fork_pixmap) else: imageLabel.setPixmap(self.repo_pixmap) imageLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) imageLabel.setMargin(5) self.starsTableWidget.setCellWidget(row, 0, imageLabel) label = QLabel(u'<b>{}/{}</b><br />{}'.format( unicode(repo.owner.login), unicode(repo.name), unicode(repo.description))) label.setAlignment(Qt.AlignVCenter) label.setMargin(5) label.setWordWrap(True) self.starsTableWidget.setCellWidget(row, 1, label) self.starsTableWidget.setItem(row, 2, QTableWidgetItem(QIcon(self.star_pixmap), '0')) self.starsTableWidget.setItem(row, 3, QTableWidgetItem(QIcon(self.eye_pixmap), str(repo.watchers_count))) self.starsTableWidget.setItem(row, 4, QTableWidgetItem(QIcon(self.fork_pixmap), str(repo.forks_count))) self.starsTableWidget.resizeRowsToContents() @waiting_effects def authenticate(self): if self.activeUserAction: username = str(self.activeUserAction.text()) token = load_token(CONFIG_PATH, 'github', username) self.github = Github(token) else: self.github = None def actionsUpdate(self): # TODO disable if no user is logged in if self.github is None: self.repoAddAction.setEnabled(False) self.repoRemoveAction.setEnabled(False) self.repoRefreshAction.setEnabled(False) else: self.repoAddAction.setEnabled(True) self.repoRefreshAction.setEnabled(True) if self._isARepoSelected(): self.repoRemoveAction.setEnabled(True) else: self.repoRemoveAction.setEnabled(False) def addAccount(self): wizard = AddAccountWizard(self) if wizard.exec_(): username = str(wizard.field('username').toString()) token = str(wizard.field('token').toString()) store_token(CONFIG_PATH, 'github', username, token) self.authenticate() self.reposRefresh() self.updateImage() self.actionsUpdate() def repoAdd(self): wizard = AddRepoWizard(self.github, self) if wizard.exec_(): self.github.get_user().create_repo( str(wizard.field('name').toString()), description=str(wizard.field('description').toString()), private=bool(wizard.field('private').toBool()), auto_init=bool(wizard.field('auto_init').toBool()), gitignore_template=str(wizard.field('gitignore').toString()), homepage=str(wizard.field('homepage').toString()), has_wiki=bool(wizard.field('has_wiki').toBool()), has_downloads=bool(wizard.field('has_downloads').toBool()), has_issues=bool(wizard.field('has_issues').toBool())) self.reposRefresh() def repoRemove(self): row = self._selectedRepoRow() name = self.reposTableWidget.item(row, 0).text() dialog = RepoRemoveDialog(self.github, name) if dialog.exec_(): self.github.get_user().get_repo(str(name)).delete() self.reposRefresh() def _isARepoSelected(self): """ Return True if a repo is selected else False """ if len(self.reposTableWidget.selectedItems()) > 0: return True else: return False def _selectedRepoRow(self): """ Return the currently select repo """ # TODO - figure out what happens if no repo is selected selectedModelIndexes = \ self.reposTableWidget.selectionModel().selectedRows() for index in selectedModelIndexes: return index.row()
class UpdateDialog(QDialog): def __init__(self, update_script): super(UpdateDialog, self).__init__(None, Qt.Window) self.updates_to_run = [] self.setWindowTitle("emzed updates") self.setWindowModality(Qt.WindowModal) self.setMinimumWidth(600) self.update_script = update_script self.setup_widgets() self.setup_layout() self.connect_signals() wd = QApplication.desktop().width() hd = QApplication.desktop().height() w = self.size().width() h = self.size().height() self.move((wd - w) / 2, (hd - h) / 2) def showEvent(self, evt): self.setCursor(Qt.WaitCursor) class WorkerThread(QThread): def run(self, script=self.update_script, parent=self): try: for method, args in script(parent.add_info_line, parent.add_update_info): self.emit(SIGNAL("execute_method(PyQt_PyObject, PyQt_PyObject)"), method, args) except: import traceback tb = traceback.format_exc() self.emit(SIGNAL("execute_method(PyQt_PyObject, PyQt_PyObject)"), parent.add_info_line, (tb,)) self.emit(SIGNAL("update_query_finished()")) self.t = WorkerThread() self.connect(self.t, SIGNAL("update_query_finished()"), self.start_to_interact) self.connect( self.t, SIGNAL("execute_method(PyQt_PyObject,PyQt_PyObject)"), self.execute_method) try: self.t.start() finally: self.setCursor(Qt.ArrowCursor) def execute_method(self, meth, args): meth(*args) def start_to_interact(self): self.ok_button.setEnabled(True) def setup_widgets(self): self.label_info = QLabel("updates from exchange folder:") self.info = QTextEdit(self) self.info.setReadOnly(1) self.label_updates = QLabel("updates from internet:") self.updates = QTableWidget(0, 3) self.updates.setHorizontalHeaderLabels(["updater", "info", "try updatde ?"]) self.updates.verticalHeader().hide() self.updates.horizontalHeader().setResizeMode(0, QHeaderView.Stretch) self.updates.horizontalHeader().setResizeMode(1, QHeaderView.Stretch) self.ok_button = QPushButton("OK") self.ok_button.setEnabled(False) def setup_layout(self): layout = QVBoxLayout() self.setLayout(layout) layout.addWidget(self.label_info) layout.addWidget(self.info) layout.addWidget(self.label_updates) layout.addWidget(self.updates) button_layout = QHBoxLayout() button_layout.addStretch() button_layout.addWidget(self.ok_button) layout.addLayout(button_layout) def connect_signals(self): self.connect(self.ok_button, SIGNAL("pressed()"), self.accept) def ok_button_pressed(self): self.info.append("hi") self.add_update_info("updater", "info") def _item(self, content, is_checkable): item = QTableWidgetItem(content) if is_checkable: item.setCheckState(Qt.Unchecked) item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsSelectable) return item def add_update_info(self, updater_id, info, with_checkbox=True): i = self.updates.rowCount() self.updates.insertRow(i) self.updates.setItem(i, 0, self._item(updater_id, False)) self.updates.setItem(i, 1, self._item(info, False)) if True or with_checkbox: self.updates.setItem(i, 2, self._item("", True)) def add_info_line(self, txt): self.info.append(txt) def get_updates_to_run(self): return self.updates_to_run def accept(self): for i in range(self.updates.rowCount()): updater_id = str(self.updates.item(i, 0).text()) item = self.updates.item(i, 2) if item is not None: # some cells in column are empty checked = self.updates.item(i, 2).checkState() == Qt.Checked if checked: self.updates_to_run.append(updater_id) super(UpdateDialog, self).accept()
def make_widget(main, show=True): id = main.persistant['id'] table = QTableWidget() table.controller = ROITableController(table, main) table.setGeometry(QRect(20, 33, 496, 296)) table.setWindowTitle('ceilingfaan - ROI Table - Work in progress') analysis = s.query(Analysis).order_by(Analysis.date.desc()).all() table.setRowCount(len(analysis)) table.setColumnCount(4) table.setHorizontalHeaderLabels( QString('CONTROL,DATE,MOUSE,FILENAME').split(',')) current_analysis = None on_render = table.controller.on('render') on_import = table.controller.on('import') for nrow, entity in enumerate(analysis): if entity.id == id: print 'Found matching analysis data', id, 'at nrow:', nrow current_analysis = entity current_nrow = nrow continue for ncol, attr in enumerate('date mouse_id filename'.split()): field = getattr(entity, attr) item = QTableWidgetItem(str(field)) item.setFlags(Qt.ItemIsEnabled) table.setItem(nrow, ncol + 1, item) render_btn = QPushButton('Render', checkable=True) render_btn.setStyleSheet('font-size: 9px; background-color: skyblue;') import_btn = QPushButton('Import') import_btn.setStyleSheet('font-size: 9px;') btn_layout = QHBoxLayout() btn_layout.setContentsMargins(5, 0, 5, 0) btn_layout.addWidget(render_btn) btn_layout.addWidget(import_btn) btn_widget = QWidget() btn_widget.nrow = nrow btn_widget.analysis_id = entity.id btn_widget.ext_roi_set = None btn_widget.setLayout(btn_layout) table.setCellWidget(nrow, 0, btn_widget) render_btn.clicked.connect(on_render) import_btn.clicked.connect(on_import) if current_analysis: table.removeRow(current_nrow) table.insertRow(0) item = QTableWidgetItem('Current Analysis') item.setFlags(Qt.ItemIsEnabled) item.setTextAlignment(Qt.AlignCenter) table.setItem(0, 0, item) for ncol, attr in enumerate('date mouse_id filename'.split()): field = getattr(current_analysis, attr) item = QTableWidgetItem(str(field)) item.setFlags(Qt.ItemIsEnabled) table.setItem(0, ncol + 1, item) # debug.enter() table.setSelectionBehavior(QTableWidget.SelectRows) table.setSelectionMode(QTableWidget.NoSelection) table.resizeColumnsToContents() table.horizontalHeader().setStretchLastSection(True) if show: table.show() return table
class SentenceFillDlg(QDialog, ui_sentencefilldlg.Ui_SentenceFillDlg): def __init__(self, tableName, rangeValues, parent=None): super(SentenceFillDlg, self).__init__(parent) self.tableName = tableName self.rangeValues = rangeValues self.setupUi(self) self.initUI() def initUI(self): fontLabel = QFont('SansSerif', 14) self.setMinimumSize(1200, 600) self.resize(1200, 600) self.sentenceToFillTable = QTableWidget(5, 1, self) self.sentenceToFillTable.setGeometry(QRect(70, 60, 800, 400)) self.sentenceToFillTable.setColumnCount(1) item = QTableWidgetItem() item.setText('Sentences To Match') font = QFont() font.setBold(True) font.setWeight(75) item.setFont(font) self.sentenceToFillTable.setHorizontalHeaderItem(0, item) self.sentenceToFillTable.resizeColumnsToContents() self.sentenceToFillTable.horizontalHeader().setStretchLastSection(True) self.sentenceToFillTable.verticalHeader().setStretchLastSection(True) self.sentenceList = [] self.getSentencesFromDatabase() # split the sentences into chunks of 5 # Map to hold the anwers self.rightWordList = {} self.iteration = 0 self.sentenceMasterList = [] self.sentenceSlaveList = [] if len(self.sentenceList) > 0: for sentence in self.sentenceList: if len(self.sentenceSlaveList) < 5: self.sentenceSlaveList.append(sentence) else: self.sentenceMasterList.append(self.sentenceSlaveList) self.sentenceSlaveList = [] self.sentenceSlaveList.append(sentence) if len(self.sentenceSlaveList) <= 5: self.sentenceMasterList.append(self.sentenceSlaveList) self.maxIteration = len(self.sentenceMasterList) ## set the row height self.tableHeightSize = 0 ## Only if there is atleast one sentence fetched from the database if len(self.sentenceList) > 0: for index in range(0, 5): if len(self.sentenceList[index]) < 150: self.sentenceToFillTable.verticalHeader().resizeSection(index, 80) self.tableHeightSize = self.tableHeightSize + 90 elif len(self.sentenceList[index]) < 200: self.sentenceToFillTable.verticalHeader().resizeSection(index, 100) self.tableHeightSize = self.tableHeightSize + 100 else: self.sentenceToFillTable.verticalHeader().resizeSection(index, 120) self.tableHeightSize = self.tableHeightSize + 120 # split words from databse into chunks of 5 self.refIteration = 0 self.refWordMasterList = [] self.refWordSlaveList = [] for wordList in self.wordMap.values(): if len(self.refWordSlaveList) < 5: self.refWordSlaveList.append(wordList) else: self.refWordMasterList.append(self.refWordSlaveList) self.refWordSlaveList = [] self.refWordSlaveList.append(wordList) if len(self.refWordSlaveList) <= 5: self.refWordMasterList.append(self.refWordSlaveList) self.refMaxIteration = len(self.refWordMasterList) self.insertSentencesInTable() self.connect(self.sentenceToFillTable, SIGNAL("cellClicked(int, int)"), self.itemSelect) # create next, submit and close buttons self.nextButton = QPushButton('Next', self) self.nextButton.move(170, 520) self.nextButton.setEnabled(False) self.submitButton = QPushButton('Submit', self) self.submitButton.move(380, 520) self.closeButton = QPushButton('Close', self) self.closeButton.move(600, 520) self.connect(self.closeButton, SIGNAL('clicked()'), self.closeClicked) self.connect(self.submitButton, SIGNAL('clicked()'), self.onSubmitClicked) self.connect(self.nextButton, SIGNAL('clicked()'), self.onNextClicked) self.setWindowTitle('Sentence Fill') #self.setGeometry(10, 80, 1100, 750) def getSentencesFromDatabase(self): self.twoTypeList = data.Data().getSentencesFromDatabase(self.tableName, self.rangeValues) if len(self.twoTypeList) == 2: self.sentenceList = self.twoTypeList[0] self.wordMap = self.twoTypeList[1] def closeClicked(self): reply = QMessageBox.question(self, "Fill the Sentences", "You want to close the application", QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: self.reject() def onNextClicked(self): if not self.iteration < self.maxIteration: QMessageBox.information(self, "Fill the Sentences", "All Sentences are matched", QMessageBox.Ok) else: self.sentenceToFillTable.clearContents() ## Fetch the next records self.refIteration = self.refIteration + 1 self.rightWordList = {} ## clear the contents of the combo box self.wordListComboBox.clear() self.insertSentencesInTable() # validate whether the user has matched the blanks with a value during next and submit button clicks def onNextSubmitValidation(self): self.textNotFilled = False for row in range(0, len(self.currentSentenceListInTable)): if self.sentenceToFillTable.item(row, 0).text() == self.currentSentenceListInTable[row]: self.textNotFilled = True if self.textNotFilled: QMessageBox.information(self, "Fill the sentences", "Match all the sentences in the table", QMessageBox.Ok) self.nextButton.setEnabled(False) def onSubmitClicked(self): self.wordsMatched = True self.allWordsMatched = True brushRed = QBrush(QColor(255,0,0)) brushRed.setStyle(Qt.SolidPattern) brushGreen = QBrush(QColor(0,255,0)) brushGreen.setStyle(Qt.SolidPattern) # validate whether the user all matched the blanks with a value #self.onNextSubmitValidation() textNotFilled = False for row in range(0, len(self.currentSentenceListInTable)): if self.sentenceToFillTable.item(row, 0).text() == self.currentSentenceListInTable[row]: textNotFilled = True if textNotFilled: QMessageBox.information(self, "Fill the sentences", "Match all the sentences in the table", QMessageBox.Ok) else: splittedSentence = [] foundWordInSentence = "" self.rightWordListCopy = self.rightWordList for row in range(0, len(self.currentSentenceListInTable)): sentenceFilled = str(self.sentenceToFillTable.item(row, 0).text()) newSplittedSentence = [word.strip() for word in sentenceFilled.split()] splittedSentence = [] for word in newSplittedSentence: match = re.search(r'\w+', word) if match: splittedSentence.append(str(match.group())) wordList = self.rightWordListCopy[row] if len(wordList) > 1: firstWord = wordList[0].strip() secondWord = wordList[1].strip() if ' ' in firstWord: for word in firstWord.split(): if word not in splittedSentence: self.wordsMatched = False else: if firstWord not in splittedSentence: self.wordsMatched = False if self.wordsMatched: ## check is valid only if the first word is matched if ' ' in secondWord: for word in secondWord.split(): if word not in splittedSentence: self.wordsMatched = False else: if secondWord not in splittedSentence: self.wordsMatched = False elif len(wordList) == 1: word = wordList[0].strip() if word not in splittedSentence: self.wordsMatched = False if self.wordsMatched: self.sentenceToFillTable.item(row, 0).setBackground(brushGreen) else: self.sentenceToFillTable.item(row, 0).setBackground(brushRed) self.allWordsMatched = False self.wordsMatched = True if self.allWordsMatched: self.nextButton.setEnabled(True) QMessageBox.information(self, "Fill the sentences", "All sentences are matched", QMessageBox.Ok) def insertSentencesInTable(self): if self.iteration < self.maxIteration: cellList = [] self.col = 0 self.currentSentenceListInTable = self.sentenceMasterList[self.iteration] for sentence in self.currentSentenceListInTable: item = QTableWidgetItem(QString(sentence)) item.setFlags(Qt.ItemFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)) cellList.append(item) cellList.reverse() for index in range(0, len(self.currentSentenceListInTable)): self.sentenceToFillTable.setItem(index, self.col, cellList.pop()) self.sentenceToFillTable.setRowCount(len(self.sentenceMasterList[self.iteration])) self.sentenceToFillTable.setFixedHeight(self.tableHeightSize) # increment the count for the next button click self.iteration = self.iteration + 1 def createComboBox(self, rowIndex): self.xAxis = 1000 self.yAxis = 80 if self.refIteration < self.refMaxIteration: wordListWithFiveArrays = self.refWordMasterList[self.refIteration] requiredWordList = wordListWithFiveArrays[rowIndex] ## Create a combo box self.wordListComboBox = QComboBox(self) self.wordListComboBox.setGeometry(900, 80, 100, 20) self.connect(self.wordListComboBox, SIGNAL("currentIndexChanged(int)"), self.wordSelected) self.wordListComboBox.show() ## save the right word if len(requiredWordList) > 0: if rowIndex not in self.rightWordList.keys(): if len(requiredWordList) > 0: wordList = requiredWordList[0].split('&') self.rightWordList[rowIndex] = wordList ## insert words in the combo box random.shuffle(requiredWordList) random.shuffle(requiredWordList) self.wordListComboBox.addItem(' ') self.wordListComboBox.addItems(requiredWordList) def wordSelected(self): ## Avoid the blank option if len(str(self.wordListComboBox.currentText()).strip()) > 0: sentence = self.currentSentenceListInTable[self.selectedSentenceIndex] splittedText = sentence.split('-') if len(splittedText) == 2: item = QTableWidgetItem(QString(splittedText[0] + str(self.wordListComboBox.currentText()) + ' ' + splittedText[1].strip())) item.setFlags(Qt.ItemFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)) self.sentenceToFillTable.setItem(self.selectedSentenceIndex, 0, item) elif len(splittedText) > 2: wordsFromCombobox = str(self.wordListComboBox.currentText()).split('&') item = QTableWidgetItem(QString(splittedText[0] + wordsFromCombobox[0] + splittedText[1] + wordsFromCombobox[1] + ' ' + splittedText[2].strip())) item.setFlags(Qt.ItemFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)) self.sentenceToFillTable.setItem(self.selectedSentenceIndex, 0, item) def createIndexForWords(self): self.indexForWords = {} self.nextIndex = 0 for word in self.refWordListForIndex: if self.nextIndex == 5: break self.indexForWords[word] = self.nextIndex self.nextIndex = self.nextIndex + 1 def itemSelect(self,rowIndex): self.createComboBox(rowIndex) self.selectedSentenceIndex = rowIndex
def _init_layout(self): """ Create the GUI widgets (but leave them empty). """ hostname_combobox = QComboBox(parent=self) self._hostname_combobox = hostname_combobox hostname_combobox.setEditable(True) hostname_combobox.setSizePolicy( QSizePolicy.Expanding, QSizePolicy.Maximum ) for hostname in self._suggested_hostnames: hostname_combobox.addItem( hostname ) # EventFilter is installed after everything else is initialized. (See below.) #hostname_combobox.installEventFilter(self) self._connect_button = QPushButton("Connect", parent=self, clicked=self._handle_new_hostname) hostname_layout = QHBoxLayout() hostname_layout.addWidget( hostname_combobox ) hostname_layout.addWidget( self._connect_button ) hostinfo_table = QTableWidget() hostinfo_table.setColumnCount(len(SERVER_INFO_FIELDS)) hostinfo_table.setHorizontalHeaderLabels(SERVER_INFO_FIELDS) hostinfo_table.horizontalHeader().setVisible(True) hostinfo_table.verticalHeader().setVisible(False) hostinfo_table.setRowCount(1) hostinfo_table.setItem(0,0, QTableWidgetItem("Placeholder")) hostinfo_table.setVisible(False) hostinfo_table.resizeRowsToContents() hostinfo_table.horizontalHeader().setStretchLastSection(True) table_height = hostinfo_table.verticalHeader().sectionSize(0) + hostinfo_table.rowHeight(0) hostinfo_table.resize( QSize( hostinfo_table.width(), table_height ) ) hostinfo_table.setMaximumSize( QSize( 1000, table_height ) ) hostinfo_table.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) host_layout = QVBoxLayout() host_layout.addLayout(hostname_layout) host_layout.addWidget(hostinfo_table) host_groupbox = QGroupBox("DVID Host", parent=self) host_groupbox.setLayout( host_layout ) host_groupbox.setSizePolicy( QSizePolicy.Preferred, QSizePolicy.Preferred ) repo_treewidget = QTreeWidget(parent=self) repo_treewidget.setHeaderLabels( TREEVIEW_COLUMNS ) # TODO: Add type, shape, axes, etc. repo_treewidget.setSizePolicy( QSizePolicy.Preferred, QSizePolicy.Preferred ) repo_treewidget.itemSelectionChanged.connect( self._handle_data_selection ) data_layout = QVBoxLayout() data_layout.addWidget( repo_treewidget ) data_groupbox = QGroupBox("Data Volumes", parent=self) data_groupbox.setLayout( data_layout ) node_listwidget = QListWidget(parent=self) node_listwidget.setSizePolicy( QSizePolicy.Preferred, QSizePolicy.Preferred ) node_listwidget.itemSelectionChanged.connect( self._update_status ) node_layout = QVBoxLayout() node_layout.addWidget( node_listwidget ) node_groupbox = QGroupBox("Nodes", parent=self) node_groupbox.setLayout( node_layout ) new_data_edit = QLineEdit(parent=self) new_data_edit.textEdited.connect( self._update_status ) full_url_label = QLabel(parent=self) full_url_label.setSizePolicy( QSizePolicy.Preferred, QSizePolicy.Maximum ) text_flags = full_url_label.textInteractionFlags() full_url_label.setTextInteractionFlags( text_flags | Qt.TextSelectableByMouse ) new_data_layout = QVBoxLayout() new_data_layout.addWidget( new_data_edit ) new_data_groupbox = QGroupBox("New Data Volume", parent=self) new_data_groupbox.setLayout( new_data_layout ) new_data_groupbox.setSizePolicy( QSizePolicy.Preferred, QSizePolicy.Maximum ) buttonbox = QDialogButtonBox( Qt.Horizontal, parent=self ) buttonbox.setStandardButtons( QDialogButtonBox.Ok | QDialogButtonBox.Cancel ) buttonbox.accepted.connect( self.accept ) buttonbox.rejected.connect( self.reject ) buttonbox.button(QDialogButtonBox.Ok).setEnabled(False) layout = QVBoxLayout() layout.addWidget( host_groupbox ) layout.addWidget( data_groupbox ) layout.addWidget( node_groupbox ) if self._mode == "specify_new": layout.addWidget( new_data_groupbox ) else: new_data_groupbox.hide() layout.addWidget( full_url_label ) layout.addWidget( buttonbox ) # Stretch factors layout.setStretchFactor(data_groupbox, 3) layout.setStretchFactor(node_groupbox, 1) self.setLayout(layout) self.setWindowTitle( "Select DVID Volume" ) self.resize(1000, 1000) # Initially disabled data_groupbox.setEnabled(False) node_groupbox.setEnabled(False) new_data_groupbox.setEnabled(False) # Set tab order self.setTabOrder(hostname_combobox, repo_treewidget) self.setTabOrder(repo_treewidget, node_listwidget) self.setTabOrder(node_listwidget, buttonbox) # Save instance members self._hostinfo_table = hostinfo_table self._data_groupbox = data_groupbox self._node_groupbox = node_groupbox self._new_data_groupbox = new_data_groupbox self._repo_treewidget = repo_treewidget self._node_listwidget = node_listwidget self._new_data_edit = new_data_edit self._full_url_label = full_url_label self._buttonbox = buttonbox # Finally install eventfilter (after everything is initialized) hostname_combobox.installEventFilter(self)
class MainWindow(QtGui.QMainWindow): def __init__(self, parent=None): logging.info(u'创建主窗口...') QtGui.QMainWindow.__init__(self, parent) tabs = QtGui.QTabWidget(self) tab2 = QtGui.QWidget() tab3 = QtGui.QWidget() self.console = MyConsole(parent=self) # tab2 - self.console self.console.setMinimumSize(1500, 800) scroll = QtGui.QScrollArea() scroll.setWidget(self.console) scroll.setAutoFillBackground(True) scroll.setWidgetResizable(True) vbox = QtGui.QVBoxLayout() vbox.addWidget(scroll) tab2.setLayout(vbox) # tab3 - self.viewEntry = QTableWidget(0, 12) self.viewEntry.setHorizontalHeaderLabels( [u'期数', u'时间', u'冠军', u'亚军', u'第三名', u'第四名', u'第五名', u'第六名', u'第七名', u'第八名', u'第九名', u'第十名']) self.viewEntry.horizontalHeader().setStretchLastSection(True) self.viewEntry.horizontalHeader().setResizeMode(QtGui.QHeaderView.Stretch) vbox3 = QtGui.QVBoxLayout() vbox3.addWidget(self.viewEntry) tab3.setLayout(vbox3) tabs.addTab(tab2, u"控制台") tabs.addTab(tab3, u"开奖结果") tabs.resize(1500, 800) self.resize(1500, 800) self.tabs = tabs self.tab2 = tab2 self.tab3 = tab3 self.scroll = scroll # 禁止最大化 self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint) from myutil.tool.Overlay import Overlay self.setCentralWidget(self.tabs) self.overlay = Overlay(self.centralWidget()) self.overlay.hide() self.show() @pyqtSlot(str) def mySetWindowTitle(self, title): self.setWindowTitle(title) @pyqtSlot(str, list) def completeHistoryResultData(self, timesnow, open_balls): logging.info(u"【主窗口-历史数据展板-填充之】") for i in range(len(open_balls)): newItem = QTableWidgetItem(str(open_balls[i])) self.viewEntry.setItem(0, 2 + i, newItem) logging.info(u"【主窗口-历史数据展板-填充完毕】") @pyqtSlot(str, list) def appendHistoryResultData(self, timesnow, open_balls): logging.info(u"【主窗口-历史数据展板-追加】") time_str = MyTool.getCurrentTimeStr() self.viewEntry.insertRow(0) # 期数 newItem = QTableWidgetItem(str(int(timesnow) - 1)) self.viewEntry.setItem(0, 0, newItem) # 时间 newItem = QTableWidgetItem(time_str) self.viewEntry.setItem(0, 1, newItem) for i in range(len(open_balls)): newItem = QTableWidgetItem(str(open_balls[i])) self.viewEntry.setItem(0, 2 + i, newItem) logging.info(u"【主窗口-历史数据展板-追加完毕】") @pyqtSlot(list) def updateHistoryResultData(self, data_list): logging.info(u"【主窗口-历史数据展板-大更新】################START HistoryResultData################") # 先清空... self.viewEntry.clearContents() self.viewEntry.setRowCount(0) for period in data_list: # 添加一行 row = self.viewEntry.rowCount() self.viewEntry.insertRow(row) # 期数 newItem = QTableWidgetItem(period[0]) self.viewEntry.setItem(row, 0, newItem) # 时间 newItem = QTableWidgetItem(str(period[1])) self.viewEntry.setItem(row, 1, newItem) if self.console.play_mode in [common.PLAYMODE_PK10, common.PLAYMODE_XYFT]: for i in range(10): newItem = QTableWidgetItem(str(period[2 + i])) self.viewEntry.setItem(row, 2 + i, newItem) else: for i in range(5): newItem = QTableWidgetItem(str(period[2 + i])) self.viewEntry.setItem(row, 2 + i, newItem) logging.info(u"【主窗口-历史数据展板-大更新】################END HistoryResultData################") def closeEvent(self, event): reply = QtGui.QMessageBox.question(self, u'退出', u"您确定离开吗?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: # 关闭http连接... from common.common import req_session req_session.close() event.accept() else: event.ignore() def resizeEvent(self, event): self.overlay.resize(event.size()) event.accept()
class projectsInfoWidget(infoWidget): __mainLayout = None __tabWidget = None __chart = None __table = None __colors = [Qt.red, QColor(120, 160, 215), Qt.yellow, Qt.green, QColor(250, 125, 30), Qt.blue] __angles = [] def __init__(self, client, parent = None): infoWidget.__init__(self, client, parent) self.__angles = [] self.__tabWidget = QTabWidget() self.__mainLayout = QVBoxLayout() self.__mainLayout.addWidget(self.__tabWidget) self.setMainLayout(self.__mainLayout, False) self.__chart = PieChartFrame() self.__table = QTableWidget() self.__table.verticalHeader().hide() self.__table.setColumnCount(3) hh = self.__table.horizontalHeader() hh.setResizeMode(QHeaderView.Stretch) #self.__table.setHeaderData(0, Qt.Horizonatal, QVariant(self.tr("Project Name")), Qt.DiaplayRole) self.__table.setHorizontalHeaderItem(0, QTableWidgetItem(self.tr("Project Name"))) self.__table.setHorizontalHeaderItem(1, QTableWidgetItem(self.tr("Project URL"))) self.__table.setHorizontalHeaderItem(2, QTableWidgetItem(self.tr("Resource Share"))) self.__tabWidget.addTab(self.__chart, self.tr("&Resources Share")) self.__tabWidget.addTab(self.__table, self.tr("&Projects")) projects = client.projectState() if not projects is None: self.updateProjects(projects) self.connect(client, SIGNAL("projectState(PyQt_PyObject)"), self.updateProjects) def updateProjects(self, projects): projects = projects['project'] #self.__chart.removeItems() update = False i = 0 full = 0.0 for projekt in projects: full = full + float(projekt['resource_share']) for i in range(len(projects)): projekt = projects[i] angle = int(360.0 * 16.0 * (float(projekt['resource_share']) / full)) try: if angle != self.__angles[i]: update = True self.__angles[i] = angle except IndexError: update = True self.__angles.append(angle) self.__angles = self.__angles[0:len(projects)] if update: self.__chart.removeItems() self.__table.setRowCount(len(projects)) for i in range(len(projects)): #aktualizujeme tabulku projectItem = QTableWidgetItem(projekt['project_name']) projectItem.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable) urlItem = QTableWidgetItem(projekt['master_url']) urlItem.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable) shareItem = QTableWidgetItem(str(round(float(projekt['resource_share'])))) shareItem.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable) self.__table.setItem(i, 0, projectItem) self.__table.setItem(i, 1, urlItem) self.__table.setItem(i, 2, shareItem) #aktualizujeme graf projekt = projects[i] angle = int(360.0 * 16.0 * (float(projekt['resource_share']) / full)) self.__chart.addItem(angle, projekt['project_name'], self.__colors[i]) i = i + 1 if i >= len(self.__colors): i = 0
class FilesUIManager(QWidget): def __init__(self, winged, pref): QWidget.__init__(self) self.winged = winged self.pref = pref self._vbox = QVBoxLayout(self) self._hbox = QHBoxLayout() self._table = QTableWidget(1, 3) self._table.setHorizontalHeaderLabels(['Access', 'File Name', 'Size']) self._table.setSelectionBehavior(QAbstractItemView.SelectRows) self._table.verticalHeader().hide() self._table.removeRow(0) self._table.setColumnWidth(0, 80) self._table.setColumnWidth(1, 480) self._hbox.addWidget(self._table) self._btnDownload = QPushButton(QIcon(config.images['download']), '') self._btnDownload.setToolTip('Download') self._btnFacebook = QPushButton(QIcon(config.images['facebook']), '') self._btnFacebook.setToolTip('Share on Facebook') self._btnTwitter = QPushButton(QIcon(config.images['twitter']), '') self._btnTwitter.setToolTip('Share on Twitter') self._btnLink = QPushButton(QIcon(config.images['link']), '') self._btnLink.setToolTip('Copy Link') self.connect(self._btnDownload, SIGNAL("clicked()"), self._save) self.connect(self._btnFacebook, SIGNAL("clicked()"), self._facebook) self.connect(self._btnTwitter, SIGNAL("clicked()"), self._twitter) self.connect(self._btnLink, SIGNAL("clicked()"), self._copy_link) def _save(self): file_ = self._files[self._table.currentRow()] if file_['accesibility'] == '2': if self.pref.get('ask', True): folderName = str(QFileDialog.getExistingDirectory(self, 'Save File in...')) else: folderName = self.pref.get('folder', '') if folderName != '': self.winged.save_file(file_, folderName) else: QMessageBox.information(self, 'Download Fail', 'You can only download public files\nwith WingedBox-Client.') def _facebook(self): file_ = self._files[self._table.currentRow()] self.winged.thread.api.facebook(file_) def _twitter(self): file_ = self._files[self._table.currentRow()] self.winged.thread.api.twitter(file_) def _copy_link(self): clipboard = QApplication.clipboard() file = self._files[self._table.currentRow()] clipboard.setText('http://wingedbox.com/downloads/' + file['id'] + "-" + file['file-name']) def find(self, text): items = self._table.findItems(text, Qt.MatchContains) rows = [i.row() for i in items] rowsCount = range(self._table.rowCount()) rowsCount.reverse() for i in rowsCount: if i not in rows: self._table.removeRow(i) def load_table(self, files): self._files = files r = 0 for file in files: self._table.insertRow(r) if len(file['name']) > 0: item = QTableWidgetItem(file['name']) else: item = QTableWidgetItem(file['file-name']) item.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) self._table.setItem(r, 1, item) item = QTableWidgetItem(str(file['file-size'] / 1024) + ' kb') item.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) self._table.setItem(r, 2, item) imageFile = config.type.get(file['type'], config.typeBlank) access = config.access[file['accesibility']] item = QTableWidgetItem(QIcon(imageFile), access[3]) item.setBackgroundColor(QColor(access[0], access[1], access[2])) item.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) self._table.setItem(r, 0, item) r += 1 self._table.resizeRowsToContents() self._table.resizeColumnsToContents() self._table.horizontalHeader().setStretchLastSection(True)
class UserDialog(QDialog): holdc = {} def __init__(self, parent=None): super(UserDialog, self).__init__(parent) self.pagetitle = self.sessionname self.tableFont = QFont('Century Gothic', 8) self.table = QTableWidget() self.cols = [ 'SN', 'ITEM', 'QUANTITY', 'UNIT AMOUNT', 'TOTAL AMOUNT', 'DATE' ] self.h1_pull_box = QVBoxLayout() #self.tableFont.setFamily('Century Gothic') self.tableHeaderStyle = "::section {" "background-color: teal; color:white}" #pull all CA self.editID = 0 self.hold_unit = {} self.hold_store = {} self.hold_storeGroup = {} self.hold_borrowed = {} from_label = QLabel('From:') to_label = QLabel('To:') self.fromData = QDateEdit() self.toData = QDateEdit() currentDate = QDate() self.fromData.setDate(currentDate.currentDate()) self.fromData.setCalendarPopup(True) self.toData.setDate(currentDate.currentDate()) self.toData.setCalendarPopup(True) menu = QMenu() menu.addAction('All', lambda: self.reloadTable(0)) menu.addAction('In-Stock', lambda: self.reloadTable(1)) menu.addAction('Out-Stock', lambda: self.reloadTable(2)) menu.addAction('Damaged', lambda: self.reloadTable(3)) menu.addAction('Borrowed', lambda: self.reloadTable(4)) self.pull_btn = QPushButton() self.pull_btn.setText("Load") self.pull_btn.setMenu(menu) h_pull_box = QHBoxLayout() h_pull_box.addWidget(from_label) h_pull_box.addWidget(self.fromData) h_pull_box.addWidget(to_label) h_pull_box.addWidget(self.toData) h_pull_box.addWidget(self.pull_btn) storeGroup = self.pullGroupStore() unit = self.pullUnit() self.storeGroupText = QLabel('Category') self.storeGroupData = QComboBox() self.storeGroupData.currentIndexChanged.connect(self.reloadStore) self.storeText = QLabel('Items') self.storeData = QComboBox() self.amountText = QLabel('Total Cost') self.amountData = QLineEdit() self.amountData.setPlaceholderText('0000.00') self.tellerText = QLabel('Reciept No.') self.tellerData = QLineEdit() self.tellerData.setPlaceholderText('xxxxxxxxx') self.quantityText = QLabel('Quantity.') self.quantityData = QLineEdit() self.quantityData.setPlaceholderText('00.0') self.periodText = QLabel('Period (days)') self.periodData = QLineEdit() self.periodData.setPlaceholderText('00.0') self.personText = QLabel('Recieved By:') self.personData = QLineEdit() self.personData.setPlaceholderText('00.0') self.unitText = QLabel('Unit') self.unitData = QComboBox() self.borrowedText = QLabel('Borrowed') self.borrowedData = QComboBox() self.dateText = QLabel('Date') self.dateData = QDateEdit() self.dateData.setDate(currentDate.currentDate()) self.dateData.setCalendarPopup(True) self.descriptionText = QLabel('Description') self.descriptionData = QPlainTextEdit() self.descriptionData.move(200, 100) self.borrowedText.hide() self.borrowedData.hide() mboz = QVBoxLayout() hboz = QHBoxLayout() self.state = QLabel('') self.r1 = QRadioButton('In-stock') self.r1.setChecked(True) self.r1.toggled.connect(lambda: self.changeStates()) self.r2 = QRadioButton('Out-stock') self.r2.toggled.connect(lambda: self.changeStates()) self.r3 = QRadioButton('Damaged') self.r3.toggled.connect(lambda: self.changeStates()) self.r4 = QRadioButton('Borrowed') self.r4.toggled.connect(lambda: self.changeStates()) self.r5 = QRadioButton('Returned') self.r5.toggled.connect(lambda: self.changeStates()) hboz.addWidget(self.r1) hboz.addWidget(self.r2) hboz.addWidget(self.r3) hboz.addWidget(self.r4) hboz.addWidget(self.r5) i = 0 for a in storeGroup: self.hold_storeGroup[i] = a['id'] tex = str(a['name']).upper() self.storeGroupData.addItem(tex) i += 1 i = 0 str_key = self.hold_storeGroup[self.storeGroupData.currentIndex()] store = self.pullStore(str_key) for a in store: self.hold_store[i] = a['id'] tex = str(a['name']).upper() self.storeData.addItem(tex) i += 1 i = 0 for a in unit: self.hold_unit[i] = a['id'] tex = str(a['name']).upper() self.unitData.addItem(tex) i += 1 self.reloadBorrowed() self.FormLayout = QFormLayout() self.FormLayout.addRow(self.storeGroupText, self.storeGroupData) self.FormLayout.addRow(self.storeText, self.storeData) self.FormLayout.addRow(self.tellerText, self.tellerData) self.FormLayout.addRow(self.quantityText, self.quantityData) self.FormLayout.addRow(self.amountText, self.amountData) self.FormLayout.addRow(self.dateText, self.dateData) self.FormLayout.addRow(self.periodText, self.periodData) self.FormLayout.addRow(self.borrowedText, self.borrowedData) self.FormLayout.addRow(self.personText, self.personData) self.FormLayout.addRow(self.descriptionText, self.descriptionData) self.periodText.hide() self.periodData.hide() mboz.addLayout(hboz) mboz.addLayout(self.FormLayout) mboz.addWidget(self.state) groupBox1 = QGroupBox('Add Store Item') groupBox1.setLayout(mboz) self.pb = QPushButton() self.pb.setObjectName("Add") self.pb.setText("Add Store Item") self.pb1 = QPushButton() self.pb1.setObjectName("Edit") self.pb1.setText("Edit Row") self.pb1.setEnabled(False) self.pb2 = QPushButton() self.pb2.setObjectName("Close") self.pb2.setText("Close") self.pb3 = QPushButton() self.pb3.setObjectName("Delete") self.pb3.setText("Delete Row") self.pb3.setEnabled(False) self.pb4 = QPushButton() self.pb4.setObjectName("Reset") self.pb4.setText("Reset") self.pb4.hide() self.pb5 = QPushButton() self.pb5.setObjectName("Change") self.pb5.setText("Change Store") self.pb5.hide() self.pb6 = QPushButton() self.pb6.setObjectName("Clear") self.pb6.setText("Clear Selection") self.pb6.setEnabled(False) hbo = QHBoxLayout() hbo.addWidget(self.pb) hbo.addWidget(self.pb5) hbo.addWidget(self.pb4) hbo.addWidget(self.pb2) groupBox2 = QGroupBox('Store Data') groupBox2.setLayout(hbo) al = self.pullStoreData(0) if al and len(al) > 0: al = al else: al = {} self.storeData.currentIndexChanged.connect( lambda: self.reloadBorrowed()) header = self.table.horizontalHeader() header.setResizeMode(QHeaderView.ResizeToContents) header.setStretchLastSection(True) header.setStyleSheet(self.tableHeaderStyle) vheader = self.table.verticalHeader() vheader.setStyleSheet(self.tableHeaderStyle) # Body self.table.setWindowTitle("Store") self.table.setStyleSheet("color:white") self.table.resize(300, 250) self.table.setFont(self.tableFont) self.table.setSortingEnabled(2) #self.table.resizeColumnsToContents() self.table.setRowCount(len(al)) self.table.setColumnCount(len(self.cols)) self.table.setHorizontalHeaderLabels(self.cols) self.table.setContextMenuPolicy(Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.handleHeaderMenu) self.table.hideColumn(0) self.table.setSelectionMode(QAbstractItemView.MultiSelection) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) i = 0 for q in al: #row id if q['state'] == 1: color = QColor(100, 0, 0) elif q['state'] == 2: color = QColor(100, 100, 0) elif q['state'] == 3: color = QColor(100, 0, 100) elif q['state'] == 4: color = QColor(0, 100, 100) else: color = QColor(0, 50, 150) self.table.setItem(i, 0, QTableWidgetItem(str(q['id']))) self.table.item(i, 0).setBackground(color) self.table.setItem(i, 1, QTableWidgetItem(str(q['itemname']).upper())) self.table.item(i, 1).setBackground(color) self.table.setItem(i, 2, QTableWidgetItem(str(q['quantity']).upper())) self.table.item(i, 2).setBackground(color) try: zamt = str("{:,}".format(float(q['amount']))) except: zamt = '' self.table.setItem(i, 3, QTableWidgetItem(zamt)) self.table.item(i, 3).setBackground(color) try: if len(q['amount']) > 0 and float(q['amount']) > 0: tot = float(q['amount']) * float(q['quantity']) else: tot = 0 except: tot = 0 self.table.setItem(i, 4, QTableWidgetItem(str(tot).upper())) self.table.item(i, 4).setBackground(color) damz = float(q['datepaid']) damt = datetime.utcfromtimestamp(damz).strftime('%d-%m-%Y') self.table.setItem(i, 5, QTableWidgetItem(str(damt))) self.table.item(i, 5).setBackground(color) i += 1 self.table.itemSelectionChanged.connect(self.confirmSelection) self.table.resizeRowsToContents() v_pull_box = QVBoxLayout() self.h1_pull_box.addWidget(self.table) v_pull_box.addLayout(h_pull_box) v_pull_box.addLayout(self.h1_pull_box) h2_pull_box = QHBoxLayout() h2_pull_box.addWidget(self.pb1) h2_pull_box.addWidget(self.pb3) h2_pull_box.addWidget(self.pb6) v_pull_box.addLayout(h2_pull_box) groupBox3 = QGroupBox() groupBox3.setLayout(hbo) groupBox2.setLayout(v_pull_box) grid = QGridLayout() grid.addWidget(groupBox1, 0, 0) grid.addWidget(groupBox2, 0, 1, 2, 1) grid.addWidget(groupBox3, 1, 0) self.setLayout(grid) self.connect(self.pb, SIGNAL("clicked()"), lambda: self.button_click()) self.connect(self.pb1, SIGNAL("clicked()"), lambda: self.button_editshow()) self.connect(self.pb2, SIGNAL("clicked()"), lambda: self.button_close(self)) self.connect(self.pb3, SIGNAL("clicked()"), lambda: self.button_delete()) self.connect(self.pb4, SIGNAL("clicked()"), lambda: self.button_reset()) self.connect(self.pb5, SIGNAL("clicked()"), lambda: self.button_edit()) self.connect(self.pb6, SIGNAL("clicked()"), lambda: self.button_clear()) #self.connect(self.pull_btn, SIGNAL("clicked()"), lambda x =1: self.reloadTable(x)) self.setWindowTitle(self.pagetitle) def stateReciept(self): self.amountText.show() self.amountData.show() self.tellerText.show() self.tellerData.show() self.tellerText.setText('Reciept No.') self.periodText.hide() self.periodData.hide() self.personText.setText('Recieved By:') self.personData.setPlaceholderText('Fullname or department') self.borrowedText.hide() self.borrowedData.hide() self.reloadTable(1) def stateIssue(self): self.amountText.hide() self.amountData.hide() self.tellerText.show() self.tellerData.show() self.tellerText.setText('Issue No.') self.periodText.hide() self.periodData.hide() self.personText.setText('Issued to:') self.personData.setPlaceholderText('Fullname or department issued to') self.borrowedText.hide() self.borrowedData.hide() self.reloadTable(2) def stateDamage(self): self.amountText.hide() self.amountData.hide() self.tellerText.hide() self.tellerData.hide() self.periodText.hide() self.periodData.hide() self.personText.setText('Reported By:') self.personData.setPlaceholderText('Fullname or department') self.borrowedText.hide() self.borrowedData.hide() self.reloadTable(3) def stateBorrowed(self): self.amountText.hide() self.amountData.hide() self.tellerText.hide() self.tellerData.hide() self.periodText.show() self.periodData.show() self.personText.setText('Given to:') self.personData.setPlaceholderText( 'Fullname or department borrowed to') self.borrowedText.hide() self.borrowedData.hide() self.reloadTable(4) def stateReturned(self): self.amountText.hide() self.amountData.hide() self.tellerText.hide() self.tellerData.hide() self.periodText.hide() self.periodData.hide() self.personText.setText('Returned By:') self.personData.setPlaceholderText( 'Fullname or department borrowed to') self.borrowedText.show() self.borrowedData.show() self.reloadBorrowed() self.reloadTable(5) def changeStates(self): self.getQuantity() if self.r1.isChecked(): self.stateReciept() elif self.r2.isChecked(): self.stateIssue() elif self.r3.isChecked(): self.stateDamage() elif self.r4.isChecked(): self.stateBorrowed() elif self.r5.isChecked(): self.stateReturned() def handleHeaderMenu(self, pos): print('column(%d)' % self.table.horizontalHeader().logicalIndexAt(pos)) menu = QMenu() menu.addAction('Add') menu.addAction('Delete') menu.exec_(QCursor.pos()) def pullGroupStore(self): cn = Db() arr = cn.selectn('datas', '', '', {"pubID": 23, "active": 0}) return arr def pullStore(self, a): cn = Db() arr = cn.selectn('datas', '', '', {"subID": a}) return arr def pullUnit(self): cn = Db() arr = cn.selectn('datas', '', '', {"pubID": 20, "active": 0}) return arr def pullStoreData(self, a=None): st_date = self.fromData.date().toPyDate() en_date = self.toData.date().toPyDate() st_date = time.mktime(st_date.timetuple()) en_date = time.mktime(en_date.timetuple()) db = 'school_stores' + str(self.session) cn = Db() arr = cn.selectStoreDate(db, st_date, en_date, a) return arr def mySelectTable(self): ''' get the selected rpws in a table returns list or row ids ''' sels = self.table.selectedIndexes() sels = self.table.selectionModel().selectedRows() park = [] park1 = [] for j in sels: park.append(j.row()) for i in set(park): selected = self.table.item(i, 0).text() park1.append(selected) return park1 def editRow(self, a): _session = self.session g = Db() db = 'school_stores' + str(_session) data = g.selectn(db, '', 1, {'id': a}) if len(data) > 0: try: amt = float(data['amount']) qty = float(data['quantity']) if amt > 0 and qty > 0: cost = amt * qty else: cost = 0 except: cost = 0 amt = 0 qty = 0 if data['state'] == 1: self.r1.setChecked(True) elif data['state'] == 2: self.r2.setChecked(True) elif data['state'] == 3: self.r3.setChecked(True) elif data['state'] == 4: self.r4.setChecked(True) elif data['state'] == 5: self.r5.setChecked(True) self.amountData.setText(str(cost)) self.descriptionData.clear() self.descriptionData.insertPlainText(str(data['description'])) self.tellerData.setText(str(data['teller'])) self.periodData.setText(str(data['period'])) self.personData.setText(str(data['person'])) self.quantityData.setText(str(qty)) stID = self.hold_store.keys()[self.hold_store.values().index( data['itemID'])] self.storeData.setCurrentIndex(stID) def reloadBorrowed(self): self.getQuantity() _store = self.hold_store[self.storeData.currentIndex()] _session = self.session g = Db() db = 'school_stores' + str(_session) data = g.selectn(db, '', '', {'itemID': _store, 'state': 4}) fig = 0 self.borrowedData.clear() self.hold_borrowed = {} i = 0 for a in data: ret = g.selectStoreReturned(db, a['id']) if ret: retu = ret['qty'] else: retu = 0 fig = float(a['quantity']) - float(retu) damz = float(a['datepaid']) if float(fig) > 0: self.hold_borrowed[i] = a['id'] damt = datetime.utcfromtimestamp(damz).strftime('%d-%m-%Y') tex = str(damt) + " " + str( a['person']).upper() + " (" + str(fig).upper() + ")" self.borrowedData.addItem(tex) i += 1 def reloadStore(self): self.getQuantity() cat = self.hold_storeGroup[self.storeGroupData.currentIndex()] store = self.pullStore(cat) self.storeData.clear() self.hold_store = {} i = 0 for a in store: self.hold_store[i] = a['id'] tex = str(a['name']).upper() self.storeData.addItem(tex) i += 1 def getQuantity(self): if self.storeData.currentIndex() > -1: s = self.hold_store[self.storeData.currentIndex()] _session = self.session g = Db() db = 'school_stores' + str(_session) fi = g.selectStoreQuantity(db, s) remain = 0 arr = {} for a in fi: arr[a['state']] = a['qty'] if 1 in arr: re = arr[1] else: re = 0 if 2 in arr: isu = arr[2] else: isu = 0 if 3 in arr: dam = arr[3] else: dam = 0 if 4 in arr: bor = arr[4] else: bor = 0 if 5 in arr: ret = arr[5] else: ret = 0 borrowed = float(bor) - float(ret) issued = float(isu) + float(borrowed) + float(dam) remain = float(re) - float(issued) self.quantityText.setText('QTY: ' + str(remain)) if remain == 0 and (self.r2.isChecked() or self.r3.isChecked() or self.r4.isChecked()): self.quantityData.setEnabled(False) else: self.quantityData.setEnabled(True) return remain def reloadTable(self, a): self.getQuantity() if not a == 0: data = self.pullStoreData(a) else: data = self.pullStoreData() self.table.close() self.table = QTableWidget() header = self.table.horizontalHeader() header.setResizeMode(QHeaderView.ResizeToContents) header.setStretchLastSection(True) header.setStyleSheet(self.tableHeaderStyle) vheader = self.table.verticalHeader() vheader.setStyleSheet(self.tableHeaderStyle) # Body self.table.setWindowTitle("Stores") self.table.setStyleSheet("color:white") self.table.resize(300, 250) self.table.setFont(self.tableFont) self.table.setSortingEnabled(2) self.table.resizeColumnsToContents() self.table.setRowCount(len(data)) self.table.setColumnCount(len(self.cols)) self.table.setHorizontalHeaderLabels(self.cols) self.table.setContextMenuPolicy(Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.handleHeaderMenu) self.table.hideColumn(0) self.table.setSelectionMode(QAbstractItemView.MultiSelection) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) i = 0 for q in data: #row id if q['state'] == 1: color = QColor(100, 0, 0) elif q['state'] == 2: color = QColor(100, 100, 0) elif q['state'] == 3: color = QColor(100, 0, 100) elif q['state'] == 4: color = QColor(0, 100, 100) else: color = QColor(0, 50, 150) self.table.setItem(i, 0, QTableWidgetItem(str(q['id']))) self.table.item(i, 0).setBackground(color) self.table.setItem(i, 1, QTableWidgetItem(str(q['itemname']).upper())) self.table.item(i, 1).setBackground(color) self.table.setItem(i, 2, QTableWidgetItem(str(q['quantity']).upper())) self.table.item(i, 2).setBackground(color) try: zamt = str("{:,}".format(float(q['amount']))) except: zamt = '' self.table.setItem(i, 3, QTableWidgetItem(zamt)) self.table.item(i, 3).setBackground(color) try: if len(q['amount']) > 0 and float(q['amount']) > 0: tot = float(q['amount']) * float(q['quantity']) else: tot = 0 except: tot = 0 self.table.setItem(i, 4, QTableWidgetItem(str(tot).upper())) self.table.item(i, 4).setBackground(color) damz = float(q['datepaid']) damt = datetime.utcfromtimestamp(damz).strftime('%d-%m-%Y') self.table.setItem(i, 5, QTableWidgetItem(str(damt))) self.table.item(i, 5).setBackground(color) i += 1 self.table.itemSelectionChanged.connect(self.confirmSelection) self.table.resizeRowsToContents() self.h1_pull_box.addWidget(self.table) self.table.show() def pullOnes(self, a, b): cn = Db() arr = cn.selectn(a, '', 1, {'id': b}) return arr def confirmSelection(self): item = self.mySelectTable() if len(item) == 1: self.pb1.setEnabled(True) self.pb3.setEnabled(True) self.pb6.setEnabled(True) elif len(item) > 1: self.pb1.setEnabled(False) self.pb3.setEnabled(True) self.pb6.setEnabled(True) else: self.pb1.setEnabled(False) self.pb3.setEnabled(False) self.pb6.setEnabled(False) def button_close(self, b): b.close() def button_editshow(self): item = self.mySelectTable() self.editRow(item[0]) self.pb.hide() self.pb4.show() self.pb5.show() def button_delete(self): item = self.mySelectTable() _session = self.session g = Db() db = 'school_stores' + str(_session) for j in item: g.delete(db, {'id': j}) self.reloadTable(1) def button_edit(self): _session = self.session _amounts = self.amountData.text() _teller = self.tellerData.text() _quantity = self.quantityData.text() _person = self.personData.text() _period = self.periodData.text() _date = self.dateData.date().toPyDate() _date = time.mktime(_date.timetuple()) _description = self.descriptionData.toPlainText() _store = self.hold_store[self.storeData.currentIndex()] _borrowed = self.hold_borrowed[self.borrowedData.currentIndex()] arr = {} #recieved if self.r1.isChecked() and _amounts and not ( _amounts == 0) and int(_store) > 0 and int(_quantity) > 0: _amount = float(_amounts) / float(_quantity) arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 1 #issued elif self.r2.isChecked() and int(_store) > 0 and int(_quantity) > 0: _amount = float(_amounts) / float(_quantity) arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 2 #damaged elif self.r3.isChecked() and int(_store) > 0 and int(_quantity) > 0: arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 3 elif self.r4.isChecked() and int(_store) > 0 and int(_quantity) > 0: arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['quantity'] = _quantity arr['person'] = _person arr['period'] = _period arr['state'] = 4 elif self.r5.isChecked() and int(_store) > 0 and int(_quantity) > 0: _borrowed = self.hold_borrowed[self.borrowedData.currentIndex()] arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['quantity'] = _quantity arr['person'] = _person arr['period'] = _period arr['active'] = _borrowed arr['state'] = 5 ups = {} ups['id'] = self.editID if int(self.editID) > 0 and len(arr) > 0: db = 'school_stores' + str(_session) g = Db() g.update(db, arr, ups) if int(self.editID) > 0: self.button_reset() def button_reset(self): self.getQuantity() self.reloadTable(1) self.amountData.setText('') self.descriptionData.clear() self.tellerData.setText('') self.personData.setText('') self.periodData.setText('') self.quantityData.setText('') self.pb4.hide() self.pb5.hide() self.pb.show() self.editID = 0 self.button_clear() self.confirmSelection() self.reloadBorrowed() def button_clear(self): self.table.selectionModel().clearSelection() def button_click(self): _session = self.session _amounts = self.amountData.text() _teller = self.tellerData.text() _quantity = self.quantityData.text() _person = self.personData.text() _period = self.periodData.text() _date = self.dateData.date().toPyDate() _date = time.mktime(_date.timetuple()) _description = self.descriptionData.toPlainText() _store = self.hold_store[self.storeData.currentIndex()] arr = {} #recieved if self.r1.isChecked() and _amounts and not ( _amounts == 0) and int(_store) > 0 and int(_quantity) > 0: _amount = float(_amounts) / float(_quantity) arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 1 #issued elif self.r2.isChecked() and _amounts and not ( _amounts == 0) and int(_store) > 0 and int(_quantity) > 0: _amount = float(_amounts) / float(_quantity) arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 2 #damaged elif self.r3.isChecked() and int(_store) > 0 and int( float(_quantity)) > 0: arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['teller'] = _teller arr['quantity'] = _quantity arr['person'] = _person arr['state'] = 3 elif self.r4.isChecked() and int(_store) > 0 and int( float(_quantity)) > 0: arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['quantity'] = _quantity arr['person'] = _person arr['period'] = _period arr['state'] = 4 elif self.r5.isChecked() and int(_store) > 0 and int( float(_quantity)) > 0 and self.borrowedData.currentIndex() > 0: _borrowed = self.hold_borrowed[self.borrowedData.currentIndex()] arr['datepaid'] = _date arr['description'] = _description arr['itemID'] = _store arr['quantity'] = _quantity arr['person'] = _person arr['period'] = _period arr['active'] = _borrowed arr['state'] = 5 if len(arr) > 0: db = 'school_stores' + str(_session) g = Db() ins = g.insert(db, arr) if int(ins) > 0: self.button_reset()
class ThirdPart(QWizardPage): def __init__(self): super(ThirdPart, self).__init__() self.completed = False self.setTitle(u'第三方库设置') self.setSubTitle(u'需要设置的第三方库') rootLayout = QVBoxLayout() rootLayout.setContentsMargins(14, 20, 10, 20) self.tw_interface = QTableWidget(0, 3) headerLabels = QStringList() headerLabels.append(u'库名') headerLabels.append(u'库路径') headerLabels.append(u'打开') self.tw_interface.setHorizontalHeaderLabels(headerLabels) self.tw_interface.setSelectionBehavior(1) self.tw_interface.setRowCount(0) self.tw_interface.setColumnWidth(0, 200) self.tw_interface.setColumnWidth(1, 280) self.tw_interface.horizontalHeader().setStretchLastSection(True) self.mhlayout = QHBoxLayout() on_new_btn = QPushButton() on_new_btn.setText(u'添加类库') on_new_btn.clicked.connect(self.on_new) on_delete_btn = QPushButton() on_delete_btn.setText(u'删除类库') on_delete_btn.clicked.connect(self.on_delete) space = QSpacerItem(40, 28, QSizePolicy.Expanding) self.mhlayout.addSpacerItem(space) self.mhlayout.addWidget(on_new_btn) self.mhlayout.addWidget(on_delete_btn) rootLayout.addWidget(self.tw_interface) rootLayout.addLayout(self.mhlayout) self.setLayout(rootLayout) self.setStyleSheet(sheetstyle) self.alloneEnv = os.getenv('ALLONEDIR', '../..').replace('\\', '/') def on_new(self): rowIndex = self.tw_interface.rowCount() self.tw_interface.setRowCount(rowIndex + 1) ptn = self.add_button(rowIndex) self.tw_interface.setCellWidget(rowIndex, 2, ptn) def on_delete(self): rowIndex = self.tw_interface.currentRow() if rowIndex != -1: self.tw_interface.removeRow(rowIndex) def updateTable(self, id): filePath = QFileDialog.getOpenFileName(self, "请选择库", self.alloneEnv, "Library(*.lib)") if filePath.isEmpty(): return fileinfo = QFileInfo(filePath) libPath = fileinfo.absoluteDir().absolutePath() libName = fileinfo.baseName() # 支持选择文件后与系统ALLONEDIR比较一下变成相对路径 # 并且能够手动输入相对路径或包含$(ALLONEDIR)的相对路径 env = QString(os.getenv('ALLONEDIR', '../..').replace('\\', '/')) if env.endsWith('/'): env.remove(env.lastIndexOf('/'), 1) if libPath.contains(env): libPath.replace(env, QString('$$ALLONEDIR')) self.tw_interface.setItem(id, 1, QTableWidgetItem(libPath)) self.tw_interface.setItem(id, 0, QTableWidgetItem(libName)) def add_button(self, id): widget = QWidget() fileBtn = QPushButton() fileBtn.setText(u'浏览...') fileBtn.clicked.connect(lambda: self.updateTable(id)) hLayout = QHBoxLayout() hLayout.addWidget(fileBtn) hLayout.setAlignment(Qt.AlignHCenter) hLayout.setContentsMargins(0, 0, 0, 0) widget.setLayout(hLayout) return widget def initializePage(self): super(ThirdPart, self).initializePage() self.tw_interface.setRowCount(len(app.g_configurations.thirdpart_lib)) row = 0 for libinfo in app.g_configurations.thirdpart_lib: twitem0 = QTableWidgetItem(QString(libinfo["libname"])) twitem1 = QTableWidgetItem(QString(libinfo["libpath"])) self.tw_interface.setItem(row, 0, twitem0) self.tw_interface.setItem(row, 1, twitem1) ptn = self.add_button(row) self.tw_interface.setCellWidget(row, 2, ptn) row += 1 def validatePage(self): thirdpart_libs = [] if self.tw_interface.rowCount() > 0: for i in range(self.tw_interface.rowCount()): libinfo = {"libname": "", "libpath": ""} libname = self.tw_interface.item(i, 0).text() libpath = self.tw_interface.item(i, 1).text() #print unicode(libname) #print unicode(libpath) libinfo["libname"] = unicode(libname) libinfo["libpath"] = unicode(libpath) thirdpart_libs.append(libinfo) print thirdpart_libs app.g_configurations.thirdpart_lib = thirdpart_libs return True
def process(self, node): for idx in xrange(0, self.tabs.count()): widget = self.tabs.widget(idx) del widget self.tabs.clear() self.node = node file = self.node.open() tags = EXIF.process_file(file) if len(tags) == 0: self.nometa.setSizePolicy(self.tabs.sizePolicy()) self.tabs.hide() self.nometa.show() else: self.tabs.show() self.nometa.hide() sortedTags = {} for tag in tags.keys(): if tag not in ('JPEGThumbnail', 'TIFFThumbnail', 'Filename', 'EXIF MakerNote'): spaceidx = tag.find(" ") ifd = tag[:spaceidx].strip() if ifd == "Image": ifd = "IFD 0 (Image)" if ifd == "Thumbnail": ifd = "IFD 1 (Thumbnail)" key = tag[spaceidx:].strip() try: val = str(tags[tag]) except: val = "cannot be decoded" if ifd not in sortedTags.keys(): sortedTags[ifd] = [] sortedTags[ifd].append((key, val)) for ifd in sortedTags.keys(): table = QTableWidget(len(sortedTags[ifd]), 2) table.setShowGrid(False) table.setAlternatingRowColors(True) table.verticalHeader().hide() table.horizontalHeader().setClickable(False) table.horizontalHeader().setStretchLastSection(True) table.setHorizontalHeaderLabels(["Tag", "Value"]) table.setSelectionBehavior(QAbstractItemView.SelectRows) self.tabs.addTab(table, ifd) row = 0 for res in sortedTags[ifd]: key = QTableWidgetItem(res[0]) key.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) val = QTableWidgetItem(res[1]) val.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) table.setItem(row, 0, key) table.setItem(row, 1, val) row += 1 if 'JPEGThumbnail' in tags.keys(): label = QLabel() img = QImage() img.loadFromData(tags['JPEGThumbnail']) label.setPixmap(QPixmap.fromImage(img)) label.setAlignment(Qt.AlignCenter) self.tabs.addTab(label, "Embedded Thumbnail") if 'TIFFThumbnail' in tags.keys(): label = QLabel() img = QImage() img.loadFromData(tags['TIFFThumbnail']) label.setPixmap(QPixmap.fromImage(img)) label.setAlignment(Qt.AlignCenter) self.tabs.addTab(label, "Embedded Thumbnail") file.close()
class Widget(QWidget): def __init__(self, parent=None): super(Widget, self).__init__(parent) self.programLogic = ProgramLogic() self.uiLabelStep = QLabel('Step: 1') self.uiLabelComment = QLabel('Comment:') hboxLayout1 = QHBoxLayout() hboxLayout1.addWidget(self.uiLabelStep) hboxLayout1.addWidget(self.uiLabelComment) uiGroupBox1 = QGroupBox('Before teaching') self.uiDataBefore = QTableWidget() vboxLayoutGroupBox1 = QVBoxLayout() vboxLayoutGroupBox1.addWidget(self.uiDataBefore) uiGroupBox1.setLayout(vboxLayoutGroupBox1) self.uiOutputBefore = QLineEdit() self.uiOutputBefore.setReadOnly(True) self.uiCorrectBefore = QLineEdit() self.uiCorrectBefore.setReadOnly(True) self.uiErrorBefore = QLineEdit() self.uiErrorBefore.setReadOnly(True) hboxLayout2 = QHBoxLayout() hboxLayout2.addWidget(QLabel('Output')) hboxLayout2.addWidget(self.uiOutputBefore) hboxLayout2.addWidget(QLabel('Correct output')) hboxLayout2.addWidget(self.uiCorrectBefore) hboxLayout2.addWidget(QLabel('Error')) hboxLayout2.addWidget(self.uiErrorBefore) uiGroupBox2 = QGroupBox('After teaching') self.uiDataAfter = QTableWidget() vboxLayoutGroupBox2 = QVBoxLayout() vboxLayoutGroupBox2.addWidget(self.uiDataAfter) uiGroupBox2.setLayout(vboxLayoutGroupBox2) self.uiOutputAfter= QLineEdit() self.uiOutputAfter.setReadOnly(True) self.uiCorrectAfter = QLineEdit() self.uiCorrectAfter.setReadOnly(True) self.uiErrorAfter = QLineEdit() self.uiErrorAfter.setReadOnly(True) hboxLayout3 = QHBoxLayout() hboxLayout3.addWidget(QLabel('Output')) hboxLayout3.addWidget(self.uiOutputAfter) hboxLayout3.addWidget(QLabel('Correct output')) hboxLayout3.addWidget(self.uiCorrectAfter) hboxLayout3.addWidget(QLabel('Error')) hboxLayout3.addWidget(self.uiErrorAfter) uiButtonHelp = QPushButton('help') uiButtonHelp.setEnabled(False) uiButtonHelp.setToolTip('In this step, you will teach your neuron how to respond to the sample objects provided\n' + 'in the teaching set.\n\n' + 'On the top you can see an object that is currently learned by the euron (original inputs),\n' + 'as well as its normalized version (normalized inputs). To learn ore about the normalization,\n' + 'see the book. Also, in the "weights" row, you can see the values of all neuron inputs\n' + 'BEFORE teaching.\n\n' + 'In the bottom table, there are the weights AFTER teaching.\n\n' + 'Click "Teach more!" several times to make the neuron properly recognize the supplied\n' + 'objects. You can also start the teaching process from the beginning or customize the\n' + 'teaching ratio (see the book for details).') self.uiTeachingRatio = QDoubleSpinBox() self.uiTeachingRatio.setSingleStep(0.010) self.uiTeachingRatio.setValue(0.100) self.uiButtonHistory = QPushButton('History') self.uiButonRestart = QPushButton('Restart teaching') self.uiButtonTeachMore = QPushButton('Teach more!') hboxLayout4 = QHBoxLayout() hboxLayout4.addWidget(uiButtonHelp) hboxLayout4.addWidget(QLabel('Teaching ration')) hboxLayout4.addWidget(self.uiTeachingRatio) hboxLayout4.addWidget(self.uiButtonHistory) hboxLayout4.addWidget(self.uiButonRestart) hboxLayout4.addWidget(self.uiButtonTeachMore) vboxLaouyt = QVBoxLayout() vboxLaouyt.addWidget(QLabel('<b>Teaching</b>')) vboxLaouyt.addLayout(hboxLayout1) vboxLaouyt.addWidget(uiGroupBox1) vboxLaouyt.addLayout(hboxLayout2) vboxLaouyt.addWidget(uiGroupBox2) vboxLaouyt.addLayout(hboxLayout3) vboxLaouyt.addLayout(hboxLayout4) self.setLayout(vboxLaouyt) self.uiDataBefore.setRowCount(4) self.uiDataBefore.setColumnCount(self.programLogic.inputCount()) self.uiDataBefore.horizontalHeader().hide() self.uiDataBefore.setVerticalHeaderLabels([ 'Input number (i)', 'Original inputs (u(i))', 'Normalized inputs (x(i))', 'Weights (w(i))' ]) self.uiDataAfter.setRowCount(2) self.uiDataAfter.setColumnCount(self.programLogic.inputCount()) self.uiDataAfter.horizontalHeader().hide() self.uiDataAfter.setVerticalHeaderLabels(['Input number (i)', 'Weights (w(i))']) self.showResult() def showResult(self): for i in xrange(self.programLogic.inputCount()): itemInputNumber = QTableWidgetItem() itemInputNumber.setText(str(i + 1)) itemInputNumber.setTextAlignment(Qt.AlignCenter) itemInputNumber.setFlags(Qt.ItemIsEnabled) self.uiDataBefore.setItem(0, i, itemInputNumber) itemOriginalInputs = QTableWidgetItem() originalInput = self.programLogic.currentInputs()[i] itemOriginalInputs.setText(self.formatNumber(originalInput)) itemOriginalInputs.setTextAlignment(Qt.AlignCenter) itemOriginalInputs.setFlags(Qt.ItemIsEnabled) self.uiDataBefore.setItem(1, i, itemOriginalInputs) itemNormalizedInputs = QTableWidgetItem() itemNormalizedInputs.setText(self.formatNumber(self.programLogic.currentNormalizedInputs()[i])) itemNormalizedInputs.setTextAlignment(Qt.AlignCenter) itemNormalizedInputs.setFlags(Qt.ItemIsEnabled) self.uiDataBefore.setItem(2, i, itemNormalizedInputs) itemWeights = QTableWidgetItem() itemWeights.setText(self.formatNumber(self.programLogic.currentPrevWeights()[i])) itemWeights.setTextAlignment(Qt.AlignCenter) itemWeights.setFlags(Qt.ItemIsEnabled) self.uiDataBefore.setItem(3, i, itemWeights) self.uiLabelComment.setText('Comment: ' + self.programLogic.currentComment()) self.uiCorrectBefore.setText(str(self.programLogic.currentExpectedOutput())) def formatNumber(self, value): if 0 <= value: return '+%.3f' % value return '%.3f' % value
class RemoveSentencesDlg(QDialog): def __init__(self): super(RemoveSentencesDlg, self).__init__() self.removeList = {} self.initUI() def initUI(self): ## create a font type for the label fontLabel = QFont('SansSerif', 14) ## create a label self.label = QLabel(self) self.label.setAutoFillBackground(True) self.label.setAlignment(Qt.AlignCenter) self.label.setGeometry(QRect(200, 10, 400, 40)) self.label.setFont(fontLabel) ## set the text for the Label self.label.setText('Remove the Sentences') ## Create a Table to hold all the sentences self.sentenceTable = QTableWidget(self) ## set the size and the position of the table self.sentenceTable.setGeometry(QRect(10, 60, 800, 400)) ## set the column count for the table self.sentenceTable.setColumnCount(1) sentenceHeaderList = ['Sentences From Table'] self.sentenceTable.setHorizontalHeaderLabels(sentenceHeaderList) self.sentenceTable.resizeColumnsToContents() self.sentenceTable.horizontalHeader().setStretchLastSection(True) self.sentenceTable.verticalHeader().setStretchLastSection(True) # Create a Remove button self.removeButton = QPushButton('Remove', self) self.removeButton.move(350, 600) # Create a close button self.closeButton = QPushButton('Close', self) self.closeButton.move(450, 600) ## Create signal for the remove button self.connect(self.removeButton, SIGNAL("clicked()"), self.onRemoveClicked) ## Create signal for the close button self.connect(self.closeButton, SIGNAL("clicked()"), self.closeClicked) ## Create signal for the sentence table self.connect(self.sentenceTable, SIGNAL('cellClicked(int, int)'), self.sentenceStateChanged) ## Get sentences from the database table self.getSentencesFromDatabase() self.setGeometry(800, 800, 900, 650) def getSentencesFromDatabase(self): ## returns the sentence and the corresponding word associated with it self.twoTypeList = data.Data().getSentencesFromDatabase() if len(self.twoTypeList) == 2: self.sentenceList = self.twoTypeList[0] ## load the sentences in the Table Widget self.loadSentencesInTable() def loadSentencesInTable(self): self.col = 0 if len(self.sentenceList) > 0: self.sentenceTable.setRowCount(len(self.sentenceList)) cellList = [] ## Create QTableWidgetItems from the sentence list for sentence in self.sentenceList: item = QTableWidgetItem(QString(sentence)) item.setFlags(Qt.ItemFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)) item.setCheckState(Qt.Unchecked) cellList.append(item) cellList.reverse() # set the widget items in the table for item in range(0, len(self.sentenceList)): self.sentenceTable.setItem(item, self.col, cellList.pop()) for index in range(0, len(self.sentenceList)): self.sentenceTable.verticalHeader().resizeSection(index, 100) if len(self.sentenceList) == 5: self.sentenceTable.setFixedHeight(500) if len(self.sentenceList) == 4: self.sentenceTable.setFixedHeight(400) elif len(self.sentenceList) == 3: self.sentenceTable.setFixedHeight(300) elif len(self.sentenceList) == 2: self.sentenceTable.setFixedHeight(200) elif len(self.sentenceList) == 1: self.sentenceTable.setFixedHeight(100) else: self.sentenceTable.clearContents() def sentenceStateChanged(self, row, col): if (self.sentenceTable.item(row, col).checkState() == 2): self.removeList[row] = self.sentenceTable.item(row, col).text() self.sentenceTable.item(row, col).setFlags(Qt.ItemFlags(Qt.ItemIsEditable | Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)) else: self.sentenceTable.item(row,col).setFlags(Qt.ItemFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)) del self.removeList[row] def onRemoveClicked(self): if len(self.removeList) == 0: QMessageBox.information(self, 'Remove Sentences', 'Select the Sentences to Delete') else: reply = QMessageBox.question(self, 'Remove Sentences', 'You want to delete the selected sentences', QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: for sentence in self.removeList: if sentence in self.sentenceList: self.sentenceList.remove(sentence) ## clear the contents of the Table self.sentenceTable.clearContents() cellList = [] ## Add the new entries into the table for sentence in self.sentenceList: item = QTableWidgetItem(QString(sentence)) item.setFlags(Qt.ItemFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)) item.setCheckState(Qt.Unchecked) cellList.append(item) cellList.reverse() for index in range(0, len(self.sentenceList)): self.sentenceTable.setItem(index, self.col, cellList.pop()) self.sentenceTable.setRowCount(len(self.sentenceList)) deleteSentences = [] for sentence in self.removeList.values(): deleteSentences.append(sentence) rowsDeletec = data.Data().deleteSentencesFromDatabase(deleteSentences) self.getSentencesFromDatabase() self.removeList = {} def closeClicked(self): reply = QMessageBox.question(self, "Remove Sentences", "Do you want to close the application", QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: self.reject()
class PatternsTable(QWidget): def __init__(self): QWidget.__init__(self) self.grid = QGridLayout() self.setLayout(self.grid) self.patternArea() self.patternTable() def createPattern(self, name, x): label = name.lower() + "Label" type = name.lower() + "Type" entry = name.lower() + "Entry" setattr(self, label, QLabel(name)) setattr(self, entry, QLineEdit()) setattr(self, type, QComboBox()) labelobj = getattr(self, label) typeobj = getattr(self, type) entryobj = getattr(self, entry) typeobj.addItem("Hexadecimal") typeobj.addItem("String") self.grid.addWidget(labelobj, x, 0) self.grid.addWidget(entryobj, x, 1) self.grid.addWidget(typeobj, x, 2) def patternArea(self): self.filetypeLabel = QLabel("File type") self.filetype = QLineEdit() self.alignedLabel = QLabel("block aligned") self.aligned = QCheckBox() self.windowLabel = QLabel("Window size") self.window = QSpinBox() self.window.setSuffix(" bytes") self.window.setRange(0, 2500000) self.window.setSingleStep(100) self.addEntry = QPushButton("add") self.connect(self.addEntry, SIGNAL("clicked()"), self.insertPattern) self.grid.addWidget(self.filetypeLabel, 0, 0) self.grid.addWidget(self.filetype, 0, 1, 1, 2) self.createPattern("Header", 2) self.createPattern("Footer", 3) self.grid.addWidget(self.windowLabel, 4, 0) self.grid.addWidget(self.window, 4, 1) self.grid.addWidget(self.alignedLabel, 5, 0) self.grid.addWidget(self.aligned, 5, 1) self.grid.addWidget(self.addEntry, 6, 1) def patternTable(self): self.patterns = QTableWidget() self.patterns.setShowGrid(False) self.patterns.setColumnCount(5) self.patterns.setHorizontalHeaderLabels(["Filetype", "Header", "Footer", "Window", "Block aligned"]) self.patterns.horizontalHeader().setStretchLastSection(True) self.connect(self.patterns.verticalHeader(), SIGNAL("sectionClicked(int)"), self.patterns.removeRow) self.grid.addWidget(self.patterns, 7, 0, 1, 3) def warning(self, msg): msgBox = QMessageBox(self) msgBox.setText(msg) msgBox.setIcon(QMessageBox.Warning) msgBox.exec_() def validate(self, **kwargs): msg = "" if len(kwargs["type"]) == 0: msg = "Type must be defined" else: for i in kwargs["type"]: if i not in string.letters: msg = "Type's characters must be in the following set\n\n" + string.letters break rowCount = self.patterns.rowCount() for row in range(0, rowCount): if str(self.patterns.item(row, 0).text()) == kwargs["type"]: msg = "Type <" + kwargs["type"] + " > already defined" if msg != "": self.warning(msg) return False if kwargs["headerType"] == "Hexadecimal" and not self.isHex(kwargs["header"]): msg = "Header must be an even number of chars" self.warning(msg) return False if len(kwargs["header"]) == 0: msg = "Header must be provided" self.warning(msg) return False if kwargs["footerType"] == "Hexadecimal" and not self.isHex(kwargs["footer"]): msg = "Footer must be an even number of chars" self.warning(msg) return False if kwargs["window"] <= 0: msg = "Window size must be greater than 0" self.warning(msg) return False return True def insertPattern(self): filetype = str(self.filetype.text()) header = str(self.headerEntry.text()) headerType = str(self.headerType.currentText()) footer = str(self.footerEntry.text()) footerType = str(self.footerType.currentText()) window = self.window.text() aligned = self.aligned.isChecked() #Validate most of provided items kwargs = {"type": filetype, "header": header, "headerType": headerType, "footer": footer, "footerType": footerType, "window": int(window.replace(" bytes", ""))} if not self.validate(**kwargs): return filetypeItem = QTableWidgetItem(filetype) headerItem = QTableWidgetItem(header + " (" + headerType[0:3] + ")") footerItem = QTableWidgetItem(footer + " (" + footerType[0:3] + ")") windowItem = QTableWidgetItem(window) alignedItem = QTableWidgetItem(str(aligned)) self.patterns.insertRow(self.patterns.rowCount()) vertHeader = QTableWidgetItem(QIcon(":closetab.png"), "") row = self.patterns.rowCount() - 1 self.patterns.setVerticalHeaderItem(row, vertHeader) self.patterns.setItem(row, 0, filetypeItem) self.patterns.setItem(row, 1, headerItem) self.patterns.setItem(row, 2, footerItem) self.patterns.setItem(row, 3, windowItem) self.patterns.setItem(row, 4, alignedItem) self.patterns.resizeRowToContents(row) def isHex(self, hstr): HEXCHAR = "0123456789abcdefABCDEF" if len(hstr) % 2 != 0: return False even = False for i in range(len(hstr)): if hstr[i] not in HEXCHAR: return False return True def toHex(self, str): HEXCHAR = "0123456789abcdefABCDEF" hexStr = "" evenhex = "" for i in range(len(str)): if str[i] in HEXCHAR: if len(evenhex) == 1: hexStr += chr(int(evenhex+str[i], 16)) evenhex = "" else: evenhex = str[i] else: raise ValueError, "argument 'str' contains not valid characters" if len(evenhex) != 0: raise ValueError, "argument 'str' must be an even number of char" return hexStr def textToPattern(self, text): idx = text.find("(") pattern = "" if idx != -1: type = text[idx+1:idx+4] pattern = text[0:idx-1] if type == "Hex": pattern = self.toHex(pattern) return pattern def selectedItems(self): selected = {} rowCount = self.patterns.rowCount() for row in range(0, rowCount): filetype = str(self.patterns.item(row, 0).text()) selected[filetype] = [] pattern = [] pattern.append(self.textToPattern(str(self.patterns.item(row, 1).text()))) pattern.append(self.textToPattern(str(self.patterns.item(row, 2).text()))) pattern.append(int(self.patterns.item(row, 3).text().replace(" bytes", ""))) selected[filetype].append([pattern]) if self.patterns.item(row, 4).text() == "True": selected[filetype].append(True) else: selected[filetype].append(False) return selected
class AccessFrontend(ScrollArea): COMPONENT = 'access' LABEL = tr('Access to services') REQUIREMENTS = ('access',) STYLE_ALLOW = "color: white; background-color: white; border: none;" STYLE_DISALLOW = "color: lightGray; background-color: lightGray; border: none;" ICON = ':/icons/Acl.png' def __init__(self, client, parent): ScrollArea.__init__(self) self.client = client self.mainwindow = parent self._modified = False self.__disabled = False self.net_object = QNetObject.getInitializedInstance(self.client) if EDENWALL: self.vpn_object = QOpenVpnObject.getInstance() self.setupWidgets() self.getConfigs() self.getNetworks() # vpn_config is used to check if the VPN config changed or not self.vpn_config = self.getVPNConfig() self.fillTable() self.net_object.registerCallbacks(self.validateNetCfg, self.updateWithNetCfg) if EDENWALL: self.vpn_object.registerCallbacks(self.validateVpnCfg, self.updateWithVpnCfg) self.mainwindow.addToInfoArea(tr("Access interface enabled")) @staticmethod def get_calls(): """ services called at startup (self.mainwindow.init_call) """ return (('access', 'getConfig'),) def getVPNConfig(self): if not EDENWALL: return None vpn = self.vpn_object.getCfg() if not vpn: return None return (vpn.enabled, vpn.protocol, vpn.port, vpn.client_network) def setupWidgets(self): layout = QVBoxLayout(self) self.setLayout(layout) self.icon = QIcon() ALLOW = QPixmap(":/icons-20/status_on.png") self.icon.addPixmap(ALLOW, QIcon.Normal, QIcon.On) DISALLOW = QPixmap(":/icons-20/status_off.png") self.icon.addPixmap(DISALLOW, QIcon.Normal, QIcon.Off) title = QLabel(u"<H1>%s</H1>" % tr("Access to services")) layout.addWidget(title) self.table = QTableWidget() self.table.setSelectionMode(QAbstractItemView.NoSelection) layout.addWidget(self.table) def isModified(self): return self._modified def isValid(self): if self.__disabled: return True valid, errmsg = self.access_cfg.isValidWithMsg() if not valid: self.error_message = errmsg return valid def setModified(self, modif=True): if self.__disabled: self._modified = False return self._modified = modif if modif: self.mainwindow.setModified(self, True) def resetConf(self): if self.__disabled: return self.getConfigs() self.getNetworks() self.fillTable() def __disable(self, reason): if self.__disabled: return self.__disabled = True self.mainwindow.addToInfoArea( tr("The Access to services interface is disabled."), COLOR_ERROR) self.mainwindow.addToInfoArea(reason, COLOR_ERROR) self.close() raise NuConfModuleDisabled(reason) def getConfigs(self): if self.__disabled: return try: data = self.mainwindow.init_call('access', 'getConfig') except RpcdError: self.__disable(tr("Could not get Access to services configuration.")) return if data is None: self.access_cfg = AccessConf.defaultConf() else: self.access_cfg = AccessConf.deserialize(data) def _getNetworks(self, netcfg): return [(interface.system_name, network) for interface, network in netcfg.iterKnownNetworks()] def getNetworks(self): if self.__disabled: return netcfg = QNetObject.getInstance().netcfg if netcfg is None: self.networks = () self.mainwindow.addToInfoArea( tr("The access interface could not load the network configuration"), COLOR_ERROR ) return # list of (interface, network) where interface (str) is the system # name, and network (IPy.IP object) is the network address # (eg. IP('192.168.0.0/24') self.networks = self._getNetworks(netcfg) self.networks += list(self.access_cfg.custom_networks) self.networks.sort() def fillTable(self): if self.__disabled: self.table.clear() return services = list(self.access_cfg.permissions) self.table.clear() # (interface (str), network (IPy), ip version (int)) => row (int) # Don't use (interface, network) because of a bug in IPy < 0.70: # IP('0.0.0.0/0') and IP('::/0') are considered as equal self.net_to_row = {} component_to_name = ComponentToName() self.table.setSortingEnabled(False) self.table.setRowCount(len(self.networks)) self.setVerticalHeaders() self.table.setColumnCount(len(services)) self.table.setHorizontalHeaderLabels([component_to_name.display_name(service) for service in services]) self.table.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents) for irow, interface_network in enumerate(self.networks): self.setRow(interface_network, irow) for icol, service in enumerate(self.access_cfg.permissions): allow = interface_network in self.access_cfg.permissions[service] self.createService(irow, icol, service, interface_network, allow) def getRow(self, interface_network, pop=False): interface, network = interface_network key = (interface, network, network.version()) if pop: return self.net_to_row.pop(key) else: return self.net_to_row[key] def setRow(self, interface_network, row): interface, network = interface_network key = (interface, network, network.version()) self.net_to_row[key] = row def setVerticalHeaders(self): labels = [self.netLabel(interface, network) for interface, network in self.networks] self.table.setVerticalHeaderLabels(labels) def saveConf(self, message): data = self.access_cfg.serialize(downgrade=True) self.client.call("access", 'setConfig', message, data) self.setModified(False) def changeService(self, col, service, interface_network): row = self.getRow(interface_network) self.setModified(True) button = self.table.cellWidget(row, col) if button.isChecked(): self.access_cfg.permissions[service].add(interface_network) button.setStyleSheet(self.STYLE_ALLOW) else: try: self.access_cfg.permissions[service].remove(interface_network) except KeyError: pass button.setStyleSheet(self.STYLE_DISALLOW) def appendNetwork(self, interface_network, close_all_ports=False): row = self.table.rowCount() self.table.insertRow(row) self.networks.append(interface_network) self.setRow(interface_network, row) interface, network = interface_network for icol, service in enumerate(self.access_cfg.permissions): if (not close_all_ports) \ and (service in OPEN_BY_DEFAULT) \ and (network not in CLOSED_NETWORKS): allow = True self.access_cfg.permissions[service].add(interface_network) else: allow = interface_network in self.access_cfg.permissions[service] self.createService(row, icol, service, interface_network, allow) def removeNetwork(self, interface_network): index = self.getRow(interface_network, pop=True) self.table.removeRow(index) network = self.networks[index] for service, networks in self.access_cfg.permissions.iteritems(): try: networks.remove(network) except KeyError: pass del self.networks[index] for key, row in self.net_to_row.iteritems(): if row > index: self.net_to_row[key] -= 1 # callback used to update the table on network modification def updateWithNetCfg(self, deleted_nets, added_nets): if not(deleted_nets or added_nets): return # delete for key in deleted_nets: self.removeNetwork(key) # add new for interface_network in added_nets: self.appendNetwork(interface_network, close_all_ports=True) # modify and update self.setVerticalHeaders() self.setModified(True) def createService(self, row, col, service, interface_network, allow): button = QPushButton(self.icon, u'') button.setCheckable(True) button.setFlat(True) button.setAutoFillBackground(True) if allow: style = self.STYLE_ALLOW else: style = self.STYLE_DISALLOW button.setStyleSheet(style) button.setFocusPolicy(Qt.NoFocus) self.mainwindow.writeAccessNeeded(button) self.connect(button, SIGNAL('clicked()'), partial(self.changeService, col, service, interface_network)) self.table.setCellWidget(row, col, button) # with PyQt 4.4.2, table.setCellWidget(button) changes # the button's state (bug fixed in PyQt 4.4.4) button.setChecked(allow) # callback used when the networks are modified def validateNetCfg(self): netcfg = QNetObject.getInstance().netcfg previous_nets = set(self.networks) - set(self.access_cfg.custom_networks) new_networks = self._getNetworks(netcfg) new_networks = set(new_networks) not_in_both = previous_nets ^ new_networks deleted_nets = not_in_both & previous_nets added_nets = not_in_both & new_networks return True, deleted_nets, added_nets def validateVpnCfg(self): """ always accept modifications """ return True, self.getVPNConfig() def updateWithVpnCfg(self, new_config): if self.vpn_config == new_config: return # anything changed, access has to reapply the new config self.setModified() self.vpn_config = new_config # get old/new key config = self.vpn_object.getCfg() if self.access_cfg.custom_networks: old_key = self.access_cfg.custom_networks[0] else: old_key = None if config.enabled: network = config.client_network try: network = IP(network) except ValueError: # ignore invalid network: vpn check will raise an error return new_key = (OPENVPN_INTERFACE, network) else: new_key = None # no change? exit if old_key == new_key: return # create/delete vpn custom network if old_key: self.removeNetwork(old_key) if new_key: self.access_cfg.custom_networks = [new_key] self.appendNetwork(new_key) else: self.access_cfg.custom_networks = [] self.setVerticalHeaders() def netLabel(self, interface, network): """ return label for network """ interface_label = interface network_label = str(network) network = IP(network) netcfg = QNetObject.getInstance().netcfg try: interface = netcfg.getInterfaceBySystemName(interface) interface_label = interface.user_label network = netcfg.getNet(network) network_label = network.displayName() except NoMatch: pass return tr("%s: %s") % (interface_label, network_label)
class UpdateDialog(QDialog): def __init__(self, update_script): super(UpdateDialog, self).__init__(None, Qt.Window) self.updates_to_run = [] self.setWindowTitle("emzed updates") self.setWindowModality(Qt.WindowModal) self.setMinimumWidth(600) self.update_script = update_script self.setup_widgets() self.setup_layout() self.connect_signals() wd = QApplication.desktop().width() hd = QApplication.desktop().height() w = self.size().width() h = self.size().height() self.move((wd - w) / 2, (hd - h) / 2) def showEvent(self, evt): self.setCursor(Qt.WaitCursor) class WorkerThread(QThread): def run(self, script=self.update_script, parent=self): try: for method, args in script(parent.add_info_line, parent.add_update_info): self.emit(SIGNAL("execute_method(PyQt_PyObject, PyQt_PyObject)"), method, args) except: import traceback tb = traceback.format_exc() self.emit(SIGNAL("execute_method(PyQt_PyObject, PyQt_PyObject)"), parent.add_info_line, (tb,)) self.emit(SIGNAL("update_query_finished()")) self.t = WorkerThread() self.connect(self.t, SIGNAL("update_query_finished()"), self.start_to_interact) self.connect( self.t, SIGNAL("execute_method(PyQt_PyObject,PyQt_PyObject)"), self.execute_method) try: self.t.start() finally: self.setCursor(Qt.ArrowCursor) def execute_method(self, meth, args): meth(*args) def start_to_interact(self): self.ok_button.setEnabled(True) def setup_widgets(self): self.label_info = QLabel("updates from exchange folder:") self.info = QTextEdit(self) self.info.setReadOnly(1) self.label_updates = QLabel("updates from internet:") self.updates = QTableWidget(0, 3) self.updates.setHorizontalHeaderLabels(["updater", "info", "try updatde ?"]) self.updates.verticalHeader().hide() self.updates.horizontalHeader().setResizeMode(0, QHeaderView.Stretch) self.updates.horizontalHeader().setResizeMode(1, QHeaderView.Stretch) self.ok_button = QPushButton("OK") self.ok_button.setEnabled(False) def setup_layout(self): layout = QVBoxLayout() self.setLayout(layout) layout.addWidget(self.label_info) layout.addWidget(self.info) layout.addWidget(self.label_updates) layout.addWidget(self.updates) button_layout = QHBoxLayout() button_layout.addStretch() button_layout.addWidget(self.ok_button) layout.addLayout(button_layout) def connect_signals(self): self.connect(self.ok_button, SIGNAL("pressed()"), self.accept) def ok_button_pressed(self): self.info.append("hi") self.add_update_info("updater", "info") def _item(self, content, is_checkable): item = QTableWidgetItem(str(content)) if is_checkable: item.setCheckState(Qt.Unchecked) item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsSelectable) return item def add_update_info(self, updater_id, info, with_checkbox=True): i = self.updates.rowCount() self.updates.insertRow(i) self.updates.setItem(i, 0, self._item(updater_id, False)) self.updates.setItem(i, 1, self._item(info, False)) if True or with_checkbox: self.updates.setItem(i, 2, self._item("", True)) def add_info_line(self, txt): self.info.append(txt) def get_updates_to_run(self): return self.updates_to_run def accept(self): for i in range(self.updates.rowCount()): updater_id = str(self.updates.item(i, 0).text()) item = self.updates.item(i, 2) if item is not None: # some cells in column are empty checked = self.updates.item(i, 2).checkState() == Qt.Checked if checked: self.updates_to_run.append(updater_id) super(UpdateDialog, self).accept()
def __init__(self, parent=None): super(Window, self).__init__(parent) self.setWindowTitle("Battmon") # a figure instance to plot on self.figure = Figure() # this is the Canvas Widget that displays the `figure` # it takes the `figure` instance as a parameter to __init__ self.canvas = FigureCanvasQTAgg(self.figure) # this is the Navigation widget # it takes the Canvas widget and a parent self.toolbar = NavigationToolbar(self.canvas, self) # set the layout main_layout = QtGui.QHBoxLayout() graph_layout = QtGui.QVBoxLayout() self.info_layout = QtGui.QVBoxLayout() # sizing policies fixed_policy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) hpref_policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) vpref_policy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) states = get_battery_states() self.battery_widgets = {} for battery in sorted(states.keys()): battinfo_gbox = QtGui.QGroupBox("Battery: " + battery) battinfo_vbox = QtGui.QVBoxLayout() table = QTableWidget() table.setRowCount(len(BATTERY_DATA_FILES)) table.setColumnCount(2) table.verticalHeader().setVisible(False) table.horizontalHeader().setVisible(False) table.horizontalHeader().setResizeMode(QHeaderView.Stretch) table.verticalHeader().setResizeMode(QHeaderView.Stretch) table.setMinimumHeight(50) table.setSizePolicy(vpref_policy) battinfo_vbox.addWidget(table) progress = QtGui.QProgressBar(self) battinfo_vbox.addWidget(progress) progress.setSizePolicy(hpref_policy) progress.setFormat("%v%") self.battery_widgets[battery] = {} self.battery_widgets[battery]["table"] = table self.battery_widgets[battery]["progress"] = progress battinfo_gbox.setSizePolicy(vpref_policy) battinfo_gbox.setLayout(battinfo_vbox) self.info_layout.addWidget(battinfo_gbox) # Checkbox to select fields to graph fields_gbox = QtGui.QGroupBox("Show:") fields_hbox = QtGui.QHBoxLayout() self.capacity = QtGui.QCheckBox("Capacity") self.voltage = QtGui.QCheckBox("Voltage") self.energy = QtGui.QCheckBox("Energy") self.energy.clicked.connect(self.plot) self.voltage.clicked.connect(self.plot) self.capacity.clicked.connect(self.plot) fields_hbox.addWidget(self.capacity) fields_hbox.addWidget(self.energy) fields_hbox.addWidget(self.voltage) fields_gbox.setLayout(fields_hbox) fields_gbox.setSizePolicy(fixed_policy) graph_layout.addWidget(fields_gbox) # Radio buttons to restrict timeframe to graph timeframe_gbox = QtGui.QGroupBox("Time Frame:") timeframe_hbox = QtGui.QHBoxLayout() self.day = QtGui.QRadioButton("Day") self.week = QtGui.QRadioButton("Week") self.month = QtGui.QRadioButton("Month") self.all = QtGui.QRadioButton("All") self.day.clicked.connect(self.plot) self.week.clicked.connect(self.plot) self.month.clicked.connect(self.plot) self.all.clicked.connect(self.plot) timeframe_hbox.addWidget(self.day) timeframe_hbox.addWidget(self.week) timeframe_hbox.addWidget(self.month) timeframe_hbox.addWidget(self.all) timeframe_gbox.setLayout(timeframe_hbox) timeframe_gbox.setSizePolicy(fixed_policy) graph_layout.addWidget(timeframe_gbox) graph_layout.addWidget(self.toolbar) graph_layout.addWidget(self.canvas) main_layout.addLayout(self.info_layout) main_layout.addLayout(graph_layout) main_layout.addWidget(QtGui.QSizeGrip(self), 0, Qt.AlignBottom | Qt.AlignRight) self.setLayout(main_layout) # Default graph is week data self.week.setChecked(True) self.capacity.setChecked(True) self.energy.setChecked(True) self.voltage.setChecked(True) # populate initial data self.update() self.plot()
class LicenseFrontend(ScrollArea): COMPONENT = 'license' LABEL = tr('Activation keys') REQUIREMENTS = ('license',) ICON = ':/icons/add_new_key.png' def __init__(self, client, parent): ScrollArea.__init__(self) if not EDENWALL: message_area = MessageArea() message_area.critical( "nuFirewall", tr( "This EAS version does not support the Activation Key frontend but it seems that your appliance does. " "Please check if another EAS version is available." ) ) self.setWidget(message_area) return self.client = client self.mainwindow = parent self._modified = False self.error_message = '' self._not_modifying = True try: self.ID = self.client.call("license", 'getID') except RpcdError: self.__disable("Could not fetch activation key info") self.buildInterface() self.getValidLicenses() @staticmethod def get_calls(): """ services called by initial multicall """ return (("license", 'getID'),) def __disable(self, reason): self.mainwindow.addToInfoArea( tr("The activation key management interface is disabled."), COLOR_ERROR ) self.mainwindow.addToInfoArea( reason, COLOR_ERROR ) self.close() raise NuConfModuleDisabled(reason) def buildInterface(self): frame = QFrame() layout = QVBoxLayout(frame) self.setWidget(frame) self.setWidgetResizable(True) title = u'<h1>%s</h1>' % self.tr('EdenWall activation keys') layout.addWidget(QLabel(title)) sn = "<strong>%s</strong>" % self.ID self.IDLabel = QLabel(tr('This appliance serial number is %s.') % sn) self.IDLabel.setTextInteractionFlags( Qt.TextSelectableByKeyboard | Qt.TextSelectableByMouse) sendLicenseButton = NuConfPageKit.createButton( tr('Upload an activation key'), frame, self.mainwindow, self.chooseAndSendFile, QIcon(":/icons/up")) self.mainwindow.writeAccessNeeded(sendLicenseButton) self.table = QTableWidget(0, 4, frame) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.table.setSelectionMode(QAbstractItemView.NoSelection) self.table.horizontalHeader().setStretchLastSection(True) self.table.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents) self.table.setHorizontalHeaderLabels([ unicode(translate('MainWindow', 'Activation key owner')), unicode(translate('MainWindow', 'Valid until')), unicode(translate('MainWindow', 'Days left')), unicode(translate('MainWindow', 'Type'))]) for widget in (self.IDLabel, sendLicenseButton, self.table): layout.addWidget(widget) layout.addStretch(100) def developOptions(self, licenses): """Return a list of licenses with only one option each.""" developpedOptions = [] for license in licenses: for option in license[INDEX_OPTION].split(): developpedOption = license[:] developpedOption[INDEX_OPTION] = option if option == DPI_OPTION_NAME: developpedOption[INDEX_VALIDITY] = "unlimited" developpedOption[INDEX_DAYS_LEFT] = "" developpedOptions.append(developpedOption) return developpedOptions def getValidLicenses(self): """Display valid licenses in the table.""" try: licenses = self.client.call("license", 'getValidLicenses') except RpcdError, err: licenses = [] self.mainwindow.addToInfoArea(exceptionAsUnicode(err), category=COLOR_CRITICAL) developpedOptions = self.developOptions(licenses) self.table.setRowCount(len(developpedOptions)) for row, developpedOption in enumerate(developpedOptions): for col, item in enumerate(developpedOption): if col == INDEX_DAYS_LEFT: self.table.setItem(row, col, NumberItem(unicode(item))) else: self.table.setItem(row, col, QTableWidgetItem(option_decode(unicode(item))))
class ActionEditorDialog(QWidget): # Redefine the tr() function for this class. def tr(self, text): return qApp.translate("ActionEditorDialog", text) def __init__(self, actions, parent=None): super(ActionEditorDialog, self).__init__(parent) self.actions = actions help = QLabel(translate("Shortcut Settings", '<b>Double click a cell in the Shortcut Column' \ ' to <br />modify the key sequence.</b>')) self.actionTable = QTableWidget(self) self.actionTable.setSelectionBehavior(QTableWidget.SelectRows) self.actionTable.setEditTriggers(QTableWidget.DoubleClicked) self.actionTable.setColumnCount(2) self.actionTable.setHorizontalHeaderLabels( [translate("Shortcut Settings", "Description"), translate("Shortcut Settings", "Shortcut")] ) self.actionTable.horizontalHeader().setStretchLastSection(True) self.actionTable.verticalHeader().hide() self.actionTable.setItemDelegate(ActionEditorDelegate(self)) self.connect(self.actionTable, SIGNAL("cellChanged(int, int)"), self.validateAction) row = 0 for action in self.actions: if action.text().isEmpty(): continue self.actionTable.insertRow(self.actionTable.rowCount()) item = QTableWidgetItem() item.setText(action.text()) item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) self.actionTable.setItem(row, 0, item) item = QTableWidgetItem() item.setText(action.shortcut().toString()) item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsSelectable) item.oldShortcutText = item.text() self.actionTable.setItem(row, 1, item) row += 1 self.actionTable.resizeColumnsToContents() mainLayout = QVBoxLayout() mainLayout.addWidget(help) mainLayout.setMargin(8) mainLayout.setSpacing(8) mainLayout.addWidget(self.actionTable) self.setLayout(mainLayout) self._model = self.actionTable.model() self._model.edited = False self.actionTable.model().edited = False self.setWindowTitle(translate("Shortcut Settings", "Edit Shortcuts")) def applySettings(self, control=None): if not self._model.edited: return row = 0 for action in self.actions: if not action.text().isEmpty(): action.setText(self.actionTable.item(row, 0).text()) action.setShortcut(QKeySequence(self.actionTable.item(row, 1).text())) row += 1 self.saveSettings(self.actions) self._model.edited = False def _loadSettings(self, actions): cparser = PuddleConfig(os.path.join(CONFIGDIR, 'user_shortcuts')) for action in actions: shortcut = cparser.get('shortcuts', unicode(action.text()), '') if shortcut: action.setShortcut(QKeySequence(shortcut)) _loadSettings = classmethod(_loadSettings) def saveSettings(self, actions): cparser = PuddleConfig(os.path.join(CONFIGDIR, 'user_shortcuts')) for action in actions: shortcut = unicode(action.shortcut().toString()) cparser.set('shortcuts', unicode(action.text()), shortcut) saveSettings = classmethod(saveSettings) def validateAction(self, row, column): if column != 1: return item = self.actionTable.item(row, column) shortcutText = QKeySequence(item.text()).toString() thisRow = self.actionTable.row(item) if not shortcutText.isEmpty(): for row in range(self.actionTable.rowCount()): if row == thisRow: continue other = self.actionTable.item(row, 1) if other.text() == shortcutText: other.setText(item.oldShortcutText) break item.setText(shortcutText) item.oldShortcutText = shortcutText self.actionTable.resizeColumnToContents(1)
def process(self, node): for idx in xrange(0, self.tabs.count()): widget = self.tabs.widget(idx) del widget self.tabs.clear() self.node = node file = self.node.open() tags = EXIF.process_file(file) if len(tags) == 0: self.nometa.setSizePolicy(self.tabs.sizePolicy()) self.tabs.hide() self.nometa.show() else: self.tabs.show() self.nometa.hide() sortedTags = {} for tag in tags.keys(): if tag not in ('JPEGThumbnail', 'TIFFThumbnail', 'Filename', 'EXIF MakerNote'): spaceidx = tag.find(" ") ifd = tag[:spaceidx].strip() if ifd == "Image": ifd = "IFD 0 (Image)" if ifd == "Thumbnail": ifd = "IFD 1 (Thumbnail)" key = tag[spaceidx:].strip() try: val = str(tags[tag]) except: val = "cannot be decoded" if ifd not in sortedTags.keys(): sortedTags[ifd] = [] sortedTags[ifd].append((key, val)) for ifd in sortedTags.keys(): table = QTableWidget(len(sortedTags[ifd]), 2) table.setShowGrid(False) table.setAlternatingRowColors(True) table.verticalHeader().hide() table.horizontalHeader().setClickable(False) table.horizontalHeader().setStretchLastSection(True) table.setHorizontalHeaderLabels(["Tag", "Value"]) table.setSelectionBehavior(QAbstractItemView.SelectRows) self.tabs.addTab(table, ifd) row = 0 for res in sortedTags[ifd]: key = QTableWidgetItem(res[0]) key.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled) val = QTableWidgetItem(res[1]) val.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled) table.setItem(row, 0, key) table.setItem(row, 1, val) row += 1 if 'JPEGThumbnail' in tags.keys(): label = QLabel() img = QImage() img.loadFromData(tags['JPEGThumbnail']) label.setPixmap(QPixmap.fromImage(img)) label.setAlignment(Qt.AlignCenter) self.tabs.addTab(label, "Embedded Thumbnail") if 'TIFFThumbnail' in tags.keys(): label = QLabel() img = QImage() img.loadFromData(tags['TIFFThumbnail']) label.setPixmap(QPixmap.fromImage(img)) label.setAlignment(Qt.AlignCenter) self.tabs.addTab(label, "Embedded Thumbnail") file.close()
class ModiaWindow(QMainWindow): CursorLocation = Enum([ 'WINDOW_LEFT', 'WINDOW_RIGHT', 'WINDOW_TOP', 'WINDOW_BOTTOM', 'WINDOW_LEFT_TOP', 'WINDOW_RIGHT_TOP', 'WINDOW_LEFT_BOTTOM', 'WINDOW_RIGHT_BOTTOM', 'WINDOW_TITLE_BAR', 'SCREEN_LEFT', 'SCREEN_RIGHT', 'SCREEN_TOP' ]) StickType = Enum(['LEFT', 'RIGHT', 'FULL_SCREEN']) def __init__(self, parent=None): super(ModiaWindow, self).__init__(parent) self.__pic_bg = QPixmap(':resource') self.WIDTH_MIN = 721 self.HEIGHT_MIN = 500 self.WIDTH_DEFAULT = 721 self.HEIGHT_DEFAULT = 599 self.WIDTH_BORDER_TOP = 28 self.WIDTH_BORDER_RIGHT = 12 self.WIDTH_BORDER_BOTTOM = 14 self.WIDTH_BORDER_LEFT = 12 self.OFFSET_BORDER_TOP = 6 self.OFFSET_BORDER_RIGHT = 8 self.OFFSET_BORDER_BOTTOM = 10 self.OFFSET_BORDER_LEFT = 8 self.WIDTH_FRAME_LEFT = 360 self.__cursor_loc = None self.__is_fixed_size = False self.__is_fixed_width = False self.__is_fixed_height = False self.__is_maximized = False self.__is_zdt = False self.__is_sticking = False self.__is_sticked = False self.__lyric_shown = True self.__is_suspended = True self.__move_point = None self.__cursor_changed = False self.__mouse_pressed = False self.__window_resizing = False self.__setup_ui() self.__geometry_frame = self.geometry() self.__register_actions() self.__audio_manager = AudioManager(self, self.lyric_panel) def __setup_ui(self): self.setWindowTitle(QApplication.applicationName()) self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowMinMaxButtonsHint) self.setWindowModality(Qt.WindowModal) self.setAttribute(Qt.WA_TranslucentBackground) self.setMouseTracking(True) self.setAnimated(True) self.setMinimumSize( self.WIDTH_MIN + self.OFFSET_BORDER_RIGHT + self.OFFSET_BORDER_LEFT, self.HEIGHT_MIN + self.OFFSET_BORDER_TOP + self.OFFSET_BORDER_BOTTOM) self.resize( self.WIDTH_DEFAULT + self.OFFSET_BORDER_RIGHT + self.OFFSET_BORDER_LEFT, self.HEIGHT_DEFAULT + self.OFFSET_BORDER_TOP + self.OFFSET_BORDER_BOTTOM) self.setWindowIcon(QIcon(':logo')) # Title bar initialization start. self.__btn_title_close = MButton(self, MButton.Type.Close) self.__btn_title_close.setGeometry(14, 11, 12, 13) self.__btn_title_close.setToolTip('退出') self.__btn_title_maximize = MButton(self, MButton.Type.Maximize) self.__btn_title_maximize.setGeometry(self.__btn_title_close.x() + 16, 11, 12, 13) self.__btn_title_maximize.setToolTip('最大化') self.__btn_title_minimize = MButton(self, MButton.Type.Minimize) self.__btn_title_minimize.setGeometry( self.__btn_title_maximize.x() + 16, 11, 12, 13) self.__btn_title_minimize.setToolTip('最小化') self.frame = MFrame(self) horizontal_layout = QHBoxLayout(self.frame) horizontal_layout.setContentsMargins(0, 0, 4, 0) horizontal_layout.setSpacing(5) # Left panel initialization start. frame_main_panel = MFrame(self.frame) size_policy_v_expand = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding) size_policy_v_expand.setHorizontalStretch(0) size_policy_v_expand.setVerticalStretch(0) size_policy_v_expand.setHeightForWidth( frame_main_panel.sizePolicy().hasHeightForWidth()) frame_main_panel.setSizePolicy(size_policy_v_expand) frame_main_panel.setMinimumSize(self.WIDTH_FRAME_LEFT, 0) horizontal_layout.addWidget(frame_main_panel) verticalLayout = QVBoxLayout(frame_main_panel) verticalLayout.setContentsMargins(0, 0, 0, 0) verticalLayout.setSpacing(0) self.__action_bar = MActionBar(frame_main_panel) size_policy_h_expand = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) size_policy_h_expand.setHorizontalStretch(0) size_policy_h_expand.setVerticalStretch(0) size_policy_h_expand.setHeightForWidth( self.__action_bar.sizePolicy().hasHeightForWidth()) self.__action_bar.setSizePolicy(size_policy_h_expand) self.__action_bar.setMinimumSize(0, 136) verticalLayout.addWidget(self.__action_bar) frame_music_list = MFrame(frame_main_panel) size_policy_all_expand = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) size_policy_all_expand.setHorizontalStretch(0) size_policy_all_expand.setVerticalStretch(0) size_policy_all_expand.setHeightForWidth( frame_music_list.sizePolicy().hasHeightForWidth()) frame_music_list.setSizePolicy(size_policy_all_expand) verticalLayout.addWidget(frame_music_list) gridLayout = QGridLayout(frame_music_list) gridLayout.setContentsMargins(9, 2, 9, 5) self.__music_table = QTableWidget(0, 2, frame_music_list) self.__music_table.setFrameShape(QFrame.StyledPanel) self.__music_table.setHorizontalHeaderLabels(('标题', '时长')) self.__music_table.setSelectionMode(QAbstractItemView.SingleSelection) self.__music_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.__music_table.horizontalHeader().setVisible(False) self.__music_table.verticalHeader().setVisible(False) self.__music_table.setColumnWidth(0, 290) self.__music_table.setColumnWidth(1, 50) MStyleSetter.setStyle(self.__music_table, ':qss_tbl_music_list') gridLayout.addWidget(self.__music_table, 0, 0, 1, 1) # Lyric panel initialization start. self.lyric_panel = MLyricPanel(self.frame) size_policy_all_expand.setHeightForWidth( self.lyric_panel.sizePolicy().hasHeightForWidth()) self.lyric_panel.setSizePolicy(size_policy_all_expand) horizontal_layout.addWidget(self.lyric_panel) def __register_actions(self): QObject.connect(self.__btn_title_close, SIGNAL('clicked()'), self, SLOT('close()')) QObject.connect(self.__btn_title_maximize, SIGNAL('clicked()'), self, SLOT('showMaximized()')) QObject.connect(self.__btn_title_minimize, SIGNAL('clicked()'), self, SLOT('showMinimized()')) QObject.connect(self.__action_bar.get_widget('BTN_PREVIOUS'), SIGNAL('clicked()'), self, SLOT('__previous()')) QObject.connect(self.__action_bar.get_widget('BTN_NEXT'), SIGNAL('clicked()'), self, SLOT('__next()')) QObject.connect(self.__action_bar.get_widget('BTN_PLAY_PAUSE'), SIGNAL('clicked()'), self, SLOT('__play_pause()')) QObject.connect(self.__action_bar.get_widget('BTN_STOP'), SIGNAL('clicked()'), self, SLOT('__stop()')) QObject.connect(self.__action_bar.get_widget('BTN_LYRIC'), SIGNAL('clicked()'), self, SLOT('__show_hide_lyric()')) QObject.connect(self.__action_bar.get_widget('BTN_ADD_MUSIC'), SIGNAL('clicked()'), self, SLOT('__add_music()')) self.__music_table.cellDoubleClicked.connect( self.__cell_double_clicked) @pyqtSlot() def __previous(self): self.__audio_manager.previous() @pyqtSlot() def __next(self): self.__audio_manager.next() @pyqtSlot() def __play_pause(self): if self.__is_suspended: self.__audio_manager.play() else: self.__audio_manager.pause() @pyqtSlot() def __stop(self): self.__audio_manager.stop() def __cell_double_clicked(self, row, column): self.__stop() self.__audio_manager.clearQueue() self.__audio_manager.setCurrentSourceByIndex(row) if self.__audio_manager.getMediaObjectState() == Phonon.PlayingState: self.__audio_manager.stop() else: self.__audio_manager.play() @pyqtSlot() def __show_hide_lyric(self): if self.__lyric_shown: self.__action_bar.get_widget('BTN_LYRIC').setMStyle( MButton.Type.Show_Lyric) self.__geometry_frame = self.geometry() self.setMinimumSize( 360, self.HEIGHT_MIN + self.OFFSET_BORDER_TOP + self.OFFSET_BORDER_BOTTOM) self.resize(376, self.height()) self.__is_fixed_size = True else: self.__action_bar.get_widget('BTN_LYRIC').setMStyle( MButton.Type.Hide_Lyric) self.resize(self.__geometry_frame.width(), self.__geometry_frame.height()) self.setMinimumSize( self.WIDTH_MIN + self.OFFSET_BORDER_RIGHT + self.OFFSET_BORDER_LEFT, self.HEIGHT_MIN + self.OFFSET_BORDER_TOP + self.OFFSET_BORDER_BOTTOM) self.__is_fixed_size = False self.__lyric_shown = not self.__lyric_shown @pyqtSlot() def __add_music(self): self.__audio_manager.addMusic() def getActionBar(self): return self.__action_bar def getMusicTable(self): return self.__music_table def __get_cursor_location(self, event): if event.globalX() == 0: return self.CursorLocation.SCREEN_LEFT if QApplication.desktop().screenGeometry().width() - event.globalX( ) == 1: return self.CursorLocation.SCREEN_RIGHT if event.globalY() == 0: return self.CursorLocation.SCREEN_TOP if event.pos().y( ) < 27 and event.pos().y() - 2 > self.OFFSET_BORDER_TOP and event.pos( ).x() + self.OFFSET_BORDER_RIGHT < self.width( ) and event.pos().x() + 1 > self.OFFSET_BORDER_LEFT: return self.CursorLocation.WINDOW_TITLE_BAR permissible_var = 2 if event.pos().x( ) + permissible_var >= self.OFFSET_BORDER_LEFT and event.pos().x( ) - permissible_var <= self.OFFSET_BORDER_LEFT: if event.pos().y( ) + self.OFFSET_BORDER_BOTTOM + permissible_var >= self.rect( ).bottom() and event.pos().y( ) + self.OFFSET_BORDER_BOTTOM - permissible_var <= self.rect( ).bottom(): return self.CursorLocation.WINDOW_LEFT_BOTTOM if event.pos().y( ) + permissible_var >= self.OFFSET_BORDER_TOP and event.pos().y( ) - permissible_var <= self.OFFSET_BORDER_TOP: return self.CursorLocation.WINDOW_LEFT_TOP return self.CursorLocation.WINDOW_LEFT if event.pos().x( ) + self.OFFSET_BORDER_RIGHT + permissible_var >= self.rect().right( ) and event.pos().x( ) + self.OFFSET_BORDER_RIGHT - permissible_var <= self.rect().right(): if event.pos().y( ) + self.OFFSET_BORDER_BOTTOM + permissible_var >= self.rect( ).bottom() and event.pos().y( ) + self.OFFSET_BORDER_BOTTOM - permissible_var <= self.rect( ).bottom(): return self.CursorLocation.WINDOW_RIGHT_BOTTOM if event.pos().y( ) + permissible_var >= self.OFFSET_BORDER_TOP and event.pos().y( ) - permissible_var <= self.OFFSET_BORDER_TOP: return self.CursorLocation.WINDOW_RIGHT_TOP return self.CursorLocation.WINDOW_RIGHT if event.pos().y( ) + permissible_var >= self.OFFSET_BORDER_TOP and event.pos().y( ) - permissible_var <= self.OFFSET_BORDER_TOP: return self.CursorLocation.WINDOW_TOP if event.pos().y( ) + self.OFFSET_BORDER_BOTTOM + permissible_var >= self.rect().bottom( ) and event.pos().y( ) + self.OFFSET_BORDER_BOTTOM - permissible_var <= self.rect().bottom( ): return self.CursorLocation.WINDOW_BOTTOM return -1 def __set_cursor_shape(self, flag): if self.__is_fixed_size: return if flag == self.CursorLocation.WINDOW_LEFT or flag == self.CursorLocation.WINDOW_RIGHT: if self.__is_fixed_width: self.setCursor(Qt.ArrowCursor) return False self.setCursor(Qt.SizeHorCursor) return True if flag == self.CursorLocation.WINDOW_TOP or flag == self.CursorLocation.WINDOW_BOTTOM: if self.__is_fixed_height: self.setCursor(Qt.ArrowCursor) return False self.setCursor(Qt.SizeVerCursor) return True if self.__is_fixed_width or self.__is_fixed_height: self.setCursor(Qt.ArrowCursor) return False if flag == self.CursorLocation.WINDOW_LEFT_TOP or flag == self.CursorLocation.WINDOW_RIGHT_BOTTOM: self.setCursor(Qt.SizeFDiagCursor) return True if flag == self.CursorLocation.WINDOW_RIGHT_TOP or flag == self.CursorLocation.WINDOW_LEFT_BOTTOM: self.setCursor(Qt.SizeBDiagCursor) return True self.setCursor(Qt.ArrowCursor) return False def __change_window_size(self, flag, pos_global): pos_global = self.mapToParent(pos_global) global_x = pos_global.x() - self.OFFSET_BORDER_LEFT global_y = pos_global.y() - self.OFFSET_BORDER_TOP widget_x = self.pos().x() widget_y = self.pos().y() length_l = widget_x + self.width() - global_x length_r = global_x - widget_x + 1 + self.OFFSET_BORDER_RIGHT + self.OFFSET_BORDER_LEFT length_t = widget_y + self.height() - global_y length_b = global_y - widget_y + 1 + self.OFFSET_BORDER_TOP + self.OFFSET_BORDER_BOTTOM if length_l <= self.WIDTH_MIN: global_x = self.pos().x() if length_t <= self.HEIGHT_MIN: global_y = self.pos().y() if flag == self.CursorLocation.WINDOW_LEFT: self.setGeometry(global_x, widget_y, length_l, self.height()) self.__geometry_frame = self.geometry() return if flag == self.CursorLocation.WINDOW_RIGHT: self.setGeometry(widget_x, widget_y, length_r, self.height()) self.__geometry_frame = self.geometry() return if flag == self.CursorLocation.WINDOW_TOP: self.setGeometry(widget_x, global_y, self.width(), length_t) self.__geometry_frame = self.geometry() return if flag == self.CursorLocation.WINDOW_BOTTOM: self.setGeometry(widget_x, widget_y, self.width(), length_b) self.__geometry_frame = self.geometry() return if flag == self.CursorLocation.WINDOW_LEFT_TOP: self.setGeometry(global_x, global_y, length_l, length_t) self.__geometry_frame = self.geometry() return if flag == self.CursorLocation.WINDOW_LEFT_BOTTOM: self.setGeometry(global_x, widget_y, length_l, length_b) self.__geometry_frame = self.geometry() return if flag == self.CursorLocation.WINDOW_RIGHT_TOP: self.setGeometry(widget_x, global_y, length_r, length_t) self.__geometry_frame = self.geometry() return if flag == self.CursorLocation.WINDOW_RIGHT_BOTTOM: self.setGeometry(widget_x, widget_y, length_r, length_b) self.__geometry_frame = self.geometry() return def __switch_max_button(self, b_style): self.__btn_title_maximize.setMStyle(b_style) if b_style == MButton.Type.Maximize: self.__btn_title_maximize.setToolTip('最大化') return if b_style == MButton.Type.Restore: self.__btn_title_maximize.setToolTip('向下还原') return def __window_stick_to(self, s_type): if self.__is_sticking: return if s_type == self.StickType.LEFT: geometry_tgt = QRect( -self.OFFSET_BORDER_LEFT, -self.OFFSET_BORDER_TOP, QApplication.desktop().screenGeometry().width() / 2 + self.OFFSET_BORDER_LEFT + self.OFFSET_BORDER_RIGHT, QApplication.desktop().availableGeometry().height() + self.OFFSET_BORDER_TOP + self.OFFSET_BORDER_BOTTOM) if self.geometry() != geometry_tgt: self.setGeometry(geometry_tgt) self.__is_sticking = True return if s_type == self.StickType.RIGHT: geometry_tgt = QRect( QApplication.desktop().screenGeometry().width() / 2 - self.OFFSET_BORDER_LEFT, -self.OFFSET_BORDER_TOP, QApplication.desktop().screenGeometry().width() / 2 + self.OFFSET_BORDER_LEFT + self.OFFSET_BORDER_RIGHT, QApplication.desktop().availableGeometry().height() + self.OFFSET_BORDER_TOP + self.OFFSET_BORDER_BOTTOM) if self.geometry() != geometry_tgt: self.setGeometry(geometry_tgt) self.__is_sticking = True return if s_type == self.StickType.FULL_SCREEN: self.setGeometry( -self.OFFSET_BORDER_LEFT, -self.OFFSET_BORDER_TOP, QApplication.desktop().availableGeometry().width() + self.OFFSET_BORDER_RIGHT + self.OFFSET_BORDER_LEFT, QApplication.desktop().availableGeometry().height() + self.OFFSET_BORDER_TOP + self.OFFSET_BORDER_BOTTOM) self.__is_sticking = True return def paintEvent(self, *args, **kwargs): painter = QPainter(self) painter.drawPixmap(0, 0, 12, self.WIDTH_BORDER_TOP, self.__pic_bg, 0, 0, 12, self.WIDTH_BORDER_TOP) painter.drawPixmap( self.WIDTH_BORDER_LEFT, 0, self.width() - self.WIDTH_BORDER_RIGHT - self.WIDTH_BORDER_LEFT, self.WIDTH_BORDER_TOP, self.__pic_bg, 12, 0, 1, self.WIDTH_BORDER_TOP) painter.drawPixmap(self.width() - self.WIDTH_BORDER_RIGHT, 0, self.__pic_bg, 13, 0, 12, self.WIDTH_BORDER_TOP) painter.drawPixmap(0, self.height() - self.WIDTH_BORDER_BOTTOM, self.__pic_bg, 0, 90, 12, 14) painter.drawPixmap( 0, self.WIDTH_BORDER_TOP, self.WIDTH_BORDER_LEFT, self.height() - self.WIDTH_BORDER_BOTTOM - self.WIDTH_BORDER_TOP, self.__pic_bg, 0, 89, 12, 1) painter.drawPixmap( self.width() - self.WIDTH_BORDER_RIGHT, self.WIDTH_BORDER_TOP, self.WIDTH_BORDER_LEFT, self.height() - self.WIDTH_BORDER_BOTTOM - self.WIDTH_BORDER_TOP, self.__pic_bg, 13, 89, 12, 1) painter.drawPixmap( self.WIDTH_BORDER_LEFT, self.height() - self.WIDTH_BORDER_BOTTOM, self.width() - self.WIDTH_BORDER_RIGHT - self.WIDTH_BORDER_LEFT, self.WIDTH_BORDER_BOTTOM, self.__pic_bg, 12, 90, 1, 14) painter.drawPixmap(self.width() - self.WIDTH_BORDER_RIGHT, self.height() - self.WIDTH_BORDER_BOTTOM, self.__pic_bg, 13, 90, 12, 14) painter.fillRect( self.WIDTH_BORDER_LEFT - 4, self.WIDTH_BORDER_TOP, self.width() - self.WIDTH_BORDER_LEFT - self.WIDTH_BORDER_RIGHT + 8, self.height() - self.WIDTH_BORDER_BOTTOM - self.WIDTH_BORDER_TOP, QBrush(QColor(255, 255, 255))) painter.setFont(QFont('Microsoft Yahei', 8, QFont.Bold)) painter.setPen(QColor(250, 250, 250, 220)) painter.drawText(1, 5, self.width(), 27, Qt.AlignHCenter | Qt.AlignVCenter, self.windowTitle()) painter.setPen(QColor(50, 50, 50, 255)) painter.drawText(0, 4, self.width(), 27, Qt.AlignHCenter | Qt.AlignVCenter, self.windowTitle()) painter.setPen(QColor(142, 142, 142, 255)) if self.width() > 380: painter.drawLine(self.WIDTH_FRAME_LEFT + self.OFFSET_BORDER_LEFT, self.OFFSET_BORDER_TOP + 22, self.WIDTH_FRAME_LEFT + self.OFFSET_BORDER_LEFT, self.height() - self.OFFSET_BORDER_BOTTOM - 1) @pyqtSlot() def showMaximized(self): if self.__is_sticked: return if self.__is_maximized: self.setGeometry(self.__geometry_frame) self.__switch_max_button(MButton.Type.Maximize) self.__is_maximized = False else: self.__geometry_frame = self.geometry() self.__window_stick_to(self.StickType.FULL_SCREEN) self.__switch_max_button(MButton.Type.Restore) self.__is_maximized = True def mouseDoubleClickEvent(self, event): if event.button() != Qt.LeftButton: return if self.__get_cursor_location( event) == self.CursorLocation.WINDOW_TITLE_BAR: self.showMaximized() def mousePressEvent(self, event): if event.button() != Qt.LeftButton: return if self.__get_cursor_location( event) == self.CursorLocation.WINDOW_TITLE_BAR: self.__mouse_pressed = True if self.__cursor_changed: self.__window_resizing = True self.__move_point = event.globalPos() - self.pos() def mouseMoveEvent(self, event): if self.__window_resizing: self.__change_window_size(self.__cursor_loc, event.pos()) return else: self.__cursor_loc = self.__get_cursor_location(event) self.__cursor_changed = self.__set_cursor_shape(self.__cursor_loc) if not self.__mouse_pressed: return if self.__is_maximized and not self.__is_sticked: self.resize(self.__geometry_frame.size()) self.__switch_max_button(MButton.Type.Maximize) self.__is_maximized = False if event.pos().x() < self.__geometry_frame.width(): self.__is_zdt = False else: self.__is_zdt = True self.move(event.globalPos() - QPoint(self.width() / 2, 15)) elif not self.__is_sticking and event.globalPos().y( ) < QApplication.desktop().availableGeometry().height(): if not self.__is_zdt: self.move(event.globalPos() - self.__move_point) else: self.move(event.globalPos() - QPoint(self.width() / 2, 15)) self.__cursor_loc = self.__get_cursor_location(event) if self.__cursor_loc == self.CursorLocation.SCREEN_LEFT: if self.__lyric_shown: self.__window_stick_to(self.StickType.LEFT) elif self.__cursor_loc == self.CursorLocation.SCREEN_RIGHT: if self.__lyric_shown: self.__window_stick_to(self.StickType.RIGHT) elif self.__cursor_loc == self.CursorLocation.SCREEN_TOP: if self.__lyric_shown: self.showMaximized() self.__is_sticked = True else: if self.width( ) - self.OFFSET_BORDER_LEFT - self.OFFSET_BORDER_RIGHT >= QApplication.desktop( ).screenGeometry().width(): self.resize(800, self.height()) if self.height( ) - self.OFFSET_BORDER_TOP - self.OFFSET_BORDER_BOTTOM >= QApplication.desktop( ).availableGeometry().height(): self.resize(self.width(), 600) self.__is_sticking = False self.__is_sticked = False def mouseReleaseEvent(self, event): if event.button() != Qt.LeftButton: return if self.geometry().y() < -self.OFFSET_BORDER_TOP: self.setGeometry(self.geometry().x(), -self.OFFSET_BORDER_TOP, self.geometry().width(), self.geometry().height()) self.__mouse_pressed = False self.__window_resizing = False self.__is_sticking = False self.__is_sticked = False if not self.__is_maximized: self.__is_zdt = False def resizeEvent(self, event): self.frame.setGeometry( self.OFFSET_BORDER_LEFT, self.OFFSET_BORDER_TOP + 22, self.width() - self.OFFSET_BORDER_LEFT - self.OFFSET_BORDER_RIGHT, self.height() - self.OFFSET_BORDER_TOP - self.OFFSET_BORDER_BOTTOM - 26) def setFixedSize(self, *__args): count_parm = len(__args) if count_parm == 0 or count_parm > 2: raise TypeError('Argument error occurred. (1 or 2 given)') if count_parm == 1: if isinstance(__args[0], QSize): super(ModiaWindow, self).setFixedSize(__args[0]) self.__is_fixed_size = True else: raise ValueError( 'Given argument not QSize type. (QSize type required for 1 argument)' ) else: if isinstance(__args[0], int) and isinstance(__args[1], int): super(ModiaWindow, self).setFixedSize(__args[0], __args[1]) self.__is_fixed_size = True else: raise ValueError( 'Given arguments not int type. (int type required for 2 arguments)' ) def setFixedWidth(self, p_int): if not isinstance(p_int, int): raise ValueError( 'Given argument not int type. (int type required)') self.resize(p_int, self.height()) self.__is_fixed_width = True def setFixedHeight(self, p_int): if not isinstance(p_int, int): raise ValueError( 'Given argument not int type. (int type required)') self.resize(self.width(), p_int) self.__is_fixed_height = True def setSuspendStatus(self, bool_suspended): self.__is_suspended = bool_suspended
class LabelAssistDialog(QDialog): """ A simple UI for showing bookmarks and navigating to them. FIXME: For now, this window is tied to a particular lane. If your project has more than one lane, then each one will have it's own bookmark window, which is kinda dumb. """ def __init__(self, parent, topLevelOperatorView): super(LabelAssistDialog, self).__init__(parent) # Create thread router to populate table on main thread self.threadRouter = ThreadRouter(self) # Set object classification operator view self.topLevelOperatorView = topLevelOperatorView self.setWindowTitle("Label Assist") self.setMinimumWidth(500) self.setMinimumHeight(700) layout = QGridLayout() layout.setContentsMargins(10, 10, 10, 10) # Show variable importance table rows = 0 columns = 4 self.table = QTableWidget(rows, columns) self.table.setHorizontalHeaderLabels( ['Frame', 'Max Area', 'Min Area', 'Labels']) self.table.verticalHeader().setVisible(False) # Select full row on-click and call capture double click self.table.setSelectionBehavior(QTableView.SelectRows) self.table.doubleClicked.connect(self._captureDoubleClick) layout.addWidget(self.table, 1, 0, 3, 2) # Create progress bar self.progressBar = QProgressBar() self.progressBar.setMinimum(0) self.progressBar.setMaximum(0) self.progressBar.hide() layout.addWidget(self.progressBar, 4, 0, 1, 2) # Create button to populate table self.computeButton = QPushButton('Compute object info') self.computeButton.clicked.connect(self._triggerTableUpdate) layout.addWidget(self.computeButton, 5, 0) # Create close button closeButton = QPushButton('Close') closeButton.clicked.connect(self.close) layout.addWidget(closeButton, 5, 1) # Set dialog layout self.setLayout(layout) def _triggerTableUpdate(self): # Check that object area is included in selected features featureNames = self.topLevelOperatorView.SelectedFeatures.value if 'Standard Object Features' not in featureNames or 'Count' not in featureNames[ 'Standard Object Features']: box = QMessageBox( QMessageBox.Warning, 'Warning', 'Object area is not a selected feature. Please select this feature on: \"Standard Object Features > Shape > Size in pixels\"', QMessageBox.NoButton, self) box.show() return # Clear table self.table.clearContents() self.table.setRowCount(0) self.table.setSortingEnabled(False) self.progressBar.show() self.computeButton.setEnabled(False) # Compute object features and number of labels per frame def compute_features(): features = self.topLevelOperatorView.ObjectFeatures([]).wait() labels = self.topLevelOperatorView.LabelInputs([]).wait() return features, labels req = Request(compute_features) req.notify_finished(self._populateTable) req.submit() @threadRouted def _populateTable(self, features_and_labels): features, labels = features_and_labels self.progressBar.hide() self.computeButton.setEnabled(True) for frame, objectFeatures in features.iteritems(): # Insert row rowNum = self.table.rowCount() self.table.insertRow(self.table.rowCount()) # Get max and min object areas areas = objectFeatures['Standard Object Features']['Count'] maxObjArea = numpy.max(areas[numpy.nonzero(areas)]) minObjArea = numpy.min(areas[numpy.nonzero(areas)]) # Get number of labeled objects labelNum = numpy.count_nonzero(labels[frame]) # Load fram number item = QTableWidgetItem(str(frame)) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.table.setItem(rowNum, 0, item) # Load max object areas item = QTableWidgetItemWithFloatSorting( str("{: .02f}".format(maxObjArea))) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.table.setItem(rowNum, 1, item) # Load min object areas item = QTableWidgetItemWithFloatSorting( str("{: .02f}".format(minObjArea))) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.table.setItem(rowNum, 2, item) # Load label numbers item = QTableWidgetItemWithFloatSorting( str("{: .01f}".format(labelNum))) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.table.setItem(rowNum, 3, item) # Resize column size to fit dialog size self.table.horizontalHeader().setResizeMode(QHeaderView.Stretch) # Sort by max object area self.table.setSortingEnabled(True) self.table.sortByColumn(1) def _captureDoubleClick(self): # Navigate to selected frame index = self.table.selectedIndexes()[0] frameStr = self.table.model().data(index).toString() if frameStr: frameNum = int(frameStr) self.parent().editor.posModel.time = frameNum
class LabelAssistDialog(QDialog): """ A simple UI for showing bookmarks and navigating to them. FIXME: For now, this window is tied to a particular lane. If your project has more than one lane, then each one will have it's own bookmark window, which is kinda dumb. """ def __init__(self, parent, topLevelOperatorView): super(LabelAssistDialog, self).__init__(parent) # Create thread router to populate table on main thread self.threadRouter = ThreadRouter(self) # Set object classification operator view self.topLevelOperatorView = topLevelOperatorView self.setWindowTitle("Label Assist") self.setMinimumWidth(500) self.setMinimumHeight(700) layout = QGridLayout() layout.setContentsMargins(10, 10, 10, 10) # Show variable importance table rows = 0 columns = 4 self.table = QTableWidget(rows, columns) self.table.setHorizontalHeaderLabels(['Frame', 'Max Area', 'Min Area', 'Labels']) self.table.verticalHeader().setVisible(False) # Select full row on-click and call capture double click self.table.setSelectionBehavior(QTableView.SelectRows); self.table.doubleClicked.connect(self._captureDoubleClick) layout.addWidget(self.table, 1, 0, 3, 2) # Create progress bar self.progressBar = QProgressBar() self.progressBar.setMinimum(0) self.progressBar.setMaximum(0) self.progressBar.hide() layout.addWidget(self.progressBar, 4, 0, 1, 2) # Create button to populate table self.computeButton = QPushButton('Compute object info') self.computeButton.clicked.connect(self._triggerTableUpdate) layout.addWidget(self.computeButton, 5, 0) # Create close button closeButton = QPushButton('Close') closeButton.clicked.connect(self.close) layout.addWidget(closeButton, 5, 1) # Set dialog layout self.setLayout(layout) def _triggerTableUpdate(self): # Check that object area is included in selected features featureNames = self.topLevelOperatorView.SelectedFeatures.value if 'Standard Object Features' not in featureNames or 'Count' not in featureNames['Standard Object Features']: box = QMessageBox(QMessageBox.Warning, 'Warning', 'Object area is not a selected feature. Please select this feature on: \"Standard Object Features > Shape > Size in pixels\"', QMessageBox.NoButton, self) box.show() return # Clear table self.table.clearContents() self.table.setRowCount(0) self.table.setSortingEnabled(False) self.progressBar.show() self.computeButton.setEnabled(False) def compute_features_for_frame(tIndex, t, features): # Compute features and labels (called in parallel from request pool) roi = [slice(None) for i in range(len(self.topLevelOperatorView.LabelImages.meta.shape))] roi[tIndex] = slice(t, t+1) roi = tuple(roi) frame = self.topLevelOperatorView.SegmentationImages(roi).wait() frame = frame.squeeze().astype(numpy.uint32, copy=False) # Dirty trick: We don't care what we're passing here for the 'image' parameter, # but vigra insists that we pass *something*, so we'll cast the label image as float32. features[t] = vigra.analysis.extractRegionFeatures(frame.view(numpy.float32), frame, ['Count'], ignoreLabel=0) tIndex = self.topLevelOperatorView.SegmentationImages.meta.axistags.index('t') tMax = self.topLevelOperatorView.SegmentationImages.meta.shape[tIndex] features = {} labels = {} def compute_all_features(): # Compute features in parallel pool = RequestPool() for t in range(tMax): pool.add( Request( partial(compute_features_for_frame, tIndex, t, features) ) ) pool.wait() # Compute labels labels = self.topLevelOperatorView.LabelInputs([]).wait() req = Request(compute_all_features) req.notify_finished( partial(self._populateTable, features, labels) ) req.submit() @threadRouted def _populateTable(self, features, labels, *args): self.progressBar.hide() self.computeButton.setEnabled(True) for time, feature in features.iteritems(): # Insert row rowNum = self.table.rowCount() self.table.insertRow(self.table.rowCount()) # Get max and min object areas areas = feature['Count']#objectFeatures['Standard Object Features']['Count'] maxObjArea = numpy.max(areas[numpy.nonzero(areas)]) minObjArea = numpy.min(areas[numpy.nonzero(areas)]) # Get number of labeled objects labelNum = numpy.count_nonzero(labels[time]) # Load fram number item = QTableWidgetItem(str(time)) item.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) self.table.setItem(rowNum, 0, item) # Load max object areas item = QTableWidgetItemWithFloatSorting(str("{: .02f}".format(maxObjArea))) item.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) self.table.setItem(rowNum, 1, item) # Load min object areas item = QTableWidgetItemWithFloatSorting(str("{: .02f}".format(minObjArea))) item.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) self.table.setItem(rowNum, 2, item) # Load label numbers item = QTableWidgetItemWithFloatSorting(str("{: .01f}".format(labelNum))) item.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) self.table.setItem(rowNum, 3, item) # Resize column size to fit dialog size self.table.horizontalHeader().setResizeMode(QHeaderView.Stretch) # Sort by max object area self.table.setSortingEnabled(True) self.table.sortByColumn(1) def _captureDoubleClick(self): # Navigate to selected frame index = self.table.selectedIndexes()[0] frameStr = self.table.model().data(index).toString() if frameStr: frameNum = int(frameStr) self.parent().editor.posModel.time = frameNum
class KeywordTable(HelpedWidget): """Shows a table of key/value pairs. The data structure expected and sent to the getter and setter is a dictionary of values.""" def __init__(self, model, table_label="", help_link=""): HelpedWidget.__init__(self, table_label, help_link) self.table = QTableWidget(self) self.table.setColumnCount(2) self.setColumnHeaders() self.table.verticalHeader().setHidden(True) self.table.setColumnWidth(0, 150) self.table.horizontalHeader().setStretchLastSection(True) self.table.setMinimumHeight(110) self.table.setSelectionMode(QAbstractItemView.SingleSelection) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.addWidget(self.table) self.addWidget(AddRemoveWidget(self.addItem, self.removeItem)) self.connect(self.table, SIGNAL('cellChanged(int,int)'), self.tableChanged) assert isinstance(model, DictionaryModelMixin) self.model = model model.observable().attach(DictionaryModelMixin.DICTIONARY_CHANGED_EVENT, self.modelChanged) self.modelChanged() def setColumnHeaders(self, keyword_name="Keyword", value_name="Value"): self.headers = [keyword_name, value_name] self.table.setHorizontalHeaderLabels(self.headers) def addItem(self): """Called by the add button to insert a new keyword""" title = "New %s" % self.headers[0] description = "Enter new %s:" % self.headers[0] (new_keyword, ok) = QInputDialog.getText(self, title, description, QLineEdit.Normal) if ok: new_keyword = str(new_keyword).strip() self.model.addKey(new_keyword) def removeItem(self): """Called by the remove button to remove a selected keyword""" current_row = self.table.currentRow() if current_row >= 0: do_delete = QMessageBox.question(self, "Delete row?", "Are you sure you want to delete the key/value pair?", QMessageBox.Yes | QMessageBox.No ) if do_delete: key_item = self.table.item(current_row, 0) if key_item is not None: key = str(key_item.text()).strip() self.model.removeKey(key) def tableChanged(self, row, column): """Called whenever the contents of a cell changes.""" key_item = self.table.item(row, 0) if key_item is not None: key = str(key_item.text()).strip() value_item = self.table.item(row, 1) if value_item is not None: value = str(value_item.text()).strip() self.model.setValueForKey(key, value) def modelChanged(self): """Retrieves data from the model and inserts it into the table.""" values = self.model.getDictionary() blocked = self.table.blockSignals(True) for row in reversed(range(self.table.rowCount())): self.table.removeRow(row) row = 0 for key in values: key_item = QTableWidgetItem(str(key)) key_item.setFlags(key_item.flags() ^ Qt.ItemIsEditable) value_item = QTableWidgetItem(str(values[key])) self.table.insertRow(row) self.table.setItem(row, 0, key_item) self.table.setItem(row, 1, value_item) row += 1 self.table.blockSignals(blocked)
def _init_layout(self): """ Create the GUI widgets (but leave them empty). """ hostname_combobox = QComboBox(parent=self) self._hostname_combobox = hostname_combobox hostname_combobox.setEditable(True) hostname_combobox.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum) for hostname in self._suggested_hostnames: hostname_combobox.addItem(hostname) # EventFilter is installed after everything else is initialized. (See below.) #hostname_combobox.installEventFilter(self) self._connect_button = QPushButton("Connect", parent=self, clicked=self._handle_new_hostname) hostname_layout = QHBoxLayout() hostname_layout.addWidget(hostname_combobox) hostname_layout.addWidget(self._connect_button) hostinfo_table = QTableWidget() hostinfo_table.setColumnCount(len(SERVER_INFO_FIELDS)) hostinfo_table.setHorizontalHeaderLabels(SERVER_INFO_FIELDS) hostinfo_table.horizontalHeader().setVisible(True) hostinfo_table.verticalHeader().setVisible(False) hostinfo_table.setRowCount(1) hostinfo_table.setItem(0, 0, QTableWidgetItem("Placeholder")) hostinfo_table.setVisible(False) hostinfo_table.resizeRowsToContents() hostinfo_table.horizontalHeader().setStretchLastSection(True) table_height = hostinfo_table.verticalHeader().sectionSize( 0) + hostinfo_table.rowHeight(0) hostinfo_table.resize(QSize(hostinfo_table.width(), table_height)) hostinfo_table.setMaximumSize(QSize(1000, table_height)) hostinfo_table.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) host_layout = QVBoxLayout() host_layout.addLayout(hostname_layout) host_layout.addWidget(hostinfo_table) host_groupbox = QGroupBox("DVID Host", parent=self) host_groupbox.setLayout(host_layout) host_groupbox.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) repo_treewidget = QTreeWidget(parent=self) repo_treewidget.setHeaderLabels( TREEVIEW_COLUMNS) # TODO: Add type, shape, axes, etc. repo_treewidget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) repo_treewidget.itemSelectionChanged.connect( self._handle_data_selection) data_layout = QVBoxLayout() data_layout.addWidget(repo_treewidget) data_groupbox = QGroupBox("Data Volumes", parent=self) data_groupbox.setLayout(data_layout) node_listwidget = QListWidget(parent=self) node_listwidget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) node_listwidget.itemSelectionChanged.connect(self._update_status) node_layout = QVBoxLayout() node_layout.addWidget(node_listwidget) node_groupbox = QGroupBox("Nodes", parent=self) node_groupbox.setLayout(node_layout) new_data_edit = QLineEdit(parent=self) new_data_edit.textEdited.connect(self._update_status) full_url_label = QLabel(parent=self) full_url_label.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) text_flags = full_url_label.textInteractionFlags() full_url_label.setTextInteractionFlags(text_flags | Qt.TextSelectableByMouse) new_data_layout = QVBoxLayout() new_data_layout.addWidget(new_data_edit) new_data_groupbox = QGroupBox("New Data Volume", parent=self) new_data_groupbox.setLayout(new_data_layout) new_data_groupbox.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) buttonbox = QDialogButtonBox(Qt.Horizontal, parent=self) buttonbox.setStandardButtons(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) buttonbox.accepted.connect(self.accept) buttonbox.rejected.connect(self.reject) buttonbox.button(QDialogButtonBox.Ok).setEnabled(False) layout = QVBoxLayout() layout.addWidget(host_groupbox) layout.addWidget(data_groupbox) layout.addWidget(node_groupbox) if self._mode == "specify_new": layout.addWidget(new_data_groupbox) else: new_data_groupbox.hide() layout.addWidget(full_url_label) layout.addWidget(buttonbox) # Stretch factors layout.setStretchFactor(data_groupbox, 3) layout.setStretchFactor(node_groupbox, 1) self.setLayout(layout) self.setWindowTitle("Select DVID Volume") self.resize(1000, 1000) # Initially disabled data_groupbox.setEnabled(False) node_groupbox.setEnabled(False) new_data_groupbox.setEnabled(False) # Set tab order self.setTabOrder(hostname_combobox, repo_treewidget) self.setTabOrder(repo_treewidget, node_listwidget) self.setTabOrder(node_listwidget, buttonbox) # Save instance members self._hostinfo_table = hostinfo_table self._data_groupbox = data_groupbox self._node_groupbox = node_groupbox self._new_data_groupbox = new_data_groupbox self._repo_treewidget = repo_treewidget self._node_listwidget = node_listwidget self._new_data_edit = new_data_edit self._full_url_label = full_url_label self._buttonbox = buttonbox # Finally install eventfilter (after everything is initialized) hostname_combobox.installEventFilter(self)
class PatternsTable(QWidget): def __init__(self): QWidget.__init__(self) self.grid = QGridLayout() self.setLayout(self.grid) self.patternArea() self.patternTable() def createPattern(self, name, x): label = name.lower() + "Label" type = name.lower() + "Type" entry = name.lower() + "Entry" setattr(self, label, QLabel(name)) setattr(self, entry, QLineEdit()) setattr(self, type, QComboBox()) labelobj = getattr(self, label) typeobj = getattr(self, type) entryobj = getattr(self, entry) typeobj.addItem("Hexadecimal") typeobj.addItem("String") self.grid.addWidget(labelobj, x, 0) self.grid.addWidget(entryobj, x, 1) self.grid.addWidget(typeobj, x, 2) def patternArea(self): self.filetypeLabel = QLabel("File type") self.filetype = QLineEdit() self.alignedLabel = QLabel("block aligned") self.aligned = QCheckBox() self.windowLabel = QLabel("Window size") self.window = QSpinBox() self.window.setSuffix(" bytes") self.window.setRange(0, 2500000) self.window.setSingleStep(100) self.addEntry = QPushButton("add") self.connect(self.addEntry, SIGNAL("clicked()"), self.insertPattern) self.grid.addWidget(self.filetypeLabel, 0, 0) self.grid.addWidget(self.filetype, 0, 1, 1, 2) self.createPattern("Header", 2) self.createPattern("Footer", 3) self.grid.addWidget(self.windowLabel, 4, 0) self.grid.addWidget(self.window, 4, 1) self.grid.addWidget(self.alignedLabel, 5, 0) self.grid.addWidget(self.aligned, 5, 1) self.grid.addWidget(self.addEntry, 6, 1) def patternTable(self): self.patterns = QTableWidget() self.patterns.setShowGrid(False) self.patterns.setColumnCount(5) self.patterns.setHorizontalHeaderLabels(["Filetype", "Header", "Footer", "Window", "Block aligned"]) self.patterns.horizontalHeader().setStretchLastSection(True) self.connect(self.patterns.verticalHeader(), SIGNAL("sectionClicked(int)"), self.patterns.removeRow) self.grid.addWidget(self.patterns, 7, 0, 1, 3) def warning(self, msg): msgBox = QMessageBox(self) msgBox.setText(msg) msgBox.setIcon(QMessageBox.Warning) msgBox.exec_() def validate(self, **kwargs): msg = "" if len(kwargs["type"]) == 0: msg = "Type must be defined" else: for i in kwargs["type"]: if i not in string.letters: msg = "Type's characters must be in the following set\n\n" + string.letters break rowCount = self.patterns.rowCount() for row in range(0, rowCount): if str(self.patterns.item(row, 0).text()) == kwargs["type"]: msg = "Type <" + kwargs["type"] + " > already defined" if msg != "": self.warning(msg) return False if kwargs["headerType"] == "Hexadecimal" and not self.isHex(kwargs["header"]): msg = "Header must be an even number of chars" self.warning(msg) return False if len(kwargs["header"]) == 0: msg = "Header must be provided" self.warning(msg) return False if kwargs["footerType"] == "Hexadecimal" and not self.isHex(kwargs["header"]): msg = "Footer must be an even number of chars" self.warning(msg) return False if kwargs["window"] <= 0: msg = "Window size must be greater than 0" self.warning(msg) return False return True def insertPattern(self): filetype = str(self.filetype.text()) header = str(self.headerEntry.text()) headerType = str(self.headerType.currentText()) footer = str(self.footerEntry.text()) footerType = str(self.footerType.currentText()) window = self.window.text() aligned = self.aligned.isChecked() #Validate most of provided items kwargs = {"type": filetype, "header": header, "headerType": headerType, "footer": footer, "footerType": footerType, "window": int(window.replace(" bytes", ""))} if not self.validate(**kwargs): return filetypeItem = QTableWidgetItem(filetype) headerItem = QTableWidgetItem(header + " (" + headerType[0:3] + ")") footerItem = QTableWidgetItem(footer + " (" + footerType[0:3] + ")") windowItem = QTableWidgetItem(window) alignedItem = QTableWidgetItem(str(aligned)) self.patterns.insertRow(self.patterns.rowCount()) vertHeader = QTableWidgetItem(QIcon(":closetab.png"), "") row = self.patterns.rowCount() - 1 self.patterns.setVerticalHeaderItem(row, vertHeader) self.patterns.setItem(row, 0, filetypeItem) self.patterns.setItem(row, 1, headerItem) self.patterns.setItem(row, 2, footerItem) self.patterns.setItem(row, 3, windowItem) self.patterns.setItem(row, 4, alignedItem) self.patterns.resizeRowToContents(row) def isHex(self, str): HEXCHAR = "0123456789abcdefABCDEF" hexStr = "" even = False for i in range(len(str)): if str[i] in HEXCHAR: if even == True: even = False else: even = True else: return False if even: return False return True def toHex(self, str): HEXCHAR = "0123456789abcdefABCDEF" hexStr = "" evenhex = "" for i in range(len(str)): if str[i] in HEXCHAR: if len(evenhex) == 1: hexStr += chr(int(evenhex+str[i], 16)) evenhex = "" else: evenhex = str[i] else: raise ValueError, "argument 'str' contains not valid characters" if len(evenhex) != 0: raise ValueError, "argument 'str' must be an even number of char" return hexStr def textToPattern(self, text): idx = text.find("(") pattern = "" if idx != -1: type = text[idx+1:idx+4] pattern = text[0:idx-1] if type == "Hex": pattern = self.toHex(pattern) return pattern def selectedItems(self): selected = {} rowCount = self.patterns.rowCount() for row in range(0, rowCount): filetype = str(self.patterns.item(row, 0).text()) selected[filetype] = [] pattern = [] pattern.append(self.textToPattern(str(self.patterns.item(row, 1).text()))) pattern.append(self.textToPattern(str(self.patterns.item(row, 2).text()))) pattern.append(int(self.patterns.item(row, 3).text().replace(" bytes", ""))) selected[filetype].append([pattern]) if self.patterns.item(row, 4).text() == "True": selected[filetype].append(True) else: selected[filetype].append(False) return selected
class ProfileDlg(QDialog): def __init__(self): QDialog.__init__(self) self.__setup_ui() self.__connect_slot() self.__settings = QSettings('__cyt', '__yt_ovs') #print self.__settings.fileName() set_str = to_python_str(self.__settings.value('__profile_record', '').toString()) set_str = set_str if set_str is not '' else "[]" self.__record_list = json.loads(set_str)#[{'ip':'1.1.1.1','port':6641,'schema':'xxxx'},{...}] self.__list_to_table_item() self.click_ip = '' self.click_port = 0 self.click_schema = '' def __setup_ui(self): self.setMaximumSize(500, 400) self.setMinimumSize(500, 400) v_layout = QVBoxLayout() #init table widget self.__profile_table = QTableWidget() self.__profile_table.setColumnCount(3) header_list = QStringList() header_list << 'ip' << 'port' << 'schema' self.__profile_table.setHorizontalHeaderLabels(header_list) self.__profile_table.horizontalHeader().setResizeMode(QHeaderView.Stretch) self.__profile_table.setSelectionBehavior(QAbstractItemView.SelectRows) #init tool widget self.__tool_wid = QWidget() h_layout = QHBoxLayout() h_layout.setContentsMargins(0,0,0,0) self.__puls_btn = QPushButton() self.__puls_btn.setIcon(QIcon(ICON_IDR + 'arrow_plus.png')) self.__puls_btn.setIconSize(QSize(15, 15)) self.__puls_btn.setMaximumSize(20, 20) self.__minus_btn = QPushButton() self.__minus_btn.setIcon(QIcon(ICON_IDR + 'arrow_minus.png')) self.__minus_btn.setIconSize(QSize(15, 15)) self.__minus_btn.setMaximumSize(20, 20) h_layout.addWidget(self.__puls_btn,0) h_layout.addWidget(self.__minus_btn,0) h_layout.addStretch(1) self.__tool_wid.setLayout(h_layout) #v layout v_layout.addWidget(self.__profile_table,1) v_layout.addWidget(self.__tool_wid,0) v_layout.setSpacing(1) self.setLayout(v_layout) def __connect_slot(self): self.connect(self.__puls_btn, SIGNAL('clicked()'), self, SLOT('__on_plus_btn()')) self.connect(self.__minus_btn, SIGNAL('clicked()'), self, SLOT('__on_minus_btn()')) self.connect(self.__profile_table, SIGNAL('cellDoubleClicked (int,int)'), self, SLOT('__on_profile_double_click(int,int)')) def __add_record(self, ip, port, schema): count = self.__profile_table.rowCount() self.__profile_table.insertRow(count) ip_item = QTableWidgetItem(ip) ip_item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) item_font = ip_item.font() item_font.setPointSizeF(12) ip_item.setFont(item_font) port_item = QTableWidgetItem(port) port_item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) port_item.setFont(item_font) schema_item = QTableWidgetItem(schema) schema_item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) schema_item.setFont(item_font) self.__profile_table.setItem(count, 0, ip_item) self.__profile_table.setItem(count, 1, port_item) self.__profile_table.setItem(count, 2, schema_item) def __clear_table_data(self): row_count = self.__profile_table.rowCount() rev = [i for i in range(row_count)] rev.reverse() for i in rev: self.__profile_table.removeRow(i) def __list_to_table_item(self): self.__clear_table_data() for record in self.__record_list: self.__add_record(record['ip'], str(record['port']), record['schema']) #print record def __table_item_to_list(self): row_count = self.__profile_table.rowCount() self.__record_list = [] for i in range(row_count): record = {} ip = to_python_str( self.__profile_table.item(i, 0).text() ) port = int( self.__profile_table.item(i, 1).text() ) schema = to_python_str(self.__profile_table.item(i, 2).text()) record["ip"] = ip record["port"] = port record["schema"] = schema self.__record_list.append(record) print self.__record_list def __check_existed(self, ip, port, schema): has_code = con_has_code(ip, port, schema) for record in self.__record_list: exist_code = con_has_code(record["ip"], record["port"], record["schema"]) if exist_code == has_code: return True return False def __record_to_settings(self): self.__settings.setValue('__profile_record', json.dumps(self.__record_list)) @pyqtSlot() def __on_plus_btn(self): new_dlg = NewConnectionDlg() if new_dlg.exec_(): # add to table_widget if self.__check_existed(new_dlg.host, new_dlg.port, new_dlg.schema): return self.__add_record(new_dlg.host, str(new_dlg.port), new_dlg.schema) self.__table_item_to_list() self.__record_to_settings() @pyqtSlot() def __on_minus_btn(self): select_row = self.__profile_table.currentRow() self.__profile_table.removeRow(select_row) self.__table_item_to_list() self.__record_to_settings() @pyqtSlot('int','int') def __on_profile_double_click(self, row, column): ip_item = self.__profile_table.item(row, 0) port_item = self.__profile_table.item(row, 1) schema_item = self.__profile_table.item(row, 2) self.click_ip = to_python_str(ip_item.text()) self.click_port = int(port_item.text()) self.click_schema = to_python_str(schema_item.text()) self.accept()
class GUI(object): def __init__(self, MainWindow): MainWindow.setObjectName("MainWindow") # Set size of window MainWindow.resize(800, 589) MainWindow.setFocusPolicy(QtCore.Qt.NoFocus) MainWindow.setWindowTitle("Text to Kill") self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout = QGridLayout(self.centralwidget) self.gridLayout.setMargin(0) self.gridLayout.setObjectName("gridLayout") self.stackedWidget = QStackedWidget(self.centralwidget) self.stackedWidget.setEnabled(True) self.stackedWidget.setObjectName("stackedWidget") font = QFont() font.setFamily("Times New Roman") # Main menu page self.menuPage = QWidget() self.menuPage.setObjectName("menuPage") self.titleLabel = QLabel(self.menuPage) self.titleLabel.setGeometry(QtCore.QRect(250, 60, 300, 50)) font.setPointSize(45) self.titleLabel.setFont(font) self.titleLabel.setAlignment(QtCore.Qt.AlignCenter) self.titleLabel.setObjectName("titleLabel") self.titleLabel.setText("Text to Kill") self.subtitleLabel = QLabel(self.menuPage) self.subtitleLabel.setGeometry(QtCore.QRect(100, 140, 600, 40)) font.setPointSize(25) self.subtitleLabel.setFont(font) self.subtitleLabel.setAlignment(QtCore.Qt.AlignCenter) self.subtitleLabel.setObjectName("subtitleLabel") self.subtitleLabel.setText("The Murder Mystery Automation System") self.createButton = QPushButton(self.menuPage) self.createButton.setGeometry(QtCore.QRect(310, 260, 180, 60)) self.createButton.setObjectName("createButton") self.createButton.setText("Create Game") self.runButton = QPushButton(self.menuPage) self.runButton.setGeometry(QtCore.QRect(310, 350, 180, 60)) self.runButton.setObjectName("runButton") self.runButton.setText("Run Game") self.stackedWidget.addWidget(self.menuPage) # Create page self.createPage = QWidget() self.createPage.setObjectName("createPage") self.createTabWidget = QTabWidget(self.createPage) self.createTabWidget.setGeometry(QtCore.QRect(0, 0, 800, 600)) self.createTabWidget.setFocusPolicy(QtCore.Qt.NoFocus) self.createTabWidget.setObjectName("createTabWidget") # Create game tab self.createTab = QWidget() self.createTab.setObjectName("createTab") self.createDoneButton = QPushButton(self.createTab) self.createDoneButton.setGeometry(QtCore.QRect(580, 470, 180, 60)) self.createDoneButton.setObjectName("createDoneButton") self.createDoneButton.setText("Done") self.gameNameEdit = QLineEdit(self.createTab) self.gameNameEdit.setGeometry(QtCore.QRect(140, 20, 160, 30)) self.gameNameEdit.setObjectName("gameNameEdit") self.gameNameLabel = QLabel(self.createTab) self.gameNameLabel.setGeometry(QtCore.QRect(20, 25, 110, 20)) font.setPointSize(15) self.gameNameLabel.setFont(font) self.gameNameLabel.setAlignment(QtCore.Qt.AlignCenter) self.gameNameLabel.setObjectName("gameNameLabel") self.gameNameLabel.setText("Game name") self.line = QFrame(self.createTab) self.line.setGeometry(QtCore.QRect(20, 150, 311, 20)) self.line.setFrameShape(QFrame.HLine) self.line.setFrameShadow(QFrame.Sunken) self.line.setObjectName("line") self.addCharLabel = QLabel(self.createTab) self.addCharLabel.setGeometry(QtCore.QRect(20, 180, 160, 20)) font.setPointSize(20) self.addCharLabel.setFont(font) self.addCharLabel.setAlignment(QtCore.Qt.AlignCenter) self.addCharLabel.setObjectName("addCharLabel") self.addCharLabel.setText("Add Character") self.charNameLabel = QLabel(self.createTab) self.charNameLabel.setGeometry(QtCore.QRect(20, 230, 66, 20)) font.setPointSize(15) self.charNameLabel.setFont(font) self.charNameLabel.setAlignment(QtCore.Qt.AlignCenter) self.charNameLabel.setObjectName("charNameLabel") self.charNameLabel.setText("Name") self.charNameEdit = QLineEdit(self.createTab) self.charNameEdit.setGeometry(QtCore.QRect(140, 220, 160, 30)) self.charNameEdit.setObjectName("charNameEdit") self.charAbilScroll = QListWidget(self.createTab) self.charAbilScroll.setGeometry(QtCore.QRect(140, 260, 161, 51)) self.charAbilScroll.setObjectName("charAbilScroll") self.characterTable = QTableWidget(self.createTab) self.characterTable.setGeometry(QtCore.QRect(405, 20, 381, 401)) self.characterTable.setFocusPolicy(QtCore.Qt.NoFocus) self.characterTable.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.characterTable.setRowCount(1) self.characterTable.setColumnCount(2) self.characterTable.setObjectName("characterTable") self.characterTable.horizontalHeader().setVisible(False) self.characterTable.horizontalHeader().setCascadingSectionResizes(False) self.characterTable.horizontalHeader().setMinimumSectionSize(50) self.characterTable.horizontalHeader().setStretchLastSection(True) self.characterTable.verticalHeader().setVisible(False) self.characterTable.verticalHeader().setDefaultSectionSize(30) self.scrollArea = QListWidget(self.createTab) self.scrollArea.setGeometry(QtCore.QRect(140, 60, 161, 71)) self.scrollArea.setObjectName("scrollArea") self.scrollArea.setSelectionMode(3) self.createSaveButton = QPushButton(self.createTab) self.createSaveButton.setGeometry(QtCore.QRect(380, 470, 180, 60)) self.createSaveButton.setObjectName("createSaveButton") self.createSaveButton.setText("Save") self.charAbilitiesLabel = QLabel(self.createTab) self.charAbilitiesLabel.setGeometry(QtCore.QRect(30, 280, 71, 20)) font.setPointSize(15) self.charAbilitiesLabel.setFont(font) self.charAbilitiesLabel.setObjectName("charAbilitiesLabel") self.charAbilitiesLabel.setText("Abilities") self.abilitiesDropdown = QComboBox(self.createTab) self.abilitiesDropdown.setGeometry(QtCore.QRect(140, 330, 151, 25)) self.abilitiesDropdown.setObjectName("abilitiesDropdown") self.addCharButton = QPushButton(self.createTab) self.addCharButton.setGeometry(QtCore.QRect(30, 370, 98, 27)) self.addCharButton.setObjectName("addCharButton") self.addCharButton.setText("Add") self.gameAbilitiesLabel = QLabel(self.createTab) self.gameAbilitiesLabel.setGeometry(QtCore.QRect(30, 80, 71, 20)) self.setGameAbilButton = QPushButton(self.createTab) self.setGameAbilButton.setGeometry(QtCore.QRect(30, 110, 71, 27)) self.setGameAbilButton.setObjectName("setGameAbilButton") self.setGameAbilButton.setText("Set") self.saveCharButton = QPushButton(self.createTab) self.saveCharButton.setGeometry(QtCore.QRect(70, 430, 180, 60)) self.saveCharButton.setObjectName("saveCharButton") self.saveCharButton.setText("Save Character") font.setPointSize(15) self.gameAbilitiesLabel.setFont(font) self.gameAbilitiesLabel.setObjectName("gameAbilitiesLabel") self.gameAbilitiesLabel.setText("Abilities") self.createTabWidget.addTab(self.createTab, "") # Setup tab widget self.setupTab = QWidget() self.setupTab.setObjectName("setupTab") self.setupDoneButton = QPushButton(self.setupTab) self.setupDoneButton.setGeometry(QtCore.QRect(580, 470, 180, 60)) self.setupDoneButton.setObjectName("setupDoneButton") self.setupDoneButton.setText("Done") self.setupTable = QTableWidget(self.setupTab) self.setupTable.setGeometry(QtCore.QRect(20, 20, 750, 400)) self.setupTable.setFocusPolicy(QtCore.Qt.TabFocus) self.setupTable.setRowCount(1) self.setupTable.setColumnCount(3) self.setupTable.setObjectName("setupTable") self.setupTable.horizontalHeader().setVisible(False) self.setupTable.horizontalHeader().setCascadingSectionResizes(False) self.setupTable.horizontalHeader().setDefaultSectionSize(187) self.setupTable.horizontalHeader().setHighlightSections(False) self.setupTable.horizontalHeader().setStretchLastSection(True) self.setupTable.verticalHeader().setVisible(False) self.setupTable.verticalHeader().setHighlightSections(False) self.setupSaveButton = QPushButton(self.setupTab) self.setupSaveButton.setGeometry(QtCore.QRect(380, 470, 180, 60)) self.setupSaveButton.setObjectName("setupSaveButton") self.setupSaveButton.setText("Save") self.createTabWidget.addTab(self.setupTab, "") self.createTabWidget.setTabText(self.createTabWidget.indexOf(self.createTab), "Create New Game") self.createTabWidget.setTabText(self.createTabWidget.indexOf(self.setupTab), "Set Up Game") self.stackedWidget.addWidget(self.createPage) # Game page self.gamePage = QWidget() self.gamePage.setObjectName("gamePage") self.gameTabWidget = QTabWidget(self.gamePage) self.gameTabWidget.setGeometry(QtCore.QRect(0, 0, 800, 600)) self.gameTabWidget.setFocusPolicy(QtCore.Qt.NoFocus) self.gameTabWidget.setObjectName("gameTabWidget") self.statusTab = QWidget() self.statusTab.setObjectName("statusTab") self.startGameButton = QPushButton(self.statusTab) self.startGameButton.setGeometry(QtCore.QRect(60, 180, 180, 60)) self.startGameButton.setObjectName("startGameButton") self.startGameButton.setText("Start Game") self.endGameButton = QPushButton(self.statusTab) self.endGameButton.setGeometry(QtCore.QRect(60, 260, 180, 60)) self.endGameButton.setObjectName("endGameButton") self.endGameButton.setText("End Game") self.loadGameLabel = QLabel(self.statusTab) self.loadGameLabel.setGeometry(QtCore.QRect(20, 65, 101, 21)) font.setPointSize(15) self.loadGameLabel.setFont(font) self.loadGameLabel.setObjectName("loadGameLabel") self.loadGameLabel.setText("Load Game") self.gameTabWidget.addTab(self.statusTab, "") self.logTab = QWidget() self.logTab.setObjectName("logTab") self.logList = QListWidget(self.logTab) self.logList.setGeometry(QtCore.QRect(30, 30, 730, 500)) self.logList.setObjectName("logList") self.gameTabWidget.addTab(self.logTab, "") self.inputTab = QWidget() self.inputTab.setObjectName("inputTab") self.gameTabWidget.addTab(self.inputTab, "") self.gameTabWidget.setTabText(self.gameTabWidget.indexOf(self.statusTab), "Game Status") self.gameTabWidget.setTabText(self.gameTabWidget.indexOf(self.logTab), "Game Log") self.gameTabWidget.setTabText(self.gameTabWidget.indexOf(self.inputTab), "Input") self.stackedWidget.addWidget(self.gamePage) self.gridLayout.addWidget(self.stackedWidget, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) self.stackedWidget.setCurrentIndex(0) self.createTabWidget.setCurrentIndex(0) self.gameTabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): pass
class ExpensesDialog(QDialog): holdc = {} def __init__(self, session, parent=None): super(ExpensesDialog, self).__init__(parent) self.session = session session = self.pullOnes('session', session) self.sessionname = str(session['name']) + ' Session' self.pagetitle = self.sessionname self.tableFont = QFont('Century Gothic', 8) #self.tableFont.setFamily('Century Gothic') self.tableHeaderStyle = "::section {" "background-color: teal; color:white}" #pull all CA self.editID = 0 self.hold_account = {} self.hold_expenses = {} self.hold_expensesGroup = {} from_label = QLabel('From:') to_label = QLabel('To:') self.fromData = QDateEdit() self.toData = QDateEdit() currentDate = QDate() self.fromData.setDate(currentDate.currentDate()) self.fromData.setCalendarPopup(True) self.toData.setDate(currentDate.currentDate()) self.toData.setCalendarPopup(True) self.pull_btn = QPushButton() self.pull_btn.setText("Load") h_pull_box = QHBoxLayout() h_pull_box.addWidget(from_label) h_pull_box.addWidget(self.fromData) h_pull_box.addWidget(to_label) h_pull_box.addWidget(self.toData) h_pull_box.addWidget(self.pull_btn) expensesGroup = self.pullGroupExpenses() account = self.pullAccount() self.expenseGroupText = QLabel('Category') self.expenseGroupData = QComboBox() self.expenseGroupData.currentIndexChanged.connect(self.reloadExpenses) self.expenseText = QLabel('Expenses') self.expenseData = QComboBox() self.amountText = QLabel('Amount') self.amountData = QLineEdit() self.amountData.setPlaceholderText('0000.00') self.tellerText = QLabel('Teller/Reciept No.') self.tellerData = QLineEdit() self.tellerData.setPlaceholderText('xxxxxxxxx') self.accountText = QLabel('Account') self.accountData = QComboBox() self.dateText = QLabel('Date') self.dateData = QDateEdit() self.dateData.setDate(currentDate.currentDate()) self.dateData.setCalendarPopup(True) self.descriptionText = QLabel('Brief Description') self.descriptionData = QPlainTextEdit() self.descriptionData.move(200, 100) hboz = QHBoxLayout() self.gender = QLabel('State') self.r1 = QRadioButton('Expenses') self.r1.setChecked(True) self.r2 = QRadioButton('Refund') hboz.addWidget(self.r1) hboz.addWidget(self.r2) i = 0 for a in expensesGroup: self.hold_expensesGroup[i] = a['id'] tex = str(a['name']).upper() self.expenseGroupData.addItem(tex) i += 1 i = 0 exp_key = self.hold_expensesGroup[self.expenseGroupData.currentIndex()] expenses = self.pullExpenses(exp_key) for a in expenses: self.hold_expenses[i] = a['id'] tex = str(a['name']).upper() self.expenseData.addItem(tex) i += 1 i = 0 for a in account: self.hold_account[i] = a['id'] tex = str(a['name']).upper() self.accountData.addItem(tex) i += 1 self.FormLayout = QFormLayout() self.FormLayout.addRow(self.expenseGroupText, self.expenseGroupData) self.FormLayout.addRow(self.expenseText, self.expenseData) self.FormLayout.addRow(self.accountText, self.accountData) self.FormLayout.addRow(self.tellerText, self.tellerData) self.FormLayout.addRow(self.amountText, self.amountData) self.FormLayout.addRow(self.gender, hboz) self.FormLayout.addRow(self.dateText, self.dateData) self.FormLayout.addRow(self.descriptionText, self.descriptionData) groupBox1 = QGroupBox('Add Expenses') groupBox1.setLayout(self.FormLayout) self.pb = QPushButton() self.pb.setObjectName("Add") self.pb.setText("Add Expenses") self.pb1 = QPushButton() self.pb1.setObjectName("Edit") self.pb1.setText("Edit Row") self.pb1.setEnabled(False) self.pb2 = QPushButton() self.pb2.setObjectName("Close") self.pb2.setText("Close") self.pb3 = QPushButton() self.pb3.setObjectName("Delete") self.pb3.setText("Delete Row") self.pb3.setEnabled(False) self.pb4 = QPushButton() self.pb4.setObjectName("Reset") self.pb4.setText("Reset") self.pb4.hide() self.pb5 = QPushButton() self.pb5.setObjectName("Change") self.pb5.setText("Change Expenses") self.pb5.hide() self.pb6 = QPushButton() self.pb6.setObjectName("Clear") self.pb6.setText("Clear Selection") self.pb6.setEnabled(False) hbo = QHBoxLayout() hbo.addWidget(self.pb) hbo.addWidget(self.pb5) hbo.addWidget(self.pb4) hbo.addWidget(self.pb2) groupBox2 = QGroupBox('Expenses Data') groupBox2.setLayout(hbo) self.cols = ['SN', 'EXPENSES', 'ACCOUNT', 'AMOUNT', 'DATE'] al = self.pullExpensesData() if len(al) > 0: al = al else: al = {} self.table = QTableWidget() header = self.table.horizontalHeader() header.setResizeMode(QHeaderView.ResizeToContents) header.setStretchLastSection(True) header.setStyleSheet(self.tableHeaderStyle) vheader = self.table.verticalHeader() vheader.setStyleSheet(self.tableHeaderStyle) # Body self.table.setWindowTitle("Expenses") self.table.resize(300, 250) self.table.setFont(self.tableFont) self.table.setSortingEnabled(2) #self.table.resizeColumnsToContents() self.table.setRowCount(len(al)) self.table.setColumnCount(len(self.cols)) self.table.setHorizontalHeaderLabels(self.cols) self.table.setContextMenuPolicy(Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.handleHeaderMenu) self.table.hideColumn(0) self.table.setSelectionMode(QAbstractItemView.MultiSelection) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) i = 0 for q in al: #row id self.table.setItem(i, 0, QTableWidgetItem(str(q['id']))) self.table.setItem(i, 1, QTableWidgetItem(str(q['expensename']).upper())) self.table.setItem(i, 2, QTableWidgetItem(str(q['accountname']).upper())) zamt = str("{:,}".format(float(q['amount']))) self.table.setItem(i, 3, QTableWidgetItem(zamt)) damz = float(q['datepaid']) damt = datetime.utcfromtimestamp(damz).strftime('%d-%m-%Y') self.table.setItem(i, 4, QTableWidgetItem(str(damt))) i += 1 self.table.itemSelectionChanged.connect(self.confirmSelection) self.table.resizeRowsToContents() v_pull_box = QVBoxLayout() self.h1_pull_box = QVBoxLayout() self.h1_pull_box.addWidget(self.table) v_pull_box.addLayout(h_pull_box) v_pull_box.addLayout(self.h1_pull_box) h2_pull_box = QHBoxLayout() h2_pull_box.addWidget(self.pb1) h2_pull_box.addWidget(self.pb3) h2_pull_box.addWidget(self.pb6) v_pull_box.addLayout(h2_pull_box) groupBox3 = QGroupBox() groupBox3.setLayout(hbo) groupBox2.setLayout(v_pull_box) grid = QGridLayout() grid.addWidget(groupBox1, 0, 0) grid.addWidget(groupBox2, 0, 1, 2, 1) grid.addWidget(groupBox3, 1, 0) self.setLayout(grid) self.connect(self.pb, SIGNAL("clicked()"), lambda: self.button_click()) self.connect(self.pb1, SIGNAL("clicked()"), lambda: self.button_editshow()) self.connect(self.pb2, SIGNAL("clicked()"), lambda: self.button_close(self)) self.connect(self.pb3, SIGNAL("clicked()"), lambda: self.button_delete()) self.connect(self.pb4, SIGNAL("clicked()"), lambda: self.button_reset()) self.connect(self.pb5, SIGNAL("clicked()"), lambda: self.button_edit()) self.connect(self.pb6, SIGNAL("clicked()"), lambda: self.button_clear()) self.connect(self.pull_btn, SIGNAL("clicked()"), lambda x=1: self.reloadTable(x)) self.setWindowTitle(self.pagetitle) def handleHeaderMenu(self, pos): print('column(%d)' % self.table.horizontalHeader().logicalIndexAt(pos)) menu = QMenu() menu.addAction('Add') menu.addAction('Delete') menu.exec_(QCursor.pos()) def pullGroupExpenses(self): cn = Db() arr = cn.selectn('datas', '', '', {"pubID": 15, "active": 0}) return arr def pullExpenses(self, a): cn = Db() arr = cn.selectn('datas', '', '', {"subID": a}) return arr def pullAccount(self): cn = Db() arr = cn.selectn('datas', '', '', {"pubID": 20, "active": 0}) return arr def pullExpensesData(self): st_date = self.fromData.date().toPyDate() en_date = self.toData.date().toPyDate() st_date = time.mktime(st_date.timetuple()) en_date = time.mktime(en_date.timetuple()) db = 'school_expenses' + str(self.session) cn = Db() arr = cn.selectExpenseDate(db, st_date, en_date) return arr def mySelectTable(self): ''' get the selected rpws in a table returns list or row ids ''' sels = self.table.selectedIndexes() sels = self.table.selectionModel().selectedRows() park = [] park1 = [] for j in sels: park.append(j.row()) for i in set(park): selected = self.table.item(i, 0).text() park1.append(selected) return park1 def editRow(self, a): _session = self.session g = Db() db = 'school_expenses' + str(_session) data = g.selectn(db, '', 1, {'id': a}) if len(data) > 0: self.editID = int(data['id']) if float(data['amount']) < 0: amt = float(data['amount']) * -1 self.amountData.setText(str(amt)) self.r1.setChecked(True) else: amt = float(data['amount']) self.amountData.setText(str(amt)) self.r2.setChecked(True) self.descriptionData.clear() self.descriptionData.insertPlainText(str(data['description'])) self.tellerData.setText(str(data['teller'])) acID = self.hold_account.keys()[self.hold_account.values().index( data['accountID'])] self.accountData.setCurrentIndex(acID) exID = self.hold_expenses.keys()[self.hold_expenses.values().index( data['expenseID'])] self.expenseData.setCurrentIndex(exID) def reloadExpenses(self): cat = self.hold_expensesGroup[self.expenseGroupData.currentIndex()] expenses = self.pullExpenses(cat) self.expenseData.clear() self.hold_expenses = {} i = 0 for a in expenses: self.hold_expenses[i] = a['id'] tex = str(a['name']).upper() self.expenseData.addItem(tex) i += 1 def reloadTable(self, a): data = self.pullExpensesData() self.table.close() self.table = QTableWidget() header = self.table.horizontalHeader() header.setResizeMode(QHeaderView.ResizeToContents) header.setStretchLastSection(True) header.setStyleSheet(self.tableHeaderStyle) vheader = self.table.verticalHeader() vheader.setStyleSheet(self.tableHeaderStyle) # Body self.table.setWindowTitle("Expenses") self.table.resize(300, 250) self.table.setFont(self.tableFont) self.table.setSortingEnabled(2) self.table.resizeColumnsToContents() self.table.setRowCount(len(data)) self.table.setColumnCount(len(self.cols)) self.table.setHorizontalHeaderLabels(self.cols) self.table.setContextMenuPolicy(Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.handleHeaderMenu) self.table.hideColumn(0) self.table.setSelectionMode(QAbstractItemView.MultiSelection) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) i = 0 for q in data: #row id self.table.setItem(i, 0, QTableWidgetItem(str(q['id']))) self.table.setItem(i, 1, QTableWidgetItem(str(q['expensename']).upper())) self.table.setItem(i, 2, QTableWidgetItem(str(q['accountname']).upper())) zamt = str("{:,}".format(float(q['amount']))) self.table.setItem(i, 3, QTableWidgetItem(zamt)) damz = float(q['datepaid']) damt = datetime.utcfromtimestamp(damz).strftime('%d-%m-%Y') self.table.setItem(i, 4, QTableWidgetItem(str(damt))) i += 1 self.table.itemSelectionChanged.connect(self.confirmSelection) self.table.resizeRowsToContents() self.h1_pull_box.addWidget(self.table) self.table.show() def pullOnes(self, a, b): cn = Db() arr = cn.selectn(a, '', 1, {'id': b}) return arr def confirmSelection(self): item = self.mySelectTable() if len(item) == 1: self.pb1.setEnabled(True) self.pb3.setEnabled(True) self.pb6.setEnabled(True) elif len(item) > 1: self.pb1.setEnabled(False) self.pb3.setEnabled(True) self.pb6.setEnabled(True) else: self.pb1.setEnabled(False) self.pb3.setEnabled(False) self.pb6.setEnabled(False) def button_close(self, b): b.close() def button_editshow(self): item = self.mySelectTable() self.editRow(item[0]) self.pb.hide() self.pb4.show() self.pb5.show() def button_delete(self): item = self.mySelectTable() _session = self.session g = Db() db = 'school_expenses' + str(_session) for j in item: g.delete(db, {'id': j}) self.reloadTable(1) def button_edit(self): _session = self.session _amount = self.amountData.text() _teller = self.tellerData.text() _date = self.dateData.date().toPyDate() _date = time.mktime(_date.timetuple()) _description = self.descriptionData.toPlainText() _account = self.hold_account[self.accountData.currentIndex()] _expense = self.hold_expenses[self.expenseData.currentIndex()] if self.r1.isChecked(): _amount = float(_amount) else: _amount = float(_amount) * -1 arr = {} if _amount and not (_amount == 0) and int(_expense) > 0 and int(_account) > 0: arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['accountID'] = _account arr['expenseID'] = _expense arr['teller'] = _teller ups = {} ups['id'] = self.editID if int(self.editID) > 0: db = 'school_expenses' + str(_session) g = Db() g.update(db, arr, ups) if int(self.editID) > 0: self.button_reset() def button_reset(self): self.reloadTable(1) self.amountData.setText('') self.descriptionData.clear() self.tellerData.setText('') self.pb4.hide() self.pb5.hide() self.pb.show() self.editID = 0 self.button_clear() self.confirmSelection() def button_clear(self): self.table.selectionModel().clearSelection() def button_click(self): _session = self.session _amount = self.amountData.text() _teller = self.tellerData.text() _date = self.dateData.date().toPyDate() _date = time.mktime(_date.timetuple()) _description = self.descriptionData.toPlainText() _account = self.hold_account[self.accountData.currentIndex()] _expense = self.hold_expenses[self.expenseData.currentIndex()] if self.r1.isChecked(): _amount = float(_amount) else: _amount = float(_amount) * -1 arr = {} if _amount and not (_amount == 0) and int(_expense) > 0 and int(_account) > 0: arr['amount'] = _amount arr['datepaid'] = _date arr['description'] = _description arr['accountID'] = _account arr['expenseID'] = _expense arr['teller'] = _teller db = 'school_expenses' + str(_session) g = Db() ins = g.insert(db, arr) if int(ins) > 0: self.button_reset()
class DataItemWidget(QWidget): __EXTRA_COLUMN_WIDTH = 20 def __init__(self, me_cls, data): QWidget.__init__(self) self.__me_cls = me_cls self.__setup_ui() self.__data = data self.__init_data() self.__connect_slot() def __setup_ui(self): v_layout = QVBoxLayout() self.__tool_widget = ToolWidget() self.__tool_widget.setMaximumHeight(40) self.__data_table_widget = QTableWidget() self.__data_table_widget.horizontalHeader().setStretchLastSection(True) self.__data_table_widget.horizontalHeader().setResizeMode( 0, QHeaderView.Fixed) v_layout.setSpacing(0) v_layout.setContentsMargins(0, 0, 0, 0) v_layout.addWidget(self.__tool_widget, 0) v_layout.addWidget(self.__data_table_widget, 1) self.setLayout(v_layout) def __connect_slot(self): pass #self.connect(self.__tool_widget,SIGNAL('refresh_btn_clicked()'), self ,SLOT('__on_refresh_signal()')) def __init_data(self): self.__data_table_widget.clearContents() # init header #self.__colume_names = yt_connection.get_table_colume_names(self.__table_name) self.__colume_names = [x.field.name for x in self.__me_cls.attributes] #self.__colume_names.insert(0,'entity_id') #print self.__colume_names self.__data_table_widget.setColumnCount(len(self.__colume_names)) head_list = QStringList() for colume in self.__colume_names: head_list << colume self.__data_table_widget.setHorizontalHeaderLabels(head_list) # default the header column both sides are coverd, these codes add __EXTRA_COLUMN_WIDTH to the header column width # and reise column width in function self.__adjust_table_colume() self.__data_table_widget.horizontalHeader().setResizeMode( QHeaderView.ResizeToContents) self.__record_colume_header_width() self.__data_table_widget.horizontalHeader().setResizeMode( QHeaderView.Interactive) self.__record_colume_header_width() show_data = [] for entity_id, value in self.__data.items(): item = value.obj_data.copy() item['managed_entity_id'] = entity_id show_data.append(item) self.__update_table(show_data) # init data # data = yt_connection.get_table_data(self.__table_name) # # self.__update_table(data) self.__adjust_table_colume() def __record_colume_header_width(self): count = self.__data_table_widget.columnCount() self.__column_widths = [] for i in range(count): self.__column_widths.append( self.__data_table_widget.columnWidth(i) + self.__EXTRA_COLUMN_WIDTH) ''' data like this [ {u'direction': 'to-lport', u'name': '[]', u'priority': '100', u'log': 'true', u'action': 'drop', u'external_ids': '{"neutron:lport"="5fb77332-2035-4f72-8e57-7415b02489c9"}', u'match': '"outport==\\"inside-vm2\\""', u'severity': '[]', 'uuid': '2890a832-1c83-4b8e-8b40-2928817012cc'} ] ''' def __update_table(self, data): self.__data_table_widget.clearContents() row_num = 0 for row in data: self.__data_table_widget.insertRow(row_num) colume_num = 0 for colume in self.__colume_names: if row.has_key(colume): item_str = str(row[colume]) else: item_str = 'None' table_wid_item = QTableWidgetItem(item_str) table_wid_item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) self.__data_table_widget.setItem(row_num, colume_num, table_wid_item) colume_num += 1 row_num += 1 def __clear_table_data(self): row_count = self.__data_table_widget.rowCount() rev = [i for i in range(row_count)] rev.reverse() for i in rev: self.__data_table_widget.removeRow(i) def __adjust_table_colume(self): self.__data_table_widget.resizeColumnsToContents() count = self.__data_table_widget.columnCount() for i in range(count): col_wid = self.__data_table_widget.columnWidth(i) if col_wid < self.__column_widths[i]: self.__data_table_widget.setColumnWidth( i, self.__column_widths[i])
class MainWidget(QMainWindow): def __init__(self, parent=None): super(MainWidget, self).__init__(parent, windowTitle='GithubRemote', windowIcon=QIcon(image_path('git.png')), geometry=QRect(300, 300, 600, 372)) self.repo_pixmap = QPixmap(image_path('book_16.png')) self.big_repo_pixmap = QPixmap(image_path('book_32.png')) self.repo_fork_pixmap = QPixmap(image_path('book_fork_16.png')) self.star_pixmap = QPixmap(image_path('star_16.png')) self.big_star_pixmap = QPixmap(image_path('star_32.png')) self.fork_pixmap = QPixmap(image_path('fork_16.png')) self.eye_pixmap = QPixmap(image_path('eye_16.png')) self.github = None # Actions self.repoAddAction = QAction(QIcon(image_path('plus_48.png')), '&Add Repo', self, statusTip='Add a new repo') self.repoAddAction.triggered.connect(self.repoAdd) self.repoRemoveAction = QAction(QIcon(image_path('minus.png')), '&Remove Repo', self, statusTip='Remove repo') self.repoRemoveAction.triggered.connect(self.repoRemove) self.repoRefreshAction = QAction(QIcon(image_path('refresh.png')), 'Refresh', self, statusTip='Refresh list of repos') self.repoRefreshAction.triggered.connect(self.reposRefresh) self.repoRefreshAction.triggered.connect(self.starsRefresh) self.addAccountAction = QAction('Add Account', self, statusTip='Add Account') self.addAccountAction.triggered.connect(self.addAccount) # userPushButton - Displays the current active username and # image on the top right of the toolbar. self.userButtonMenu = UserButtonMenu(32, 32) # ToolBar self.toolBar = self.addToolBar('Main') self.toolBar.setMovable(False) self.toolBar.setFloatable(False) spacer = QWidget() spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.toolBar.addAction(self.repoAddAction) self.toolBar.addAction(self.repoRemoveAction) self.toolBar.addAction(self.repoRefreshAction) self.toolBar.addWidget(spacer) self.toolBar.addWidget(self.userButtonMenu) # Menu menuBar = self.menuBar() fileMenu = menuBar.addMenu('&File') actionMenu = menuBar.addMenu('&Action') fileMenu.addAction(self.addAccountAction) actionMenu.addAction(self.repoAddAction) actionMenu.addAction(self.repoRemoveAction) actionMenu.addAction(self.repoRefreshAction) # StatusBar statusBar = self.statusBar() self.setStatusBar(statusBar) # reposTableWidget - Displays a list of the users repositories self.reposTableWidget = QTableWidget( 0, 5, selectionBehavior=QAbstractItemView.SelectRows, selectionMode=QAbstractItemView.SingleSelection, editTriggers=QAbstractItemView.NoEditTriggers, itemSelectionChanged=self.actionsUpdate) self.reposTableWidget.horizontalHeader().setResizeMode( QHeaderView.ResizeToContents) self.reposTableWidget.horizontalHeader().setResizeMode( 1, QHeaderView.Stretch) self.reposTableWidget.horizontalHeader().setVisible(False) self.reposTableWidget.verticalHeader().setVisible(False) self.reposTableWidget.setShowGrid(False) self.reposTableWidget.verticalHeader().setMinimumSectionSize(25) # repoTab - Layout reposTab = QWidget() reposTabLayout = QVBoxLayout(reposTab) reposTabLayout.addWidget(self.reposTableWidget) reposTab.setLayout(reposTabLayout) # starsTableWidget - Displays a list of the users repositories self.starsTableWidget = QTableWidget( 0, 5, selectionBehavior=QAbstractItemView.SelectRows, selectionMode=QAbstractItemView.SingleSelection, editTriggers=QAbstractItemView.NoEditTriggers, itemSelectionChanged=self.actionsUpdate) self.starsTableWidget.horizontalHeader().setResizeMode( QHeaderView.ResizeToContents) self.starsTableWidget.horizontalHeader().setResizeMode( 1, QHeaderView.Stretch) self.starsTableWidget.horizontalHeader().setVisible(False) self.starsTableWidget.verticalHeader().setVisible(False) self.starsTableWidget.setShowGrid(False) self.starsTableWidget.verticalHeader().setMinimumSectionSize(25) # repoTab - Layout starsTab = QWidget() starsTabLayout = QVBoxLayout(starsTab) starsTabLayout.addWidget(self.starsTableWidget) starsTab.setLayout(starsTabLayout) # Tab Widget self.tabs = QTabWidget() self.tabs.setTabBar(FlippedTabBar(self)) self.tabs.addTab(reposTab, QIcon(self.big_repo_pixmap), "repos") self.tabs.addTab(starsTab, QIcon(self.big_star_pixmap), "stars") self.tabs.setTabPosition(QTabWidget.West) # Layout self.setCentralWidget(self.tabs) self.actionsUpdate() self.show() # Update self.loadUserMenu() if self.activeUserAction: self.activeUserAction.setVisible(False) self.authenticate() self.actionsUpdate() self.reposRefresh() self.starsRefresh() self.updateImage() @waiting_effects def updateImage(self): try: url = self.github.get_user().avatar_url except (GithubException, AttributeError): return data = urllib.urlopen(url).read() pixmap = QPixmap() pixmap.loadFromData(data) self.activeUserAction.setIcon(QIcon(pixmap)) self.userButtonMenu.setPixmap(pixmap) self.userButtonMenu.setText(self.github.get_user().login) @waiting_effects def loadUserMenu(self): action = None for _, username, token in generate_tokens(CONFIG_PATH, 'github'): try: url = Github(token).get_user().avatar_url except (GithubException, AttributeError): action = QAction(username, self, triggered=self.changeActive) self.userButtonMenu.addAction(action) continue data = urllib.urlopen(url).read() pixmap = QPixmap() pixmap.loadFromData(data) action = QAction(QIcon(pixmap), username, self, triggered=self.changeActive) action.setIconVisibleInMenu(True) self.userButtonMenu.addAction(action) self.activeUserAction = action def changeActive(self): sender = self.sender() self.activeUserAction.setVisible(True) self.activeUserAction = sender self.activeUserAction.setVisible(False) self.authenticate() self.actionsUpdate() self.reposRefresh() self.starsRefresh() self.updateImage() @waiting_effects def reposRefresh(self): self.reposTableWidget.clearContents() try: repos = self.github.get_user().get_repos() self.reposTableWidget.setRowCount( self.github.get_user().public_repos) except (GithubException, AttributeError): return for row, repo in enumerate(repos): imageLabel = QLabel() if repo.fork: imageLabel.setPixmap(self.repo_fork_pixmap) else: imageLabel.setPixmap(self.repo_pixmap) imageLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) imageLabel.setMargin(5) self.reposTableWidget.setCellWidget(row, 0, imageLabel) label = QLabel('<b>{}</b><br />{}'.format(str(repo.name), str(repo.description))) label.setAlignment(Qt.AlignVCenter) label.setMargin(5) label.setWordWrap(True) self.reposTableWidget.setCellWidget(row, 1, label) self.reposTableWidget.setItem( row, 2, QTableWidgetItem(QIcon(self.star_pixmap), str(repo.stargazers_count))) self.reposTableWidget.setItem( row, 3, QTableWidgetItem(QIcon(self.eye_pixmap), str(repo.watchers_count))) self.reposTableWidget.setItem( row, 4, QTableWidgetItem(QIcon(self.fork_pixmap), str(repo.forks_count))) self.reposTableWidget.resizeRowsToContents() @waiting_effects def starsRefresh(self): self.starsTableWidget.clearContents() try: starred = self.github.get_user().get_starred() self.starsTableWidget.setRowCount( self.github.get_user().public_repos) except (GithubException, AttributeError): return for row, repo in enumerate(starred): imageLabel = QLabel() if repo.fork: imageLabel.setPixmap(self.repo_fork_pixmap) else: imageLabel.setPixmap(self.repo_pixmap) imageLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) imageLabel.setMargin(5) self.starsTableWidget.setCellWidget(row, 0, imageLabel) label = QLabel(u'<b>{}/{}</b><br />{}'.format( unicode(repo.owner.login), unicode(repo.name), unicode(repo.description))) label.setAlignment(Qt.AlignVCenter) label.setMargin(5) label.setWordWrap(True) self.starsTableWidget.setCellWidget(row, 1, label) self.starsTableWidget.setItem( row, 2, QTableWidgetItem(QIcon(self.star_pixmap), '0')) self.starsTableWidget.setItem( row, 3, QTableWidgetItem(QIcon(self.eye_pixmap), str(repo.watchers_count))) self.starsTableWidget.setItem( row, 4, QTableWidgetItem(QIcon(self.fork_pixmap), str(repo.forks_count))) self.starsTableWidget.resizeRowsToContents() @waiting_effects def authenticate(self): if self.activeUserAction: username = str(self.activeUserAction.text()) token = load_token(CONFIG_PATH, 'github', username) self.github = Github(token) else: self.github = None def actionsUpdate(self): # TODO disable if no user is logged in if self.github is None: self.repoAddAction.setEnabled(False) self.repoRemoveAction.setEnabled(False) self.repoRefreshAction.setEnabled(False) else: self.repoAddAction.setEnabled(True) self.repoRefreshAction.setEnabled(True) if self._isARepoSelected(): self.repoRemoveAction.setEnabled(True) else: self.repoRemoveAction.setEnabled(False) def addAccount(self): wizard = AddAccountWizard(self) if wizard.exec_(): username = str(wizard.field('username').toString()) token = str(wizard.field('token').toString()) store_token(CONFIG_PATH, 'github', username, token) self.authenticate() self.reposRefresh() self.updateImage() self.actionsUpdate() def repoAdd(self): wizard = AddRepoWizard(self.github, self) if wizard.exec_(): self.github.get_user().create_repo( str(wizard.field('name').toString()), description=str(wizard.field('description').toString()), private=bool(wizard.field('private').toBool()), auto_init=bool(wizard.field('auto_init').toBool()), gitignore_template=str(wizard.field('gitignore').toString()), homepage=str(wizard.field('homepage').toString()), has_wiki=bool(wizard.field('has_wiki').toBool()), has_downloads=bool(wizard.field('has_downloads').toBool()), has_issues=bool(wizard.field('has_issues').toBool())) self.reposRefresh() def repoRemove(self): row = self._selectedRepoRow() name = self.reposTableWidget.item(row, 0).text() dialog = RepoRemoveDialog(self.github, name) if dialog.exec_(): self.github.get_user().get_repo(str(name)).delete() self.reposRefresh() def _isARepoSelected(self): """ Return True if a repo is selected else False """ if len(self.reposTableWidget.selectedItems()) > 0: return True else: return False def _selectedRepoRow(self): """ Return the currently select repo """ # TODO - figure out what happens if no repo is selected selectedModelIndexes = \ self.reposTableWidget.selectionModel().selectedRows() for index in selectedModelIndexes: return index.row()
class OWxsh_waviness(widget.OWWidget): name = "xsh_waviness" id = "orange.widgets.preprocessor.xsh_waviness" description = "xoppy application to compute..." icon = "icons/waviness.png" author = "Luca Rebuffi" maintainer_email = "[email protected]; [email protected]" priority = 10 category = "" keywords = ["xoppy", "xsh_waviness"] outputs = [{"name": "PreProcessor_Data", "type": ShadowPreProcessorData, "doc": "PreProcessor Data", "id": "PreProcessor_Data"}] want_main_area = 1 want_control_area = 1 WIDGET_WIDTH = 1100 WIDGET_HEIGHT = 650 xx = None yy = None zz = None number_of_points_x = Setting(10) number_of_points_y = Setting(100) dimension_x = Setting(20.1) dimension_y = Setting(113.1) estimated_slope_error = Setting(0.9) montecarlo_seed = Setting(2387427) waviness_file_name = Setting('waviness.dat') harmonic_maximum_index = Setting(60) data = Setting({'c': ['0.3', '0.1', '0.1', '0.0', '0.0', '0.0', '0.3', '0.0', '0.0', '0.3', '0.0', '0.0', '0.5', '0.0', '0.0', '0.2', '0.2', '0.2', '0.9', '0.0', '0.0', '0.0', '0.0', '0.0', '0.4', '0.0', '0.0', '0.4', '0.0', '0.0', '0.0', '0.6', '0.6', '0.0', '0.4', '0.4', '0.0', '0.4', '0.4', '0.1', '0.4', '0.4', '0.1', '0.2', '0.2', '0.0', '0.2', '0.2', '0.0', '0.3', '0.3', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0'], 'y': ['0.0', '-0.1', '-0.1', '0.0', '0.0', '0.0', '0.03', '0.0', '0.0', '0.2', '0.0', '0.0', '0.2', '0.0', '0.0', '0.1', '0.1', '0.1', '0.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.01', '0.0', '0.0', '0.03', '0.0', '0.0', '0.0', '0.02', '0.02', '0.0', '0.1', '0.1', '0.0', '0.1', '0.1', '0.0', '0.1', '0.1', '0.0', '0.0', '0.0', '0.0', '0.3', '0.3', '0.0', '0.2', '0.2', '0.0', '0.2', '0.2', '0.0', '0.2', '0.2', '0.0', '0.0', '0.0', '0.0'], 'g': ['0.0', '0.3', '0.3', '0.0', '0.0', '0.0', '0.05', '0.0', '0.0', '0.05', '0.0', '0.0', '0.1', '0.0', '0.0', '0.05', '0.05', '0.05', '0.2', '0.0', '0.0', '0.0', '0.0', '0.0', '0.1', '0.0', '0.0', '0.1', '0.0', '0.0', '0.0', '0.2', '0.2', '0.0', '0.1', '0.1', '0.0', '0.1', '0.1', '0.0', '0.1', '0.1', '0.0', '0.0', '0.0', '0.0', '0.1', '0.1', '0.0', '0.2', '0.2', '0.0', '0.1', '0.1', '0.0', '0.1', '0.1', '0.0', '0.0', '0.0', '0.0']}) def __init__(self): super().__init__() geom = QApplication.desktop().availableGeometry() self.setGeometry(QRect(round(geom.width() * 0.05), round(geom.height() * 0.05), round(min(geom.width() * 0.98, self.WIDGET_WIDTH)), round(min(geom.height() * 0.95, self.WIDGET_HEIGHT)))) gen_box = ShadowGui.widgetBox(self.controlArea, "Waviness Parameters", addSpace=True, orientation="horizontal", width=500) tabs_setting = gui.tabWidget(gen_box) tab_input = ShadowGui.createTabPage(tabs_setting, "Input Parameter") tab_harmonics = ShadowGui.createTabPage(tabs_setting, "Harmonics") tab_out = ShadowGui.createTabPage(tabs_setting, "Output") self.input_box = ShadowGui.widgetBox(tab_input, "Inputs", addSpace=True, orientation="vertical", width=470) gui.button(self.input_box, self, "Load xsh_waviness input file ...", callback=self.load_inp_file) gui.separator(self.input_box) ShadowGui.lineEdit(self.input_box, self, "number_of_points_x", "Number of Points (<201) X (width)", labelWidth=300, valueType=int, orientation="horizontal") ShadowGui.lineEdit(self.input_box, self, "number_of_points_y", " Y (length)", labelWidth=300, valueType=int, orientation="horizontal") gui.separator(self.input_box) ShadowGui.lineEdit(self.input_box, self, "dimension_x", "Dimensions [cm] X (width)", labelWidth=300, valueType=float, orientation="horizontal") ShadowGui.lineEdit(self.input_box, self, "dimension_y", " Y (length)", labelWidth=300, valueType=float, orientation="horizontal") gui.separator(self.input_box) ShadowGui.lineEdit(self.input_box, self, "estimated_slope_error", "Estimated slope error [arcsec]", labelWidth=300, valueType=float, orientation="horizontal") ShadowGui.lineEdit(self.input_box, self, "montecarlo_seed", "Monte Carlo initial seed", labelWidth=300, valueType=int, orientation="horizontal") self.output_box = ShadowGui.widgetBox(tab_input, "Outputs", addSpace=True, orientation="vertical", width=470) self.select_file_box = ShadowGui.widgetBox(self.output_box, "", addSpace=True, orientation="horizontal") gui.separator(self.output_box) gui.button(self.output_box, self, "Write xsh_waviness input file (optional) ...", callback=self.write_inp_file) ShadowGui.lineEdit(self.select_file_box, self, "waviness_file_name", "Output File Name", labelWidth=120, valueType=str, orientation="horizontal") self.harmonics_box = ShadowGui.widgetBox(tab_harmonics, "Harmonics", addSpace=True, orientation="vertical", width=470, height=690) ShadowGui.lineEdit(self.harmonics_box, self, "harmonic_maximum_index", "Harmonic Maximum Index", labelWidth=300, valueType=int, orientation="horizontal", callback=self.set_harmonics) gui.separator(self.harmonics_box) self.scrollarea = QScrollArea() self.scrollarea.setMaximumWidth(400) self.harmonics_box.layout().addWidget(self.scrollarea, alignment=Qt.AlignHCenter) self.shadow_output = QTextEdit() self.shadow_output.setReadOnly(True) out_box = ShadowGui.widgetBox(tab_out, "System Output", addSpace=True, orientation="horizontal", height=600) out_box.layout().addWidget(self.shadow_output) button_box = ShadowGui.widgetBox(self.controlArea, "", addSpace=False, orientation="horizontal") button = gui.button(button_box, self, "Calculate Waviness", callback=self.calculate_waviness) button.setFixedHeight(45) button.setFixedWidth(170) button = gui.button(button_box, self, "Generate Waviness File", callback=self.generate_waviness_file) font = QFont(button.font()) font.setBold(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Blue')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button.setFixedWidth(200) button = gui.button(button_box, self, "Reset Fields", callback=self.call_reset_settings) font = QFont(button.font()) font.setItalic(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Red')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button.setFixedWidth(120) gui.rubber(self.controlArea) self.figure = Figure(figsize=(600, 600)) self.figure.patch.set_facecolor('white') self.axis = self.figure.add_subplot(111, projection='3d') self.axis.set_xlabel("X (cm)") self.axis.set_ylabel("Y (cm)") self.axis.set_zlabel("Z (µm)") self.figure_canvas = FigureCanvasQTAgg(self.figure) self.mainArea.layout().addWidget(self.figure_canvas) gui.rubber(self.mainArea) def restoreWidgetPosition(self): super().restoreWidgetPosition() self.table = QTableWidget(self.harmonic_maximum_index + 1, 3) self.table.setAlternatingRowColors(True) self.table.horizontalHeader().setResizeMode(QHeaderView.Fixed) for i in range(0, 3): self.table.setColumnWidth(i, 70) horHeaders = [] verHeaders = [] for n, key in enumerate(sorted(self.data.keys())): horHeaders.append(key) for m, item in enumerate(self.data[key]): table_item = QTableWidgetItem(str(item)) table_item.setTextAlignment(Qt.AlignRight) self.table.setItem(m, n, table_item) verHeaders.append(str(m)) self.table.setHorizontalHeaderLabels(horHeaders) self.table.setVerticalHeaderLabels(verHeaders) self.table.resizeRowsToContents() self.table.itemChanged.connect(self.table_item_changed) self.scrollarea.setWidget(self.table) self.scrollarea.setWidgetResizable(1) gui.rubber(self.controlArea) def reload_harmonics_table(self): horHeaders = [] verHeaders = [] self.table.itemChanged.disconnect(self.table_item_changed) self.table.clear() row_count = self.table.rowCount() for n in range(0, row_count): self.table.removeRow(0) for index in range(0, self.harmonic_maximum_index + 1): self.table.insertRow(0) for n, key in enumerate(sorted(self.data.keys())): horHeaders.append(key) for m, item in enumerate(self.data[key]): table_item = QTableWidgetItem(str(item)) table_item.setTextAlignment(Qt.AlignRight) self.table.setItem(m, n, table_item) verHeaders.append(str(m)) self.table.setHorizontalHeaderLabels(horHeaders) self.table.setVerticalHeaderLabels(verHeaders) self.table.resizeRowsToContents() for i in range(0, 3): self.table.setColumnWidth(i, 70) self.table.itemChanged.connect(self.table_item_changed) def table_item_changed(self): dict = {} message = "" error_row_index = -1 error_column_index = -1 previous_value = "" try: row_count = self.harmonic_maximum_index + 1 for column_index in range(0, self.table.columnCount()): column_name = self.table.horizontalHeaderItem(column_index).data(0) row_content = [] for row_index in range(0, row_count): if not self.table.item(row_index, column_index) is None: message = "Value at row " + str( row_index) + " and column \'" + column_name + "\' is not numeric" error_row_index = row_index error_column_index = column_index previous_value = self.data[column_name][row_index] value = float(self.table.item(row_index, column_index).data(0)) # to raise exception row_content.append(str(value)) dict[column_name] = row_content self.data = dict except ValueError: QMessageBox.critical(self, "QMessageBox.critical()", message + "\nValue is reset to previous value", QMessageBox.Ok) table_item = QTableWidgetItem(previous_value) table_item.setTextAlignment(Qt.AlignRight) self.table.setItem(error_row_index, error_column_index, table_item) self.table.setCurrentCell(error_row_index, error_column_index) except Exception as exception: QMessageBox.critical(self, "QMessageBox.critical()", exception.args[0], QMessageBox.Ok) def set_harmonics(self): if self.harmonic_maximum_index < 0: QMessageBox.critical(self, "QMessageBox.critical()", "Harmonic Maximum Index should be a positive integer number", QMessageBox.Ok) else: row_count = len(self.data["c"]) if self.harmonic_maximum_index + 1 > row_count: for n, key in enumerate(sorted(self.data.keys())): for m in range(row_count, self.harmonic_maximum_index + 1): self.data[key].append('0.0') else: for n, key in enumerate(sorted(self.data.keys())): self.data[key] = copy.deepcopy(self.data[key][0: self.harmonic_maximum_index + 1]) self.reload_harmonics_table() def load_inp_file(self): file_name = QFileDialog.getOpenFileName(self, "Select a input file for XSH_WAVINESS", ".", "*.inp") if not file_name is None: sys.stdout = EmittingStream(textWritten=self.writeStdOut) if not file_name.strip() == "": dict = ST.waviness_read(file=file_name) self.number_of_points_x = dict["npointx"] self.number_of_points_y = dict["npointy"] self.dimension_y = dict["xlength"] self.dimension_x = dict["width"] self.estimated_slope_error = dict["slp"] self.montecarlo_seed = dict["iseed"] self.waviness_file_name = dict["file"].strip('\n\r').strip() self.harmonic_maximum_index = dict["nharmonics"] self.data["c"] = self.to_str_array(dict["c"]) self.data["y"] = self.to_str_array(dict["y"]) self.data["g"] = self.to_str_array(dict["g"]) self.reload_harmonics_table() def write_inp_file(self): try: sys.stdout = EmittingStream(textWritten=self.writeStdOut) self.check_fields() file_name = self.waviness_file_name.strip().split(sep=".dat")[0] + ".inp" dict = {} dict["npointx"] = self.number_of_points_x dict["npointy"] = self.number_of_points_y dict["xlength"] = self.dimension_y dict["width"] = self.dimension_x dict["slp"] = self.estimated_slope_error dict["iseed"] = self.montecarlo_seed dict["file"] = self.waviness_file_name.strip('\n\r') dict["nharmonics"] = self.harmonic_maximum_index dict["c"] = self.to_float_array(self.data["c"]) dict["y"] = self.to_float_array(self.data["y"]) dict["g"] = self.to_float_array(self.data["g"]) ST.waviness_write(dict, file=file_name) QMessageBox.information(self, "QMessageBox.information()", "File \'" + file_name + "\' written to disk", QMessageBox.Ok) except Exception as exception: QMessageBox.critical(self, "QMessageBox.critical()", exception.args[0], QMessageBox.Ok) def calculate_waviness(self): try: sys.stdout = EmittingStream(textWritten=self.writeStdOut) self.check_fields() xx, yy, zz = ST.waviness_calc(npointx=self.number_of_points_x, npointy=self.number_of_points_y, width=self.dimension_x, xlength=self.dimension_y, slp=self.estimated_slope_error, nharmonics=self.harmonic_maximum_index, iseed=self.montecarlo_seed, c=self.to_float_array(self.data["c"]), y=self.to_float_array(self.data["y"]), g=self.to_float_array(self.data["g"])) self.xx = xx self.yy = yy self.zz = zz self.axis.clear() x_to_plot, y_to_plot = numpy.meshgrid(xx, yy) z_to_plot = [] for y_index in range(0, len(yy)): z_array = [] for x_index in range(0, len(xx)): z_array.append(1e4 * float(zz[x_index][y_index])) # to micron z_to_plot.append(z_array) z_to_plot = numpy.array(z_to_plot) self.axis.plot_surface(x_to_plot, y_to_plot, z_to_plot, rstride=1, cstride=1, cmap=cm.autumn, linewidth=0.5, antialiased=True) slope, sloperms = ST.slopes(zz, xx, yy) title = ' Slope error rms in X direction: %f arcsec' % (sloperms[0]) + '\n' + \ ' : %f urad' % (sloperms[2]) + '\n' + \ ' Slope error rms in Y direction: %f arcsec' % (sloperms[1]) + '\n' + \ ' : %f urad' % (sloperms[3]) self.axis.set_xlabel("X (cm)") self.axis.set_ylabel("Y (cm)") self.axis.set_zlabel("Z (µm)") self.axis.set_title(title) self.axis.mouse_init() self.figure_canvas.draw() QMessageBox.information(self, "QMessageBox.information()", "Waviness calculated: if the result is satisfactory,\nclick \'Generate Waviness File\' to complete the operation ", QMessageBox.Ok) except Exception as exception: QMessageBox.critical(self, "QMessageBox.critical()", exception.args[0], QMessageBox.Ok) def generate_waviness_file(self): if not self.zz is None and not self.yy is None and not self.xx is None: if not self.waviness_file_name is None: self.waviness_file_name = self.waviness_file_name.strip() if self.waviness_file_name == "": raise Exception("Output File Name missing") else: raise Exception("Output File Name missing") sys.stdout = EmittingStream(textWritten=self.writeStdOut) ST.write_shadow_surface(self.zz.T, self.xx, self.yy, outFile=self.waviness_file_name) QMessageBox.information(self, "QMessageBox.information()", "Waviness file " + self.waviness_file_name + " written on disk", QMessageBox.Ok) self.send("PreProcessor_Data", ShadowPreProcessorData(waviness_data_file=self.waviness_file_name)) def call_reset_settings(self): if ConfirmDialog.confirmed(parent=self, message="Confirm Reset of the Fields?"): try: self.resetSettings() self.reload_harmonics_table() except: pass def check_fields(self): self.number_of_points_x = ShadowGui.checkStrictlyPositiveNumber(self.number_of_points_x, "Number of Points X") self.number_of_points_y = ShadowGui.checkStrictlyPositiveNumber(self.number_of_points_y, "Number of Points Y") self.dimension_x = ShadowGui.checkStrictlyPositiveNumber(self.dimension_x, "Dimension X") self.dimension_y = ShadowGui.checkStrictlyPositiveNumber(self.dimension_y, "Dimension Y") self.estimated_slope_error = ShadowGui.checkPositiveNumber(self.estimated_slope_error, "Estimated slope error") self.montecarlo_seed = ShadowGui.checkPositiveNumber(self.montecarlo_seed, "Monte Carlo initial seed") self.harmonic_maximum_index = ShadowGui.checkPositiveNumber(self.harmonic_maximum_index, "Harmonic Maximum Index") if not self.waviness_file_name is None: self.waviness_file_name = self.waviness_file_name.strip() if self.waviness_file_name == "": raise Exception("Output File Name missing") else: raise Exception("Output File Name missing") def to_float_array(self, string_array): float_array = [] for index in range(len(string_array)): float_array.append(float(string_array[index])) return float_array def to_str_array(self, float_array): string_array = [] for index in range(len(float_array)): string_array.append(str(float_array[index])) return string_array def writeStdOut(self, text): cursor = self.shadow_output.textCursor() cursor.movePosition(QTextCursor.End) cursor.insertText(text) self.shadow_output.setTextCursor(cursor) self.shadow_output.ensureCursorVisible()
class ProcExpWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) # setup menu bar exitItem = QAction('Exit', self) exitItem.setShortcut('Ctrl+Q') exitItem.setStatusTip('Exit application') exitItem.triggered.connect(self.close) menuBar = self.menuBar() fileMenu = menuBar.addMenu('&File') fileMenu.addAction(exitItem) # setup widgets self.model = ProcTableModel(self) self.procTable = ProcTableWidget(self.model) self.procTable.clicked.connect(self.showDescriptors) self.handlesTable = QTableWidget() self.handlesTable.setColumnCount(2) self.handlesTable.setHorizontalHeaderLabels(('Type', 'Object Name')) self.handlesTable.verticalHeader().setVisible(False) self.handlesTable.setShowGrid(False) self.handlesTable.setSelectionBehavior(QTableWidget.SelectRows) self.handlesTable.horizontalHeader().setStretchLastSection(True) # TODO: find a way to get the row height from the QTreeView self.handlesTable.verticalHeader().setDefaultSectionSize(24) mainSplitter = QSplitter(Qt.Vertical) mainSplitter.addWidget(self.procTable) mainSplitter.addWidget(self.handlesTable) self.setCentralWidget(mainSplitter) desktopGeometry = QApplication.desktop().screenGeometry() self.setGeometry(0, 0, 1280, 700) self.move((desktopGeometry.width() - self.width()) / 2, (desktopGeometry.height() - self.height()) / 2) self.setWindowTitle('Linux Process Explorer') # find handle dialog self.findDialog = None @pyqtSlot(int) def removeFindDialog(self): self.findDialog = None def keyPressEvent(self, event): modifiers = event.modifiers() if event.key() == Qt.Key_F and modifiers & Qt.ControlModifier: if self.findDialog is None: self.findDialog = FindHandleDialog(self.model, self) self.findDialog.finished.connect(self.removeFindDialog) self.findDialog.show() else: self.findDialog.activateWindow() else: super().keyPressEvent(event) @pyqtSlot(QModelIndex) def showDescriptors(self, processMIdx): try: self.handlesTable.setRowCount(0) self.handlesTable.clearContents() descriptors = self.model.getProcDescriptors(processMIdx) libs = self.model.getProcLibraries(processMIdx) self.handlesTable.setRowCount(len(descriptors) + len(libs)) except PermissionError: self.handlesTable.setRowCount(1) self.handlesTable.setSpan(0, 0, 1, 2) permDeniedMsg = QTableWidgetItem('<Permission Denied>') permDeniedMsg.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) permDeniedMsg.setTextAlignment(Qt.AlignCenter) permDeniedMsg.setTextColor(QColor(255, 0, 0)) self.handlesTable.setItem(0, 0, permDeniedMsg) else: for row, descriptor in enumerate(descriptors): typeItem = QTableWidgetItem(descriptor.type) typeItem.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) nameItem = QTableWidgetItem(descriptor.name) nameItem.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.handlesTable.setItem(row, 0, typeItem) self.handlesTable.setItem(row, 1, nameItem) for row, libName in enumerate(libs, start=len(descriptors)): typeItem = QTableWidgetItem('Shared Library') typeItem.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) nameItem = QTableWidgetItem(libName) nameItem.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.handlesTable.setItem(row, 0, typeItem) self.handlesTable.setItem(row, 1, nameItem)
class OWdabam_height_profile(OWWidget): name = "DABAM Height Profile" id = "dabam_height_profile" description = "Calculation of mirror surface error profile" icon = "icons/dabam.png" author = "Luca Rebuffi" maintainer_email = "[email protected]; [email protected]" priority = 6 category = "" keywords = ["dabam_height_profile"] outputs = [{"name": "PreProcessor_Data", "type": ShadowPreProcessorData, "doc": "PreProcessor Data", "id": "PreProcessor_Data"}] want_main_area = 1 want_control_area = 1 MAX_WIDTH = 1320 MAX_HEIGHT = 700 IMAGE_WIDTH = 860 IMAGE_HEIGHT = 645 CONTROL_AREA_WIDTH = 405 TABS_AREA_HEIGHT = 618 xx = None yy = None zz = None entry_number = Setting(1) shape=Setting(0) slope_error_from = Setting(0.0) slope_error_to = Setting(1.5) dimension_y_from = Setting(0.0) dimension_y_to = Setting(200.0) use_undetrended = Setting(0) step_x = Setting(1.0) dimension_x = Setting(10.0) center_y = Setting(1) modify_y = Setting(0) new_length = Setting(200.0) filler_value = Setting(0.0) scale_factor_y = Setting(1.0) renormalize_y = Setting(1) error_type_y = Setting(0) rms_y = Setting(0.9) dabam_profile_index = Setting(1) heigth_profile_file_name = Setting('mirror.dat') tab=[] def __init__(self): super().__init__() self.runaction = widget.OWAction("Calculate Height Profile", self) self.runaction.triggered.connect(self.calculate_heigth_profile_ni) self.addAction(self.runaction) self.runaction = widget.OWAction("Generate Height Profile File", self) self.runaction.triggered.connect(self.generate_heigth_profile_file_ni) self.addAction(self.runaction) geom = QApplication.desktop().availableGeometry() self.setGeometry(QRect(round(geom.width() * 0.05), round(geom.height() * 0.05), round(min(geom.width() * 0.98, self.MAX_WIDTH)), round(min(geom.height() * 0.95, self.MAX_HEIGHT)))) self.setMaximumHeight(self.geometry().height()) self.setMaximumWidth(self.geometry().width()) # DABAM INITIALIZATION self.server = dabam.dabam() self.server.set_input_silent(True) gui.separator(self.controlArea) button_box = oasysgui.widgetBox(self.controlArea, "", addSpace=False, orientation="horizontal") button = gui.button(button_box, self, "Calculate Height\nProfile", callback=self.calculate_heigth_profile) button.setFixedHeight(45) button = gui.button(button_box, self, "Generate Height\nProfile File", callback=self.generate_heigth_profile_file) font = QFont(button.font()) font.setBold(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Blue')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) button.setFixedWidth(150) button = gui.button(button_box, self, "Reset Fields", callback=self.call_reset_settings) font = QFont(button.font()) font.setItalic(True) button.setFont(font) palette = QPalette(button.palette()) # make a copy of the palette palette.setColor(QPalette.ButtonText, QColor('Dark Red')) button.setPalette(palette) # assign new palette button.setFixedHeight(45) gui.separator(self.controlArea) tabs_setting = gui.tabWidget(self.controlArea) tabs_setting.setFixedHeight(self.TABS_AREA_HEIGHT) tabs_setting.setFixedWidth(self.CONTROL_AREA_WIDTH-5) tab_input = oasysgui.createTabPage(tabs_setting, "DABAM Search Setting") tab_gener = oasysgui.createTabPage(tabs_setting, "DABAM Generation Setting") tab_out = oasysgui.createTabPage(tabs_setting, "Output") manual_box = oasysgui.widgetBox(tab_input, "Manual Entry", addSpace=True, orientation="vertical") oasysgui.lineEdit(manual_box, self, "entry_number", "Entry Number", labelWidth=300, valueType=int, orientation="horizontal") gui.separator(manual_box) button = gui.button(manual_box, self, "Retrieve Profile", callback=self.retrieve_profile) button.setFixedHeight(35) button.setFixedWidth(self.CONTROL_AREA_WIDTH-35) input_box = oasysgui.widgetBox(tab_input, "Search Parameters", addSpace=True, orientation="vertical") gui.comboBox(input_box, self, "shape", label="Mirror Shape", labelWidth=300, items=["All", "Plane", "Cylindrical", "Elliptical", "Toroidal", "Spherical"], sendSelectedValue=False, orientation="horizontal") gui.separator(input_box) input_box_1 = oasysgui.widgetBox(input_box, "", addSpace=True, orientation="horizontal") oasysgui.lineEdit(input_box_1, self, "slope_error_from", "Slope Error From (" + u"\u03BC" + "rad)", labelWidth=150, valueType=float, orientation="horizontal") oasysgui.lineEdit(input_box_1, self, "slope_error_to", "To (" + u"\u03BC" + "rad)", labelWidth=60, valueType=float, orientation="horizontal") input_box_2 = oasysgui.widgetBox(input_box, "", addSpace=True, orientation="horizontal") self.le_dimension_y_from = oasysgui.lineEdit(input_box_2, self, "dimension_y_from", "Mirror Length From", labelWidth=150, valueType=float, orientation="horizontal") self.le_dimension_y_to = oasysgui.lineEdit(input_box_2, self, "dimension_y_to", "To", labelWidth=60, valueType=float, orientation="horizontal") table_box = oasysgui.widgetBox(tab_input, "Search Results", addSpace=True, orientation="vertical", height=290) self.overlay_search = Overlay(table_box, self.search_profiles) self.overlay_search.hide() button = gui.button(input_box, self, "Search", callback=self.overlay_search.show) button.setFixedHeight(35) button.setFixedWidth(self.CONTROL_AREA_WIDTH-35) gui.comboBox(table_box, self, "use_undetrended", label="Use Undetrended Profile", labelWidth=300, items=["No", "Yes"], callback=self.table_item_clicked, sendSelectedValue=False, orientation="horizontal") gui.separator(table_box) self.scrollarea = QScrollArea() self.scrollarea.setMinimumWidth(self.CONTROL_AREA_WIDTH-35) table_box.layout().addWidget(self.scrollarea, alignment=Qt.AlignHCenter) self.table = QTableWidget(1, 5) self.table.setAlternatingRowColors(True) self.table.horizontalHeader().setResizeMode(QHeaderView.Fixed) self.table.verticalHeader().setVisible(False) self.table.setColumnWidth(0, 40) self.table.setColumnWidth(1, 70) self.table.setColumnWidth(2, 70) self.table.setColumnWidth(3, 85) self.table.setColumnWidth(4, 80) self.table.resizeRowsToContents() self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.itemClicked.connect(self.table_item_clicked) self.scrollarea.setWidget(self.table) self.scrollarea.setWidgetResizable(1) output_profile_box = oasysgui.widgetBox(tab_gener, "Surface Generation Parameters", addSpace=True, orientation="vertical", height=270) self.le_dimension_x = oasysgui.lineEdit(output_profile_box, self, "dimension_x", "Width", labelWidth=300, valueType=float, orientation="horizontal") self.le_step_x = oasysgui.lineEdit(output_profile_box, self, "step_x", "Step Width", labelWidth=300, valueType=float, orientation="horizontal") gui.comboBox(output_profile_box, self, "center_y", label="Center Profile in the middle of O.E.", labelWidth=300, items=["No", "Yes"], sendSelectedValue=False, orientation="horizontal") gui.comboBox(output_profile_box, self, "modify_y", label="Modify Length?", labelWidth=240, items=["No", "Rescale to new length", "Fit to new length (fill or cut)"], callback=self.set_ModifyY, sendSelectedValue=False, orientation="horizontal") self.modify_box_1 = oasysgui.widgetBox(output_profile_box, "", addSpace=False, orientation="vertical", height=50) self.modify_box_2 = oasysgui.widgetBox(output_profile_box, "", addSpace=False, orientation="vertical", height=50) oasysgui.lineEdit(self.modify_box_2, self, "scale_factor_y", "Scale Factor", labelWidth=300, valueType=float, orientation="horizontal") self.modify_box_3 = oasysgui.widgetBox(output_profile_box, "", addSpace=False, orientation="vertical", height=50) self.le_new_length = oasysgui.lineEdit(self.modify_box_3, self, "new_length", "New Length", labelWidth=300, valueType=float, orientation="horizontal") oasysgui.lineEdit(self.modify_box_3, self, "filler_value", "Filler Value (if new length > profile length) [nm]", labelWidth=300, valueType=float, orientation="horizontal") self.set_ModifyY() gui.comboBox(output_profile_box, self, "renormalize_y", label="Renormalize Length Profile to different RMS", labelWidth=300, items=["No", "Yes"], callback=self.set_RenormalizeY, sendSelectedValue=False, orientation="horizontal") self.output_profile_box_1 = oasysgui.widgetBox(output_profile_box, "", addSpace=True, orientation="vertical") gui.comboBox(self.output_profile_box_1, self, "error_type_y", label="Normalization to", labelWidth=270, items=["Figure Error (nm)", "Slope Error (" + u"\u03BC" + "rad)"], sendSelectedValue=False, orientation="horizontal") oasysgui.lineEdit(self.output_profile_box_1, self, "rms_y", "Rms Value", labelWidth=300, valueType=float, orientation="horizontal") self.set_RenormalizeY() output_box = oasysgui.widgetBox(tab_gener, "Outputs", addSpace=True, orientation="vertical") select_file_box = oasysgui.widgetBox(output_box, "", addSpace=True, orientation="horizontal") self.le_heigth_profile_file_name = oasysgui.lineEdit(select_file_box, self, "heigth_profile_file_name", "Output File Name", labelWidth=120, valueType=str, orientation="horizontal") gui.button(select_file_box, self, "...", callback=self.selectFile) self.shadow_output = QTextEdit() self.shadow_output.setReadOnly(True) out_box = oasysgui.widgetBox(tab_out, "System Output", addSpace=True, orientation="horizontal", height=500) out_box.layout().addWidget(self.shadow_output) gui.rubber(self.controlArea) self.initializeTabs() gui.rubber(self.mainArea) self.overlay_search.raise_() def resizeEvent(self, event): self.overlay_search.resize(self.CONTROL_AREA_WIDTH - 15, 290) event.accept() def after_change_workspace_units(self): self.si_to_user_units = 1e2 / self.workspace_units_to_cm self.horHeaders = ["Entry", "Shape", "Length\n[" + self.workspace_units_label + "]", "Heights St.Dev.\n[nm]", "Slopes St.Dev.\n[" + u"\u03BC" + "rad]"] self.table.setHorizontalHeaderLabels(self.horHeaders) self.plot_canvas[0].setGraphXLabel("Y [" + self.workspace_units_label + "]") self.plot_canvas[1].setGraphXLabel("Y [" + self.workspace_units_label + "]") self.axis.set_xlabel("X [" + self.workspace_units_label + "]") self.axis.set_ylabel("Y [" + self.workspace_units_label + "]") label = self.le_dimension_y_from.parent().layout().itemAt(0).widget() label.setText(label.text() + " [" + self.workspace_units_label + "]") label = self.le_dimension_y_to.parent().layout().itemAt(0).widget() label.setText(label.text() + " [" + self.workspace_units_label + "]") label = self.le_dimension_x.parent().layout().itemAt(0).widget() label.setText(label.text() + " [" + self.workspace_units_label + "]") label = self.le_step_x.parent().layout().itemAt(0).widget() label.setText(label.text() + " [" + self.workspace_units_label + "]") label = self.le_new_length.parent().layout().itemAt(0).widget() label.setText(label.text() + " [" + self.workspace_units_label + "]") def initializeTabs(self): self.tabs = gui.tabWidget(self.mainArea) self.tab = [gui.createTabPage(self.tabs, "Info"), gui.createTabPage(self.tabs, "Heights Profile"), gui.createTabPage(self.tabs, "Slopes Profile"), gui.createTabPage(self.tabs, "PSD Heights"), gui.createTabPage(self.tabs, "CSD Heights"), gui.createTabPage(self.tabs, "ACF"), gui.createTabPage(self.tabs, "Generated 2D Profile"), ] for tab in self.tab: tab.setFixedHeight(self.IMAGE_HEIGHT) tab.setFixedWidth(self.IMAGE_WIDTH) self.plot_canvas = [None, None, None, None, None, None] self.plot_canvas[0] = PlotWindow(roi=False, control=False, position=True, plugins=False) self.plot_canvas[0].setDefaultPlotLines(True) self.plot_canvas[0].setActiveCurveColor(color='darkblue') self.plot_canvas[0].setGraphYLabel("Z [nm]") self.plot_canvas[0].setGraphTitle("Heights Profile") self.plot_canvas[0].setDrawModeEnabled(True, 'rectangle') self.plot_canvas[0].setZoomModeEnabled(True) self.plot_canvas[1] = PlotWindow(roi=False, control=False, position=True, plugins=False) self.plot_canvas[1].setDefaultPlotLines(True) self.plot_canvas[1].setActiveCurveColor(color='darkblue') self.plot_canvas[1].setGraphYLabel("Zp [$\mu$rad]") self.plot_canvas[1].setGraphTitle("Slopes Profile") self.plot_canvas[1].setDrawModeEnabled(True, 'rectangle') self.plot_canvas[1].setZoomModeEnabled(True) self.plot_canvas[2] = PlotWindow(roi=False, control=False, position=True, plugins=False) self.plot_canvas[2].setDefaultPlotLines(True) self.plot_canvas[2].setActiveCurveColor(color='darkblue') self.plot_canvas[2].setGraphXLabel("f [m^-1]") self.plot_canvas[2].setGraphYLabel("PSD [m^3]") self.plot_canvas[2].setGraphTitle("Power Spectral Density of Heights Profile") self.plot_canvas[2].setDrawModeEnabled(True, 'rectangle') self.plot_canvas[2].setZoomModeEnabled(True) self.plot_canvas[2].setXAxisLogarithmic(True) self.plot_canvas[2].setYAxisLogarithmic(True) self.plot_canvas[3] = PlotWindow(roi=False, control=False, position=True, plugins=False) self.plot_canvas[3].setDefaultPlotLines(True) self.plot_canvas[3].setActiveCurveColor(color='darkblue') self.plot_canvas[3].setGraphXLabel("f [m^-1]") self.plot_canvas[3].setGraphYLabel("CSD [m^3]") self.plot_canvas[3].setGraphTitle("Cumulative Spectral Density of Heights Profile") self.plot_canvas[3].setDrawModeEnabled(True, 'rectangle') self.plot_canvas[3].setZoomModeEnabled(True) self.plot_canvas[3].setXAxisLogarithmic(True) self.plot_canvas[4] = PlotWindow(roi=False, control=False, position=True, plugins=False) self.plot_canvas[4].setDefaultPlotLines(True) self.plot_canvas[4].setActiveCurveColor(color='darkblue') self.plot_canvas[4].setGraphXLabel("Length [m]") self.plot_canvas[4].setGraphYLabel("ACF") self.plot_canvas[4].setGraphTitle("Autocovariance Function of Heights Profile") self.plot_canvas[4].setDrawModeEnabled(True, 'rectangle') self.plot_canvas[4].setZoomModeEnabled(True) self.figure = Figure(figsize=(self.IMAGE_HEIGHT, self.IMAGE_HEIGHT)) # QUADRATA! self.figure.patch.set_facecolor('white') self.axis = self.figure.add_subplot(111, projection='3d') self.axis.set_zlabel("Z [nm]") self.plot_canvas[5] = FigureCanvasQTAgg(self.figure) self.profileInfo = QTextEdit() self.profileInfo.setReadOnly(True) self.profileInfo.setMinimumHeight(self.IMAGE_HEIGHT-5) self.profileInfo.setMaximumHeight(self.IMAGE_HEIGHT-5) self.profileInfo.setMinimumWidth(310) self.profileInfo.setMaximumWidth(310) profile_box = oasysgui.widgetBox(self.tab[0], "", addSpace=True, orientation="horizontal", height = self.IMAGE_HEIGHT, width=320) profile_box.layout().addWidget(self.profileInfo) for index in range(0, 6): self.tab[index+1].layout().addWidget(self.plot_canvas[index]) self.tabs.setCurrentIndex(1) def plot_dabam_graph(self, plot_canvas_index, curve_name, x_values, y_values, xtitle, ytitle, color='blue', replace=True): self.plot_canvas[plot_canvas_index].addCurve(x_values, y_values, curve_name, symbol='', color=color, replace=replace) #'+', '^', ',' self.plot_canvas[plot_canvas_index].setGraphXLabel(xtitle) self.plot_canvas[plot_canvas_index].setGraphYLabel(ytitle) self.plot_canvas[plot_canvas_index].replot() def set_ModifyY(self): self.modify_box_1.setVisible(self.modify_y == 0) self.modify_box_2.setVisible(self.modify_y == 1) self.modify_box_3.setVisible(self.modify_y == 2) def set_RenormalizeY(self): self.output_profile_box_1.setVisible(self.renormalize_y==1) def table_item_clicked(self): if self.table.selectionModel().hasSelection(): if not self.table.rowCount() == 0: if not self.table.item(0, 0) is None: row = self.table.selectionModel().selectedRows()[0].row() self.entry_number = int(self.table.item(row, 0).text()) self.retrieve_profile() def retrieve_profile(self): try: if self.entry_number is None or self.entry_number <= 0: raise Exception("Entry number should be a strictly positive integer number") self.server.load(self.entry_number) self.profileInfo.setText(self.server.info_profiles()) self.plot_canvas[0].setGraphTitle( "Heights Profile. St.Dev.=%.3f nm" % (self.server.stdev_profile_heights() * 1e9)) self.plot_canvas[1].setGraphTitle( "Slopes Profile. St.Dev.=%.3f $\mu$rad" % (self.server.stdev_profile_slopes() * 1e6)) if self.use_undetrended == 0: self.plot_dabam_graph(0, "heights_profile", self.si_to_user_units * self.server.y, 1e9 * self.server.zHeights, "Y [" + self.workspace_units_label + "]", "Z [nm]") self.plot_dabam_graph(1, "slopes_profile", self.si_to_user_units * self.server.y, 1e6 * self.server.zSlopes, "Y [" + self.workspace_units_label + "]", "Zp [$\mu$rad]") else: self.plot_dabam_graph(0, "heights_profile", self.si_to_user_units * self.server.y, 1e9 * self.server.zHeightsUndetrended, "Y [" + self.workspace_units_label + "]", "Z [nm]") self.plot_dabam_graph(1, "slopes_profile", self.si_to_user_units * self.server.y, 1e6 * self.server.zSlopesUndetrended, "Y [" + self.workspace_units_label + "]", "Zp [$\mu$rad]") y = self.server.f ** (self.server.powerlaw["hgt_pendent"]) * 10 ** self.server.powerlaw["hgt_shift"] i0 = self.server.powerlaw["index_from"] i1 = self.server.powerlaw["index_to"] beta = -self.server.powerlaw["hgt_pendent"] self.plot_canvas[2].setGraphTitle( "Power Spectral Density of Heights Profile (beta=%.2f,Df=%.2f)" % (beta, (5 - beta) / 2)) self.plot_dabam_graph(2, "psd_heights_2", self.server.f, self.server.psdHeights, "f [m^-1]", "PSD [m^3]") self.plot_dabam_graph(2, "psd_heights_1", self.server.f, y, "f [m^-1]", "PSD [m^3]", color='green', replace=False) self.plot_dabam_graph(2, "psd_heights_3", self.server.f[i0:i1], y[i0:i1], "f [m^-1]", "PSD [m^3]", color='red', replace=False) self.plot_dabam_graph(3, "csd", self.server.f, self.server.csd_heights(), "f [m^-1]", "CSD [m^3]") c1, c2, c3 = dabam.autocorrelationfunction(self.server.y, self.server.zHeights) self.plot_canvas[4].setGraphTitle( "Autocovariance Function of Heights Profile.\nAutocorrelation Length (ACF=0.5)=%.3f m" % (c3)) self.plot_dabam_graph(4, "acf", c1[0:-1], c2, "Length [m]", "Heights Autocovariance") # surface error removal if not self.zz is None and not self.yy is None and not self.xx is None: self.xx = None self.yy = None self.zz = None self.axis.set_title("") self.axis.clear() self.plot_canvas[5].draw() if (self.tabs.currentIndex()==6): self.tabs.setCurrentIndex(1) except Exception as exception: QMessageBox.critical(self, "Error", exception.args[0], QMessageBox.Ok) #raise exception def search_profiles(self): try: self.table.itemClicked.disconnect(self.table_item_clicked) self.table.clear() row_count = self.table.rowCount() for n in range(0, row_count): self.table.removeRow(0) self.table.setHorizontalHeaderLabels(self.horHeaders) profiles = dabam.dabam_summary_dictionary(surface=self.get_dabam_shape(), slp_err_from=self.slope_error_from*1e-6, slp_err_to=self.slope_error_to*1e-6, length_from=self.dimension_y_from / self.si_to_user_units, length_to=self.dimension_y_to / self.si_to_user_units) for index in range(0, len(profiles)): self.table.insertRow(0) for index in range(0, len(profiles)): table_item = QTableWidgetItem(str(profiles[index]["entry"])) table_item.setTextAlignment(Qt.AlignCenter) self.table.setItem(index, 0, table_item) table_item = QTableWidgetItem(str(profiles[index]["surface"])) table_item.setTextAlignment(Qt.AlignLeft) self.table.setItem(index, 1, table_item) table_item = QTableWidgetItem(str(numpy.round(profiles[index]["length"]*self.si_to_user_units, 3))) table_item.setTextAlignment(Qt.AlignRight) self.table.setItem(index, 2, table_item) table_item = QTableWidgetItem(str(numpy.round(profiles[index]["hgt_err"]*1e9, 3))) table_item.setTextAlignment(Qt.AlignRight) self.table.setItem(index, 3, table_item) table_item = QTableWidgetItem(str(numpy.round(profiles[index]["slp_err"]*1e6, 3))) table_item.setTextAlignment(Qt.AlignRight) self.table.setItem(index, 4, table_item) self.table.setHorizontalHeaderLabels(self.horHeaders) self.table.resizeRowsToContents() self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.itemClicked.connect(self.table_item_clicked) self.overlay_search.hide() except Exception as exception: self.overlay_search.hide() QMessageBox.critical(self, "Error", exception.args[0], QMessageBox.Ok) def get_dabam_shape(self): if self.shape == 0: return None elif self.shape == 1: return "plane" elif self.shape == 2: return "cylindrical" elif self.shape == 3: return "elliptical" elif self.shape == 4: return "toroidal" elif self.shape == 5: return "spherical" def calculate_heigth_profile_ni(self): self.calculate_heigth_profile(not_interactive_mode=True) def calculate_heigth_profile(self, not_interactive_mode=False): try: if self.server.y is None: raise Exception("No Profile Selected") sys.stdout = EmittingStream(textWritten=self.writeStdOut) self.check_fields() combination = "EF" if self.modify_y == 2: profile_1D_y_x_temp = self.si_to_user_units * self.server.y if self.use_undetrended == 0: profile_1D_y_y_temp = self.si_to_user_units * self.server.zHeights else: profile_1D_y_y_temp = self.si_to_user_units * self.server.zHeightsUndetrended first_coord = profile_1D_y_x_temp[0] second_coord = profile_1D_y_x_temp[1] last_coord = profile_1D_y_x_temp[-1] step = numpy.abs(second_coord - first_coord) length = numpy.abs(last_coord - first_coord) n_points_old = len(profile_1D_y_x_temp) if self.new_length > length: difference = self.new_length - length n_added_points = int(difference/step) if difference % step == 0: n_added_points += 1 if n_added_points % 2 != 0: n_added_points += 1 profile_1D_y_x = numpy.arange(n_added_points + n_points_old) * step profile_1D_y_y = numpy.ones(n_added_points + n_points_old) * self.filler_value * 1e-9 * self.si_to_user_units profile_1D_y_y[int(n_added_points/2) : n_points_old + int(n_added_points/2)] = profile_1D_y_y_temp elif self.new_length < length: difference = length - self.new_length n_removed_points = int(difference/step) if difference % step == 0: n_removed_points -= 1 if n_removed_points % 2 != 0: n_removed_points -= 1 if n_removed_points >= 2: profile_1D_y_x = profile_1D_y_x_temp[0 : (n_points_old - n_removed_points)] profile_1D_y_y = profile_1D_y_y_temp[(int(n_removed_points/2) - 1) : (n_points_old - int(n_removed_points/2) - 1)] else: profile_1D_y_x = profile_1D_y_x_temp profile_1D_y_y = profile_1D_y_y_temp else: profile_1D_y_x = profile_1D_y_x_temp profile_1D_y_y = profile_1D_y_y_temp else: if self.modify_y == 0: profile_1D_y_x = self.si_to_user_units * self.server.y elif self.modify_y == 1: profile_1D_y_x = self.si_to_user_units * self.server.y * self.scale_factor_y if self.use_undetrended == 0: profile_1D_y_y = self.si_to_user_units * self.server.zHeights else: profile_1D_y_y = self.si_to_user_units * self.server.zHeightsUndetrended if self.center_y: first_coord = profile_1D_y_x[0] last_coord = profile_1D_y_x[-1] length = numpy.abs(last_coord - first_coord) profile_1D_y_x_temp = numpy.linspace(-length/2, length/2, len(profile_1D_y_x)) profile_1D_y_x = profile_1D_y_x_temp if self.renormalize_y == 0: rms_y = None else: if self.error_type_y == profiles_simulation.FIGURE_ERROR: rms_y = self.si_to_user_units * self.rms_y * 1e-9 # from nm to user units else: rms_y = self.rms_y * 1e-6 # from urad to rad xx, yy, zz = profiles_simulation.simulate_profile_2D(combination = combination, error_type_l = self.error_type_y, rms_l = rms_y, x_l = profile_1D_y_x, y_l = profile_1D_y_y, mirror_width = self.dimension_x, step_w = self.step_x, rms_w = 0.0) self.xx = xx self.yy = yy self.zz = zz # in user units self.axis.clear() x_to_plot, y_to_plot = numpy.meshgrid(xx, yy) z_to_plot = zz * 1e9 / self.si_to_user_units #nm self.axis.plot_surface(x_to_plot, y_to_plot, z_to_plot, rstride=1, cstride=1, cmap=cm.autumn, linewidth=0.5, antialiased=True) sloperms = profiles_simulation.slopes(zz.T, xx, yy, return_only_rms=1) title = ' Slope error rms in X direction: %f $\mu$rad' % (sloperms[0]*1e6) + '\n' + \ ' Slope error rms in Y direction: %f $\mu$rad' % (sloperms[1]*1e6) self.axis.set_xlabel("X [" + self.workspace_units_label + "]") self.axis.set_ylabel("Y [" + self.workspace_units_label + "]") self.axis.set_zlabel("Z [nm]") self.axis.set_title(title) self.axis.mouse_init() if not not_interactive_mode: try: self.plot_canvas[5].draw() except: pass self.tabs.setCurrentIndex(6) QMessageBox.information(self, "QMessageBox.information()", "Height Profile calculated: if the result is satisfactory,\nclick \'Generate Height Profile File\' to complete the operation ", QMessageBox.Ok) except Exception as exception: QMessageBox.critical(self, "Error", exception.args[0], QMessageBox.Ok) #raise exception def generate_heigth_profile_file_ni(self): self.generate_heigth_profile_file(not_interactive_mode=True) def generate_heigth_profile_file(self, not_interactive_mode=False): if not self.zz is None and not self.yy is None and not self.xx is None: try: congruence.checkDir(self.heigth_profile_file_name) sys.stdout = EmittingStream(textWritten=self.writeStdOut) ST.write_shadow_surface(self.zz, self.xx, self.yy, outFile=congruence.checkFileName(self.heigth_profile_file_name)) if not not_interactive_mode: QMessageBox.information(self, "QMessageBox.information()", "Height Profile file " + self.heigth_profile_file_name + " written on disk", QMessageBox.Ok) if self.modify_y == 0: dimension_y = self.si_to_user_units * (self.server.y[-1] - self.server.y[0]) if self.modify_y == 1: dimension_y = self.si_to_user_units * (self.server.y[-1] - self.server.y[0]) * self.scale_factor_y elif self.modify_y == 2: dimension_y = self.new_length self.send("PreProcessor_Data", ShadowPreProcessorData(error_profile_data_file=self.heigth_profile_file_name, error_profile_x_dim=self.dimension_x, error_profile_y_dim=dimension_y)) except Exception as exception: QMessageBox.critical(self, "Error", exception.args[0], QMessageBox.Ok) def call_reset_settings(self): if ConfirmDialog.confirmed(parent=self, message="Confirm Reset of the Fields?"): try: self.resetSettings() except: pass def check_fields(self): self.dimension_x = congruence.checkStrictlyPositiveNumber(self.dimension_x, "Dimension X") self.step_x = congruence.checkStrictlyPositiveNumber(self.step_x, "Step X") if self.step_x > self.dimension_x/2: raise Exception("Step Width should be smaller than or equal to Width/2") if self.modify_y == 1: self.scale_factor_y = congruence.checkStrictlyPositiveNumber(self.scale_factor_y, "Scale Factor") elif self.modify_y == 2: self.new_length = congruence.checkStrictlyPositiveNumber(self.new_length, "New Length") if self.renormalize_y == 1: self.rms_y = congruence.checkPositiveNumber(self.rms_y, "Rms Y") congruence.checkDir(self.heigth_profile_file_name) def writeStdOut(self, text): cursor = self.shadow_output.textCursor() cursor.movePosition(QTextCursor.End) cursor.insertText(text) self.shadow_output.setTextCursor(cursor) self.shadow_output.ensureCursorVisible() def selectFile(self): self.le_heigth_profile_file_name.setText(oasysgui.selectFileFromDialog(self, self.heigth_profile_file_name, "Select Output File", file_extension_filter="Data Files (*.dat)"))
class FormTable(QWidget): # ------------------------------------------------------------------------------------- # Form signal(s) closingFormTable = pyqtSignal() deletingFormTable = pyqtSignal() # ------------------------------------------------------------------------------------- # ------------------------------------------------------------------------------------- # Method init def __init__(self, parent=None): # ------------------------------------------------------------------------------------- # Constructor super(FormTable, self).__init__(parent) self.setWindowTitle('Section Table') oLayout = QVBoxLayout() self.TableWidget = QTableWidget() self.BtnSave = QPushButton('Save', self) self.BtnCancel = QPushButton('Cancel', self) # Define layout oLayout.addWidget(self.TableWidget) oLayout.addWidget(self.BtnSave) oLayout.addWidget(self.BtnCancel) # Set layout self.setLayout(oLayout) self.oLayout = oLayout # Define action(s) self.BtnSave.pressed.connect(self.saveTable) self.BtnCancel.pressed.connect(self.cancelTable) # Show widget self.show() # ------------------------------------------------------------------------------------- # ------------------------------------------------------------------------------------- # ------------------------------------------------------------------------------------- # Method to set data def setData(self, oData): # Check data table if oData: iDataRows = len(oData) iDataCols = len(oData[0]) self.TableWidget.setRowCount(iDataRows) self.TableWidget.setColumnCount(iDataCols) self.TableWidget.setHorizontalHeaderLabels(oFormSectionHeader) oTableHeader = self.TableWidget.horizontalHeader() oTableHeader.setStretchLastSection(True) iNL = None for iID, a1oLine in enumerate(oData): if iNL is None: iNL = len(a1oLine) a2oTable = [[] for iL in range(iNL)] else: pass for iElemID, oElemVal in enumerate(a1oLine): a2oTable[iElemID].append(oElemVal) oItem = QTableWidgetItem(oElemVal) oItem.setFlags(Qt.ItemIsSelectable) self.TableWidget.setItem(iID, iElemID, oItem) self.TableWidget.resizeColumnsToContents() self.TableWidget.update() #self.TableWidget.repaint() self.TableWidget.setEditTriggers(QAbstractItemView.CurrentChanged) else: # Nullity table object #self.TableWidget.setRowCount(0) #self.TableWidget.setColumnCount(0) self.TableWidget.clearContents() self.TableWidget.setItem(0, 0, QTableWidgetItem("No data here ... ")) #self.TableWidget.setHorizontalHeaderLabels(oFormSectionHeader) # ------------------------------------------------------------------------------------- # ------------------------------------------------------------------------------------- # Method to cancel table def cancelTable(self): self.deletingFormTable.emit() # ------------------------------------------------------------------------------------- # ------------------------------------------------------------------------------------- # Method to save table object to ascii file def saveTable(self): # Select output filename sFilePath = str(QFileDialog.getSaveFileName(self, 'Save File', '', 'ASCII (*.txt)')) # Check file definition by user if sFilePath is not None: # Save data to file writeTableObj(sFilePath, self.TableWidget) else: pass # ------------------------------------------------------------------------------------- # ------------------------------------------------------------------------------------- # Method to close event (destroy QWidget); closing plugin will destroy table form too def closeEvent(self, oEvent): oEvent.accept() self.closingFormTable.emit()