Skip to content

Commit 2b826ee

Browse files
authored
GUI: add context menu to every tree/list view (nicotine-plus#3513)
Some list/tree views were missing them, mainly in the Preferences dialog.
1 parent 4a9c0f4 commit 2b826ee

File tree

7 files changed

+197
-11
lines changed

7 files changed

+197
-11
lines changed

pynicotine/gtkgui/dialogs/chathistory.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
from pynicotine.gtkgui.widgets import ui
1515
from pynicotine.gtkgui.widgets.accelerator import Accelerator
1616
from pynicotine.gtkgui.widgets.dialogs import Dialog
17+
from pynicotine.gtkgui.widgets.dialogs import OptionDialog
18+
from pynicotine.gtkgui.widgets.popupmenu import PopupMenu
1719
from pynicotine.gtkgui.widgets.theme import USER_STATUS_ICON_NAMES
1820
from pynicotine.gtkgui.widgets.treeview import TreeView
1921
from pynicotine.logfacility import log
@@ -38,6 +40,7 @@ def __init__(self, application):
3840
width=960,
3941
height=700
4042
)
43+
application.add_window(self.widget)
4144

4245
self.list_view = TreeView(
4346
application.window, parent=self.list_container, activate_row_callback=self.on_show_user,
@@ -68,6 +71,13 @@ def __init__(self, application):
6871
}
6972
)
7073

74+
self.popup_menu = PopupMenu(application, self.list_view.widget)
75+
self.popup_menu.add_items(
76+
("#" + _("_Open Chat"), self.on_show_user),
77+
("", None),
78+
("#" + _("Delete Chat Log…"), self.on_delete_chat_log)
79+
)
80+
7181
Accelerator("<Primary>f", self.widget, self.on_search_accelerator)
7282

7383
self.load_users()
@@ -80,7 +90,10 @@ def __init__(self, application):
8090
events.connect(event_name, callback)
8191

8292
def destroy(self):
93+
94+
self.popup_menu.destroy()
8395
self.list_view.destroy()
96+
8497
super().destroy()
8598

8699
def server_login(self, msg):
@@ -235,6 +248,25 @@ def on_show_user(self, *_args):
235248
self.close()
236249
return
237250

251+
def on_delete_chat_log_response(self, _dialog, _response_id, username):
252+
log.delete_log(log.private_chat_folder_path, username)
253+
self.remove_user(username)
254+
255+
def on_delete_chat_log(self, *_args):
256+
257+
for iterator in self.list_view.get_selected_rows():
258+
username = self.list_view.get_row_value(iterator, "user")
259+
260+
OptionDialog(
261+
parent=self.parent,
262+
title=_("Delete Logged Messages?"),
263+
message=_("Do you really want to permanently delete all logged messages for this user?"),
264+
destructive_response_id="ok",
265+
callback=self.on_delete_chat_log_response,
266+
callback_data=username
267+
).present()
268+
return
269+
238270
def on_search_accelerator(self, *_args):
239271
"""Ctrl+F - Search users."""
240272

pynicotine/gtkgui/dialogs/download.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from pynicotine.gtkgui.widgets.dialogs import EntryDialog
1818
from pynicotine.gtkgui.widgets.filechooser import FileChooserButton
1919
from pynicotine.gtkgui.widgets.infobar import InfoBar
20+
from pynicotine.gtkgui.widgets.popupmenu import PopupMenu
2021
from pynicotine.gtkgui.widgets.treeview import TreeView
2122
from pynicotine.utils import human_size
2223
from pynicotine.utils import humanize
@@ -58,6 +59,7 @@ def __init__(self, application):
5859
show_title_buttons=False
5960
)
6061
application.add_window(self.widget)
62+
6163
self.application = application
6264
self.parent_iterators = {}
6365
self.initial_selected_iterators = set()
@@ -117,6 +119,11 @@ def __init__(self, application):
117119
}
118120
)
119121

122+
self.popup_menu = PopupMenu(application, self.tree_view.widget, self.on_popup_menu)
123+
self.popup_menu.add_items(
124+
("#" + _("_Rename…"), self.on_rename)
125+
)
126+
120127
self.expand_button.connect("toggled", self.on_expand_tree)
121128

122129
for event_name, callback in (
@@ -130,6 +137,7 @@ def destroy(self):
130137

131138
self.clear()
132139

140+
self.popup_menu.destroy()
133141
self.download_folder_button.destroy()
134142
self.info_bar.destroy()
135143
self.tree_view.destroy()
@@ -468,6 +476,9 @@ def server_disconnect(self, *_args):
468476
if self.indeterminate_progress:
469477
self.set_failed()
470478

479+
def on_popup_menu(self, menu, _widget):
480+
menu.actions[_("_Rename…")].set_enabled(self.rename_button.get_sensitive())
481+
471482
def on_retry(self, *_args):
472483

473484
self.set_in_progress()

pynicotine/gtkgui/dialogs/fastconfigure.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from pynicotine.gtkgui.widgets.filechooser import FolderChooser
1515
from pynicotine.gtkgui.widgets.dialogs import Dialog
1616
from pynicotine.gtkgui.widgets.dialogs import EntryDialog
17+
from pynicotine.gtkgui.widgets.popupmenu import PopupMenu
1718
from pynicotine.gtkgui.widgets.treeview import TreeView
1819
from pynicotine.slskmessages import UserStatus
1920

@@ -62,6 +63,7 @@ def __init__(self, application):
6263
height=450,
6364
show_title=False
6465
)
66+
application.add_window(self.widget)
6567

6668
icon_name = pynicotine.__application_id__
6769
icon_args = (Gtk.IconSize.BUTTON,) if GTK_API_VERSION == 3 else () # pylint: disable=no-member
@@ -96,10 +98,18 @@ def __init__(self, application):
9698
}
9799
)
98100

101+
self.shares_popup_menu = PopupMenu(application, self.shares_list_view.widget)
102+
self.shares_popup_menu.add_items(
103+
("#" + _("_Edit…"), self.on_edit_shared_folder),
104+
("", None),
105+
("#" + _("Remove"), self.on_remove_shared_folder)
106+
)
107+
99108
self.reset_completeness()
100109

101110
def destroy(self):
102111

112+
self.shares_popup_menu.destroy()
103113
self.download_folder_button.destroy()
104114
self.shares_list_view.destroy()
105115

pynicotine/gtkgui/dialogs/pluginsettings.py

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from pynicotine.gtkgui.widgets.dialogs import Dialog
1212
from pynicotine.gtkgui.widgets.dialogs import EntryDialog
1313
from pynicotine.gtkgui.widgets.filechooser import FileChooserButton
14+
from pynicotine.gtkgui.widgets.popupmenu import PopupMenu
1415
from pynicotine.gtkgui.widgets.textview import TextView
1516
from pynicotine.gtkgui.widgets.theme import add_css_class
1617

@@ -51,8 +52,17 @@ def __init__(self, application):
5152
height=425,
5253
show_title_buttons=False
5354
)
55+
application.add_window(self.widget)
5456

5557
def destroy(self):
58+
59+
from pynicotine.gtkgui.widgets.treeview import TreeView
60+
61+
for widget in self.option_widgets.values():
62+
if isinstance(widget, TreeView):
63+
widget.popup_menu.destroy()
64+
widget.destroy()
65+
5666
self.__dict__.clear()
5767

5868
@staticmethod
@@ -203,6 +213,13 @@ def _add_list_option(self, option_name, option_value, description):
203213
treeview.row_id = len(rows)
204214
self.application.preferences.set_widget(treeview, rows)
205215

216+
treeview.popup_menu = PopupMenu(self.application, treeview.widget)
217+
treeview.popup_menu.add_items(
218+
("#" + _("_Edit…"), self.on_edit, treeview),
219+
("", None),
220+
("#" + _("Remove"), self.on_remove, treeview)
221+
)
222+
206223
button_container = Gtk.Box(margin_end=6, margin_bottom=6, margin_start=6, margin_top=6,
207224
spacing=6, visible=True)
208225

@@ -364,7 +381,9 @@ def on_add_response(self, window, _response_id, treeview):
364381
treeview.row_id += 1
365382
treeview.add_row([value, treeview.row_id])
366383

367-
def on_add(self, _button, treeview):
384+
def on_add(self, *args):
385+
386+
treeview = args[-1]
368387

369388
EntryDialog(
370389
parent=self,
@@ -388,7 +407,9 @@ def on_edit_response(self, window, _response_id, data):
388407
treeview.remove_row(iterator)
389408
treeview.add_row([value, row_id])
390409

391-
def on_edit(self, _button=None, treeview=None):
410+
def on_edit(self, *args):
411+
412+
treeview = args[-1]
392413

393414
for iterator in treeview.get_selected_rows():
394415
value = treeview.get_row_value(iterator, "description") or ""
@@ -405,18 +426,21 @@ def on_edit(self, _button=None, treeview=None):
405426
).present()
406427
return
407428

408-
def on_remove(self, _button=None, treeview=None):
429+
def on_remove(self, *args):
430+
431+
treeview = args[-1]
432+
409433
for iterator in reversed(list(treeview.get_selected_rows())):
410434
row_id = treeview.get_row_value(iterator, "id_data")
411435
orig_iterator = treeview.iterators[row_id]
412436

413437
treeview.remove_row(orig_iterator)
414438

415439
def on_row_activated(self, treeview, *_args):
416-
self.on_edit(treeview=treeview)
440+
self.on_edit(treeview)
417441

418442
def on_delete_accelerator(self, treeview):
419-
self.on_remove(treeview=treeview)
443+
self.on_remove(treeview)
420444

421445
def on_cancel(self, *_args):
422446
self.close()

0 commit comments

Comments
 (0)