File indexing completed on 2024-04-14 03:40:12

0001 /*
0002     SPDX-FileCopyrightText: 2006 Carsten Niehaus <cniehaus@kde.org>
0003     SPDX-FileCopyrightText: 2007-2008 Marcus D. Hanwell <marcus@cryos.org>
0004     SPDX-FileCopyrightText: 2016 Andreas Cord-Landwehr <cordlandwehr@kde.org>
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "kalziumglwidget.h"
0009 #include "iowrapper.h"
0010 
0011 #include <avogadro/qtgui/molecule.h>
0012 #include <avogadro/qtgui/sceneplugin.h>
0013 #include <avogadro/qtgui/toolplugin.h>
0014 #include <avogadro/qtplugins/pluginmanager.h>
0015 #include <avogadro/rendering/primitive.h>
0016 
0017 #include <QDebug>
0018 #include <QWidget>
0019 
0020 #include <config-kalzium.h>
0021 
0022 KalziumGLWidget::KalziumGLWidget(QWidget *parent)
0023     : Avogadro::QtOpenGL::GLWidget(parent)
0024 {
0025     // work around a bug in OpenBabel: the chemical data files parsing
0026     // is dependent on the LC_NUMERIC locale.
0027     m_lc_numeric = QByteArray(setlocale(LC_NUMERIC, nullptr));
0028     setlocale(LC_NUMERIC, "C");
0029 
0030     // Prevent What's this from intercepting right mouse clicks
0031     setContextMenuPolicy(Qt::PreventContextMenu);
0032     // Load the tools and set navigate as the default
0033     // first set the Avogadro plugin directory,
0034     // avoiding overwriting an already set envvar
0035     static bool s_pluginDirSet = false;
0036     if (!s_pluginDirSet) {
0037         if (qEnvironmentVariableIsEmpty("AVOGADRO_PLUGINS")) {
0038             qputenv("AVOGADRO_PLUGINS", AVOGADRO_PLUGIN_DIR);
0039         }
0040         s_pluginDirSet = true;
0041     }
0042     Avogadro::QtPlugins::PluginManager *manager = Avogadro::QtPlugins::PluginManager::instance();
0043     manager->load();
0044 
0045     // load render engines
0046     QList<Avogadro::QtGui::ScenePluginFactory *> scenePluginFactories = manager->pluginFactories<Avogadro::QtGui::ScenePluginFactory>();
0047     foreach (auto *factory, scenePluginFactories) {
0048         auto *scenePlugin = factory->createInstance();
0049         // enable Ball-and-Sticks
0050         if (scenePlugin->objectName() == QLatin1String("BallStick")) {
0051             scenePlugin->setEnabled(true);
0052         }
0053         sceneModel().addItem(scenePlugin);
0054     }
0055 
0056     // load tools
0057     if (!tools().isEmpty()) {
0058         qCritical() << "Updating non-empty toolset, erasing first.";
0059         qDeleteAll(tools());
0060     }
0061     auto toolPluginFactories = manager->pluginFactories<Avogadro::QtGui::ToolPluginFactory>();
0062     foreach (auto *factory, toolPluginFactories) {
0063         auto *tool = factory->createInstance();
0064         if (tool) {
0065             addTool(tool);
0066             if (factory->identifier() == QStringLiteral("Navigator")) {
0067                 setDefaultTool(tool);
0068                 setActiveTool(tool);
0069             }
0070         }
0071     }
0072 
0073     setMolecule(new Avogadro::QtGui::Molecule(this));
0074     update();
0075 }
0076 
0077 KalziumGLWidget::~KalziumGLWidget()
0078 {
0079     // restore the LC_NUMERIC locale.
0080     setlocale(LC_NUMERIC, m_lc_numeric.constData());
0081 }
0082 
0083 bool KalziumGLWidget::openFile(const QString &file)
0084 {
0085     // workaround for missing copy-constructor: fixed in Avogadra2 > 0.9
0086     Avogadro::QtGui::Molecule temp;
0087     temp = *IoWrapper::readMolecule(file);
0088     auto mol = new Avogadro::QtGui::Molecule(temp);
0089 
0090     if (!mol) {
0091         return false;
0092     }
0093     Avogadro::QtGui::Molecule *oldmol = molecule();
0094     if (oldmol) {
0095         oldmol->deleteLater();
0096     }
0097     setMolecule(mol);
0098     update();
0099     return true;
0100 }
0101 
0102 #include "moc_kalziumglwidget.cpp"