class AppWindow(QMainWindow): def __init__(self): super().__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.TryPromodoro.triggered.connect(self.call_Promodoro) self.ui.actionChoose_Epub_File.triggered.connect(self.call_epub_converter) self.ui.actionChoose_Epub_File.triggered.connect(self.call_epub_converter) self.ui.actionHelp_Book.triggered.connect(self.call_qtAbout) def call_Promodoro(self): self.promo = Promodoro.MyTimer() def call_epub_converter(self): self.converter = DragDrop.dropArea() def call_qtAbout(self): print('about QT') app.aboutQt()
class mywindow(QtWidgets.QMainWindow): def __init__(self): super(mywindow, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.D0_text.setText('0') self.ui.D90_text.setText('0') self.ui.D180_text.setText('0') self.ui.D270_text.setText('0') self.ui.operation.clicked.connect(self.operation) def operation(self): I0 = float(self.ui.D0_text.toPlainText()) I90 =float(self.ui.D90_text.toPlainText()) I180 =float(self.ui.D180_text.toPlainText()) I270 =float(self.ui.D270_text.toPlainText()) sample = four_step(I0,I90,I180,I270) delta = str(round(sample.delta(),2))+'°' psi = str(round(sample.psi(),2))+'°' self.ui.deltaValue.setText(delta) self.ui.psiValue.setText(psi)
class MainWindow(QtWidgets.QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.lineEdit_roy1.setValidator(QtGui.QDoubleValidator()) self.ui.lineEdit_roy2.setValidator(QtGui.QDoubleValidator()) self.ui.lineEdit_roy3.setValidator(QtGui.QDoubleValidator()) self.ui.lineEdit_bookname.editingFinished.connect( lambda: contract.setbookname(self.ui.lineEdit_bookname.text())) self.ui.lineEdit_unit.editingFinished.connect( lambda: contract.setunit(self.ui.lineEdit_unit.text())) self.ui.lineEdit_area.editingFinished.connect( lambda: contract.setauthorizedarea(self.ui.lineEdit_area.text())) self.ui.lineEdit_agent.editingFinished.connect( lambda: contract.setagent(self.ui.lineEdit_agent.text())) self.ui.lineEdit_author.editingFinished.connect( lambda: contract.setauthor(self.ui.lineEdit_author.text())) self.ui.comboBox_interval.activated.connect( lambda: contract.setclacinterval(self.ui.comboBox_interval. currentIndex())) self.ui.dateEdit_startdate.dateChanged.connect( lambda: contract.setstartdate(self.ui.dateEdit_startdate.date(). toString("yyyy-MM-dd"))) self.ui.dateEdit_enddate.dateChanged.connect( lambda: contract.setenddate(self.ui.dateEdit_enddate.date(). toString("yyyy-MM-dd"))) self.ui.lineEdit_roy1.editingFinished.connect( lambda: contract.setroalty1(float(self.ui.lineEdit_roy1.text()))) self.ui.lineEdit_roy2.editingFinished.connect( lambda: contract.setroalty2(float(self.ui.lineEdit_roy2.text()))) self.ui.lineEdit_roy3.editingFinished.connect( lambda: contract.setroalty3(float(self.ui.lineEdit_roy3.text()))) self.ui.lineEdit_roy4.editingFinished.connect( lambda: contract.setroalty4(self.ui.lineEdit_roy4.text())) self.ui.pushButton_insert.clicked.connect( lambda: contract.sql_insert()) self.ui.pushButton_search.clicked.connect(self.loadData) #self.ui.pushButton_insert.clicked.connect(self.sorttable) #self.ui.tableWidget.horizontalHeader().sectionClicked.connect(your_callable) #self.ui.tableWidget.cellClicked(0,1).connect(lambda:print("{} {}".format(self.ui.tableWidget.currentRow(),self.ui.tableWidget.currentColumn()))) #self.ui.tableWidget.horizontalHeaderItem.cellClicked().connect(self.sorttable) def loadData(self): sql_search = contract.makesql() sql = "SELECT * FROM `contract` WHERE `bookname` LIKE '{}' and `unit` LIKE '{}' and `authorized_area` LIKE '{}'\ and `agent` LIKE '{}' and `author` LIKE '{}' and `calc_interval` LIKE '{}' and `start_date` LIKE '{}'\ and `end_date` LIKE '{}' and `royalty1` LIKE '{}' and `royalty2` LIKE '{}' and `royalty3` LIKE '{}' and `royalty4` LIKE '{}'"\ .format(sql_search[0],sql_search[1],sql_search[2],sql_search[3],sql_search[4],sql_search[5],sql_search[6],sql_search[7],sql_search[8],sql_search[9],sql_search[10],sql_search[11]) print(sql) data, col_title = sqlsearch(sql) if (data == False and col_title == False): return for i in range(len(data)): data[i] = data[i][1:] collist = [] for i in range(1, len(col_title)): collist.append(col_title[i][0]) self.ui.tableWidget.setHorizontalHeaderLabels(collist) self.ui.tableWidget.setColumnCount(len(collist)) self.ui.tableWidget.setRowCount(0) for row in data: rowPosition = self.ui.tableWidget.rowCount() self.ui.tableWidget.insertRow(rowPosition) for i, column in enumerate(row): self.ui.tableWidget.setItem( rowPosition, i, QtWidgets.QTableWidgetItem(str(column))) self.ui.tableWidget.resizeColumnsToContents() def clearlineedit(self): self.ui.lineEdit_bookname.setText('') self.ui.lineEdit_unit.setText('') self.ui.lineEdit_area.setText('') self.ui.lineEdit_agent.setText('') self.ui.lineEdit_author.setText('') self.ui.comboBox_interval.setCurrentIndex(0) self.ui.dateEdit_startdate.setDate(QtCore.QDate.currentDate()) self.ui.dateEdit_enddate.setDate(QtCore.QDate.currentDate()) self.ui.lineEdit_roy1.setText('') self.ui.lineEdit_roy2.setText('') self.ui.lineEdit_roy3.setText('') self.ui.lineEdit_roy4.setText('') def sorttable(self): self.ui.tableWidget.setSortingEnabled(True) self.ui.tableWidget.sortByColumn(0, QtCore.Qt.AscendingOrder)
class Main(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.doctree=None self.lineMarks={} # We put things we want rendered here self.render_queue = Queue() # We get things rendered back self.pdf_queue = Queue() # We get doctrees for the outline viewer self.doctree_queue = Queue() print('Starting background renderer...', end=' ') self.renderProcess=Process(target = renderQueue, args=(self.render_queue, self.pdf_queue, self.doctree_queue)) self.renderProcess.daemon=True self.renderProcess.start() print('DONE') # This is always the same self.ui=Ui_MainWindow() self.ui.setupUi(self) # Adjust column widths in the structure tree self.ui.tree.header().setStretchLastSection(False) self.ui.tree.header().setResizeMode(0, QtGui.QHeaderView.Stretch) self.ui.tree.header().setResizeMode(1, QtGui.QHeaderView.ResizeToContents) self.pdf=PDFWidget() self.ui.pageNum = QtGui.QSpinBox() self.ui.pageNum.setMinimum(1) self.ui.pageNum.setValue(1) self.connect(self.pdf,QtCore.SIGNAL('pageCount'), self.ui.pageNum.setMaximum) self.connect(self.pdf,QtCore.SIGNAL('pageChanged'), self.ui.pageNum.setValue) self.connect(self.ui.pageNum,QtCore.SIGNAL('valueChanged(int)'), self.pdf.gotoPage) self.ui.actionShow_ToolBar=self.ui.toolBar.toggleViewAction() self.ui.actionShow_ToolBar.setText("Show Main Toolbar") self.ui.menuView.addAction(self.ui.actionShow_ToolBar) self.ui.pdfbar.addAction(self.pdf.ui.previous) self.ui.pdfbar.addWidget(self.ui.pageNum) self.ui.pdfbar.addAction(self.pdf.ui.__next__) self.ui.pdfbar.addSeparator() self.ui.pdfbar.addAction(self.pdf.ui.zoomin) self.ui.pdfbar.addAction(self.pdf.ui.zoomout) self.ui.actionShow_PDFBar=self.ui.pdfbar.toggleViewAction() self.ui.actionShow_PDFBar.setText("Show PDF Toolbar") self.ui.menuView.addAction(self.ui.actionShow_PDFBar) self.ui.dockLayout.addWidget(self.ui.pdfbar) self.ui.dockLayout.addWidget(self.pdf) self.ui.dock.hide() self.ui.actionShow_PDF=self.ui.dock.toggleViewAction() self.ui.actionShow_PDF.setText('Show Preview') self.ui.menuView.addAction(self.ui.actionShow_PDF) self.ui.actionShow_Structure=self.ui.structure.toggleViewAction() self.ui.actionShow_Structure.setText('Show Document Outline') self.ui.menuView.addAction(self.ui.actionShow_Structure) self.text_md5='' self.style_md5='' self.hl1 = Highlighter(self.ui.text.document(),'rest') self.hl2 = Highlighter(self.ui.style.document(),'javascript') self.editorPos=QtGui.QLabel() self.ui.statusBar.addWidget(self.editorPos) self.editorPos.show() self.statusMessage=QtGui.QLabel() self.ui.statusBar.addWidget(self.statusMessage) self.statusMessage.show() self.on_text_cursorPositionChanged() self.on_actionRender_triggered() # Connect editing actions to the editors self.ui.text.undoAvailable.connect(self.ui.actionUndo1.setEnabled) self.ui.actionUndo1.triggered.connect(self.ui.text.undo) self.ui.text.redoAvailable.connect(self.ui.actionRedo1.setEnabled) self.ui.actionRedo1.triggered.connect(self.ui.text.redo) self.ui.text.copyAvailable.connect(self.ui.actionCopy1.setEnabled) self.ui.actionCopy1.triggered.connect(self.ui.text.copy) self.ui.text.copyAvailable.connect(self.ui.actionCut1.setEnabled) self.ui.actionCut1.triggered.connect(self.ui.text.cut) self.ui.actionPaste1.triggered.connect(self.ui.text.paste) self.ui.style.undoAvailable.connect(self.ui.actionUndo2.setEnabled) self.ui.actionUndo2.triggered.connect(self.ui.style.undo) self.ui.style.redoAvailable.connect(self.ui.actionRedo2.setEnabled) self.ui.actionRedo2.triggered.connect(self.ui.style.redo) self.ui.style.copyAvailable.connect(self.ui.actionCopy2.setEnabled) self.ui.actionCopy2.triggered.connect(self.ui.style.copy) self.ui.style.copyAvailable.connect(self.ui.actionCut2.setEnabled) self.ui.actionCut2.triggered.connect(self.ui.style.cut) self.ui.actionPaste2.triggered.connect(self.ui.style.paste) self.clipBoard=QtGui.QApplication.clipboard() self.clipBoard.changed.connect(self.clipChanged) self.hookEditToolbar(self.ui.text) self.clipChanged(QtGui.QClipboard.Clipboard) self.text_fname=None self.style_fname=None self.pdf_fname=None self.ui.searchbar.setVisible(False) self.ui.searchWidget=SearchWidget() self.ui.searchbar.addWidget(self.ui.searchWidget) self.ui.actionFind.triggered.connect(self.ui.searchbar.show) self.ui.actionFind.triggered.connect(self.ui.searchWidget.ui.text.setFocus) self.ui.searchWidget.ui.close.clicked.connect(self.ui.searchbar.hide) self.ui.searchWidget.ui.close.clicked.connect(self.returnFocus) self.ui.searchWidget.ui.next.clicked.connect(self.doFind) self.ui.searchWidget.ui.previous.clicked.connect(self.doFindBackwards) self.updatePdf() self.renderTimer=QtCore.QTimer() self.renderTimer.timeout.connect(self.on_actionRender_triggered) self.renderTimer.start(5000) def returnFocus(self): """after the search bar closes, focus on the editing widget""" print('RF:', self.ui.tabs.currentIndex()) if self.ui.tabs.currentIndex()==0: self.ui.text.setFocus() else: self.ui.style.setFocus() def doFindBackwards (self): return self.doFind(backwards=True) def doFind(self, backwards=False): flags=QtGui.QTextDocument.FindFlags() print(flags) if backwards: flags=QtGui.QTextDocument.FindBackward if self.ui.searchWidget.ui.matchCase.isChecked(): flags=flags|QtGui.QTextDocument.FindCaseSensitively text=str(self.ui.searchWidget.ui.text.text()) print('Serching for:',text) if self.ui.tabs.currentIndex()==0: r=self.ui.text.find(text,flags) else: r=self.ui.style.find(text,flags) if r: self.statusMessage.setText('') else: self.statusMessage.setText('%s not found'%text) def clipChanged(self, mode=None): if mode is None: return if mode == QtGui.QClipboard.Clipboard: if str(self.clipBoard.text()): self.ui.actionPaste1.setEnabled(True) self.ui.actionPaste2.setEnabled(True) else: self.ui.actionPaste1.setEnabled(False) self.ui.actionPaste2.setEnabled(False) def hookEditToolbar(self, editor): if editor == self.ui.text: self.ui.actionUndo2.setVisible(False) self.ui.actionRedo2.setVisible(False) self.ui.actionCut2.setVisible(False) self.ui.actionPaste2.setVisible(False) self.ui.actionCopy2.setVisible(False) self.ui.actionUndo1.setVisible(True) self.ui.actionRedo1.setVisible(True) self.ui.actionCut1.setVisible(True) self.ui.actionPaste1.setVisible(True) self.ui.actionCopy1.setVisible(True) else: self.ui.actionUndo1.setVisible(False) self.ui.actionRedo1.setVisible(False) self.ui.actionCut1.setVisible(False) self.ui.actionPaste1.setVisible(False) self.ui.actionCopy1.setVisible(False) self.ui.actionUndo2.setVisible(True) self.ui.actionRedo2.setVisible(True) self.ui.actionCut2.setVisible(True) self.ui.actionPaste2.setVisible(True) self.ui.actionCopy2.setVisible(True) def createPopupMenu(self): self.popup=QtGui.QMenu() self.popup.addAction(self.ui.actionShow_ToolBar) self.popup.addAction(self.ui.actionShow_PDFBar) self.popup.addAction(self.ui.actionShow_PDF) return self.popup def enableHL(self): self.hl1.enabled=True self.hl2.enabled=True self.hl1.rehighlight() self.hl2.rehighlight() def disableHL(self): self.hl1.enabled=False self.hl2.enabled=False def on_actionSettings_triggered(self, b=None): if b is not None: return # I need to create a stylesheet object so I can parse and merge # the current stylesheet try: data=json.loads(str(self.ui.style.toPlainText())) except: # TODO: fail if sheet doesn't validate data={} config=ConfigDialog(data=copy(data)) config.exec_() # merge the edited stylesheet with current one because the editor # is not complete yet. When it is, just replace it. data.update(config.data) self.ui.style.setPlainText(json.dumps(data, indent=2)) def on_actionTest_Action_triggered(self, b=None): if b is not None: return self.testwidget=PageTemplates(self.styles) self.testwidget.show() def on_tree_itemClicked(self, item=None, column=None): if item is None: return destline=int(item.text(1))-1 destblock=self.ui.text.document().findBlockByLineNumber(destline) cursor=self.ui.text.textCursor() cursor.setPosition(destblock.position()) self.ui.text.setTextCursor(cursor) self.ui.text.ensureCursorVisible() def on_actionAbout_Bookrest_triggered(self, b=None): if b is None: return dlg=AboutDialog() dlg.exec_() def on_actionSave_Text_triggered(self, b=None): if b is not None: return if self.text_fname is not None: f=codecs.open(self.text_fname,'w+','utf-8') f.seek(0) f.write(str(self.ui.text.toPlainText())) f.close() else: self.on_actionSaveAs_Text_triggered() def on_actionSaveAs_Text_triggered(self, b=None): if b is not None: return fname=str(QtGui.QFileDialog.getSaveFileName(self, 'Save As', os.getcwd(), 'reSt files (*.txt *.rst)' )) if fname: self.text_fname=fname self.on_actionSave_Text_triggered() def on_actionLoad_Text_triggered(self, b=None): if b is None: return fname=QtGui.QFileDialog.getOpenFileName(self, 'Open File', os.getcwd(), 'reSt files (*.txt *.rst)' ) self.text_fname=fname self.disableHL() self.ui.text.setPlainText(codecs.open(self.text_fname,'r','utf-8').read()) self.enableHL() def on_actionSave_Style_triggered(self, b=None): if b is not None: return if self.style_fname is not None: f=codecs.open(self.style_fname,'w+','utf-8') f.seek(0) f.write(str(self.ui.style.toPlainText())) f.close() else: self.on_actionSaveAs_Style_triggered() def on_actionSaveAs_Style_triggered(self, b=None): if b is not None: return fname=str(QtGui.QFileDialog.getSaveFileName(self, 'Save As', os.getcwd(), 'style files (*.json *.style)' )) if fname: self.style_fname=fname self.on_actionSave_Style_triggered() def on_actionLoad_Style_triggered(self, b=None): if b is None: return fname=QtGui.QFileDialog.getOpenFileName(self, 'Open File', os.getcwd(), 'style files (*.json *.style)' ) self.style_fname=fname self.disableHL() self.ui.style.setPlainText(codecs.open(self.style_fname,'rb', 'utf-8').read()) self.enableHL() def on_actionSave_PDF_triggered(self, b=None): if b is not None: return # render it without line numbers in the toc self.on_actionRender_triggered(preview=False) if self.pdf_fname is not None: f=open(self.pdf_fname,'wb+') f.seek(0) f.write(self.goodPDF) f.close() else: self.on_actionSaveAs_PDF_triggered() def on_actionSaveAs_PDF_triggered(self, b=None): if b is not None: return fname=str(QtGui.QFileDialog.getSaveFileName(self, 'Save As', os.getcwd(), 'PDF files (*.pdf)' )) if fname: self.pdf_fname=fname self.on_actionSave_PDF_triggered() def on_tabs_currentChanged(self, i=None): print('IDX:',self.ui.tabs.currentIndex()) if self.ui.tabs.currentIndex() == 0: self.on_text_cursorPositionChanged() print('hooking text editor') self.hookEditToolbar(self.ui.text) else: self.on_style_cursorPositionChanged() print('hooking style editor') self.hookEditToolbar(self.ui.style) def on_style_cursorPositionChanged(self): cursor=self.ui.style.textCursor() self.editorPos.setText('Line: %d Col: %d'%(cursor.blockNumber(),cursor.columnNumber())) def on_text_cursorPositionChanged(self): cursor=self.ui.text.textCursor() row=cursor.blockNumber() column=cursor.columnNumber() self.editorPos.setText('Line: %d Col: %d'%(row,column)) l='line-%s'%(row+1) m=self.lineMarks.get(l,None) if m: self.pdf.gotoPosition(*m) def validateStyle(self): style=str(self.ui.style.toPlainText()) if not style.strip(): #no point in validating an empty string self.statusMessage.setText('') return pos=None try: json.loads(style) self.statusMessage.setText('') except ValueError as e: s=str(e) if s == 'No JSON object could be decoded': pos=0 elif s.startswith('Expecting '): pos=int(s.split(' ')[-1][:-1]) elif s.startswith('Extra data'): pos=int(s.split(' ')[-3]) else: pass self.statusMessage.setText('Stylesheet error: %s'%s) # This makes a red bar appear in the line # containing position pos self.ui.style.highlightError(pos) on_style_textChanged = validateStyle def on_actionRender_triggered(self, b=None, preview=True): if b is not None: return text=str(self.ui.text.toPlainText()) style=str(self.ui.style.toPlainText()) self.hl1.rehighlight() m1=md5() m1.update(text.encode('utf-8')) m1=m1.digest() m2=md5() m2.update(style.encode('utf-8')) m2=m2.digest() flag = m1 != self.text_md5 style_file=None if m2 != self.style_md5 and style: fd, style_file=tempfile.mkstemp() os.write(fd,style) os.close(fd) print('Loading styles from style_file') flag = True if flag: if not preview: pass # Send text to the renderer in foreground # FIXME: render is no longer accessible from the parent # process #doctree = docutils.core.publish_doctree(text) #self.goodPDF=render(doctree, preview=False) else: # Que to render in background self.render_queue.put([style_file, text, preview]) self.text_md5=m1 self.style_md5=m2 def updatePdf(self): # See if there is something in the doctree Queue try: self.doctree, self.warnings = self.doctree_queue.get(False) self.doctree.reporter=log class Visitor(docutils.nodes.SparseNodeVisitor): def __init__(self, document, treeWidget): self.treeWidget=treeWidget self.treeWidget.clear() self.doctree=document self.nodeDict={} docutils.nodes.SparseNodeVisitor.__init__(self, document) def visit_section(self, node): print('SECTION:',node.line, end=' ') item=QtGui.QTreeWidgetItem(["",str(node.line)]) if node.parent==self.doctree: # Top level section self.treeWidget.addTopLevelItem(item) self.nodeDict[id(node)]=item else: self.nodeDict[id(node.parent)].addChild(item) self.nodeDict[id(node)]=item def visit_title(self, node): if id(node.parent) in self.nodeDict: self.nodeDict[id(node.parent)].setText(0,node.astext()) def visit_document(self,node): print('DOC:',node.line) print(self.doctree.__class__) self.visitor=Visitor(self.doctree, self.ui.tree) self.doctree.walkabout(self.visitor) print(self.visitor.nodeDict) except Empty: pass # See if there is something in the PDF Queue try: self.lastPDF=self.pdf_queue.get(False) self.pdf.loadDocument(self.lastPDF) toc=self.pdf.document.toc() if toc: tempMarks=[] def traverse(node): children=node.childNodes() for i in range(children.length()): n=children.item(i) e=n.toElement() if e: tag=str(e.tagName()) if tag.startswith('LINE'): dest=str(e.attribute('Destination')) dest=QtPoppler.Poppler.LinkDestination(dest) tempMarks.append([int(tag.split('-')[1]), [dest.pageNumber(), dest.top(), dest.left(),1.]]) traverse(n) traverse(toc) tempMarks.sort() self.lineMarks={} lastMark=None lastKey=0 for key,dest in tempMarks: # Fix height of the previous mark, unless we changed pages if lastMark and self.lineMarks[lastMark][0]==dest[0]: self.lineMarks[lastMark][3]=dest[1] # Fill missing lines if lastMark: ldest=self.lineMarks[lastMark] else: ldest=[1,0,0,0] for n in range(lastKey,key): self.lineMarks['line-%s'%n]=ldest k='line-%s'%key self.lineMarks[k]=dest lastMark = k lastKey = key self.on_text_cursorPositionChanged() except Empty: #Nothing there pass # Schedule to run again QtCore.QTimer.singleShot(500,self.updatePdf)
class Ui_SplashScreen(object): def setupUi(self, SplashScreen): SplashScreen.setObjectName("SplashScreen") SplashScreen.resize(680, 400) self.centralwidget = QtWidgets.QWidget(SplashScreen) self.centralwidget.setObjectName("centralwidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout.setContentsMargins(10, 10, 10, 10) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.dropShadowFrame = QtWidgets.QFrame(self.centralwidget) self.dropShadowFrame.setStyleSheet( "QFrame { \n" " background-color: rgb(56, 58, 89); \n" " color: rgb(220, 220, 220);\n" " border-radius: 10px;\n" "}") self.dropShadowFrame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.dropShadowFrame.setFrameShadow(QtWidgets.QFrame.Raised) self.dropShadowFrame.setObjectName("dropShadowFrame") self.label_title = QtWidgets.QLabel(self.dropShadowFrame) self.label_title.setGeometry(QtCore.QRect(0, 90, 661, 61)) font = QtGui.QFont() font.setFamily("Segoe UI") font.setPointSize(40) self.label_title.setFont(font) self.label_title.setStyleSheet("color: rgb(254, 121, 199);") self.label_title.setAlignment(QtCore.Qt.AlignCenter) self.label_title.setObjectName("label_title") self.label_description = QtWidgets.QLabel(self.dropShadowFrame) self.label_description.setGeometry(QtCore.QRect(0, 150, 661, 31)) font = QtGui.QFont() font.setFamily("Segoe UI") font.setPointSize(14) self.label_description.setFont(font) self.label_description.setStyleSheet("color: rgb(98, 114, 164);") self.label_description.setAlignment(QtCore.Qt.AlignCenter) self.label_description.setObjectName("label_description") self.progressBar = QtWidgets.QProgressBar(self.dropShadowFrame) self.progressBar.setGeometry(QtCore.QRect(50, 280, 561, 23)) self.progressBar.setStyleSheet( "QProgressBar {\n" " \n" " background-color: rgb(98, 114, 164);\n" " color: rgb(200, 200, 200);\n" " border-style: none;\n" " border-radius: 10px;\n" " text-align: center;\n" "}\n" "QProgressBar::chunk{\n" " border-radius: 10px;\n" " background-color: qlineargradient(spread:pad, x1:0, y1:0.511364, x2:1, y2:0.523, stop:0 rgba(254, 121, 199, 255), stop:1 rgba(170, 85, 255, 255));\n" "}") self.progressBar.setProperty("value", 0) self.progressBar.setObjectName("progressBar") self.label_loading = QtWidgets.QLabel(self.dropShadowFrame) self.label_loading.setGeometry(QtCore.QRect(0, 320, 661, 21)) font = QtGui.QFont() font.setFamily("Segoe UI") font.setPointSize(12) self.label_loading.setFont(font) self.label_loading.setStyleSheet("color: rgb(98, 114, 164);") self.label_loading.setAlignment(QtCore.Qt.AlignCenter) self.label_loading.setObjectName("label_loading") self.label_credits = QtWidgets.QLabel(self.dropShadowFrame) self.label_credits.setGeometry(QtCore.QRect(20, 350, 621, 21)) font = QtGui.QFont() font.setFamily("Segoe UI") font.setPointSize(10) self.label_credits.setFont(font) self.label_credits.setStyleSheet("color: rgb(98, 114, 164);") self.label_credits.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.label_credits.setObjectName("label_credits") self.verticalLayout.addWidget(self.dropShadowFrame) SplashScreen.setCentralWidget(self.centralwidget) self.retranslateUi(SplashScreen) QtCore.QMetaObject.connectSlotsByName(SplashScreen) def retranslateUi(self, SplashScreen): _translate = QtCore.QCoreApplication.translate SplashScreen.setWindowTitle(_translate("SplashScreen", "MainWindow")) self.label_title.setText( _translate("SplashScreen", "<html><head/><body><p>PLUS-TI</p></body></html>")) self.label_description.setText( _translate("SplashScreen", "<html><head/><body><p>Models App</p></body></html>")) self.label_loading.setText(_translate("SplashScreen", "loading...")) self.label_credits.setText( _translate( "SplashScreen", "<html><head/><body><p><span style=\" font-weight:600;\">Created</span>: Sandro Bispo</p></body></html>" )) self.carregar_janela(SplashScreen) def carregar_janela(self, SplashScreen): self.janela = SplashScreen self.conf_janela() self.carregar_loader() def conf_janela(self): self.janela.setAttribute(QtCore.Qt.WA_TranslucentBackground) self.janela.setWindowFlags(QtCore.Qt.FramelessWindowHint) def carregar_loader(self): self.timer = QtCore.QTimer() self.timer.timeout.connect(self.load_progress_bar) self.timer.start(100) cont_label_title = [121, 114] def load_progress_bar(self): self.progressBar.setValue(self.progressBar.value() + 1) self.label_title.setStyleSheet( f"color: rgb(254, {self.cont_label_title[0]}, 199);") self.label_description.setStyleSheet( f"color: rgb(98, {self.cont_label_title[1]}, 164);") self.cont_label_title[0] += 1 self.cont_label_title[1] += 1 if self.progressBar.value() >= 100: self.janela.close() self.abrir_main() self.timer.stop() def abrir_main(self): self.MainWindow = QtWidgets.QMainWindow() self.ui = Ui_MainWindow() self.ui.setupUi(self.MainWindow) self.MainWindow.show()
class Main(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) # This is always the same self.ui=Ui_MainWindow() self.ui.setupUi(self) self.mediaObject=None # Enable-disable buttons as needed self.timer=QtCore.QTimer() self.ui.centralwidget.adjustSize() self.curClip=None self.message=QtGui.QLabel() self.progress=QtGui.QProgressBar() self.progress.setMaximum(100) #self.progress.setPercentageVisible(True) self.statusBar().addWidget(self.message,1) self.statusBar().addWidget(self.progress,0) self.progress.hide() self.projectName=None self.setWindowFilePath('None') self.ui.assets.addAction(self.ui.actionRemove_Asset) self.ui.output.addAction(self.ui.actionRemove_Asset) # Restore window state settings=QtCore.QSettings("ralsina","dieschere") self.restoreGeometry(settings.value("geometry").toByteArray()); self.restoreState(settings.value("state").toByteArray(),UI_VERSION); def closeEvent(self, ev): # Save window state self.on_actionNew_Project_triggered() if not self.isWindowModified(): settings=QtCore.QSettings("ralsina","dieschere") settings.setValue("geometry", self.saveGeometry()); settings.setValue("state", self.saveState(UI_VERSION)); ev.accept() else: ev.ignore() def tick(self): t1=self.mediaObject.currentTime() t=t1/1000 if not self.ui.markFrom.isChecked(): h=t/3600 m=(t-h*3600)/60 s=t-h*3600-m*60 msec=t1-t*1000 self.ui.cutFrom.setText('%d:%d:%d.%d'%(h,m,s,msec)) if not self.ui.markTo.isChecked(): h=t/3600 m=(t-h*3600)/60 s=t-h*3600-m*60 msec=t1-t*1000 self.ui.cutTo.setText('%d:%d:%d.%d'%(h,m,s,msec)) def stateChanged(self, state=None): if state is None: return if state == Phonon.StoppedState: self.ui.play.setEnabled(True) self.ui.play.setChecked(False) elif state == Phonon.PlayingState: self.ui.play.setEnabled(True) self.ui.play.setChecked(True) elif state == Phonon.PausedState: self.ui.play.setEnabled(True) self.ui.play.setChecked(False) def on_actionQuit_triggered(self, b=None): if b is not None: return self.on_actionNew_Project_triggered() if not self.isWindowModified(): self.close() def on_actionAbout_Die_Schere_triggered(self, b=None): if b is not None: return PAYPAL=r'https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=Q6R5YDDPM2RL6&lc=AR&item_name=Roberto%20Alsina&item_number=dieschere¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted' QtGui.QMessageBox.about(self,r'About Die Schere', '<h3>Die Schere: a simple video editor</h3><br>'\ 'Version: %s<br>' 'Author: <a href="mailto:[email protected]">Roberto Alsina <[email protected]>.<br></a>'\ 'Home Page: http://nothereyet<br>'\ 'If you liked Die Schere, please consider donating money <a href="%s">here</a><br>'\ '<h4>License</h4>Die Schere is free software licensed under the GPL version 2. <a href="%s">LICENSING TERMS</a>'%(VERSION,PAYPAL,LICENSEFILE) ) def on_actionNew_Project_triggered(self, b=None): if b is not None: return if self.isWindowModified(): # Make sure we are not losing data r=QtGui.QMessageBox.question(self,"Close Document", "The current project has been modified. Do you want to save your changes or discard them?", QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Cancel ) if r==QtGui.QMessageBox.Cancel: return elif r==QtGui.QMessageBox.Save: self.on_actionSave_Project_triggered() self.ui.assets.clear() self.ui.output.clear() self.setWindowModified(False) def on_actionOpen_Project_triggered(self, b=None): if b is not None: return fname=QtGui.QFileDialog.getOpenFileName(self,"Open Project",os.getcwd(),"Project Files (*.schere)") if fname: self.loadProject(fname) def loadProject(self,fname): self.on_actionNew_Project_triggered() self.projectName=fname self.setWindowFilePath(self.projectName) proj=json.loads(codecs.open(fname,'r','utf-8').read()) for fname in proj['assets']: self.addAsset(fname) for fname in proj['output']: self.addAsset(fname,output=True) self.setWindowModified(False) def on_actionSaveProject_As_triggered(self, b=None): if b is not None: return fname=QtGui.QFileDialog.getSaveFileName(self,"Save Project",os.getcwd(),"Project Files (*.schere)") if fname: self.projectName=fname self.on_actionSave_Project_triggered() else: return def on_actionSave_Project_triggered(self, b=None): if b is not None: return if not self.projectName: self.on_actionSaveProject_As_triggered() # A project is the current state of the program. # So far, that means: # * List of assets # * List of output clips proj={} proj['assets']=[] proj['output']=[] for i in range (self.ui.assets.count()): proj['assets'].append(self.ui.assets.item(i).asset.fname) for i in range (self.ui.output.count()): proj['output'].append(self.ui.output.item(i).asset.fname) codecs.open(self.projectName,'w+','utf-8').write(json.dumps(proj)) self.setWindowModified(False) def on_assets_itemDoubleClicked(self, item=None): if item is None: return asset = item.asset self.ui.output.addItem(asset.createItem()) def selectClip(self, fname): '''Select which clip the player shows''' self.curClip=fname self.mediaSource=Phonon.MediaSource(fname) self.ui.player.load(self.mediaSource) self.ui.player.seek(0) self.ui.play.setChecked(False) self.mediaObject=self.ui.player.mediaObject() self.mediaObject.stateChanged.connect(self.stateChanged) self.mediaObject.setTickInterval(25) self.mediaObject.tick.connect(self.tick) #self.ui.seekplaceholder.deleteLater() self.ui.seekslider.deleteLater() self.ui.volslider.deleteLater() self.ui.seekslider=Phonon.SeekSlider(self.mediaObject) self.ui.volslider=Phonon.VolumeSlider(self.ui.player.audioOutput()) self.ui.controls.addWidget(self.ui.seekslider) self.ui.controls.addWidget(self.ui.volslider) def on_assets_itemClicked(self, item=None): if item is None: return asset = item.asset self.selectClip(asset.fname) for i in self.ui.output.selectedItems(): i.setSelected(False) def on_output_itemClicked(self, item=None): if item is None: return asset = item.asset self.selectClip(asset.fname) for i in self.ui.assets.selectedItems(): i.setSelected(False) def on_cut_clicked(self, b=None): if b is not None: return if not self.curClip: return # Cut the current asset's section as selected. fname=QtGui.QFileDialog.getSaveFileName() if fname: # Do the cutting # mplayer shifts endpos by ss, so if you want a clip from 5 seconds # to 10 seconds, it's -ss 5 -endpos 5 if self.ui.markFrom.isChecked(): h1,m1,s1=map(float,str(self.ui.cutFrom.text()).split(':')) t1=h1*3600+m1*60+s1 else: t1=0 if self.ui.markTo.isChecked(): h2,m2,s2=map(float,str(self.ui.cutTo.text()).split(':')) t2=h2*3600+m2*60+s2 else: t2=99999999 t2=t2-t1 cmd='mencoder -ovc copy -oac copy %s -ss %s -endpos %s -o %s'%\ (self.curClip,t1,t2,fname) print 'CMD:',cmd # TODO: error handling self.proc = QtCore.QProcess(self) self.proc.setProcessChannelMode(QtCore.QProcess.MergedChannels) self.proc.readyRead.connect(self.mencoderProgress) self.proc.finished.connect(self.mencoderDone) self.message.setText('Encoding '+ fname) self.proc.start('mencoder',['-ovc','copy','-oac','copy',self.curClip, '-ss',str(t1),'-endpos',str(t2),'-o',fname]) # Add asset of the cutted clip self.addAsset(fname) def mencoderDone(self): self.message.setText('Job finished') self.progress.hide() def mencoderProgress(self): self.progress.show() l=str(self.proc.readLine())[2:].strip() print l if 'Pos:' not in l: return pos=int(l.split('(')[1].split('%')[0]) self.progress.setValue(pos) def addAsset(self,fname,output=False): asset=Asset(fname) if asset.thumb is None: #Unrecognized formart QtGui.QMessageBox.critical(self,"Error opening %s"%fname, "File format not recognized. It doesn't look like a video to me") return if output: self.ui.output.addItem(asset.createItem()) else: self.ui.assets.addItem(asset.createItem()) self.setWindowModified(True) return def on_play_toggled(self, b): if b: #play pressed self.ui.player.play() self.ui.play.setIcon(QtGui.QIcon(':/icons/pause.svg')) else: #pause pressed self.ui.player.pause() self.ui.play.setIcon(QtGui.QIcon(':/icons/player_play.svg')) def on_addAsset_triggered(self, b = None): if b is None: return fname=QtGui.QFileDialog.getOpenFileName() if fname: self.addAsset(fname) def on_actionRemove_Asset_triggered(self, b = None): if b is None: return item=self.ui.assets.selectedItems()[0] if item: self.ui.assets.takeItem(self.ui.assets.row(item)) self.setWindowModified(True) def on_actionRender_triggered(self,b=None): if b is not None: return fname=QtGui.QFileDialog.getSaveFileName() if fname: inputs=[] i=0 while True: item=self.ui.output.item(i) if item is None: break inputs.append(item.asset.fname) i+=1 self.proc = QtCore.QProcess(self) self.proc.setProcessChannelMode(QtCore.QProcess.MergedChannels) self.proc.readyRead.connect(self.mencoderProgress) self.proc.finished.connect(self.mencoderDone) self.message.setText('Encoding '+ fname) self.proc.start('/usr/bin/mencoder',['-ovc','lavc','-oac','mp3lame']+inputs+ ['-o',fname])