Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -732,6 +732,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL
src/skin/legacy/launchimage.cpp
src/skin/legacy/legacyskinparser.cpp
src/skin/legacy/pixmapsource.cpp
src/skin/legacy/legacyskin.cpp
src/skin/legacy/skincontext.cpp
src/skin/legacy/tooltips.cpp
src/skin/skinloader.cpp
Expand Down
10 changes: 2 additions & 8 deletions src/mixxx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ MixxxMainWindow::MixxxMainWindow(
initializeWindow();

// Show launch image immediately so the user knows Mixxx is starting
m_pSkinLoader = std::make_unique<SkinLoader>(m_pCoreServices->getSettings());
m_pSkinLoader = std::make_unique<mixxx::skin::SkinLoader>(m_pCoreServices->getSettings());
m_pLaunchImage = m_pSkinLoader->loadLaunchImage(this);
m_pCentralWidget = (QWidget*)m_pLaunchImage;
setCentralWidget(m_pCentralWidget);
Expand Down Expand Up @@ -1090,13 +1090,7 @@ bool MixxxMainWindow::loadConfiguredSkin() {
// TODO: use std::shared_ptr throughout skin widgets instead of these hacky get() calls
m_pCentralWidget = m_pSkinLoader->loadConfiguredSkin(this,
&m_skinCreatedControls,
m_pCoreServices->getKeyboardEventFilter().get(),
m_pCoreServices->getPlayerManager().get(),
m_pCoreServices->getControllerManager().get(),
m_pCoreServices->getLibrary().get(),
m_pCoreServices->getVinylControlManager().get(),
m_pCoreServices->getEffectsManager().get(),
m_pCoreServices->getRecordingManager().get());
m_pCoreServices.get());
if (centralWidget() == m_pLaunchImage) {
initializationProgressUpdate(100, "");
}
Expand Down
9 changes: 7 additions & 2 deletions src/mixxx.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,15 @@ class EngineMaster;
class GuiTick;
class LaunchImage;
class Library;
class SkinLoader;
class VisualsManager;
class WMainMenuBar;

namespace mixxx {
namespace skin {
class SkinLoader;
}
} // namespace mixxx

#ifdef __ENGINEPRIME__
namespace mixxx {
class LibraryExporter;
Expand Down Expand Up @@ -116,7 +121,7 @@ class MixxxMainWindow : public QMainWindow {
QWidget* m_pCentralWidget;
LaunchImage* m_pLaunchImage;

std::shared_ptr<SkinLoader> m_pSkinLoader;
std::shared_ptr<mixxx::skin::SkinLoader> m_pSkinLoader;
GuiTick* m_pGuiTick;
VisualsManager* m_pVisualsManager;

Expand Down
2 changes: 1 addition & 1 deletion src/preferences/dialog/dlgpreferences.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@

DlgPreferences::DlgPreferences(
MixxxMainWindow* mixxx,
std::shared_ptr<SkinLoader> pSkinLoader,
std::shared_ptr<mixxx::skin::SkinLoader> pSkinLoader,
std::shared_ptr<SoundManager> pSoundManager,
std::shared_ptr<PlayerManager> pPlayerManager,
std::shared_ptr<ControllerManager> pControllerManager,
Expand Down
9 changes: 7 additions & 2 deletions src/preferences/dialog/dlgpreferences.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,19 @@ class DlgPrefLV2;
class LV2Backend;
class ControllerManager;
class EffectsManager;
class SkinLoader;
class PlayerManager;
class Library;
class VinylControlManager;
#ifdef __MODPLUG__
class DlgPrefModplug;
#endif // __MODPLUG__

namespace mixxx {
namespace skin {
class SkinLoader;
}
} // namespace mixxx

class DlgPreferences : public QDialog, public Ui::DlgPreferencesDlg {
Q_OBJECT
public:
Expand All @@ -66,7 +71,7 @@ class DlgPreferences : public QDialog, public Ui::DlgPreferencesDlg {
};

DlgPreferences(MixxxMainWindow* mixxx,
std::shared_ptr<SkinLoader> pSkinLoader,
std::shared_ptr<mixxx::skin::SkinLoader> pSkinLoader,
std::shared_ptr<SoundManager> pSoundManager,
std::shared_ptr<PlayerManager> pPlayerManager,
std::shared_ptr<ControllerManager> pControllerManager,
Expand Down
145 changes: 53 additions & 92 deletions src/preferences/dialog/dlgprefinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,59 +15,24 @@
#include "moc_dlgprefinterface.cpp"
#include "preferences/usersettings.h"
#include "skin/legacy/legacyskinparser.h"
#include "skin/skin.h"
#include "skin/skinloader.h"
#include "util/screensaver.h"
#include "util/widgethelper.h"

using mixxx::skin::SkinManifest;

namespace {

const QRegExp kMinSizeRegExp("<MinimumSize>(\\d+), *(\\d+)<");

bool skinFitsScreenSize(
const QScreen& screen,
const QString& skin) {
// Use the full resolution of the entire screen that is
// available in full-screen mode.
const auto screenSize = screen.size();
QFile skinfile(skin + QStringLiteral("/skin.xml"));
if (skinfile.open(QFile::ReadOnly | QFile::Text)) {
QTextStream in(&skinfile);
bool found_size = false;
while (!in.atEnd()) {
if (kMinSizeRegExp.indexIn(in.readLine()) != -1) {
found_size = true;
break;
}
}
if (found_size) {
return !(kMinSizeRegExp.cap(1).toInt() > screenSize.width() ||
kMinSizeRegExp.cap(2).toInt() > screenSize.height());
}
}

// If regex failed, fall back to skin name parsing.
QString skinName = skin.left(skin.indexOf(QRegExp("\\d")));
QString resName = skin.right(skin.count() - skinName.count());
QString res = resName.left(resName.lastIndexOf(QRegExp("\\d")) + 1);
QString skinWidth = res.left(res.indexOf("x"));
QString skinHeight = res.right(res.count() - skinWidth.count() - 1);
return skinWidth.toInt() <= screenSize.width() &&
skinHeight.toInt() <= screenSize.height();
}

} // namespace
using mixxx::skin::SkinPointer;

DlgPrefInterface::DlgPrefInterface(
QWidget* parent,
MixxxMainWindow* mixxx,
std::shared_ptr<SkinLoader> pSkinLoader,
std::shared_ptr<mixxx::skin::SkinLoader> pSkinLoader,
UserSettingsPointer pConfig)
: DlgPreferencePage(parent),
m_pConfig(pConfig),
m_mixxx(mixxx),
m_pSkinLoader(pSkinLoader),
m_pSkin(pSkinLoader->getConfiguredSkin()),
m_dScaleFactorAuto(1.0),
m_bUseAutoScaleFactor(false),
m_dScaleFactor(1.0),
Expand Down Expand Up @@ -145,34 +110,25 @@ DlgPrefInterface::DlgPrefInterface(
skinDescriptionText->setText("");
skinDescriptionText->hide();

QList<QDir> skinSearchPaths = m_pSkinLoader->getSkinSearchPaths();
QList<QFileInfo> skins;
for (QDir& dir : skinSearchPaths) {
dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
skins.append(dir.entryInfoList());
const QList<SkinPointer> skins = m_pSkinLoader->getSkins();
int index = 0;
for (const SkinPointer& pSkin : skins) {
ComboBoxSkinconf->insertItem(index, pSkin->name());
m_skins.insert(pSkin->name(), pSkin);
index++;
}

QString configuredSkinPath = m_pSkinLoader->getConfiguredSkinPath();
int index = 0;
ComboBoxSkinconf->setCurrentIndex(index);
// schemes must be updated here to populate the drop-down box and set m_colorScheme
slotUpdateSchemes();
skinPreviewLabel->setPixmap(m_pSkin->preview(m_colorScheme));
const auto* const pScreen = getScreen();
for (const QFileInfo& skinInfo : skins) {
ComboBoxSkinconf->insertItem(index, skinInfo.fileName());

if (skinInfo.absoluteFilePath() == configuredSkinPath) {
m_skin = skinInfo.fileName();
ComboBoxSkinconf->setCurrentIndex(index);
// schemes must be updated here to populate the drop-down box and set m_colorScheme
slotUpdateSchemes();
skinPreviewLabel->setPixmap(m_pSkinLoader->getSkinPreview(m_skin, m_colorScheme));
if (skinFitsScreenSize(*pScreen, configuredSkinPath)) {
warningLabel->hide();
} else {
warningLabel->show();
}
slotSetSkinDescription(m_skin);
}
index++;
if (m_pSkin->fitsScreenSize(*pScreen)) {
warningLabel->hide();
} else {
warningLabel->show();
}
slotSetSkinDescription();

connect(ComboBoxSkinconf,
QOverload<int>::of(&QComboBox::currentIndexChanged),
Expand Down Expand Up @@ -234,16 +190,15 @@ QScreen* DlgPrefInterface::getScreen() const {
void DlgPrefInterface::slotUpdateSchemes() {
// Re-populates the scheme combobox and attempts to pick the color scheme from config file.
// Since this involves opening a file we won't do this as part of regular slotUpdate
QList<QString> schlist = LegacySkinParser::getSchemeList(
m_pSkinLoader->getSkinPath(m_skin));
const QList<QString> schlist = m_pSkin->colorschemes();

ComboBoxSchemeconf->clear();

if (schlist.size() == 0) {
ComboBoxSchemeconf->setEnabled(false);
ComboBoxSchemeconf->addItem(tr("This skin does not support color schemes", nullptr));
ComboBoxSchemeconf->setCurrentIndex(0);
// clear m_colorScheme so that SkinLoader::getSkinPreview returns the correct preview
// clear m_colorScheme so that the correct skin preview is loaded
m_colorScheme = QString();
} else {
ComboBoxSchemeconf->setEnabled(true);
Expand All @@ -269,11 +224,15 @@ void DlgPrefInterface::slotUpdateSchemes() {
}

void DlgPrefInterface::slotUpdate() {
m_skinOnUpdate = m_pConfig->getValueString(ConfigKey("[Config]", "ResizableSkin"));
if (m_skinOnUpdate.isEmpty()) {
m_skinOnUpdate = m_pSkinLoader->getDefaultSkinName();
const QString skinNameOnUpdate =
m_pConfig->getValueString(ConfigKey("[Config]", "ResizableSkin"));
const SkinPointer pSkinOnUpdate = m_skins[skinNameOnUpdate];
if (pSkinOnUpdate != nullptr && pSkinOnUpdate->isValid()) {
m_skinNameOnUpdate = pSkinOnUpdate->name();
} else {
m_skinNameOnUpdate = m_pSkinLoader->getDefaultSkinName();
}
ComboBoxSkinconf->setCurrentIndex(ComboBoxSkinconf->findText(m_skinOnUpdate));
ComboBoxSkinconf->setCurrentIndex(ComboBoxSkinconf->findText(m_skinNameOnUpdate));
slotUpdateSchemes();
m_bRebootMixxxView = false;

Expand Down Expand Up @@ -375,14 +334,12 @@ void DlgPrefInterface::slotSetScheme(int) {
m_colorScheme = newScheme;
m_bRebootMixxxView = true;
}
skinPreviewLabel->setPixmap(m_pSkinLoader->getSkinPreview(m_skin, m_colorScheme));
skinPreviewLabel->setPixmap(m_pSkin->preview(m_colorScheme));
}

void DlgPrefInterface::slotSetSkinDescription(const QString& skin) {
SkinManifest manifest = LegacySkinParser::getSkinManifest(
LegacySkinParser::openSkin(m_pSkinLoader->getSkinPath(skin)));
QString description = QString::fromStdString(manifest.description());
if (manifest.has_description() && !description.isEmpty()) {
void DlgPrefInterface::slotSetSkinDescription() {
const QString description = m_pSkin->description();
if (!description.isEmpty()) {
skinDescriptionText->show();
skinDescriptionText->setText(description);
} else {
Expand All @@ -391,26 +348,30 @@ void DlgPrefInterface::slotSetSkinDescription(const QString& skin) {
}

void DlgPrefInterface::slotSetSkin(int) {
QString newSkin = ComboBoxSkinconf->currentText();
if (newSkin != m_skin) {
m_skin = newSkin;
m_bRebootMixxxView = newSkin != m_skinOnUpdate;
const auto* const pScreen = getScreen();
if (pScreen &&
skinFitsScreenSize(*pScreen, m_pSkinLoader->getSkinPath(m_skin))) {
warningLabel->hide();
} else {
warningLabel->show();
}
slotUpdateSchemes();
slotSetSkinDescription(m_skin);
QString newSkinName = ComboBoxSkinconf->currentText();
if (newSkinName == m_pSkin->name()) {
return;
}

skinPreviewLabel->setPixmap(m_pSkinLoader->getSkinPreview(newSkin, m_colorScheme));
const SkinPointer pNewSkin = m_skins[newSkinName];
VERIFY_OR_DEBUG_ASSERT(pNewSkin != nullptr && pNewSkin->isValid()) {
return;
}
m_pSkin = pNewSkin;
m_bRebootMixxxView = newSkinName != m_skinNameOnUpdate;
const auto* const pScreen = getScreen();
if (pScreen && m_pSkin->fitsScreenSize(*pScreen)) {
warningLabel->hide();
} else {
warningLabel->show();
}
slotUpdateSchemes();
slotSetSkinDescription();
skinPreviewLabel->setPixmap(m_pSkin->preview(m_colorScheme));
}

void DlgPrefInterface::slotApply() {
m_pConfig->set(ConfigKey("[Config]", "ResizableSkin"), m_skin);
m_pConfig->set(ConfigKey("[Config]", "ResizableSkin"), m_pSkin->name());
m_pConfig->set(ConfigKey("[Config]", "Scheme"), m_colorScheme);

QString locale = ComboBoxLocale->itemData(
Expand Down Expand Up @@ -449,7 +410,7 @@ void DlgPrefInterface::slotApply() {
if (m_bRebootMixxxView) {
m_mixxx->rebootMixxxView();
// Allow switching skins multiple times without closing the dialog
m_skinOnUpdate = m_skin;
m_skinNameOnUpdate = m_pSkin->name();
}
m_bRebootMixxxView = false;
}
Expand Down
22 changes: 16 additions & 6 deletions src/preferences/dialog/dlgprefinterface.h
Original file line number Diff line number Diff line change
@@ -1,27 +1,35 @@
#pragma once

#include <QMap>
#include <QWidget>
#include <memory>
#include <optional>

#include "preferences/constants.h"
#include "preferences/dialog/dlgpreferencepage.h"
#include "preferences/dialog/ui_dlgprefinterfacedlg.h"
#include "preferences/usersettings.h"
#include "skin/skin.h"

class ControlProxy;
class ControlPotmeter;
class SkinLoader;
class PlayerManager;
class MixxxMainWindow;
class ControlObject;

namespace mixxx {
namespace skin {
class SkinLoader;
}
} // namespace mixxx

class DlgPrefInterface : public DlgPreferencePage, public Ui::DlgPrefControlsDlg {
Q_OBJECT
public:
DlgPrefInterface(
QWidget* parent,
MixxxMainWindow* mixxx,
std::shared_ptr<SkinLoader> pSkinLoader,
std::shared_ptr<mixxx::skin::SkinLoader> pSkinLoader,
UserSettingsPointer pConfig);
~DlgPrefInterface() override = default;

Expand All @@ -30,8 +38,9 @@ class DlgPrefInterface : public DlgPreferencePage, public Ui::DlgPrefControlsDlg
void slotApply() override;
void slotResetToDefaults() override;

private slots:
void slotSetTooltips();
void slotSetSkinDescription(const QString& skin);
void slotSetSkinDescription();
void slotSetSkin(int);
void slotSetScheme(int);
void slotUpdateSchemes();
Expand All @@ -52,10 +61,11 @@ class DlgPrefInterface : public DlgPreferencePage, public Ui::DlgPrefControlsDlg
UserSettingsPointer m_pConfig;
ControlObject* m_pControlTrackTimeDisplay;
MixxxMainWindow *m_mixxx;
std::shared_ptr<SkinLoader> m_pSkinLoader;
std::shared_ptr<mixxx::skin::SkinLoader> m_pSkinLoader;

QString m_skin;
QString m_skinOnUpdate;
QMap<QString, mixxx::skin::SkinPointer> m_skins;
mixxx::skin::SkinPointer m_pSkin;
QString m_skinNameOnUpdate;
QString m_colorScheme;
QString m_localeOnUpdate;
mixxx::TooltipsPreference m_tooltipMode;
Expand Down
Loading