def start(self): # 1)start node service NodeService.start(self) # 2)init params self.initParams() # 3)init gui self.initUI() # 4)user timer to update gui list every 3 seconds self.update_timer = UpdateGUIListTimer('Thread-Update GUI Timer',self.update_interval,self.updateList) self.update_timer.start()
class GuiClient(NodeService,QtGui.QMainWindow): """ a simple client with gui """ def __init__(self,url,dirname,ipsfile,update_interval): NodeService.__init__(self,url,dirname,ipsfile) QtGui.QMainWindow.__init__(self) # update_interval for update timer self.update_interval = update_interval # start gui client self.start() def start(self): # 1)start node service NodeService.start(self) # 2)init params self.initParams() # 3)init gui self.initUI() # 4)user timer to update gui list every 3 seconds self.update_timer = UpdateGUIListTimer('Thread-Update GUI Timer',self.update_interval,self.updateList) self.update_timer.start() def stop(self): # 1) stop update timer self.update_timer.stop() # 2) stop node service NodeService.stop(self) def initParams(self): self.localurl = NodeService.get_url(self) self.local_files = [] self.remote_files = {} def initUI(self): mylogger.info("[initUI]...") # menus toolbars statusbar # actions self.fetchAction = QtGui.QAction(QtGui.QIcon(ICON_FETCH), '&Fetch', self) self.fetchAction.setShortcut('Ctrl+F') self.fetchAction.setStatusTip('Fetch file') self.fetchAction.triggered.connect(self.onFetchHandler) self.stopAction = QtGui.QAction(QtGui.QIcon(ICON_QUIT), '&Quit', self) self.stopAction.setShortcut('Ctrl+Q') self.stopAction.setStatusTip('Quit application') self.stopAction.triggered.connect(self.close) menubar = self.menuBar() fileMenu = menubar.addMenu('&File') fileMenu.addAction(self.fetchAction) fileMenu.addAction(self.stopAction) toolbar = self.addToolBar('tool') toolbar.addAction(self.fetchAction) toolbar.addAction(self.stopAction) self.statusbar = self.statusBar() # GuiWidget self.main_widget = GuiWidget(self) self.main_widget.le.textChanged[str].connect(self.onTextChanged) self.main_widget.btn_fetch.clicked.connect(self.onFetchHandler) self.main_widget.btn_update.clicked.connect(self.onUpdateHandler) self.main_widget.list_remote.itemClicked.connect(self.onListItemClicked) # set central widget for main window self.setCentralWidget(self.main_widget) # set control states self.setFetchEnabled(False) # set list files self.setLocal() self.setRemote() # settings for window self.resize(WIN_WIDTH,WIN_HEIGHT) #self.move(200,200) self.center() self.setWindowTitle('File Sharing Client') self.setWindowIcon(QtGui.QIcon(ICON_APP)) self.show() def closeEvent(self,event): mylogger.info("[closeEvent]") # If we close the QtGui.QWidget, the QtGui.QCloseEvent is generated and closeEvent is called. reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to exit?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.Yes) if reply == QtGui.QMessageBox.Yes: msg = ('###[closeEvent]: program is going to exit... ') mylogger.info(msg) print(msg) self.stop() event.accept() else: event.ignore() def onUpdateHandler(self,value): mylogger.info("[onUpdateHandler]...") self.updateList() def _setLocalFiles(self): self.local_files = NodeService.get_local_files(self) def _setRemoteFiles(self): self.remote_files = NodeService.get_remote_files(self) def _setLocalLabel(self): #mylogger.info("[_setLocalLabel]...") str_local = "local@{0} [total {1} files]".format(self.localurl,len(self.local_files)) self.main_widget.label_local.setText(str_local) def _getRemoteFileCount(self,remotefiles): count = 0 for url,ls in remotefiles.iteritems(): count +=len(ls) return count def _setRemoteLabel(self): #mylogger.info("[_setRemoteLabel]...") nodeCount = len(self.remote_files) fileCount = self._getRemoteFileCount(self.remote_files) str_remote = "remote [{0} nodes,total {1} files]".format(nodeCount,fileCount) self.main_widget.label_remote.setText(str_remote) def _setLocalList(self): #mylogger.info("[_setLocalList]...") self.main_widget.list_local.clear() for f in self.local_files: self.main_widget.list_local.addItem(f) def _setRemoteList(self): #mylogger.info("[_setRemoteList]...") self.main_widget.list_remote.clear() for url,lt in self.remote_files.iteritems(): for f in lt: self.main_widget.list_remote.addItem(f) def setLocal(self): if NodeService.is_local_updated(self): mylogger.info('[setLocal]...') self._setLocalFiles() self._setLocalLabel() self._setLocalList() mylogger.info('[setLocal] finished') # after set local list,clear local update NodeService.clear_local_update(self) # set to false else: mylogger.info('*********NO GUI UPDATE FOR local list*********') def setRemote(self): if NodeService.is_remote_updated(self): mylogger.info('[setRemote]...') self._setRemoteFiles() self._setRemoteLabel() self._setRemoteList() mylogger.info('[setRemote] finished') # after set remote list,clear remote update NodeService.clear_remote_update(self) # set to false else: mylogger.info('*********NO GUI UPDATE FOR remote list*********') def updateList(self): mylogger.info('-'*50) mylogger.info("[updateList]...") # update local and remote files NodeService.update_local_list(self) NodeService.update_remote_list(self) self.setLocal() self.setRemote() mylogger.info("[updateList] finished") mylogger.info('-'*50) def setFetchEnabled(self,enabled): self.fetchAction.setEnabled(enabled) self.main_widget.btn_fetch.setEnabled(enabled) def center(self): mbr = self.frameGeometry() cen = QtGui.QDesktopWidget().availableGeometry().center() mbr.moveCenter(cen) self.move(mbr.topLeft()) def keyPressEvent(self,event): mylogger.info("[keyPressEvent]") if event.key() == QtCore.Qt.Key_Escape: self.close() elif event.key() == QtCore.Qt.Key_Enter: self.onFetchHandler(False) else: pass def onTextChanged(self,value): if value.isEmpty(): # set control states self.setFetchEnabled(False) else: # set control states self.setFetchEnabled(True) def onFetchHandler(self,value): mylogger.info("[onFetchHandler]") # by default ,for a button value is False arg = str(self.main_widget.le.text()) if not arg.strip(): msg = 'Please enter query file' self.statusbar.showMessage(msg) return # add statusbar messge for fetching file msg = "Fetching [{0}].......".format(arg) mylogger.info(msg) self.statusbar.showMessage(msg) # use NodeService code = NodeService.fetch(self,arg) if code == SUCCESS: msg ="Fetch successfully for [{0}]".format(arg) self._onFetchSuccessfully(arg) elif code == ACCESS_DENIED: msg ="Access denied for [{0}]".format(arg) elif code == NOT_EXIST: msg ="Not exist for [{0}]".format(arg) else: msg = "Already exist for [{0}]".format(arg) mylogger.info(msg) self.statusbar.showMessage(msg) def _onFetchSuccessfully(self,arg): # when fetch successfully, need to update local list NodeService.update_local_list(self) self.setLocal() def onListItemClicked(self,value): self.main_widget.le.setText(value.text()) self.statusbar.showMessage('')