Skip to content

Commit

Permalink
more buttons!
Browse files Browse the repository at this point in the history
  • Loading branch information
toloudis committed May 10, 2024
1 parent c53aac3 commit 24495ca
Show file tree
Hide file tree
Showing 8 changed files with 361 additions and 96 deletions.
232 changes: 224 additions & 8 deletions agave_app/ViewToolbar.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,190 @@
#include "ViewToolbar.h"

#include <QFile>
#include <QHBoxLayout>
#include <QIcon>
#include <QIconEngine>
#include <QPainter>
#include <QPixmap>
#include <QPixmapCache>
#include <QPushButton>
#include <QSvgRenderer>

#if 0
class PaletteIconEngine : public QIconEngine
{
public:
PaletteIconEngine();
PaletteIconEngine(const PaletteIconEngine& other);
~PaletteIconEngine();

void paint(QPainter* painter, const QRect& rect, QIcon::Mode mode, QIcon::State state) override;
QPixmap pixmap(const QSize& size, QIcon::Mode mode, QIcon::State state) override;

void addFile(const QString& fileName, const QSize& size, QIcon::Mode mode, QIcon::State state) override;

QString key() const override;
QIconEngine* clone() const override;

QList<QSize> availableSizes(QIcon::Mode mode, QIcon::State state) override;

void virtual_hook(int id, void* data) override;

private:
QScopedPointer<QSvgRenderer> renderer_;
QString src_file_;
};

static QString
actualFilename(const QString& filename)
{
if (QFile::exists(filename))
return filename;

QString fn = filename.mid(0, filename.lastIndexOf('.'));
if (QFile::exists(fn))
return fn;

return fn + ".svg";
}

static QColor
getIconColor(QIcon::Mode mode, QIcon::State state)
{
Q_UNUSED(state);
QPalette::ColorGroup color_group = QPalette::Active;
if (mode == QIcon::Disabled)
color_group = QPalette::Disabled;
return QPalette().color(color_group, QPalette::WindowText);
}

static QPixmap
renderIcon(QSvgRenderer* renderer, const QSize& size, const QBrush& brush)
{
QPixmap output(size);
output.fill(Qt::transparent);

QPainter p(&output);
renderer->render(&p);

p.setCompositionMode(QPainter::CompositionMode_SourceIn);

p.setPen(Qt::NoPen);
p.setBrush(brush);

p.drawRect(output.rect());

return output;
}

PaletteIconEngine::PaletteIconEngine()
{
renderer_.reset(new QSvgRenderer());
}

PaletteIconEngine::PaletteIconEngine(const PaletteIconEngine& other)
: QIconEngine(other)
{
src_file_ = other.src_file_;
renderer_.reset(new QSvgRenderer());
if (other.renderer_->isValid())
renderer_->load(other.src_file_);
}

PaletteIconEngine::~PaletteIconEngine() = default;

void
PaletteIconEngine::paint(QPainter* painter, const QRect& rect, QIcon::Mode mode, QIcon::State state)
{
// "direct rendereng" using given painter is not possible
// because colorization logic modifies already painted area
// such behavior is not acceptable, so render icon to pixmap first
QSize size = rect.size() * painter->device()->devicePixelRatioF();
QPixmap pxm = pixmap(size, mode, state);
// set device pixel ratio exactly before painting,
// this will allow to reuse the same cached pixmap
pxm.setDevicePixelRatio(painter->device()->devicePixelRatioF());
painter->drawPixmap(rect, pxm);
}

QPixmap
PaletteIconEngine::pixmap(const QSize& size, QIcon::Mode mode, QIcon::State state)
{
// unfortunately, default implementation (call paint() on newly created QPixmap)
// doesn't initialize (fill) QPixmap with transparent color, so artifacts may happen
// so, it is better to implement pixmap() function and use it in paint() implementation
QColor color = getIconColor(mode, state);
QString pmckey =
QString("pie_%1:%2x%3:%4").arg(src_file_).arg(size.width()).arg(size.height()).arg(color.name(QColor::HexArgb));
QPixmap pxm;
if (!QPixmapCache::find(pmckey, &pxm)) {
pxm = renderIcon(renderer_.data(), size, color);
QPixmapCache::insert(pmckey, pxm);
}
return pxm;
}

void
PaletteIconEngine::addFile(const QString& fileName, const QSize& size, QIcon::Mode mode, QIcon::State state)
{
Q_UNUSED(size);
Q_UNUSED(mode);
Q_UNUSED(state);
QString filename = actualFilename(fileName);
if (filename == src_file_)
return;
if (renderer_->load(filename))
src_file_ = filename;
}

QString
PaletteIconEngine::key() const
{
return QLatin1String("palette");
}

QIconEngine*
PaletteIconEngine::clone() const
{
return new PaletteIconEngine(*this);
}

QList<QSize>
PaletteIconEngine::availableSizes(QIcon::Mode mode, QIcon::State state)
{
Q_UNUSED(mode);
Q_UNUSED(state);
QList<QSize> sizes;
sizes << QSize(512, 512); // just workaround to make tray icon visible on KDE
return sizes;
}

void
PaletteIconEngine::virtual_hook(int id, void* data)
{
switch (id) {
case QIconEngine::IsNullHook:
*reinterpret_cast<bool*>(data) = (!renderer_ || !renderer_->isValid());
break;

default:
QIconEngine::virtual_hook(id, data);
}
}

class SwitchingIcon : public QIcon
{
SwitchingIcon(const QString& file_name)
: QIcon()
{
// QString f1 = QString("switch1/%1").arg(file_name);
// QString f2 = QString("switch2/%1").arg(file_name);
QIconEngine* engine = new PaletteIconEngine();
engine->addFile(file_name, QSize(512, 512), QIcon::Normal, QIcon::Off);
QIcon(engine);
}
};
#endif

ViewToolbar::ViewToolbar(QWidget* parent)
: QWidget(parent)
Expand All @@ -12,26 +193,61 @@ ViewToolbar::ViewToolbar(QWidget* parent)
toolbarLayout->setSpacing(0);
toolbarLayout->setContentsMargins(0, 0, 0, 0);

frameViewButton = new QPushButton(QIcon(":/icons/frameView.svg"), "", this);
frameViewButton->setToolTip(QString("<FONT>Frame view</FONT>"));
frameViewButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
frameViewButton->adjustSize();
frameViewButton->setFocusPolicy(Qt::NoFocus);
toolbarLayout->addWidget(frameViewButton);

orthoViewButton = new QPushButton(QIcon(":/icons/orthoView.svg"), "", this);
orthoViewButton->setToolTip(QString("<FONT>Ortho/Persp view</FONT>"));
orthoViewButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
orthoViewButton->adjustSize();
orthoViewButton->setFocusPolicy(Qt::NoFocus);
toolbarLayout->addWidget(orthoViewButton);

topViewButton = new QPushButton(QIcon(":/icons/topView.svg"), "", this);
topViewButton->setToolTip(QString("<FONT>Top view</FONT>"));
topViewButton->setToolTip(QString("<FONT>Top view (-Y)</FONT>"));
topViewButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
topViewButton->adjustSize();
topViewButton->setFocusPolicy(Qt::NoFocus);
toolbarLayout->addWidget(topViewButton);

bottomViewButton = new QPushButton(QIcon(":/icons/topView.svg"), "", this);
bottomViewButton->setToolTip(QString("<FONT>Bottom view (+Y)</FONT>"));
bottomViewButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
bottomViewButton->adjustSize();
bottomViewButton->setFocusPolicy(Qt::NoFocus);
toolbarLayout->addWidget(bottomViewButton);

frontViewButton = new QPushButton(QIcon(":/icons/frontView.svg"), "", this);
frontViewButton->setToolTip(QString("<FONT>Front view</FONT>"));
frontViewButton->setToolTip(QString("<FONT>Front view (-Z)</FONT>"));
frontViewButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
frontViewButton->adjustSize();
frontViewButton->setFocusPolicy(Qt::NoFocus);
toolbarLayout->addWidget(frontViewButton);

sideViewButton = new QPushButton(QIcon(":/icons/leftView.svg"), "", this);
sideViewButton->setToolTip(QString("<FONT>Side view</FONT>"));
sideViewButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
sideViewButton->adjustSize();
sideViewButton->setFocusPolicy(Qt::NoFocus);
toolbarLayout->addWidget(sideViewButton);
backViewButton = new QPushButton(QIcon(":/icons/frontView.svg"), "", this);
backViewButton->setToolTip(QString("<FONT>Back view (+Z)</FONT>"));
backViewButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
backViewButton->adjustSize();
backViewButton->setFocusPolicy(Qt::NoFocus);
toolbarLayout->addWidget(backViewButton);

leftViewButton = new QPushButton(QIcon(":/icons/leftView.svg"), "", this);
leftViewButton->setToolTip(QString("<FONT>Left view (+X)</FONT>"));
leftViewButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
leftViewButton->adjustSize();
leftViewButton->setFocusPolicy(Qt::NoFocus);
toolbarLayout->addWidget(leftViewButton);

rightViewButton = new QPushButton(QIcon(":/icons/leftView.svg"), "", this);
rightViewButton->setToolTip(QString("<FONT>Right view (-X)</FONT>"));
rightViewButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
rightViewButton->adjustSize();
rightViewButton->setFocusPolicy(Qt::NoFocus);
toolbarLayout->addWidget(rightViewButton);

// int width = zoomFitButton->fontMetrics().boundingRect(zoomFitButton->text()).width() * 2 + 7;
// zoomInButton->setMaximumWidth(width);
Expand Down
9 changes: 7 additions & 2 deletions agave_app/ViewToolbar.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#pragma once

#include <QWidget>
#include <QPushButton>
#include <QWidget>

class ViewToolbar : public QWidget
{
Expand All @@ -10,9 +10,14 @@ class ViewToolbar : public QWidget
ViewToolbar(QWidget* parent = nullptr);
virtual ~ViewToolbar();

QPushButton* frameViewButton;
QPushButton* orthoViewButton;
QPushButton* topViewButton;
QPushButton* bottomViewButton;
QPushButton* frontViewButton;
QPushButton* sideViewButton;
QPushButton* backViewButton;
QPushButton* leftViewButton;
QPushButton* rightViewButton;

void positionToolbar();
};
46 changes: 35 additions & 11 deletions agave_app/agaveGui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,11 @@ agaveGui::agaveGui(QWidget* parent)
vlayout->setContentsMargins(0, 0, 0, 0);
auto toolbar = new ViewToolbar();
connect(toolbar->topViewButton, &QPushButton::clicked, this, &agaveGui::view_top);
connect(toolbar->sideViewButton, &QPushButton::clicked, this, &agaveGui::view_side);
connect(toolbar->bottomViewButton, &QPushButton::clicked, this, &agaveGui::view_bottom);
connect(toolbar->leftViewButton, &QPushButton::clicked, this, &agaveGui::view_left);
connect(toolbar->rightViewButton, &QPushButton::clicked, this, &agaveGui::view_right);
connect(toolbar->frontViewButton, &QPushButton::clicked, this, &agaveGui::view_front);
connect(toolbar->backViewButton, &QPushButton::clicked, this, &agaveGui::view_back);
vlayout->addWidget(toolbar);
vlayout->addWidget(m_glView, 1);

Expand Down Expand Up @@ -202,15 +205,15 @@ agaveGui::createActions()
this->m_glView->toggleAreaLightRotateControls();
});

m_cameraTopViewAction = new QAction(tr("&Top view"), this);
m_cameraTopViewAction->setStatusTip(tr("Set camera to top view"));
connect(m_cameraTopViewAction, SIGNAL(triggered()), this, SLOT(view_top()));
m_cameraFrontViewAction = new QAction(tr("&Front view"), this);
m_cameraFrontViewAction->setStatusTip(tr("Set camera to front view"));
connect(m_cameraFrontViewAction, SIGNAL(triggered()), this, SLOT(view_front()));
m_cameraSideViewAction = new QAction(tr("&Side view"), this);
m_cameraSideViewAction->setStatusTip(tr("Set camera to side view"));
connect(m_cameraSideViewAction, SIGNAL(triggered()), this, SLOT(view_side()));
// m_cameraTopViewAction = new QAction(tr("&Top view"), this);
// m_cameraTopViewAction->setStatusTip(tr("Set camera to top view"));
// connect(m_cameraTopViewAction, SIGNAL(triggered()), this, SLOT(view_top()));
// m_cameraFrontViewAction = new QAction(tr("&Front view"), this);
// m_cameraFrontViewAction->setStatusTip(tr("Set camera to front view"));
// connect(m_cameraFrontViewAction, SIGNAL(triggered()), this, SLOT(view_front()));
// m_cameraSideViewAction = new QAction(tr("&Side view"), this);
// m_cameraSideViewAction->setStatusTip(tr("Set camera to side view"));
// connect(m_cameraSideViewAction, SIGNAL(triggered()), this, SLOT(view_side()));
}

void
Expand Down Expand Up @@ -816,6 +819,13 @@ agaveGui::view_top()
RenderSettings* rs = m_glView->borrowRenderer()->m_renderSettings;
rs->m_DirtyFlags.SetFlag(CameraDirty);
}
void
agaveGui::view_bottom()
{
m_glView->borrowRenderer()->m_CCamera.SetViewMode(ViewModeBottom);
RenderSettings* rs = m_glView->borrowRenderer()->m_renderSettings;
rs->m_DirtyFlags.SetFlag(CameraDirty);
}

void
agaveGui::view_front()
Expand All @@ -824,14 +834,28 @@ agaveGui::view_front()
RenderSettings* rs = m_glView->borrowRenderer()->m_renderSettings;
rs->m_DirtyFlags.SetFlag(CameraDirty);
}
void
agaveGui::view_back()
{
m_glView->borrowRenderer()->m_CCamera.SetViewMode(ViewModeBack);
RenderSettings* rs = m_glView->borrowRenderer()->m_renderSettings;
rs->m_DirtyFlags.SetFlag(CameraDirty);
}

void
agaveGui::view_side()
agaveGui::view_left()
{
m_glView->borrowRenderer()->m_CCamera.SetViewMode(ViewModeLeft);
RenderSettings* rs = m_glView->borrowRenderer()->m_renderSettings;
rs->m_DirtyFlags.SetFlag(CameraDirty);
}
void
agaveGui::view_right()
{
m_glView->borrowRenderer()->m_CCamera.SetViewMode(ViewModeRight);
RenderSettings* rs = m_glView->borrowRenderer()->m_renderSettings;
rs->m_DirtyFlags.SetFlag(CameraDirty);
}

void
agaveGui::view_toggleProjection()
Expand Down
11 changes: 7 additions & 4 deletions agave_app/agaveGui.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,11 @@ class agaveGui : public QMainWindow

public slots:
void view_top();
void view_bottom();
void view_front();
void view_side();
void view_back();
void view_left();
void view_right();
private slots:
void open();
void openDirectory();
Expand Down Expand Up @@ -120,9 +123,9 @@ private slots:
QAction* m_sourceCodeAction = nullptr;
QAction* m_citationAction = nullptr;
QAction* m_toggleRotateControlsAction = nullptr;
QAction* m_cameraTopViewAction = nullptr;
QAction* m_cameraFrontViewAction = nullptr;
QAction* m_cameraSideViewAction = nullptr;
// QAction* m_cameraTopViewAction = nullptr;
// QAction* m_cameraFrontViewAction = nullptr;
// QAction* m_cameraSideViewAction = nullptr;

QSlider* createAngleSlider();
QSlider* createRangeSlider();
Expand Down
Loading

0 comments on commit 24495ca

Please sign in to comment.