Simple Comet Tails.

Valentin Boettcher valentin at boettcher.cf
Wed Apr 5 21:45:57 UTC 2017


I am very sorry. I mixed up my astyle configs.


Here is the well-formated version.

diff --git a/.astylerc b/.astylerc
new file mode 100644
index 000000000..01ad4bed2
--- /dev/null
+++ b/.astylerc
@@ -0,0 +1,7 @@
+
+-A1
+-W3
+-k2
+-S
+-xG
+-C
diff --git a/kstars/kstars.kcfg b/kstars/kstars.kcfg
index 2754758fa..6b06c2f2a 100644
--- a/kstars/kstars.kcfg
+++ b/kstars/kstars.kcfg
@@ -378,6 +378,11 @@
          <whatsthis>Toggle whether comets are drawn in the sky
map.</whatsthis>
          <default>true</default>
       </entry>
+      <entry name="ShowCometComas" type="Bool">
+         <label>Draw comet comas in the sky map?</label>
+         <whatsthis>Toggle whether comet comas are drawn in the sky
map.</whatsthis>
+         <default>true</default>
+      </entry>
       <entry name="ShowCometNames" type="Bool">
          <label>Label comet names in the sky map?</label>
          <whatsthis>Toggle whether comet name labels are drawn in the
sky map.</whatsthis>
diff --git a/kstars/options/opssolarsystem.cpp
b/kstars/options/opssolarsystem.cpp
index df1969d46..6ac1f5a4c 100644
--- a/kstars/options/opssolarsystem.cpp
+++ b/kstars/options/opssolarsystem.cpp
@@ -32,6 +32,7 @@ OpsSolarSystem::OpsSolarSystem()
     connect( kcfg_ShowAsteroids, SIGNAL( toggled(bool) ), SLOT(
slotAsteroidWidgets(bool) ) );
     connect( kcfg_MagLimitAsteroidDownload, SIGNAL( valueChanged(
double ) ), this, SLOT( slotChangeMagDownload( double ) ) );
     connect( kcfg_ShowComets, SIGNAL( toggled(bool) ), SLOT(
slotCometWidgets(bool) ) );
+
     connect( ClearAllTrails, SIGNAL( clicked() ), KStars::Instance(),
SLOT( slotClearAllTrails() ) );
     connect( showAllPlanets, SIGNAL( clicked() ), this, SLOT(
slotSelectPlanets() ) );
     connect( showNonePlanets, SIGNAL( clicked() ), this, SLOT(
slotSelectPlanets() ) );
@@ -94,6 +95,7 @@ void OpsSolarSystem::slotCometWidgets( bool on )
     kcfg_ShowCometNames->setEnabled( on );
     kcfg_MaxRadCometName->setEnabled( on );
     textLabel4->setEnabled( on );
+    kcfg_ShowCometComas->setEnabled( on );
 }
 
 void OpsSolarSystem::slotSelectPlanets()
@@ -127,4 +129,3 @@ void OpsSolarSystem::slotApply()
     KStars::Instance()->updateTime();
     KStars::Instance()->map()->forceUpdate();
 }
-
diff --git a/kstars/options/opssolarsystem.ui
b/kstars/options/opssolarsystem.ui
index 62edda6c0..d1e36c493 100644
--- a/kstars/options/opssolarsystem.ui
+++ b/kstars/options/opssolarsystem.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>438</width>
-    <height>516</height>
+    <width>465</width>
+    <height>644</height>
    </rect>
   </property>
   <layout class="QVBoxLayout">
@@ -285,6 +285,45 @@
      <layout class="QVBoxLayout">
       <item>
        <layout class="QGridLayout">
+        <item row="1" column="1">
+         <widget class="QLabel" name="label_3">
+          <property name="text">
+           <string>Download asteroids brighter than</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="0">
+         <widget class="QCheckBox" name="kcfg_ShowAsteroids">
+          <property name="toolTip">
+           <string>Draw asteroids?</string>
+          </property>
+          <property name="whatsThis">
+           <string>If checked, asteroids will be drawn on the map</string>
+          </property>
+          <property name="text">
+           <string>Asteroids</string>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">solarButtonGroup</string>
+          </attribute>
+         </widget>
+        </item>
+        <item row="4" column="0">
+         <widget class="QCheckBox" name="kcfg_ShowComets">
+          <property name="toolTip">
+           <string>Draw comets?</string>
+          </property>
+          <property name="whatsThis">
+           <string>If checked, comets will be drawn on the map</string>
+          </property>
+          <property name="text">
+           <string>Comets</string>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">solarButtonGroup</string>
+          </attribute>
+         </widget>
+        </item>
         <item row="3" column="0">
          <spacer>
           <property name="orientation">
@@ -301,34 +340,17 @@
           </property>
          </spacer>
         </item>
-        <item row="1" column="2">
-         <layout class="QHBoxLayout" name="horizontalLayout">
-          <item>
-           <widget class="QDoubleSpinBox"
name="kcfg_MagLimitAsteroidDownload"/>
-          </item>
-          <item>
-           <widget class="QLabel" name="label_2">
-            <property name="text">
-             <string>mag</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </item>
-        <item row="0" column="0">
-         <widget class="QCheckBox" name="kcfg_ShowAsteroids">
-          <property name="toolTip">
-           <string>Draw asteroids?</string>
-          </property>
-          <property name="whatsThis">
-           <string>If checked, asteroids will be drawn on the map</string>
+        <item row="2" column="0" colspan="3">
+         <widget class="QLabel" name="MagLimitAsteroidDownloadWarning">
+          <property name="styleSheet">
+           <string notr="true">color:red; font-weight:bold;</string>
           </property>
           <property name="text">
-           <string>Asteroids</string>
+           <string>This value might result in a big data file and
reduced performance!</string>
+          </property>
+          <property name="alignment">
+           <set>Qt::AlignCenter</set>
           </property>
-          <attribute name="buttonGroup">
-           <string notr="true">solarButtonGroup</string>
-          </attribute>
          </widget>
         </item>
         <item row="0" column="1">
@@ -338,6 +360,22 @@
           </property>
          </widget>
         </item>
+        <item row="4" column="1">
+         <widget class="QCheckBox" name="kcfg_ShowCometNames">
+          <property name="toolTip">
+           <string>Show names of comets near the Sun</string>
+          </property>
+          <property name="whatsThis">
+           <string>If checked, the comets near the Sun will have name
labels attached.  Comets vary in brightness in their orbits, so a faint
magnitude is not effective in this case.</string>
+          </property>
+          <property name="text">
+           <string>Show names of comets within</string>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">solarButtonGroup</string>
+          </attribute>
+         </widget>
+        </item>
         <item row="0" column="2">
          <layout class="QHBoxLayout">
           <item>
@@ -368,44 +406,42 @@
           </item>
          </layout>
         </item>
-        <item row="3" column="1">
-         <layout class="QHBoxLayout">
+        <item row="1" column="2">
+         <layout class="QHBoxLayout" name="horizontalLayout">
           <item>
-           <widget class="QCheckBox" name="kcfg_ShowAsteroidNames">
-            <property name="toolTip">
-             <string>Attach name labels to asteroids?</string>
-            </property>
-            <property name="whatsThis">
-             <string>If checked, then name labels will be attached to
asteroids</string>
-            </property>
+           <widget class="QDoubleSpinBox"
name="kcfg_MagLimitAsteroidDownload"/>
+          </item>
+          <item>
+           <widget class="QLabel" name="label_2">
             <property name="text">
-             <string>Show names</string>
+             <string>mag</string>
             </property>
-            <attribute name="buttonGroup">
-             <string notr="true">solarButtonGroup</string>
-            </attribute>
            </widget>
           </item>
+         </layout>
+        </item>
+        <item row="4" column="2">
+         <layout class="QHBoxLayout">
           <item>
-           <spacer>
-            <property name="orientation">
-             <enum>Qt::Horizontal</enum>
+           <widget class="QDoubleSpinBox" name="kcfg_MaxRadCometName">
+            <property name="toolTip">
+             <string>Maximum distance for comet names</string>
             </property>
-            <property name="sizeType">
-             <enum>QSizePolicy::Preferred</enum>
+            <property name="whatsThis">
+             <string>Set the maximum distance from the Sun for a comet
to have a name label, in Astronomical Units (AU).  1 AU is the distance
between the Earth and the Sun, approximately 150 million km</string>
             </property>
-            <property name="sizeHint" stdset="0">
-             <size>
-              <width>20</width>
-              <height>20</height>
-             </size>
+            <property name="decimals">
+             <number>2</number>
             </property>
-           </spacer>
+            <property name="maximum">
+             <double>9999.000000000000000</double>
+            </property>
+           </widget>
           </item>
           <item>
-           <widget class="QLabel" name="LabelDensity">
+           <widget class="QLabel" name="textLabel4">
             <property name="text">
-             <string>Label density:</string>
+             <string>AU</string>
             </property>
            </widget>
           </item>
@@ -421,82 +457,53 @@
           </property>
          </widget>
         </item>
-        <item row="4" column="0">
-         <widget class="QCheckBox" name="kcfg_ShowComets">
-          <property name="toolTip">
-           <string>Draw comets?</string>
-          </property>
-          <property name="whatsThis">
-           <string>If checked, comets will be drawn on the map</string>
-          </property>
-          <property name="text">
-           <string>Comets</string>
-          </property>
-          <attribute name="buttonGroup">
-           <string notr="true">solarButtonGroup</string>
-          </attribute>
-         </widget>
-        </item>
-        <item row="4" column="1">
-         <widget class="QCheckBox" name="kcfg_ShowCometNames">
-          <property name="toolTip">
-           <string>Show names of comets near the Sun</string>
-          </property>
-          <property name="whatsThis">
-           <string>If checked, the comets near the Sun will have name
labels attached.  Comets vary in brightness in their orbits, so a faint
magnitude is not effective in this case.</string>
-          </property>
-          <property name="text">
-           <string>Show names of comets within</string>
-          </property>
-          <attribute name="buttonGroup">
-           <string notr="true">solarButtonGroup</string>
-          </attribute>
-         </widget>
-        </item>
-        <item row="4" column="2">
+        <item row="3" column="1">
          <layout class="QHBoxLayout">
           <item>
-           <widget class="QDoubleSpinBox" name="kcfg_MaxRadCometName">
+           <widget class="QCheckBox" name="kcfg_ShowAsteroidNames">
             <property name="toolTip">
-             <string>Maximum distance for comet names</string>
+             <string>Attach name labels to asteroids?</string>
             </property>
             <property name="whatsThis">
-             <string>Set the maximum distance from the Sun for a comet
to have a name label, in Astronomical Units (AU).  1 AU is the distance
between the Earth and the Sun, approximately 150 million km</string>
-            </property>
-            <property name="decimals">
-             <number>2</number>
+             <string>If checked, then name labels will be attached to
asteroids</string>
             </property>
-            <property name="maximum">
-             <double>9999.000000000000000</double>
+            <property name="text">
+             <string>Show names</string>
             </property>
+            <attribute name="buttonGroup">
+             <string notr="true">solarButtonGroup</string>
+            </attribute>
            </widget>
           </item>
           <item>
-           <widget class="QLabel" name="textLabel4">
+           <spacer>
+            <property name="orientation">
+             <enum>Qt::Horizontal</enum>
+            </property>
+            <property name="sizeType">
+             <enum>QSizePolicy::Preferred</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>20</width>
+              <height>20</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+          <item>
+           <widget class="QLabel" name="LabelDensity">
             <property name="text">
-             <string>AU</string>
+             <string>Label density:</string>
             </property>
            </widget>
           </item>
          </layout>
         </item>
-        <item row="1" column="1">
-         <widget class="QLabel" name="label_3">
-          <property name="text">
-           <string>Download asteroids brighter than</string>
-          </property>
-         </widget>
-        </item>
-        <item row="2" column="0" colspan="3">
-         <widget class="QLabel" name="MagLimitAsteroidDownloadWarning">
-          <property name="styleSheet">
-           <string notr="true">color:red; font-weight:bold;</string>
-          </property>
+        <item row="5" column="1">
+         <widget class="QCheckBox" name="kcfg_ShowCometComas">
           <property name="text">
-           <string>This value might result in a big data file and
reduced performance!</string>
-          </property>
-          <property name="alignment">
-           <set>Qt::AlignCenter</set>
+           <string>Show Comet Comas</string>
           </property>
          </widget>
         </item>
diff --git a/kstars/skycomponents/cometscomponent.cpp
b/kstars/skycomponents/cometscomponent.cpp
index 7faf91675..8fc949e79 100644
--- a/kstars/skycomponents/cometscomponent.cpp
+++ b/kstars/skycomponents/cometscomponent.cpp
@@ -95,42 +95,42 @@ void CometsComponent::loadData()
     long double JD;
     float M1, M2, K1, K2, diameter, albedo, rot_period, period;
 
-    emitProgressText(i18n("Loading comets"));
+    emitProgressText( i18n( "Loading comets" ) );
 
-    qDeleteAll(m_ObjectList);
+    qDeleteAll( m_ObjectList );
     m_ObjectList.clear();
 
-    objectNames(SkyObject::COMET).clear();
-    objectLists(SkyObject::COMET).clear();
+    objectNames( SkyObject::COMET ).clear();
+    objectLists( SkyObject::COMET ).clear();
 
     QList< QPair<QString, KSParser::DataTypes> > sequence;
-    sequence.append(qMakePair(QString("full name"), KSParser::D_QSTRING));
-    sequence.append(qMakePair(QString("epoch_mjd"), KSParser::D_INT));
-    sequence.append(qMakePair(QString("q"), KSParser::D_DOUBLE));
-    sequence.append(qMakePair(QString("e"), KSParser::D_DOUBLE));
-    sequence.append(qMakePair(QString("i"), KSParser::D_DOUBLE));
-    sequence.append(qMakePair(QString("w"), KSParser::D_DOUBLE));
-    sequence.append(qMakePair(QString("om"), KSParser::D_DOUBLE));
-    sequence.append(qMakePair(QString("tp_calc"), KSParser::D_DOUBLE));
-    sequence.append(qMakePair(QString("orbit_id"), KSParser::D_QSTRING));
-    sequence.append(qMakePair(QString("neo"), KSParser::D_QSTRING));
-    sequence.append(qMakePair(QString("M1"), KSParser::D_FLOAT));
-    sequence.append(qMakePair(QString("M2"), KSParser::D_FLOAT));
-    sequence.append(qMakePair(QString("diameter"), KSParser::D_FLOAT));
-    sequence.append(qMakePair(QString("extent"), KSParser::D_QSTRING));
-    sequence.append(qMakePair(QString("albedo"), KSParser::D_FLOAT));
-    sequence.append(qMakePair(QString("rot_period"), KSParser::D_FLOAT));
-    sequence.append(qMakePair(QString("per_y"), KSParser::D_FLOAT));
-    sequence.append(qMakePair(QString("moid"), KSParser::D_DOUBLE));
-    sequence.append(qMakePair(QString("class"), KSParser::D_QSTRING));
-    sequence.append(qMakePair(QString("H"), KSParser::D_SKIP));
-    sequence.append(qMakePair(QString("G"), KSParser::D_SKIP));
-
-    QString file_name =
KSPaths::locate(QStandardPaths::GenericDataLocation,
QString("comets.dat") );
-    KSParser cometParser(file_name, '#', sequence);
+    sequence.append( qMakePair( QString( "full name" ),
KSParser::D_QSTRING ) );
+    sequence.append( qMakePair( QString( "epoch_mjd" ), KSParser::D_INT
) );
+    sequence.append( qMakePair( QString( "q" ), KSParser::D_DOUBLE ) );
+    sequence.append( qMakePair( QString( "e" ), KSParser::D_DOUBLE ) );
+    sequence.append( qMakePair( QString( "i" ), KSParser::D_DOUBLE ) );
+    sequence.append( qMakePair( QString( "w" ), KSParser::D_DOUBLE ) );
+    sequence.append( qMakePair( QString( "om" ), KSParser::D_DOUBLE ) );
+    sequence.append( qMakePair( QString( "tp_calc" ),
KSParser::D_DOUBLE ) );
+    sequence.append( qMakePair( QString( "orbit_id" ),
KSParser::D_QSTRING ) );
+    sequence.append( qMakePair( QString( "neo" ), KSParser::D_QSTRING ) );
+    sequence.append( qMakePair( QString( "M1" ), KSParser::D_FLOAT ) );
+    sequence.append( qMakePair( QString( "M2" ), KSParser::D_FLOAT ) );
+    sequence.append( qMakePair( QString( "diameter" ),
KSParser::D_FLOAT ) );
+    sequence.append( qMakePair( QString( "extent" ),
KSParser::D_QSTRING ) );
+    sequence.append( qMakePair( QString( "albedo" ), KSParser::D_FLOAT ) );
+    sequence.append( qMakePair( QString( "rot_period" ),
KSParser::D_FLOAT ) );
+    sequence.append( qMakePair( QString( "per_y" ), KSParser::D_FLOAT ) );
+    sequence.append( qMakePair( QString( "moid" ), KSParser::D_DOUBLE ) );
+    sequence.append( qMakePair( QString( "class" ), KSParser::D_QSTRING
) );
+    sequence.append( qMakePair( QString( "H" ), KSParser::D_SKIP ) );
+    sequence.append( qMakePair( QString( "G" ), KSParser::D_SKIP ) );
+
+    QString file_name = KSPaths::locate(
QStandardPaths::GenericDataLocation, QString( "comets.dat" ) );
+    KSParser cometParser( file_name, '#', sequence );
 
     QHash<QString, QVariant> row_content;
-    while (cometParser.HasNextRow())
+    while ( cometParser.HasNextRow() )
     {
         KSComet * com = 0;
         row_content = cometParser.ReadNextRow();
@@ -146,12 +146,12 @@ void CometsComponent::loadData()
         orbit_id = row_content["orbit_id"].toString();
         neo = row_content["neo"] == "Y";
 
-        if(row_content["M1"].toFloat()==0.0)
+        if ( row_content["M1"].toFloat() == 0.0 )
             M1 = 101.0;
         else
             M1 = row_content["M1"].toFloat();
 
-        if(row_content["M2"].toFloat()==0.0)
+        if ( row_content["M2"].toFloat() == 0.0 )
             M2 = 101.0;
         else
             M2 = row_content["M2"].toFloat();
@@ -186,34 +186,34 @@ void CometsComponent::loadData()
 
         // Add *short* name to the list of object names
         objectNames( SkyObject::COMET ).append( com->name() );
-        objectLists( SkyObject::COMET ).append(QPair<QString, const
SkyObject *>(com->name(),com));
+        objectLists( SkyObject::COMET ).append( QPair<QString, const
SkyObject *>( com->name(), com ) );
     }
 }
 
 void CometsComponent::draw( SkyPainter * skyp )
 {
-    Q_UNUSED(skyp)
+    Q_UNUSED( skyp )
 #ifndef KSTARS_LITE
-    if( !selected() || Options::zoomFactor() < 10*MINZOOM )
+    if ( !selected() || Options::zoomFactor() < 10 * MINZOOM )
         return;
 
     bool hideLabels =  ! Options::showCometNames() ||
-                       (SkyMap::Instance()->isSlewing() &&
-                        Options::hideLabels() );
+                       ( SkyMap::Instance()->isSlewing() &&
+                         Options::hideLabels() );
     double rsunLabelLimit = Options::maxRadCometName();
 
     //FIXME: Should these be config'able?
-    skyp->setPen( QPen( QColor( "darkcyan" ) ) );
-    skyp->setBrush( QBrush( QColor( "darkcyan" ) ) );
+    skyp->setPen( QPen( QColor( "transparent" ) ) );
+    skyp->setBrush( QBrush( QColor( "white" ) ) );
 
     foreach ( SkyObject * so, m_ObjectList )
     {
-        KSComet * com = (KSComet *)so;
-        double mag= com->mag();
-        if (std::isnan(mag) == 0)
+        KSComet * com = ( KSComet * )so;
+        double mag = com->mag();
+        if ( std::isnan( mag ) == 0 )
         {
-            bool drawn = skyp->drawPointSource(com,mag);
-            if ( drawn && !(hideLabels || com->rsun() >= rsunLabelLimit) )
+            bool drawn = skyp->drawComet( com );
+            if ( drawn && !( hideLabels || com->rsun() >=
rsunLabelLimit ) )
                 SkyLabeler::AddLabel( com, SkyLabeler::COMET_LABEL );
         }
     }
@@ -224,15 +224,15 @@ void CometsComponent::updateDataFile()
 {
     downloadJob = new FileDownloader();
 
-    downloadJob->setProgressDialogEnabled(true, i18n("Comets Update"),
i18n("Downloading comets updates..."));
+    downloadJob->setProgressDialogEnabled( true, i18n( "Comets Update"
), i18n( "Downloading comets updates..." ) );
 
-    connect(downloadJob, SIGNAL(downloaded()), this,
SLOT(downloadReady()));
-    connect(downloadJob, SIGNAL(error(QString)), this,
SLOT(downloadError(QString)));
+    connect( downloadJob, SIGNAL( downloaded() ), this, SLOT(
downloadReady() ) );
+    connect( downloadJob, SIGNAL( error( QString ) ), this, SLOT(
downloadError( QString ) ) );
 
     QUrl url = QUrl( "https://ssd.jpl.nasa.gov/sbdb_query.cgi" );
-    QByteArray post_data = KSUtils::getJPLQueryString("com",
"AcBdBiBgBjBlBkBqBbAgAkAlApAqArAsBsBtChAmAn", 
QVector<KSUtils::JPLFilter> {{"Af", "!=", "D"}});
+    QByteArray post_data = KSUtils::getJPLQueryString( "com",
"AcBdBiBgBjBlBkBqBbAgAkAlApAqArAsBsBtChAmAn", 
QVector<KSUtils::JPLFilter> {{"Af", "!=", "D"}} );
 
-    downloadJob->post(url, post_data);
+    downloadJob->post( url, post_data );
 }
 
 void CometsComponent::downloadReady()
@@ -242,8 +242,8 @@ void CometsComponent::downloadReady()
     data.insert( 0, '#' );
 
     // Write data to asteroids.dat
-    QFile file(
KSPaths::writableLocation(QStandardPaths::GenericDataLocation) +
"comets.dat" ) ;
-    file.open( QIODevice::WriteOnly|QIODevice::Truncate|QIODevice::Text );
+    QFile file( KSPaths::writableLocation(
QStandardPaths::GenericDataLocation ) + "comets.dat" ) ;
+    file.open( QIODevice::WriteOnly | QIODevice::Truncate |
QIODevice::Text );
     file.write( data );
     file.close();
 
@@ -259,12 +259,12 @@ void CometsComponent::downloadReady()
     downloadJob->deleteLater();
 }
 
-void CometsComponent::downloadError(const QString &errorString)
+void CometsComponent::downloadError( const QString &errorString )
 {
 #ifndef KSTARS_LITE
-    KMessageBox::error(0, i18n("Error downloading asteroids data: %1",
errorString));
+    KMessageBox::error( 0, i18n( "Error downloading asteroids data:
%1", errorString ) );
 #else
-    qDebug() << i18n("Error downloading comets data: %1", errorString);
+    qDebug() << i18n( "Error downloading comets data: %1", errorString );
 #endif
     downloadJob->deleteLater();
 }
diff --git a/kstars/skycomponents/solarsystemcomposite.h
b/kstars/skycomponents/solarsystemcomposite.h
index 1f2c30ca9..a5fa1d13b 100644
--- a/kstars/skycomponents/solarsystemcomposite.h
+++ b/kstars/skycomponents/solarsystemcomposite.h
@@ -48,6 +48,12 @@ class SolarSystemComposite : public SkyComposite
         {
             return m_Earth;
         }
+
+        KSSun * sun()
+        {
+            return m_Sun;
+        }
+
         const QList<SkyObject *> &asteroids() const;
         const QList<SkyObject *> &comets() const;
         const QList<SkyObject *> &planetObjects() const;
diff --git a/kstars/skyobjects/kscomet.h b/kstars/skyobjects/kscomet.h
index 37fdfb3cc..05d74e7f0 100644
--- a/kstars/skyobjects/kscomet.h
+++ b/kstars/skyobjects/kscomet.h
@@ -149,17 +149,17 @@ class KSComet : public KSPlanetBase
         /**
          *@short Sets the comet's apparent tail length in degrees
          */
-        void setTailAngSize( double tailangsize )
+        void setComaAngSize( double comaAngSize )
         {
-            TailAngSize = tailangsize;
+            ComaAngSize = comaAngSize;
         }
 
         /**
          *@return the estimated angular size of the tail as a dms
          */
-        inline dms getTailAngSize()
+        inline dms getComaAngSize()
         {
-            return dms( TailAngSize );
+            return dms( ComaAngSize );
         }
 
         /**
@@ -295,7 +295,7 @@ class KSComet : public KSPlanetBase
             *@param Earth planet Earth (needed to calculate geocentric
coords)
             *@return true if position was successfully calculated.
             */
-        virtual bool findGeocentricPosition( const KSNumbers * num,
const KSPlanetBase * Earth=NULL );
+        virtual bool findGeocentricPosition( const KSNumbers * num,
const KSPlanetBase * Earth = NULL );
 
         /**
          *@short Estimate physical parameters of the comet such as coma
size, tail length and size of the nucleus
@@ -305,11 +305,11 @@ class KSComet : public KSPlanetBase
 
 
     private:
-        virtual void findMagnitude(const KSNumbers *);
+        virtual void findMagnitude( const KSNumbers * );
 
         long double JD, JDp;
         double q, e, a, P, EarthMOID;
-        double TailSize, TailAngSize, ComaSize, NuclearSize; // All in
kilometres
+        double TailSize, ComaAngSize, ComaSize, NuclearSize; // All in
kilometres
         float M1, M2, K1, K2, Albedo, Diameter, RotationPeriod, Period;
         dms i, w, N;
         QString OrbitID, OrbitClass, Dimensions ;
diff --git a/kstars/skyobjects/ksplanetbase.cpp
b/kstars/skyobjects/ksplanetbase.cpp
index f30d87c10..171e38a1a 100644
--- a/kstars/skyobjects/ksplanetbase.cpp
+++ b/kstars/skyobjects/ksplanetbase.cpp
@@ -39,16 +39,16 @@
 #include "texturemanager.h"
 
 QVector<QColor> KSPlanetBase::planetColor = QVector<QColor>() <<
-        QColor("slateblue") << //Mercury
-        QColor("lightgreen") << //Venus
-        QColor("red") << //Mars
-        QColor("goldenrod") << //Jupiter
-        QColor("khaki") << //Saturn
-        QColor("lightseagreen") << //Uranus
-        QColor("skyblue") << //Neptune
-        QColor("grey") << //Pluto
-        QColor("yellow") << //Sun
-        QColor("white"); //Moon
+        QColor( "slateblue" ) << //Mercury
+        QColor( "lightgreen" ) << //Venus
+        QColor( "red" ) << //Mars
+        QColor( "goldenrod" ) << //Jupiter
+        QColor( "khaki" ) << //Saturn
+        QColor( "lightseagreen" ) << //Uranus
+        QColor( "skyblue" ) << //Neptune
+        QColor( "grey" ) << //Pluto
+        QColor( "yellow" ) << //Sun
+        QColor( "white" ); //Moon
 
 
 const SkyObject::UID KSPlanetBase::UID_SOL_BIGOBJ   = 0;
@@ -119,7 +119,7 @@ void KSPlanetBase::updateCoords( const KSNumbers *
num, bool includePlanets, con
         {
             findPosition( num, lat, LST, kd->skyComposite()->earth() );
             //Don't add to the trail this time
-            if( hasTrail() )
+            if ( hasTrail() )
                 Trail.takeLast();
         }
         else
@@ -134,29 +134,29 @@ void KSPlanetBase::findPosition( const KSNumbers *
num, const CachingDms * lat,
     // DEBUG edit
     findGeocentricPosition( num, Earth );  //private function,
reimplemented in each subclass
     findPhase();
-    setAngularSize( asin(physicalSize()/Rearth/AU_KM)*60.*180./dms::PI
); //angular size in arcmin
+    setAngularSize( asin( physicalSize() / Rearth / AU_KM ) * 60.*180.
/ dms::PI ); //angular size in arcmin
 
     if ( lat && LST )
         localizeCoords( num, lat, LST ); //correct for figure-of-the-Earth
 
     if ( hasTrail() )
     {
-        addToTrail( KStarsDateTime( num->getJD() ).toString(
"yyyy.MM.dd hh:mm" ) + i18nc("Universal time", "UT") ); // TODO:
Localize date/time format?
+        addToTrail( KStarsDateTime( num->getJD() ).toString(
"yyyy.MM.dd hh:mm" ) + i18nc( "Universal time", "UT" ) ); // TODO:
Localize date/time format?
         if ( Trail.size() > TrailObject::MaxTrail )
             clipTrail();
     }
 
-    findMagnitude(num);
+    findMagnitude( num );
 
     if ( type() == SkyObject::COMET )
     {
         // Compute tail size
-        KSComet * me = (KSComet *)this;
-        double TailAngSize;
+        KSComet * me = ( KSComet * )this;
+        double comaAngSize;
         // Convert the tail size in km to angular tail size (degrees)
-        TailAngSize = asin(physicalSize()/Rearth/AU_KM)*60.0*180.0/dms::PI;
+        comaAngSize = asin( physicalSize() / Rearth / AU_KM ) * 60.0 *
180.0 / dms::PI;
         // Find the apparent length as projected on the celestial
sphere (the comet's tail points away from the sun)
-        me->setTailAngSize( TailAngSize * fabs(sin( phase().radians() )));
+        me->setComaAngSize( comaAngSize * fabs( sin( phase().radians()
) ) );
     }
 
 }
@@ -177,14 +177,14 @@ void KSPlanetBase::localizeCoords( const KSNumbers
* num, const CachingDms * lat
     double rsinp, rcosp, u, sinHA, cosHA, sinDec, cosDec, D;
     double cosHA2;
     double r = Rearth * AU_KM; //distance from Earth, in km
-    u = atan( 0.996647*tan( lat->radians() ) );
-    rsinp = 0.996647*sin( u );
+    u = atan( 0.996647 * tan( lat->radians() ) );
+    rsinp = 0.996647 * sin( u );
     rcosp = cos( u );
     HA.setD( LST->Degrees() - ra().Degrees() );
     HA.SinCos( sinHA, cosHA );
     dec().SinCos( sinDec, cosDec );
 
-    D = atan2( rcosp*sinHA, r*cosDec/6378.14 - rcosp*cosHA );
+    D = atan2( rcosp * sinHA, r * cosDec / 6378.14 - rcosp * cosHA );
     dms temp;
     temp.setRadians( ra().radians() - D );
     setRA( temp );
@@ -194,7 +194,7 @@ void KSPlanetBase::localizeCoords( const KSNumbers *
num, const CachingDms * lat
 
     //temp.setRadians( atan2( cosHA2*( r*sinDec/6378.14 - rsinp ),
r*cosDec*cosHA/6378.14 - rcosp ) );
     // The atan2() version above makes the planets move crazy in the
htm branch -jbb
-    temp.setRadians( atan( cosHA2*( r*sinDec/6378.14 - rsinp )/(
r*cosDec*cosHA/6378.14 - rcosp ) ) );
+    temp.setRadians( atan( cosHA2 * ( r * sinDec / 6378.14 - rsinp ) /
( r * cosDec * cosHA / 6378.14 - rcosp ) ) );
 
     setDec( temp );
 
@@ -219,7 +219,7 @@ void KSPlanetBase::setRearth( const KSPlanetBase *
Earth )
 {
     double sinL, sinB, sinL0, sinB0;
     double cosL, cosB, cosL0, cosB0;
-    double x,y,z;
+    double x, y, z;
 
     //The Moon's Rearth is set in its findGeocentricPosition()...
     if ( name() == "Moon" )
@@ -242,20 +242,20 @@ void KSPlanetBase::setRearth( const KSPlanetBase *
Earth )
 
     Earth->ecLong().SinCos( sinL0, cosL0 );
     Earth->ecLat().SinCos( sinB0, cosB0 );
-    double eX = Earth->rsun()*cosB0*cosL0;
-    double eY = Earth->rsun()*cosB0*sinL0;
-    double eZ = Earth->rsun()*sinB0;
+    double eX = Earth->rsun() * cosB0 * cosL0;
+    double eY = Earth->rsun() * cosB0 * sinL0;
+    double eZ = Earth->rsun() * sinB0;
 
     helEcLong().SinCos( sinL, cosL );
     helEcLat().SinCos( sinB, cosB );
-    x = rsun()*cosB*cosL - eX;
-    y = rsun()*cosB*sinL - eY;
-    z = rsun()*sinB - eZ;
+    x = rsun() * cosB * cosL - eX;
+    y = rsun() * cosB * sinL - eY;
+    z = rsun() * sinB - eZ;
 
-    Rearth = sqrt(x*x + y*y + z*z);
+    Rearth = sqrt( x * x + y * y + z * z );
 
     //Set angular size, in arcmin
-    AngularSize = asin(PhysicalSize/Rearth/AU_KM)*60.*180./dms::PI;
+    AngularSize = asin( PhysicalSize / Rearth / AU_KM ) * 60.*180. /
dms::PI;
 }
 
 void KSPlanetBase::findPA( const KSNumbers * num )
@@ -271,7 +271,7 @@ void KSPlanetBase::findPA( const KSNumbers * num )
     double pa;
     if ( dy )
     {
-        pa = atan2( dx, dy )*180.0/dms::PI;
+        pa = atan2( dx, dy ) * 180.0 / dms::PI;
     }
     else
     {
@@ -282,7 +282,7 @@ void KSPlanetBase::findPA( const KSNumbers * num )
 
 double KSPlanetBase::labelOffset() const
 {
-    double size = angSize() * dms::PI * Options::zoomFactor()/10800.0;
+    double size = angSize() * dms::PI * Options::zoomFactor() / 10800.0;
 
     //Determine minimum size for offset
     double minsize = 4.;
@@ -295,17 +295,17 @@ double KSPlanetBase::labelOffset() const
 
     //Inflate offset for Saturn
     if ( name() == i18n( "Saturn" ) )
-        size = int(2.5*size);
+        size = int( 2.5 * size );
 
-    return 0.5*size + 4.;
+    return 0.5 * size + 4.;
 }
 
 void KSPlanetBase::findPhase()
 {
     /* Compute the phase of the planet in degrees */
     double earthSun =
KStarsData::Instance()->skyComposite()->earth()->rsun();
-    double cosPhase = (rsun()*rsun() + rearth()*rearth() -
earthSun*earthSun)
-                      / (2 * rsun() * rearth() );
+    double cosPhase = ( rsun() * rsun() + rearth() * rearth() -
earthSun * earthSun )
+                      / ( 2 * rsun() * rearth() );
     Phase = acos ( cosPhase ) * 180.0 / dms::PI;
     /* More elegant way of doing it, but requires the Sun.
        TODO: Switch to this if and when we make KSSun a singleton */
diff --git a/kstars/skypainter.h b/kstars/skypainter.h
index c590141e6..6c52e613e 100644
--- a/kstars/skypainter.h
+++ b/kstars/skypainter.h
@@ -36,7 +36,9 @@ class LineListLabel;
 class Satellite;
 class Supernova;
 class ConstellationsArt;
-
+class KSComet;
+class SolarSystemComposite;
+class KSSun;
 
 /** @short Draws things on the sky, without regard to backend.
     This class serves as an interface to draw objects onto the sky without
@@ -110,6 +112,12 @@ class SkyPainter
             */
         virtual void drawSkyPolygon(LineList * list, bool
forceClip=true) =0;
 
+        /** @short Draw a comet in the sky.
+            @param com comet to draw
+            @return true if a comet was drawn
+            */
+        virtual bool drawComet(KSComet * com) =0;
+
         /** @short Draw a point source (e.g., a star).
             @param loc the location of the source in the sky
             @param mag the magnitude of the source
diff --git a/kstars/skyqpainter.cpp b/kstars/skyqpainter.cpp
index c6cfa7140..265c39da5 100644
--- a/kstars/skyqpainter.cpp
+++ b/kstars/skyqpainter.cpp
@@ -9,7 +9,7 @@
     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.
+    GNU General Public License for more decomas.
 
     You should have received a copy of the GNU General Public License along
     with this program; if not, write to the Free Software Foundation, Inc.,
@@ -29,6 +29,7 @@
 #include "skycomponents/skymapcomposite.h"
 #include "skycomponents/flagcomponent.h"
 #include "skycomponents/satellitescomponent.h"
+#include "skycomponents/solarsystemcomposite.h"
 
 #include "skyobjects/deepskyobject.h"
 #include "skyobjects/kscomet.h"
@@ -37,6 +38,7 @@
 #include "skyobjects/satellite.h"
 #include "skyobjects/supernova.h"
 #include "skyobjects/constellationsart.h"
+#include "skyobjects/kssun.h"
 #include "projections/projector.h"
 #include "ksutils.h"
 
@@ -50,9 +52,9 @@ namespace
 
 // Convert spectral class to numerical index.
 // If spectral class is invalid return index for white star (A class)
-int harvardToIndex(char c)
+int harvardToIndex( char c )
 {
-    switch( c )
+    switch ( c )
     {
         case 'o':
         case 'O':
@@ -92,14 +94,13 @@ const int nSPclasses = 7;
 // These pixmaps are never deallocated. Not really good...
 QPixmap * imageCache[nSPclasses][nStarSizes] = {{0}};
 
-QPixmap * visibleSatPixmap=0, *invisibleSatPixmap=0;
+QPixmap * visibleSatPixmap = 0, *invisibleSatPixmap = 0;
 }
 
 int SkyQPainter::starColorMode = 0;
 QColor SkyQPainter::m_starColor = QColor();
 QMap<char, QColor> SkyQPainter::ColorMap = QMap<char, QColor>();
 
-
 SkyQPainter::SkyQPainter( QPaintDevice * pd )
     : SkyPainter(), QPainter()
 {
@@ -134,10 +135,10 @@ SkyQPainter::~SkyQPainter()
 
 void SkyQPainter::begin()
 {
-    QPainter::begin(m_pd);
+    QPainter::begin( m_pd );
     bool aa = !m_sm->isSlewing() && Options::useAntialias();
-    setRenderHint(QPainter::Antialiasing, aa );
-    setRenderHint(QPainter::HighQualityAntialiasing, aa);
+    setRenderHint( QPainter::Antialiasing, aa );
+    setRenderHint( QPainter::HighQualityAntialiasing, aa );
     m_proj = m_sm->projector();
 }
 
@@ -152,14 +153,14 @@ void SkyQPainter::drawSkyBackground()
     fillRect( 0, 0, m_size.width(), m_size.height(),
KStarsData::Instance()->colorScheme()->colorNamed( "SkyColor" ) );
 }
 
-void SkyQPainter::setPen(const QPen &pen)
+void SkyQPainter::setPen( const QPen &pen )
 {
-    QPainter::setPen(pen);
+    QPainter::setPen( pen );
 }
 
-void SkyQPainter::setBrush(const QBrush &brush)
+void SkyQPainter::setBrush( const QBrush &brush )
 {
-    QPainter::setBrush(brush);
+    QPainter::setBrush( brush );
 }
 
 void SkyQPainter::initStarImages()
@@ -168,7 +169,7 @@ void SkyQPainter::initStarImages()
     const int starColorIntensity = Options::starColorIntensity();
 
     ColorMap.clear();
-    switch( Options::starColorMode() )
+    switch ( Options::starColorMode() )
     {
         case 1: // Red stars.
             m_starColor = Qt::red;
@@ -202,7 +203,7 @@ void SkyQPainter::initStarImages()
         ColorMap.insert( 'M', m_starColor );
     }
 
-    foreach( char color, ColorMap.keys() )
+    foreach ( char color, ColorMap.keys() )
     {
         QPixmap BigImage( 15, 15 );
         BigImage.fill( Qt::transparent );
@@ -215,79 +216,79 @@ void SkyQPainter::initStarImages()
             qreal h, s, v, a;
             p.setRenderHint( QPainter::Antialiasing, false );
             QColor starColor = ColorMap[color];
-            starColor.getHsvF(&h, &s, &v, &a);
-            for (int i = 0; i < 8; i++ )
+            starColor.getHsvF( &h, &s, &v, &a );
+            for ( int i = 0; i < 8; i++ )
             {
-                for (int j = 0; j < 8; j++ )
+                for ( int j = 0; j < 8; j++ )
                 {
                     qreal x = i - 7;
                     qreal y = j - 7;
-                    qreal dist = sqrt( x*x + y*y ) / 7.0;
-                    starColor.setHsvF(h,
-                                      qMin( qreal(1), dist <
(10-starColorIntensity)/10.0 ? 0 : dist ),
-                                      v,
-                                      qMax( qreal(0), dist <
(10-starColorIntensity)/20.0 ? 1 : 1-dist ) );
+                    qreal dist = sqrt( x * x + y * y ) / 7.0;
+                    starColor.setHsvF( h,
+                                       qMin( qreal( 1 ), dist < ( 10 -
starColorIntensity ) / 10.0 ? 0 : dist ),
+                                       v,
+                                       qMax( qreal( 0 ), dist < ( 10 -
starColorIntensity ) / 20.0 ? 1 : 1 - dist ) );
                     p.setPen( starColor );
                     p.drawPoint( i, j );
-                    p.drawPoint( 14-i, j );
-                    p.drawPoint( i, 14-j );
-                    p.drawPoint (14-i, 14-j);
+                    p.drawPoint( 14 - i, j );
+                    p.drawPoint( i, 14 - j );
+                    p.drawPoint ( 14 - i, 14 - j );
                 }
             }
         }
         else
         {
-            p.setRenderHint(QPainter::Antialiasing, true );
-            p.setPen( QPen(ColorMap[color], 2.0 ) );
+            p.setRenderHint( QPainter::Antialiasing, true );
+            p.setPen( QPen( ColorMap[color], 2.0 ) );
             p.setBrush( p.pen().color() );
             p.drawEllipse( QRectF( 2, 2, 10, 10 ) );
         }
         p.end();
 
         // Cache array slice
-        QPixmap ** pmap = imageCache[ harvardToIndex(color) ];
-        for( int size = 1; size < nStarSizes; size++ )
+        QPixmap ** pmap = imageCache[ harvardToIndex( color ) ];
+        for ( int size = 1; size < nStarSizes; size++ )
         {
-            if( !pmap[size] )
+            if ( !pmap[size] )
                 pmap[size] = new QPixmap();
             *pmap[size] = BigImage.scaled( size, size,
Qt::KeepAspectRatio, Qt::SmoothTransformation );
         }
     }
     starColorMode = Options::starColorMode();
 
-    visibleSatPixmap = new
QPixmap(":/icons/breeze/default/kstars_satellites_visible.svg");
-    invisibleSatPixmap = new
QPixmap(":/icons/breeze/default/kstars_satellites_invisible.svg");
+    visibleSatPixmap = new QPixmap(
":/icons/breeze/default/kstars_satellites_visible.svg" );
+    invisibleSatPixmap = new QPixmap(
":/icons/breeze/default/kstars_satellites_invisible.svg" );
 }
 
-void SkyQPainter::drawSkyLine(SkyPoint * a, SkyPoint * b)
+void SkyQPainter::drawSkyLine( SkyPoint * a, SkyPoint * b )
 {
 
     bool aVisible, bVisible;
-    QPointF aScreen = m_proj->toScreen(a,true,&aVisible);
-    QPointF bScreen = m_proj->toScreen(b,true,&bVisible);
+    QPointF aScreen = m_proj->toScreen( a, true, &aVisible );
+    QPointF bScreen = m_proj->toScreen( b, true, &bVisible );
 
-    drawLine(aScreen, bScreen);
+    drawLine( aScreen, bScreen );
     return;
 
     //THREE CASES:
-    if( aVisible && bVisible )
+    if ( aVisible && bVisible )
     {
         //Both a,b visible, so paint the line normally:
-        drawLine(aScreen, bScreen);
+        drawLine( aScreen, bScreen );
     }
-    else if( aVisible )
+    else if ( aVisible )
     {
         //a is visible but b isn't:
-        drawLine(aScreen, m_proj->clipLine(a,b));
+        drawLine( aScreen, m_proj->clipLine( a, b ) );
     }
-    else if( bVisible )
+    else if ( bVisible )
     {
         //b is visible but a isn't:
-        drawLine(bScreen, m_proj->clipLine(b,a));
+        drawLine( bScreen, m_proj->clipLine( b, a ) );
     } //FIXME: what if both are offscreen but the line isn't?
 }
 
-void SkyQPainter::drawSkyPolyline(LineList * list, SkipList * skipList,
LineListLabel * label)
+void SkyQPainter::drawSkyPolyline( LineList * list, SkipList *
skipList, LineListLabel * label )
 {
     SkyList * points = list->points();
     bool isVisible, isVisibleLast;
@@ -302,16 +303,16 @@ void SkyQPainter::drawSkyPolyline(LineList * list,
SkipList * skipList, LineList
         SkyPoint * pThis = points->at( j );
         oThis2 = oThis = m_proj->toScreen( pThis, true, &isVisible );
         // & with the result of checkVisibility to clip away things
below horizon
-        isVisible &= m_proj->checkVisibility(pThis);
+        isVisible &= m_proj->checkVisibility( pThis );
         bool doSkip = false;
-        if( skipList )
+        if ( skipList )
         {
-            doSkip = skipList->skip(j);
+            doSkip = skipList->skip( j );
         }
 
         bool pointsVisible = false;
         //Temporary solution to avoid random lines in Gnomonic
projection and draw lines up to horizon
-        if(SkyMap::Instance()->projector()->type() == Projector::Gnomonic)
+        if ( SkyMap::Instance()->projector()->type() ==
Projector::Gnomonic )
         {
             if ( isVisible && isVisibleLast ) pointsVisible = true;
         }
@@ -322,7 +323,7 @@ void SkyQPainter::drawSkyPolyline(LineList * list,
SkipList * skipList, LineList
 
         if ( !doSkip )
         {
-            if(pointsVisible)
+            if ( pointsVisible )
             {
                 drawLine( oLast, oThis );
                 if ( label )
@@ -335,23 +336,23 @@ void SkyQPainter::drawSkyPolyline(LineList * list,
SkipList * skipList, LineList
     }
 }
 
-void SkyQPainter::drawSkyPolygon(LineList * list, bool forceClip)
+void SkyQPainter::drawSkyPolygon( LineList * list, bool forceClip )
 {
     bool isVisible = false, isVisibleLast;
     SkyList * points = list->points();
     QPolygonF polygon;
 
-    if (forceClip == false)
+    if ( forceClip == false )
     {
         for ( int i = 0; i < points->size(); ++i )
         {
-            polygon << m_proj->toScreen( points->at( i ), false,
&isVisibleLast);
+            polygon << m_proj->toScreen( points->at( i ), false,
&isVisibleLast );
             isVisible |= isVisibleLast;
         }
 
         // If 1+ points are visible, draw it
-        if ( polygon.size() && isVisible)
-            drawPolygon(polygon);
+        if ( polygon.size() && isVisible )
+            drawPolygon( polygon );
 
         return;
     }
@@ -360,14 +361,14 @@ void SkyQPainter::drawSkyPolygon(LineList * list,
bool forceClip)
     SkyPoint * pLast = points->last();
     QPointF   oLast = m_proj->toScreen( pLast, true, &isVisibleLast );
     // & with the result of checkVisibility to clip away things below
horizon
-    isVisibleLast &= m_proj->checkVisibility(pLast);
+    isVisibleLast &= m_proj->checkVisibility( pLast );
 
     for ( int i = 0; i < points->size(); ++i )
     {
         SkyPoint * pThis = points->at( i );
         QPointF oThis = m_proj->toScreen( pThis, true, &isVisible );
         // & with the result of checkVisibility to clip away things
below horizon
-        isVisible &= m_proj->checkVisibility(pThis);
+        isVisible &= m_proj->checkVisibility( pThis );
 
 
         if ( isVisible && isVisibleLast )
@@ -392,33 +393,33 @@ void SkyQPainter::drawSkyPolygon(LineList * list,
bool forceClip)
     }
 
     if ( polygon.size() )
-        drawPolygon(polygon);
+        drawPolygon( polygon );
 
 }
 
-bool SkyQPainter::drawPlanet(KSPlanetBase * planet)
+bool SkyQPainter::drawPlanet( KSPlanetBase * planet )
 {
-    if( !m_proj->checkVisibility(planet) ) return false;
+    if ( !m_proj->checkVisibility( planet ) ) return false;
 
     bool visible = false;
-    QPointF pos = m_proj->toScreen(planet,true,&visible);
-    if( !visible || !m_proj->onScreen(pos) ) return false;
+    QPointF pos = m_proj->toScreen( planet, true, &visible );
+    if ( !visible || !m_proj->onScreen( pos ) ) return false;
 
     float fakeStarSize = ( 10.0 + log10( Options::zoomFactor() ) -
log10( MINZOOM ) ) * ( 10 - planet->mag() ) / 10;
-    if( fakeStarSize > 15.0 )
+    if ( fakeStarSize > 15.0 )
         fakeStarSize = 15.0;
 
-    float size = planet->angSize() * dms::PI *
Options::zoomFactor()/10800.0;
-    if( size < fakeStarSize && planet->name() != "Sun" &&
planet->name() != "Moon" )
+    float size = planet->angSize() * dms::PI * Options::zoomFactor() /
10800.0;
+    if ( size < fakeStarSize && planet->name() != "Sun" &&
planet->name() != "Moon" )
     {
         // Draw them as bright stars of appropriate color instead of images
         char spType;
         //FIXME: do these need i18n?
-        if( planet->name() == i18n("Mars") )
+        if ( planet->name() == i18n( "Mars" ) )
         {
             spType = 'K';
         }
-        else if( planet->name() == i18n("Jupiter") || planet->name() ==
i18n("Mercury") || planet->name() == i18n("Saturn") )
+        else if ( planet->name() == i18n( "Jupiter" ) || planet->name()
== i18n( "Mercury" ) || planet->name() == i18n( "Saturn" ) )
         {
             spType = 'F';
         }
@@ -426,30 +427,30 @@ bool SkyQPainter::drawPlanet(KSPlanetBase * planet)
         {
             spType = 'B';
         }
-        drawPointSource(pos,fakeStarSize,spType);
+        drawPointSource( pos, fakeStarSize, spType );
     }
     else
     {
         float sizemin = 1.0;
-        if( planet->name() == "Sun" || planet->name() == "Moon" )
+        if ( planet->name() == "Sun" || planet->name() == "Moon" )
             sizemin = 8.0;
 
-        float size = planet->angSize() * dms::PI *
Options::zoomFactor()/10800.0;
-        if( size < sizemin )
+        if ( size < sizemin )
             size = sizemin;
-        if( Options::showPlanetImages() && !planet->image().isNull() )
+
+        if ( Options::showPlanetImages() && !planet->image().isNull() )
         {
             //Because Saturn has rings, we inflate its image size by a
factor 2.5
-            if( planet->name() == "Saturn" )
-                size = int(2.5*size);
+            if ( planet->name() == "Saturn" )
+                size = int( 2.5 * size );
             // Scale size exponentially so it is visible at large zooms
-            else if (planet->name() == "Pluto")
-                size = int(size*exp(1.5*size));
+            else if ( planet->name() == "Pluto" )
+                size = int( size * exp( 1.5 * size ) );
 
             save();
-            translate(pos);
+            translate( pos );
             rotate( m_proj->findPA( planet, pos.x(), pos.y() ) );
-            drawImage( QRect(-0.5*size, -0.5*size, size, size),
+            drawImage( QRect( -0.5 * size, -0.5 * size, size, size ),
                        planet->image() );
             restore();
         }
@@ -461,16 +462,80 @@ bool SkyQPainter::drawPlanet(KSPlanetBase * planet)
     return true;
 }
 
-bool SkyQPainter::drawPointSource(SkyPoint * loc, float mag, char sp)
+bool SkyQPainter::drawComet( KSComet * com )
+{
+    if ( !m_proj->checkVisibility( com ) ) return false;
+
+    float size = com->angSize() * dms::PI * Options::zoomFactor() /
10800.0;
+    if ( size < 1 )
+        size = 1;
+
+    bool visible = false;
+    QPointF pos = m_proj->toScreen( com, true, &visible );
+
+    // Draw the coma.
+    if ( visible && m_proj->onScreen( pos ) )
+    {
+        // Draw the comet.
+        drawEllipse( pos, size, size );
+
+        double comaLength = ( com->getComaAngSize().arcmin() * dms::PI
* Options::zoomFactor() / 10800.0 );
+
+        // If coma is visible and long enough.
+        if ( Options::showCometComas() && comaLength > size )
+        {
+            KSSun * sun =
KStarsData::Instance()->skyComposite()->solarSystemComposite()->sun();
+
+            // Find the anlge to the sun.
+            double comaAngle = m_proj->findPA( sun, pos.x(), pos.y() );
+
+            const QVector<QPoint> coma =
+            {
+                QPoint( pos.x() - size, pos.y() ),
+                QPoint( pos.x() + size, pos.y() ),
+                QPoint( pos.x(), pos.y() + comaLength )
+            };
+
+            QPolygon comaPoly( coma );
+
+            comaPoly = QTransform()
+                       .translate( pos.x(), pos.y() )
+                       .rotate( comaAngle ) // Already + 180 Deg,
because rotated from south, not north.
+                       .translate( -pos.x(), -pos.y() )
+                       .map( comaPoly );
+
+            save();
+
+            // Nice fade for the Coma.
+            QLinearGradient linearGrad( pos, comaPoly.point( 2 ) );
+            linearGrad.setColorAt( 0,  QColor( "white" ) );
+            linearGrad.setColorAt( size / comaLength,  QColor( "white" ) );
+            linearGrad.setColorAt( 0.9, QColor( "transparent" ) );
+            setBrush( linearGrad );
+
+            // Render Coma.
+            drawConvexPolygon( comaPoly );
+            restore();
+        }
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+bool SkyQPainter::drawPointSource( SkyPoint * loc, float mag, char sp )
 {
     //Check if it's even visible before doing anything
-    if( !m_proj->checkVisibility(loc) ) return false;
+    if ( !m_proj->checkVisibility( loc ) ) return false;
 
     bool visible = false;
-    QPointF pos = m_proj->toScreen(loc,true,&visible);
-    if( visible && m_proj->onScreen(pos) )   // FIXME: onScreen here
should use canvas size rather than SkyMap size, especially while
printing in portrait mode!
+    QPointF pos = m_proj->toScreen( loc, true, &visible );
+    if ( visible && m_proj->onScreen( pos ) )   // FIXME: onScreen here
should use canvas size rather than SkyMap size, especially while
printing in portrait mode!
     {
-        drawPointSource(pos, starWidth(mag), sp);
+        drawPointSource( pos, starWidth( mag ), sp );
         return true;
     }
     else
@@ -479,15 +544,15 @@ bool SkyQPainter::drawPointSource(SkyPoint * loc,
float mag, char sp)
     }
 }
 
-void SkyQPainter::drawPointSource(const QPointF &pos, float size, char sp)
+void SkyQPainter::drawPointSource( const QPointF &pos, float size, char
sp )
 {
-    int isize = qMin(static_cast<int>(size), 14);
-    if( !m_vectorStars || starColorMode == 0  )
+    int isize = qMin( static_cast<int>( size ), 14 );
+    if ( !m_vectorStars || starColorMode == 0  )
     {
         // Draw stars as bitmaps, either because we were asked to, or
because we're painting real colors
-        QPixmap * im = imageCache[ harvardToIndex(sp) ][isize];
+        QPixmap * im = imageCache[ harvardToIndex( sp ) ][isize];
         float offset = 0.5 * im->width();
-        drawPixmap( QPointF(pos.x()-offset, pos.y()-offset), *im );
+        drawPixmap( QPointF( pos.x() - offset, pos.y() - offset ), *im );
     }
     else
     {
@@ -506,56 +571,56 @@ void SkyQPainter::drawPointSource(const QPointF
&pos, float size, char sp)
         }
 
         // Be consistent with old raster representation
-        if( size > 14 )
+        if ( size > 14 )
             size = 14;
-        if( size >= 2 )
-            drawEllipse( pos.x() - 0.5 * size, pos.y() - 0.5 * size,
int(size), int(size) );
-        else if( size >= 1 )
+        if ( size >= 2 )
+            drawEllipse( pos.x() - 0.5 * size, pos.y() - 0.5 * size,
int( size ), int( size ) );
+        else if ( size >= 1 )
             drawPoint( pos.x(), pos.y() );
     }
 }
 
-bool SkyQPainter::drawConstellationArtImage(ConstellationsArt * obj)
+bool SkyQPainter::drawConstellationArtImage( ConstellationsArt * obj )
 {
     double zoom = Options::zoomFactor();
 
     bool visible = false;
-    obj->EquatorialToHorizontal(KStarsData::Instance()->lst(),
KStarsData::Instance()->geo()->lat());
-    QPointF constellationmidpoint = m_proj->toScreen(obj, true, &visible);
+    obj->EquatorialToHorizontal( KStarsData::Instance()->lst(),
KStarsData::Instance()->geo()->lat() );
+    QPointF constellationmidpoint = m_proj->toScreen( obj, true,
&visible );
 
-    if ( !visible || !m_proj->onScreen(constellationmidpoint))
+    if ( !visible || !m_proj->onScreen( constellationmidpoint ) )
         return false;
 
     //qDebug() << "o->pa() " << obj->pa();
-    float positionangle = m_proj->findPA(obj,
constellationmidpoint.x(), constellationmidpoint.y());
+    float positionangle = m_proj->findPA( obj,
constellationmidpoint.x(), constellationmidpoint.y() );
     //qDebug() << " final PA " << positionangle;
 
 
-    float w = obj->getWidth()*60*dms::PI*zoom/10800;
-    float h = obj->getHeight()*60*dms::PI*zoom/10800;
+    float w = obj->getWidth() * 60 * dms::PI * zoom / 10800;
+    float h = obj->getHeight() * 60 * dms::PI * zoom / 10800;
 
     save();
 
-    setRenderHint(QPainter::SmoothPixmapTransform);
+    setRenderHint( QPainter::SmoothPixmapTransform );
 
-    translate(constellationmidpoint);
-    rotate(positionangle);
-    setOpacity(0.7);
-    drawImage( QRect(-0.5*w, -0.5*h, w, h), obj->image() );
-    setOpacity(1);
+    translate( constellationmidpoint );
+    rotate( positionangle );
+    setOpacity( 0.7 );
+    drawImage( QRect( -0.5 * w, -0.5 * h, w, h ), obj->image() );
+    setOpacity( 1 );
 
-    setRenderHint(QPainter::SmoothPixmapTransform, false);
+    setRenderHint( QPainter::SmoothPixmapTransform, false );
     restore();
     return true;
 }
 
-bool SkyQPainter::drawDeepSkyObject(DeepSkyObject * obj, bool drawImage)
+bool SkyQPainter::drawDeepSkyObject( DeepSkyObject * obj, bool drawImage )
 {
-    if( !m_proj->checkVisibility(obj) ) return false;
+    if ( !m_proj->checkVisibility( obj ) ) return false;
 
     bool visible = false;
-    QPointF pos = m_proj->toScreen(obj, true, &visible);
-    if( !visible || !m_proj->onScreen(pos) ) return false;
+    QPointF pos = m_proj->toScreen( obj, true, &visible );
+    if ( !visible || !m_proj->onScreen( pos ) ) return false;
 
     // if size is 0.0 set it to 1.0, this are normally stars (type 0 and 1)
     // if we use size 0.0 the star wouldn't be drawn
@@ -572,50 +637,50 @@ bool SkyQPainter::drawDeepSkyObject(DeepSkyObject
* obj, bool drawImage)
 
     //Draw Image
     if ( drawImage && Options::zoomFactor() > 5.*MINZOOM )
-        drawDeepSkyImage(pos, obj, positionAngle);
+        drawDeepSkyImage( pos, obj, positionAngle );
 
     //Draw Symbol
-    drawDeepSkySymbol(pos, obj->type(), size, obj->e(), positionAngle);
+    drawDeepSkySymbol( pos, obj->type(), size, obj->e(), positionAngle );
 
     return true;
 }
 
-bool SkyQPainter::drawDeepSkyImage(const QPointF &pos, DeepSkyObject *
obj, float positionAngle)
+bool SkyQPainter::drawDeepSkyImage( const QPointF &pos, DeepSkyObject *
obj, float positionAngle )
 {
     double zoom = Options::zoomFactor();
-    double w = obj->a() * dms::PI * zoom/10800.0;
+    double w = obj->a() * dms::PI * zoom / 10800.0;
     double h = obj->e() * w;
 
     save();
-    translate(pos);
+    translate( pos );
     rotate( positionAngle );
-    drawImage( QRect(-0.5*w, -0.5*h, w, h), obj->image() );
+    drawImage( QRect( -0.5 * w, -0.5 * h, w, h ), obj->image() );
     restore();
 
     return true;
 }
 
-void SkyQPainter::drawDeepSkySymbol(const QPointF &pos, int type, float
size, float e, float positionAngle)
+void SkyQPainter::drawDeepSkySymbol( const QPointF &pos, int type,
float size, float e, float positionAngle )
 {
     float x = pos.x();
     float y = pos.y();
     float zoom = Options::zoomFactor();
 
-    int isize = int(size);
+    int isize = int( size );
 
-    float dx1 = -0.5*size;
-    float dx2 =  0.5*size;
-    float dy1 = -1.0*e*size/2.;
-    float dy2 = e*size/2.;
+    float dx1 = -0.5 * size;
+    float dx2 =  0.5 * size;
+    float dy1 = -1.0 * e * size / 2.;
+    float dy2 = e * size / 2.;
     float x1 = x + dx1;
     float x2 = x + dx2;
     float y1 = y + dy1;
     float y2 = y + dy2;
 
-    float dxa = -size/4.;
-    float dxb =  size/4.;
-    float dya = -1.0*e*size/4.;
-    float dyb = e*size/4.;
+    float dxa = -size / 4.;
+    float dxb =  size / 4.;
+    float dya = -1.0 * e * size / 4.;
+    float dyb = e * size / 4.;
     float xa = x + dxa;
     float xb = x + dxb;
     float ya = y + dya;
@@ -643,8 +708,8 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
&pos, int type, float size, fl
         };
         lambdaDrawCross = [this]( float centerX, float centerY, float
sizeX, float sizeY )
         {
-            drawLine( QLineF( centerX - sizeX/2., centerY, centerX +
sizeX/2., centerY ) );
-            drawLine( QLineF( centerX, centerY - sizeY/2., centerX,
centerY + sizeY/2. ) );
+            drawLine( QLineF( centerX - sizeX / 2., centerY, centerX +
sizeX / 2., centerY ) );
+            drawLine( QLineF( centerX, centerY - sizeY / 2., centerX,
centerY + sizeY / 2. ) );
         };
     }
     else
@@ -659,8 +724,8 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
&pos, int type, float size, fl
         };
         lambdaDrawCross = [this]( float centerX, float centerY, float
sizeX, float sizeY )
         {
-            drawLine( QLine( centerX - sizeX/2., centerY, centerX +
sizeX/2., centerY ) );
-            drawLine( QLine( centerX, centerY - sizeY/2., centerX,
centerY + sizeY/2. ) );
+            drawLine( QLine( centerX - sizeX / 2., centerY, centerX +
sizeX / 2., centerY ) );
+            drawLine( QLine( centerX, centerY - sizeY / 2., centerX,
centerY + sizeY / 2. ) );
         };
     }
 
@@ -669,8 +734,8 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
&pos, int type, float size, fl
         case 0:
         case 1: //catalog star
             //Some NGC/IC objects are stars...changed their type to 1
(was double star)
-            if (size<2.) size = 2.;
-            lambdaDrawEllipse( x - size/2., y - size/2., size, size );
+            if ( size < 2. ) size = 2.;
+            lambdaDrawEllipse( x - size / 2., y - size / 2., size, size );
             break;
         case 2: //Planet
             break;
@@ -685,7 +750,7 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
&pos, int type, float size, fl
             if ( size > 100. ) psize *= 2.;
             auto putDot = [this, psize, &lambdaDrawEllipse]( float x,
float y )
             {
-                lambdaDrawEllipse( x - psize/2., y - psize/2., psize,
psize );
+                lambdaDrawEllipse( x - psize / 2., y - psize / 2.,
psize, psize );
             };
             putDot( xa, y1 );
             putDot( xb, y1 );
@@ -699,19 +764,19 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
&pos, int type, float size, fl
             break;
         }
         case 4: //Globular Cluster
-            if (size<2.) size = 2.;
+            if ( size < 2. ) size = 2.;
             save();
             translate( x, y );
             color = pen().color().name();
             rotate( positionAngle );  //rotate the coordinate system
-            lambdaDrawEllipse( dx1, dy1, size, e*size );
-            lambdaDrawCross( 0, 0, size, e*size );
+            lambdaDrawEllipse( dx1, dy1, size, e * size );
+            lambdaDrawCross( 0, 0, size, e * size );
             restore(); //reset coordinate system
             break;
 
         case 5: //Gaseous Nebula
         case 15: // Dark Nebula
-            if (size <2.) size = 2.;
+            if ( size < 2. ) size = 2.;
             save();
             translate( x, y );
             rotate( positionAngle );  //rotate the coordinate system
@@ -723,20 +788,20 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
&pos, int type, float size, fl
             restore(); //reset coordinate system
             break;
         case 6: //Planetary Nebula
-            if (size<2.) size = 2.;
+            if ( size < 2. ) size = 2.;
             save();
             translate( x, y );
             rotate( positionAngle );  //rotate the coordinate system
             color = pen().color().name();
-            lambdaDrawEllipse( dx1, dy1, size, e*size );
-            lambdaDrawLine( 0., dy1, 0., dy1 - e*size/2. );
-            lambdaDrawLine( 0., dy2, 0., dy2 + e*size/2. );
-            lambdaDrawLine( dx1, 0., dx1 - size/2., 0. );
-            lambdaDrawLine( dx2, 0., dx2 + size/2., 0. );
+            lambdaDrawEllipse( dx1, dy1, size, e * size );
+            lambdaDrawLine( 0., dy1, 0., dy1 - e * size / 2. );
+            lambdaDrawLine( 0., dy2, 0., dy2 + e * size / 2. );
+            lambdaDrawLine( dx1, 0., dx1 - size / 2., 0. );
+            lambdaDrawLine( dx2, 0., dx2 + size / 2., 0. );
             restore(); //reset coordinate system
             break;
         case 7: //Supernova remnant // FIXME: Why is SNR drawn
different from a gaseous nebula?
-            if (size<2) size = 2;
+            if ( size < 2 ) size = 2;
             save();
             translate( x, y );
             rotate( positionAngle );  //rotate the coordinate system
@@ -750,20 +815,20 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
&pos, int type, float size, fl
         case 8: //Galaxy
         case 16: // Quasar
             color = pen().color().name();
-            if ( size <1. && zoom > 20*MINZOOM ) size = 3.; //force
ellipse above zoomFactor 20
-            if ( size <1. && zoom > 5*MINZOOM ) size = 1.; //force
points above zoomFactor 5
-            if ( size>2. )
+            if ( size < 1. && zoom > 20 * MINZOOM ) size = 3.; //force
ellipse above zoomFactor 20
+            if ( size < 1. && zoom > 5 * MINZOOM ) size = 1.; //force
points above zoomFactor 5
+            if ( size > 2. )
             {
                 save();
                 translate( x, y );
                 rotate( positionAngle );  //rotate the coordinate system
-                lambdaDrawEllipse( dx1, dy1, size, e*size );
+                lambdaDrawEllipse( dx1, dy1, size, e * size );
                 restore(); //reset coordinate system
 
             }
-            else if ( size>0. )
+            else if ( size > 0. )
             {
-                drawPoint( QPointF(x, y) );
+                drawPoint( QPointF( x, y ) );
             }
             break;
         case 14:   // Galaxy cluster - draw a dashed circle
@@ -779,16 +844,16 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
&pos, int type, float size, fl
             QPen newPen = pen();
             newPen.setStyle( Qt::DashLine );
             setPen( newPen );
-            lambdaDrawEllipse( dx1, dy1, size, e*size );
+            lambdaDrawEllipse( dx1, dy1, size, e * size );
             restore();
             setBrush( tempBrush );
             break;
         }
         default: // Unknown object or something we don't know how to
draw. Just draw an ellipse with a ?-mark
             color = pen().color().name();
-            if ( size <1. && zoom > 20*MINZOOM ) size = 3.; //force
ellipse above zoomFactor 20
-            if ( size <1. && zoom > 5*MINZOOM ) size = 1.; //force
points above zoomFactor 5
-            if ( size>2. )
+            if ( size < 1. && zoom > 20 * MINZOOM ) size = 3.; //force
ellipse above zoomFactor 20
+            if ( size < 1. && zoom > 5 * MINZOOM ) size = 1.; //force
points above zoomFactor 5
+            if ( size > 2. )
             {
                 save();
                 QFont f = font();
@@ -798,21 +863,21 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
&pos, int type, float size, fl
                 setFont( f );
                 translate( x, y );
                 rotate( positionAngle );  //rotate the coordinate system
-                lambdaDrawEllipse( dx1, dy1, size, e*size );
+                lambdaDrawEllipse( dx1, dy1, size, e * size );
                 if ( Options::useAntialias() )
-                    drawText( QRectF(dx1, dy1, size, e*size),
Qt::AlignCenter, qMark );
+                    drawText( QRectF( dx1, dy1, size, e * size ),
Qt::AlignCenter, qMark );
                 else
                 {
-                    int idx1 = int(dx1);
-                    int idy1 = int(dy1);
-                    drawText( QRect(idx1, idy1, isize, int(e*size)),
Qt::AlignCenter, qMark );
+                    int idx1 = int( dx1 );
+                    int idy1 = int( dy1 );
+                    drawText( QRect( idx1, idy1, isize, int( e * size )
), Qt::AlignCenter, qMark );
                 }
                 restore(); //reset coordinate system (and font?)
             }
-            else if ( size>0. )
+            else if ( size > 0. )
             {
                 if ( Options::useAntialias() )
-                    drawPoint( QPointF(x, y) );
+                    drawPoint( QPointF( x, y ) );
                 else
                     drawPoint( QPoint( x, y ) );
             }
@@ -820,19 +885,19 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
&pos, int type, float size, fl
 
 }
 
-void SkyQPainter::drawObservingList(const QList< SkyObject * > &obs)
+void SkyQPainter::drawObservingList( const QList< SkyObject * > &obs )
 {
     foreach ( SkyObject * obj, obs )
     {
         bool visible = false;
         QPointF o = m_proj->toScreen( obj, true, &visible );
-        if( !visible || !m_proj->onScreen(o) ) continue;
+        if ( !visible || !m_proj->onScreen( o ) ) continue;
 
         float size = 20.;
-        float x1 = o.x() - 0.5*size;
-        float y1 = o.y() - 0.5*size;
-        drawArc( QRectF(x1, y1, size, size), -60*16, 120*16 );
-        drawArc( QRectF(x1, y1, size, size), 120*16, 120*16 );
+        float x1 = o.x() - 0.5 * size;
+        float y1 = o.y() - 0.5 * size;
+        drawArc( QRectF( x1, y1, size, size ), -60 * 16, 120 * 16 );
+        drawArc( QRectF( x1, y1, size, size ), 120 * 16, 120 * 16 );
     }
 }
 
@@ -845,7 +910,7 @@ void SkyQPainter::drawFlags()
     QPointF pos;
     int i;
 
-    for ( i=0; i<data->skyComposite()->flags()->size(); i++ )
+    for ( i = 0; i < data->skyComposite()->flags()->size(); i++ )
     {
         point = data->skyComposite()->flags()->pointList().at( i );
         image = data->skyComposite()->flags()->image( i );
@@ -857,39 +922,39 @@ void SkyQPainter::drawFlags()
         pos = m_proj->toScreen( point, true, &visible );
 
         // Return if flag is not visible
-        if( !visible || !m_proj->onScreen( pos ) ) continue;
+        if ( !visible || !m_proj->onScreen( pos ) ) continue;
 
         // Draw flag image
-        drawImage( pos.x()-0.5*image.width(),
pos.y()-0.5*image.height(), image );
+        drawImage( pos.x() - 0.5 * image.width(), pos.y() - 0.5 *
image.height(), image );
 
         // Draw flag label
         setPen( data->skyComposite()->flags()->labelColor( i ) );
         setFont( QFont( "Helvetica", 10, QFont::Bold ) );
-        drawText( pos.x()+10, pos.y()-10,
data->skyComposite()->flags()->label( i ) );
+        drawText( pos.x() + 10, pos.y() - 10,
data->skyComposite()->flags()->label( i ) );
     }
 }
 
-void SkyQPainter::drawHorizon(bool filled, SkyPoint * labelPoint, bool
* drawLabel)
+void SkyQPainter::drawHorizon( bool filled, SkyPoint * labelPoint, bool
* drawLabel )
 {
-    QVector<Vector2f> ground = m_proj->groundPoly(labelPoint, drawLabel);
-    if( ground.size() )
+    QVector<Vector2f> ground = m_proj->groundPoly( labelPoint, drawLabel );
+    if ( ground.size() )
     {
-        QPolygonF groundPoly(ground.size());
-        for(int i = 0; i < ground.size(); ++i)
-            groundPoly[i] = KSUtils::vecToPoint(ground[i]);
-        if( filled )
-            drawPolygon(groundPoly);
+        QPolygonF groundPoly( ground.size() );
+        for ( int i = 0; i < ground.size(); ++i )
+            groundPoly[i] = KSUtils::vecToPoint( ground[i] );
+        if ( filled )
+            drawPolygon( groundPoly );
         else
         {
             groundPoly.append( groundPoly.first() );
-            drawPolyline(groundPoly);
+            drawPolyline( groundPoly );
         }
     }
 }
 
 bool SkyQPainter::drawSatellite( Satellite * sat )
 {
-    if( !m_proj->checkVisibility(sat) )
+    if ( !m_proj->checkVisibility( sat ) )
         return false;
 
     QPointF pos;
@@ -899,19 +964,19 @@ bool SkyQPainter::drawSatellite( Satellite * sat )
 
     pos = m_proj->toScreen( sat, true, &visible );
 
-    if( !visible || !m_proj->onScreen( pos ) )
+    if ( !visible || !m_proj->onScreen( pos ) )
         return false;
 
     if ( Options::drawSatellitesLikeStars() )
     {
-        drawPointSource(pos, 3.5, 'B');
+        drawPointSource( pos, 3.5, 'B' );
     }
     else
     {
         if ( sat->isVisible() )
-            drawPixmap(QPoint( pos.x() - 15, pos.y() - 11 ),
*visibleSatPixmap);
+            drawPixmap( QPoint( pos.x() - 15, pos.y() - 11 ),
*visibleSatPixmap );
         else
-            drawPixmap(QPoint( pos.x() - 15, pos.y() - 11 ),
*invisibleSatPixmap);
+            drawPixmap( QPoint( pos.x() - 15, pos.y() - 11 ),
*invisibleSatPixmap );
 
         //drawPixmap(pos, *genericSatPixmap);
         /*drawLine( QPoint( pos.x() - 0.5, pos.y() - 0.5 ), QPoint(
pos.x() + 0.5, pos.y() - 0.5 ) );
@@ -926,21 +991,21 @@ bool SkyQPainter::drawSatellite( Satellite * sat )
     //data->skyComposite()->satellites()->drawLabel( sat, pos );
 }
 
-bool SkyQPainter::drawSupernova(Supernova * sup)
+bool SkyQPainter::drawSupernova( Supernova * sup )
 {
     KStarsData * data = KStarsData::Instance();
-    if( !m_proj->checkVisibility(sup) )
+    if ( !m_proj->checkVisibility( sup ) )
     {
         return false;
     }
 
     bool visible = false;
-    QPointF pos = m_proj->toScreen(sup,true,&visible);
+    QPointF pos = m_proj->toScreen( sup, true, &visible );
     //qDebug()<<"sup->ra() = "<<(sup->ra()).toHMSString()<<"sup->dec()
= "<<sup->dec().toDMSString();
     //qDebug()<<"pos = "<<pos<<"m_proj->onScreen(pos) =
"<<m_proj->onScreen(pos);
-    if( !visible || !m_proj->onScreen(pos) ) return false;
+    if ( !visible || !m_proj->onScreen( pos ) ) return false;
 
-    setPen( data->colorScheme()->colorNamed("SupernovaColor") );
+    setPen( data->colorScheme()->colorNamed( "SupernovaColor" ) );
     //qDebug()<<"Here"<<endl;
     drawLine ( QPoint( pos.x () - 2.0, pos.y() ), QPoint( pos.x() +
2.0, pos.y() ) );
     drawLine ( QPoint( pos.x (), pos.y() - 2.0 ), QPoint( pos.x(),
pos.y() + 2.0 ) );
diff --git a/kstars/skyqpainter.h b/kstars/skyqpainter.h
index 0407a04bc..a9ee35024 100644
--- a/kstars/skyqpainter.h
+++ b/kstars/skyqpainter.h
@@ -26,6 +26,7 @@ class Projector;
 class QWidget;
 class QSize;
 class QMessageBox;
+
 /** @short The QPainter-based painting backend.
     This class implements the SkyPainter interface using a QPainter.
     For documentation, @see SkyPainter. */
@@ -92,6 +93,7 @@ class SkyQPainter : public SkyPainter, public QPainter
         virtual void drawDeepSkySymbol(const QPointF &pos, int type,
float size, float e,
                                        float positionAngle);
         virtual bool drawSupernova(Supernova * sup);
+        virtual bool drawComet(KSComet * com);
         ///This function exists so that we can draw other objects
(e.g., planets) as point sources.
         virtual void drawPointSource(const QPointF &pos, float size,
char sp = 'A');
         virtual bool drawConstellationArtImage(ConstellationsArt * obj);


On 04/06/2017 09:27 AM, Valentin Boettcher wrote:
> I've added some simple comet tails and an option to disable them.
>
> There is a bit of Fuzz, cause astyle was doing it's thing. (Has anyone
> run astyle recursively yet? There are still some unformated files.)
>
> To clarify things: I just added a "drawComet" method to the skypainter,
> an option to the kcfg and the UI and one tweak to retrieve an instance
> of the sun.
>
> To note: the findPA method could be tweaked, by somehow caching the Suns
> position, because by now it is re-projected for every comet tail. (Well
> that's actually OK, because you hardly see more then two at a time.)
>
> Cheers.
>
> ________________________________________
>
>
> diff --git a/.astylerc b/.astylerc
> new file mode 100644
> index 000000000..01ad4bed2
> --- /dev/null
> +++ b/.astylerc
> @@ -0,0 +1,7 @@
> +
> +-A1
> +-W3
> +-k2
> +-S
> +-xG
> +-C
> diff --git a/kstars/kstars.kcfg b/kstars/kstars.kcfg
> index 2754758fa..6b06c2f2a 100644
> --- a/kstars/kstars.kcfg
> +++ b/kstars/kstars.kcfg
> @@ -378,6 +378,11 @@
>           <whatsthis>Toggle whether comets are drawn in the sky
> map.</whatsthis>
>           <default>true</default>
>        </entry>
> +      <entry name="ShowCometComas" type="Bool">
> +         <label>Draw comet comas in the sky map?</label>
> +         <whatsthis>Toggle whether comet comas are drawn in the sky
> map.</whatsthis>
> +         <default>true</default>
> +      </entry>
>        <entry name="ShowCometNames" type="Bool">
>           <label>Label comet names in the sky map?</label>
>           <whatsthis>Toggle whether comet name labels are drawn in the
> sky map.</whatsthis>
> diff --git a/kstars/options/opssolarsystem.cpp
> b/kstars/options/opssolarsystem.cpp
> index df1969d46..6ac1f5a4c 100644
> --- a/kstars/options/opssolarsystem.cpp
> +++ b/kstars/options/opssolarsystem.cpp
> @@ -32,6 +32,7 @@ OpsSolarSystem::OpsSolarSystem()
>      connect( kcfg_ShowAsteroids, SIGNAL( toggled(bool) ), SLOT(
> slotAsteroidWidgets(bool) ) );
>      connect( kcfg_MagLimitAsteroidDownload, SIGNAL( valueChanged(
> double ) ), this, SLOT( slotChangeMagDownload( double ) ) );
>      connect( kcfg_ShowComets, SIGNAL( toggled(bool) ), SLOT(
> slotCometWidgets(bool) ) );
> +
>      connect( ClearAllTrails, SIGNAL( clicked() ), KStars::Instance(),
> SLOT( slotClearAllTrails() ) );
>      connect( showAllPlanets, SIGNAL( clicked() ), this, SLOT(
> slotSelectPlanets() ) );
>      connect( showNonePlanets, SIGNAL( clicked() ), this, SLOT(
> slotSelectPlanets() ) );
> @@ -94,6 +95,7 @@ void OpsSolarSystem::slotCometWidgets( bool on )
>      kcfg_ShowCometNames->setEnabled( on );
>      kcfg_MaxRadCometName->setEnabled( on );
>      textLabel4->setEnabled( on );
> +    kcfg_ShowCometComas->setEnabled( on );
>  }
>  
>  void OpsSolarSystem::slotSelectPlanets()
> @@ -127,4 +129,3 @@ void OpsSolarSystem::slotApply()
>      KStars::Instance()->updateTime();
>      KStars::Instance()->map()->forceUpdate();
>  }
> -
> diff --git a/kstars/options/opssolarsystem.ui
> b/kstars/options/opssolarsystem.ui
> index 62edda6c0..d1e36c493 100644
> --- a/kstars/options/opssolarsystem.ui
> +++ b/kstars/options/opssolarsystem.ui
> @@ -6,8 +6,8 @@
>     <rect>
>      <x>0</x>
>      <y>0</y>
> -    <width>438</width>
> -    <height>516</height>
> +    <width>465</width>
> +    <height>644</height>
>     </rect>
>    </property>
>    <layout class="QVBoxLayout">
> @@ -285,6 +285,45 @@
>       <layout class="QVBoxLayout">
>        <item>
>         <layout class="QGridLayout">
> +        <item row="1" column="1">
> +         <widget class="QLabel" name="label_3">
> +          <property name="text">
> +           <string>Download asteroids brighter than</string>
> +          </property>
> +         </widget>
> +        </item>
> +        <item row="0" column="0">
> +         <widget class="QCheckBox" name="kcfg_ShowAsteroids">
> +          <property name="toolTip">
> +           <string>Draw asteroids?</string>
> +          </property>
> +          <property name="whatsThis">
> +           <string>If checked, asteroids will be drawn on the map</string>
> +          </property>
> +          <property name="text">
> +           <string>Asteroids</string>
> +          </property>
> +          <attribute name="buttonGroup">
> +           <string notr="true">solarButtonGroup</string>
> +          </attribute>
> +         </widget>
> +        </item>
> +        <item row="4" column="0">
> +         <widget class="QCheckBox" name="kcfg_ShowComets">
> +          <property name="toolTip">
> +           <string>Draw comets?</string>
> +          </property>
> +          <property name="whatsThis">
> +           <string>If checked, comets will be drawn on the map</string>
> +          </property>
> +          <property name="text">
> +           <string>Comets</string>
> +          </property>
> +          <attribute name="buttonGroup">
> +           <string notr="true">solarButtonGroup</string>
> +          </attribute>
> +         </widget>
> +        </item>
>          <item row="3" column="0">
>           <spacer>
>            <property name="orientation">
> @@ -301,34 +340,17 @@
>            </property>
>           </spacer>
>          </item>
> -        <item row="1" column="2">
> -         <layout class="QHBoxLayout" name="horizontalLayout">
> -          <item>
> -           <widget class="QDoubleSpinBox"
> name="kcfg_MagLimitAsteroidDownload"/>
> -          </item>
> -          <item>
> -           <widget class="QLabel" name="label_2">
> -            <property name="text">
> -             <string>mag</string>
> -            </property>
> -           </widget>
> -          </item>
> -         </layout>
> -        </item>
> -        <item row="0" column="0">
> -         <widget class="QCheckBox" name="kcfg_ShowAsteroids">
> -          <property name="toolTip">
> -           <string>Draw asteroids?</string>
> -          </property>
> -          <property name="whatsThis">
> -           <string>If checked, asteroids will be drawn on the map</string>
> +        <item row="2" column="0" colspan="3">
> +         <widget class="QLabel" name="MagLimitAsteroidDownloadWarning">
> +          <property name="styleSheet">
> +           <string notr="true">color:red; font-weight:bold;</string>
>            </property>
>            <property name="text">
> -           <string>Asteroids</string>
> +           <string>This value might result in a big data file and
> reduced performance!</string>
> +          </property>
> +          <property name="alignment">
> +           <set>Qt::AlignCenter</set>
>            </property>
> -          <attribute name="buttonGroup">
> -           <string notr="true">solarButtonGroup</string>
> -          </attribute>
>           </widget>
>          </item>
>          <item row="0" column="1">
> @@ -338,6 +360,22 @@
>            </property>
>           </widget>
>          </item>
> +        <item row="4" column="1">
> +         <widget class="QCheckBox" name="kcfg_ShowCometNames">
> +          <property name="toolTip">
> +           <string>Show names of comets near the Sun</string>
> +          </property>
> +          <property name="whatsThis">
> +           <string>If checked, the comets near the Sun will have name
> labels attached.  Comets vary in brightness in their orbits, so a faint
> magnitude is not effective in this case.</string>
> +          </property>
> +          <property name="text">
> +           <string>Show names of comets within</string>
> +          </property>
> +          <attribute name="buttonGroup">
> +           <string notr="true">solarButtonGroup</string>
> +          </attribute>
> +         </widget>
> +        </item>
>          <item row="0" column="2">
>           <layout class="QHBoxLayout">
>            <item>
> @@ -368,44 +406,42 @@
>            </item>
>           </layout>
>          </item>
> -        <item row="3" column="1">
> -         <layout class="QHBoxLayout">
> +        <item row="1" column="2">
> +         <layout class="QHBoxLayout" name="horizontalLayout">
>            <item>
> -           <widget class="QCheckBox" name="kcfg_ShowAsteroidNames">
> -            <property name="toolTip">
> -             <string>Attach name labels to asteroids?</string>
> -            </property>
> -            <property name="whatsThis">
> -             <string>If checked, then name labels will be attached to
> asteroids</string>
> -            </property>
> +           <widget class="QDoubleSpinBox"
> name="kcfg_MagLimitAsteroidDownload"/>
> +          </item>
> +          <item>
> +           <widget class="QLabel" name="label_2">
>              <property name="text">
> -             <string>Show names</string>
> +             <string>mag</string>
>              </property>
> -            <attribute name="buttonGroup">
> -             <string notr="true">solarButtonGroup</string>
> -            </attribute>
>             </widget>
>            </item>
> +         </layout>
> +        </item>
> +        <item row="4" column="2">
> +         <layout class="QHBoxLayout">
>            <item>
> -           <spacer>
> -            <property name="orientation">
> -             <enum>Qt::Horizontal</enum>
> +           <widget class="QDoubleSpinBox" name="kcfg_MaxRadCometName">
> +            <property name="toolTip">
> +             <string>Maximum distance for comet names</string>
>              </property>
> -            <property name="sizeType">
> -             <enum>QSizePolicy::Preferred</enum>
> +            <property name="whatsThis">
> +             <string>Set the maximum distance from the Sun for a comet
> to have a name label, in Astronomical Units (AU).  1 AU is the distance
> between the Earth and the Sun, approximately 150 million km</string>
>              </property>
> -            <property name="sizeHint" stdset="0">
> -             <size>
> -              <width>20</width>
> -              <height>20</height>
> -             </size>
> +            <property name="decimals">
> +             <number>2</number>
>              </property>
> -           </spacer>
> +            <property name="maximum">
> +             <double>9999.000000000000000</double>
> +            </property>
> +           </widget>
>            </item>
>            <item>
> -           <widget class="QLabel" name="LabelDensity">
> +           <widget class="QLabel" name="textLabel4">
>              <property name="text">
> -             <string>Label density:</string>
> +             <string>AU</string>
>              </property>
>             </widget>
>            </item>
> @@ -421,82 +457,53 @@
>            </property>
>           </widget>
>          </item>
> -        <item row="4" column="0">
> -         <widget class="QCheckBox" name="kcfg_ShowComets">
> -          <property name="toolTip">
> -           <string>Draw comets?</string>
> -          </property>
> -          <property name="whatsThis">
> -           <string>If checked, comets will be drawn on the map</string>
> -          </property>
> -          <property name="text">
> -           <string>Comets</string>
> -          </property>
> -          <attribute name="buttonGroup">
> -           <string notr="true">solarButtonGroup</string>
> -          </attribute>
> -         </widget>
> -        </item>
> -        <item row="4" column="1">
> -         <widget class="QCheckBox" name="kcfg_ShowCometNames">
> -          <property name="toolTip">
> -           <string>Show names of comets near the Sun</string>
> -          </property>
> -          <property name="whatsThis">
> -           <string>If checked, the comets near the Sun will have name
> labels attached.  Comets vary in brightness in their orbits, so a faint
> magnitude is not effective in this case.</string>
> -          </property>
> -          <property name="text">
> -           <string>Show names of comets within</string>
> -          </property>
> -          <attribute name="buttonGroup">
> -           <string notr="true">solarButtonGroup</string>
> -          </attribute>
> -         </widget>
> -        </item>
> -        <item row="4" column="2">
> +        <item row="3" column="1">
>           <layout class="QHBoxLayout">
>            <item>
> -           <widget class="QDoubleSpinBox" name="kcfg_MaxRadCometName">
> +           <widget class="QCheckBox" name="kcfg_ShowAsteroidNames">
>              <property name="toolTip">
> -             <string>Maximum distance for comet names</string>
> +             <string>Attach name labels to asteroids?</string>
>              </property>
>              <property name="whatsThis">
> -             <string>Set the maximum distance from the Sun for a comet
> to have a name label, in Astronomical Units (AU).  1 AU is the distance
> between the Earth and the Sun, approximately 150 million km</string>
> -            </property>
> -            <property name="decimals">
> -             <number>2</number>
> +             <string>If checked, then name labels will be attached to
> asteroids</string>
>              </property>
> -            <property name="maximum">
> -             <double>9999.000000000000000</double>
> +            <property name="text">
> +             <string>Show names</string>
>              </property>
> +            <attribute name="buttonGroup">
> +             <string notr="true">solarButtonGroup</string>
> +            </attribute>
>             </widget>
>            </item>
>            <item>
> -           <widget class="QLabel" name="textLabel4">
> +           <spacer>
> +            <property name="orientation">
> +             <enum>Qt::Horizontal</enum>
> +            </property>
> +            <property name="sizeType">
> +             <enum>QSizePolicy::Preferred</enum>
> +            </property>
> +            <property name="sizeHint" stdset="0">
> +             <size>
> +              <width>20</width>
> +              <height>20</height>
> +             </size>
> +            </property>
> +           </spacer>
> +          </item>
> +          <item>
> +           <widget class="QLabel" name="LabelDensity">
>              <property name="text">
> -             <string>AU</string>
> +             <string>Label density:</string>
>              </property>
>             </widget>
>            </item>
>           </layout>
>          </item>
> -        <item row="1" column="1">
> -         <widget class="QLabel" name="label_3">
> -          <property name="text">
> -           <string>Download asteroids brighter than</string>
> -          </property>
> -         </widget>
> -        </item>
> -        <item row="2" column="0" colspan="3">
> -         <widget class="QLabel" name="MagLimitAsteroidDownloadWarning">
> -          <property name="styleSheet">
> -           <string notr="true">color:red; font-weight:bold;</string>
> -          </property>
> +        <item row="5" column="1">
> +         <widget class="QCheckBox" name="kcfg_ShowCometComas">
>            <property name="text">
> -           <string>This value might result in a big data file and
> reduced performance!</string>
> -          </property>
> -          <property name="alignment">
> -           <set>Qt::AlignCenter</set>
> +           <string>Show Comet Comas</string>
>            </property>
>           </widget>
>          </item>
> diff --git a/kstars/skycomponents/cometscomponent.cpp
> b/kstars/skycomponents/cometscomponent.cpp
> index 7faf91675..8fc949e79 100644
> --- a/kstars/skycomponents/cometscomponent.cpp
> +++ b/kstars/skycomponents/cometscomponent.cpp
> @@ -95,42 +95,42 @@ void CometsComponent::loadData()
>      long double JD;
>      float M1, M2, K1, K2, diameter, albedo, rot_period, period;
>  
> -    emitProgressText(i18n("Loading comets"));
> +    emitProgressText( i18n( "Loading comets" ) );
>  
> -    qDeleteAll(m_ObjectList);
> +    qDeleteAll( m_ObjectList );
>      m_ObjectList.clear();
>  
> -    objectNames(SkyObject::COMET).clear();
> -    objectLists(SkyObject::COMET).clear();
> +    objectNames( SkyObject::COMET ).clear();
> +    objectLists( SkyObject::COMET ).clear();
>  
>      QList< QPair<QString, KSParser::DataTypes> > sequence;
> -    sequence.append(qMakePair(QString("full name"), KSParser::D_QSTRING));
> -    sequence.append(qMakePair(QString("epoch_mjd"), KSParser::D_INT));
> -    sequence.append(qMakePair(QString("q"), KSParser::D_DOUBLE));
> -    sequence.append(qMakePair(QString("e"), KSParser::D_DOUBLE));
> -    sequence.append(qMakePair(QString("i"), KSParser::D_DOUBLE));
> -    sequence.append(qMakePair(QString("w"), KSParser::D_DOUBLE));
> -    sequence.append(qMakePair(QString("om"), KSParser::D_DOUBLE));
> -    sequence.append(qMakePair(QString("tp_calc"), KSParser::D_DOUBLE));
> -    sequence.append(qMakePair(QString("orbit_id"), KSParser::D_QSTRING));
> -    sequence.append(qMakePair(QString("neo"), KSParser::D_QSTRING));
> -    sequence.append(qMakePair(QString("M1"), KSParser::D_FLOAT));
> -    sequence.append(qMakePair(QString("M2"), KSParser::D_FLOAT));
> -    sequence.append(qMakePair(QString("diameter"), KSParser::D_FLOAT));
> -    sequence.append(qMakePair(QString("extent"), KSParser::D_QSTRING));
> -    sequence.append(qMakePair(QString("albedo"), KSParser::D_FLOAT));
> -    sequence.append(qMakePair(QString("rot_period"), KSParser::D_FLOAT));
> -    sequence.append(qMakePair(QString("per_y"), KSParser::D_FLOAT));
> -    sequence.append(qMakePair(QString("moid"), KSParser::D_DOUBLE));
> -    sequence.append(qMakePair(QString("class"), KSParser::D_QSTRING));
> -    sequence.append(qMakePair(QString("H"), KSParser::D_SKIP));
> -    sequence.append(qMakePair(QString("G"), KSParser::D_SKIP));
> -
> -    QString file_name =
> KSPaths::locate(QStandardPaths::GenericDataLocation,
> QString("comets.dat") );
> -    KSParser cometParser(file_name, '#', sequence);
> +    sequence.append( qMakePair( QString( "full name" ),
> KSParser::D_QSTRING ) );
> +    sequence.append( qMakePair( QString( "epoch_mjd" ), KSParser::D_INT
> ) );
> +    sequence.append( qMakePair( QString( "q" ), KSParser::D_DOUBLE ) );
> +    sequence.append( qMakePair( QString( "e" ), KSParser::D_DOUBLE ) );
> +    sequence.append( qMakePair( QString( "i" ), KSParser::D_DOUBLE ) );
> +    sequence.append( qMakePair( QString( "w" ), KSParser::D_DOUBLE ) );
> +    sequence.append( qMakePair( QString( "om" ), KSParser::D_DOUBLE ) );
> +    sequence.append( qMakePair( QString( "tp_calc" ),
> KSParser::D_DOUBLE ) );
> +    sequence.append( qMakePair( QString( "orbit_id" ),
> KSParser::D_QSTRING ) );
> +    sequence.append( qMakePair( QString( "neo" ), KSParser::D_QSTRING ) );
> +    sequence.append( qMakePair( QString( "M1" ), KSParser::D_FLOAT ) );
> +    sequence.append( qMakePair( QString( "M2" ), KSParser::D_FLOAT ) );
> +    sequence.append( qMakePair( QString( "diameter" ),
> KSParser::D_FLOAT ) );
> +    sequence.append( qMakePair( QString( "extent" ),
> KSParser::D_QSTRING ) );
> +    sequence.append( qMakePair( QString( "albedo" ), KSParser::D_FLOAT ) );
> +    sequence.append( qMakePair( QString( "rot_period" ),
> KSParser::D_FLOAT ) );
> +    sequence.append( qMakePair( QString( "per_y" ), KSParser::D_FLOAT ) );
> +    sequence.append( qMakePair( QString( "moid" ), KSParser::D_DOUBLE ) );
> +    sequence.append( qMakePair( QString( "class" ), KSParser::D_QSTRING
> ) );
> +    sequence.append( qMakePair( QString( "H" ), KSParser::D_SKIP ) );
> +    sequence.append( qMakePair( QString( "G" ), KSParser::D_SKIP ) );
> +
> +    QString file_name = KSPaths::locate(
> QStandardPaths::GenericDataLocation, QString( "comets.dat" ) );
> +    KSParser cometParser( file_name, '#', sequence );
>  
>      QHash<QString, QVariant> row_content;
> -    while (cometParser.HasNextRow())
> +    while ( cometParser.HasNextRow() )
>      {
>          KSComet * com = 0;
>          row_content = cometParser.ReadNextRow();
> @@ -146,12 +146,12 @@ void CometsComponent::loadData()
>          orbit_id = row_content["orbit_id"].toString();
>          neo = row_content["neo"] == "Y";
>  
> -        if(row_content["M1"].toFloat()==0.0)
> +        if ( row_content["M1"].toFloat() == 0.0 )
>              M1 = 101.0;
>          else
>              M1 = row_content["M1"].toFloat();
>  
> -        if(row_content["M2"].toFloat()==0.0)
> +        if ( row_content["M2"].toFloat() == 0.0 )
>              M2 = 101.0;
>          else
>              M2 = row_content["M2"].toFloat();
> @@ -186,34 +186,34 @@ void CometsComponent::loadData()
>  
>          // Add *short* name to the list of object names
>          objectNames( SkyObject::COMET ).append( com->name() );
> -        objectLists( SkyObject::COMET ).append(QPair<QString, const
> SkyObject *>(com->name(),com));
> +        objectLists( SkyObject::COMET ).append( QPair<QString, const
> SkyObject *>( com->name(), com ) );
>      }
>  }
>  
>  void CometsComponent::draw( SkyPainter * skyp )
>  {
> -    Q_UNUSED(skyp)
> +    Q_UNUSED( skyp )
>  #ifndef KSTARS_LITE
> -    if( !selected() || Options::zoomFactor() < 10*MINZOOM )
> +    if ( !selected() || Options::zoomFactor() < 10 * MINZOOM )
>          return;
>  
>      bool hideLabels =  ! Options::showCometNames() ||
> -                       (SkyMap::Instance()->isSlewing() &&
> -                        Options::hideLabels() );
> +                       ( SkyMap::Instance()->isSlewing() &&
> +                         Options::hideLabels() );
>      double rsunLabelLimit = Options::maxRadCometName();
>  
>      //FIXME: Should these be config'able?
> -    skyp->setPen( QPen( QColor( "darkcyan" ) ) );
> -    skyp->setBrush( QBrush( QColor( "darkcyan" ) ) );
> +    skyp->setPen( QPen( QColor( "transparent" ) ) );
> +    skyp->setBrush( QBrush( QColor( "white" ) ) );
>  
>      foreach ( SkyObject * so, m_ObjectList )
>      {
> -        KSComet * com = (KSComet *)so;
> -        double mag= com->mag();
> -        if (std::isnan(mag) == 0)
> +        KSComet * com = ( KSComet * )so;
> +        double mag = com->mag();
> +        if ( std::isnan( mag ) == 0 )
>          {
> -            bool drawn = skyp->drawPointSource(com,mag);
> -            if ( drawn && !(hideLabels || com->rsun() >= rsunLabelLimit) )
> +            bool drawn = skyp->drawComet( com );
> +            if ( drawn && !( hideLabels || com->rsun() >=
> rsunLabelLimit ) )
>                  SkyLabeler::AddLabel( com, SkyLabeler::COMET_LABEL );
>          }
>      }
> @@ -224,15 +224,15 @@ void CometsComponent::updateDataFile()
>  {
>      downloadJob = new FileDownloader();
>  
> -    downloadJob->setProgressDialogEnabled(true, i18n("Comets Update"),
> i18n("Downloading comets updates..."));
> +    downloadJob->setProgressDialogEnabled( true, i18n( "Comets Update"
> ), i18n( "Downloading comets updates..." ) );
>  
> -    connect(downloadJob, SIGNAL(downloaded()), this,
> SLOT(downloadReady()));
> -    connect(downloadJob, SIGNAL(error(QString)), this,
> SLOT(downloadError(QString)));
> +    connect( downloadJob, SIGNAL( downloaded() ), this, SLOT(
> downloadReady() ) );
> +    connect( downloadJob, SIGNAL( error( QString ) ), this, SLOT(
> downloadError( QString ) ) );
>  
>      QUrl url = QUrl( "https://ssd.jpl.nasa.gov/sbdb_query.cgi" );
> -    QByteArray post_data = KSUtils::getJPLQueryString("com",
> "AcBdBiBgBjBlBkBqBbAgAkAlApAqArAsBsBtChAmAn", 
> QVector<KSUtils::JPLFilter> {{"Af", "!=", "D"}});
> +    QByteArray post_data = KSUtils::getJPLQueryString( "com",
> "AcBdBiBgBjBlBkBqBbAgAkAlApAqArAsBsBtChAmAn", 
> QVector<KSUtils::JPLFilter> {{"Af", "!=", "D"}} );
>  
> -    downloadJob->post(url, post_data);
> +    downloadJob->post( url, post_data );
>  }
>  
>  void CometsComponent::downloadReady()
> @@ -242,8 +242,8 @@ void CometsComponent::downloadReady()
>      data.insert( 0, '#' );
>  
>      // Write data to asteroids.dat
> -    QFile file(
> KSPaths::writableLocation(QStandardPaths::GenericDataLocation) +
> "comets.dat" ) ;
> -    file.open( QIODevice::WriteOnly|QIODevice::Truncate|QIODevice::Text );
> +    QFile file( KSPaths::writableLocation(
> QStandardPaths::GenericDataLocation ) + "comets.dat" ) ;
> +    file.open( QIODevice::WriteOnly | QIODevice::Truncate |
> QIODevice::Text );
>      file.write( data );
>      file.close();
>  
> @@ -259,12 +259,12 @@ void CometsComponent::downloadReady()
>      downloadJob->deleteLater();
>  }
>  
> -void CometsComponent::downloadError(const QString &errorString)
> +void CometsComponent::downloadError( const QString &errorString )
>  {
>  #ifndef KSTARS_LITE
> -    KMessageBox::error(0, i18n("Error downloading asteroids data: %1",
> errorString));
> +    KMessageBox::error( 0, i18n( "Error downloading asteroids data:
> %1", errorString ) );
>  #else
> -    qDebug() << i18n("Error downloading comets data: %1", errorString);
> +    qDebug() << i18n( "Error downloading comets data: %1", errorString );
>  #endif
>      downloadJob->deleteLater();
>  }
> diff --git a/kstars/skycomponents/solarsystemcomposite.h
> b/kstars/skycomponents/solarsystemcomposite.h
> index 1f2c30ca9..a5fa1d13b 100644
> --- a/kstars/skycomponents/solarsystemcomposite.h
> +++ b/kstars/skycomponents/solarsystemcomposite.h
> @@ -48,6 +48,12 @@ class SolarSystemComposite : public SkyComposite
>          {
>              return m_Earth;
>          }
> +
> +        KSSun * sun()
> +        {
> +            return m_Sun;
> +        }
> +
>          const QList<SkyObject *> &asteroids() const;
>          const QList<SkyObject *> &comets() const;
>          const QList<SkyObject *> &planetObjects() const;
> diff --git a/kstars/skyobjects/kscomet.h b/kstars/skyobjects/kscomet.h
> index 37fdfb3cc..05d74e7f0 100644
> --- a/kstars/skyobjects/kscomet.h
> +++ b/kstars/skyobjects/kscomet.h
> @@ -149,17 +149,17 @@ class KSComet : public KSPlanetBase
>          /**
>           *@short Sets the comet's apparent tail length in degrees
>           */
> -        void setTailAngSize( double tailangsize )
> +        void setComaAngSize( double comaAngSize )
>          {
> -            TailAngSize = tailangsize;
> +            ComaAngSize = comaAngSize;
>          }
>  
>          /**
>           *@return the estimated angular size of the tail as a dms
>           */
> -        inline dms getTailAngSize()
> +        inline dms getComaAngSize()
>          {
> -            return dms( TailAngSize );
> +            return dms( ComaAngSize );
>          }
>  
>          /**
> @@ -295,7 +295,7 @@ class KSComet : public KSPlanetBase
>              *@param Earth planet Earth (needed to calculate geocentric
> coords)
>              *@return true if position was successfully calculated.
>              */
> -        virtual bool findGeocentricPosition( const KSNumbers * num,
> const KSPlanetBase * Earth=NULL );
> +        virtual bool findGeocentricPosition( const KSNumbers * num,
> const KSPlanetBase * Earth = NULL );
>  
>          /**
>           *@short Estimate physical parameters of the comet such as coma
> size, tail length and size of the nucleus
> @@ -305,11 +305,11 @@ class KSComet : public KSPlanetBase
>  
>  
>      private:
> -        virtual void findMagnitude(const KSNumbers *);
> +        virtual void findMagnitude( const KSNumbers * );
>  
>          long double JD, JDp;
>          double q, e, a, P, EarthMOID;
> -        double TailSize, TailAngSize, ComaSize, NuclearSize; // All in
> kilometres
> +        double TailSize, ComaAngSize, ComaSize, NuclearSize; // All in
> kilometres
>          float M1, M2, K1, K2, Albedo, Diameter, RotationPeriod, Period;
>          dms i, w, N;
>          QString OrbitID, OrbitClass, Dimensions ;
> diff --git a/kstars/skyobjects/ksplanetbase.cpp
> b/kstars/skyobjects/ksplanetbase.cpp
> index f30d87c10..171e38a1a 100644
> --- a/kstars/skyobjects/ksplanetbase.cpp
> +++ b/kstars/skyobjects/ksplanetbase.cpp
> @@ -39,16 +39,16 @@
>  #include "texturemanager.h"
>  
>  QVector<QColor> KSPlanetBase::planetColor = QVector<QColor>() <<
> -        QColor("slateblue") << //Mercury
> -        QColor("lightgreen") << //Venus
> -        QColor("red") << //Mars
> -        QColor("goldenrod") << //Jupiter
> -        QColor("khaki") << //Saturn
> -        QColor("lightseagreen") << //Uranus
> -        QColor("skyblue") << //Neptune
> -        QColor("grey") << //Pluto
> -        QColor("yellow") << //Sun
> -        QColor("white"); //Moon
> +        QColor( "slateblue" ) << //Mercury
> +        QColor( "lightgreen" ) << //Venus
> +        QColor( "red" ) << //Mars
> +        QColor( "goldenrod" ) << //Jupiter
> +        QColor( "khaki" ) << //Saturn
> +        QColor( "lightseagreen" ) << //Uranus
> +        QColor( "skyblue" ) << //Neptune
> +        QColor( "grey" ) << //Pluto
> +        QColor( "yellow" ) << //Sun
> +        QColor( "white" ); //Moon
>  
>  
>  const SkyObject::UID KSPlanetBase::UID_SOL_BIGOBJ   = 0;
> @@ -119,7 +119,7 @@ void KSPlanetBase::updateCoords( const KSNumbers *
> num, bool includePlanets, con
>          {
>              findPosition( num, lat, LST, kd->skyComposite()->earth() );
>              //Don't add to the trail this time
> -            if( hasTrail() )
> +            if ( hasTrail() )
>                  Trail.takeLast();
>          }
>          else
> @@ -134,29 +134,29 @@ void KSPlanetBase::findPosition( const KSNumbers *
> num, const CachingDms * lat,
>      // DEBUG edit
>      findGeocentricPosition( num, Earth );  //private function,
> reimplemented in each subclass
>      findPhase();
> -    setAngularSize( asin(physicalSize()/Rearth/AU_KM)*60.*180./dms::PI
> ); //angular size in arcmin
> +    setAngularSize( asin( physicalSize() / Rearth / AU_KM ) * 60.*180.
> / dms::PI ); //angular size in arcmin
>  
>      if ( lat && LST )
>          localizeCoords( num, lat, LST ); //correct for figure-of-the-Earth
>  
>      if ( hasTrail() )
>      {
> -        addToTrail( KStarsDateTime( num->getJD() ).toString(
> "yyyy.MM.dd hh:mm" ) + i18nc("Universal time", "UT") ); // TODO:
> Localize date/time format?
> +        addToTrail( KStarsDateTime( num->getJD() ).toString(
> "yyyy.MM.dd hh:mm" ) + i18nc( "Universal time", "UT" ) ); // TODO:
> Localize date/time format?
>          if ( Trail.size() > TrailObject::MaxTrail )
>              clipTrail();
>      }
>  
> -    findMagnitude(num);
> +    findMagnitude( num );
>  
>      if ( type() == SkyObject::COMET )
>      {
>          // Compute tail size
> -        KSComet * me = (KSComet *)this;
> -        double TailAngSize;
> +        KSComet * me = ( KSComet * )this;
> +        double comaAngSize;
>          // Convert the tail size in km to angular tail size (degrees)
> -        TailAngSize = asin(physicalSize()/Rearth/AU_KM)*60.0*180.0/dms::PI;
> +        comaAngSize = asin( physicalSize() / Rearth / AU_KM ) * 60.0 *
> 180.0 / dms::PI;
>          // Find the apparent length as projected on the celestial
> sphere (the comet's tail points away from the sun)
> -        me->setTailAngSize( TailAngSize * fabs(sin( phase().radians() )));
> +        me->setComaAngSize( comaAngSize * fabs( sin( phase().radians()
> ) ) );
>      }
>  
>  }
> @@ -177,14 +177,14 @@ void KSPlanetBase::localizeCoords( const KSNumbers
> * num, const CachingDms * lat
>      double rsinp, rcosp, u, sinHA, cosHA, sinDec, cosDec, D;
>      double cosHA2;
>      double r = Rearth * AU_KM; //distance from Earth, in km
> -    u = atan( 0.996647*tan( lat->radians() ) );
> -    rsinp = 0.996647*sin( u );
> +    u = atan( 0.996647 * tan( lat->radians() ) );
> +    rsinp = 0.996647 * sin( u );
>      rcosp = cos( u );
>      HA.setD( LST->Degrees() - ra().Degrees() );
>      HA.SinCos( sinHA, cosHA );
>      dec().SinCos( sinDec, cosDec );
>  
> -    D = atan2( rcosp*sinHA, r*cosDec/6378.14 - rcosp*cosHA );
> +    D = atan2( rcosp * sinHA, r * cosDec / 6378.14 - rcosp * cosHA );
>      dms temp;
>      temp.setRadians( ra().radians() - D );
>      setRA( temp );
> @@ -194,7 +194,7 @@ void KSPlanetBase::localizeCoords( const KSNumbers *
> num, const CachingDms * lat
>  
>      //temp.setRadians( atan2( cosHA2*( r*sinDec/6378.14 - rsinp ),
> r*cosDec*cosHA/6378.14 - rcosp ) );
>      // The atan2() version above makes the planets move crazy in the
> htm branch -jbb
> -    temp.setRadians( atan( cosHA2*( r*sinDec/6378.14 - rsinp )/(
> r*cosDec*cosHA/6378.14 - rcosp ) ) );
> +    temp.setRadians( atan( cosHA2 * ( r * sinDec / 6378.14 - rsinp ) /
> ( r * cosDec * cosHA / 6378.14 - rcosp ) ) );
>  
>      setDec( temp );
>  
> @@ -219,7 +219,7 @@ void KSPlanetBase::setRearth( const KSPlanetBase *
> Earth )
>  {
>      double sinL, sinB, sinL0, sinB0;
>      double cosL, cosB, cosL0, cosB0;
> -    double x,y,z;
> +    double x, y, z;
>  
>      //The Moon's Rearth is set in its findGeocentricPosition()...
>      if ( name() == "Moon" )
> @@ -242,20 +242,20 @@ void KSPlanetBase::setRearth( const KSPlanetBase *
> Earth )
>  
>      Earth->ecLong().SinCos( sinL0, cosL0 );
>      Earth->ecLat().SinCos( sinB0, cosB0 );
> -    double eX = Earth->rsun()*cosB0*cosL0;
> -    double eY = Earth->rsun()*cosB0*sinL0;
> -    double eZ = Earth->rsun()*sinB0;
> +    double eX = Earth->rsun() * cosB0 * cosL0;
> +    double eY = Earth->rsun() * cosB0 * sinL0;
> +    double eZ = Earth->rsun() * sinB0;
>  
>      helEcLong().SinCos( sinL, cosL );
>      helEcLat().SinCos( sinB, cosB );
> -    x = rsun()*cosB*cosL - eX;
> -    y = rsun()*cosB*sinL - eY;
> -    z = rsun()*sinB - eZ;
> +    x = rsun() * cosB * cosL - eX;
> +    y = rsun() * cosB * sinL - eY;
> +    z = rsun() * sinB - eZ;
>  
> -    Rearth = sqrt(x*x + y*y + z*z);
> +    Rearth = sqrt( x * x + y * y + z * z );
>  
>      //Set angular size, in arcmin
> -    AngularSize = asin(PhysicalSize/Rearth/AU_KM)*60.*180./dms::PI;
> +    AngularSize = asin( PhysicalSize / Rearth / AU_KM ) * 60.*180. /
> dms::PI;
>  }
>  
>  void KSPlanetBase::findPA( const KSNumbers * num )
> @@ -271,7 +271,7 @@ void KSPlanetBase::findPA( const KSNumbers * num )
>      double pa;
>      if ( dy )
>      {
> -        pa = atan2( dx, dy )*180.0/dms::PI;
> +        pa = atan2( dx, dy ) * 180.0 / dms::PI;
>      }
>      else
>      {
> @@ -282,7 +282,7 @@ void KSPlanetBase::findPA( const KSNumbers * num )
>  
>  double KSPlanetBase::labelOffset() const
>  {
> -    double size = angSize() * dms::PI * Options::zoomFactor()/10800.0;
> +    double size = angSize() * dms::PI * Options::zoomFactor() / 10800.0;
>  
>      //Determine minimum size for offset
>      double minsize = 4.;
> @@ -295,17 +295,17 @@ double KSPlanetBase::labelOffset() const
>  
>      //Inflate offset for Saturn
>      if ( name() == i18n( "Saturn" ) )
> -        size = int(2.5*size);
> +        size = int( 2.5 * size );
>  
> -    return 0.5*size + 4.;
> +    return 0.5 * size + 4.;
>  }
>  
>  void KSPlanetBase::findPhase()
>  {
>      /* Compute the phase of the planet in degrees */
>      double earthSun =
> KStarsData::Instance()->skyComposite()->earth()->rsun();
> -    double cosPhase = (rsun()*rsun() + rearth()*rearth() -
> earthSun*earthSun)
> -                      / (2 * rsun() * rearth() );
> +    double cosPhase = ( rsun() * rsun() + rearth() * rearth() -
> earthSun * earthSun )
> +                      / ( 2 * rsun() * rearth() );
>      Phase = acos ( cosPhase ) * 180.0 / dms::PI;
>      /* More elegant way of doing it, but requires the Sun.
>         TODO: Switch to this if and when we make KSSun a singleton */
> diff --git a/kstars/skypainter.h b/kstars/skypainter.h
> index c590141e6..6c52e613e 100644
> --- a/kstars/skypainter.h
> +++ b/kstars/skypainter.h
> @@ -36,7 +36,9 @@ class LineListLabel;
>  class Satellite;
>  class Supernova;
>  class ConstellationsArt;
> -
> +class KSComet;
> +class SolarSystemComposite;
> +class KSSun;
>  
>  /** @short Draws things on the sky, without regard to backend.
>      This class serves as an interface to draw objects onto the sky without
> @@ -110,6 +112,12 @@ class SkyPainter
>              */
>          virtual void drawSkyPolygon(LineList * list, bool
> forceClip=true) =0;
>  
> +        /** @short Draw a comet in the sky.
> +            @param com comet to draw
> +            @return true if a comet was drawn
> +            */
> +        virtual bool drawComet(KSComet * com) =0;
> +
>          /** @short Draw a point source (e.g., a star).
>              @param loc the location of the source in the sky
>              @param mag the magnitude of the source
> diff --git a/kstars/skyqpainter.cpp b/kstars/skyqpainter.cpp
> index c6cfa7140..ee02d8805 100644
> --- a/kstars/skyqpainter.cpp
> +++ b/kstars/skyqpainter.cpp
> @@ -9,7 +9,7 @@
>      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.
> +    GNU General Public License for more decomas.
>  
>      You should have received a copy of the GNU General Public License along
>      with this program; if not, write to the Free Software Foundation, Inc.,
> @@ -29,6 +29,7 @@
>  #include "skycomponents/skymapcomposite.h"
>  #include "skycomponents/flagcomponent.h"
>  #include "skycomponents/satellitescomponent.h"
> +#include "skycomponents/solarsystemcomposite.h"
>  
>  #include "skyobjects/deepskyobject.h"
>  #include "skyobjects/kscomet.h"
> @@ -37,6 +38,7 @@
>  #include "skyobjects/satellite.h"
>  #include "skyobjects/supernova.h"
>  #include "skyobjects/constellationsart.h"
> +#include "skyobjects/kssun.h"
>  #include "projections/projector.h"
>  #include "ksutils.h"
>  
> @@ -45,15 +47,12 @@
>  
>  #include <functional>
>  
> -namespace
> -{
> +namespace {
>  
>  // Convert spectral class to numerical index.
>  // If spectral class is invalid return index for white star (A class)
> -int harvardToIndex(char c)
> -{
> -    switch( c )
> -    {
> +int harvardToIndex( char c ) {
> +    switch ( c ) {
>          case 'o':
>          case 'O':
>              return 0;
> @@ -92,17 +91,15 @@ const int nSPclasses = 7;
>  // These pixmaps are never deallocated. Not really good...
>  QPixmap * imageCache[nSPclasses][nStarSizes] = {{0}};
>  
> -QPixmap * visibleSatPixmap=0, *invisibleSatPixmap=0;
> +QPixmap * visibleSatPixmap = 0, *invisibleSatPixmap = 0;
>  }
>  
>  int SkyQPainter::starColorMode = 0;
>  QColor SkyQPainter::m_starColor = QColor();
>  QMap<char, QColor> SkyQPainter::ColorMap = QMap<char, QColor>();
>  
> -
>  SkyQPainter::SkyQPainter( QPaintDevice * pd )
> -    : SkyPainter(), QPainter()
> -{
> +    : SkyPainter(), QPainter() {
>      Q_ASSERT( pd );
>      m_pd = pd;
>      m_size = QSize( pd->width(), pd->height() );
> @@ -110,8 +107,7 @@ SkyQPainter::SkyQPainter( QPaintDevice * pd )
>  }
>  
>  SkyQPainter::SkyQPainter( QPaintDevice * pd, const QSize &size )
> -    : SkyPainter(), QPainter()
> -{
> +    : SkyPainter(), QPainter() {
>      Q_ASSERT( pd );
>      m_pd = pd;
>      m_size = size;
> @@ -119,8 +115,7 @@ SkyQPainter::SkyQPainter( QPaintDevice * pd, const
> QSize &size )
>  }
>  
>  SkyQPainter::SkyQPainter( QWidget * widget, QPaintDevice * pd )
> -    : SkyPainter(), QPainter()
> -{
> +    : SkyPainter(), QPainter() {
>      Q_ASSERT( widget );
>      // Set paint device pointer to pd or to the widget if pd = 0
>      m_pd = ( pd ? pd : widget );
> @@ -128,48 +123,40 @@ SkyQPainter::SkyQPainter( QWidget * widget,
> QPaintDevice * pd )
>      m_vectorStars = false;
>  }
>  
> -SkyQPainter::~SkyQPainter()
> -{
> +SkyQPainter::~SkyQPainter() {
>  }
>  
> -void SkyQPainter::begin()
> -{
> -    QPainter::begin(m_pd);
> +void SkyQPainter::begin() {
> +    QPainter::begin( m_pd );
>      bool aa = !m_sm->isSlewing() && Options::useAntialias();
> -    setRenderHint(QPainter::Antialiasing, aa );
> -    setRenderHint(QPainter::HighQualityAntialiasing, aa);
> +    setRenderHint( QPainter::Antialiasing, aa );
> +    setRenderHint( QPainter::HighQualityAntialiasing, aa );
>      m_proj = m_sm->projector();
>  }
>  
> -void SkyQPainter::end()
> -{
> +void SkyQPainter::end() {
>      QPainter::end();
>  }
>  
> -void SkyQPainter::drawSkyBackground()
> -{
> +void SkyQPainter::drawSkyBackground() {
>      //FIXME use projector
>      fillRect( 0, 0, m_size.width(), m_size.height(),
> KStarsData::Instance()->colorScheme()->colorNamed( "SkyColor" ) );
>  }
>  
> -void SkyQPainter::setPen(const QPen &pen)
> -{
> -    QPainter::setPen(pen);
> +void SkyQPainter::setPen( const QPen &pen ) {
> +    QPainter::setPen( pen );
>  }
>  
> -void SkyQPainter::setBrush(const QBrush &brush)
> -{
> -    QPainter::setBrush(brush);
> +void SkyQPainter::setBrush( const QBrush &brush ) {
> +    QPainter::setBrush( brush );
>  }
>  
> -void SkyQPainter::initStarImages()
> -{
> +void SkyQPainter::initStarImages() {
>  
>      const int starColorIntensity = Options::starColorIntensity();
>  
>      ColorMap.clear();
> -    switch( Options::starColorMode() )
> -    {
> +    switch ( Options::starColorMode() ) {
>          case 1: // Red stars.
>              m_starColor = Qt::red;
>              break;
> @@ -191,8 +178,7 @@ void SkyQPainter::initStarImages()
>              ColorMap.insert( 'M', QColor::fromRgb( 255,   0,   0 ) );
>              break;
>      }
> -    if ( ColorMap.isEmpty() )
> -    {
> +    if ( ColorMap.isEmpty() ) {
>          ColorMap.insert( 'O', m_starColor );
>          ColorMap.insert( 'B', m_starColor );
>          ColorMap.insert( 'A', m_starColor );
> @@ -202,93 +188,79 @@ void SkyQPainter::initStarImages()
>          ColorMap.insert( 'M', m_starColor );
>      }
>  
> -    foreach( char color, ColorMap.keys() )
> -    {
> +    foreach ( char color, ColorMap.keys() ) {
>          QPixmap BigImage( 15, 15 );
>          BigImage.fill( Qt::transparent );
>  
>          QPainter p;
>          p.begin( &BigImage );
>  
> -        if ( Options::starColorMode() == 0 )
> -        {
> +        if ( Options::starColorMode() == 0 ) {
>              qreal h, s, v, a;
>              p.setRenderHint( QPainter::Antialiasing, false );
>              QColor starColor = ColorMap[color];
> -            starColor.getHsvF(&h, &s, &v, &a);
> -            for (int i = 0; i < 8; i++ )
> -            {
> -                for (int j = 0; j < 8; j++ )
> -                {
> +            starColor.getHsvF( &h, &s, &v, &a );
> +            for ( int i = 0; i < 8; i++ ) {
> +                for ( int j = 0; j < 8; j++ ) {
>                      qreal x = i - 7;
>                      qreal y = j - 7;
> -                    qreal dist = sqrt( x*x + y*y ) / 7.0;
> -                    starColor.setHsvF(h,
> -                                      qMin( qreal(1), dist <
> (10-starColorIntensity)/10.0 ? 0 : dist ),
> -                                      v,
> -                                      qMax( qreal(0), dist <
> (10-starColorIntensity)/20.0 ? 1 : 1-dist ) );
> +                    qreal dist = sqrt( x * x + y * y ) / 7.0;
> +                    starColor.setHsvF( h,
> +                                       qMin( qreal( 1 ), dist < ( 10 -
> starColorIntensity ) / 10.0 ? 0 : dist ),
> +                                       v,
> +                                       qMax( qreal( 0 ), dist < ( 10 -
> starColorIntensity ) / 20.0 ? 1 : 1 - dist ) );
>                      p.setPen( starColor );
>                      p.drawPoint( i, j );
> -                    p.drawPoint( 14-i, j );
> -                    p.drawPoint( i, 14-j );
> -                    p.drawPoint (14-i, 14-j);
> +                    p.drawPoint( 14 - i, j );
> +                    p.drawPoint( i, 14 - j );
> +                    p.drawPoint ( 14 - i, 14 - j );
>                  }
>              }
> -        }
> -        else
> -        {
> -            p.setRenderHint(QPainter::Antialiasing, true );
> -            p.setPen( QPen(ColorMap[color], 2.0 ) );
> +        } else {
> +            p.setRenderHint( QPainter::Antialiasing, true );
> +            p.setPen( QPen( ColorMap[color], 2.0 ) );
>              p.setBrush( p.pen().color() );
>              p.drawEllipse( QRectF( 2, 2, 10, 10 ) );
>          }
>          p.end();
>  
>          // Cache array slice
> -        QPixmap ** pmap = imageCache[ harvardToIndex(color) ];
> -        for( int size = 1; size < nStarSizes; size++ )
> -        {
> -            if( !pmap[size] )
> +        QPixmap ** pmap = imageCache[ harvardToIndex( color ) ];
> +        for ( int size = 1; size < nStarSizes; size++ ) {
> +            if ( !pmap[size] )
>                  pmap[size] = new QPixmap();
>              *pmap[size] = BigImage.scaled( size, size,
> Qt::KeepAspectRatio, Qt::SmoothTransformation );
>          }
>      }
>      starColorMode = Options::starColorMode();
>  
> -    visibleSatPixmap = new
> QPixmap(":/icons/breeze/default/kstars_satellites_visible.svg");
> -    invisibleSatPixmap = new
> QPixmap(":/icons/breeze/default/kstars_satellites_invisible.svg");
> +    visibleSatPixmap = new QPixmap(
> ":/icons/breeze/default/kstars_satellites_visible.svg" );
> +    invisibleSatPixmap = new QPixmap(
> ":/icons/breeze/default/kstars_satellites_invisible.svg" );
>  }
>  
> -void SkyQPainter::drawSkyLine(SkyPoint * a, SkyPoint * b)
> -{
> +void SkyQPainter::drawSkyLine( SkyPoint * a, SkyPoint * b ) {
>  
>      bool aVisible, bVisible;
> -    QPointF aScreen = m_proj->toScreen(a,true,&aVisible);
> -    QPointF bScreen = m_proj->toScreen(b,true,&bVisible);
> +    QPointF aScreen = m_proj->toScreen( a, true, &aVisible );
> +    QPointF bScreen = m_proj->toScreen( b, true, &bVisible );
>  
> -    drawLine(aScreen, bScreen);
> +    drawLine( aScreen, bScreen );
>      return;
>  
>      //THREE CASES:
> -    if( aVisible && bVisible )
> -    {
> +    if ( aVisible && bVisible ) {
>          //Both a,b visible, so paint the line normally:
> -        drawLine(aScreen, bScreen);
> -    }
> -    else if( aVisible )
> -    {
> +        drawLine( aScreen, bScreen );
> +    } else if ( aVisible ) {
>          //a is visible but b isn't:
> -        drawLine(aScreen, m_proj->clipLine(a,b));
> -    }
> -    else if( bVisible )
> -    {
> +        drawLine( aScreen, m_proj->clipLine( a, b ) );
> +    } else if ( bVisible ) {
>          //b is visible but a isn't:
> -        drawLine(bScreen, m_proj->clipLine(b,a));
> +        drawLine( bScreen, m_proj->clipLine( b, a ) );
>      } //FIXME: what if both are offscreen but the line isn't?
>  }
>  
> -void SkyQPainter::drawSkyPolyline(LineList * list, SkipList * skipList,
> LineListLabel * label)
> -{
> +void SkyQPainter::drawSkyPolyline( LineList * list, SkipList *
> skipList, LineListLabel * label ) {
>      SkyList * points = list->points();
>      bool isVisible, isVisibleLast;
>  
> @@ -297,33 +269,26 @@ void SkyQPainter::drawSkyPolyline(LineList * list,
> SkipList * skipList, LineList
>      isVisibleLast &= m_proj->checkVisibility( points->first() );
>      QPointF oThis, oThis2;
>  
> -    for ( int j = 1 ; j < points->size() ; j++ )
> -    {
> +    for ( int j = 1 ; j < points->size() ; j++ ) {
>          SkyPoint * pThis = points->at( j );
>          oThis2 = oThis = m_proj->toScreen( pThis, true, &isVisible );
>          // & with the result of checkVisibility to clip away things
> below horizon
> -        isVisible &= m_proj->checkVisibility(pThis);
> +        isVisible &= m_proj->checkVisibility( pThis );
>          bool doSkip = false;
> -        if( skipList )
> -        {
> -            doSkip = skipList->skip(j);
> +        if ( skipList ) {
> +            doSkip = skipList->skip( j );
>          }
>  
>          bool pointsVisible = false;
>          //Temporary solution to avoid random lines in Gnomonic
> projection and draw lines up to horizon
> -        if(SkyMap::Instance()->projector()->type() == Projector::Gnomonic)
> -        {
> +        if ( SkyMap::Instance()->projector()->type() ==
> Projector::Gnomonic ) {
>              if ( isVisible && isVisibleLast ) pointsVisible = true;
> -        }
> -        else
> -        {
> +        } else {
>              if ( isVisible || isVisibleLast ) pointsVisible = true;
>          }
>  
> -        if ( !doSkip )
> -        {
> -            if(pointsVisible)
> -            {
> +        if ( !doSkip ) {
> +            if ( pointsVisible ) {
>                  drawLine( oLast, oThis );
>                  if ( label )
>                      label->updateLabelCandidates( oThis.x(), oThis.y(),
> list, j );
> @@ -335,23 +300,20 @@ void SkyQPainter::drawSkyPolyline(LineList * list,
> SkipList * skipList, LineList
>      }
>  }
>  
> -void SkyQPainter::drawSkyPolygon(LineList * list, bool forceClip)
> -{
> +void SkyQPainter::drawSkyPolygon( LineList * list, bool forceClip ) {
>      bool isVisible = false, isVisibleLast;
>      SkyList * points = list->points();
>      QPolygonF polygon;
>  
> -    if (forceClip == false)
> -    {
> -        for ( int i = 0; i < points->size(); ++i )
> -        {
> -            polygon << m_proj->toScreen( points->at( i ), false,
> &isVisibleLast);
> +    if ( forceClip == false ) {
> +        for ( int i = 0; i < points->size(); ++i ) {
> +            polygon << m_proj->toScreen( points->at( i ), false,
> &isVisibleLast );
>              isVisible |= isVisibleLast;
>          }
>  
>          // If 1+ points are visible, draw it
> -        if ( polygon.size() && isVisible)
> -            drawPolygon(polygon);
> +        if ( polygon.size() && isVisible )
> +            drawPolygon( polygon );
>  
>          return;
>      }
> @@ -360,27 +322,21 @@ void SkyQPainter::drawSkyPolygon(LineList * list,
> bool forceClip)
>      SkyPoint * pLast = points->last();
>      QPointF   oLast = m_proj->toScreen( pLast, true, &isVisibleLast );
>      // & with the result of checkVisibility to clip away things below
> horizon
> -    isVisibleLast &= m_proj->checkVisibility(pLast);
> +    isVisibleLast &= m_proj->checkVisibility( pLast );
>  
> -    for ( int i = 0; i < points->size(); ++i )
> -    {
> +    for ( int i = 0; i < points->size(); ++i ) {
>          SkyPoint * pThis = points->at( i );
>          QPointF oThis = m_proj->toScreen( pThis, true, &isVisible );
>          // & with the result of checkVisibility to clip away things
> below horizon
> -        isVisible &= m_proj->checkVisibility(pThis);
> +        isVisible &= m_proj->checkVisibility( pThis );
>  
>  
> -        if ( isVisible && isVisibleLast )
> -        {
> +        if ( isVisible && isVisibleLast ) {
>              polygon << oThis;
> -        }
> -        else if ( isVisibleLast )
> -        {
> +        } else if ( isVisibleLast ) {
>              QPointF oMid = m_proj->clipLine( pLast, pThis );
>              polygon << oMid;
> -        }
> -        else if ( isVisible )
> -        {
> +        } else if ( isVisible ) {
>              QPointF oMid = m_proj->clipLine( pThis, pLast );
>              polygon << oMid;
>              polygon << oThis;
> @@ -392,113 +348,148 @@ void SkyQPainter::drawSkyPolygon(LineList *
> list, bool forceClip)
>      }
>  
>      if ( polygon.size() )
> -        drawPolygon(polygon);
> +        drawPolygon( polygon );
>  
>  }
>  
> -bool SkyQPainter::drawPlanet(KSPlanetBase * planet)
> -{
> -    if( !m_proj->checkVisibility(planet) ) return false;
> +bool SkyQPainter::drawPlanet( KSPlanetBase * planet ) {
> +    if ( !m_proj->checkVisibility( planet ) ) return false;
>  
>      bool visible = false;
> -    QPointF pos = m_proj->toScreen(planet,true,&visible);
> -    if( !visible || !m_proj->onScreen(pos) ) return false;
> +    QPointF pos = m_proj->toScreen( planet, true, &visible );
> +    if ( !visible || !m_proj->onScreen( pos ) ) return false;
>  
>      float fakeStarSize = ( 10.0 + log10( Options::zoomFactor() ) -
> log10( MINZOOM ) ) * ( 10 - planet->mag() ) / 10;
> -    if( fakeStarSize > 15.0 )
> +    if ( fakeStarSize > 15.0 )
>          fakeStarSize = 15.0;
>  
> -    float size = planet->angSize() * dms::PI *
> Options::zoomFactor()/10800.0;
> -    if( size < fakeStarSize && planet->name() != "Sun" &&
> planet->name() != "Moon" )
> -    {
> +    float size = planet->angSize() * dms::PI * Options::zoomFactor() /
> 10800.0;
> +    if ( size < fakeStarSize && planet->name() != "Sun" &&
> planet->name() != "Moon" ) {
>          // Draw them as bright stars of appropriate color instead of images
>          char spType;
>          //FIXME: do these need i18n?
> -        if( planet->name() == i18n("Mars") )
> -        {
> +        if ( planet->name() == i18n( "Mars" ) ) {
>              spType = 'K';
> -        }
> -        else if( planet->name() == i18n("Jupiter") || planet->name() ==
> i18n("Mercury") || planet->name() == i18n("Saturn") )
> -        {
> +        } else if ( planet->name() == i18n( "Jupiter" ) ||
> planet->name() == i18n( "Mercury" ) || planet->name() == i18n( "Saturn"
> ) ) {
>              spType = 'F';
> -        }
> -        else
> -        {
> +        } else {
>              spType = 'B';
>          }
> -        drawPointSource(pos,fakeStarSize,spType);
> -    }
> -    else
> -    {
> +        drawPointSource( pos, fakeStarSize, spType );
> +    } else {
>          float sizemin = 1.0;
> -        if( planet->name() == "Sun" || planet->name() == "Moon" )
> +        if ( planet->name() == "Sun" || planet->name() == "Moon" )
>              sizemin = 8.0;
>  
> -        float size = planet->angSize() * dms::PI *
> Options::zoomFactor()/10800.0;
> -        if( size < sizemin )
> +        if ( size < sizemin )
>              size = sizemin;
> -        if( Options::showPlanetImages() && !planet->image().isNull() )
> -        {
> +
> +        if ( Options::showPlanetImages() && !planet->image().isNull() ) {
>              //Because Saturn has rings, we inflate its image size by a
> factor 2.5
> -            if( planet->name() == "Saturn" )
> -                size = int(2.5*size);
> +            if ( planet->name() == "Saturn" )
> +                size = int( 2.5 * size );
>              // Scale size exponentially so it is visible at large zooms
> -            else if (planet->name() == "Pluto")
> -                size = int(size*exp(1.5*size));
> +            else if ( planet->name() == "Pluto" )
> +                size = int( size * exp( 1.5 * size ) );
>  
>              save();
> -            translate(pos);
> +            translate( pos );
>              rotate( m_proj->findPA( planet, pos.x(), pos.y() ) );
> -            drawImage( QRect(-0.5*size, -0.5*size, size, size),
> +            drawImage( QRect( -0.5 * size, -0.5 * size, size, size ),
>                         planet->image() );
>              restore();
> -        }
> -        else     //Otherwise, draw a simple circle.
> -        {
> +        } else { //Otherwise, draw a simple circle.
>              drawEllipse( pos, size, size );
>          }
>      }
>      return true;
>  }
>  
> -bool SkyQPainter::drawPointSource(SkyPoint * loc, float mag, char sp)
> -{
> -    //Check if it's even visible before doing anything
> -    if( !m_proj->checkVisibility(loc) ) return false;
> +bool SkyQPainter::drawComet( KSComet * com ) {
> +    if ( !m_proj->checkVisibility( com ) ) return false;
> +
> +    float size = com->angSize() * dms::PI * Options::zoomFactor() /
> 10800.0;
> +    if ( size < 1 )
> +        size = 1;
>  
>      bool visible = false;
> -    QPointF pos = m_proj->toScreen(loc,true,&visible);
> -    if( visible && m_proj->onScreen(pos) )   // FIXME: onScreen here
> should use canvas size rather than SkyMap size, especially while
> printing in portrait mode!
> -    {
> -        drawPointSource(pos, starWidth(mag), sp);
> +    QPointF pos = m_proj->toScreen( com, true, &visible );
> +
> +    // Draw the coma.
> +    if ( visible && m_proj->onScreen( pos ) ) {
> +        // Draw the comet.
> +        drawEllipse( pos, size, size );
> +
> +        double comaLength = ( com->getComaAngSize().arcmin() * dms::PI
> * Options::zoomFactor() / 10800.0 );
> +
> +        // If coma is visible and long enough.
> +        if ( Options::showCometComas() && comaLength > size ) {
> +            KSSun * sun =
> KStarsData::Instance()->skyComposite()->solarSystemComposite()->sun();
> +
> +            // Find the anlge to the sun.
> +            double comaAngle = m_proj->findPA( sun, pos.x(), pos.y() );
> +
> +            const QVector<QPoint> coma = {
> +                QPoint( pos.x() - size, pos.y() ),
> +                QPoint( pos.x() + size, pos.y() ),
> +                QPoint( pos.x(), pos.y() + comaLength )
> +            };
> +
> +            QPolygon comaPoly( coma );
> +
> +            comaPoly = QTransform()
> +                       .translate( pos.x(), pos.y() )
> +                       .rotate( comaAngle ) // Already + 180 Deg,
> because rotated from south, not north.
> +                       .translate( -pos.x(), -pos.y() )
> +                       .map( comaPoly );
> +
> +            save();
> +
> +            // Nice fade for the Coma.
> +            QLinearGradient linearGrad( pos, comaPoly.point( 2 ) );
> +            linearGrad.setColorAt( 0,  QColor( "white" ) );
> +            linearGrad.setColorAt( size / comaLength,  QColor( "white" ) );
> +            linearGrad.setColorAt( 0.9, QColor( "transparent" ) );
> +            setBrush( linearGrad );
> +
> +            // Render Coma.
> +            drawConvexPolygon( comaPoly );
> +            restore();
> +        }
> +
>          return true;
> +    } else {
> +        return false;
>      }
> -    else
> -    {
> +}
> +
> +bool SkyQPainter::drawPointSource( SkyPoint * loc, float mag, char sp ) {
> +    //Check if it's even visible before doing anything
> +    if ( !m_proj->checkVisibility( loc ) ) return false;
> +
> +    bool visible = false;
> +    QPointF pos = m_proj->toScreen( loc, true, &visible );
> +    if ( visible && m_proj->onScreen( pos ) ) { // FIXME: onScreen here
> should use canvas size rather than SkyMap size, especially while
> printing in portrait mode!
> +        drawPointSource( pos, starWidth( mag ), sp );
> +        return true;
> +    } else {
>          return false;
>      }
>  }
>  
> -void SkyQPainter::drawPointSource(const QPointF &pos, float size, char sp)
> -{
> -    int isize = qMin(static_cast<int>(size), 14);
> -    if( !m_vectorStars || starColorMode == 0  )
> -    {
> +void SkyQPainter::drawPointSource( const QPointF &pos, float size, char
> sp ) {
> +    int isize = qMin( static_cast<int>( size ), 14 );
> +    if ( !m_vectorStars || starColorMode == 0  ) {
>          // Draw stars as bitmaps, either because we were asked to, or
> because we're painting real colors
> -        QPixmap * im = imageCache[ harvardToIndex(sp) ][isize];
> +        QPixmap * im = imageCache[ harvardToIndex( sp ) ][isize];
>          float offset = 0.5 * im->width();
> -        drawPixmap( QPointF(pos.x()-offset, pos.y()-offset), *im );
> -    }
> -    else
> -    {
> +        drawPixmap( QPointF( pos.x() - offset, pos.y() - offset ), *im );
> +    } else {
>          // Draw stars as vectors, for better printing / SVG export etc.
> -        if ( starColorMode != 4 )
> -        {
> +        if ( starColorMode != 4 ) {
>              setPen( m_starColor );
>              setBrush( m_starColor );
> -        }
> -        else
> -        {
> +        } else {
>              // Note: This is not efficient, but we use vector stars
> only when plotting SVG, not when drawing the skymap, so speed is not
> very important.
>              QColor c = ColorMap.value( sp, Qt::white );
>              setPen( c );
> @@ -506,62 +497,59 @@ void SkyQPainter::drawPointSource(const QPointF
> &pos, float size, char sp)
>          }
>  
>          // Be consistent with old raster representation
> -        if( size > 14 )
> +        if ( size > 14 )
>              size = 14;
> -        if( size >= 2 )
> -            drawEllipse( pos.x() - 0.5 * size, pos.y() - 0.5 * size,
> int(size), int(size) );
> -        else if( size >= 1 )
> +        if ( size >= 2 )
> +            drawEllipse( pos.x() - 0.5 * size, pos.y() - 0.5 * size,
> int( size ), int( size ) );
> +        else if ( size >= 1 )
>              drawPoint( pos.x(), pos.y() );
>      }
>  }
>  
> -bool SkyQPainter::drawConstellationArtImage(ConstellationsArt * obj)
> -{
> +bool SkyQPainter::drawConstellationArtImage( ConstellationsArt * obj ) {
>      double zoom = Options::zoomFactor();
>  
>      bool visible = false;
> -    obj->EquatorialToHorizontal(KStarsData::Instance()->lst(),
> KStarsData::Instance()->geo()->lat());
> -    QPointF constellationmidpoint = m_proj->toScreen(obj, true, &visible);
> +    obj->EquatorialToHorizontal( KStarsData::Instance()->lst(),
> KStarsData::Instance()->geo()->lat() );
> +    QPointF constellationmidpoint = m_proj->toScreen( obj, true,
> &visible );
>  
> -    if ( !visible || !m_proj->onScreen(constellationmidpoint))
> +    if ( !visible || !m_proj->onScreen( constellationmidpoint ) )
>          return false;
>  
>      //qDebug() << "o->pa() " << obj->pa();
> -    float positionangle = m_proj->findPA(obj,
> constellationmidpoint.x(), constellationmidpoint.y());
> +    float positionangle = m_proj->findPA( obj,
> constellationmidpoint.x(), constellationmidpoint.y() );
>      //qDebug() << " final PA " << positionangle;
>  
>  
> -    float w = obj->getWidth()*60*dms::PI*zoom/10800;
> -    float h = obj->getHeight()*60*dms::PI*zoom/10800;
> +    float w = obj->getWidth() * 60 * dms::PI * zoom / 10800;
> +    float h = obj->getHeight() * 60 * dms::PI * zoom / 10800;
>  
>      save();
>  
> -    setRenderHint(QPainter::SmoothPixmapTransform);
> +    setRenderHint( QPainter::SmoothPixmapTransform );
>  
> -    translate(constellationmidpoint);
> -    rotate(positionangle);
> -    setOpacity(0.7);
> -    drawImage( QRect(-0.5*w, -0.5*h, w, h), obj->image() );
> -    setOpacity(1);
> +    translate( constellationmidpoint );
> +    rotate( positionangle );
> +    setOpacity( 0.7 );
> +    drawImage( QRect( -0.5 * w, -0.5 * h, w, h ), obj->image() );
> +    setOpacity( 1 );
>  
> -    setRenderHint(QPainter::SmoothPixmapTransform, false);
> +    setRenderHint( QPainter::SmoothPixmapTransform, false );
>      restore();
>      return true;
>  }
>  
> -bool SkyQPainter::drawDeepSkyObject(DeepSkyObject * obj, bool drawImage)
> -{
> -    if( !m_proj->checkVisibility(obj) ) return false;
> +bool SkyQPainter::drawDeepSkyObject( DeepSkyObject * obj, bool
> drawImage ) {
> +    if ( !m_proj->checkVisibility( obj ) ) return false;
>  
>      bool visible = false;
> -    QPointF pos = m_proj->toScreen(obj, true, &visible);
> -    if( !visible || !m_proj->onScreen(pos) ) return false;
> +    QPointF pos = m_proj->toScreen( obj, true, &visible );
> +    if ( !visible || !m_proj->onScreen( pos ) ) return false;
>  
>      // if size is 0.0 set it to 1.0, this are normally stars (type 0 and 1)
>      // if we use size 0.0 the star wouldn't be drawn
>      float majorAxis = obj->a();
> -    if ( majorAxis == 0.0 )
> -    {
> +    if ( majorAxis == 0.0 ) {
>          majorAxis = 1.0;
>      }
>  
> @@ -572,50 +560,48 @@ bool SkyQPainter::drawDeepSkyObject(DeepSkyObject
> * obj, bool drawImage)
>  
>      //Draw Image
>      if ( drawImage && Options::zoomFactor() > 5.*MINZOOM )
> -        drawDeepSkyImage(pos, obj, positionAngle);
> +        drawDeepSkyImage( pos, obj, positionAngle );
>  
>      //Draw Symbol
> -    drawDeepSkySymbol(pos, obj->type(), size, obj->e(), positionAngle);
> +    drawDeepSkySymbol( pos, obj->type(), size, obj->e(), positionAngle );
>  
>      return true;
>  }
>  
> -bool SkyQPainter::drawDeepSkyImage(const QPointF &pos, DeepSkyObject *
> obj, float positionAngle)
> -{
> +bool SkyQPainter::drawDeepSkyImage( const QPointF &pos, DeepSkyObject *
> obj, float positionAngle ) {
>      double zoom = Options::zoomFactor();
> -    double w = obj->a() * dms::PI * zoom/10800.0;
> +    double w = obj->a() * dms::PI * zoom / 10800.0;
>      double h = obj->e() * w;
>  
>      save();
> -    translate(pos);
> +    translate( pos );
>      rotate( positionAngle );
> -    drawImage( QRect(-0.5*w, -0.5*h, w, h), obj->image() );
> +    drawImage( QRect( -0.5 * w, -0.5 * h, w, h ), obj->image() );
>      restore();
>  
>      return true;
>  }
>  
> -void SkyQPainter::drawDeepSkySymbol(const QPointF &pos, int type, float
> size, float e, float positionAngle)
> -{
> +void SkyQPainter::drawDeepSkySymbol( const QPointF &pos, int type,
> float size, float e, float positionAngle ) {
>      float x = pos.x();
>      float y = pos.y();
>      float zoom = Options::zoomFactor();
>  
> -    int isize = int(size);
> +    int isize = int( size );
>  
> -    float dx1 = -0.5*size;
> -    float dx2 =  0.5*size;
> -    float dy1 = -1.0*e*size/2.;
> -    float dy2 = e*size/2.;
> +    float dx1 = -0.5 * size;
> +    float dx2 =  0.5 * size;
> +    float dy1 = -1.0 * e * size / 2.;
> +    float dy2 = e * size / 2.;
>      float x1 = x + dx1;
>      float x2 = x + dx2;
>      float y1 = y + dy1;
>      float y2 = y + dy2;
>  
> -    float dxa = -size/4.;
> -    float dxb =  size/4.;
> -    float dya = -1.0*e*size/4.;
> -    float dyb = e*size/4.;
> +    float dxa = -size / 4.;
> +    float dxb =  size / 4.;
> +    float dya = -1.0 * e * size / 4.;
> +    float dyb = e * size / 4.;
>      float xa = x + dxa;
>      float xb = x + dxb;
>      float ya = y + dya;
> @@ -631,61 +617,49 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
> &pos, int type, float size, fl
>      std::function<void( float, float, float, float )> lambdaDrawLine;
>      std::function<void( float, float, float, float )> lambdaDrawCross;
>  
> -    if ( Options::useAntialias() )
> -    {
> -        lambdaDrawEllipse = [this]( float x, float y, float width,
> float height )
> -        {
> +    if ( Options::useAntialias() ) {
> +        lambdaDrawEllipse = [this]( float x, float y, float width,
> float height ) {
>              drawEllipse( QRectF( x, y, width, height ) );
>          };
> -        lambdaDrawLine = [this]( float x1, float y1, float x2, float y2 )
> -        {
> +        lambdaDrawLine = [this]( float x1, float y1, float x2, float y2 ) {
>              drawLine( QLineF( x1, y1, x2, y2 ) );
>          };
> -        lambdaDrawCross = [this]( float centerX, float centerY, float
> sizeX, float sizeY )
> -        {
> -            drawLine( QLineF( centerX - sizeX/2., centerY, centerX +
> sizeX/2., centerY ) );
> -            drawLine( QLineF( centerX, centerY - sizeY/2., centerX,
> centerY + sizeY/2. ) );
> +        lambdaDrawCross = [this]( float centerX, float centerY, float
> sizeX, float sizeY ) {
> +            drawLine( QLineF( centerX - sizeX / 2., centerY, centerX +
> sizeX / 2., centerY ) );
> +            drawLine( QLineF( centerX, centerY - sizeY / 2., centerX,
> centerY + sizeY / 2. ) );
>          };
> -    }
> -    else
> -    {
> -        lambdaDrawEllipse = [this]( float x, float y, float width,
> float height )
> -        {
> +    } else {
> +        lambdaDrawEllipse = [this]( float x, float y, float width,
> float height ) {
>              drawEllipse( QRect( x, y, width, height ) );
>          };
> -        lambdaDrawLine = [this]( float x1, float y1, float x2, float y2 )
> -        {
> +        lambdaDrawLine = [this]( float x1, float y1, float x2, float y2 ) {
>              drawLine( QLine( x1, y1, x2, y2 ) );
>          };
> -        lambdaDrawCross = [this]( float centerX, float centerY, float
> sizeX, float sizeY )
> -        {
> -            drawLine( QLine( centerX - sizeX/2., centerY, centerX +
> sizeX/2., centerY ) );
> -            drawLine( QLine( centerX, centerY - sizeY/2., centerX,
> centerY + sizeY/2. ) );
> +        lambdaDrawCross = [this]( float centerX, float centerY, float
> sizeX, float sizeY ) {
> +            drawLine( QLine( centerX - sizeX / 2., centerY, centerX +
> sizeX / 2., centerY ) );
> +            drawLine( QLine( centerX, centerY - sizeY / 2., centerX,
> centerY + sizeY / 2. ) );
>          };
>      }
>  
> -    switch ( type )
> -    {
> +    switch ( type ) {
>          case 0:
>          case 1: //catalog star
>              //Some NGC/IC objects are stars...changed their type to 1
> (was double star)
> -            if (size<2.) size = 2.;
> -            lambdaDrawEllipse( x - size/2., y - size/2., size, size );
> +            if ( size < 2. ) size = 2.;
> +            lambdaDrawEllipse( x - size / 2., y - size / 2., size, size );
>              break;
>          case 2: //Planet
>              break;
>          case 3: //Open cluster; draw circle of points
> -        case 13:   // Asterism
> -        {
> +        case 13: { // Asterism
>              tempBrush = brush();
>              color = pen().color().name();
>              setBrush( pen().color() );
>              psize = 2.;
>              if ( size > 50. )  psize *= 2.;
>              if ( size > 100. ) psize *= 2.;
> -            auto putDot = [this, psize, &lambdaDrawEllipse]( float x,
> float y )
> -            {
> -                lambdaDrawEllipse( x - psize/2., y - psize/2., psize,
> psize );
> +            auto putDot = [this, psize, &lambdaDrawEllipse]( float x,
> float y ) {
> +                lambdaDrawEllipse( x - psize / 2., y - psize / 2.,
> psize, psize );
>              };
>              putDot( xa, y1 );
>              putDot( xb, y1 );
> @@ -699,19 +673,19 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
> &pos, int type, float size, fl
>              break;
>          }
>          case 4: //Globular Cluster
> -            if (size<2.) size = 2.;
> +            if ( size < 2. ) size = 2.;
>              save();
>              translate( x, y );
>              color = pen().color().name();
>              rotate( positionAngle );  //rotate the coordinate system
> -            lambdaDrawEllipse( dx1, dy1, size, e*size );
> -            lambdaDrawCross( 0, 0, size, e*size );
> +            lambdaDrawEllipse( dx1, dy1, size, e * size );
> +            lambdaDrawCross( 0, 0, size, e * size );
>              restore(); //reset coordinate system
>              break;
>  
>          case 5: //Gaseous Nebula
>          case 15: // Dark Nebula
> -            if (size <2.) size = 2.;
> +            if ( size < 2. ) size = 2.;
>              save();
>              translate( x, y );
>              rotate( positionAngle );  //rotate the coordinate system
> @@ -723,20 +697,20 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
> &pos, int type, float size, fl
>              restore(); //reset coordinate system
>              break;
>          case 6: //Planetary Nebula
> -            if (size<2.) size = 2.;
> +            if ( size < 2. ) size = 2.;
>              save();
>              translate( x, y );
>              rotate( positionAngle );  //rotate the coordinate system
>              color = pen().color().name();
> -            lambdaDrawEllipse( dx1, dy1, size, e*size );
> -            lambdaDrawLine( 0., dy1, 0., dy1 - e*size/2. );
> -            lambdaDrawLine( 0., dy2, 0., dy2 + e*size/2. );
> -            lambdaDrawLine( dx1, 0., dx1 - size/2., 0. );
> -            lambdaDrawLine( dx2, 0., dx2 + size/2., 0. );
> +            lambdaDrawEllipse( dx1, dy1, size, e * size );
> +            lambdaDrawLine( 0., dy1, 0., dy1 - e * size / 2. );
> +            lambdaDrawLine( 0., dy2, 0., dy2 + e * size / 2. );
> +            lambdaDrawLine( dx1, 0., dx1 - size / 2., 0. );
> +            lambdaDrawLine( dx2, 0., dx2 + size / 2., 0. );
>              restore(); //reset coordinate system
>              break;
>          case 7: //Supernova remnant // FIXME: Why is SNR drawn
> different from a gaseous nebula?
> -            if (size<2) size = 2;
> +            if ( size < 2 ) size = 2;
>              save();
>              translate( x, y );
>              rotate( positionAngle );  //rotate the coordinate system
> @@ -750,24 +724,20 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
> &pos, int type, float size, fl
>          case 8: //Galaxy
>          case 16: // Quasar
>              color = pen().color().name();
> -            if ( size <1. && zoom > 20*MINZOOM ) size = 3.; //force
> ellipse above zoomFactor 20
> -            if ( size <1. && zoom > 5*MINZOOM ) size = 1.; //force
> points above zoomFactor 5
> -            if ( size>2. )
> -            {
> +            if ( size < 1. && zoom > 20 * MINZOOM ) size = 3.; //force
> ellipse above zoomFactor 20
> +            if ( size < 1. && zoom > 5 * MINZOOM ) size = 1.; //force
> points above zoomFactor 5
> +            if ( size > 2. ) {
>                  save();
>                  translate( x, y );
>                  rotate( positionAngle );  //rotate the coordinate system
> -                lambdaDrawEllipse( dx1, dy1, size, e*size );
> +                lambdaDrawEllipse( dx1, dy1, size, e * size );
>                  restore(); //reset coordinate system
>  
> -            }
> -            else if ( size>0. )
> -            {
> -                drawPoint( QPointF(x, y) );
> +            } else if ( size > 0. ) {
> +                drawPoint( QPointF( x, y ) );
>              }
>              break;
> -        case 14:   // Galaxy cluster - draw a dashed circle
> -        {
> +        case 14: { // Galaxy cluster - draw a dashed circle
>              tempBrush = brush();
>              setBrush( QBrush() );
>              psize = 1.;
> @@ -779,17 +749,16 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
> &pos, int type, float size, fl
>              QPen newPen = pen();
>              newPen.setStyle( Qt::DashLine );
>              setPen( newPen );
> -            lambdaDrawEllipse( dx1, dy1, size, e*size );
> +            lambdaDrawEllipse( dx1, dy1, size, e * size );
>              restore();
>              setBrush( tempBrush );
>              break;
>          }
>          default: // Unknown object or something we don't know how to
> draw. Just draw an ellipse with a ?-mark
>              color = pen().color().name();
> -            if ( size <1. && zoom > 20*MINZOOM ) size = 3.; //force
> ellipse above zoomFactor 20
> -            if ( size <1. && zoom > 5*MINZOOM ) size = 1.; //force
> points above zoomFactor 5
> -            if ( size>2. )
> -            {
> +            if ( size < 1. && zoom > 20 * MINZOOM ) size = 3.; //force
> ellipse above zoomFactor 20
> +            if ( size < 1. && zoom > 5 * MINZOOM ) size = 1.; //force
> points above zoomFactor 5
> +            if ( size > 2. ) {
>                  save();
>                  QFont f = font();
>                  const QString qMark = " ? ";
> @@ -798,21 +767,18 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
> &pos, int type, float size, fl
>                  setFont( f );
>                  translate( x, y );
>                  rotate( positionAngle );  //rotate the coordinate system
> -                lambdaDrawEllipse( dx1, dy1, size, e*size );
> +                lambdaDrawEllipse( dx1, dy1, size, e * size );
>                  if ( Options::useAntialias() )
> -                    drawText( QRectF(dx1, dy1, size, e*size),
> Qt::AlignCenter, qMark );
> -                else
> -                {
> -                    int idx1 = int(dx1);
> -                    int idy1 = int(dy1);
> -                    drawText( QRect(idx1, idy1, isize, int(e*size)),
> Qt::AlignCenter, qMark );
> +                    drawText( QRectF( dx1, dy1, size, e * size ),
> Qt::AlignCenter, qMark );
> +                else {
> +                    int idx1 = int( dx1 );
> +                    int idy1 = int( dy1 );
> +                    drawText( QRect( idx1, idy1, isize, int( e * size )
> ), Qt::AlignCenter, qMark );
>                  }
>                  restore(); //reset coordinate system (and font?)
> -            }
> -            else if ( size>0. )
> -            {
> +            } else if ( size > 0. ) {
>                  if ( Options::useAntialias() )
> -                    drawPoint( QPointF(x, y) );
> +                    drawPoint( QPointF( x, y ) );
>                  else
>                      drawPoint( QPoint( x, y ) );
>              }
> @@ -820,24 +786,21 @@ void SkyQPainter::drawDeepSkySymbol(const QPointF
> &pos, int type, float size, fl
>  
>  }
>  
> -void SkyQPainter::drawObservingList(const QList< SkyObject * > &obs)
> -{
> -    foreach ( SkyObject * obj, obs )
> -    {
> +void SkyQPainter::drawObservingList( const QList< SkyObject * > &obs ) {
> +    foreach ( SkyObject * obj, obs ) {
>          bool visible = false;
>          QPointF o = m_proj->toScreen( obj, true, &visible );
> -        if( !visible || !m_proj->onScreen(o) ) continue;
> +        if ( !visible || !m_proj->onScreen( o ) ) continue;
>  
>          float size = 20.;
> -        float x1 = o.x() - 0.5*size;
> -        float y1 = o.y() - 0.5*size;
> -        drawArc( QRectF(x1, y1, size, size), -60*16, 120*16 );
> -        drawArc( QRectF(x1, y1, size, size), 120*16, 120*16 );
> +        float x1 = o.x() - 0.5 * size;
> +        float y1 = o.y() - 0.5 * size;
> +        drawArc( QRectF( x1, y1, size, size ), -60 * 16, 120 * 16 );
> +        drawArc( QRectF( x1, y1, size, size ), 120 * 16, 120 * 16 );
>      }
>  }
>  
> -void SkyQPainter::drawFlags()
> -{
> +void SkyQPainter::drawFlags() {
>      KStarsData * data = KStarsData::Instance();
>      SkyPoint * point;
>      QImage image;
> @@ -845,8 +808,7 @@ void SkyQPainter::drawFlags()
>      QPointF pos;
>      int i;
>  
> -    for ( i=0; i<data->skyComposite()->flags()->size(); i++ )
> -    {
> +    for ( i = 0; i < data->skyComposite()->flags()->size(); i++ ) {
>          point = data->skyComposite()->flags()->pointList().at( i );
>          image = data->skyComposite()->flags()->image( i );
>  
> @@ -857,39 +819,35 @@ void SkyQPainter::drawFlags()
>          pos = m_proj->toScreen( point, true, &visible );
>  
>          // Return if flag is not visible
> -        if( !visible || !m_proj->onScreen( pos ) ) continue;
> +        if ( !visible || !m_proj->onScreen( pos ) ) continue;
>  
>          // Draw flag image
> -        drawImage( pos.x()-0.5*image.width(),
> pos.y()-0.5*image.height(), image );
> +        drawImage( pos.x() - 0.5 * image.width(), pos.y() - 0.5 *
> image.height(), image );
>  
>          // Draw flag label
>          setPen( data->skyComposite()->flags()->labelColor( i ) );
>          setFont( QFont( "Helvetica", 10, QFont::Bold ) );
> -        drawText( pos.x()+10, pos.y()-10,
> data->skyComposite()->flags()->label( i ) );
> +        drawText( pos.x() + 10, pos.y() - 10,
> data->skyComposite()->flags()->label( i ) );
>      }
>  }
>  
> -void SkyQPainter::drawHorizon(bool filled, SkyPoint * labelPoint, bool
> * drawLabel)
> -{
> -    QVector<Vector2f> ground = m_proj->groundPoly(labelPoint, drawLabel);
> -    if( ground.size() )
> -    {
> -        QPolygonF groundPoly(ground.size());
> -        for(int i = 0; i < ground.size(); ++i)
> -            groundPoly[i] = KSUtils::vecToPoint(ground[i]);
> -        if( filled )
> -            drawPolygon(groundPoly);
> -        else
> -        {
> +void SkyQPainter::drawHorizon( bool filled, SkyPoint * labelPoint, bool
> * drawLabel ) {
> +    QVector<Vector2f> ground = m_proj->groundPoly( labelPoint, drawLabel );
> +    if ( ground.size() ) {
> +        QPolygonF groundPoly( ground.size() );
> +        for ( int i = 0; i < ground.size(); ++i )
> +            groundPoly[i] = KSUtils::vecToPoint( ground[i] );
> +        if ( filled )
> +            drawPolygon( groundPoly );
> +        else {
>              groundPoly.append( groundPoly.first() );
> -            drawPolyline(groundPoly);
> +            drawPolyline( groundPoly );
>          }
>      }
>  }
>  
> -bool SkyQPainter::drawSatellite( Satellite * sat )
> -{
> -    if( !m_proj->checkVisibility(sat) )
> +bool SkyQPainter::drawSatellite( Satellite * sat ) {
> +    if ( !m_proj->checkVisibility( sat ) )
>          return false;
>  
>      QPointF pos;
> @@ -899,19 +857,16 @@ bool SkyQPainter::drawSatellite( Satellite * sat )
>  
>      pos = m_proj->toScreen( sat, true, &visible );
>  
> -    if( !visible || !m_proj->onScreen( pos ) )
> +    if ( !visible || !m_proj->onScreen( pos ) )
>          return false;
>  
> -    if ( Options::drawSatellitesLikeStars() )
> -    {
> -        drawPointSource(pos, 3.5, 'B');
> -    }
> -    else
> -    {
> +    if ( Options::drawSatellitesLikeStars() ) {
> +        drawPointSource( pos, 3.5, 'B' );
> +    } else {
>          if ( sat->isVisible() )
> -            drawPixmap(QPoint( pos.x() - 15, pos.y() - 11 ),
> *visibleSatPixmap);
> +            drawPixmap( QPoint( pos.x() - 15, pos.y() - 11 ),
> *visibleSatPixmap );
>          else
> -            drawPixmap(QPoint( pos.x() - 15, pos.y() - 11 ),
> *invisibleSatPixmap);
> +            drawPixmap( QPoint( pos.x() - 15, pos.y() - 11 ),
> *invisibleSatPixmap );
>  
>          //drawPixmap(pos, *genericSatPixmap);
>          /*drawLine( QPoint( pos.x() - 0.5, pos.y() - 0.5 ), QPoint(
> pos.x() + 0.5, pos.y() - 0.5 ) );
> @@ -926,21 +881,19 @@ bool SkyQPainter::drawSatellite( Satellite * sat )
>      //data->skyComposite()->satellites()->drawLabel( sat, pos );
>  }
>  
> -bool SkyQPainter::drawSupernova(Supernova * sup)
> -{
> +bool SkyQPainter::drawSupernova( Supernova * sup ) {
>      KStarsData * data = KStarsData::Instance();
> -    if( !m_proj->checkVisibility(sup) )
> -    {
> +    if ( !m_proj->checkVisibility( sup ) ) {
>          return false;
>      }
>  
>      bool visible = false;
> -    QPointF pos = m_proj->toScreen(sup,true,&visible);
> +    QPointF pos = m_proj->toScreen( sup, true, &visible );
>      //qDebug()<<"sup->ra() = "<<(sup->ra()).toHMSString()<<"sup->dec()
> = "<<sup->dec().toDMSString();
>      //qDebug()<<"pos = "<<pos<<"m_proj->onScreen(pos) =
> "<<m_proj->onScreen(pos);
> -    if( !visible || !m_proj->onScreen(pos) ) return false;
> +    if ( !visible || !m_proj->onScreen( pos ) ) return false;
>  
> -    setPen( data->colorScheme()->colorNamed("SupernovaColor") );
> +    setPen( data->colorScheme()->colorNamed( "SupernovaColor" ) );
>      //qDebug()<<"Here"<<endl;
>      drawLine ( QPoint( pos.x () - 2.0, pos.y() ), QPoint( pos.x() +
> 2.0, pos.y() ) );
>      drawLine ( QPoint( pos.x (), pos.y() - 2.0 ), QPoint( pos.x(),
> pos.y() + 2.0 ) );
> diff --git a/kstars/skyqpainter.h b/kstars/skyqpainter.h
> index 0407a04bc..a9ee35024 100644
> --- a/kstars/skyqpainter.h
> +++ b/kstars/skyqpainter.h
> @@ -26,6 +26,7 @@ class Projector;
>  class QWidget;
>  class QSize;
>  class QMessageBox;
> +
>  /** @short The QPainter-based painting backend.
>      This class implements the SkyPainter interface using a QPainter.
>      For documentation, @see SkyPainter. */
> @@ -92,6 +93,7 @@ class SkyQPainter : public SkyPainter, public QPainter
>          virtual void drawDeepSkySymbol(const QPointF &pos, int type,
> float size, float e,
>                                         float positionAngle);
>          virtual bool drawSupernova(Supernova * sup);
> +        virtual bool drawComet(KSComet * com);
>          ///This function exists so that we can draw other objects
> (e.g., planets) as point sources.
>          virtual void drawPointSource(const QPointF &pos, float size,
> char sp = 'A');
>          virtual bool drawConstellationArtImage(ConstellationsArt * obj);
>
>


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 866 bytes
Desc: OpenPGP digital signature
URL: <http://mail.kde.org/pipermail/kstars-devel/attachments/20170406/2524b96d/attachment-0001.sig>


More information about the Kstars-devel mailing list