diff options
28 files changed, 206 insertions, 66 deletions
diff --git a/.gitignore b/.gitignore index 4aa36f454e..fa9d15e1c9 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ lib/*/lib/*.a mixxx mixxx-test res/qrc_mixxx.cc +res/developer_skins diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 709f6288a4..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "res/developer_skins"] - path = res/developer_skins - url = git@github.com:mixxxdj/developer_skins.git diff --git a/res/developer_skins b/res/developer_skins deleted file mode 160000 -Subproject 21372c9c223ab3279651cf97bfa64c7a5a445e4 diff --git a/src/engine/engineaux.cpp b/src/engine/engineaux.cpp index 59b296bbc0..5da2b93993 100644 --- a/src/engine/engineaux.cpp +++ b/src/engine/engineaux.cpp @@ -48,7 +48,7 @@ bool EngineAux::isActive() { } void EngineAux::onInputConfigured(AudioInput input) { - if (input.getType() != AudioPath::AUXILLIARY) { + if (input.getType() != AudioPath::AUXILIARY) { // This is an error! qDebug() << "WARNING: EngineAux connected to AudioInput for a non-passthrough type!"; return; @@ -58,7 +58,7 @@ void EngineAux::onInputConfigured(AudioInput input) { } void EngineAux::onInputUnconfigured(AudioInput input) { - if (input.getType() != AudioPath::AUXILLIARY) { + if (input.getType() != AudioPath::AUXILIARY) { // This is an error! qDebug() << "WARNING: EngineAux connected to AudioInput for a non-passthrough type!"; return; @@ -73,9 +73,9 @@ void EngineAux::receiveBuffer(AudioInput input, const CSAMPLE* pBuffer, return; } - if (input.getType() != AudioPath::AUXILLIARY) { + if (input.getType() != AudioPath::AUXILIARY) { // This is an error! - qDebug() << "WARNING: EngineAux received an AudioInput for a non-auxilliary type!"; + qDebug() << "WARNING: EngineAux received an AudioInput for a non-auxiliary type!"; return; } diff --git a/src/mixxx.cpp b/src/mixxx.cpp index 5cf407b975..8a7e5f9a92 100644 --- a/src/mixxx.cpp +++ b/src/mixxx.cpp @@ -142,15 +142,15 @@ MixxxMainWindow::MixxxMainWindow(QApplication* pApp, const CmdlineArgs& args) m_pEngine->addChannel(pMicrophone); m_pSoundManager->registerInput(micInput, pMicrophone); - EngineAux* pAux1 = new EngineAux("[Auxilliary1]"); + EngineAux* pAux1 = new EngineAux("[Auxiliary1]"); // What should channelbase be? - AudioInput auxInput1 = AudioInput(AudioPath::AUXILLIARY, 0, 0, 0); + AudioInput auxInput1 = AudioInput(AudioPath::AUXILIARY, 0, 0, 0); m_pEngine->addChannel(pAux1); m_pSoundManager->registerInput(auxInput1, pAux1); - EngineAux* pAux2 = new EngineAux("[Auxilliary2]"); + EngineAux* pAux2 = new EngineAux("[Auxiliary2]"); // What should channelbase be? - AudioInput auxInput2 = AudioInput(AudioPath::AUXILLIARY, 0, 0, 1); + AudioInput auxInput2 = AudioInput(AudioPath::AUXILIARY, 0, 0, 1); m_pEngine->addChannel(pAux2); m_pSoundManager->registerInput(auxInput2, pAux2); diff --git a/src/skin/skincontext.cpp b/src/skin/skincontext.cpp index bc6b66dd03..8abd0c507e 100644 --- a/src/skin/skincontext.cpp +++ b/src/skin/skincontext.cpp @@ -141,6 +141,16 @@ bool SkinContext::selectAttributeBool(const QDomElement& element, return defaultValue; } +QString SkinContext::selectAttributeString(const QDomElement& element, + const QString& attributeName, + QString defaultValue) const { + if (element.hasAttribute(attributeName)) { + QString stringValue = element.attribute(attributeName); + return stringValue == "" ? defaultValue :stringValue; + } + return defaultValue; +} + QString SkinContext::variableNodeToText(const QDomElement& variableNode) const { if (variableNode.hasAttribute("expression")) { QScriptValue result = m_scriptEngine.evaluate( diff --git a/src/skin/skincontext.h b/src/skin/skincontext.h index fb4d42e622..72b68a3b4b 100644 --- a/src/skin/skincontext.h +++ b/src/skin/skincontext.h @@ -55,6 +55,9 @@ class SkinContext { bool selectAttributeBool(const QDomElement& element, const QString& attributeName, bool defaultValue) const; + QString selectAttributeString(const QDomElement& element, + const QString& attributeName, + QString defaultValue) const; QString nodeToString(const QDomNode& node) const; private: diff --git a/src/soundmanagerutil.cpp b/src/soundmanagerutil.cpp index 3c2d64f95b..183fc0c350 100644 --- a/src/soundmanagerutil.cpp +++ b/src/soundmanagerutil.cpp @@ -162,8 +162,8 @@ QString AudioPath::getStringFromType(AudioPathType type) { return QString::fromAscii("Vinyl Control"); case MICROPHONE: return QString::fromAscii("Microphone"); - case AUXILLIARY: - return QString::fromAscii("Auxilliary"); + case AUXILIARY: + return QString::fromAscii("Auxiliary"); } return QString::fromAscii("Unknown path type %1").arg(type); } @@ -201,8 +201,8 @@ QString AudioPath::getTrStringFromType(AudioPathType type, unsigned char index) QString::number(index + 1)); case MICROPHONE: return QObject::tr("Microphone"); - case AUXILLIARY: - return QString("%1 %2").arg(QObject::tr("Auxilliary"), + case AUXILIARY: + return QString("%1 %2").arg(QObject::tr("Auxiliary"), QString::number(index + 1)); } return QObject::tr("Unknown path type %1").arg(type); @@ -226,8 +226,8 @@ AudioPathType AudioPath::getTypeFromString(QString string) { return AudioPath::VINYLCONTROL; } else if (string == AudioPath::getStringFromType(AudioPath::MICROPHONE).toLower()) { return AudioPath::MICROPHONE; - } else if (string == AudioPath::getStringFromType(AudioPath::AUXILLIARY).toLower()) { - return AudioPath::AUXILLIARY; + } else if (string == AudioPath::getStringFromType(AudioPath::AUXILIARY).toLower()) { + return AudioPath::AUXILIARY; } else { return AudioPath::INVALID; } @@ -242,7 +242,7 @@ bool AudioPath::isIndexed(AudioPathType type) { case BUS: case DECK: case VINYLCONTROL: - case AUXILLIARY: + case AUXILIARY: return true; case MICROPHONE: default: @@ -421,7 +421,7 @@ QList<AudioPathType> AudioInput::getSupportedTypes() { // (prefs, etc), minimal ifdefs :) -- bkgood types.append(VINYLCONTROL); #endif - types.append(AUXILLIARY); + types.append(AUXILIARY); types.append(MICROPHONE); return types; } diff --git a/src/soundmanagerutil.h b/src/soundmanagerutil.h index faa95c4e60..47dc396e09 100644 --- a/src/soundmanagerutil.h +++ b/src/soundmanagerutil.h @@ -60,7 +60,7 @@ public: DECK, VINYLCONTROL, MICROPHONE, - AUXILLIARY, + AUXILIARY, INVALID, // if this isn't last bad things will happen -bkgood }; AudioPath(unsigned char channelBase, unsigned char channels); diff --git a/src/vamp/vampanalyser.cpp b/src/vamp/vampanalyser.cpp index cb019f3f78..ce8580718c 100644 --- a/src/vamp/vampanalyser.cpp +++ b/src/vamp/vampanalyser.cpp @@ -93,7 +93,7 @@ void VampAnalyser::initializePluginPaths() { pathElements << developer32Root.absolutePath(); } QDir developer64Root(applicationPath); - if (developer64Root.cd("lin32_build") && developer64Root.cd("vamp-plugins")) { + if (developer64Root.cd("lin64_build") && developer64Root.cd("vamp-plugins")) { pathElements << developer64Root.absolutePath(); } #endif diff --git a/src/widget/knobeventhandler.h b/src/widget/knobeventhandler.h index 99a9140426..d457af5442 100644 --- a/src/widget/knobeventhandler.h +++ b/src/widget/knobeventhandler.h @@ -42,7 +42,7 @@ class KnobEventHandler { if (!m_bRightButtonPressed) { QCursor::setPos(m_startPos); double value = valueFromMouseEvent(pWidget, e); - pWidget->setControlParameter(value); + pWidget->setControlParameterDown(value); pWidget->update(); } } @@ -71,7 +71,7 @@ class KnobEventHandler { QCursor::setPos(m_startPos); QApplication::restoreOverrideCursor(); value = valueFromMouseEvent(pWidget, e); - pWidget->setControlParameter(value); + pWidget->setControlParameterUp(value); pWidget->update(); break; case Qt::RightButton: diff --git a/src/widget/wbasewidget.cpp b/src/widget/wbasewidget.cpp index c2efac0b2e..081863f47d 100644 --- a/src/widget/wbasewidget.cpp +++ b/src/widget/wbasewidget.cpp @@ -97,6 +97,30 @@ void WBaseWidget::setControlParameter(double v) { } } +void WBaseWidget::setControlParameterUp(double v) { + foreach (ControlParameterWidgetConnection* pControlConnection, m_leftConnections) { + pControlConnection->setControlParameterUp(v); + } + foreach (ControlParameterWidgetConnection* pControlConnection, m_rightConnections) { + pControlConnection->setControlParameterUp(v); + } + foreach (ControlParameterWidgetConnection* pControlConnection, m_connections) { + pControlConnection->setControlParameterUp(v); + } +} + +void WBaseWidget::setControlParameterDown(double v) { + foreach (ControlParameterWidgetConnection* pControlConnection, m_leftConnections) { + pControlConnection->setControlParameterDown(v); + } + foreach (ControlParameterWidgetConnection* pControlConnection, m_rightConnections) { + pControlConnection->setControlParameterDown(v); + } + foreach (ControlParameterWidgetConnection* pControlConnection, m_connections) { + pControlConnection->setControlParameterDown(v); + } +} + void WBaseWidget::setControlParameterLeftDown(double v) { if (!m_leftConnections.isEmpty()) { foreach (ControlParameterWidgetConnection* pControlConnection, m_leftConnections) { diff --git a/src/widget/wbasewidget.h b/src/widget/wbasewidget.h index 051b23a88a..18951178c7 100644 --- a/src/widget/wbasewidget.h +++ b/src/widget/wbasewidget.h @@ -51,6 +51,8 @@ class WBaseWidget { void resetControlParameter(); void setControlParameter(double v); + void setControlParameterDown(double v); + void setControlParameterUp(double v); void setControlParameterLeftDown(double v); void setControlParameterLeftUp(double v); void setControlParameterRightDown(double v); diff --git a/src/widget/wdisplay.cpp b/src/widget/wdisplay.cpp index 40089dbd31..81177b3d62 100644 --- a/src/widget/wdisplay.cpp +++ b/src/widget/wdisplay.cpp @@ -39,8 +39,10 @@ WDisplay::~WDisplay() { void WDisplay::setup(QDomNode node, const SkinContext& context) { // Set background pixmap if available if (context.hasNode(node, "BackPath")) { - setPixmapBackground(context.getSkinPath( - context.selectString(node, "BackPath"))); + QString mode_str = context.selectAttributeString( + context.selectElement(node, "BackPath"), "scalemode", "TILE"); + setPixmapBackground(context.getSkinPath(context.selectString(node, "BackPath")), + Paintable::DrawModeFromString(mode_str)); } // Number of states @@ -83,8 +85,9 @@ void WDisplay::resetPositions() { m_disabledPixmaps.resize(0); } -void WDisplay::setPixmapBackground(const QString& filename) { - m_pPixmapBack = WPixmapStore::getPaintable(filename); +void WDisplay::setPixmapBackground(const QString& filename, + Paintable::DrawMode mode) { + m_pPixmapBack = WPixmapStore::getPaintable(filename, mode); if (m_pPixmapBack.isNull() || m_pPixmapBack->isNull()) { qDebug() << metaObject()->className() << "Error loading background pixmap:" << filename; @@ -97,7 +100,8 @@ void WDisplay::setPixmap(QVector<PaintablePointer>* pPixmaps, int iPos, return; } - PaintablePointer pPixmap = WPixmapStore::getPaintable(filename); + PaintablePointer pPixmap = WPixmapStore::getPaintable(filename, + Paintable::TILE); if (pPixmap.isNull() || pPixmap->isNull()) { qDebug() << metaObject()->className() diff --git a/src/widget/wdisplay.h b/src/widget/wdisplay.h index 9b70f1273a..5e27f53fa3 100644 --- a/src/widget/wdisplay.h +++ b/src/widget/wdisplay.h @@ -46,7 +46,7 @@ class WDisplay : public WWidget { void setPixmap(QVector<PaintablePointer>* pPixmaps, int iPos, const QString& filename); - void setPixmapBackground(const QString& filename); + void setPixmapBackground(const QString& filename, Paintable::DrawMode mode); void setPositions(int iNoPos); diff --git a/src/widget/wknobcomposed.cpp b/src/widget/wknobcomposed.cpp index 7f07093ca4..6a449dd46b 100644 --- a/src/widget/wknobcomposed.cpp +++ b/src/widget/wknobcomposed.cpp @@ -17,7 +17,10 @@ void WKnobComposed::setup(QDomNode node, const SkinContext& context) { // Set background pixmap if available if (context.hasNode(node, "BackPath")) { - setPixmapBackground(context.getSkinPath(context.selectString(node, "BackPath"))); + QString mode_str = context.selectAttributeString( + context.selectElement(node, "BackPath"), "scalemode", "TILE"); + setPixmapBackground(context.getSkinPath(context.selectString(node, "BackPath")), + Paintable::DrawModeFromString(mode_str)); } // Set background pixmap if available @@ -39,8 +42,9 @@ void WKnobComposed::clear() { m_pKnob.clear(); } -void WKnobComposed::setPixmapBackground(const QString& filename) { - m_pPixmapBack = WPixmapStore::getPaintable(filename); +void WKnobComposed::setPixmapBackground(const QString& filename, + Paintable::DrawMode mode) { + m_pPixmapBack = WPixmapStore::getPaintable(filename, mode); if (m_pPixmapBack.isNull() || m_pPixmapBack->isNull()) { qDebug() << metaObject()->className() << "Error loading background pixmap:" << filename; @@ -48,7 +52,7 @@ void WKnobComposed::setPixmapBackground(const QString& filename) { } void WKnobComposed::setPixmapKnob(const QString& filename) { - m_pKnob = WPixmapStore::getPaintable(filename); + m_pKnob = WPixmapStore::getPaintable(filename, Paintable::STRETCH); if (m_pKnob.isNull() || m_pKnob->isNull()) { qDebug() << metaObject()->className() << "Error loading knob pixmap:" << filename; diff --git a/src/widget/wknobcomposed.h b/src/widget/wknobcomposed.h index 280957d19d..e941ad150a 100644 --- a/src/widget/wknobcomposed.h +++ b/src/widget/wknobcomposed.h @@ -29,7 +29,7 @@ class WKnobComposed : public WWidget { private: void clear(); - void setPixmapBackground(const QString& filename); + void setPixmapBackground(const QString& filename, Paintable::DrawMode mode); void setPixmapKnob(const QString& filename); PaintablePointer m_pKnob; diff --git a/src/widget/wpixmapstore.cpp b/src/widget/wpixmapstore.cpp index cf3985a53b..63b1839833 100644 --- a/src/widget/wpixmapstore.cpp +++ b/src/widget/wpixmapstore.cpp @@ -17,13 +17,25 @@ #include "widget/wpixmapstore.h" +#include <QString> #include <QtDebug> // static QHash<QString, WeakPaintablePointer> WPixmapStore::m_paintableCache; QSharedPointer<ImgSource> WPixmapStore::m_loader = QSharedPointer<ImgSource>(); -Paintable::Paintable(QImage* pImage) { +Paintable::DrawMode Paintable::DrawModeFromString(QString str) { + if (str.toUpper() == "TILE") { + return TILE; + } else if (str.toUpper() == "STRETCH") { + return STRETCH; + } + qWarning() << "Unknown string for Paintable drawing mode " << str << ", using TILE"; + return TILE; +} + +Paintable::Paintable(QImage* pImage, DrawMode mode) + : m_draw_mode(mode) { #if QT_VERSION >= 0x040700 m_pPixmap.reset(new QPixmap()); m_pPixmap->convertFromImage(*pImage); @@ -33,9 +45,24 @@ Paintable::Paintable(QImage* pImage) { delete pImage; } -Paintable::Paintable(const QString& fileName) { +Paintable::Paintable(const QString& fileName, DrawMode mode) + : m_draw_mode(mode) { if (fileName.endsWith(".svg", Qt::CaseInsensitive)) { - m_pSvg.reset(new QSvgRenderer(fileName)); + if (mode == STRETCH) { + m_pSvg.reset(new QSvgRenderer(fileName)); + } else if (mode == TILE) { + // The SVG renderer doesn't directly support tiling, so we render + // it to a pixmap which will then get tiled. + QSvgRenderer renderer(fileName); + QImage copy_buffer(renderer.defaultSize(), QImage::Format_ARGB32); + copy_buffer.fill(0x00000000); // Transparent black. + m_pPixmap.reset(new QPixmap(renderer.defaultSize())); + QPainter painter(©_buffer); + renderer.render(&painter); + m_pPixmap->convertFromImage(copy_buffer); + } else { + qWarning() << "Error, unknown drawing mode!"; + } } else { m_pPixmap.reset(new QPixmap(fileName)); } @@ -85,8 +112,15 @@ void Paintable::draw(const QRectF& targetRect, QPainter* pPainter) { } if (!m_pPixmap.isNull() && !m_pPixmap->isNull()) { - pPainter->drawPixmap(targetRect, *m_pPixmap, m_pPixmap->rect()); + if (m_draw_mode == Paintable::STRETCH) { + pPainter->drawPixmap(targetRect, *m_pPixmap, m_pPixmap->rect()); + } else if (m_draw_mode == Paintable::TILE) { + pPainter->drawTiledPixmap(targetRect, *m_pPixmap, QPoint(0,0)); + } } else if (!m_pSvg.isNull() && m_pSvg->isValid()) { + if (m_draw_mode == Paintable::TILE) { + qWarning() << "Tiled SVG should have been rendered to pixmap!"; + } m_pSvg->render(pPainter, targetRect); } } @@ -143,7 +177,8 @@ void Paintable::resizeSvgPixmap(const QRectF& targetRect, } // static -PaintablePointer WPixmapStore::getPaintable(const QString& fileName) { +PaintablePointer WPixmapStore::getPaintable(const QString& fileName, + Paintable::DrawMode mode) { // See if we have a cached value for the pixmap. PaintablePointer pPaintable = m_paintableCache.value(fileName, PaintablePointer()); if (pPaintable) { @@ -155,9 +190,9 @@ PaintablePointer WPixmapStore::getPaintable(const QString& fileName) { if (m_loader) { QImage* pImage = m_loader->getImage(fileName); - pPaintable = PaintablePointer(new Paintable(pImage)); + pPaintable = PaintablePointer(new Paintable(pImage, mode)); } else { - pPaintable = PaintablePointer(new Paintable(fileName)); + pPaintable = PaintablePointer(new Paintable(fileName, mode)); } if (pPaintable.isNull() || pPaintable->isNull()) { diff --git a/src/widget/wpixmapstore.h b/src/widget/wpixmapstore.h index 8b8207e3e1..6744a307b2 100644 --- a/src/widget/wpixmapstore.h +++ b/src/widget/wpixmapstore.h @@ -29,13 +29,20 @@ #include "skin/imgsource.h" +class QString; + // Wrapper around QImage and QSvgRenderer to support rendering SVG images in // high fidelity. class Paintable { public: + enum DrawMode { + STRETCH, + TILE + }; + // Takes ownership of QImage. - Paintable(QImage* pImage); - Paintable(const QString& fileName); + Paintable(QImage* pImage, DrawMode mode); + Paintable(const QString& fileName, DrawMode mode); QSize size() const; int width() const; @@ -48,6 +55,7 @@ class Paintable { void draw(const QRectF& targetRect, QPainter* pPainter, const QRectF& sourceRect); bool isNull() const; + static DrawMode DrawModeFromString(QString str); private: void resizeSvgPixmap(const QRectF& targetRect, const QRectF& sourceRect); @@ -55,6 +63,7 @@ class Paintable { QScopedPointer<QPixmap> m_pPixmap; QScopedPointer<QSvgRenderer> m_pSvg; QScopedPointer<QPixmap> m_pPixmapSvg; + DrawMode m_draw_mode; }; typedef QSharedPointer<Paintable> PaintablePointer; @@ -62,7 +71,8 @@ typedef QWeakPointer<Paintable> WeakPaintablePointer; class WPixmapStore { public: - static PaintablePointer getPaintable(const QString& fileName); + static PaintablePointer getPaintable(const QString& fileName, + Paintable::DrawMode mode); static QPixmap* getPixmapNoCache(const QString& fileName); static void setLoader(QSharedPointer<ImgSource> ld); diff --git a/src/widget/wpushbutton.cpp b/src/widget/wpushbutton.cpp index 23b78e7052..cdbfae366d 100644 --- a/src/widget/wpushbutton.cpp +++ b/src/widget/wpushbutton.cpp @@ -58,7 +58,10 @@ void WPushButton::setup(QDomNode node, const SkinContext& context) { // Set background pixmap if available if (context.hasNode(node, "BackPath")) { - setPixmapBackground(context.getSkinPath(context.selectString(node, "BackPath"))); + QString mode_str = context.selectAttributeString( + context.selectElement(node, "BackPath"), "scalemode", "TILE"); + setPixmapBackground(context.getSkinPath(context.selectString(node, "BackPath")), + Paintable::DrawModeFromString(mode_str)); } // Load pixmaps for associated states @@ -188,7 +191,8 @@ void WPushButton::setPixmap(int iState, bool bPressed, const QString &filename) return; } - PaintablePointer pPixmap = WPixmapStore::getPaintable(filename); + PaintablePointer pPixmap = WPixmapStore::getPaintable(filename, + Paintable::STRETCH); if (pPixmap.isNull() || pPixmap->isNull()) { qDebug() << "WPushButton: Error loading pixmap:" << filename; @@ -199,9 +203,10 @@ void WPushButton::setPixmap(int iState, bool bPressed, const QString &filename) pixmaps.replace(iState, pPixmap); } -void WPushButton::setPixmapBackground(const QString &filename) { +void WPushButton::setPixmapBackground(const QString &filename, + Paintable::DrawMode mode) { // Load background pixmap - m_pPixmapBack = WPixmapStore::getPaintable(filename); + m_pPixmapBack = WPixmapStore::getPaintable(filename, mode); if (m_pPixmapBack.isNull() || m_pPixmapBack->isNull()) { qDebug() << "WPushButton: Error loading background pixmap:" << filename; } diff --git a/src/widget/wpushbutton.h b/src/widget/wpushbutton.h index 52aeead901..f74a24a42b 100644 --- a/src/widget/wpushbutton.h +++ b/src/widget/wpushbutton.h @@ -70,7 +70,7 @@ class WPushButton : public WWidget { // Associates a background pixmap with the widget. This is only needed if // the button pixmaps contains alpha channel values. - void setPixmapBackground(const QString &filename); + void setPixmapBackground(const QString &filename, Paintable::DrawMode mode); // True, if the button is currently pressed bool m_bPressed; diff --git a/src/widget/wslidercomposed.cpp b/src/widget/wslidercomposed.cpp index 4672c9f3d6..64423ee65e 100644 --- a/src/widget/wslidercomposed.cpp +++ b/src/widget/wslidercomposed.cpp @@ -65,7 +65,8 @@ void WSliderComposed::setup(QDomNode node, const SkinContext& context) { } void WSliderComposed::setSliderPixmap(const QString& filenameSlider) { - m_pSlider = WPixmapStore::getPaintable(filenameSlider); + m_pSlider = WPixmapStore::getPaintable(filenameSlider, + Paintable::STRETCH); if (!m_pSlider) { qDebug() << "WSliderComposed: Error loading slider pixmap:" << filenameSlider; } else { @@ -76,7 +77,8 @@ void WSliderComposed::setSliderPixmap(const QString& filenameSlider) { void WSliderComposed::setHandlePixmap(bool bHorizontal, const QString& filenameHandle) { m_bHorizontal = bHorizontal; - m_pHandle = WPixmapStore::getPaintable(filenameHandle); + m_pHandle = WPixmapStore::getPaintable(filenameHandle, + Paintable::STRETCH); if (!m_pHandle) { qDebug() << "WSliderComposed: Error loading handle pixmap:" << filenameHandle; } else { @@ -127,7 +129,7 @@ void WSliderComposed::mouseMoveEvent(QMouseEvent * e) { // Emit valueChanged signal if (m_bEventWhileDrag) { - setControlParameter(newValue); + setControlParameterUp(newValue); } // Update display diff --git a/src/widget/wslidercomposed.h b/src/widget/wslidercomposed.h index c42de7afda..0ca1f8b615 100644 --- a/src/widget/wslidercomposed.h +++ b/src/widget/wslidercomposed.h @@ -45,6 +45,7 @@ class WSliderComposed : public WWidget { void setSliderPixmap(const QString& filenameSlider); void setHandlePixmap(bool bHorizontal, const QString& filenameHandle); inline bool isHorizontal() const { return m_bHorizontal; }; + public slots: void onConnectedControlValueChanged(double); void fillDebugTooltip(QStringList* debug); diff --git a/src/widget/wstatuslight.cpp b/src/widget/wstatuslight.cpp index 829ecd8636..0585826685 100644 --- a/src/widget/wstatuslight.cpp +++ b/src/widget/wstatuslight.cpp @@ -47,6 +47,16 @@ void WStatusLight::setNoPos(int iNoPos) { m_pixmaps.resize(iNoPos); } +WStatusLight::SizeMode WStatusLight::SizeModeFromString(QString str) { + if (str.toUpper() == "FIXED" ) { + return FIXED; + } else if (str.toUpper() == "RESIZE") { + return RESIZE; + } + qWarning() << "Unknown status light size mode " << str << ", using FIXED"; + return FIXED; +} + void WStatusLight::setup(QDomNode node, const SkinContext& context) { // Number of states. Add one to account for the background. setNoPos(context.selectInt(node, "NumberPos") + 1); @@ -56,29 +66,50 @@ void WStatusLight::setup(QDomNode node, const SkinContext& context) { // Accept either PathStatusLight or PathStatusLight1 for value 1, QString nodeName = QString("PathStatusLight%1").arg(i); if (context.hasNode(node, nodeName)) { - setPixmap(i, context.getSkinPath(context.selectString(node, nodeName))); + QString mode = context.selectAttributeString( + context.selectElement(node, nodeName), "sizemode", "FIXED"); + setPixmap(i, context.getSkinPath(context.selectString(node, nodeName)), + SizeModeFromString(mode)); } else if (i == 0 && context.hasNode(node, "PathBack")) { - setPixmap(i, context.getSkinPath(context.selectString(node, "PathBack"))); + QString mode = context.selectAttributeString( + context.selectElement(node, "PathBack"), "sizemode", "FIXED"); + setPixmap(i, context.getSkinPath(context.selectString(node, "PathBack")), + SizeModeFromString(mode)); } else if (i == 1 && context.hasNode(node, "PathStatusLight")) { - setPixmap(i, context.getSkinPath(context.selectString(node, "PathStatusLight"))); + QString mode = context.selectAttributeString( + context.selectElement(node, "PathStatusLight"), "sizemode", "FIXED"); + setPixmap(i, context.getSkinPath(context.selectString(node, "PathStatusLight")), + SizeModeFromString(mode)); } else { m_pixmaps[i].clear(); } } } -void WStatusLight::setPixmap(int iState, const QString& filename) { +void WStatusLight::setPixmap(int iState, const QString& filename, SizeMode mode) { if (iState < 0 || iState >= m_pixmaps.size()) { return; } - PaintablePointer pPixmap = WPixmapStore::getPaintable(filename); + PaintablePointer pPixmap = WPixmapStore::getPaintable(filename, + Paintable::STRETCH); if (!pPixmap.isNull() && !pPixmap->isNull()) { m_pixmaps[iState] = pPixmap; - // Set size of widget equal to pixmap size - setFixedSize(pPixmap->size()); + switch (mode) { + case RESIZE: + // Allow the pixmap to stretch or tile. + setBaseSize(pPixmap->size()); + break; + case FIXED: + // Set size of widget equal to pixmap size + setFixedSize(pPixmap->size()); + break; + default: + setFixedSize(pPixmap->size()); + break; + } } else { qDebug() << "WStatusLight: Error loading pixmap:" &l |