/* * Pointer Coordinates plug-in for Stellarium * * Copyright (C) 2014 Alexander Wolf * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "StelProjector.hpp" #include "StelPainter.hpp" #include "StelApp.hpp" #include "StelCore.hpp" #include "SkyGui.hpp" #include "StelLocaleMgr.hpp" #include "StelModuleMgr.hpp" #include "StelFileMgr.hpp" #include "StelGui.hpp" #include "StelGuiItems.hpp" #include "StelObjectMgr.hpp" #include "StelUtils.hpp" #include "PointerCoordinates.hpp" #include "PointerCoordinatesWindow.hpp" #include #include #include #include #include #include StelModule* PointerCoordinatesStelPluginInterface::getStelModule() const { return new PointerCoordinates(); } StelPluginInfo PointerCoordinatesStelPluginInterface::getPluginInfo() const { // Allow to load the resources when used as a static plugin Q_INIT_RESOURCE(PointerCoordinates); StelPluginInfo info; info.id = "PointerCoordinates"; info.displayedName = N_("Pointer Coordinates"); info.authors = "Alexander Wolf"; info.contact = "http://stellarium.org"; info.description = N_("This plugin shows the coordinates of the mouse pointer."); info.version = POINTERCOORDINATES_PLUGIN_VERSION; return info; } PointerCoordinates::PointerCoordinates() : currentPlace(TopRight) , flagShowCoordinates(false) , flagEnableAtStartup(false) , flagShowCoordinatesButton(false) , textColor(Vec3f(1,0.5,0)) , coordinatesPoint(Vec3d(0,0,0)) , fontSize(14) , toolbarButton(NULL) { setObjectName("PointerCoordinates"); mainWindow = new PointerCoordinatesWindow(); StelApp &app = StelApp::getInstance(); conf = app.getSettings(); gui = dynamic_cast(app.getGui()); } PointerCoordinates::~PointerCoordinates() { delete mainWindow; } void PointerCoordinates::init() { if (!conf->childGroups().contains("PointerCoordinates")) { qDebug() << "PointerCoordinates: no coordinates section exists in main config file - creating with defaults"; restoreDefaultConfiguration(); } // populate settings from main config file. loadConfiguration(); addAction("actionShow_MousePointer_Coordinates", N_("Pointer Coordinates"), N_("Show equatorial coordinates (J2000.0) of the mouse pointer"), "enabled", ""); enableCoordinates(getFlagEnableAtStartup()); setFlagShowCoordinatesButton(flagShowCoordinatesButton); } void PointerCoordinates::deinit() { // } void PointerCoordinates::draw(StelCore *core) { if (!isEnabled()) return; const StelProjectorP prj = core->getProjection(StelCore::FrameJ2000, StelCore::RefractionAuto); StelPainter sPainter(prj); sPainter.setColor(textColor[0], textColor[1], textColor[2], 1.f); font.setPixelSize(getFontSize()); sPainter.setFont(font); QPoint p = QCursor::pos(); // get screen coordinates of mouse cursor Vec3d mousePosition; float wh = prj->getViewportWidth()/2; // get half of width of the screen float hh = prj->getViewportHeight()/2; // get half of height of the screen float mx = p.x()-wh; // point 0 in center of the screen, axis X directed to right float my = p.y()-hh; // point 0 in center of the screen, axis Y directed to bottom // calculate position of mouse cursor via position of center of the screen (and invert axis Y) prj->unProject(prj->getViewportPosX()+wh+mx, prj->getViewportPosY()+hh+1-my, mousePosition); double dec_j2000, ra_j2000; StelUtils::rectToSphe(&ra_j2000,&dec_j2000,mousePosition); // Calculate RA/DE (J2000.0) and show it... QString coordsText = QString("%1/%2").arg(StelUtils::radToHmsStr(ra_j2000, true)).arg(StelUtils::radToDmsStr(dec_j2000, true)); sPainter.drawText(getCoordinatesPlace(coordsText).first, getCoordinatesPlace(coordsText).second, coordsText); } void PointerCoordinates::enableCoordinates(bool b) { flagShowCoordinates = b; } double PointerCoordinates::getCallOrder(StelModuleActionName actionName) const { if (actionName==StelModule::ActionDraw) return StelApp::getInstance().getModuleMgr().getModule("LandscapeMgr")->getCallOrder(actionName)+10.; return 0; } bool PointerCoordinates::configureGui(bool show) { if (show) { mainWindow->setVisible(true); } return true; } void PointerCoordinates::restoreDefaultConfiguration(void) { // Remove the whole section from the configuration file conf->remove("PointerCoordinates"); // Load the default values... loadConfiguration(); // ... then save them. saveConfiguration(); // But this doesn't save the color, so... conf->beginGroup("PointerCoordinates"); conf->setValue("text_color", "1,0.5,0"); conf->endGroup(); } void PointerCoordinates::loadConfiguration(void) { conf->beginGroup("PointerCoordinates"); setFlagEnableAtStartup(conf->value("enable_at_startup", false).toBool()); textColor = StelUtils::strToVec3f(conf->value("text_color", "1,0.5,0").toString()); setFontSize(conf->value("font_size", 14).toInt()); flagShowCoordinatesButton = conf->value("flag_show_button", true).toBool(); setCurrentCoordinatesPlaceKey(conf->value("current_displaying_place", "TopRight").toString()); conf->endGroup(); } void PointerCoordinates::saveConfiguration(void) { conf->beginGroup("PointerCoordinates"); conf->setValue("enable_at_startup", getFlagEnableAtStartup()); conf->setValue("flag_show_button", getFlagShowCoordinatesButton()); conf->setValue("current_displaying_place", getCurrentCoordinatesPlaceKey()); //conf->setValue("text_color", "1,0.5,0"); conf->setValue("font_size", getFontSize()); conf->endGroup(); } void PointerCoordinates::setFlagShowCoordinatesButton(bool b) { if (gui!=NULL) { if (b==true) { if (toolbarButton==NULL) { // Create the button toolbarButton = new StelButton(NULL, QPixmap(":/PointerCoordinates/bt_PointerCoordinates_On.png"), QPixmap(":/PointerCoordinates/bt_PointerCoordinates_Off.png"), QPixmap(":/graphicGui/glow32x32.png"), "actionShow_MousePointer_Coordinates"); } gui->getButtonBar()->addButton(toolbarButton, "065-pluginsGroup"); } else { gui->getButtonBar()->hideButton("actionShow_MousePointer_Coordinates"); } } flagShowCoordinatesButton = b; } // Set the current place of the string with coordinates from its key void PointerCoordinates::setCurrentCoordinatesPlaceKey(QString key) { const QMetaEnum& en = metaObject()->enumerator(metaObject()->indexOfEnumerator("CoordinatesPlace")); CoordinatesPlace coordPlace = (CoordinatesPlace)en.keyToValue(key.toLatin1().data()); if (coordPlace<0) { qWarning() << "Unknown coordinates place: " << key << "setting \"TopRight\" instead"; coordPlace = TopRight; } setCurrentCoordinatesPlace(coordPlace); } //Get the current place of the string with coordinates QString PointerCoordinates::getCurrentCoordinatesPlaceKey() const { return metaObject()->enumerator(metaObject()->indexOfEnumerator("CoordinatesPlace")).key(currentPlace); } QPair PointerCoordinates::getCoordinatesPlace(QString text) { int x = 0, y = 0; float coeff = 1.5; QFontMetrics fm(font); QSize fs = fm.size(Qt::TextSingleLine, text); switch(getCurrentCoordinatesPlace()) { case TopCenter: x = gui->getSkyGui()->getSkyGuiWidth()/2 - fs.width()/2; y = gui->getSkyGui()->getSkyGuiHeight() - fs.height()*coeff; break; case TopRight: x = 3*gui->getSkyGui()->getSkyGuiWidth()/4 - fs.width()/2; y = gui->getSkyGui()->getSkyGuiHeight() - fs.height()*coeff; break; case RightBottomCorner: x = gui->getSkyGui()->getSkyGuiWidth() - fs.width() - 10*coeff; y = fs.height(); break; } return qMakePair(x, y); }