Skip to content

Commit

Permalink
In the process of re-working the view plugin center a bit (part 1)
Browse files Browse the repository at this point in the history
  • Loading branch information
ThomasKroes committed Sep 19, 2024
1 parent cd6be62 commit 653bc3f
Show file tree
Hide file tree
Showing 2 changed files with 134 additions and 48 deletions.
144 changes: 110 additions & 34 deletions ManiVault/src/widgets/ViewPluginLearningCenterOverlayWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,39 @@ ViewPluginLearningCenterOverlayWidget::ViewPluginLearningCenterOverlayWidget(QWi
OverlayWidget(target),
_viewPlugin(viewPlugin),
_alignment(alignment),
_toolbarWidget(viewPlugin, this)
_toolbarsLayout(nullptr),
_settingsToolbarWidget(viewPlugin, this, alignment),
_actionsToolbarWidget(viewPlugin, this, alignment)
{
Q_ASSERT(target);

if (!target)
return;

addMouseEventReceiverWidget(&_toolbarWidget);
addMouseEventReceiverWidget(&_actionsToolbarWidget);

_layout.setAlignment(_alignment);

_layout.addWidget(&_toolbarWidget);
if (alignment & Qt::AlignLeft || alignment & Qt::AlignRight)
_toolbarsLayout = new QVBoxLayout();

if (alignment & Qt::AlignTop || alignment & Qt::AlignVCenter || alignment & Qt::AlignBottom)
_toolbarsLayout = new QHBoxLayout();

_settingsToolbarWidget.addWidget(new VisibleToolbarItemWidget(viewPlugin, this));

_actionsToolbarWidget.addWidget(new VideosToolbarItemWidget(viewPlugin, this));
_actionsToolbarWidget.addWidget(new DescriptionToolbarItemWidget(viewPlugin, this));
_actionsToolbarWidget.addWidget(new ShortcutsToolbarItemWidget(viewPlugin, this));
_actionsToolbarWidget.addWidget(new ShowDocumentationToolbarItemWidget(viewPlugin, this));
_actionsToolbarWidget.addWidget(new VisitGithubRepoToolbarItemWidget(viewPlugin, this));
_actionsToolbarWidget.addWidget(new ToLearningCenterToolbarItemWidget(viewPlugin, this));

_toolbarsLayout->addWidget(&_settingsToolbarWidget);
_toolbarsLayout->addStretch(1);
_toolbarsLayout->addWidget(&_actionsToolbarWidget);

_layout.addLayout(_toolbarsLayout);

setLayout(&_layout);

Expand Down Expand Up @@ -69,6 +90,8 @@ ViewPluginLearningCenterOverlayWidget::AbstractToolbarItemWidget::AbstractToolba
{
setObjectName("ToolbarItemWidget");

//_overlayWidget->addMouseEventReceiverWidget(this);

_iconLabel.setAlignment(Qt::AlignCenter);

constexpr auto margin = 3;
Expand Down Expand Up @@ -401,49 +424,107 @@ bool ViewPluginLearningCenterOverlayWidget::ToLearningCenterToolbarItemWidget::s
return true;
}

ViewPluginLearningCenterOverlayWidget::ToolbarWidget::ToolbarWidget(const plugin::ViewPlugin* viewPlugin, OverlayWidget* overlayWidget) :
ViewPluginLearningCenterOverlayWidget::ToolbarWidget::ToolbarWidget(const plugin::ViewPlugin* viewPlugin, OverlayWidget* overlayWidget, const Qt::Alignment& alignment) :
QWidget(overlayWidget),
_viewPlugin(viewPlugin),
_overlayWidget(overlayWidget)
_overlayWidget(overlayWidget),
_layout(nullptr)
{
setObjectName("ToolbarWidget");
setMouseTracking(true);
setToolTip(QString("%1 learning center").arg(viewPlugin->getKind()));
setAttribute(Qt::WA_TransparentForMouseEvents, false);

_layout.setSpacing(0);
try {
Q_ASSERT(_viewPlugin && _overlayWidget);

_layout.addWidget(new VisibleToolbarItemWidget(viewPlugin, overlayWidget));
_layout.addStretch(1);
_layout.addWidget(new VideosToolbarItemWidget(viewPlugin, overlayWidget));
_layout.addWidget(new DescriptionToolbarItemWidget(viewPlugin, overlayWidget));
_layout.addWidget(new ShortcutsToolbarItemWidget(viewPlugin, overlayWidget));
_layout.addWidget(new ShowDocumentationToolbarItemWidget(viewPlugin, overlayWidget));
_layout.addWidget(new VisitGithubRepoToolbarItemWidget(viewPlugin, overlayWidget));
_layout.addWidget(new ToLearningCenterToolbarItemWidget(viewPlugin, overlayWidget));
if (!_viewPlugin)
throw std::runtime_error("View plugin is a nullptr");

setLayout(&_layout);
if (!_overlayWidget)
throw std::runtime_error("Overlay widget is a nullptr");

setContentsMargins(8);
static const std::vector<Qt::Alignment> supportedAlignments{
Qt::AlignTop,
Qt::AlignBottom,
Qt::AlignBottom,
Qt::AlignRight
};

const auto installEventFilterOnTargetWidget = [this](QWidget* previousTargetWidget, QWidget* currentTargetWidget) -> void {
Q_ASSERT(currentTargetWidget);
if (std::find(supportedAlignments.begin(), supportedAlignments.end(), alignment) == supportedAlignments.end())
throw std::runtime_error("Supported toolbar alignment options are: Qt::AlignTop, Qt::AlignBottom, Qt::AlignLeft and Qt::AlignRight");

if (!currentTargetWidget)
return;
if (alignment & Qt::AlignLeft || alignment & Qt::AlignRight)
_layout = new QVBoxLayout(this);

if (previousTargetWidget)
previousTargetWidget->removeEventFilter(this);
if (alignment & Qt::AlignTop || alignment & Qt::AlignVCenter || alignment & Qt::AlignBottom)
_layout = new QHBoxLayout(this);

currentTargetWidget->installEventFilter(this);
};
_layout->setSpacing(0);

installEventFilterOnTargetWidget(nullptr, _overlayWidget->getWidgetOverlayer().getTargetWidget());
setLayout(_layout);

connect(&_overlayWidget->getWidgetOverlayer(), &WidgetOverlayer::targetWidgetChanged, this, installEventFilterOnTargetWidget);
const auto setContentsMargins = [this](std::int32_t margin) -> void {
_layout->setContentsMargins(margin, margin, margin, margin);
};

setContentsMargins(8);

const auto installEventFilterOnTargetWidget = [this](QWidget* previousTargetWidget, QWidget* currentTargetWidget) -> void {
Q_ASSERT(currentTargetWidget);

if (!currentTargetWidget)
return;

if (previousTargetWidget)
previousTargetWidget->removeEventFilter(this);

currentTargetWidget->installEventFilter(this);
};

installEventFilterOnTargetWidget(nullptr, _overlayWidget->getWidgetOverlayer().getTargetWidget());

connect(&_overlayWidget->getWidgetOverlayer(), &WidgetOverlayer::targetWidgetChanged, this, installEventFilterOnTargetWidget);

const auto updateTransparentForMouseEvents = [this]() -> void {
setAttribute(Qt::WA_TransparentForMouseEvents, !_viewPlugin->getLearningCenterAction().getViewPluginOverlayVisibleAction().isChecked());
};

updateTransparentForMouseEvents();

connect(&_viewPlugin->getLearningCenterAction().getViewPluginOverlayVisibleAction(), &ToggleAction::toggled, this, updateTransparentForMouseEvents);
}
catch (std::exception& e)
{
exceptionMessageBox("Unable to initialize ViewPluginLearningCenterOverlayWidget::ToolbarWidget", e);
}
catch (...) {
exceptionMessageBox("Unable to initialize ViewPluginLearningCenterOverlayWidget::ToolbarWidget");
}
}

bool ViewPluginLearningCenterOverlayWidget::ToolbarWidget::eventFilter(QObject* watched, QEvent* event)
void ViewPluginLearningCenterOverlayWidget::ToolbarWidget::addWidget(QWidget* widget)
{
Q_ASSERT(_layout && widget);

try {
if (!_layout)
throw std::runtime_error("No layout present");

if (!widget)
throw std::runtime_error("Supplied wWidget is a nullptr");

_layout->addWidget(widget);
}
catch (std::exception& e)
{
exceptionMessageBox("Unable to add widget to ViewPluginLearningCenterOverlayWidget::ToolbarWidget", e);
}
catch (...) {
exceptionMessageBox("Unable to add widget to ViewPluginLearningCenterOverlayWidget::ToolbarWidget");
}
}

bool ViewPluginLearningCenterOverlayWidget::ToolbarWidget::eventFilter(QObject* target, QEvent* event)
{
switch (event->type())
{
Expand All @@ -457,12 +538,7 @@ bool ViewPluginLearningCenterOverlayWidget::ToolbarWidget::eventFilter(QObject*
break;
}

return QWidget::eventFilter(watched, event);
}

void ViewPluginLearningCenterOverlayWidget::ToolbarWidget::setContentsMargins(std::int32_t margin)
{
_layout.setContentsMargins(margin, margin, margin, margin);
return QWidget::eventFilter(target, event);
}

}
38 changes: 24 additions & 14 deletions ManiVault/src/widgets/ViewPluginLearningCenterOverlayWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -343,9 +343,23 @@ class CORE_EXPORT ViewPluginLearningCenterOverlayWidget : public OverlayWidget

};

/** Toolbar widget to align items horizontally or vertically */
class ToolbarWidget : public QWidget {
public:
ToolbarWidget(const plugin::ViewPlugin* viewPlugin, OverlayWidget* overlayWidget);

/**
* Construct with pointer to \p viewPlugin, parent \p overlayWidget and \p alignment
* @param viewPlugin Pointer to the view plugin
* @param overlayWidget Pointer to parent overlay widget
* @param alignment Item alignment (supported alignment flags: Qt::AlignTop, Qt::AlignBottom, Qt::AlignLeft, Qt::AlignRight)
*/
ToolbarWidget(const plugin::ViewPlugin* viewPlugin, OverlayWidget* overlayWidget, const Qt::Alignment& alignment);

/**
* Add \p widget to the toolbar
* @param widget Pointer to widget to add
*/
void addWidget(QWidget* widget);

private:

Expand All @@ -356,17 +370,10 @@ class CORE_EXPORT ViewPluginLearningCenterOverlayWidget : public OverlayWidget
*/
bool eventFilter(QObject* target, QEvent* event) override;

/**
* Set layout contents margins to { \p margin, \p margin, \p margin, \p margin }
* @param margin Contents margins
*/
void setContentsMargins(std::int32_t margin);

private:
const plugin::ViewPlugin* _viewPlugin; /** Const pointer to source view plugin */
OverlayWidget* _overlayWidget; /** Pointer to owning overlay widget */
QHBoxLayout _layout; /** For alignment of the icon label */
QLabel _iconLabel; /** Icon label */
QBoxLayout* _layout; /** For alignment of items */
};

public:
Expand All @@ -377,7 +384,7 @@ class CORE_EXPORT ViewPluginLearningCenterOverlayWidget : public OverlayWidget
* @param viewPlugin Pointer to the view plugin for which to create the overlay
* @param alignment Alignment w.r.t. to the \p source widget
*/
ViewPluginLearningCenterOverlayWidget(QWidget* target, const plugin::ViewPlugin* viewPlugin, const Qt::Alignment& alignment = Qt::AlignBottom | Qt::AlignRight);
ViewPluginLearningCenterOverlayWidget(QWidget* target, const plugin::ViewPlugin* viewPlugin, const Qt::Alignment& alignment = Qt::AlignBottom);

/**
* Set target widget to \p targetWidget
Expand All @@ -394,10 +401,13 @@ class CORE_EXPORT ViewPluginLearningCenterOverlayWidget : public OverlayWidget
void setContentsMargins(std::int32_t margin);

private:
const plugin::ViewPlugin* _viewPlugin; /** Pointer to the view plugin for which to create the overlay */
const Qt::Alignment& _alignment; /** Alignment w.r.t. to the source widget */
QHBoxLayout _layout; /** For alignment of the learning center popup widget */
ToolbarWidget _toolbarWidget; /** Toolbar widget which contains the actions */
const plugin::ViewPlugin* _viewPlugin; /** Pointer to the view plugin for which to create the overlay */
const Qt::Alignment& _alignment; /** Alignment w.r.t. to the source widget (supported alignment flags: Qt::AlignTop, Qt::AlignBottom, Qt::AlignLeft, Qt::AlignRight) */
QHBoxLayout _layout; /** For alignment of the learning center popup widget */
QBoxLayout* _toolbarsLayout; /** Layout for the settings and actions toolbars */
QVBoxLayout _verticalToolbarLayout; /** Vertical toolbar for the top and bottom alignment */
ToolbarWidget _settingsToolbarWidget; /** Toolbar widget for learning center settings such as the visibility */
ToolbarWidget _actionsToolbarWidget; /** Toolbar widget which contains the various learning center actions */
};

}

0 comments on commit 653bc3f

Please sign in to comment.