summaryrefslogtreecommitdiffstats
path: root/src/waveform
diff options
context:
space:
mode:
authorJosepMaJAZ <josepma@gmail.com>2020-04-11 16:08:06 +0200
committerJosepMaJAZ <josepma@gmail.com>2020-04-11 16:08:06 +0200
commit9196868a3599dc709bca7a10bf757c7fcc3eef34 (patch)
treef231705a0fc43108f09fb3396e88021a75c68ea9 /src/waveform
parent35a6a1316fbf2fd9e577f3e75166307974047500 (diff)
Bugfix for GL waveforms with QT 5.14 on Windows.
Diffstat (limited to 'src/waveform')
-rw-r--r--src/waveform/waveformwidgetfactory.cpp78
-rw-r--r--src/waveform/waveformwidgetfactory.h24
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;