def initializePage(self): # self.field('database_configure') does not matter self.worker = DatabaseSetupWorker() self.worker.start() self.worker.stateProgress.connect(self.onStateProgressSignal) self.worker.stateError.connect(self.onStateErrorSignal) self.worker.stateRun.emit(self.worker.STATE_INIT)
def initializePage(self): # self.field('database_configure') does not matter self.worker = DatabaseSetupWorker() self.worker.start() self.worker.stateProgress.connect(self.onStateProgressSignal) self.worker.stateError.connect(self.onStateErrorSignal) self.worker.stateRun.emit(self.worker.STATE_INIT)
class DatabaseSetupWizardPage(BaseWizardPage): def __init__(self, parent=None): super(DatabaseSetupWizardPage, self).__init__(parent) dsw = DatabaseSetupWorker statesLayout = QtGui.QGridLayout() self.stateIcons = {} self.stateLabels = {} self.stateDetails = {} labels = { dsw.STATE_INIT: "Initialize database", dsw.STATE_LOAD: "Load database", dsw.STATE_CREATE: "Create models", dsw.STATE_TEST: "Insert test data", dsw.STATE_DONE: "Finished setting up database" } for i, state in enumerate( (dsw.STATE_INIT, dsw.STATE_LOAD, dsw.STATE_CREATE, dsw.STATE_TEST, dsw.STATE_DONE)): self.stateIcons[state] = icon = QtGui.QLabel(self) self.stateLabels[state] = label = QtGui.QLabel(labels[state], self) self.stateDetails[state] = details = QtGui.QLabel(self) self.stateDetails[state].setWordWrap(True) statesLayout.addWidget(icon, i, 0) statesLayout.addWidget(label, i, 1) statesLayout.addWidget(details, i, 2) statesLayout.setColumnStretch(0, 0) statesLayout.setColumnStretch(1, 0) statesLayout.setColumnStretch(2, 1) self.progress = QtGui.QProgressBar(self) self.progress.setRange(0, 100) self.progress.setTextVisible(True) self.questionBox = QtGui.QGroupBox(self) self.questionBox.hide() self.prompt = QtGui.QLabel(self.questionBox) self.buttonBox = QtGui.QDialogButtonBox( QtGui.QDialogButtonBox.Yes | QtGui.QDialogButtonBox.No, QtCore.Qt.Horizontal, self.questionBox) self.buttonBox.accepted.connect(self.onPromptAccept) self.buttonBox.rejected.connect(self.onPromptReject) questionLayout = QtGui.QVBoxLayout() questionLayout.addWidget(self.prompt) questionLayout.addWidget(self.buttonBox) self.questionBox.setLayout(questionLayout) layout = QtGui.QVBoxLayout() layout.setSpacing(10) layout.addLayout(statesLayout) layout.addWidget(self.progress) layout.addStretch(1) layout.addWidget(self.questionBox) self.setLayout(layout) self.worker = None self.__error_occured = False def initializePage(self): # self.field('database_configure') does not matter self.worker = DatabaseSetupWorker() self.worker.start() self.worker.stateProgress.connect(self.onStateProgressSignal) self.worker.stateError.connect(self.onStateErrorSignal) self.worker.stateRun.emit(self.worker.STATE_INIT) def cleanupPage(self): self.worker.quit() self.worker.wait() # TODO: error when opening connection in a thread and closing it in another thread. # TODO: error when pressing back and coming back (looks like database tables are not cleared) for iconLbl in self.stateIcons.itervalues(): iconLbl.setPixmap(None) for detailsLbl in self.stateDetails.itervalues(): detailsLbl.setText("") def validatePage(self): if self.__error_occured: return False if self.worker.isRunning(): return False return True def isComplete(self): if self.worker.isRunning(): return False else: return super(DatabaseSetupWizardPage, self).isComplete() def onStateErrorSignal(self, state, exception): if state == self.worker.STATE_INIT: message = "Could not connect to database!" elif state == self.worker.STATE_LOAD: message = "Error loading models!" elif state == self.worker.STATE_CREATE: message = "Error creating tables!" elif state == self.worker.STATE_TEST: message = "Error inserting test values!" else: message = "An error occured!" self.__error_occured = True self.setMessage( state, -1, "<b>{message}</b><br />{exception}".format( message=message, exception=str(exception))) self.setProgress(self.worker.STATE_DONE, self.worker.DONE) self.worker.quit() self.completeChanged.emit() def onStateProgressSignal(self, state, progress): self.setProgress(state, progress) if state == self.worker.STATE_INIT: # First, connect to the database if progress == self.worker.START: self.setMessage(state, progress, "Connecting to database...") elif progress == self.worker.DONE: self.setMessage(state, progress, "Connected to database.") self.worker.stateRun.emit(self.worker.STATE_LOAD) elif state == self.worker.STATE_LOAD: # Second, load the models if progress == self.worker.START: self.setMessage(state, progress, "Loading models...") elif progress == self.worker.DONE: self.setMessage(state, progress, "Models loaded.") self.setPrompt(question="""Reconfigure Database? This will drop the tables in the database you chose and recreate it.""", onAccept=self.worker.STATE_CREATE, onReject=self.worker.STATE_DONE) elif state == self.worker.STATE_CREATE: # Third, create the tables if progress == self.worker.START: self.setMessage(state, progress, "Creating tables...") elif progress == self.worker.DONE: self.setMessage(state, progress, "Tables created.") self.setPrompt(question="""Insert test values?""", onAccept=self.worker.STATE_TEST, onReject=self.worker.STATE_DONE) elif state == self.worker.STATE_TEST: # Fourth, insert the test values if progress == self.worker.START: self.setMessage(state, progress, "Inserting test values...") elif progress == self.worker.DONE: self.setMessage(state, progress, "Inserted test values.") self.worker.stateRun.emit(self.worker.STATE_DONE) elif state == self.worker.STATE_DONE and progress == self.worker.DONE: # Fifth, we are done self.setMessage(state, progress, "Done.") self.completeChanged.emit() def setPrompt(self, question, onAccept, onReject): self.questionBox.show() self.prompt.setText(question) self.__question_accept_callback = lambda sig=onAccept: self.worker.stateRun.emit( sig) self.__question_reject_callback = lambda sig=onReject: self.worker.stateRun.emit( sig) def onPromptAccept(self): self.__question_accept_callback() self.questionBox.hide() def onPromptReject(self): self.__question_reject_callback() self.questionBox.hide() def setMessage(self, state, stage, text): self.stateDetails[state].setText(text) if stage == self.worker.START: pass elif stage == self.worker.DONE: icon = QtGui.QIcon.fromTheme("dialog-ok-apply") pixmap = icon.pixmap(16, 16) self.stateIcons[state].setPixmap(pixmap) elif stage < self.worker.START: icon = QtGui.QIcon.fromTheme("dialog-close") pixmap = icon.pixmap(16, 16) self.stateIcons[state].setPixmap(pixmap) def setProgress(self, state, progress): self.progress.setValue((state - 1 + (progress / self.worker.DONE)) * 100.0 / self.worker.STATE_DONE)
class DatabaseSetupWizardPage(BaseWizardPage): def __init__(self, parent=None): super(DatabaseSetupWizardPage, self).__init__(parent) dsw = DatabaseSetupWorker statesLayout = QtGui.QGridLayout() self.stateIcons = {} self.stateLabels = {} self.stateDetails = {} labels = {dsw.STATE_INIT: "Initialize database", dsw.STATE_LOAD: "Load database", dsw.STATE_CREATE: "Create models", dsw.STATE_TEST: "Insert test data", dsw.STATE_DONE: "Finished setting up database" } for i, state in enumerate((dsw.STATE_INIT, dsw.STATE_LOAD, dsw.STATE_CREATE, dsw.STATE_TEST, dsw.STATE_DONE)): self.stateIcons[state] = icon = QtGui.QLabel(self) self.stateLabels[state] = label = QtGui.QLabel(labels[state], self) self.stateDetails[state] = details = QtGui.QLabel(self) self.stateDetails[state].setWordWrap(True) statesLayout.addWidget(icon, i, 0) statesLayout.addWidget(label, i, 1) statesLayout.addWidget(details, i, 2) statesLayout.setColumnStretch(0, 0) statesLayout.setColumnStretch(1, 0) statesLayout.setColumnStretch(2, 1) self.progress = QtGui.QProgressBar(self) self.progress.setRange(0, 100) self.progress.setTextVisible(True) self.questionBox = QtGui.QGroupBox(self) self.questionBox.hide() self.prompt = QtGui.QLabel(self.questionBox) self.buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Yes | QtGui.QDialogButtonBox.No, QtCore.Qt.Horizontal, self.questionBox) self.buttonBox.accepted.connect(self.onPromptAccept) self.buttonBox.rejected.connect(self.onPromptReject) questionLayout = QtGui.QVBoxLayout() questionLayout.addWidget(self.prompt) questionLayout.addWidget(self.buttonBox) self.questionBox.setLayout(questionLayout) layout = QtGui.QVBoxLayout() layout.setSpacing(10) layout.addLayout(statesLayout) layout.addWidget(self.progress) layout.addStretch(1) layout.addWidget(self.questionBox) self.setLayout(layout) self.worker = None self.__error_occured = False def initializePage(self): # self.field('database_configure') does not matter self.worker = DatabaseSetupWorker() self.worker.start() self.worker.stateProgress.connect(self.onStateProgressSignal) self.worker.stateError.connect(self.onStateErrorSignal) self.worker.stateRun.emit(self.worker.STATE_INIT) def cleanupPage(self): self.worker.quit() self.worker.wait() # TODO: error when opening connection in a thread and closing it in another thread. # TODO: error when pressing back and coming back (looks like database tables are not cleared) for iconLbl in self.stateIcons.itervalues(): iconLbl.setPixmap(None) for detailsLbl in self.stateDetails.itervalues(): detailsLbl.setText("") def validatePage(self): if self.__error_occured: return False if self.worker.isRunning(): return False return True def isComplete(self): if self.worker.isRunning(): return False else: return super(DatabaseSetupWizardPage, self).isComplete() def onStateErrorSignal(self, state, exception): if state == self.worker.STATE_INIT: message = "Could not connect to database!" elif state == self.worker.STATE_LOAD: message = "Error loading models!" elif state == self.worker.STATE_CREATE: message = "Error creating tables!" elif state == self.worker.STATE_TEST: message = "Error inserting test values!" else: message = "An error occured!" self.__error_occured = True self.setMessage(state, -1, "<b>{message}</b><br />{exception}".format( message=message, exception=str(exception) )) self.setProgress(self.worker.STATE_DONE, self.worker.DONE) self.worker.quit() self.completeChanged.emit() def onStateProgressSignal(self, state, progress): self.setProgress(state, progress) if state == self.worker.STATE_INIT: # First, connect to the database if progress == self.worker.START: self.setMessage(state, progress, "Connecting to database...") elif progress == self.worker.DONE: self.setMessage(state, progress, "Connected to database.") self.worker.stateRun.emit(self.worker.STATE_LOAD) elif state == self.worker.STATE_LOAD: # Second, load the models if progress == self.worker.START: self.setMessage(state, progress, "Loading models...") elif progress == self.worker.DONE: self.setMessage(state, progress, "Models loaded.") self.setPrompt(question="""Reconfigure Database? This will drop the tables in the database you chose and recreate it.""", onAccept=self.worker.STATE_CREATE, onReject=self.worker.STATE_DONE ) elif state == self.worker.STATE_CREATE: # Third, create the tables if progress == self.worker.START: self.setMessage(state, progress, "Creating tables...") elif progress == self.worker.DONE: self.setMessage(state, progress, "Tables created.") self.setPrompt(question="""Insert test values?""", onAccept=self.worker.STATE_TEST, onReject=self.worker.STATE_DONE ) elif state == self.worker.STATE_TEST: # Fourth, insert the test values if progress == self.worker.START: self.setMessage(state, progress, "Inserting test values...") elif progress == self.worker.DONE: self.setMessage(state, progress, "Inserted test values.") self.worker.stateRun.emit(self.worker.STATE_DONE) elif state == self.worker.STATE_DONE and progress == self.worker.DONE: # Fifth, we are done self.setMessage(state, progress, "Done.") self.completeChanged.emit() def setPrompt(self, question, onAccept, onReject): self.questionBox.show() self.prompt.setText(question) self.__question_accept_callback = lambda sig=onAccept: self.worker.stateRun.emit(sig) self.__question_reject_callback = lambda sig=onReject: self.worker.stateRun.emit(sig) def onPromptAccept(self): self.__question_accept_callback() self.questionBox.hide() def onPromptReject(self): self.__question_reject_callback() self.questionBox.hide() def setMessage(self, state, stage, text): self.stateDetails[state].setText(text) if stage == self.worker.START: pass elif stage == self.worker.DONE: icon = QtGui.QIcon.fromTheme("dialog-ok-apply") pixmap = icon.pixmap(16, 16) self.stateIcons[state].setPixmap(pixmap) elif stage < self.worker.START: icon = QtGui.QIcon.fromTheme("dialog-close") pixmap = icon.pixmap(16, 16) self.stateIcons[state].setPixmap(pixmap) def setProgress(self, state, progress): self.progress.setValue((state - 1 + (progress/self.worker.DONE)) * 100.0 / self.worker.STATE_DONE)