diff --git a/src/controllers/legacycontrollersettingslayout.cpp b/src/controllers/legacycontrollersettingslayout.cpp index 483e765ba1f9..81854bfb0b2f 100644 --- a/src/controllers/legacycontrollersettingslayout.cpp +++ b/src/controllers/legacycontrollersettingslayout.cpp @@ -25,7 +25,7 @@ void LegacyControllerSettingsLayoutContainer::addItem( } QBoxLayout* LegacyControllerSettingsLayoutContainer::buildLayout(QWidget* pParent) const { - auto pLayout = make_parented(QBoxLayout::TopToBottom); + auto pLayout = make_parented(QBoxLayout::TopToBottom, pParent); pParent->setLayout(pLayout); diff --git a/src/library/export/dlglibraryexport.cpp b/src/library/export/dlglibraryexport.cpp index 972e1ddb3e07..c6cbdfbd9dd6 100644 --- a/src/library/export/dlglibraryexport.cpp +++ b/src/library/export/dlglibraryexport.cpp @@ -47,11 +47,11 @@ DlgLibraryExport::DlgLibraryExport( m_pConfig{pConfig}, m_pTrackCollectionManager{pTrackCollectionManager} { // Selectable list of crates from the Mixxx library. - m_pCratesList = make_parented(); + m_pCratesList = make_parented(this); m_pCratesList->setSelectionMode(QListWidget::ExtendedSelection); // Read-only text fields showing key directories for export. - m_pExportDirectoryTextField = make_parented(); + m_pExportDirectoryTextField = make_parented(this); m_pExportDirectoryTextField->setReadOnly(true); // Remember the last export directory, or use documents as a fallback. @@ -66,56 +66,56 @@ DlgLibraryExport::DlgLibraryExport( m_pExportDirectoryTextField->setText(lastExportDirectory); - m_pVersionCombo = make_parented(); + m_pVersionCombo = make_parented(this); m_pVersionCombo->setSizeAdjustPolicy(QComboBox::AdjustToContents); - m_pExistingDatabaseLabel = make_parented(); + m_pExistingDatabaseLabel = make_parented(this); m_pExistingDatabaseLabel->setWordWrap(true); // Radio buttons to allow choice between exporting the whole music library // or just tracks in a selection of crates. - m_pWholeLibraryRadio = make_parented(tr("Entire music library")); + m_pWholeLibraryRadio = make_parented(tr("Entire music library"), this); m_pWholeLibraryRadio->setChecked(true); m_pCratesList->setEnabled(false); connect(m_pWholeLibraryRadio, &QRadioButton::clicked, this, [this]() { m_pCratesList->setEnabled(false); }); - m_pCratesRadio = make_parented(tr("Selected crates")); + m_pCratesRadio = make_parented(tr("Selected crates"), this); connect(m_pCratesRadio, &QRadioButton::clicked, this, [this]() { m_pCratesList->setEnabled(true); }); // Button to allow ability to browse for the export directory. - auto pExportDirBrowseButton = make_parented(tr("Browse")); + auto pExportDirBrowseButton = make_parented(tr("Browse"), this); connect(pExportDirBrowseButton, &QPushButton::clicked, this, &DlgLibraryExport::browseExportDirectory); - auto pExportDirLayout = make_parented(); + auto pExportDirLayout = make_parented(this); pExportDirLayout->addWidget(m_pExportDirectoryTextField); pExportDirLayout->addWidget(pExportDirBrowseButton); - auto pFormLayout = make_parented(); + auto pFormLayout = make_parented(this); pFormLayout->addRow(tr("Export directory"), pExportDirLayout); pFormLayout->addRow(tr("Database version"), m_pVersionCombo); pFormLayout->addRow(m_pExistingDatabaseLabel); // Buttons to begin the export or cancel. - auto pExportButton = make_parented(tr("Export")); + auto pExportButton = make_parented(tr("Export"), this); pExportButton->setDefault(true); connect(pExportButton, &QPushButton::clicked, this, &DlgLibraryExport::exportRequested); - auto pCancelButton = make_parented(tr("Cancel")); + auto pCancelButton = make_parented(tr("Cancel"), this); connect(pCancelButton, &QPushButton::clicked, this, &QDialog::reject); // Arrange action buttons at bottom of dialog. - auto pButtonBarLayout = make_parented(); + auto pButtonBarLayout = make_parented(this); pButtonBarLayout->addStretch(1); pButtonBarLayout->addWidget(pExportButton); pButtonBarLayout->addWidget(pCancelButton); - auto pLayout = make_parented(); + auto pLayout = make_parented(this); pLayout->setColumnStretch(0, 1); pLayout->setColumnStretch(1, 2); pLayout->addWidget(m_pWholeLibraryRadio, 0, 0); diff --git a/src/util/parented_ptr.h b/src/util/parented_ptr.h index e0e2b8d24de6..25f57e1234cf 100644 --- a/src/util/parented_ptr.h +++ b/src/util/parented_ptr.h @@ -29,17 +29,12 @@ class parented_ptr final { explicit parented_ptr(T* t) noexcept : m_ptr{t} { - } -// Only generate destructor if not empty, otherwise its empty but will -// cause the parented_ptr to be not trivially destructible even though it could be. -#ifdef MIXXX_DEBUG_ASSERTIONS_ENABLED - ~parented_ptr() noexcept { DEBUG_ASSERT(!m_ptr || static_cast(m_ptr)->parent()); } -#else + // explicitly generate trivial destructor (since decltype(m_ptr) is not a class type) ~parented_ptr() noexcept = default; -#endif + // Rule of 5 parented_ptr(const parented_ptr&) = delete; parented_ptr& operator=(const parented_ptr&) = delete; @@ -104,7 +99,11 @@ class parented_ptr final { friend class parented_ptr; }; +template +concept AnyIsQObject = (... || std::is_convertible_v); + template + requires(std::is_base_of_v && AnyIsQObject) inline parented_ptr make_parented(Args&&... args) { return parented_ptr(new T(std::forward(args)...)); } diff --git a/src/widget/findonwebmenufactory.cpp b/src/widget/findonwebmenufactory.cpp index f10141b81457..edbf883080e0 100644 --- a/src/widget/findonwebmenufactory.cpp +++ b/src/widget/findonwebmenufactory.cpp @@ -12,9 +12,9 @@ namespace mixxx { namespace library { void createFindOnWebSubmenus(QMenu* pFindOnWebMenu, const Track& track) { - make_parented(new FindOnWebMenuSoundcloud(pFindOnWebMenu, track)); - make_parented(new FindOnWebMenuDiscogs(pFindOnWebMenu, track)); - make_parented(new FindOnWebMenuLastfm(pFindOnWebMenu, track)); + make_parented(pFindOnWebMenu, track); + make_parented(pFindOnWebMenu, track); + make_parented(pFindOnWebMenu, track); } } // namespace library diff --git a/src/widget/findonwebmenuservices/findonwebmenudiscogs.cpp b/src/widget/findonwebmenuservices/findonwebmenudiscogs.cpp index ee2e00a17493..fcac8a63b129 100644 --- a/src/widget/findonwebmenuservices/findonwebmenudiscogs.cpp +++ b/src/widget/findonwebmenuservices/findonwebmenudiscogs.cpp @@ -29,17 +29,17 @@ const QUrl composeDiscogsUrl(const QString& serviceDefaultUrl, } } //namespace -FindOnWebMenuDiscogs::FindOnWebMenuDiscogs(QMenu* pFindOnWebMenu, const Track& track) { +FindOnWebMenuDiscogs::FindOnWebMenuDiscogs(QMenu* pFindOnWebMenu, const Track& track) + : WFindOnWebMenu(pFindOnWebMenu) { const QString artist = track.getArtist(); const QString trackTitle = track.getTitle(); const QString album = track.getAlbum(); - auto pDiscogsMenu = make_parented(pFindOnWebMenu); - pDiscogsMenu->setTitle(kServiceTitle); - pFindOnWebMenu->addMenu(pDiscogsMenu); + setTitle(kServiceTitle); + pFindOnWebMenu->addMenu(this); addSeparator(); if (!artist.isEmpty()) { const QUrl discogsUrlArtist = composeDiscogsUrl(kSearchUrl, artist, kQueryTypeArtist); - addActionToServiceMenu(pDiscogsMenu, + addActionToServiceMenu( composeActionText(tr("Artist"), artist), discogsUrlArtist); } @@ -48,14 +48,14 @@ FindOnWebMenuDiscogs::FindOnWebMenuDiscogs(QMenu* pFindOnWebMenu, const Track& t const QString artistWithTrackTitle = composeSearchQuery(artist, trackTitle); const QUrl discogsUrlArtistWithTrackTitle = composeDiscogsUrl( kSearchUrl, artistWithTrackTitle, kQueryTypeRelease); - addActionToServiceMenu(pDiscogsMenu, + addActionToServiceMenu( composeActionText( tr("Artist + Title"), artistWithTrackTitle), discogsUrlArtistWithTrackTitle); } const QUrl discogsUrlTrackTitle = composeDiscogsUrl(kSearchUrl, trackTitle, kQueryTypeRelease); - addActionToServiceMenu(pDiscogsMenu, + addActionToServiceMenu( composeActionText(tr("Title"), trackTitle), discogsUrlTrackTitle); } @@ -64,12 +64,12 @@ FindOnWebMenuDiscogs::FindOnWebMenuDiscogs(QMenu* pFindOnWebMenu, const Track& t const QString artistWithAlbum = composeSearchQuery(artist, album); const QUrl discogsUrlArtistWithAlbum = composeDiscogsUrl( kSearchUrl, artistWithAlbum, kQueryTypeRelease); - addActionToServiceMenu(pDiscogsMenu, + addActionToServiceMenu( composeActionText(tr("Artist + Album"), artistWithAlbum), discogsUrlArtistWithAlbum); } else { const QUrl discogsUrlAlbum = composeDiscogsUrl(kSearchUrl, album, kQueryTypeRelease); - addActionToServiceMenu(pDiscogsMenu, + addActionToServiceMenu( composeActionText(tr("Album"), album), discogsUrlAlbum); } diff --git a/src/widget/findonwebmenuservices/findonwebmenulastfm.cpp b/src/widget/findonwebmenuservices/findonwebmenulastfm.cpp index 46fe777a287b..7c0c26cc0ce8 100644 --- a/src/widget/findonwebmenuservices/findonwebmenulastfm.cpp +++ b/src/widget/findonwebmenuservices/findonwebmenulastfm.cpp @@ -27,17 +27,17 @@ const QUrl composeLastfmUrl(const QString& serviceSearchUrl, } //namespace -FindOnWebMenuLastfm::FindOnWebMenuLastfm(QMenu* pFindOnWebMenu, const Track& track) { +FindOnWebMenuLastfm::FindOnWebMenuLastfm(QMenu* pFindOnWebMenu, const Track& track) + : WFindOnWebMenu(pFindOnWebMenu) { const QString artist = track.getArtist(); const QString trackTitle = track.getTitle(); const QString album = track.getAlbum(); - auto pLastfmMenu = make_parented(pFindOnWebMenu); - pLastfmMenu->setTitle(kServiceTitle); - pFindOnWebMenu->addMenu(pLastfmMenu); - pLastfmMenu->addSeparator(); + setTitle(kServiceTitle); + pFindOnWebMenu->addMenu(this); + addSeparator(); if (!artist.isEmpty()) { const QUrl lastfmUrlArtist = composeLastfmUrl(kSearchUrlArtist, artist); - addActionToServiceMenu(pLastfmMenu, + addActionToServiceMenu( composeActionText(tr("Artist"), artist), lastfmUrlArtist); } @@ -46,13 +46,13 @@ FindOnWebMenuLastfm::FindOnWebMenuLastfm(QMenu* pFindOnWebMenu, const Track& tra const QString artistWithTrackTitle = composeSearchQuery(artist, trackTitle); const QUrl lastfmUrlArtistWithTrackTitle = composeLastfmUrl(kSearchUrlTitle, artistWithTrackTitle); - addActionToServiceMenu(pLastfmMenu, + addActionToServiceMenu( composeActionText( tr("Artist + Title"), artistWithTrackTitle), lastfmUrlArtistWithTrackTitle); } const QUrl lastfmUrlTrackTitle = composeLastfmUrl(kSearchUrlTitle, trackTitle); - addActionToServiceMenu(pLastfmMenu, + addActionToServiceMenu( composeActionText(tr("Title"), trackTitle), lastfmUrlTrackTitle); } @@ -61,12 +61,12 @@ FindOnWebMenuLastfm::FindOnWebMenuLastfm(QMenu* pFindOnWebMenu, const Track& tra const QString artistWithAlbum = composeSearchQuery(artist, album); const QUrl lastfmUrlArtistWithAlbum = composeLastfmUrl(kSearchUrlAlbum, artistWithAlbum); - addActionToServiceMenu(pLastfmMenu, + addActionToServiceMenu( composeActionText(tr("Artist + Album"), artistWithAlbum), lastfmUrlArtistWithAlbum); } else { const QUrl lastfmUrlAlbum = composeLastfmUrl(kSearchUrlAlbum, album); - addActionToServiceMenu(pLastfmMenu, + addActionToServiceMenu( composeActionText(tr("Album"), album), lastfmUrlAlbum); } diff --git a/src/widget/findonwebmenuservices/findonwebmenusoundcloud.cpp b/src/widget/findonwebmenuservices/findonwebmenusoundcloud.cpp index d9ec470c8290..83daf332eca3 100644 --- a/src/widget/findonwebmenuservices/findonwebmenusoundcloud.cpp +++ b/src/widget/findonwebmenuservices/findonwebmenusoundcloud.cpp @@ -27,17 +27,17 @@ const QUrl composeSoundcloudUrl(const QString& serviceSearchUrl, } // namespace FindOnWebMenuSoundcloud::FindOnWebMenuSoundcloud( - QMenu* pFindOnWebMenu, const Track& track) { + QMenu* pFindOnWebMenu, const Track& track) + : WFindOnWebMenu(pFindOnWebMenu) { const QString artist = track.getArtist(); const QString trackTitle = track.getTitle(); const QString album = track.getAlbum(); - auto pSoundcloudMenu = make_parented(pFindOnWebMenu); - pSoundcloudMenu->setTitle(kServiceTitle); - pFindOnWebMenu->addMenu(pSoundcloudMenu); - pSoundcloudMenu->addSeparator(); + setTitle(kServiceTitle); + pFindOnWebMenu->addMenu(this); + addSeparator(); if (!artist.isEmpty()) { const QUrl SoundcloudUrlArtist = composeSoundcloudUrl(kSearchUrlArtist, artist); - addActionToServiceMenu(pSoundcloudMenu, + addActionToServiceMenu( composeActionText(tr("Artist"), artist), SoundcloudUrlArtist); } @@ -46,13 +46,13 @@ FindOnWebMenuSoundcloud::FindOnWebMenuSoundcloud( const QString artistWithTrackTitle = composeSearchQuery(artist, trackTitle); const QUrl SoundcloudUrlArtistWithTrackTitle = composeSoundcloudUrl(kSearchUrlTitle, artistWithTrackTitle); - addActionToServiceMenu(pSoundcloudMenu, + addActionToServiceMenu( composeActionText( tr("Artist + Title"), artistWithTrackTitle), SoundcloudUrlArtistWithTrackTitle); } const QUrl SoundcloudUrlTrackTitle = composeSoundcloudUrl(kSearchUrlTitle, trackTitle); - addActionToServiceMenu(pSoundcloudMenu, + addActionToServiceMenu( composeActionText(tr("Title"), trackTitle), SoundcloudUrlTrackTitle); } @@ -61,12 +61,12 @@ FindOnWebMenuSoundcloud::FindOnWebMenuSoundcloud( const QString artistWithAlbum = composeSearchQuery(artist, album); const QUrl SoundcloudUrlArtistWithAlbum = composeSoundcloudUrl(kSearchUrlAlbum, artistWithAlbum); - addActionToServiceMenu(pSoundcloudMenu, + addActionToServiceMenu( composeActionText(tr("Artist + Album"), artistWithAlbum), SoundcloudUrlArtistWithAlbum); } else { const QUrl SoundcloudUrlAlbum = composeSoundcloudUrl(kSearchUrlAlbum, album); - addActionToServiceMenu(pSoundcloudMenu, + addActionToServiceMenu( composeActionText(tr("Album"), album), SoundcloudUrlAlbum); } diff --git a/src/widget/wcolorpickeraction.cpp b/src/widget/wcolorpickeraction.cpp index 21cbb48ae222..13a6230a0518 100644 --- a/src/widget/wcolorpickeraction.cpp +++ b/src/widget/wcolorpickeraction.cpp @@ -1,22 +1,24 @@ #include "widget/wcolorpickeraction.h" #include +#include #include "moc_wcolorpickeraction.cpp" WColorPickerAction::WColorPickerAction(WColorPicker::Options options, const ColorPalette& palette, QWidget* parent) - : QWidgetAction(parent), - m_pColorPicker(make_parented(options, palette)) { - connect(m_pColorPicker.get(), &WColorPicker::colorPicked, this, &WColorPickerAction::colorPicked); - - QHBoxLayout* pLayout = new QHBoxLayout(); - pLayout->addWidget(m_pColorPicker); - pLayout->setSizeConstraint(QLayout::SetFixedSize); - - QWidget* pWidget = new QWidget(); + : QWidgetAction(parent) { + auto pWidget = std::make_unique(); + auto pLayout = make_parented(pWidget.get()); pWidget->setLayout(pLayout); pWidget->setSizePolicy(QSizePolicy()); - setDefaultWidget(pWidget); + m_pColorPicker = make_parented(options, palette, pWidget.get()); + pLayout->addWidget(m_pColorPicker); + pLayout->setSizeConstraint(QLayout::SetFixedSize); + setDefaultWidget(pWidget.release()); + connect(m_pColorPicker.get(), + &WColorPicker::colorPicked, + this, + &WColorPickerAction::colorPicked); } void WColorPickerAction::resetSelectedColor() { diff --git a/src/widget/wfindonwebmenu.cpp b/src/widget/wfindonwebmenu.cpp index 0960d63ba720..9384d3dde7cf 100644 --- a/src/widget/wfindonwebmenu.cpp +++ b/src/widget/wfindonwebmenu.cpp @@ -18,8 +18,8 @@ bool WFindOnWebMenu::hasEntriesForTrack(const Track& track) { } void WFindOnWebMenu::addActionToServiceMenu( - QMenu* serviceMenu, const QString& actionText, const QUrl& serviceUrl) { - serviceMenu->addAction(actionText, + const QString& actionText, const QUrl& serviceUrl) { + addAction(actionText, this, [this, serviceUrl] { openInBrowser(serviceUrl); diff --git a/src/widget/wfindonwebmenu.h b/src/widget/wfindonwebmenu.h index e60be722de80..8aafa02d1144 100644 --- a/src/widget/wfindonwebmenu.h +++ b/src/widget/wfindonwebmenu.h @@ -11,7 +11,7 @@ class WFindOnWebMenu : public QMenu { QWidget* parent = nullptr); ~WFindOnWebMenu() override = default; - void addActionToServiceMenu(QMenu* serviceMenu, + void addActionToServiceMenu( const QString& actionText, const QUrl& serviceUrl);