def task(): logging.debug("radio Lazy loading") if FCache().cache_radio_tree_beans: self.populate_all(FCache().cache_radio_tree_beans) else: self.update_radio_tree() self.is_radio_populated = True
def on_toggle_singletab(widget, data=None): self.tree_controller.clear_tree() for path in FCache().music_paths[0]: self.tree_controller.append( FDModel(os.path.basename(path), path).add_is_file(False)) self.temp_music_paths = FCache().music_paths[0][:] self.frame.show()
def on_add_button_click(self): self._append_tab() self.controls.perspectives.get_perspective('fs').show_add_button() FCache().music_paths.insert(0, []) FCache().tab_names.insert( 0, self.get_full_tab_name(self.get_current_tree().scroll)) FCache().cache_music_tree_beans.insert(0, {})
def load_music_tree(self): self.perspective.hide_add_button() if not FCache().cache_music_tree_beans[0] and len(FCache().cache_music_tree_beans) == 1: self.perspective.show_add_button() self.tree.is_empty = True if FCache().tab_names[0]: self.tabhelper.label.set_label(FCache().tab_names[0] + " ") else: tabs = len(FCache().cache_music_tree_beans) self.tree.simple_append_all(FCache().cache_music_tree_beans[tabs - 1]) self.tabhelper.label.set_label(FCache().tab_names[tabs - 1] + " ") for tab in xrange(tabs - 2, -1, -1): tree = NavigationTreeControl(self) tree.simple_append_all(FCache().cache_music_tree_beans[tab]) self.tabhelper._append_tab(FCache().tab_names[tab], navig_tree=tree) if not FCache().cache_music_tree_beans[tab]: tree.is_empty = True self.perspective.show_add_button() logging.info("Tree loaded from cache") if FC().update_tree_on_start: def cycle(): for n in xrange(len(FCache().music_paths)): tab_child = self.tabhelper.get_nth_page(n) tree = tab_child.get_child() self.update_music_tree(tree, n) gobject.idle_add(cycle)
def add_folder(self, in_new_tab=False): chooser = Gtk.FileChooserDialog(title=_("Choose directory with music"), action=Gtk.FileChooserAction.SELECT_FOLDER, buttons=(Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) chooser.set_default_response(Gtk.ResponseType.OK) chooser.set_select_multiple(True) if FCache().last_music_path: chooser.set_current_folder(FCache().last_music_path) response = chooser.run() if response == Gtk.ResponseType.OK: paths = chooser.get_filenames() chooser.destroy() self.controls.main_window.present() def task(): tabhelper = self.controls.perspectives.get_perspective('fs').get_tabhelper() path = paths[0] FCache().last_music_path = path[:path.rfind("/")] tree = self number_of_tab = tabhelper.page_num(tree.scroll) if in_new_tab: tab_name = unicode(path[path.rfind("/") + 1:]) tabhelper._append_tab(tab_name) tree = tabhelper.get_current_tree() number_of_tab = tabhelper.get_current_page() FCache().music_paths.insert(0, []) FCache().tab_names.insert(0, tab_name) FCache().cache_music_tree_beans.insert(0, {}) elif tree.is_empty(): tab_name = unicode(path[path.rfind("/") + 1:]) vbox = Gtk.VBox() label = Gtk.Label(tab_name + " ") label.set_angle(90) if FC().tab_close_element: vbox.pack_start(tabhelper.button(tree.scroll), False, False) vbox.pack_end(label, False, False) event = self.controls.notetabs.to_eventbox(vbox, tree) event = tabhelper.tab_menu_creator(event, tree.scroll) event.connect("button-press-event", tabhelper.on_button_press) tabhelper.set_tab_label(tree.scroll, event) FCache().tab_names[number_of_tab] = tab_name FCache().music_paths[number_of_tab] = [] for path in paths: if path in FCache().music_paths[number_of_tab]: pass else: FCache().music_paths[number_of_tab].append(path) #self.controls.preferences.on_load() logging.info("New music paths" + str(FCache().music_paths[number_of_tab])) self.controls.update_music_tree(tree, number_of_tab) #self.controls.in_thread.run_with_progressbar(task, with_lock=False) self.controls.search_progress.background_spinner_wrapper(task) elif response == Gtk.ResponseType.CANCEL: logging.info('Closed, no files selected') chooser.destroy()
def save_tabs(self): number_music_tabs = self.get_n_pages() FCache().cache_pl_tab_contents = [] FCache().tab_pl_names = [] if number_music_tabs > 0: for tab_number in range(self.get_n_pages()): self.save_nth_tab(tab_number)
def show_album_title(self, bean=None): if not bean: bean = self.bean if bean.UUID != self.bean.UUID: return """update info album and year""" info_line = bean.artist if bean.text in FCache().album_titles: info_line = FCache().album_titles[bean.text] else: album_name = self.controls.lastfm_service.get_album_name( bean.artist, bean.title) album_year = self.controls.lastfm_service.get_album_year( bean.artist, bean.title) if album_name: info_line = album_name if album_name and album_year: info_line = album_name + " (" + album_year + ")" if isinstance(info_line, str): FCache().album_titles[bean.text] = info_line if info_line and bean.UUID == self.bean.UUID: info_line = info_line.replace('&', '&') GLib.idle_add(self.album_label.set_markup, "<b>%s</b>" % info_line) GLib.idle_add(self.controls.coverlyrics.album_title.set_markup, "<b>%s</b>" % info_line)
def update_music_tree(self, tree=None, number_of_page=0): if not tree: tree = self.tree logging.info("Update music tree" + str(FCache().music_paths[number_of_page])) tree.clear_tree() FCache().cache_music_tree_beans[number_of_page] = [] all = [] all = get_all_music_by_paths(FCache().music_paths[number_of_page], self) for bean in all: FCache().cache_music_tree_beans[number_of_page].append(bean) try: self.perspective.hide_add_button() except AttributeError: logging.warn("Object perspective not exists yet") if not all: tree.is_empty = True try: self.perspective.show_add_button() except AttributeError: logging.warn("Object perspective not exists yet") all.append(FModel(_("Music not found in folder(s):"))) for path in FCache().music_paths[number_of_page]: all.append(FModel(path).add_is_file(True)) else: tree.is_empty = False tree.append_all(all) tree.ext_width = tree.ext_column.get_width()
def on_delete_tab(self, child): n = self.page_num(child) if self.get_n_pages() == 1: return self.remove_page(n) if self.navig: del FCache().tab_names[n] del FCache().music_paths[n] del FCache().cache_music_tree_beans[n]
def lazy_load(self): if not self.is_lazy_load: logging.debug("radio Lazy loading") self.populate_all(FCache().cache_radio_tree_beans) if not FCache().cache_radio_tree_beans: logging.debug("populdate from file system") self.update_radio_tree() self.is_lazy_load = True
def add_dir(self, *a): current_folder = FCache().last_music_path if FCache().last_music_path else None paths = directory_chooser_dialog(_("Choose directory with music"), current_folder) if not paths: return path = paths[0] FCache().last_music_path = path[:path.rfind("/")] for path in paths: if path not in self.temp_music_paths: self.tree_controller.append(FDModel(os.path.basename(path), path).add_is_file(False)) self.temp_music_paths.append(path)
def save_nth_tab(self, tab_number): tab = self.get_nth_page(tab_number) pl_tree = tab.get_child() FCache().cache_pl_tab_contents.append( [list(row) for row in pl_tree.model]) FCache().tab_pl_names.append(self.get_full_tab_name(tab)) for i, column in enumerate(pl_tree.get_columns()): FC().columns[column.key][1] = i if column.get_width( ) > 1: #to avoid recording of zero width in config FC().columns[column.key][2] = column.get_width()
def reorder_callback(self, notebook, child, new_page_num): for list in [ FCache().music_paths, FCache().tab_names, FCache().cache_music_tree_beans ]: reorderer_list( list, new_page_num, self.page_number, )
def save_beans_from_tree(self): number_of_page = self.controls.notetabs.page_num(self.scroll) FCache().cache_music_tree_beans[number_of_page] = [] for row in self.model: def task(row): for child_row in row.iterchildren(): bean = self.get_bean_from_row(child_row) FCache().cache_music_tree_beans[number_of_page].append(bean) if child_row.iterchildren(): task(child_row) bean = self.get_bean_from_row(row) FCache().cache_music_tree_beans[number_of_page].append(bean) if row.iterchildren(): task(row)
def task(row): for child_row in row.iterchildren(): bean = self.get_bean_from_row(child_row) FCache().cache_music_tree_beans[number_of_page].append( bean) if child_row.iterchildren(): task(child_row)
def get_dest_folder(self, to_f_model, to_filter_iter, to_filter_path): if to_filter_iter: path = to_f_model.get_value(to_filter_iter, self.path[0]) if os.path.isdir(path): return path parent_iter = to_f_model.iter_parent(to_filter_iter) else: return FCache().music_paths[ self.controls.tabhelper.get_current_page()][-1] if not parent_iter: logging.debug("no parent iter found") if to_filter_path[-1] > 0: previous_iter = to_f_model.get_iter((to_filter_path[-1] - 1, )) previous_path = to_f_model.get_value(previous_iter, self.path[0]) dest_folder = os.path.dirname(previous_path) else: logging.debug("item is top in tree") next_path = to_f_model.get_value(to_f_model.get_iter_root(), self.path[0]) dest_folder = os.path.dirname(next_path) else: dest_folder = to_f_model.get_value(parent_iter, self.path[0]) return dest_folder
def remove_dir(self, *a): selection = self.tree_controller.get_selection() fm, paths = selection.get_selected_rows() #@UnusedVariable paths.reverse() for path in paths: del FCache().music_paths[0][path[0]] del FCache().cache_music_tree_beans[0][path[0]] self.tree_controller.delete_selected() remaining_beans = self.tree_controller.get_all_beans() if remaining_beans: self.temp_music_paths = [ bean.path for bean in self.tree_controller.get_all_beans() ] else: self.temp_music_paths = []
def on_quit(self): number_music_tabs = self.get_n_pages() - 1 FCache().cache_pl_tab_contents = [] FCache().tab_pl_names = [] if number_music_tabs > 0: for page in xrange(number_music_tabs, 0, -1): tab_content = self.get_nth_page(page) pl_tree = tab_content.get_child() FCache().cache_pl_tab_contents.append( [list(row) for row in pl_tree.model]) FCache().tab_pl_names.append( self.get_text_label_from_tab(tab_content)) for i, column in enumerate(pl_tree.get_columns()): FC().columns[column.key][1] = i if column.get_width( ) > 1: #to avoid recording of zero width in config FC().columns[column.key][2] = column.get_width()
def task(): self.save_lock.acquire() try: self.save_tabs() FCache().save() finally: if self.save_lock.locked(): self.save_lock.release()
def on_load(self): self.tree_controller.clear_tree() for path in FCache().music_paths[0]: self.tree_controller.append(FDModel(os.path.basename(path), path).add_is_file(False)) self.files_controller.clear_tree() for ext in FC().all_support_formats: self.files_controller.append(FDModel(ext)) self.adjustment.set_value(FC().gap_secs) if FC().tabs_mode == "Single": self.singletab_button.set_active(True) self.controls.tabhelper.set_show_tabs(False) if FC().update_tree_on_start: self.update_on_start.set_active(True) self.temp_music_paths = FCache().music_paths[0][:] #create copy of list
def task(): self.save_lock.acquire() try: tab_number = self.get_current_page() tab = self.get_nth_page(tab_number) pl_tree = tab.get_child() FCache().cache_pl_tab_contents[tab_number] = [ list(row) for row in pl_tree.model ] FCache().tab_pl_names[tab_number] = self.get_full_tab_name(tab) for i, column in enumerate(pl_tree.get_columns()): FC().columns[column.key][1] = i if column.get_width( ) > 1: #to avoid recording of zero width in config FC().columns[column.key][2] = column.get_width() FCache().save() finally: if self.save_lock.locked(): self.save_lock.release()
def delete_files(self, a): row_refs, paths, get_iter_from_row_reference = a copy_paths = paths[:] if delete_files_from_disk(row_refs, paths, get_iter_from_row_reference): beans = FCache().cache_music_tree_beans[ self.controls.tabhelper.get_current_page()] for bean in beans[:]: if bean.path in copy_paths: beans.remove(bean)
def on_save(self): FCache().music_paths[0] = self.tree_controller.get_all_beans_text() FC().all_support_formats = self.files_controller.get_all_beans_text() FC().gap_secs = self.adjustment.get_value() if self.singletab_button.get_active(): for i in xrange(len(FCache().music_paths) - 1, 0, -1): del FCache().music_paths[i] del FCache().cache_music_tree_beans[i] del FCache().tab_names[i] self.controls.tabhelper.remove_page(i) FC().tabs_mode = "Single" self.controls.tabhelper.set_show_tabs(False) else: FC().tabs_mode = "Multi" self.controls.tabhelper.set_show_tabs(True) if self.update_on_start.get_active(): FC().update_tree_on_start = True else: FC().update_tree_on_start = False
def on_load(self): if FC().tab_position == "no": self.set_tab_no() elif FC().tab_position == "left": self.set_tab_left() else: self.set_tab_top() for page in range(len(FCache().cache_pl_tab_contents) - 1, -1, -1): if not FCache().cache_pl_tab_contents[page]: self._append_tab(FCache().tab_pl_names[page]) continue self._append_tab(FCache().tab_pl_names[page]) for row in FCache().cache_pl_tab_contents[page]: self.get_current_tree().model.append( None, FTreeModel.normalize_row(row)) self.set_current_page(FC().pl_selected_tab) self.loaded = True
def rename_files(self, a): row, index_path, index_text = a if rename_file_on_disk(row, index_path, index_text): old_bean = self.get_selected_bean() beans = FCache().cache_music_tree_beans[ self.controls.tabhelper.get_current_page()] for bean in beans: if old_bean == bean: bean.path = row[index_path] bean.text = row[index_text] break
def load_music_tree(self): tabs = len(FCache().cache_music_tree_beans) tabhelper = self.perspectives.get_perspective('fs').get_tabhelper() for tab in xrange(tabs - 1, -1, -1): tabhelper._append_tab(FCache().tab_names[tab], rows=FCache().cache_music_tree_beans[tab]) if not FCache().cache_music_tree_beans[tab]: self.perspectives.get_perspective('fs').show_add_button() else: self.perspectives.get_perspective('fs').hide_add_button() logging.info("Tree loaded from cache") if FC().update_tree_on_start: def cycle(): for n in xrange(len(FCache().music_paths)): tab_child = tabhelper.get_nth_page(n) tree = tab_child.get_child() self.update_music_tree(tree, n) GLib.idle_add(cycle)
def show_album_title(self): bean = self.bean """update info album and year""" info_line = bean.artist if FCache().album_titles.has_key(bean.text): info_line = FCache().album_titles[bean.text] else: album_name = self.controls.lastfm_service.get_album_name(bean.artist, bean.title) album_year = self.controls.lastfm_service.get_album_year(bean.artist, bean.title) if album_name: info_line = album_name if album_name and album_year: info_line = album_name + "(" + album_year + ")" if isinstance(info_line, unicode) or isinstance(info_line, str) : FCache().album_titles[bean.text] = info_line if info_line: info_line = info_line.replace('&', '&') self.album_label.set_markup("<b>%s</b>" % info_line) self.controls.coverlyrics.album_title.set_markup("<b>%s</b>" % info_line)
def add_dir(self, *a): chooser = gtk.FileChooserDialog( title=_("Choose directory with music"), action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, buttons=(gtk.STOCK_OPEN, gtk.RESPONSE_OK)) chooser.set_default_response(gtk.RESPONSE_OK) chooser.set_select_multiple(True) if FCache().last_music_path: chooser.set_current_folder(FCache().last_music_path) response = chooser.run() if response == gtk.RESPONSE_OK: paths = chooser.get_filenames() path = paths[0] FCache().last_music_path = path[:path.rfind("/")] for path in paths: if path not in self.tree_controller.get_all_beans_text(): self.tree_controller.append(FDModel(path)) self.reload_dir() elif response == gtk.RESPONSE_CANCEL: logging.info('Closed, no files selected') chooser.destroy()
def on_load(self): if FC().tab_position == "no": self.set_tab_no() elif FC().tab_position == "left": self.set_tab_left() else: self.set_tab_top() for page in range(len(FCache().cache_pl_tab_contents) - 1, -1, -1): if not FCache().cache_pl_tab_contents[page]: self._append_tab(FCache().tab_pl_names[page]) continue self._append_tab(FCache().tab_pl_names[page]) model_len = len(FTreeModel().__dict__) cache_len = len(FCache().cache_pl_tab_contents[page][0]) for row in FCache().cache_pl_tab_contents[page]: if model_len > cache_len: for i in range(abs(model_len - cache_len)): row.append((None, None)) elif model_len < cache_len: for i in range(abs(model_len - cache_len)): del row[-1] self.get_current_tree().model.append(None, row) self.set_current_page(FC().pl_selected_tab) self.loaded = True
def task(): path = paths[0] FCache().last_music_path = path[:path.rfind("/")] tree = self number_of_tab = self.controls.tabhelper.page_num(tree.scroll) if in_new_tab: tree = NavigationTreeControl(self.controls) tab_name = unicode(path[path.rfind("/") + 1:]) self.controls.tabhelper._append_tab(tab_name, navig_tree=tree) number_of_tab = self.controls.tabhelper.get_current_page() FCache().music_paths.insert(0, []) FCache().tab_names.insert(0, tab_name) FCache().cache_music_tree_beans.insert(0, []) elif tree.is_empty: tab_name = unicode(path[path.rfind("/") + 1:]) vbox = gtk.VBox() label = gtk.Label(tab_name + " ") label.set_angle(90) if FC().tab_close_element: vbox.pack_start( self.controls.tabhelper.button(tree.scroll), False, False) vbox.pack_end(label, False, False) event = self.controls.notetabs.to_eventbox(vbox, tree) event = self.controls.tabhelper.tab_menu_creator( event, tree.scroll) event.connect("button-press-event", self.controls.tabhelper.on_button_press) self.controls.tabhelper.set_tab_label(tree.scroll, event) FCache().tab_names[number_of_tab] = tab_name FCache().music_paths[number_of_tab] = [] for path in paths: if path in FCache().music_paths[number_of_tab]: pass else: FCache().music_paths[number_of_tab].append(path) #self.controls.preferences.on_load() logging.info("New music paths" + str(FCache().music_paths[number_of_tab])) self.controls.update_music_tree(tree, number_of_tab) FC().save()