def cut_items(self, no_confirm=False): if core_api.block_databases(): # get_tree_selections() arguments must be compatible with the # ones used in self.delete_items() selection = wxgui_api.get_tree_selections(self.filename, none=False, descendants=True) if selection: items = [] for item in selection: id_ = wxgui_api.get_tree_item_id(self.filename, item) if not wxgui_api.close_editor(self.filename, id_, ask='quiet' if no_confirm else 'discard'): core_api.release_databases() return False items.append(id_) copypaste_api.copy_items(self.filename, items) wxgui_api.delete_items(self.filename, items, description='Cut {} items'.format(len(items))) wxgui_api.refresh_history(self.filename) cut_items_event.signal() core_api.release_databases()
def _activate_occurrences_block(self, time, occsd): # It's important that the databases are blocked on this thread, and not # on the search thread, otherwise the program would hang if some # occurrences are activated while the user is performing an action core_api.block_databases(block=True) self._activate_occurrences(time, occsd) core_api.release_databases()
def move_item(): if _select_database(): if _select_items(False): c = random.randint(0, 2) if c == 0: log.debug('Simulate move item up') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_move_item_up() elif c == 1: log.debug('Simulate move item down') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_move_item_down() else: log.debug('Simulate move item to parent') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_move_item_to_parent() else: # Databases are blocked in simulator._do_action core_api.release_databases() return False else: # Databases are blocked in simulator._do_action core_api.release_databases() return False
def dismiss(self, event): if core_api.block_databases(): organism_alarms_api.dismiss_alarms({self.filename: {self.id_: [self.alarmid, ]}}) # Let the alarm off event close the alarm core_api.release_databases()
def _continue(self): # It's important that the databases are blocked on this thread, and not # on the main thread, otherwise the program would hang if some # occurrences are activated while the user is performing an action core_api.block_databases(block=True) search_old_occurrences_event.signal(filename=self.filename, last_search=self.exclmint) self.state = 0 while self.state < 1: self.search = organism_api.get_occurrences_range( mint=self.exclmint, maxt=self.whileago, filenames=(self.filename, )) self.state = 2 # Make sure to bind *after* self.search is instantiated and # self.state is set to 2, but *before* it's started core_api.bind_to_closing_database(self._handle_closing_database) self.search.start() if self.state == 1: self._abort() else: self._process_results() core_api.release_databases()
def snooze(self, event): if core_api.block_databases(): organism_alarms_api.snooze_alarms({self.filename: {self.id_: [self.alarmid, ]}}, stime=self.awindow.get_snooze_time()) # Let the alarm off event close the alarm core_api.release_databases()
def _handle_page_closing(self, event): # Veto the event, page deletion is managed explicitly later event.Veto() if core_api.block_databases(): self.GetCurrentPage().close_tab() core_api.release_databases()
def dismiss_all(self, event): if core_api.block_databases(): organism_alarms_api.dismiss_alarms( self._get_shown_alarms_dictionary()) # Let the alarm off event close the alarms core_api.release_databases()
def create_sibling(self): if core_api.block_databases(): # Do not use none=False in order to allow the creation of the # first item selection = self.get_selections(many=False) # If multiple items are selected, selection will be False if selection is not False: text = 'New item' if len(selection) > 0: previd = self.get_item_id(selection[0]) parid = core_api.get_item_parent(self.filename, previd) id_ = core_api.create_sibling(filename=self.filename, parent=parid, previous=previd, text=text, description='Insert item') else: id_ = core_api.create_child(filename=self.filename, parent=0, text=text, description='Insert item') self.select_item(id_) self.dbhistory.refresh() core_api.release_databases()
def paste_items_as_siblings(self, no_confirm=False): if core_api.block_databases(): if no_confirm or copypaste_api.can_paste_safely(self.filename) or \ msgboxes.unsafe_paste_confirm().ShowModal() == wx.ID_OK: # Do not use none=False in order to allow pasting in an empty # database selection = wxgui_api.get_tree_selections(self.filename, many=False) # If multiple items are selected, selection will be False if selection is not False: if len(selection) > 0: baseid = wxgui_api.get_tree_item_id( self.filename, selection[0]) roots, ids = copypaste_api.paste_items_as_siblings( self.filename, baseid, description='Paste items') else: roots, ids = copypaste_api.paste_items_as_children( self.filename, 0, description='Paste items') wxgui_api.refresh_history(self.filename) items_pasted_event.signal(filename=self.filename, roots=roots, ids=ids) core_api.release_databases()
def move_item_to_parent(self): if core_api.block_databases(): selection = self.get_selections(none=False, many=False) if selection: item = selection[0] id_ = self.get_item_id(item) oldpid = core_api.get_item_parent(self.filename, id_) if core_api.move_item_to_parent(self.filename, id_, description='Move item to parent'): newpid = core_api.get_item_parent(self.filename, id_) # oldpid cannot be 0 here because # core_api.move_item_to_parent succeded, which means that # it wasn't the root item oldparent = self.get_tree_item(oldpid) newparent = self.get_tree_item_safe(newpid) self.dvmodel.ItemDeleted(oldparent, item) self.dvmodel.ItemAdded(newparent, item) self._reset_children(id_, item) self._refresh_item_arrow(newparent, oldpid, oldparent) self.select_item(id_) self.dbhistory.refresh() core_api.release_databases()
def cut_items(self, no_confirm=False): if core_api.block_databases(): # get_tree_selections() arguments must be compatible with the # ones used in self.delete_items() selection = wxgui_api.get_tree_selections(self.filename, none=False, descendants=True) if selection: items = [] for item in selection: id_ = wxgui_api.get_tree_item_id(self.filename, item) if not wxgui_api.close_editor( self.filename, id_, ask='quiet' if no_confirm else 'discard'): core_api.release_databases() return False items.append(id_) copypaste_api.copy_items(self.filename, items) wxgui_api.delete_items(self.filename, items, description='Cut {} items'.format( len(items))) wxgui_api.refresh_history(self.filename) cut_items_event.signal() core_api.release_databases()
def paste_items_as_siblings(self, no_confirm=False): if core_api.block_databases(): if no_confirm or copypaste_api.can_paste_safely(self.filename) or \ msgboxes.unsafe_paste_confirm().ShowModal() == wx.ID_OK: # Do not use none=False in order to allow pasting in an empty # database selection = wxgui_api.get_tree_selections(self.filename, many=False) # If multiple items are selected, selection will be False if selection is not False: if len(selection) > 0: baseid = wxgui_api.get_tree_item_id(self.filename, selection[0]) roots, ids = copypaste_api.paste_items_as_siblings( self.filename, baseid, description='Paste items') else: roots, ids = copypaste_api.paste_items_as_children( self.filename, 0, description='Paste items') wxgui_api.refresh_history(self.filename) items_pasted_event.signal(filename=self.filename, roots=roots, ids=ids) core_api.release_databases()
def delete_selected_items(self, no_confirm=False): if core_api.block_databases(): selection = self.get_selections(none=False, descendants=True) if selection: items = [] for item in selection: id_ = self.get_item_id(item) tab = editor.Editor.make_tabid(self.filename, id_) if tab in editor.tabs and not editor.tabs[tab].close( 'quiet' if no_confirm else 'discard'): core_api.release_databases() return False items.append(id_) self.delete_items(items, description='Delete {} items'.format( len(items))) self.dbhistory.refresh() delete_items_event.signal() core_api.release_databases()
def snooze_all(self, event): if core_api.block_databases(): organism_alarms_api.snooze_alarms( self._get_shown_alarms_dictionary(), stime=self.get_snooze_time()) # Let the alarm off event close the alarms core_api.release_databases()
def _handle_page_closing(self, event): # Veto the event, page deletion is managed explicitly later event.Veto() if core_api.block_databases(): page = self.GetCurrentPage() databases.close_database(page.get_filename()) core_api.release_databases()
def redo_database_history(): if _select_database(): log.debug('Simulate redo history') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_redo_tree(no_confirm=True) else: # Databases are blocked in simulator._do_action core_api.release_databases() return False
def populate_tree(self, event): if core_api.block_databases(): filename = wxgui_api.get_selected_database_filename() # This method may be launched even if no database is open if filename: group = core_api.get_next_history_group(filename) description = 'Populate tree' i = 0 while i < 10: dbitems = core_api.get_items_ids(filename) try: itemid = random.choice(dbitems) except IndexError: # No items in the database yet itemid = 0 mode = 'child' else: mode = random.choice(('child', 'sibling')) # See the comment in wxgui.tree.expand_item_ancestors # for the reason why calling this method is necessary wxgui_api.expand_item_ancestors(filename, itemid) text = self._populate_tree_text() id_ = self._populate_tree_item(mode, filename, itemid, group, text, description) # It should also be checked if the database supports # organism_basicrules (bug #330) if organism_api and wxscheduler_basicrules_api and \ filename in \ organism_api.get_supported_open_databases(): self._populate_tree_rules(filename, id_, group, description) if links_api and wxlinks_api and len(dbitems) > 0 and \ filename in \ links_api.get_supported_open_databases(): self._populate_tree_link(filename, id_, dbitems, group, description) i += 1 wxgui_api.refresh_history(filename) core_api.release_databases()
def create_child(self): if core_api.block_databases(): selection = self.get_selections(none=False, many=False) if selection: pid = self.get_item_id(selection[0]) id_ = core_api.create_child(filename=self.filename, parent=pid, text='New item', description='Insert sub-item') self.select_item(id_) self.dbhistory.refresh() core_api.release_databases()
def move_item_down(self): if core_api.block_databases(): selection = self.get_selections(none=False, many=False) if selection: item = selection[0] id_ = self.get_item_id(item) if core_api.move_item_down(self.filename, id_, description='Move item down'): self._move_item(id_, item) self.select_item(id_) self.dbhistory.refresh() core_api.release_databases()
def copy_items(self): if core_api.block_databases(): # get_tree_selections() arguments must be compatible with the # ones used in self.delete_items() selection = wxgui_api.get_tree_selections(self.filename, none=False, descendants=True) if selection: items = [] for item in selection: items.append(wxgui_api.get_tree_item_id(self.filename, item)) copypaste_api.copy_items(self.filename, items) core_api.release_databases()
def redo(self, no_confirm=False): if core_api.block_databases(): read = core_api.preview_redo_tree(self.filename) if read: for id_ in read: item = editor.Editor.make_tabid(self.filename, id_) if item in editor.tabs and not editor.tabs[item].close( ask='quiet' if no_confirm else 'discard'): break else: core_api.redo_tree(self.filename) self.dbhistory.refresh() redo_tree_event.signal(filename=self.filename) core_api.release_databases()
def edit_editor_text(): if _select_editor(): text = '' words = ('the quick brown fox jumps over the lazy dog ' * 6).split() seps = ' ' * 6 + '\n' for x in xrange(random.randint(10, 100)): words.append(str(random.randint(0, 100))) text = ''.join((text, random.choice(words), random.choice(seps))) text = ''.join((text, random.choice(words))).capitalize() log.debug('Simulate replace editor text') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_replace_editor_text(text) else: # Databases are blocked in simulator._do_action core_api.release_databases() return False
def paste_items_as_children(self, no_confirm=False): if core_api.block_databases(): selection = wxgui_api.get_tree_selections(self.filename, none=False, many=False) if selection and ( no_confirm or copypaste_api.can_paste_safely(self.filename) or msgboxes.unsafe_paste_confirm().ShowModal() == wx.ID_OK ): baseid = wxgui_api.get_tree_item_id(self.filename, selection[0]) roots, ids = copypaste_api.paste_items_as_children(self.filename, baseid, description="Paste sub-items") wxgui_api.refresh_history(self.filename) items_pasted_event.signal(filename=self.filename, roots=roots, ids=ids) core_api.release_databases()
def copy_items(self): if core_api.block_databases(): # get_tree_selections() arguments must be compatible with the # ones used in self.delete_items() selection = wxgui_api.get_tree_selections(self.filename, none=False, descendants=True) if selection: items = [] for item in selection: items.append( wxgui_api.get_tree_item_id(self.filename, item)) copypaste_api.copy_items(self.filename, items) core_api.release_databases()
def _finish_search_restart(self): self._set_tab_icon_ongoing() string = self.filters.text.GetValue() self._set_title(string) if not self.filters.option4.GetValue(): string = re.escape(string) self.results.reset() self.search_threaded_action = self._search_threaded_continue self.finish_search_action = self._finish_search_dummy flags = re.MULTILINE if not self.filters.option5.GetValue(): flags |= re.IGNORECASE try: regexp = re.compile(string, flags) except re.error: msgboxes.bad_regular_expression().ShowModal() self.finish_search() else: # Note that the databases are released *before* the threads are # terminated: this is safe as no more calls to the databases are # made after core_api.get_all_items_text in # self._finish_search_restart_database if core_api.block_databases(): if self.filters.option1.GetValue(): filename = wxgui_api.get_selected_database_filename() self._finish_search_restart_database(filename, regexp) else: for filename in core_api.get_open_databases(): self._finish_search_restart_database(filename, regexp) # Note that the databases are released *before* the threads are # terminated: this is safe as no more calls to the databases # are made after core_api.get_all_items_text in # self._finish_search_restart_database core_api.release_databases() else: self.finish_search()
def open_database(): testfilesd = coreaux_api.get_plugin_configuration('wxdevelopment')( 'TestFiles') testfiles = [os.path.expanduser(testfilesd[key]) for key in testfilesd] random.shuffle(testfiles) while testfiles: filename = testfiles.pop() if not core_api.is_database_open(filename) and \ os.path.isfile(filename): log.debug('Simulate open database') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_open_database(filename) break else: # Databases are blocked in simulator._do_action core_api.release_databases() return False
def paste_items_as_children(self, no_confirm=False): if core_api.block_databases(): selection = wxgui_api.get_tree_selections(self.filename, none=False, many=False) if selection and (no_confirm or copypaste_api.can_paste_safely(self.filename) or msgboxes.unsafe_paste_confirm().ShowModal() == wx.ID_OK): baseid = wxgui_api.get_tree_item_id(self.filename, selection[0]) roots, ids = copypaste_api.paste_items_as_children( self.filename, baseid, description='Paste sub-items') wxgui_api.refresh_history(self.filename) items_pasted_event.signal(filename=self.filename, roots=roots, ids=ids) core_api.release_databases()
def create_database(): testfilesd = coreaux_api.get_plugin_configuration('wxdevelopment')( 'TestFiles') testfiles = [os.path.expanduser(testfilesd[key]) for key in testfilesd] random.shuffle(testfiles) while testfiles: filename = testfiles.pop() if not core_api.is_database_open(filename): try: os.remove(filename) except OSError: # filename doesn't exist yet pass log.debug('Simulate create database') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_create_database(filename) break else: # Databases are blocked in simulator._do_action core_api.release_databases() return False
def delete_selected_items(self, no_confirm=False): if core_api.block_databases(): selection = self.get_selections(none=False, descendants=True) if selection: items = [] for item in selection: id_ = self.get_item_id(item) tab = editor.Editor.make_tabid(self.filename, id_) if tab in editor.tabs and not editor.tabs[tab].close( 'quiet' if no_confirm else 'discard'): core_api.release_databases() return False items.append(id_) self.delete_items(items, description='Delete {} items'.format(len(items))) self.dbhistory.refresh() delete_items_event.signal() core_api.release_databases()
def delete_items(): if _select_database(): if _select_items(True): log.debug('Simulate delete items') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_delete_items(no_confirm=True) else: # Databases are blocked in simulator._do_action core_api.release_databases() return False else: # Databases are blocked in simulator._do_action core_api.release_databases() return False
def edit_item(): if _select_database(): if _select_items(False): log.debug('Simulate edit item') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_edit_item() else: # Databases are blocked in simulator._do_action core_api.release_databases() return False else: # Databases are blocked in simulator._do_action core_api.release_databases() return False
def copy_items(): if wxcopypaste_api and _select_database(): if _select_items(True): log.debug('Simulate copy items') # Databases are blocked in simulator._do_action core_api.release_databases() wxcopypaste_api.simulate_copy_items() else: # Databases are blocked in simulator._do_action core_api.release_databases() return False else: # Databases are blocked in simulator._do_action core_api.release_databases() return False
def apply_editor(): if _select_editor(): if random.randint(0, 9) < 9: log.debug('Simulate apply editor') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_apply_editor() else: log.debug('Simulate apply all editors') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_apply_all_editors() else: # Databases are blocked in simulator._do_action core_api.release_databases() return False
def save_database(): if _select_database(): if random.randint(0, 9) < 9: log.debug('Simulate save database') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_save_database() else: log.debug('Simulate save all databases') # Databases are blocked in simulator._do_action core_api.release_databases() wxgui_api.simulate_save_all_databases() else: # Databases are blocked in simulator._do_action core_api.release_databases() return False