diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py index 27e945b2..2dc9a9f1 100644 --- a/app/ui/main_app_window.py +++ b/app/ui/main_app_window.py @@ -94,9 +94,9 @@ class MainAppWindow: "on_delete": self.on_delete, "on_tool_edit": self.on_tool_edit, "on_to_fav_move": self.on_to_fav_move, - "on_services_tree_view_drag_data_get": self.on_services_tree_view_drag_data_get, - "on_fav_tree_view_drag_data_get": self.on_fav_tree_view_drag_data_get, - "on_fav_tree_view_drag_data_received": self.on_fav_tree_view_drag_data_received, + "on_view_drag_data_get": self.on_view_drag_data_get, + "on_view_drag_data_received": self.on_view_drag_data_received, + "on_bq_view_drag_data_received": self.on_bq_view_drag_data_received, "on_view_popup_menu": self.on_view_popup_menu, "on_popover_release": self.on_popover_release, "on_view_focus": self.on_view_focus, @@ -171,7 +171,6 @@ class MainAppWindow: self._fav_model = builder.get_object("fav_list_store") self._services_model = builder.get_object("services_list_store") self._bouquets_model = builder.get_object("bouquets_tree_store") - self._status_bar = builder.get_object("status_bar") self._main_window_box = builder.get_object("main_window_box") self._player_drawing_area = builder.get_object("player_drawing_area") self._player_box = builder.get_object("player_box") @@ -217,18 +216,26 @@ class MainAppWindow: self._main_window.show() def init_drag_and_drop(self): - """ Enable drag and drop """ + """ Enable drag-and-drop """ target = [] + bq_target = [] self._services_view.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, target, Gdk.DragAction.COPY) self._fav_view.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, target, Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE) self._fav_view.enable_model_drag_dest(target, Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE) + self._bouquets_view.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, bq_target, + Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE) + self._bouquets_view.enable_model_drag_dest(bq_target, Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE) self._fav_view.drag_dest_set_target_list(None) self._fav_view.drag_source_set_target_list(None) self._fav_view.drag_dest_add_text_targets() self._fav_view.drag_source_add_text_targets() self._services_view.drag_source_set_target_list(None) self._services_view.drag_source_add_text_targets() + self._bouquets_view.drag_dest_set_target_list(None) + self._bouquets_view.drag_source_set_target_list(None) + self._bouquets_view.drag_dest_add_text_targets() + self._bouquets_view.drag_source_add_text_targets() def force_ctrl(self, view, event): """ Function for force ctrl press event for view """ @@ -437,6 +444,49 @@ class MainAppWindow: if selection: self.receive_selection(view=self._fav_view, drop_info=None, data=selection) + def update_fav_num_column(self, model): + """ Iterate through model and updates values for Num column """ + model.foreach(lambda store, pth, itr: store.set_value(itr, 0, int(pth[0]) + 1)) # iter , column, value + + def update_bouquet_list(self): + """ Update bouquet after move items """ + bq_selected = self.get_selected_bouquet() + if bq_selected: + fav_bouquet = self._bouquets[bq_selected] + fav_bouquet.clear() + for row in self._fav_model: + fav_bouquet.append(row[7]) + + # ***************** Drag-and-drop *********************# + + def on_view_drag_data_get(self, view, drag_context, data, info, time): + data.set_text(self.get_selection(view), -1) + + def on_view_drag_data_received(self, view, drag_context, x, y, data, info, time): + self.receive_selection(view=view, drop_info=view.get_dest_row_at_pos(x, y), data=data.get_text()) + + def on_bq_view_drag_data_received(self, view, drag_context, x, y, data, info, time): + model = get_base_model(view.get_model()) + drop_info = view.get_dest_row_at_pos(x, y) + data = data.get_text() + itr_str, sep, source = data.partition("::::") + if source != self._BOUQUETS_LIST_NAME: + return + + if drop_info: + path, position = drop_info + itrs = [model.get_iter_from_string(itr) for itr in itr_str.split(",")] + top_iter = model.get_iter(path) + if model.iter_n_children(top_iter): # parent + pass + # for index, itr in enumerate(itrs): + # ch_itr = model.insert(top_iter, index, rows[index]) + # print("PARENT") + # ch_itr = model.insert(itr, 0, bq) + # scroll_to(model.get_path(ch_itr), view, paths) + else: + list(map(lambda itr: model.move_before(itr, top_iter), itrs)) + def get_selection(self, view): """ Creates a string from the iterators of the selected rows """ model, paths = view.get_selection().get_selected_rows() @@ -444,28 +494,29 @@ class MainAppWindow: if len(paths) > 0: itrs = [model.get_iter(path) for path in paths] - return "{}:{}".format(",".join([model.get_string_from_iter(itr) for itr in itrs]), model.get_name()) + return "{}::::{}".format(",".join([model.get_string_from_iter(itr) for itr in itrs]), model.get_name()) def receive_selection(self, *, view, drop_info, data): """ Update fav view after data received """ - bq_selected = self.check_bouquet_selection() - if not bq_selected: - return - model = get_base_model(view.get_model()) dest_index = 0 - if drop_info: path, position = drop_info dest_iter = model.get_iter(path) if dest_iter: dest_index = model.get_value(dest_iter, 0) - itr_str, sep, source = data.partition(":") - itrs = itr_str.split(",") + itr_str, sep, source = data.partition("::::") + if source == self._BOUQUETS_LIST_NAME: + return try: + bq_selected = self.check_bouquet_selection() + if not bq_selected: + return + fav_bouquet = self._bouquets[bq_selected] + itrs = itr_str.split(",") if source == self._SERVICE_LIST_NAME: ext_model = self._services_view.get_model() @@ -490,32 +541,7 @@ class MainAppWindow: model.remove(in_itr) self.update_fav_num_column(model) except ValueError as e: - self._status_bar.push(1, getattr(e, "message", repr(e))) - - def update_fav_num_column(self, model): - """ Iterate through model and updates values for Num column """ - model.foreach(lambda store, pth, itr: store.set_value(itr, 0, int(pth[0]) + 1)) # iter , column, value - - def update_bouquet_list(self): - """ Update bouquet after move items """ - bq_selected = self.get_selected_bouquet() - if bq_selected: - fav_bouquet = self._bouquets[bq_selected] - fav_bouquet.clear() - for row in self._fav_model: - fav_bouquet.append(row[7]) - - def on_services_tree_view_drag_data_get(self, view, drag_context, data, info, time): - """ DnD """ - data.set_text(self.get_selection(view), -1) - - def on_fav_tree_view_drag_data_get(self, view, drag_context, data, info, time): - """ DnD """ - data.set_text(self.get_selection(view), -1) - - def on_fav_tree_view_drag_data_received(self, view, drag_context, x, y, data, info, time): - """ DnD """ - self.receive_selection(view=view, drop_info=view.get_dest_row_at_pos(x, y), data=data.get_text()) + show_dialog(DialogType.ERROR, self._main_window, str(e)) def on_view_popup_menu(self, menu, event): """ Shows popup menu for any view """ @@ -824,7 +850,6 @@ class MainAppWindow: model = get_base_model(view.get_model()) model_name = model.get_name() - if ctrl and key in MOVE_KEYS: self.move_items(key) elif model_name == self._FAV_LIST_NAME and key == Gdk.KEY_Control_L or key == Gdk.KEY_Control_R: diff --git a/app/ui/main_window.glade b/app/ui/main_window.glade index a6bdf94a..6ace35c4 100644 --- a/app/ui/main_window.glade +++ b/app/ui/main_window.glade @@ -1365,7 +1365,7 @@ Author: Dmitriy Yefremov both True - + @@ -1994,8 +1994,8 @@ Author: Dmitriy Yefremov both True - - + + @@ -2238,6 +2238,8 @@ Author: Dmitriy Yefremov True True + + diff --git a/app/ui/picons_downloader.py b/app/ui/picons_downloader.py index c8bcfd19..aef8a27f 100644 --- a/app/ui/picons_downloader.py +++ b/app/ui/picons_downloader.py @@ -208,10 +208,13 @@ class PiconsDialog: self.show_dialog("The task is already running!", DialogType.ERROR) return - upload_data(properties=self._properties, - download_type=DownloadType.PICONS, - profile=self._profile, - callback=lambda: self.show_info_message(get_message("Done!"), Gtk.MessageType.INFO)) + try: + upload_data(properties=self._properties, + download_type=DownloadType.PICONS, + profile=self._profile, + callback=lambda: self.show_info_message(get_message("Done!"), Gtk.MessageType.INFO)) + except OSError as e: + self.show_info_message(str(e), Gtk.MessageType.ERROR) def on_info_bar_close(self, bar=None, resp=None): self._info_bar.set_visible(False)