celestialbrowser.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:9k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #include <libintl.h>
  2. #include <qradiobutton.h>
  3. #include <klistview.h>
  4. #include <kpopupmenu.h>
  5. #include <klocale.h>
  6. #include <qstatusbar.h>
  7. #include <vector>
  8. #include "celestiacore.h"
  9. #include "celengine/simulation.h"
  10. #include "celengine/stardb.h"
  11. #include "celengine/starbrowser.h"
  12. #include "celengine/selection.h"
  13. #include "celestialbrowser.h"
  14. #include "cellistviewitem.h"
  15. #include "selectionpopup.h"
  16. #include "celutil/utf8.h"
  17. /*
  18.  *  Constructs a CelestialBrowser which is a child of 'parent', with the
  19.  *  name 'name' and widget flags set to 'f'
  20.  *
  21.  *  The dialog will by default be modeless, unless you set 'modal' to
  22.  *  TRUE to construct a modal dialog.
  23.  */
  24. CelestialBrowser::CelestialBrowser( QWidget* parent, CelestiaCore* appCore)
  25.     : CelestialBrowserBase( parent, i18n("Celestial Browser"))
  26. {
  27.     this->parent = dynamic_cast<KdeApp*>(parent);
  28.     this->appCore = appCore;
  29.     this->appSim = appCore->getSimulation();
  30.     listStars->setAllColumnsShowFocus(true);
  31.     listStars->setRootIsDecorated(true);
  32.     listStars->setColumnAlignment(1, Qt::AlignRight);
  33.     listStars->setColumnAlignment(2, Qt::AlignRight);
  34.     listStars->setColumnAlignment(3, Qt::AlignRight);
  35.     listStars->setShowSortIndicator(true);
  36.     sbrowser.setSimulation(appSim);
  37.     radioNearest->setChecked(true);
  38.     statusBar()->hide();
  39. }
  40. /*
  41.  *  Destroys the object and frees any allocated resources
  42.  */
  43. CelestialBrowser::~CelestialBrowser()
  44. {
  45.     // no need to delete child widgets, Qt does it all for us
  46. }
  47. /*
  48.  * public slot
  49.  */
  50. void CelestialBrowser::slotNearest(bool)
  51. {
  52.     sbrowser.setPredicate(StarBrowser::NearestStars);
  53.     listStars->setSorting(1);
  54.     slotRefresh();
  55. }
  56. /*
  57.  * public slot
  58.  */
  59. void CelestialBrowser::slotBrightest(bool)
  60. {
  61.     sbrowser.setPredicate(StarBrowser::BrightestStars);
  62.     listStars->setSorting(3);
  63.     slotRefresh();
  64. }
  65. /*
  66.  * public slot
  67.  */
  68. void CelestialBrowser::slotBrighter(bool)
  69. {
  70.     sbrowser.setPredicate(StarBrowser::BrighterStars);
  71.     listStars->setSorting(2);
  72.     slotRefresh();
  73. }
  74. /*
  75.  * public slot
  76.  */
  77. void CelestialBrowser::slotWithPlanets(bool)
  78. {
  79.     sbrowser.setPredicate(StarBrowser::StarsWithPlanets);
  80.     listStars->setSorting(1);
  81.     slotRefresh();
  82. }
  83. /*
  84.  * public slot
  85.  */
  86. void CelestialBrowser::slotRefresh()
  87. {
  88.     StarDatabase* stardb = appSim->getUniverse()->getStarCatalog();
  89.     sbrowser.refresh();
  90.     std::vector<const Star*> *stars = sbrowser.listStars(100);
  91.     listStars->clear();
  92.     browserSel.obj = const_cast<Star*>((*stars)[0]);
  93.     browserSel.type = Selection::Type_Star;
  94.     SolarSystemCatalog* solarSystemCatalog = appSim->getUniverse()->getSolarSystemCatalog();
  95.     UniversalCoord ucPos = appSim->getObserver().getPosition();
  96.     Point3f obsPos( (double)ucPos.x * 1e-6,
  97.                     (double)ucPos.y * 1e-6,
  98.                     (double)ucPos.z * 1e-6);
  99.     setlocale(LC_NUMERIC, "");
  100.     for (std::vector<const Star*>::iterator i = stars->begin();
  101.          i != stars->end() ;
  102.          i++ )
  103.     {
  104.         const Star *star=(Star *)(*i);
  105.         QString starClass(star->getSpectralType());
  106.         if (starClass == "Bary") continue;
  107.         Point3f starPos = star->getPosition();
  108.         Vec3d v(starPos.x - obsPos.x,
  109.                 starPos.y - obsPos.y,
  110.                 starPos.z - obsPos.z);
  111.         float dist = v.length();
  112.         CelListViewItem *starItem = new CelListViewItem(listStars, stardb->getStarName(*star), dist, _("ly"),
  113.                 astro::absToAppMag(star->getAbsoluteMagnitude(), dist),
  114.                 star->getAbsoluteMagnitude(), starClass);
  115.         SolarSystemCatalog::iterator iter = solarSystemCatalog->find(star->getCatalogNumber());
  116.         if (iter != solarSystemCatalog->end())
  117.         {
  118.             addPlanetarySystem(starItem, iter->second->getPlanets());
  119.         }
  120.     }
  121.     setlocale(LC_NUMERIC, "C");
  122.     delete(stars);
  123. }
  124. void CelestialBrowser::addPlanetarySystem(CelListViewItem* parentItem, const PlanetarySystem* system, const Point3d* parentBodyPos) 
  125. {
  126.     if (parentItem == NULL || system == NULL) return;
  127.     for ( int i = 0; i < system->getSystemSize(); i++ ) 
  128.     {
  129.         const Body* body = system->getBody(i);
  130.         if (body->getClassification() & (Body::Barycenter | Body::Invisible)) continue;
  131.         Point3d bodyPos = body->getAstrocentricPosition(appSim->getTime());
  132.         CelListViewItem* item = NULL;
  133.         if (parentBodyPos == NULL) 
  134.         {
  135.             double bodyDist = bodyPos.distanceFromOrigin();
  136.             item = new CelListViewItem(parentItem, body->getName(true),
  137.                                        bodyDist / KM_PER_AU, _("au"),
  138.                                        0, 0, getClassification(body->getClassification()));
  139.         } 
  140.         else 
  141.         {
  142.             Vec3d bodyVec(parentBodyPos->x - bodyPos.x, parentBodyPos->y - bodyPos.y, parentBodyPos->z - bodyPos.z);
  143.             double bodyDist = bodyVec.length();
  144.             item = new CelListViewItem(parentItem, body->getName(true),
  145.                                        bodyDist, "km", 
  146.                                        0, 0, getClassification(body->getClassification()));
  147.         }
  148.         addPlanetarySystem(item, body->getSatellites(), &bodyPos);
  149.     }
  150. }
  151. QString CelestialBrowser::getClassification(int c) const{
  152.     QString cl;
  153.     switch(c)
  154.         {
  155.         case Body::Planet:
  156.             cl = i18n("Planet");
  157.             break;
  158.         case Body::Moon:
  159.             cl = i18n("Moon");
  160.             break;
  161.         case Body::Asteroid:
  162.             cl = i18n("Asteroid");
  163.             break;
  164.         case Body::Comet:
  165.             cl = i18n("Comet");
  166.             break;
  167.         case Body::Spacecraft:
  168.             cl = i18n("Spacecraft");
  169.             break;
  170.         case Body::Invisible:
  171.             cl = i18n("Invisible");
  172.             break;
  173.         case Body::Barycenter:
  174.             cl = i18n("Barycenter");
  175.             break;
  176.         case Body::SmallBody:
  177.             cl = i18n("Small Body");
  178.             break;
  179.         case Body::DwarfPlanet:
  180.             cl = i18n("Dwarf Planet");
  181.             break;
  182.         case Body::Unknown:
  183.         default:
  184.             cl = i18n("-");
  185.             break;
  186.         }
  187.     return cl;
  188. }
  189. void CelestialBrowser::slotRightClickOnStar(QListViewItem* item, const QPoint& p, int /*col*/) {
  190.     CelListViewItem *i = dynamic_cast<CelListViewItem*>(item);
  191.     std::string name = i->getName();
  192.     while ( (i = dynamic_cast<CelListViewItem*>(i->parent())) ) {
  193.         name = i->getName() + "/" + name;
  194.     }
  195.     Selection sel = appSim->findObjectFromPath(name, true);
  196.     SelectionPopup popup(this, appCore, sel);
  197.     popup.init();
  198.     int id = popup.exec(p);
  199.     popup.process(id);
  200. }
  201. CelListViewItem::CelListViewItem( QListView * parent, std::string _name, double _dist, const char* _dist_unit, double _app_mag, double _abs_mag, QString _type )
  202.     : QListViewItem(parent),
  203.     name(_name),
  204.     dist(_dist),
  205.     dist_unit(_dist_unit),
  206.     app_mag(_app_mag),
  207.     abs_mag(_abs_mag),
  208.     type(_type)
  209. {
  210.     char buf[20];
  211.     QString label;
  212.     this->setText(0, QString::fromUtf8(ReplaceGreekLetterAbbr(_name).c_str()));
  213.     sprintf(buf, " %'.2f %s", _dist, _dist_unit);
  214.     label = QString::fromUtf8(buf);
  215.     this->setText(1, label);
  216.     if (_app_mag != 0) {
  217.         sprintf(buf, " %'.2f ", _app_mag);
  218.         label = QString::fromUtf8(buf);
  219.         this->setText(2, label);
  220.     }
  221.     if (_abs_mag != 0) {
  222.         sprintf(buf, " %'.2f ", _abs_mag);
  223.         label = QString::fromUtf8(buf);
  224.         this->setText(3, label);
  225.     }
  226.     this->setText(4, _type);
  227. }
  228. CelListViewItem::CelListViewItem( QListViewItem * parent, std::string _name, double _dist, const char* _dist_unit, double _app_mag, double _abs_mag, QString _type )
  229.     : QListViewItem(parent),
  230.     name(_name),
  231.     dist(_dist),
  232.     dist_unit(_dist_unit),
  233.     app_mag(_app_mag),
  234.     abs_mag(_abs_mag),
  235.     type(_type)
  236. {
  237.     char buf[20];
  238.     QString label;
  239.     this->setText(0, QString::fromUtf8(ReplaceGreekLetterAbbr(_name).c_str()));
  240.     sprintf(buf, " %'.2f %s", _dist, _dist_unit);
  241.     label = QString::fromUtf8(buf);
  242.     this->setText(1, label);
  243.     if (_app_mag != 0) {
  244.         sprintf(buf, " %'.2f ", _app_mag);
  245.         label = QString::fromUtf8(buf);
  246.         this->setText(2, label);
  247.     }
  248.     if (_abs_mag != 0) {
  249.         sprintf(buf, " %'.2f ", _abs_mag);
  250.         label = QString::fromUtf8(buf);
  251.         this->setText(3, label);
  252.     }
  253.     this->setText(4, _type);
  254. }
  255. CelListViewItem::~CelListViewItem() {
  256. }
  257. int CelListViewItem::compare ( QListViewItem * i, int col, bool ascending ) const {
  258.     if (col == 0 || col > 3) {
  259.         return key(col, ascending).localeAwareCompare(i->key(col, ascending));
  260.     } else {
  261.         if (col == 1) return (dist > dynamic_cast<CelListViewItem*>(i)->getDist()) * 2 - 1;
  262.         if (col == 2) return (app_mag > dynamic_cast<CelListViewItem*>(i)->getAppMag()) * 2 - 1;
  263.         if (col == 3) return (abs_mag > dynamic_cast<CelListViewItem*>(i)->getAbsMag()) * 2 - 1;
  264.         else return -1; // NOTE: Control should never reach here
  265.     }
  266. }