From 033287e8108f9a605b0b01aa31c10ea52c3056af Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 30 Aug 2019 00:43:24 +1000 Subject: [PATCH] created viewer sizer objects --- app/widget/viewer/CMakeLists.txt | 2 + app/widget/viewer/viewersizer.cpp | 69 +++++++++++++++++++++++++++++++ app/widget/viewer/viewersizer.h | 54 ++++++++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 app/widget/viewer/viewersizer.cpp create mode 100644 app/widget/viewer/viewersizer.h diff --git a/app/widget/viewer/CMakeLists.txt b/app/widget/viewer/CMakeLists.txt index 32035e424..10267b43d 100644 --- a/app/widget/viewer/CMakeLists.txt +++ b/app/widget/viewer/CMakeLists.txt @@ -20,5 +20,7 @@ set(OLIVE_SOURCES widget/viewer/viewer.cpp widget/viewer/viewerglwidget.h widget/viewer/viewerglwidget.cpp + widget/viewer/viewersizer.h + widget/viewer/viewersizer.cpp PARENT_SCOPE ) diff --git a/app/widget/viewer/viewersizer.cpp b/app/widget/viewer/viewersizer.cpp new file mode 100644 index 000000000..cb2bd1e8c --- /dev/null +++ b/app/widget/viewer/viewersizer.cpp @@ -0,0 +1,69 @@ +#include "viewersizer.h" + +ViewerSizer::ViewerSizer(QWidget *parent) : + QWidget(parent), + widget_(nullptr), + aspect_ratio_(0) +{ +} + +void ViewerSizer::SetWidget(QWidget *widget) +{ + if (widget_ != nullptr) { + widget_->setParent(nullptr); + + disconnect(widget_, SIGNAL(SizeChanged(int, int)), this, SLOT(SizeChangedSlot(int, int))); + } + + widget_ = widget; + + if (widget_ != nullptr) { + widget_->setParent(this); + + connect(widget_, SIGNAL(SizeChanged(int, int)), this, SLOT(SizeChangedSlot(int, int))); + + UpdateSize(); + } +} + +void ViewerSizer::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + + UpdateSize(); +} + +void ViewerSizer::UpdateSize() +{ + if (widget_ == nullptr) { + return; + } + + if (qIsNull(aspect_ratio_)) { + widget_->setVisible(false); + return; + } + + widget_->setVisible(true); + + double our_aspect_ratio = static_cast(width()) / static_cast(height()); + + QSize child_size = size(); + + if (our_aspect_ratio > aspect_ratio_) { + // This container is wider than the image, scale by height + child_size.setWidth(qRound(child_size.height() * aspect_ratio_)); + } else { + // This container is taller than the image, scale by width + child_size.setHeight(qRound(child_size.width() / aspect_ratio_)); + } + + widget_->resize(child_size); +} + +void ViewerSizer::SizeChangedSlot(int width, int height) +{ + aspect_ratio_ = static_cast(width) / static_cast(height); + + UpdateSize(); +} diff --git a/app/widget/viewer/viewersizer.h b/app/widget/viewer/viewersizer.h new file mode 100644 index 000000000..a5aa6e3ad --- /dev/null +++ b/app/widget/viewer/viewersizer.h @@ -0,0 +1,54 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef VIEWERSIZER_H +#define VIEWERSIZER_H + +#include + +class ViewerSizer : public QWidget +{ + Q_OBJECT +public: + ViewerSizer(QWidget* parent = nullptr); + + /** + * @brief Set the widget to be adjusted by this widget + * + * ViewerSizer takes ownership of this widget + */ + void SetWidget(QWidget* widget); + +protected: + virtual void resizeEvent(QResizeEvent *event) override; + +private: + void UpdateSize(); + + QWidget* widget_; + + double aspect_ratio_; + +private slots: + void SizeChangedSlot(int width, int height); + +}; + +#endif // VIEWERSIZER_H