don't allow the vst window to take up more space than the screen size

This commit is contained in:
Roman Pudashkin 2023-04-07 19:56:36 +03:00
parent 77fa4c72b2
commit 40ee677f90
6 changed files with 35 additions and 27 deletions

View file

@ -25,6 +25,7 @@
#include <QWindow>
#include <QTimer>
#include <QKeyEvent>
#include <QScreen>
#include "vsttypes.h"
#include "internal/vstplugin.h"
@ -54,7 +55,6 @@ AbstractVstEditorView::AbstractVstEditorView(QWidget* parent)
: TopLevelDialog(parent)
{
setAttribute(Qt::WA_NativeWindow);
m_scalingFactor = uiConfig()->guiScaling();
}
AbstractVstEditorView::~AbstractVstEditorView()
@ -81,14 +81,25 @@ tresult AbstractVstEditorView::resizeView(IPlugView* view, ViewRect* newSize)
{
view->checkSizeConstraint(newSize);
QScreen* screen = this->screen();
QSize availableSize = screen->availableSize();
int newWidth = newSize->getWidth();
int newHeight = newSize->getHeight();
//! NOTE: newSize already includes the UI scaling on Windows, so we have to remove it before setting the fixed size.
//! Otherwise, the user will get an extremely large window and won't be able to resize it
#ifdef Q_OS_WIN
setFixedSize(newSize->getWidth() / m_scalingFactor, newSize->getHeight() / m_scalingFactor);
#else
setFixedSize(newSize->getWidth(), newSize->getHeight());
qreal scaling = screen->devicePixelRatio();
newWidth = newWidth / scaling;
newHeight = newHeight / scaling;
#endif
newWidth = std::min(newWidth, availableSize.width());
newHeight = std::min(newHeight, availableSize.height());
setFixedSize(newWidth, newHeight);
view->onSize(newSize);
update();
@ -138,24 +149,31 @@ void AbstractVstEditorView::attachView(VstPluginPtr pluginPtr)
return;
}
FUnknownPtr<IPluginContentScaleHandler> scalingHandler(m_view);
if (scalingHandler) {
scalingHandler->setContentScaleFactor(m_scalingFactor);
}
connect(windowHandle(), &QWindow::screenChanged, this, [this](QScreen*) {
updateViewGeometry();
});
QTimer::singleShot(0, [this]() {
setupWindowGeometry();
updateViewGeometry();
moveViewToMainWindowCenter();
});
}
void AbstractVstEditorView::setupWindowGeometry()
void AbstractVstEditorView::updateViewGeometry()
{
IF_ASSERT_FAILED(m_view) {
return;
}
FUnknownPtr<IPluginContentScaleHandler> scalingHandler(m_view);
if (scalingHandler) {
scalingHandler->setContentScaleFactor(screen()->devicePixelRatio());
}
ViewRect size;
m_view->getSize(&size);
resizeView(m_view, &size);
moveViewToMainWindowCenter();
}
void AbstractVstEditorView::moveViewToMainWindowCenter()
@ -221,6 +239,7 @@ void AbstractVstEditorView::setTrackId(int newTrackId)
if (m_trackId == newTrackId) {
return;
}
m_trackId = newTrackId;
emit trackIdChanged();
@ -239,6 +258,7 @@ void AbstractVstEditorView::setResourceId(const QString& newResourceId)
if (m_resourceId == newResourceId) {
return;
}
m_resourceId = newResourceId;
emit resourceIdChanged();

View file

@ -28,7 +28,6 @@
#include "modularity/ioc.h"
#include "ivstpluginsregister.h"
#include "ui/iuiconfiguration.h"
class QWidget;
@ -43,7 +42,6 @@ class AbstractVstEditorView : public uicomponents::TopLevelDialog, public Steinb
Q_PROPERTY(QString resourceId READ resourceId WRITE setResourceId NOTIFY resourceIdChanged)
INJECT(vst, IVstPluginsRegister, pluginsRegister)
INJECT(vst, ui::IUiConfiguration, uiConfig)
public:
AbstractVstEditorView(QWidget* parent = nullptr);
@ -70,7 +68,7 @@ protected:
private:
void attachView(VstPluginPtr pluginPtr);
void setupWindowGeometry();
void updateViewGeometry();
void moveViewToMainWindowCenter();
void showEvent(QShowEvent* ev) override;
@ -87,8 +85,6 @@ private:
audio::TrackId m_trackId = -1;
QString m_resourceId;
audio::AudioFxChainOrder m_chainOrder = -1;
double m_scalingFactor = 0.0;
};
}

View file

@ -22,11 +22,7 @@
#include "vstfxeditorview.h"
#include "vsttypes.h"
#include "internal/vstplugin.h"
using namespace mu::vst;
using namespace Steinberg;
VstFxEditorView::VstFxEditorView(QWidget* parent)
: AbstractVstEditorView(parent)

View file

@ -23,7 +23,7 @@
#ifndef MU_VST_VSTFXEDITORVIEW_H
#define MU_VST_VSTFXEDITORVIEW_H
#include "vstieditorview.h"
#include "abstractvsteditorview.h"
namespace mu::vst {
class VstFxEditorView : public AbstractVstEditorView

View file

@ -22,11 +22,7 @@
#include "vstieditorview.h"
#include "vsttypes.h"
#include "internal/vstplugin.h"
using namespace mu::vst;
using namespace Steinberg;
VstiEditorView::VstiEditorView(QWidget* parent)
: AbstractVstEditorView(parent)

View file

@ -41,4 +41,4 @@ private:
Q_DECLARE_METATYPE(mu::vst::VstiEditorView)
#endif // VSTIEDITORVIEW_H
#endif // MU_VST_VSTIEDITORVIEW_H