From 350d18db6ca601a6b4ded0746e63e06f5c1fc630 Mon Sep 17 00:00:00 2001 From: Geoff Hutchison Date: Wed, 17 Jan 2024 21:41:19 -0500 Subject: [PATCH] Update tool plugins to set icon as light / dark theme This will need a change to avogadroapp for theming but works now Signed-off-by: Geoff Hutchison --- avogadro/qtgui/toolplugin.h | 5 +++ avogadro/qtplugins/aligntool/aligntool.cpp | 10 +++++- avogadro/qtplugins/aligntool/aligntool.h | 2 ++ .../bondcentrictool/bondcentrictool.cpp | 10 +++++- .../bondcentrictool/bondcentrictool.h | 1 + avogadro/qtplugins/editor/editor.cpp | 12 +++++-- avogadro/qtplugins/editor/editor.h | 1 + avogadro/qtplugins/label/labeleditor.cpp | 14 ++++++-- avogadro/qtplugins/label/labeleditor.h | 1 + .../qtplugins/manipulator/manipulator.cpp | 11 ++++-- avogadro/qtplugins/manipulator/manipulator.h | 2 ++ .../qtplugins/measuretool/measuretool.cpp | 14 ++++++-- avogadro/qtplugins/measuretool/measuretool.h | 3 +- avogadro/qtplugins/navigator/navigator.cpp | 11 ++++-- avogadro/qtplugins/navigator/navigator.h | 1 + avogadro/qtplugins/playertool/playertool.cpp | 34 +++++++++++-------- avogadro/qtplugins/playertool/playertool.h | 1 + .../qtplugins/selectiontool/selectiontool.cpp | 10 +++++- .../qtplugins/selectiontool/selectiontool.h | 1 + .../qtplugins/templatetool/templatetool.cpp | 11 ++++-- .../qtplugins/templatetool/templatetool.h | 1 + 21 files changed, 123 insertions(+), 33 deletions(-) diff --git a/avogadro/qtgui/toolplugin.h b/avogadro/qtgui/toolplugin.h index a730a345a8..0c72b0f3bb 100644 --- a/avogadro/qtgui/toolplugin.h +++ b/avogadro/qtgui/toolplugin.h @@ -64,6 +64,11 @@ class AVOGADROQTGUI_EXPORT ToolPlugin : public QObject */ virtual QAction* activateAction() const = 0; + /** + * Set the tool icon (based on dark / light theme). + */ + virtual void setIcon(bool darkTheme = false) = 0; + /** * @return A QWidget that will be displayed to the user while this tool is * active. diff --git a/avogadro/qtplugins/aligntool/aligntool.cpp b/avogadro/qtplugins/aligntool/aligntool.cpp index e8d79eeffd..7f37650ab4 100644 --- a/avogadro/qtplugins/aligntool/aligntool.cpp +++ b/avogadro/qtplugins/aligntool/aligntool.cpp @@ -51,7 +51,6 @@ AlignTool::AlignTool(QObject* parent_) m_alignType(0), m_axis(0) { m_activateAction->setText(tr("Align")); - m_activateAction->setIcon(QIcon(":/icons/align_light.svg")); m_activateAction->setToolTip( tr("Align Molecules\n\n" "Left Mouse: \tSelect up to two atoms.\n" @@ -59,6 +58,7 @@ AlignTool::AlignTool(QObject* parent_) "\tThe second atom is aligned to the selected axis.\n" "Right Mouse: \tReset alignment.\n" "Double-Click: \tCenter the atom at the origin.")); + setIcon(); } AlignTool::~AlignTool() @@ -67,6 +67,14 @@ AlignTool::~AlignTool() m_toolWidget->deleteLater(); } +void AlignTool::setIcon(bool darkTheme) +{ + if (darkTheme) + m_activateAction->setIcon(QIcon(":/icons/align_dark.svg")); + else + m_activateAction->setIcon(QIcon(":/icons/align_light.svg")); +} + QWidget* AlignTool::toolWidget() const { if (!m_toolWidget) { diff --git a/avogadro/qtplugins/aligntool/aligntool.h b/avogadro/qtplugins/aligntool/aligntool.h index 1fb13d517e..ff7db01789 100644 --- a/avogadro/qtplugins/aligntool/aligntool.h +++ b/avogadro/qtplugins/aligntool/aligntool.h @@ -36,6 +36,8 @@ class AlignTool : public QtGui::ToolPlugin QAction* activateAction() const override { return m_activateAction; } QWidget* toolWidget() const override; + void setIcon(bool darkTheme = false) override; + void setMolecule(QtGui::Molecule* mol) override { if (mol) diff --git a/avogadro/qtplugins/bondcentrictool/bondcentrictool.cpp b/avogadro/qtplugins/bondcentrictool/bondcentrictool.cpp index 18ff28f6bc..3dca7ad351 100644 --- a/avogadro/qtplugins/bondcentrictool/bondcentrictool.cpp +++ b/avogadro/qtplugins/bondcentrictool/bondcentrictool.cpp @@ -119,7 +119,6 @@ BondCentricTool::BondCentricTool(QObject* parent_) m_planeSnapIncr(10.f), m_snapPlaneToBonds(true) { m_activateAction->setText(tr("Bond-Centric Manipulation")); - m_activateAction->setIcon(QIcon(":/icons/bondcentric_light.svg")); m_activateAction->setToolTip( tr("Bond Centric Manipulation Tool\n\n" "Left Mouse: \tClick and drag to rotate the view.\n" @@ -129,10 +128,19 @@ BondCentricTool::BondCentricTool(QObject* parent_) "Left Click & Drag on a Bond to set the Manipulation Plane:\n" "Left Click & Drag one of the Atoms in the Bond to change the angle\n" "Right Click & Drag one of the Atoms in the Bond to change the length")); + setIcon(); } BondCentricTool::~BondCentricTool() {} +void BondCentricTool::setIcon(bool darkTheme) +{ + if (darkTheme) + m_activateAction->setIcon(QIcon(":/icons/bondcentric_dark.svg")); + else + m_activateAction->setIcon(QIcon(":/icons/bondcentric_light.svg")); +} + QWidget* BondCentricTool::toolWidget() const { return nullptr; diff --git a/avogadro/qtplugins/bondcentrictool/bondcentrictool.h b/avogadro/qtplugins/bondcentrictool/bondcentrictool.h index e426dd1ea0..e52f110bbb 100644 --- a/avogadro/qtplugins/bondcentrictool/bondcentrictool.h +++ b/avogadro/qtplugins/bondcentrictool/bondcentrictool.h @@ -49,6 +49,7 @@ class BondCentricTool : public QtGui::ToolPlugin unsigned char priority() const override { return 40; } QAction* activateAction() const override { return m_activateAction; } QWidget* toolWidget() const override; + void setIcon(bool darkTheme = false) override; void setMolecule(QtGui::Molecule*) override; void setEditMolecule(QtGui::RWMolecule*) override; diff --git a/avogadro/qtplugins/editor/editor.cpp b/avogadro/qtplugins/editor/editor.cpp index 0d073f0fa0..073a12d172 100644 --- a/avogadro/qtplugins/editor/editor.cpp +++ b/avogadro/qtplugins/editor/editor.cpp @@ -27,12 +27,12 @@ #include #include +#include #include #include #include #include #include -#include #include #include @@ -69,16 +69,24 @@ Editor::Editor(QObject* parent_) m_fixValenceLater(false), m_layerManager("Editor") { m_activateAction->setText(tr("Draw")); - m_activateAction->setIcon(QIcon(":/icons/editor_light.svg")); m_activateAction->setToolTip( tr("Draw Tool\n\n" "Left Mouse: \tClick and Drag to create Atoms and Bond\n" "Right Mouse: \tDelete Atom")); + setIcon(); reset(); } Editor::~Editor() {} +void Editor::setIcon(bool darkTheme) +{ + if (darkTheme) + m_activateAction->setIcon(QIcon(":/icons/editor_dark.svg")); + else + m_activateAction->setIcon(QIcon(":/icons/editor_light.svg")); +} + QWidget* Editor::toolWidget() const { return m_toolWidget; diff --git a/avogadro/qtplugins/editor/editor.h b/avogadro/qtplugins/editor/editor.h index 77448563e2..cd6d708845 100644 --- a/avogadro/qtplugins/editor/editor.h +++ b/avogadro/qtplugins/editor/editor.h @@ -36,6 +36,7 @@ class Editor : public QtGui::ToolPlugin unsigned char priority() const override { return 20; } QAction* activateAction() const override { return m_activateAction; } QWidget* toolWidget() const override; + void setIcon(bool darkTheme = false) override; void setMolecule(QtGui::Molecule* mol) override { diff --git a/avogadro/qtplugins/label/labeleditor.cpp b/avogadro/qtplugins/label/labeleditor.cpp index b04036a461..fb7fe9855b 100644 --- a/avogadro/qtplugins/label/labeleditor.cpp +++ b/avogadro/qtplugins/label/labeleditor.cpp @@ -10,8 +10,8 @@ #include #include -#include #include +#include namespace Avogadro::QtPlugins { @@ -27,14 +27,22 @@ LabelEditor::LabelEditor(QObject* parent_) m_selected(false), m_text("") { m_activateAction->setText(tr("Edit Labels")); - m_activateAction->setIcon(QIcon(":/icons/label_light.svg")); m_activateAction->setToolTip( tr("Atom Label Tool\n\n" "Left Mouse: \tClick on Atoms to add Custom Labels")); + setIcon(); } LabelEditor::~LabelEditor() {} +void LabelEditor::setIcon(bool darkTheme) +{ + if (darkTheme) + m_activateAction->setIcon(QIcon(":/icons/label_dark.svg")); + else + m_activateAction->setIcon(QIcon(":/icons/label_light.svg")); +} + QUndoCommand* LabelEditor::mouseReleaseEvent(QMouseEvent*) { return nullptr; @@ -130,4 +138,4 @@ void LabelEditor::draw(Rendering::GroupNode& node) TextLabel3D* atomLabel = createLabel(m_text.toStdString(), pos, radius); geometry->addDrawable(atomLabel); } -} // namespace Avogadro +} // namespace Avogadro::QtPlugins diff --git a/avogadro/qtplugins/label/labeleditor.h b/avogadro/qtplugins/label/labeleditor.h index 69b14bc582..332b2535b5 100644 --- a/avogadro/qtplugins/label/labeleditor.h +++ b/avogadro/qtplugins/label/labeleditor.h @@ -24,6 +24,7 @@ class LabelEditor : public QtGui::ToolPlugin QString description() const override { return tr("Label editor tool"); } unsigned char priority() const override { return 25; } QAction* activateAction() const override { return m_activateAction; } + void setIcon(bool darkTheme = false) override; void setMolecule(QtGui::Molecule* mol) override { diff --git a/avogadro/qtplugins/manipulator/manipulator.cpp b/avogadro/qtplugins/manipulator/manipulator.cpp index 03c57e5aa1..fbe0fbc66c 100644 --- a/avogadro/qtplugins/manipulator/manipulator.cpp +++ b/avogadro/qtplugins/manipulator/manipulator.cpp @@ -47,18 +47,25 @@ Manipulator::Manipulator(QObject* parent_) m_currentAction(Nothing) { m_activateAction->setText(tr("Manipulate")); - m_activateAction->setIcon(QIcon(":/icons/manipulator_light.svg")); m_activateAction->setToolTip( tr("Manipulation Tool\n\n" "Left Mouse: \tClick and drag to move atoms\n" "Right Mouse: \tClick and drag to rotate selected atoms.\n")); - + setIcon(); connect(m_toolWidget->buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonClicked(QAbstractButton*))); } Manipulator::~Manipulator() {} +void Manipulator::setIcon(bool darkTheme) +{ + if (darkTheme) + m_activateAction->setIcon(QIcon(":/icons/manipulator_dark.svg")); + else + m_activateAction->setIcon(QIcon(":/icons/manipulator_light.svg")); +} + QWidget* Manipulator::toolWidget() const { return m_toolWidget; diff --git a/avogadro/qtplugins/manipulator/manipulator.h b/avogadro/qtplugins/manipulator/manipulator.h index 91807f9287..ed0a53941f 100644 --- a/avogadro/qtplugins/manipulator/manipulator.h +++ b/avogadro/qtplugins/manipulator/manipulator.h @@ -39,6 +39,8 @@ class Manipulator : public QtGui::ToolPlugin QAction* activateAction() const override { return m_activateAction; } QWidget* toolWidget() const override; + void setIcon(bool darkTheme = false) override; + void setMolecule(QtGui::Molecule* mol) override { if (mol) diff --git a/avogadro/qtplugins/measuretool/measuretool.cpp b/avogadro/qtplugins/measuretool/measuretool.cpp index a7a7334753..377b2b6cad 100644 --- a/avogadro/qtplugins/measuretool/measuretool.cpp +++ b/avogadro/qtplugins/measuretool/measuretool.cpp @@ -28,10 +28,10 @@ #include +#include #include #include #include -#include #include @@ -52,7 +52,6 @@ MeasureTool::MeasureTool(QObject* parent_) m_molecule(nullptr), m_rwMolecule(nullptr), m_renderer(nullptr) { m_activateAction->setText(tr("Measure")); - m_activateAction->setIcon(QIcon(":/icons/measure_light.svg")); m_activateAction->setToolTip( tr("Measure Tool\n\n" "Left Mouse: \tSelect up to four Atoms.\n" @@ -60,10 +59,19 @@ MeasureTool::MeasureTool(QObject* parent_) "\tAngle is measured between 1-3 using 2 as the common point\n" "\tDihedral is measured between 1-2-3-4\n" "Right Mouse: \tReset the measurements.")); + setIcon(); } MeasureTool::~MeasureTool() {} +void MeasureTool::setIcon(bool darkTheme) +{ + if (darkTheme) + m_activateAction->setIcon(QIcon(":/icons/measure_dark.svg")); + else + m_activateAction->setIcon(QIcon(":/icons/measure_light.svg")); +} + QWidget* MeasureTool::toolWidget() const { return nullptr; @@ -279,4 +287,4 @@ bool MeasureTool::toggleAtom(const Rendering::Identifier& atom) return true; } -} // namespace Avogadro +} // namespace Avogadro::QtPlugins diff --git a/avogadro/qtplugins/measuretool/measuretool.h b/avogadro/qtplugins/measuretool/measuretool.h index ce27743bbf..34e02caff4 100644 --- a/avogadro/qtplugins/measuretool/measuretool.h +++ b/avogadro/qtplugins/measuretool/measuretool.h @@ -35,6 +35,7 @@ class MeasureTool : public QtGui::ToolPlugin unsigned char priority() const override { return 60; } QAction* activateAction() const override { return m_activateAction; } QWidget* toolWidget() const override; + void setIcon(bool darkTheme = false) override; void setMolecule(QtGui::Molecule*) override; void setEditMolecule(QtGui::RWMolecule*) override; @@ -49,7 +50,7 @@ class MeasureTool : public QtGui::ToolPlugin private: Vector3ub contrastingColor(const Vector3ub& rgb) const; bool toggleAtom(const Rendering::Identifier& atom); - template + template void createLabels(T* mol, Rendering::GeometryNode* geo, QVector& positions); diff --git a/avogadro/qtplugins/navigator/navigator.cpp b/avogadro/qtplugins/navigator/navigator.cpp index a36bc074cd..03cd4386c4 100644 --- a/avogadro/qtplugins/navigator/navigator.cpp +++ b/avogadro/qtplugins/navigator/navigator.cpp @@ -37,17 +37,24 @@ Navigator::Navigator(QObject* parent_) m_currentAction(Nothing) { m_activateAction->setText(tr("Navigate")); - m_activateAction->setIcon(QIcon(":/icons/navigator_light.svg")); m_activateAction->setToolTip( tr("Navigation Tool\n\n" "Left Mouse: \tClick and drag to rotate the view.\n" "Middle Mouse: \tClick and drag to zoom in or out.\n" "Right Mouse: \tClick and drag to move the view.\n")); - + setIcon(); QSettings settings; m_zoomDirection = settings.value("navigator/zoom", 1).toInt(); } +void Navigator::setIcon(bool darkTheme) +{ + if (darkTheme) + m_activateAction->setIcon(QIcon(":/icons/navigator_dark.svg")); + else + m_activateAction->setIcon(QIcon(":/icons/navigator_light.svg")); +} + void Navigator::registerCommands() { emit registerCommand("rotateScene", diff --git a/avogadro/qtplugins/navigator/navigator.h b/avogadro/qtplugins/navigator/navigator.h index 8a1cd73441..da11bb6982 100644 --- a/avogadro/qtplugins/navigator/navigator.h +++ b/avogadro/qtplugins/navigator/navigator.h @@ -33,6 +33,7 @@ class Navigator : public QtGui::ToolPlugin unsigned char priority() const override { return 10; } QAction* activateAction() const override { return m_activateAction; } QWidget* toolWidget() const override; + void setIcon(bool darkTheme = false) override; void setMolecule(QtGui::Molecule* mol) override { m_molecule = mol; } void setGLWidget(QtOpenGL::GLWidget* widget) override { m_glWidget = widget; } diff --git a/avogadro/qtplugins/playertool/playertool.cpp b/avogadro/qtplugins/playertool/playertool.cpp index c28b06d0ac..fd26583732 100644 --- a/avogadro/qtplugins/playertool/playertool.cpp +++ b/avogadro/qtplugins/playertool/playertool.cpp @@ -11,13 +11,14 @@ #include #include +#include +#include +#include #include #include #include -#include #include #include -#include #include #include #include @@ -25,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -40,22 +40,26 @@ namespace Avogadro::QtPlugins { using QtGui::Molecule; PlayerTool::PlayerTool(QObject* parent_) - : QtGui::ToolPlugin(parent_) - , m_activateAction(new QAction(this)) - , m_molecule(nullptr) - , m_renderer(nullptr) - , m_currentFrame(0) - , m_toolWidget(nullptr) - , m_frameIdx(nullptr) - , m_slider(nullptr) + : QtGui::ToolPlugin(parent_), m_activateAction(new QAction(this)), + m_molecule(nullptr), m_renderer(nullptr), m_currentFrame(0), + m_toolWidget(nullptr), m_frameIdx(nullptr), m_slider(nullptr) { m_activateAction->setText(tr("Player")); - m_activateAction->setIcon(QIcon(":/icons/player_light.svg")); m_activateAction->setToolTip(tr("Animation Tool")); + setIcon(); } PlayerTool::~PlayerTool() {} +void PlayerTool::setIcon(bool darkTheme) +{ + if (darkTheme) { + m_activateAction->setIcon(QIcon(":/icons/player_dark.svg")); + } else { + m_activateAction->setIcon(QIcon(":/icons/player_light.svg")); + } +} + QWidget* PlayerTool::toolWidget() const { if (!m_toolWidget) { @@ -228,7 +232,7 @@ void PlayerTool::recordMovie() #else qreal scaling = qApp->devicePixelRatio(); #endif - int EXPORT_WIDTH = m_glWidget->width() * scaling; + int EXPORT_WIDTH = m_glWidget->width() * scaling; int EXPORT_HEIGHT = m_glWidget->height() * scaling; if (m_timer.isActive()) @@ -255,7 +259,7 @@ void PlayerTool::recordMovie() bool bonding = m_dynamicBonding->isChecked(); int numberLength = static_cast( ceil(log10(static_cast(m_molecule->coordinate3dCount()) + 1))); - //m_glWidget->resize(EXPORT_WIDTH, EXPORT_HEIGHT); + // m_glWidget->resize(EXPORT_WIDTH, EXPORT_HEIGHT); if (selfFilter == tr("GIF (*.gif)")) { GifWriter writer; @@ -412,4 +416,4 @@ void PlayerTool::setSliderLimit() } } -} // namespace Avogadro +} // namespace Avogadro::QtPlugins diff --git a/avogadro/qtplugins/playertool/playertool.h b/avogadro/qtplugins/playertool/playertool.h index a5cbdf9781..e8fe1c3451 100644 --- a/avogadro/qtplugins/playertool/playertool.h +++ b/avogadro/qtplugins/playertool/playertool.h @@ -37,6 +37,7 @@ class PlayerTool : public QtGui::ToolPlugin unsigned char priority() const override { return 80; } QAction* activateAction() const override { return m_activateAction; } QWidget* toolWidget() const override; + void setIcon(bool darkTheme = false) override; QUndoCommand* mousePressEvent(QMouseEvent* e) override; QUndoCommand* mouseReleaseEvent(QMouseEvent* e) override; diff --git a/avogadro/qtplugins/selectiontool/selectiontool.cpp b/avogadro/qtplugins/selectiontool/selectiontool.cpp index f8dffb6cb1..7382c4a94b 100644 --- a/avogadro/qtplugins/selectiontool/selectiontool.cpp +++ b/avogadro/qtplugins/selectiontool/selectiontool.cpp @@ -48,7 +48,6 @@ SelectionTool::SelectionTool(QObject* parent_) m_layerManager("Selection Tool") { m_activateAction->setText(tr("Selection")); - m_activateAction->setIcon(QIcon(":/icons/selection_light.svg")); m_activateAction->setToolTip( tr("Selection Tool\n\n" "Left Mouse: \tClick to pick individual atoms, residues, or fragments\n" @@ -56,10 +55,19 @@ SelectionTool::SelectionTool(QObject* parent_) "Right Mouse: \tClick outside the molecule to clear selection\n" "Use Ctrl to toggle the selection and shift to add to the selection.\n" "Double-Click: \tSelect an entire fragment.")); + setIcon(); } SelectionTool::~SelectionTool() {} +void SelectionTool::setIcon(bool darkTheme) +{ + if (darkTheme) + m_activateAction->setIcon(QIcon(":/icons/selection_dark.svg")); + else + m_activateAction->setIcon(QIcon(":/icons/selection_light.svg")); +} + QWidget* SelectionTool::toolWidget() const { if (m_toolWidget == nullptr) { diff --git a/avogadro/qtplugins/selectiontool/selectiontool.h b/avogadro/qtplugins/selectiontool/selectiontool.h index 422a254773..a8fef2846f 100644 --- a/avogadro/qtplugins/selectiontool/selectiontool.h +++ b/avogadro/qtplugins/selectiontool/selectiontool.h @@ -34,6 +34,7 @@ class SelectionTool : public QtGui::ToolPlugin unsigned char priority() const override { return 25; } QAction* activateAction() const override { return m_activateAction; } QWidget* toolWidget() const override; + void setIcon(bool darkTheme = false) override; void setMolecule(QtGui::Molecule*) override; void setGLRenderer(Rendering::GLRenderer* renderer) override; diff --git a/avogadro/qtplugins/templatetool/templatetool.cpp b/avogadro/qtplugins/templatetool/templatetool.cpp index 63f05581e5..5870b4ba51 100644 --- a/avogadro/qtplugins/templatetool/templatetool.cpp +++ b/avogadro/qtplugins/templatetool/templatetool.cpp @@ -79,7 +79,6 @@ TemplateTool::TemplateTool(QObject* parent_) m_fixValenceLater(false) { m_activateAction->setText(tr("Template")); - m_activateAction->setIcon(QIcon(":/icons/template_light.svg")); m_activateAction->setToolTip( tr("Template Tool\n\n" "Insert fragments, including metal centers.\n" @@ -87,12 +86,20 @@ TemplateTool::TemplateTool(QObject* parent_) "then click to insert a fragment.\n\n" "Select a ligand or functional group and click" "on a hydrogen atom to attach it.")); - + setIcon(); reset(); } TemplateTool::~TemplateTool() {} +void TemplateTool::setIcon(bool darkTheme) +{ + if (darkTheme) + m_activateAction->setIcon(QIcon(":/icons/template_dark.svg")); + else + m_activateAction->setIcon(QIcon(":/icons/template_light.svg")); +} + QWidget* TemplateTool::toolWidget() const { return m_toolWidget; diff --git a/avogadro/qtplugins/templatetool/templatetool.h b/avogadro/qtplugins/templatetool/templatetool.h index 5979c510ed..98e75d687f 100644 --- a/avogadro/qtplugins/templatetool/templatetool.h +++ b/avogadro/qtplugins/templatetool/templatetool.h @@ -37,6 +37,7 @@ class TemplateTool : public QtGui::ToolPlugin unsigned char priority() const override { return 21; } QAction* activateAction() const override { return m_activateAction; } QWidget* toolWidget() const override; + void setIcon(bool darkTheme = false) override; void setMolecule(QtGui::Molecule* mol) override {