diff --git a/src/collection/collectionfilterwidget.cpp b/src/collection/collectionfilterwidget.cpp index 8fbb5865..e5126975 100644 --- a/src/collection/collectionfilterwidget.cpp +++ b/src/collection/collectionfilterwidget.cpp @@ -336,6 +336,17 @@ void CollectionFilterWidget::ShowGroupingManager() { } +bool CollectionFilterWidget::SearchFieldHasFocus() const { + + return ui_->search_field->hasFocus(); + +} + +void CollectionFilterWidget::FocusSearchField() { + + ui_->search_field->setFocus(); + +} void CollectionFilterWidget::FocusOnFilter(QKeyEvent *event) { diff --git a/src/collection/collectionfilterwidget.h b/src/collection/collectionfilterwidget.h index 3595449c..4e9167cf 100644 --- a/src/collection/collectionfilterwidget.h +++ b/src/collection/collectionfilterwidget.h @@ -82,6 +82,9 @@ class CollectionFilterWidget : public QWidget { void ReloadSettings(); + bool SearchFieldHasFocus() const; + void FocusSearchField(); + public slots: void SetQueryMode(QueryOptions::QueryMode query_mode); void FocusOnFilter(QKeyEvent *e); diff --git a/src/core/mainwindow.cpp b/src/core/mainwindow.cpp index 021952fc..ac47526a 100644 --- a/src/core/mainwindow.cpp +++ b/src/core/mainwindow.cpp @@ -980,6 +980,11 @@ MainWindow::MainWindow(Application *app, std::shared_ptr tray_ic close_window_shortcut->setKey(Qt::CTRL | Qt::Key_W); QObject::connect(close_window_shortcut, &QShortcut::activated, this, &MainWindow::ToggleHide); + QAction *action_focus_search = new QAction(this); + action_focus_search->setShortcuts(QList() << QKeySequence("Ctrl+F")); + addAction(action_focus_search); + QObject::connect(action_focus_search, &QAction::triggered, this, &MainWindow::FocusSearchField); + CheckFullRescanRevisions(); CommandlineOptionsReceived(options); @@ -3157,3 +3162,29 @@ void MainWindow::PlaylistDelete() { delete_files->Start(selected_songs); } + +void MainWindow::FocusSearchField() { + + if (ui_->tabs->currentIndex() == ui_->tabs->IndexOfTab(collection_view_) && !collection_view_->filter_widget()->SearchFieldHasFocus()) { + collection_view_->filter_widget()->FocusSearchField(); + } +#ifdef HAVE_SUBSONIC + else if (ui_->tabs->currentIndex() == ui_->tabs->IndexOfTab(subsonic_view_) && !subsonic_view_->SearchFieldHasFocus()) { + subsonic_view_->FocusSearchField(); + } +#endif +#ifdef HAVE_TIDAL + else if (ui_->tabs->currentIndex() == ui_->tabs->IndexOfTab(tidal_view_) && !tidal_view_->SearchFieldHasFocus()) { + tidal_view_->FocusSearchField(); + } +#endif +#ifdef HAVE_QOBUZ + else if (ui_->tabs->currentIndex() == ui_->tabs->IndexOfTab(qobuz_view_) && !qobuz_view_->SearchFieldHasFocus()) { + qobuz_view_->FocusSearchField(); + } +#endif + else if (!ui_->playlist->SearchFieldHasFocus()) { + ui_->playlist->FocusSearchField(); + } + +} diff --git a/src/core/mainwindow.h b/src/core/mainwindow.h index 9b91e29a..2cff73e9 100644 --- a/src/core/mainwindow.h +++ b/src/core/mainwindow.h @@ -272,6 +272,8 @@ class MainWindow : public QMainWindow, public PlatformInterface { void PlaylistDelete(); + void FocusSearchField(); + public slots: void CommandlineOptionsReceived(const quint32 instanceId, const QByteArray &string_options); void Raise(); diff --git a/src/internet/internetcollectionviewcontainer.cpp b/src/internet/internetcollectionviewcontainer.cpp index ef1d189b..b30d5e08 100644 --- a/src/internet/internetcollectionviewcontainer.cpp +++ b/src/internet/internetcollectionviewcontainer.cpp @@ -35,12 +35,12 @@ InternetCollectionViewContainer::InternetCollectionViewContainer(QWidget *parent ui_(new Ui_InternetCollectionViewContainer) { ui_->setupUi(this); - view()->SetFilter(filter_widget()); + ui_->view->SetFilter(ui_->filter_widget); - QObject::connect(filter_widget(), &CollectionFilterWidget::UpPressed, view(), &InternetCollectionView::UpAndFocus); - QObject::connect(filter_widget(), &CollectionFilterWidget::DownPressed, view(), &InternetCollectionView::DownAndFocus); - QObject::connect(filter_widget(), &CollectionFilterWidget::ReturnPressed, view(), &InternetCollectionView::FilterReturnPressed); - QObject::connect(view(), &InternetCollectionView::FocusOnFilterSignal, filter_widget(), &CollectionFilterWidget::FocusOnFilter); + QObject::connect(ui_->filter_widget, &CollectionFilterWidget::UpPressed, ui_->view, &InternetCollectionView::UpAndFocus); + QObject::connect(ui_->filter_widget, &CollectionFilterWidget::DownPressed, ui_->view, &InternetCollectionView::DownAndFocus); + QObject::connect(ui_->filter_widget, &CollectionFilterWidget::ReturnPressed, ui_->view, &InternetCollectionView::FilterReturnPressed); + QObject::connect(ui_->view, &InternetCollectionView::FocusOnFilterSignal, ui_->filter_widget, &CollectionFilterWidget::FocusOnFilter); ui_->progressbar->hide(); @@ -51,8 +51,18 @@ InternetCollectionViewContainer::InternetCollectionViewContainer(QWidget *parent InternetCollectionViewContainer::~InternetCollectionViewContainer() { delete ui_; } void InternetCollectionViewContainer::ReloadSettings() const { - filter_widget()->ReloadSettings(); - view()->ReloadSettings(); + + ui_->filter_widget->ReloadSettings(); + ui_->view->ReloadSettings(); + +} + +bool InternetCollectionViewContainer::SearchFieldHasFocus() const { + return ui_->filter_widget->SearchFieldHasFocus(); +} + +void InternetCollectionViewContainer::FocusSearchField() { + ui_->filter_widget->FocusSearchField(); } void InternetCollectionViewContainer::contextMenuEvent(QContextMenuEvent *e) { Q_UNUSED(e); } diff --git a/src/internet/internetcollectionviewcontainer.h b/src/internet/internetcollectionviewcontainer.h index b761a312..f8bedf75 100644 --- a/src/internet/internetcollectionviewcontainer.h +++ b/src/internet/internetcollectionviewcontainer.h @@ -44,6 +44,8 @@ class InternetCollectionViewContainer : public QWidget { ~InternetCollectionViewContainer() override; void ReloadSettings() const; + bool SearchFieldHasFocus() const; + void FocusSearchField(); QStackedWidget *stacked() const { return ui_->stacked; } QWidget *help_page() const { return ui_->help_page; } diff --git a/src/internet/internetsearchview.cpp b/src/internet/internetsearchview.cpp index f0b4f9e0..20a98f34 100644 --- a/src/internet/internetsearchview.cpp +++ b/src/internet/internetsearchview.cpp @@ -658,6 +658,12 @@ void InternetSearchView::SearchForThis() { StartSearch(ui_->results->selectionModel()->selectedRows().first().data().toString()); } +bool InternetSearchView::SearchFieldHasFocus() const { + + return ui_->search->hasFocus(); + +} + void InternetSearchView::FocusSearchField() { ui_->search->setFocus(); diff --git a/src/internet/internetsearchview.h b/src/internet/internetsearchview.h index d49758fb..477f94de 100644 --- a/src/internet/internetsearchview.h +++ b/src/internet/internetsearchview.h @@ -85,6 +85,9 @@ class InternetSearchView : public QWidget { void Init(Application *app, InternetService *service); + bool SearchFieldHasFocus() const; + void FocusSearchField(); + void LazyLoadAlbumCover(const QModelIndex &proxy_index); protected: @@ -121,7 +124,6 @@ class InternetSearchView : public QWidget { bool SearchKeyEvent(QKeyEvent *e); bool ResultsContextMenuEvent(QContextMenuEvent *e); - void FocusSearchField(); MimeData *SelectedMimeData(); diff --git a/src/internet/internetsongsview.h b/src/internet/internetsongsview.h index bb063df6..8dc262c3 100644 --- a/src/internet/internetsongsview.h +++ b/src/internet/internetsongsview.h @@ -48,6 +48,9 @@ class InternetSongsView : public QWidget { InternetCollectionView *view() const { return ui_->view; } + bool SearchFieldHasFocus() const { return ui_->filter_widget->SearchFieldHasFocus(); } + void FocusSearchField() { ui_->filter_widget->FocusSearchField(); } + private slots: void OpenSettingsDialog(); void GetSongs(); diff --git a/src/internet/internettabsview.cpp b/src/internet/internettabsview.cpp index 44bf39d8..5655215a 100644 --- a/src/internet/internettabsview.cpp +++ b/src/internet/internettabsview.cpp @@ -206,6 +206,32 @@ void InternetTabsView::ReloadSettings() { } +bool InternetTabsView::SearchFieldHasFocus() const { + + return ((ui_->tabs->currentWidget() == ui_->artists && ui_->artists_collection->SearchFieldHasFocus()) || + (ui_->tabs->currentWidget() == ui_->albums && ui_->albums_collection->SearchFieldHasFocus()) || + (ui_->tabs->currentWidget() == ui_->songs && ui_->songs_collection->SearchFieldHasFocus()) || + (ui_->tabs->currentWidget() == ui_->search && ui_->search_view->SearchFieldHasFocus())); + +} + +void InternetTabsView::FocusSearchField() { + + if (ui_->tabs->currentWidget() == ui_->artists) { + ui_->artists_collection->FocusSearchField(); + } + else if (ui_->tabs->currentWidget() == ui_->albums) { + ui_->albums_collection->FocusSearchField(); + } + else if (ui_->tabs->currentWidget() == ui_->songs) { + ui_->songs_collection->FocusSearchField(); + } + else if (ui_->tabs->currentWidget() == ui_->search) { + ui_->search_view->FocusSearchField(); + } + +} + void InternetTabsView::GetArtists() { if (!service_->authenticated() && service_->oauth()) { diff --git a/src/internet/internettabsview.h b/src/internet/internettabsview.h index e437668a..c5c3daab 100644 --- a/src/internet/internettabsview.h +++ b/src/internet/internettabsview.h @@ -53,6 +53,9 @@ class InternetTabsView : public QWidget { InternetCollectionView *songs_collection_view() const { return ui_->songs_collection->view(); } InternetSearchView *search_view() const { return ui_->search_view; } + bool SearchFieldHasFocus() const; + void FocusSearchField(); + private slots: void OpenSettingsDialog(); void GetArtists(); diff --git a/src/playlist/playlistcontainer.cpp b/src/playlist/playlistcontainer.cpp index 47e57740..9f15ad4b 100644 --- a/src/playlist/playlistcontainer.cpp +++ b/src/playlist/playlistcontainer.cpp @@ -263,6 +263,14 @@ void PlaylistContainer::ReloadSettings() { } +bool PlaylistContainer::SearchFieldHasFocus() const { + return ui_->filter->hasFocus(); +} + +void PlaylistContainer::FocusSearchField() { + ui_->filter->setFocus(); +} + void PlaylistContainer::ActivePlaying() { UpdateActiveIcon(QIcon(":/pictures/tiny-play.png")); } @@ -456,6 +464,7 @@ void PlaylistContainer::FocusOnFilter(QKeyEvent *event) { ui_->filter->setText(ui_->filter->text() + event->text()); break; } + } void PlaylistContainer::RepositionNoMatchesLabel(const bool force) { diff --git a/src/playlist/playlistcontainer.h b/src/playlist/playlistcontainer.h index 303d1f66..23dbb609 100644 --- a/src/playlist/playlistcontainer.h +++ b/src/playlist/playlistcontainer.h @@ -57,6 +57,9 @@ class PlaylistContainer : public QWidget { void SetManager(PlaylistManager *manager); void ReloadSettings(); + bool SearchFieldHasFocus() const; + void FocusSearchField(); + PlaylistView *view() const; bool eventFilter(QObject *objectWatched, QEvent *event) override; diff --git a/src/widgets/qsearchfield.h b/src/widgets/qsearchfield.h index 021d6bd5..3c1b9bc3 100644 --- a/src/widgets/qsearchfield.h +++ b/src/widgets/qsearchfield.h @@ -22,6 +22,10 @@ class QSearchField : public QWidget { QString text() const; QString placeholderText() const; + +#ifndef Q_OS_MACOS + bool hasFocus() const; +#endif void setFocus(Qt::FocusReason); public slots: diff --git a/src/widgets/qsearchfield_nonmac.cpp b/src/widgets/qsearchfield_nonmac.cpp index 0ded4874..b9ede3e6 100644 --- a/src/widgets/qsearchfield_nonmac.cpp +++ b/src/widgets/qsearchfield_nonmac.cpp @@ -131,6 +131,11 @@ QString QSearchField::placeholderText() const { return pimpl->lineedit_->placeholderText(); } +bool QSearchField::hasFocus() const { + Q_ASSERT(pimpl && pimpl->lineedit_); + return pimpl && pimpl->lineedit_ && pimpl->lineedit_->hasFocus(); +} + void QSearchField::setFocus(Qt::FocusReason reason) { Q_ASSERT(pimpl && pimpl->lineedit_); if (pimpl && pimpl->lineedit_) pimpl->lineedit_->setFocus(reason);