DnD skeleton for bouquets list

This commit is contained in:
DYefremov
2018-09-19 11:46:41 +03:00
parent 27bdac7b4f
commit 49605b87f9
3 changed files with 77 additions and 47 deletions

View File

@@ -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:

View File

@@ -1365,7 +1365,7 @@ Author: Dmitriy Yefremov
<property name="enable_grid_lines">both</property>
<property name="activate_on_single_click">True</property>
<signal name="button-press-event" handler="on_view_popup_menu" object="services_popup_menu" swapped="no"/>
<signal name="drag-data-get" handler="on_services_tree_view_drag_data_get" swapped="no"/>
<signal name="drag-data-get" handler="on_view_drag_data_get" swapped="no"/>
<signal name="focus-in-event" handler="on_view_focus" swapped="no"/>
<signal name="key-press-event" handler="on_tree_view_key_press" swapped="no"/>
<signal name="key-release-event" handler="on_tree_view_key_release" swapped="no"/>
@@ -1994,8 +1994,8 @@ Author: Dmitriy Yefremov
<property name="enable_grid_lines">both</property>
<property name="activate_on_single_click">True</property>
<signal name="button-press-event" handler="on_fav_press" object="fav_popup_menu" swapped="no"/>
<signal name="drag-data-get" handler="on_fav_tree_view_drag_data_get" swapped="no"/>
<signal name="drag-data-received" handler="on_fav_tree_view_drag_data_received" swapped="no"/>
<signal name="drag-data-get" handler="on_view_drag_data_get" swapped="no"/>
<signal name="drag-data-received" handler="on_view_drag_data_received" swapped="no"/>
<signal name="focus-in-event" handler="on_view_focus" swapped="no"/>
<signal name="key-press-event" handler="on_tree_view_key_press" swapped="no"/>
<signal name="key-release-event" handler="on_tree_view_key_release" swapped="no"/>
@@ -2238,6 +2238,8 @@ Author: Dmitriy Yefremov
<property name="enable_tree_lines">True</property>
<property name="activate_on_single_click">True</property>
<signal name="button-press-event" handler="on_view_popup_menu" object="bouquets_popup_menu" swapped="no"/>
<signal name="drag-data-get" handler="on_view_drag_data_get" swapped="no"/>
<signal name="drag-data-received" handler="on_bq_view_drag_data_received" swapped="no"/>
<signal name="focus-in-event" handler="on_view_focus" swapped="no"/>
<signal name="key-press-event" handler="on_tree_view_key_press" swapped="no"/>
<signal name="key-release-event" handler="on_tree_view_key_release" swapped="no"/>

View File

@@ -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)