def startSearch(self,sender): ''' Запуск поиска ''' self.buttonStart.set_sensitive(0) self.buttonStop.set_sensitive(1) self.buttonPause.set_sensitive(1) self.buttonPause.set_active(0) self._startSpinner() self.statusBox.set_visible(True) self.liststore = gtk.ListStore(str) self.treeview.set_model(self.liststore) self.searchThread = SearchThread(self.getSearchParams()) self.searchThread.subscribe(self.update) self.searchThread.start()
class SearchWindow(gtk.Window): ''' Класс окна поиска ''' folder = None paused = False def addFiles(self,files): for file in files: self.addFile(file) def addFile(self,file): self.liststore.append((file,)) def getSearchParams(self): ''' Метод возвращает объект параметров для поиска :return: SearchParams ''' params = SearchParams() params.file_name = self.fileNameEntry.get_text() params.file_type = self.fileTypeCombo.get_active() params.file_exact = self.exactCB.get_active() params.file_case_sensitive = self.caseCB.get_active() params.file_regex = self.regexCB.get_active() params.folder = self.fileChooser.get_current_folder() params.folder_recursive = self.folderRecursiveCB.get_active() params.text_text = self.textEntry.get_text() params.text_case_sensitive = self.textCaseCB.get_active() params.text_regex = self.textRegexCB.get_active() #additional params.file_hidden = self.hiddenCB.get_active() params.use_locate = self.useLocateCB.get_active() params.follow_links = self.linksCB.get_active() return params def startSearch(self,sender): ''' Запуск поиска ''' self.buttonStart.set_sensitive(0) self.buttonStop.set_sensitive(1) self.buttonPause.set_sensitive(1) self.buttonPause.set_active(0) self._startSpinner() self.statusBox.set_visible(True) self.liststore = gtk.ListStore(str) self.treeview.set_model(self.liststore) self.searchThread = SearchThread(self.getSearchParams()) self.searchThread.subscribe(self.update) self.searchThread.start() def update(self,event): ''' Коллбек, который вызывается SearchThread'ом при возникновении события ''' if event.type == event.TYPE_FILE_FOUND: #print event.files self.addFiles(event.files) elif event.type == event.TYPE_END: self.stopSearch() elif event.type == event.TYPE_NOTICE: self.updateStatus(event.message) def stopSearch(self,sender = None): ''' Остановка поиска ''' self.buttonStart.set_sensitive(1) self.buttonStop.set_sensitive(0) self.buttonPause.set_sensitive(0) self.buttonPause.set_active(0) self._stopSpinner() self.statusBox.set_visible(False) self.searchThread.stop() def pauseSearch(self,sender): ''' Поставить поиск на паузу ''' self.paused = not self.paused if self.paused: self._stopSpinner() self.buttonPause.set_label(_('Continue search')) self.searchThread.pause() else: self._startSpinner() self.buttonPause.set_label(_('Pause search')) self.searchThread.contin() def _startSpinner(self): self.spinner.start() def _stopSpinner(self): self.spinner.stop() def updateStatus(self, message): ''' Обновить статус ''' self.statusLabel.set_label(message) def regexCBClick(self,sender): self.exactCB.set_sensitive(not self.regexCB.get_active()) def __init__(self, folder): ''' Конструктор :param folder: Папка, в которой будет осуществляться поиск :type folder: string ''' gtk.gdk.threads_init() if os.path.exists(folder): self.folder = folder gtk.Window.__init__(self) self.set_title(_('File search')) self.set_position(gtk.WIN_POS_CENTER) self.set_default_size(800,500) vbox = gtk.VBox(False, 10) self.tooltips = gtk.Tooltips() #main params mainParamsVBox = gtk.VBox(False,10) hbox1 = gtk.HBox(False,0) label1 = gtk.Label(_('File name')) label1.set_alignment(0,0.5) self.fileNameEntry = gtk.Entry() self.exactCB = gtk.CheckButton(_('Exact')) self.caseCB = gtk.CheckButton(_('Case sensitive')) self.regexCB = gtk.CheckButton(_('Regex')) self.fileTypeCombo = gtk.combo_box_new_text() self.fileTypeCombo.append_text(_('Files and folders')) self.fileTypeCombo.append_text(_('Files only')) self.fileTypeCombo.append_text(_('Folders only')) self.fileTypeCombo.set_active(0) hbox1.pack_start(label1, False, False, 10) hbox1.pack_start(self.fileNameEntry, True, True) hbox1.pack_start(self.fileTypeCombo, False, False,10) hbox1.pack_start(self.exactCB, False, False,10) hbox1.pack_start(self.caseCB, False, False,10) hbox1.pack_start(self.regexCB, False, False,10) self.regexCB.connect('clicked',self.regexCBClick) hbox2 = gtk.HBox(False,0) label2 = gtk.Label(_('Search in folder')) label2.set_alignment(0,0.5) self.fileChooser = gtk.FileChooserButton(_('Select folder')) self.fileChooser.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) if self.folder: self.fileChooser.set_current_folder(self.folder) self.folderRecursiveCB = gtk.CheckButton(_('Recursive')) self.folderRecursiveCB.set_active(True) hbox2.pack_start(label2, False, False, 10) hbox2.pack_start(self.fileChooser, True, True) hbox2.pack_start(self.folderRecursiveCB, False, False, 10) hbox3 = gtk.HBox(False,0) label3 = gtk.Label(_('Search for text')) label3.set_alignment(0,0.5) self.textEntry = gtk.Entry() self.textCaseCB = gtk.CheckButton(_('Case sensitive')) self.textRegexCB = gtk.CheckButton(_('Regex')) hbox3.pack_start(label3, False, False, 10) hbox3.pack_start(self.textEntry, True, True) hbox3.pack_start(self.textCaseCB, False, False, 10) hbox3.pack_start(self.textRegexCB, False, False, 10) mainParamsVBox.pack_start(hbox1) mainParamsVBox.pack_start(hbox2) mainParamsVBox.pack_start(hbox3) #additional params addParamsExpander = gtk.Expander(_('Additional parameters')) addParamsHBox = gtk.HBox() addParamsVBox1 = gtk.VBox() self.useLocateCB = gtk.CheckButton(_('Use UNIX \'locate\' command')) self.useLocateCB.set_active(True) self.tooltips.set_tip(self.useLocateCB, 'Possibly slow for text search') self.hiddenCB = gtk.CheckButton(_('Process hidden files and folders')) self.linksCB = gtk.CheckButton(_('Follow simlinks')) self.tooltips.set_tip(self.linksCB, 'Attention! Dead locks possible! ') self.linksCB.set_active(True) addParamsVBox1.pack_start(self.useLocateCB, False, False) addParamsVBox1.pack_start(self.hiddenCB, False, False) addParamsVBox1.pack_start(self.linksCB, False, False) addParamsHBox.pack_start(addParamsVBox1,False, False, 10) addParamsExpander.add(addParamsHBox) #treeview self.treeview = gtk.TreeView() r = gtk.CellRendererText() self.treeview.insert_column_with_attributes(-1, "File name", r, text=0) #status box self.statusBox = gtk.HBox(False,10) self.spinner = gtk.Spinner() #self.spinner.set_sensitive(0) self.statusLabel = gtk.Label('') # statusLabel.set_justify(gtk.JUSTIFY_LEFT) self.statusLabel.set_alignment(0,0) self.statusLabel.set_width_chars(120) self.statusBox.pack_start(self.spinner,False,False,10) self.statusBox.pack_start(self.statusLabel, False, False,10) #button box buttonBox = gtk.HButtonBox() buttonBox.set_border_width(10) self.buttonStart = gtk.Button(_('Start search')) self.buttonStop = gtk.Button(_('Stop search')) self.buttonPause = gtk.ToggleButton(_('Pause search')) self.buttonPause.set_mode(True) self.buttonClose = gtk.Button(_('Close')) buttonBox.add(self.buttonStart) buttonBox.add(self.buttonStop) buttonBox.add(self.buttonPause) buttonBox.add(self.buttonClose) self.buttonClose.connect('clicked', progexit) self.buttonStart.connect('clicked', self.startSearch) self.buttonStop.connect('clicked', self.stopSearch) self.buttonPause.connect('clicked',self.pauseSearch) self.buttonStop.set_sensitive(0) self.buttonPause.set_sensitive(0) vbox.pack_start(mainParamsVBox, False, True, 10) vbox.pack_start(addParamsExpander, False, True, 0) scrolled = gtk.ScrolledWindow() scrolled.add(self.treeview) vbox.pack_start(scrolled, True, True, 0) vbox.pack_start(self.statusBox, False, True, 0) vbox.pack_start(buttonBox, False, True, 0) self.add(vbox) self.connect('destroy',progexit) self.show_all() maxLabelWidth = max(label1.get_allocation()[2], label2.get_allocation()[2], label3.get_allocation()[2]) label1.set_size_request(maxLabelWidth,-1) label2.set_size_request(maxLabelWidth,-1) label3.set_size_request(maxLabelWidth,-1) self.statusBox.set_visible(False)
class SearchWindow(gtk.Window): ''' Класс окна поиска ''' folder = None paused = False def addFiles(self,files): for file in files: self.addFile(file) def addFile(self,file): self.liststore.append((file,)) def getSearchParams(self): ''' Метод возвращает объект параметров для поиска :return: SearchParams ''' params = SearchParams() params.file_name = self.fileNameEntry.get_text() params.file_type = self.fileTypeCombo.get_active() params.file_exact = self.exactCB.get_active() params.file_case_sensitive = self.caseCB.get_active() params.file_regex = self.regexCB.get_active() params.folder = self.fileChooser.get_current_folder() params.folder_recursive = self.folderRecursiveCB.get_active() params.text_text = self.textEntry.get_text() params.text_case_sensitive = self.textCaseCB.get_active() params.text_regex = self.textRegexCB.get_active() #additional params.file_hidden = self.hiddenCB.get_active() params.use_locate = self.useLocateCB.get_active() params.follow_links = self.linksCB.get_active() return params def startSearch(self,sender): ''' Запуск поиска ''' self.buttonStart.set_sensitive(0) self.buttonStop.set_sensitive(1) self.buttonPause.set_sensitive(1) self.buttonPause.set_active(0) self._startSpinner() self.statusBox.set_visible(True) self.liststore = gtk.ListStore(str) self.treeview.set_model(self.liststore) self.searchThread = SearchThread(self.getSearchParams()) self.searchThread.subscribe(self.update) self.searchThread.start() def update(self,event): ''' Коллбек, который вызывается SearchThread'ом при возникновении события ''' if event.type == event.TYPE_FILE_FOUND: #print event.files self.addFiles(event.files) elif event.type == event.TYPE_END: self.stopSearch() elif event.type == event.TYPE_NOTICE: self.updateStatus(event.message) def stopSearch(self,sender = None): ''' Остановка поиска ''' self.buttonStart.set_sensitive(1) self.buttonStop.set_sensitive(0) self.buttonPause.set_sensitive(0) self.buttonPause.set_active(0) self._stopSpinner() self.statusBox.set_visible(False) self.searchThread.stop() def pauseSearch(self,sender): ''' Поставить поиск на паузу ''' self.paused = not self.paused if self.paused: self._stopSpinner() self.buttonPause.set_label(_('Continue search')) self.buttonPause.set_image(self.imageContinue) self.searchThread.pause() else: self._startSpinner() self.buttonPause.set_label(_('Pause search')) self.buttonPause.set_image(self.imagePause) self.searchThread.contin() def closeSearch(self, sender,event = None): if hasattr(self, 'searchThread') and self.searchThread.status != self.searchThread.STATUS_STOPPED: self.stopSearch() self.hide() return True def _startSpinner(self): self.spinner.start() def _stopSpinner(self): self.spinner.stop() def updateStatus(self, message): ''' Обновить статус ''' self.statusLabel.set_label(message) def regexCBClick(self,sender): self.exactCB.set_sensitive(not self.regexCB.get_active()) def __init__(self, folder): ''' Конструктор :param folder: Папка, в которой будет осуществляться поиск :type folder: string ''' gtk.gdk.threads_init() if os.path.exists(folder): self.folder = folder gtk.Window.__init__(self) self.set_title(_('File search')) self.set_position(gtk.WIN_POS_CENTER) self.set_default_size(800,500) vbox = gtk.VBox(False, 10) #main params mainParamsVBox = gtk.VBox(False,10) hbox1 = gtk.HBox(False,0) self.label1 = gtk.Label(_('File name')) self.label1.set_alignment(0,0.5) self.fileNameEntry = gtk.Entry() self.exactCB = gtk.CheckButton(_('Exact')) self.caseCB = gtk.CheckButton(_('Case sensitive')) self.regexCB = gtk.CheckButton(_('Regex')) self.fileTypeCombo = gtk.combo_box_new_text() self.fileTypeCombo.append_text(_('Files and folders')) self.fileTypeCombo.append_text(_('Files only')) self.fileTypeCombo.append_text(_('Folders only')) self.fileTypeCombo.set_active(0) hbox1.pack_start(self.label1, False, False, 10) hbox1.pack_start(self.fileNameEntry, True, True) hbox1.pack_start(self.fileTypeCombo, False, False,10) hbox1.pack_start(self.exactCB, False, False,10) hbox1.pack_start(self.caseCB, False, False,10) hbox1.pack_start(self.regexCB, False, False,10) self.regexCB.connect('clicked',self.regexCBClick) hbox2 = gtk.HBox(False,0) self.label2 = gtk.Label(_('Search in folder')) self.label2.set_alignment(0,0.5) self.fileChooser = gtk.FileChooserButton(_('Select folder')) self.fileChooser.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) if self.folder: self.fileChooser.set_current_folder(self.folder) self.folderRecursiveCB = gtk.CheckButton(_('Recursive')) self.folderRecursiveCB.set_active(True) hbox2.pack_start(self.label2, False, False, 10) hbox2.pack_start(self.fileChooser, True, True) hbox2.pack_start(self.folderRecursiveCB, False, False, 10) hbox3 = gtk.HBox(False,0) self.label3 = gtk.Label(_('Search for text')) self.label3.set_alignment(0,0.5) self.textEntry = gtk.Entry() self.textCaseCB = gtk.CheckButton(_('Case sensitive')) self.textRegexCB = gtk.CheckButton(_('Regex')) hbox3.pack_start(self.label3, False, False, 10) hbox3.pack_start(self.textEntry, True, True) hbox3.pack_start(self.textCaseCB, False, False, 10) hbox3.pack_start(self.textRegexCB, False, False, 10) mainParamsVBox.pack_start(hbox1) mainParamsVBox.pack_start(hbox2) mainParamsVBox.pack_start(hbox3) #additional params addParamsExpander = gtk.Expander(_('Additional parameters')) addParamsHBox = gtk.HBox() addParamsVBox1 = gtk.VBox() self.useLocateCB = gtk.CheckButton(_('Use UNIX \'locate\' command')) self.useLocateCB.set_active(True) self.useLocateCB.set_tooltip_text('Possibly slow for text search') self.hiddenCB = gtk.CheckButton(_('Process hidden files and folders')) self.linksCB = gtk.CheckButton(_('Follow simlinks')) self.linksCB.set_tooltip_text('Attention! Dead locks possible! ') self.linksCB.set_active(True) addParamsVBox1.pack_start(self.useLocateCB, False, False) addParamsVBox1.pack_start(self.hiddenCB, False, False) addParamsVBox1.pack_start(self.linksCB, False, False) addParamsHBox.pack_start(addParamsVBox1,False, False, 10) addParamsExpander.add(addParamsHBox) #treeview self.treeview = gtk.TreeView() r = gtk.CellRendererText() self.treeview.insert_column_with_attributes(-1, "File name", r, text=0) #status box self.statusBox = gtk.HBox(False,10) self.spinner = gtk.Spinner() #self.spinner.set_sensitive(0) self.statusLabel = gtk.Label('') # statusLabel.set_justify(gtk.JUSTIFY_LEFT) self.statusLabel.set_alignment(0,0) self.statusLabel.set_width_chars(120) self.statusBox.pack_start(self.spinner,False,False,10) self.statusBox.pack_start(self.statusLabel, False, False,10) #button box buttonBox = gtk.HButtonBox() buttonBox.set_layout(gtk.BUTTONBOX_END) buttonBox.set_spacing(10) buttonBox.set_border_width(10) self.buttonStart = gtk.Button(_('Start search'),gtk.STOCK_FIND) self.buttonStop = gtk.Button(_('Stop search'), gtk.STOCK_STOP) self.imagePause = gtk.Image() self.imagePause.set_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_BUTTON) self.imageContinue = gtk.Image() self.imageContinue.set_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON) self.buttonPause = gtk.ToggleButton(_('Pause search')) self.buttonPause.set_image(self.imagePause) self.buttonPause.set_mode(True) self.buttonClose = gtk.Button(_('Close'), gtk.STOCK_CLOSE) buttonBox.add(self.buttonStart) buttonBox.add(self.buttonStop) buttonBox.add(self.buttonPause) buttonBox.add(self.buttonClose) self.buttonClose.connect('clicked', self.closeSearch) self.buttonStart.connect('clicked', self.startSearch) self.buttonStop.connect('clicked', self.stopSearch) self.buttonPause.connect('clicked',self.pauseSearch) self.buttonStop.set_sensitive(0) self.buttonPause.set_sensitive(0) vbox.pack_start(mainParamsVBox, False, True, 10) vbox.pack_start(addParamsExpander, False, True, 0) scrolled = gtk.ScrolledWindow() scrolled.add(self.treeview) vbox.pack_start(scrolled, True, True, 0) vbox.pack_start(self.statusBox, False, True, 0) vbox.pack_start(buttonBox, False, True, 0) self.add(vbox) #self.connect('destroy', self.closeSearch) self.connect('delete-event', self.closeSearch) def show_all(self, folder = None): gtk.Window.show_all(self) if folder and os.path.exists(folder): self.folder = folder self.fileChooser.set_current_folder(self.folder) maxLabelWidth = max(self.label1.get_allocation()[2], self.label2.get_allocation()[2], self.label3.get_allocation()[2]) self.label1.set_size_request(maxLabelWidth,-1) self.label2.set_size_request(maxLabelWidth,-1) self.label3.set_size_request(maxLabelWidth,-1) self.statusBox.set_visible(False)