diff options
author | JosepMaJAZ <josepma@gmail.com> | 2020-04-11 16:08:06 +0200 |
---|---|---|
committer | JosepMaJAZ <josepma@gmail.com> | 2020-04-11 16:08:06 +0200 |
commit | 9196868a3599dc709bca7a10bf757c7fcc3eef34 (patch) | |
tree | f231705a0fc43108f09fb3396e88021a75c68ea9 /src/waveform | |
parent | 35a6a1316fbf2fd9e577f3e75166307974047500 (diff) |
Bugfix for GL waveforms with QT 5.14 on Windows.
Diffstat (limited to 'src/waveform')
-rw-r--r-- | src/waveform/waveformwidgetfactory.cpp | 78 | ||||
-rw-r--r-- | src/waveform/waveformwidgetfactory.h | 24 |
2 files changed, 82 insertions, 20 deletions
diff --git a/src/waveform/waveformwidgetfactory.cpp b/src/waveform/waveformwidgetfactory.cpp index 5dade621b9..571a8f7dad 100644 --- a/src/waveform/waveformwidgetfactory.cpp +++ b/src/waveform/waveformwidgetfactory.cpp @@ -95,7 +95,10 @@ WaveformWidgetHolder::WaveformWidgetHolder(WaveformWidgetAbstract* waveformWidge /////////////////////////////////////////// WaveformWidgetFactory::WaveformWidgetFactory() - : m_type(WaveformWidgetType::Count_WaveformwidgetType), + // Set an empty waveform initially. We will set the correct one when skin load finishes. + // Concretely, we want to set a non-GL waveform when loading the skin so that the window + // loads correctly. + : m_type(WaveformWidgetType::EmptyWaveform), m_config(0), m_skipRender(false), m_frameRate(30), @@ -311,8 +314,10 @@ bool WaveformWidgetFactory::setConfig(UserSettingsPointer config) { WaveformWidgetType::Type type = static_cast<WaveformWidgetType::Type>( m_config->getValueString(ConfigKey("[Waveform]","WaveformType")).toInt(&ok)); - if (!ok || !setWidgetType(type)) { - setWidgetType(autoChooseWidgetType()); + // Store the widget type on m_configType for later initialization. + // We will initialize the objects later because of a problem with GL on QT 5.14.2 on Windows + if (!ok || !setWidgetType(type, m_configType)) { + setWidgetType(autoChooseWidgetType(), m_configType); } for (int i = 0; i < FilterCount; i++) { @@ -359,6 +364,16 @@ void WaveformWidgetFactory::addTimerListener(QWidget* pWidget) { Qt::DirectConnection); } + +void WaveformWidgetFactory::onSkinLoadFinished() { + // This regenerates twice the waveforms because of a bug found on Windows + // where the first one fails. + // The problem is that the window of the widget thinks that it is not exposed. + // (https://doc.qt.io/qt-5/qwindow.html#exposeEvent ) + setWidgetTypeFromConfig(); + setWidgetTypeFromConfig(); +} + bool WaveformWidgetFactory::setWaveformWidget(WWaveformViewer* viewer, const QDomElement& node, const SkinContext& parentContext) { @@ -390,6 +405,8 @@ bool WaveformWidgetFactory::setWaveformWidget(WWaveformViewer* viewer, viewer->setZoom(m_defaultZoom); viewer->setDisplayBeatGridAlpha(m_beatGridAlpha); viewer->setPlayMarkerPosition(m_playMarkerPosition); + waveformWidget->resize(viewer->width(), viewer->height()); + waveformWidget->getWidget()->show(); viewer->update(); qDebug() << "WaveformWidgetFactory::setWaveformWidget - waveform widget added in factory, index" << index; @@ -430,31 +447,40 @@ int WaveformWidgetFactory::getVSyncType() { } bool WaveformWidgetFactory::setWidgetType(WaveformWidgetType::Type type) { - if (type == m_type) + return setWidgetType(type, m_type); +} +bool WaveformWidgetFactory::setWidgetType(WaveformWidgetType::Type type, WaveformWidgetType::Type& currentType) { + if (type == currentType) return true; // check if type is acceptable - for (int i = 0; i < m_waveformWidgetHandles.size(); i++) { - WaveformWidgetAbstractHandle& handle = m_waveformWidgetHandles[i]; - if (handle.m_type == type) { - // type is acceptable - m_type = type; - if (m_config) { - m_config->set(ConfigKey("[Waveform]","WaveformType"), ConfigValue((int)m_type)); - } - return true; + int index = findHandleIndexFromType(type); + if (index > -1) { + // type is acceptable + currentType = type; + if (m_config) { + m_config->set(ConfigKey("[Waveform]", "WaveformType"), ConfigValue((int)(currentType))); } + return true; } // fallback - m_type = WaveformWidgetType::EmptyWaveform; + currentType = WaveformWidgetType::EmptyWaveform; if (m_config) { - m_config->set(ConfigKey("[Waveform]","WaveformType"), ConfigValue((int)m_type)); + m_config->set(ConfigKey("[Waveform]", "WaveformType"), ConfigValue((int)(currentType))); } return false; } -bool WaveformWidgetFactory::setWidgetTypeFromHandle(int handleIndex) { +bool WaveformWidgetFactory::setWidgetTypeFromConfig() { + int empty = findHandleIndexFromType(WaveformWidgetType::EmptyWaveform); + int desired = findHandleIndexFromType(m_configType); + if (desired == -1) { + desired = empty; + } + return setWidgetTypeFromHandle(desired, true); +} +bool WaveformWidgetFactory::setWidgetTypeFromHandle(int handleIndex, bool force) { if (handleIndex < 0 || handleIndex >= (int)m_waveformWidgetHandles.size()) { qDebug() << "WaveformWidgetFactory::setWidgetType - invalid handle --> use of 'EmptyWaveform'"; // fallback empty type @@ -463,7 +489,7 @@ bool WaveformWidgetFactory::setWidgetTypeFromHandle(int handleIndex) { } WaveformWidgetAbstractHandle& handle = m_waveformWidgetHandles[handleIndex]; - if (handle.m_type == m_type) { + if (handle.m_type == m_type && !force) { qDebug() << "WaveformWidgetFactory::setWidgetType - type already in use"; return true; } @@ -973,3 +999,21 @@ void WaveformWidgetFactory::startVSync(GuiTick* pGuiTick, VisualsManager* pVisua void WaveformWidgetFactory::getAvailableVSyncTypes(QList<QPair<int, QString > >* pList) { m_vsyncThread->getAvailableVSyncTypes(pList); } + +WaveformWidgetType::Type WaveformWidgetFactory::findTypeFromHandleIndex(int index) { + WaveformWidgetType::Type type = WaveformWidgetType::Count_WaveformwidgetType; + if (index >= 0 && index < (int)m_waveformWidgetHandles.size()) { + type = m_waveformWidgetHandles[index].m_type; + } + return type; +} +int WaveformWidgetFactory::findHandleIndexFromType(WaveformWidgetType::Type type) { + int index = -1; + for (int i = 0; i < m_waveformWidgetHandles.size(); i++) { + WaveformWidgetAbstractHandle& handle = m_waveformWidgetHandles[i]; + if (handle.m_type == type) { + index = i; + } + } + return index; +} diff --git a/src/waveform/waveformwidgetfactory.h b/src/waveform/waveformwidgetfactory.h index ad00e02c32..0ab967ea46 100644 --- a/src/waveform/waveformwidgetfactory.h +++ b/src/waveform/waveformwidgetfactory.h @@ -64,8 +64,9 @@ class WaveformWidgetFactory : public QObject, public Singleton<WaveformWidgetFac bool setConfig(UserSettingsPointer config); - //creates the waveform widget and bind it to the viewer - //clean-up every thing if needed + // creates the waveform widget using the type set with setWidgetType + // and binds it to the viewer. + // deletes older widget and resets positions to config defaults bool setWaveformWidget( WWaveformViewer* viewer, const QDomElement &node, @@ -83,10 +84,20 @@ class WaveformWidgetFactory : public QObject, public Singleton<WaveformWidgetFac bool isOpenGlShaderAvailable() const { return m_openGLShaderAvailable;} + // Sets the widget type and saves it to configuration. + // Returns false and sets EmtpyWaveform if type is invalid bool setWidgetType(WaveformWidgetType::Type type); - bool setWidgetTypeFromHandle(int handleIndex); + // Changes the widged type to that loaded from config and recreates them. + // Used as a workaround on Windows due to a problem with GL and QT 5.14.2 + bool setWidgetTypeFromConfig(); + // Changes the widget type and recreates them. Used from the pref. dialog + bool setWidgetTypeFromHandle(int handleIndex, bool force = false); WaveformWidgetType::Type getType() const { return m_type;} + protected: + bool setWidgetType(WaveformWidgetType::Type type, WaveformWidgetType::Type& currentType); + + public: void setDefaultZoom(double zoom); double getDefaultZoom() const { return m_defaultZoom;} @@ -125,6 +136,9 @@ class WaveformWidgetFactory : public QObject, public Singleton<WaveformWidgetFac void renderSpinnies(VSyncThread*); void swapSpinnies(); + public slots: + void onSkinLoadFinished(); + protected: WaveformWidgetFactory(); virtual ~WaveformWidgetFactory(); @@ -140,6 +154,9 @@ class WaveformWidgetFactory : public QObject, public Singleton<WaveformWidgetFac WaveformWidgetAbstract* createWaveformWidget(WaveformWidgetType::Type type, WWaveformViewer* viewer); int findIndexOf(WWaveformViewer* viewer) const; + WaveformWidgetType::Type findTypeFromHandleIndex(int index); + int findHandleIndexFromType(WaveformWidgetType::Type type); + //All type of available widgets QVector<WaveformWidgetAbstractHandle> m_waveformWidgetHandles; @@ -148,6 +165,7 @@ class WaveformWidgetFactory : public QObject, public Singleton<WaveformWidgetFac std::vector<WaveformWidgetHolder> m_waveformWidgetHolders; WaveformWidgetType::Type m_type; + WaveformWidgetType::Type m_configType; UserSettingsPointer m_config; |