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"