def file_paths_to_rows(self, paths): result = [] for path in paths: bean = get_bean_from_file(path) beans = update_id3_for_m3u([bean]) beans = update_id3_for_pls(beans) if beans and (len(beans) > 1 or is_playlist(bean.path)): bean = bean.add_text(_('Playlist: ') + bean.text).add_font("bold").add_is_file(False) bean.path = '' beans.insert(0, bean) for bean in beans: result.append(self.get_row_from_bean(bean)) return result
def on_drag_data_received(self, treeview, context, x, y, selection, info, timestamp): logging.debug('Playlist on_drag_data_received') model = self.get_model().get_model() drop_info = self.get_dest_row_at_pos(x, y) if drop_info: path, position = drop_info iter = model.get_iter(path) files = sorted([file for file in get_files_from_gtk_selection_data(selection) if os.path.isdir(file) or get_file_extension(file) in FC().all_support_formats], key=lambda x: x[self.text[0]]) if files: '''dnd from the outside of the player''' if self.is_empty(): if len(files) == 1 and os.path.isdir(files[0]): tabname = os.path.basename(files[0]) else: tabname = os.path.split(os.path.dirname(files[0]))[1] self.controls.notetabs.rename_tab(self.scroll, tabname) for i, file in enumerate(files): if os.path.isdir(file): sorted_dirs = [] sorted_files = [] for f in sorted(os.listdir(file), key=lambda x: x): f = os.path.join(file, f) if os.path.isdir(f): sorted_dirs.append(f) elif get_file_extension(f) in FC().all_support_formats: sorted_files.append(f) listdir = sorted_dirs + sorted_files ''' listdir = sorted(filter(lambda x: get_file_extension(x) in FC().all_support_formats or os.path.isdir(x), [os.path.join(file, f) for f in os.listdir(file)]), key=lambda x: x) ''' for k, path in enumerate(listdir): files.insert(i + k + 1, path) rows = self.file_paths_to_rows(files) if not rows: return rows = self.playlist_filter(rows) for row in rows: if drop_info: if (position == Gtk.TREE_VIEW_DROP_BEFORE or position == Gtk.TREE_VIEW_DROP_INTO_OR_BEFORE): model.insert_before(None, iter, row) else: model.insert_after(None, iter, row) iter = model.iter_next(iter) else: model.append(None, row) else: '''dnd inside the player''' # ff - from_filter ff_tree = Gtk.drag_get_source_widget(context) ff_model, ff_paths = ff_tree.get_selection().get_selected_rows() treerows = [ff_model[ff_path] for ff_path in ff_paths] if self is ff_tree: '''internal dnd''' ff_row_refs = [Gtk.TreeRowReference.new(ff_model, ff_path) for ff_path in ff_paths] for ff_row_ref in ff_row_refs: ff_iter = self.get_iter_from_row_reference(ff_row_ref) f_iter = ff_model.convert_iter_to_child_iter(ff_iter) if drop_info: if (position == Gtk.TREE_VIEW_DROP_BEFORE or position == Gtk.TREE_VIEW_DROP_INTO_OR_BEFORE): model.move_before(f_iter, iter) else: model.move_after(f_iter, iter) iter = model.iter_next(iter) else: model.move_before(f_iter, None) return else: '''dnd from other tree''' if self.is_empty(): path = treerows[0][self.path[0]] if path: if len(treerows) == 1 and os.path.isdir(path): tabname = os.path.basename(path) else: tabname = os.path.split(os.path.dirname(path))[1] self.controls.notetabs.rename_tab(self.scroll, tabname) else: pass for i, treerow in enumerate(treerows): for k, ch_row in enumerate(treerow.iterchildren()): treerows.insert(i + k + 1, ch_row) #treerows = self.playlist_filter(treerows) for i, treerow in enumerate(treerows): if is_playlist(treerow[self.path[0]]): rows = self.file_paths_to_rows([treerow[self.path[0]]]) if rows: rows.reverse() map(lambda row: treerows.insert(i + 1, row), rows) continue row = [col for col in treerow] if drop_info: if (position == Gtk.TREE_VIEW_DROP_BEFORE or position == Gtk.TREE_VIEW_DROP_INTO_OR_BEFORE): model.insert_before(None, iter, row) else: model.insert_after(None, iter, row) iter = model.iter_next(iter) else: model.append(None, row) thread.start_new_thread(self.safe_fill_treerows, ()) context.finish(True, False, timestamp) self.stop_emission('drag-data-received') return True