/*
* menus.c
* Copyright 2010-2014 John Lindgren
*
* This file is part of Audacious.
*
* Audacious is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, version 2 or version 3 of the License.
*
* Audacious is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* Audacious. If not, see .
*
* The Audacious team does not consider modular code linking to Audacious or
* using our public API to be a derived work.
*/
#include "menus.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "actions-mainwin.h"
#include "actions-playlist.h"
#include "main.h"
#include "view.h"
#include "../ui-common/menu-ops.h"
static QMenu * menus[UI_MENUS];
/* note: playback, playlist, and view menus must be created before main menu */
static QMenu * get_menu_playback () { return menus[UI_MENU_PLAYBACK]; }
static QMenu * get_menu_playlist () { return menus[UI_MENU_PLAYLIST]; }
static QMenu * get_menu_view () { return menus[UI_MENU_VIEW]; }
static QMenu * get_plugin_menu_main () { return audqt::menu_get_by_id (AudMenuID::Main); }
static QMenu * get_plugin_menu_playlist () { return audqt::menu_get_by_id (AudMenuID::Playlist); }
static QMenu * get_plugin_menu_playlist_add () { return audqt::menu_get_by_id (AudMenuID::PlaylistAdd); }
static QMenu * get_plugin_menu_playlist_remove () { return audqt::menu_get_by_id (AudMenuID::PlaylistRemove); }
static void configure_effects () { audqt::prefswin_show_plugin_page (PluginType::Effect); }
static void configure_output () { audqt::prefswin_show_plugin_page (PluginType::Output); }
static void configure_visualizations () { audqt::prefswin_show_plugin_page (PluginType::Vis); }
static void skins_volume_up () { mainwin_set_volume_diff (5); }
static void skins_volume_down () { mainwin_set_volume_diff (-5); }
static const audqt::MenuItem output_items[] = {
audqt::MenuCommand ({N_("Volume Up"), "audio-volume-high", "+"}, skins_volume_up),
audqt::MenuCommand ({N_("Volume Down"), "audio-volume-low", "-"}, skins_volume_down),
audqt::MenuSep (),
audqt::MenuCommand ({N_("Effects ...")}, configure_effects),
audqt::MenuSep (),
audqt::MenuToggle ({N_("Record Stream"), "media-record", "D"}, {nullptr, "record", "set record"}),
audqt::MenuCommand ({N_("Audio Settings ..."), "audio-card"}, configure_output)
};
static const audqt::MenuItem main_items[] = {
audqt::MenuCommand ({N_("Open Files ..."), "document-open", "L"}, action_play_file),
audqt::MenuCommand ({N_("Open Folder ..."), "document-open", "Shift+L"}, action_play_folder),
audqt::MenuCommand ({N_("Open URL ..."), "folder-remote", "Ctrl+L"}, action_play_location),
// audqt::MenuCommand ({N_("Search Library"), "edit-find", "Y"}, action_search_tool),
audqt::MenuSep (),
audqt::MenuSub ({N_("Playback")}, get_menu_playback),
audqt::MenuSub ({N_("Playlist")}, get_menu_playlist),
audqt::MenuSub ({N_("Output")}, {output_items}),
audqt::MenuSub ({N_("View")}, get_menu_view),
audqt::MenuSep (),
audqt::MenuSub ({N_("Services")}, get_plugin_menu_main),
audqt::MenuSep (),
audqt::MenuCommand ({N_("About ..."), "help-about"}, audqt::aboutwindow_show),
audqt::MenuCommand ({N_("Settings ..."), "preferences-system", "Ctrl+P"}, audqt::prefswin_show),
audqt::MenuCommand ({N_("Quit"), "application-exit", "Ctrl+Q"}, aud_quit)
};
static const audqt::MenuItem playback_items[] = {
audqt::MenuCommand ({N_("Song Info ..."), "dialog-information", "I"}, audqt::infowin_show_current),
audqt::MenuSep (),
audqt::MenuToggle ({N_("Repeat"), "media-playlist-repeat", "R"}, {nullptr, "repeat", "set repeat"}),
audqt::MenuToggle ({N_("Shuffle"), "media-playlist-shuffle", "S"}, {nullptr, "shuffle", "set shuffle"}),
audqt::MenuToggle ({N_("Shuffle by Album")}, {nullptr, "album_shuffle", "set album_shuffle"}),
audqt::MenuToggle ({N_("No Playlist Advance"), nullptr, "Ctrl+N"}, {nullptr, "no_playlist_advance", "set no_playlist_advance"}),
audqt::MenuToggle ({N_("Stop After This Song"), nullptr, "Ctrl+M"}, {nullptr, "stop_after_current_song", "set stop_after_current_song"}),
audqt::MenuSep (),
audqt::MenuCommand ({N_("Play"), "media-playback-start", "X"}, aud_drct_play),
audqt::MenuCommand ({N_("Pause"), "media-playback-pause", "C"}, aud_drct_pause),
audqt::MenuCommand ({N_("Stop"), "media-playback-stop", "V"}, aud_drct_stop),
audqt::MenuCommand ({N_("Previous"), "media-skip-backward", "Z"}, aud_drct_pl_prev),
audqt::MenuCommand ({N_("Next"), "media-skip-forward", "B"}, aud_drct_pl_next),
audqt::MenuSep (),
audqt::MenuCommand ({N_("Set A-B Repeat"), nullptr, "A"}, action_ab_set),
audqt::MenuCommand ({N_("Clear A-B Repeat"), nullptr, "Shift+A"}, action_ab_clear),
#if 0
audqt::MenuSep (),
audqt::MenuCommand ({N_("Jump to Song ..."), "go-jump", "J"}, audgui_jump_to_track),
audqt::MenuCommand ({N_("Jump to Time ..."), "go-jump", "Ctrl+J"}, audgui_jump_to_time)
#endif
};
static const audqt::MenuItem playlist_items[] = {
audqt::MenuCommand ({N_("Play/Resume"), "media-playback-start", "Shift+Return"}, pl_play),
audqt::MenuSep (),
audqt::MenuCommand ({N_("New Playlist"), "document-new", "Shift+N"}, pl_new),
audqt::MenuCommand ({N_("Rename Playlist ..."), "insert-text", "F2"}, action_playlist_rename),
audqt::MenuCommand ({N_("Remove Playlist"), "edit-delete", "Shift+D"}, action_playlist_delete),
audqt::MenuSep (),
audqt::MenuCommand ({N_("Previous Playlist"), "media-skip-backward", "Shift+Tab"}, pl_prev),
audqt::MenuCommand ({N_("Next Playlist"), "media-skip-forward", "Tab"}, pl_next),
audqt::MenuSep (),
#if 0
audqt::MenuCommand ({N_("Import Playlist ..."), "document-open", "O"}, audgui_import_playlist),
audqt::MenuCommand ({N_("Export Playlist ..."), "document-save", "Shift+S"}, audgui_export_playlist),
audqt::MenuSep (),
#endif
audqt::MenuCommand ({N_("Playlist Manager ..."), "audio-x-generic", "P"}, action_playlist_manager),
audqt::MenuCommand ({N_("Queue Manager ..."), nullptr, "Ctrl+U"}, audqt::queue_manager_show),
audqt::MenuSep (),
audqt::MenuCommand ({N_("Refresh Playlist"), "view-refresh", "F5"}, pl_refresh)
};
static const audqt::MenuItem view_items[] = {
audqt::MenuToggle ({N_("Show Playlist Editor"), nullptr, "Alt+E"}, {"skins", "playlist_visible", "skins set playlist_visible"}, view_apply_show_playlist),
audqt::MenuToggle ({N_("Show Equalizer"), nullptr, "Alt+G"}, {"skins", "equalizer_visible", "skins set equalizer_visible"}, view_apply_show_equalizer),
audqt::MenuSep (),
audqt::MenuToggle ({N_("Show Remaining Time"), nullptr, "Ctrl+R"}, {"skins", "show_remaining_time", "skins set show_remaining_time"}, view_apply_show_remaining),
audqt::MenuSep (),
audqt::MenuToggle ({N_("Double Size"), nullptr, "Ctrl+D"}, {"skins", "double_size", "skins set double_size"}, view_apply_double_size),
#if 0
audqt::MenuToggle ({N_("Always on Top"), nullptr, "Ctrl+O"}, {"skins", "always_on_top", "skins set always_on_top"}, view_apply_on_top),
audqt::MenuToggle ({N_("On All Workspaces"), nullptr, "Ctrl+S"}, {"skins", "sticky", "skins set sticky"}, view_apply_sticky),
#endif
audqt::MenuSep (),
audqt::MenuToggle ({N_("Roll Up Player"), nullptr, "Ctrl+W"}, {"skins", "player_shaded", "skins set player_shaded"}, view_apply_player_shaded),
audqt::MenuToggle ({N_("Roll Up Playlist Editor"), nullptr, "Shift+Ctrl+W"}, {"skins", "playlist_shaded", "skins set playlist_shaded"}, view_apply_playlist_shaded),
audqt::MenuToggle ({N_("Roll Up Equalizer"), nullptr, "Ctrl+Alt+W"}, {"skins", "equalizer_shaded", "skins set equalizer_shaded"}, view_apply_equalizer_shaded),
audqt::MenuSep (),
audqt::MenuCommand ({N_("_Visualizations ...")}, configure_visualizations)
};
static const audqt::MenuItem playlist_add_items[] = {
audqt::MenuSub ({N_("Services")}, get_plugin_menu_playlist_add),
audqt::MenuSep (),
audqt::MenuCommand ({N_("Add URL ..."), "folder-remote", "Ctrl+H"}, action_playlist_add_url),
audqt::MenuCommand ({N_("Add Folder ..."), "list-add", "Shift+F"}, action_playlist_add_folder),
audqt::MenuCommand ({N_("Add Files ..."), "list-add", "F"}, action_playlist_add_files)
};
static const audqt::MenuItem dupe_items[] = {
audqt::MenuCommand ({N_("By Title")}, rm_dupes_title),
audqt::MenuCommand ({N_("By File Name")}, rm_dupes_filename),
audqt::MenuCommand ({N_("By File Path")}, rm_dupes_path)
};
static const audqt::MenuItem playlist_remove_items[] = {
audqt::MenuSub ({N_("Services")}, get_plugin_menu_playlist_remove),
audqt::MenuSep (),
audqt::MenuCommand ({N_("Remove All"), "edit-delete"}, pl_remove_all),
audqt::MenuCommand ({N_("Clear Queue"), "edit-clear", "Shift+Q"}, pl_queue_clear),
audqt::MenuSep (),
audqt::MenuCommand ({N_("Remove Unavailable Files"), "dialog-warning"}, pl_remove_failed),
audqt::MenuSub ({N_("Remove Duplicates"), "edit-copy"}, {dupe_items}),
audqt::MenuSep (),
audqt::MenuCommand ({N_("Remove Unselected"), "list-remove"}, pl_remove_unselected),
audqt::MenuCommand ({N_("Remove Selected"), "list-remove", "Delete"}, pl_remove_selected)
};
static const audqt::MenuItem playlist_select_items[] = {
audqt::MenuCommand ({N_("Invert Selection")}, pl_select_invert),
audqt::MenuCommand ({N_("Select None"), nullptr, "Shift+Ctrl+A"}, pl_select_none),
audqt::MenuCommand ({N_("Select All"), "edit-select-all", "Ctrl+A"}, pl_select_all),
};
static const audqt::MenuItem sort_items[] = {
audqt::MenuCommand ({N_("By Track Number")}, sort_track),
audqt::MenuCommand ({N_("By Title")}, sort_title),
audqt::MenuCommand ({N_("By Artist")}, sort_artist),
audqt::MenuCommand ({N_("By Album")}, sort_album),
audqt::MenuCommand ({N_("By Album Artist")}, sort_album_artist),
audqt::MenuCommand ({N_("By Release Date")}, sort_date),
audqt::MenuCommand ({N_("By Genre")}, sort_genre),
audqt::MenuCommand ({N_("By Length")}, sort_length),
audqt::MenuCommand ({N_("By File Name")}, sort_filename),
audqt::MenuCommand ({N_("By File Path")}, sort_path),
audqt::MenuCommand ({N_("By Custom Title")}, sort_custom_title),
audqt::MenuCommand ({N_("By Comment")}, sort_comment)
};
static const audqt::MenuItem sort_selected_items[] = {
audqt::MenuCommand ({N_("By Track Number")}, sort_sel_track),
audqt::MenuCommand ({N_("By Title")}, sort_sel_title),
audqt::MenuCommand ({N_("By Artist")}, sort_sel_artist),
audqt::MenuCommand ({N_("By Album")}, sort_sel_album),
audqt::MenuCommand ({N_("By Album Artist")}, sort_sel_album_artist),
audqt::MenuCommand ({N_("By Genre")}, sort_sel_genre),
audqt::MenuCommand ({N_("By Release Date")}, sort_sel_date),
audqt::MenuCommand ({N_("By Length")}, sort_sel_length),
audqt::MenuCommand ({N_("By File Name")}, sort_sel_filename),
audqt::MenuCommand ({N_("By File Path")}, sort_sel_path),
audqt::MenuCommand ({N_("By Custom Title")}, sort_sel_custom_title),
audqt::MenuCommand ({N_("By Comment")}, sort_sel_comment)
};
static const audqt::MenuItem playlist_sort_items[] = {
audqt::MenuCommand ({N_("Randomize List"), nullptr, "Shift+Ctrl+R"}, sort_random),
audqt::MenuCommand ({N_("Reverse List"), "view-sort-descending"}, sort_reverse),
audqt::MenuSep (),
audqt::MenuSub ({N_("Sort Selected"), "view-sort-ascending"}, {sort_selected_items}),
audqt::MenuSub ({N_("Sort List"), "view-sort-ascending"}, {sort_items})
};
static const audqt::MenuItem playlist_context_items[] = {
audqt::MenuCommand ({N_("Song Info ..."), "dialog-information", "Alt+I"}, pl_song_info),
audqt::MenuCommand ({N_("Open Containing Folder"), "folder"}, pl_open_folder),
audqt::MenuSep (),
audqt::MenuCommand ({N_("Cut"), "edit-cut", "Ctrl+X"}, pl_cut),
audqt::MenuCommand ({N_("Copy"), "edit-copy", "Ctrl+C"}, pl_copy),
audqt::MenuCommand ({N_("Paste"), "edit-paste", "Ctrl+V"}, pl_paste),
audqt::MenuCommand ({N_("Paste at End"), "edit-paste", "Shift+Ctrl+V"}, pl_paste_end),
audqt::MenuSep (),
audqt::MenuCommand ({N_("Queue/Unqueue"), nullptr, "Q"}, pl_queue_toggle),
audqt::MenuSep (),
audqt::MenuSub ({N_("Services")}, get_plugin_menu_playlist)
};
void menu_init (QWidget * parent)
{
static const ArrayRef table[] = {
{main_items},
{playback_items},
{playlist_items},
{view_items},
{playlist_add_items},
{playlist_remove_items},
{playlist_select_items},
{playlist_sort_items},
{playlist_context_items}
};
for (int i = UI_MENUS; i --; )
menus[i] = audqt::menu_build (table[i], parent);
}
void menu_popup (int id, int x, int y, bool leftward, bool upward)
{
if (leftward || upward)
{
QSize size = menus[id]->sizeHint ();
if (leftward)
x -= size.width ();
if (upward)
y -= size.height ();
}
menus[id]->popup (QPoint (x, y));
}