|
15 | 15 | #------------------------------------------------------- |
16 | 16 | # GTK YouTube Viewer |
17 | 17 | # Created on: 12 September 2010 |
18 | | -# Latest edit on: 04 March 2024 |
| 18 | +# Latest edit on: 11 August 2024 |
19 | 19 | # https://github.com/trizen/youtube-viewer |
20 | 20 | #------------------------------------------------------- |
21 | 21 |
|
@@ -1117,11 +1117,28 @@ sub get_text { |
1117 | 1117 | #>>> |
1118 | 1118 | } |
1119 | 1119 |
|
| 1120 | +sub gtk_treeview_button_press { |
| 1121 | + my ($widget, $event) = @_; |
| 1122 | + return 0 if $event->button != 3; |
| 1123 | + my $path = ($widget->get_path_at_pos($event->x, $event->y))[0] // return 0; |
| 1124 | + $widget->set_cursor($path, undef, 0); |
| 1125 | + $widget->grab_focus(); |
| 1126 | + my $iter = $widget->get_model()->get_iter($path); |
| 1127 | + my $menu = $widget->{'get-popup-menu'}->($iter) // return 0; |
| 1128 | + $menu->popup(undef, undef, undef, undef, $event->button, $event->time); |
| 1129 | + return 1; |
| 1130 | +} |
| 1131 | + |
| 1132 | +sub users_list_button_press { |
| 1133 | + my ($widget, $event) = @_; |
| 1134 | + return gtk_treeview_button_press($widget, $event); |
| 1135 | +} |
| 1136 | + |
1120 | 1137 | # Treeview signals |
1121 | 1138 | { |
1122 | 1139 | $treeview->signal_connect('button_press_event', \&menu_popup); |
1123 | 1140 | $treeview->signal_connect('size-allocate', \&treeview_scroll_to_end) if $CONFIG{autoscroll_to_end}; |
1124 | | - $users_treeview->signal_connect('button_press_event', \&users_menu_popup); |
| 1141 | + $users_treeview->{'get-popup-menu'} = \&users_menu_popup; |
1125 | 1142 | } |
1126 | 1143 |
|
1127 | 1144 | # Scroll treeview to end |
@@ -1397,7 +1414,7 @@ sub menu_popup { |
1397 | 1414 | # Playlists created by this author |
1398 | 1415 | { |
1399 | 1416 | my $item = 'Gtk3::ImageMenuItem'->new("Playlists"); |
1400 | | - $item->signal_connect(activate => \&show_playlists_from_selected_author); |
| 1417 | + $item->signal_connect(activate => sub { playlists('channel', $channel_id) }); |
1401 | 1418 | $item->set_property(tooltip_text => "Show playlists created by this author"); |
1402 | 1419 | $item->set_image('Gtk3::Image'->new_from_icon_name("emblem-documents-symbolic", q{menu})); |
1403 | 1420 | $item->show; |
@@ -1634,13 +1651,99 @@ sub menu_popup { |
1634 | 1651 | } |
1635 | 1652 |
|
1636 | 1653 | sub users_menu_popup { |
1637 | | - my ($treeview, $event) = @_; |
1638 | | - if ($event->button != 3) { |
1639 | | - return 0; |
| 1654 | + my ($iter) = @_; |
| 1655 | + |
| 1656 | + my $channel_id = $users_liststore->get($iter, 0); |
| 1657 | + my $channel_name = $users_liststore->get($iter, 1); |
| 1658 | + |
| 1659 | + # Create the main right-click menu |
| 1660 | + my $menu = 'Gtk3::Menu'->new; |
| 1661 | + |
| 1662 | + # Recent uploads from this author |
| 1663 | + { |
| 1664 | + my $item = 'Gtk3::ImageMenuItem'->new("Uploads"); |
| 1665 | + $item->signal_connect(activate => sub { uploads('channel', $channel_id) }); |
| 1666 | + $item->set_property(tooltip_text => "Show the most recent videos from this author"); |
| 1667 | + $item->set_image('Gtk3::Image'->new_from_icon_name("emblem-shared-symbolic", q{menu})); |
| 1668 | + $item->show; |
| 1669 | + $menu->append($item); |
1640 | 1670 | } |
1641 | | - my $menu = $gui->get_object('user_option_menu'); |
1642 | | - $menu->popup(undef, undef, undef, undef, $event->button, $event->time); |
1643 | | - return 0; |
| 1671 | + |
| 1672 | + # Most popular uploads from this author |
| 1673 | + { |
| 1674 | + my $item = 'Gtk3::ImageMenuItem'->new("Popular"); |
| 1675 | + $item->signal_connect(activate => sub { popular_uploads('channel', $channel_id) }); |
| 1676 | + $item->set_property(tooltip_text => "Show the most popular videos from this author"); |
| 1677 | + $item->set_image('Gtk3::Image'->new_from_icon_name("emblem-videos-symbolic", q{menu})); |
| 1678 | + $item->show; |
| 1679 | + $menu->append($item); |
| 1680 | + } |
| 1681 | + |
| 1682 | + # Favorites of this author |
| 1683 | + { |
| 1684 | + my $item = 'Gtk3::ImageMenuItem'->new("Favorites"); |
| 1685 | + $item->signal_connect(activate => sub { favorites('channel', $channel_id) }); |
| 1686 | + $item->set_property(tooltip_text => "Show favorite videos of this author"); |
| 1687 | + $item->set_image('Gtk3::Image'->new_from_icon_name("emblem-favorite-symbolic", q{menu})); |
| 1688 | + $item->show; |
| 1689 | + $menu->append($item); |
| 1690 | + } |
| 1691 | + |
| 1692 | + # Recent channel activity events |
| 1693 | + { |
| 1694 | + my $item = 'Gtk3::ImageMenuItem'->new("Activities"); |
| 1695 | + $item->signal_connect(activate => sub { activities('channel', $channel_id) }); |
| 1696 | + $item->set_property(tooltip_text => "Show recent channel activity events"); |
| 1697 | + $item->set_image('Gtk3::Image'->new_from_icon_name("view-refresh-symbolic", q{menu})); |
| 1698 | + $item->show; |
| 1699 | + $menu->append($item); |
| 1700 | + } |
| 1701 | + |
| 1702 | + # Playlists created by this author |
| 1703 | + { |
| 1704 | + my $item = 'Gtk3::ImageMenuItem'->new("Playlists"); |
| 1705 | + $item->signal_connect(activate => sub { playlists('channel', $channel_id) }); |
| 1706 | + $item->set_property(tooltip_text => "Show playlists created by this author"); |
| 1707 | + $item->set_image('Gtk3::Image'->new_from_icon_name("emblem-documents-symbolic", q{menu})); |
| 1708 | + $item->show; |
| 1709 | + $menu->append($item); |
| 1710 | + } |
| 1711 | + |
| 1712 | + # Separator |
| 1713 | + { |
| 1714 | + my $item = 'Gtk3::SeparatorMenuItem'->new; |
| 1715 | + $item->show; |
| 1716 | + $menu->append($item); |
| 1717 | + } |
| 1718 | + |
| 1719 | + # Remove the channel |
| 1720 | + { |
| 1721 | + my $item = 'Gtk3::ImageMenuItem'->new("Remove"); |
| 1722 | + $item->set_image('Gtk3::Image'->new_from_icon_name("edit-delete", q{menu})); |
| 1723 | + $item->set_property(tooltip_text => "Remove the channel from this list"); |
| 1724 | + $item->signal_connect(activate => \&remove_selected_username); |
| 1725 | + $item->show; |
| 1726 | + $menu->append($item); |
| 1727 | + } |
| 1728 | + |
| 1729 | + # Separator |
| 1730 | + { |
| 1731 | + my $item = 'Gtk3::SeparatorMenuItem'->new; |
| 1732 | + $item->show; |
| 1733 | + $menu->append($item); |
| 1734 | + } |
| 1735 | + |
| 1736 | + # Open the YouTube channel page |
| 1737 | + { |
| 1738 | + my $item = 'Gtk3::ImageMenuItem'->new("YouTube page"); |
| 1739 | + $item->signal_connect(activate => sub { open_external_url(make_youtube_url('channel', $channel_id)) }); |
| 1740 | + $item->set_property(tooltip_text => "Open the YouTube page of this channel"); |
| 1741 | + $item->set_image('Gtk3::Image'->new_from_icon_name("web-browser-symbolic", q{menu})); |
| 1742 | + $item->show; |
| 1743 | + $menu->append($item); |
| 1744 | + } |
| 1745 | + |
| 1746 | + return $menu; |
1644 | 1747 | } |
1645 | 1748 |
|
1646 | 1749 | # Setting help text |
@@ -4189,14 +4292,7 @@ sub show_videos_from_selected_author { |
4189 | 4292 | } |
4190 | 4293 |
|
4191 | 4294 | sub show_playlists_from_selected_author { |
4192 | | - my $request = $yv_obj->playlists(get_channel_id_for_selected_video() || return); |
4193 | | - if ($yv_utils->has_entries($request)) { |
4194 | | - display_results($request); |
4195 | | - } |
4196 | | - else { |
4197 | | - die "No playlists found...\n"; |
4198 | | - } |
4199 | | - return 1; |
| 4295 | + playlists('channel', get_channel_id_for_selected_video() || return); |
4200 | 4296 | } |
4201 | 4297 |
|
4202 | 4298 | sub set_entry_details { |
|
0 commit comments