strawberry-audio-player-win.../src/core/mainwindow.h

401 lines
11 KiB
C
Raw Normal View History

2018-02-27 18:06:05 +01:00
/*
* Strawberry Music Player
* This file was part of Clementine.
* Copyright 2010, David Sansome <me@davidsansome.com>
2021-03-20 21:14:47 +01:00
* Copyright 2013-2021, Jonas Kvinge <jonas@jkvinge.net>
2018-02-27 18:06:05 +01:00
*
* Strawberry 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, either version 3 of the License, or
* (at your option) any later version.
*
* Strawberry 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 Strawberry. If not, see <http://www.gnu.org/licenses/>.
2018-08-09 18:39:44 +02:00
*
2018-02-27 18:06:05 +01:00
*/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "config.h"
#include <QtGlobal>
#include <QObject>
#include <QWidget>
2018-02-27 18:06:05 +01:00
#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QSortFilterProxyModel>
#include <QAbstractItemModel>
#include <QPersistentModelIndex>
2018-03-31 16:49:27 +02:00
#include <QMenu>
#include <QAction>
#include <QPoint>
#include <QMimeData>
2018-03-31 16:49:27 +02:00
#include <QList>
2020-02-08 03:40:30 +01:00
#include <QByteArray>
#include <QString>
#include <QUrl>
2020-02-08 03:40:30 +01:00
#include <QImage>
#include <QPixmap>
#include <QTimer>
#include <QSettings>
#include <QtEvents>
2018-02-27 18:06:05 +01:00
#include "scoped_ptr.h"
#include "shared_ptr.h"
#include "lazy.h"
#include "platforminterface.h"
#include "song.h"
#include "tagreaderclient.h"
2023-04-22 19:13:42 +02:00
#include "engine/enginebase.h"
2020-08-09 01:37:00 +02:00
#include "osd/osdbase.h"
#include "playlist/playlist.h"
2018-02-27 18:06:05 +01:00
#include "playlist/playlistitem.h"
#include "settings/settingsdialog.h"
2019-03-25 22:00:40 +01:00
#include "settings/behavioursettingspage.h"
#include "covermanager/albumcoverloaderresult.h"
#include "covermanager/albumcoverimageresult.h"
2018-10-19 20:18:46 +02:00
2018-02-27 18:06:05 +01:00
class About;
class Console;
2019-09-15 20:27:32 +02:00
class AlbumCoverManager;
2018-02-27 18:06:05 +01:00
class Application;
class ContextView;
class CollectionViewContainer;
class AlbumCoverChoiceController;
2018-02-27 18:06:05 +01:00
class CommandlineOptions;
2018-09-20 17:36:23 +02:00
#ifndef Q_OS_WIN
2018-02-27 18:06:05 +01:00
class DeviceViewContainer;
2018-09-20 17:36:23 +02:00
#endif
2018-02-27 18:06:05 +01:00
class EditTagDialog;
class Equalizer;
class ErrorDialog;
class FileView;
2021-01-26 19:13:29 +01:00
class GlobalShortcutsManager;
2018-02-27 18:06:05 +01:00
class MimeData;
class OrganizeDialog;
2018-02-27 18:06:05 +01:00
class PlaylistListContainer;
2018-10-21 15:13:48 +02:00
class QueueView;
2018-02-27 18:06:05 +01:00
class SystemTrayIcon;
#ifdef HAVE_MUSICBRAINZ
2018-02-27 18:06:05 +01:00
class TagFetcher;
2018-07-16 07:23:37 +02:00
#endif
2018-02-27 18:06:05 +01:00
class TrackSelectionDialog;
#ifdef HAVE_GSTREAMER
class TranscodeDialog;
#endif
class Ui_MainWindow;
2019-06-17 23:54:24 +02:00
class InternetSongsView;
class InternetTabsView;
class SmartPlaylistsViewContainer;
2019-08-29 21:32:52 +02:00
#ifdef Q_OS_WIN
class Windows7ThumbBar;
#endif
class AddStreamDialog;
2020-08-30 18:09:13 +02:00
class LastFMImportDialog;
2021-07-11 01:02:53 +02:00
class RadioViewContainer;
2018-02-27 18:06:05 +01:00
class MainWindow : public QMainWindow, public PlatformInterface {
Q_OBJECT
public:
explicit MainWindow(Application *app, SharedPtr<SystemTrayIcon> tray_icon, OSDBase *osd, const CommandlineOptions &options, QWidget *parent = nullptr);
2020-06-15 21:55:05 +02:00
~MainWindow() override;
2018-02-27 18:06:05 +01:00
static const char *kSettingsGroup;
static const char *kAllFilesFilterSpec;
2020-02-22 00:09:45 +01:00
void SetHiddenInTray(const bool hidden);
2020-08-23 19:17:50 +02:00
void CommandlineOptionsReceived(const CommandlineOptions &options);
2018-02-27 18:06:05 +01:00
protected:
2020-10-05 19:08:09 +02:00
void showEvent(QShowEvent *e) override;
void closeEvent(QCloseEvent *e) override;
2020-10-05 19:08:09 +02:00
void keyPressEvent(QKeyEvent *e) override;
#ifdef Q_OS_WIN
2022-03-22 21:09:05 +01:00
# if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result) override;
2022-03-22 21:09:05 +01:00
# else
2020-06-15 21:55:05 +02:00
bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;
2022-03-22 21:09:05 +01:00
# endif
#endif
2018-02-27 18:06:05 +01:00
// PlatformInterface
2020-06-15 21:55:05 +02:00
void Activate() override;
2020-08-23 19:17:50 +02:00
bool LoadUrl(const QString &url) override;
2018-02-27 18:06:05 +01:00
2019-07-26 22:46:04 +02:00
signals:
void AlbumCoverReady(const Song &song, const QImage &image);
void SearchCoverInProgress();
2018-02-27 18:06:05 +01:00
// Signals that stop playing after track was toggled.
void StopAfterToggled(const bool stop);
2018-02-27 18:06:05 +01:00
void AuthorizationUrlReceived(const QUrl &url);
2018-02-27 18:06:05 +01:00
private slots:
2020-08-23 19:17:50 +02:00
void FilePathChanged(const QString &path);
2018-02-27 18:06:05 +01:00
2023-04-22 19:13:42 +02:00
void EngineChanged(const EngineBase::Type enginetype);
2018-02-27 18:06:05 +01:00
void MediaStopped();
void MediaPaused();
void MediaPlaying();
void TrackSkipped(PlaylistItemPtr item);
2020-08-23 19:17:50 +02:00
void ForceShowOSD(const Song &song, const bool toggle);
2018-02-27 18:06:05 +01:00
2019-07-26 22:46:04 +02:00
void PlaylistMenuHidden();
2021-06-22 13:56:27 +02:00
void PlaylistRightClick(const QPoint global_pos, const QModelIndex &index);
2020-08-23 19:17:50 +02:00
void PlaylistCurrentChanged(const QModelIndex &current);
2018-02-27 18:06:05 +01:00
void PlaylistViewSelectionModelChanged();
void PlaylistPlay();
void PlaylistStopAfter();
void PlaylistQueue();
void PlaylistQueuePlayNext();
2018-02-27 18:06:05 +01:00
void PlaylistSkip();
void PlaylistRemoveCurrent();
void PlaylistEditFinished(const int playlist_id, const QModelIndex &idx);
void PlaylistClearCurrent();
2019-06-30 21:06:07 +02:00
void RescanSongs();
2018-02-27 18:06:05 +01:00
void EditTracks();
void EditTagDialogAccepted();
void RenumberTracks();
void SelectionSetValue();
void EditValue();
void AutoCompleteTags();
void AutoCompleteTagsAccepted();
void PlaylistUndoRedoChanged(QAction *undo, QAction *redo);
2018-02-27 18:06:05 +01:00
void AddFilesToTranscoder();
void PlaylistCopyToCollection();
void PlaylistMoveToCollection();
void PlaylistCopyToDevice();
void PlaylistOrganizeSelected(const bool copy);
2018-02-27 18:06:05 +01:00
void PlaylistOpenInBrowser();
void PlaylistCopyUrl();
2018-02-27 18:06:05 +01:00
void ShowInCollection();
void ChangeCollectionFilterMode(QAction *action);
2018-02-27 18:06:05 +01:00
void PlayIndex(const QModelIndex &idx, Playlist::AutoScroll autoscroll);
2020-08-23 19:17:50 +02:00
void PlaylistDoubleClick(const QModelIndex &idx);
2018-02-27 18:06:05 +01:00
void StopAfterCurrent();
2020-08-23 19:17:50 +02:00
void SongChanged(const Song &song);
2022-09-12 23:18:54 +02:00
void VolumeChanged(const uint volume);
2018-02-27 18:06:05 +01:00
2020-08-23 19:17:50 +02:00
void CopyFilesToCollection(const QList<QUrl> &urls);
void MoveFilesToCollection(const QList<QUrl> &urls);
void CopyFilesToDevice(const QList<QUrl> &urls);
void EditFileTags(const QList<QUrl> &urls);
2018-02-27 18:06:05 +01:00
2020-04-23 21:08:28 +02:00
void AddToPlaylist(QMimeData *q_mimedata);
2021-01-26 16:48:04 +01:00
void AddToPlaylistFromAction(QAction *action);
2018-02-27 18:06:05 +01:00
2020-02-22 00:09:45 +01:00
void VolumeWheelEvent(const int delta);
2018-02-27 18:06:05 +01:00
void ToggleShowHide();
2021-01-26 16:48:04 +01:00
void ToggleHide();
2018-02-27 18:06:05 +01:00
2021-03-21 18:53:02 +01:00
void Seeked(const qint64 microseconds);
2018-02-27 18:06:05 +01:00
void UpdateTrackPosition();
void UpdateTrackSliderPosition();
2020-02-22 00:09:45 +01:00
void TaskCountChanged(const int count);
2018-02-27 18:06:05 +01:00
void ShowCollectionConfig();
void ReloadSettings();
void ReloadAllSettings();
void RefreshStyleSheet();
void SetHiddenInTray() { SetHiddenInTray(true); }
void AddFile();
void AddFolder();
void AddCDTracks();
void AddStream();
void AddStreamAccepted();
2018-02-27 18:06:05 +01:00
2020-02-22 00:09:45 +01:00
void PlayingWidgetPositionChanged(const bool above_status_bar);
2018-02-27 18:06:05 +01:00
2020-08-23 19:17:50 +02:00
void SongSaveComplete(TagReaderReply *reply, const QPersistentModelIndex &idx);
2018-02-27 18:06:05 +01:00
void ShowCoverManager();
void ShowEqualizer();
2018-02-27 18:06:05 +01:00
void ShowAboutDialog();
2020-08-23 19:17:50 +02:00
void ShowErrorDialog(const QString &message);
void ShowTranscodeDialog();
SettingsDialog *CreateSettingsDialog();
EditTagDialog *CreateEditTagDialog();
2018-02-27 18:06:05 +01:00
void OpenSettingsDialog();
void OpenSettingsDialogAtPage(SettingsDialog::Page page);
void TabSwitched();
void ToggleSidebar(const bool checked);
void ToggleSearchCoverAuto(const bool checked);
2018-02-27 18:06:05 +01:00
void SaveGeometry();
void SavePlaybackStatus();
void LoadPlaybackStatus();
void ResumePlayback();
void Exit();
void DoExit();
2018-02-27 18:06:05 +01:00
2021-06-20 19:04:08 +02:00
void HandleNotificationPreview(const OSDBase::Behaviour type, const QString &line1, const QString &line2);
2018-02-27 18:06:05 +01:00
void ShowConsole();
void LoadCoverFromFile();
void SaveCoverToFile();
void LoadCoverFromURL();
void SearchForCover();
void UnsetCover();
void ClearCover();
void DeleteCover();
void ShowCover();
void SearchCoverAutomatically();
void AlbumCoverLoaded(const Song &song, const AlbumCoverLoaderResult &result);
2020-02-22 00:09:45 +01:00
void ScrobblingEnabledChanged(const bool value);
void ScrobbleButtonVisibilityChanged(const bool value);
void LoveButtonVisibilityChanged(const bool value);
2020-04-25 00:07:42 +02:00
void SendNowPlaying();
2019-06-12 00:38:52 +02:00
void Love();
void ExitFinished();
void PlaylistDelete();
void FocusSearchField();
2021-01-26 16:48:04 +01:00
public slots:
void CommandlineOptionsReceived(const QByteArray &string_options);
2021-01-26 16:48:04 +01:00
void Raise();
2018-02-27 18:06:05 +01:00
private:
void SaveSettings();
2021-07-11 09:49:38 +02:00
static void ApplyAddBehaviour(const BehaviourSettingsPage::AddBehaviour b, MimeData *mimedata);
2020-08-23 19:17:50 +02:00
void ApplyPlayBehaviour(const BehaviourSettingsPage::PlayBehaviour b, MimeData *mimedata) const;
2018-02-27 18:06:05 +01:00
void CheckFullRescanRevisions();
// creates the icon by painting the full one depending on the current position
2020-02-22 00:09:45 +01:00
QPixmap CreateOverlayedIcon(const int position, const int scrobble_point);
2018-10-02 00:38:52 +02:00
void GetCoverAutomatically();
2018-02-27 18:06:05 +01:00
2020-02-22 00:09:45 +01:00
void SetToggleScrobblingIcon(const bool value);
2018-02-27 18:06:05 +01:00
private:
Ui_MainWindow *ui_;
2019-08-29 21:32:52 +02:00
#ifdef Q_OS_WIN
2018-02-27 18:06:05 +01:00
Windows7ThumbBar *thumbbar_;
2019-08-29 21:32:52 +02:00
#endif
2018-02-27 18:06:05 +01:00
Application *app_;
SharedPtr<SystemTrayIcon> tray_icon_;
2020-08-09 01:37:00 +02:00
OSDBase *osd_;
2018-02-27 18:06:05 +01:00
Lazy<About> about_dialog_;
Lazy<Console> console_;
Lazy<EditTagDialog> edit_tag_dialog_;
AlbumCoverChoiceController *album_cover_choice_controller_;
2018-02-27 18:06:05 +01:00
2021-01-26 19:13:29 +01:00
GlobalShortcutsManager *globalshortcuts_manager_;
2018-02-27 18:06:05 +01:00
ContextView *context_view_;
2018-02-27 18:06:05 +01:00
CollectionViewContainer *collection_view_;
FileView *file_view_;
2018-09-20 17:36:23 +02:00
#ifndef Q_OS_WIN
DeviceViewContainer *device_view_;
2018-09-20 17:36:23 +02:00
#endif
PlaylistListContainer *playlist_list_;
2018-10-21 15:13:48 +02:00
QueueView *queue_view_;
2018-02-27 18:06:05 +01:00
Lazy<ErrorDialog> error_dialog_;
2018-02-27 18:06:05 +01:00
Lazy<SettingsDialog> settings_dialog_;
Lazy<AlbumCoverManager> cover_manager_;
SharedPtr<Equalizer> equalizer_;
Lazy<OrganizeDialog> organize_dialog_;
2018-02-27 18:06:05 +01:00
#ifdef HAVE_GSTREAMER
Lazy<TranscodeDialog> transcode_dialog_;
#endif
Lazy<AddStreamDialog> add_stream_dialog_;
2018-02-27 18:06:05 +01:00
#ifdef HAVE_MUSICBRAINZ
ScopedPtr<TagFetcher> tag_fetcher_;
2018-02-27 18:06:05 +01:00
#endif
ScopedPtr<TrackSelectionDialog> track_selection_dialog_;
2023-02-18 14:09:27 +01:00
PlaylistItemPtrList autocomplete_tag_items_;
2018-02-27 18:06:05 +01:00
SmartPlaylistsViewContainer *smartplaylists_view_;
2019-06-17 23:54:24 +02:00
InternetSongsView *subsonic_view_;
2020-04-13 19:04:06 +02:00
InternetTabsView *tidal_view_;
InternetTabsView *qobuz_view_;
2018-08-09 18:10:03 +02:00
2021-07-11 01:02:53 +02:00
RadioViewContainer *radio_view_;
2020-08-30 18:09:13 +02:00
LastFMImportDialog *lastfm_import_dialog_;
2018-02-27 18:06:05 +01:00
QAction *collection_show_all_;
QAction *collection_show_duplicates_;
QAction *collection_show_untagged_;
QMenu *playlist_menu_;
QAction *playlist_play_pause_;
QAction *playlist_stop_after_;
QAction *playlist_undoredo_;
QAction *playlist_copy_url_;
2018-02-27 18:06:05 +01:00
QAction *playlist_show_in_collection_;
QAction *playlist_copy_to_collection_;
QAction *playlist_move_to_collection_;
QAction *playlist_open_in_browser_;
QAction *playlist_organize_;
2018-09-20 17:36:23 +02:00
#ifndef Q_OS_WIN
2018-02-27 18:06:05 +01:00
QAction *playlist_copy_to_device_;
#endif
QAction *playlist_delete_;
2018-02-27 18:06:05 +01:00
QAction *playlist_queue_;
2021-06-12 20:53:23 +02:00
QAction *playlist_queue_play_next_;
2018-02-27 18:06:05 +01:00
QAction *playlist_skip_;
QAction *playlist_add_to_another_;
QList<QAction*> playlistitem_actions_;
QAction *playlistitem_actions_separator_;
QAction *playlist_rescan_songs_;
2018-08-09 18:10:03 +02:00
2018-02-27 18:06:05 +01:00
QModelIndex playlist_menu_index_;
QSortFilterProxyModel *collection_sort_model_;
QTimer *track_position_timer_;
QTimer *track_slider_timer_;
QSettings settings_;
bool keep_running_;
2019-03-09 17:20:07 +01:00
bool playing_widget_;
2019-03-25 22:00:40 +01:00
BehaviourSettingsPage::AddBehaviour doubleclick_addmode_;
BehaviourSettingsPage::PlayBehaviour doubleclick_playmode_;
BehaviourSettingsPage::PlaylistAddBehaviour doubleclick_playlist_addmode_;
BehaviourSettingsPage::PlayBehaviour menu_playmode_;
2018-02-27 18:06:05 +01:00
bool initialized_;
bool was_maximized_;
bool was_minimized_;
bool hidden_;
Song song_;
Song song_playing_;
AlbumCoverImageResult album_cover_;
bool exit_;
2019-07-24 23:29:09 +02:00
int exit_count_;
bool delete_files_;
2022-05-21 19:12:22 +02:00
bool ignore_close_;
2018-02-27 18:06:05 +01:00
};
#endif // MAINWINDOW_H