summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtem Fedoskin <afedoskin3@gmail.com>2016-09-01 07:03:18 (GMT)
committerArtem Fedoskin <afedoskin3@gmail.com>2016-09-01 07:03:18 (GMT)
commit66106b0027b59dcfae90a0e4111a539f41166639 (patch)
tree47e5f000396082661a13dbb879dd18f2b0e949ff
parentba79cf5c998341b2743c037ece64ead06594eb48 (diff)
Added tutorial mode. Fixed bug when context window for object was appearing while zooming.
-rw-r--r--kstars/CMakeLists.txt9
-rw-r--r--kstars/indi/clientmanagerlite.cpp42
-rw-r--r--kstars/indi/clientmanagerlite.h19
-rw-r--r--kstars/kstarslite.cpp191
-rw-r--r--kstars/kstarslite.h28
-rw-r--r--kstars/kstarslite/dialogs/finddialoglite.cpp3
-rw-r--r--kstars/kstarslite/dialogs/finddialoglite.h8
-rw-r--r--kstars/kstarslite/dialogs/locationdialoglite.cpp35
-rw-r--r--kstars/kstarslite/dialogs/locationdialoglite.h2
-rw-r--r--kstars/kstarslite/qml/CMakeLists.txt10
-rw-r--r--kstars/kstarslite/qml/dialogs/FindDialog.qml1
-rw-r--r--kstars/kstarslite/qml/dialogs/helpers/LocationLoading.qml2
-rw-r--r--kstars/kstarslite/qml/images/CMakeLists.txt10
-rwxr-xr-xkstars/kstarslite/qml/images/svg/114x80/gen2x.sh13
-rw-r--r--kstars/kstarslite/qml/images/svg/114x80/tutorial-arrow-horizontal.svg236
-rwxr-xr-xkstars/kstarslite/qml/images/svg/250x40/gen2x.sh7
-rwxr-xr-xkstars/kstarslite/qml/images/svg/80x114/gen2x.sh13
-rw-r--r--kstars/kstarslite/qml/images/svg/80x114/tutorial-arrow-vertical.svg228
-rwxr-xr-xkstars/kstarslite/qml/images/svg/gen2x.sh9
-rw-r--r--kstars/kstarslite/qml/images/tutorial-arrow-horizontal.pngbin0 -> 4210 bytes
-rw-r--r--kstars/kstarslite/qml/images/tutorial-arrow-horizontal@2x.pngbin0 -> 8912 bytes
-rw-r--r--kstars/kstarslite/qml/images/tutorial-arrow-horizontal@3x.pngbin0 -> 14237 bytes
-rw-r--r--kstars/kstarslite/qml/images/tutorial-arrow-horizontal@4x.pngbin0 -> 18857 bytes
-rw-r--r--kstars/kstarslite/qml/images/tutorial-arrow-vertical.pngbin0 -> 4529 bytes
-rw-r--r--kstars/kstarslite/qml/images/tutorial-arrow-vertical@2x.pngbin0 -> 9884 bytes
-rw-r--r--kstars/kstarslite/qml/images/tutorial-arrow-vertical@3x.pngbin0 -> 16171 bytes
-rw-r--r--kstars/kstarslite/qml/images/tutorial-arrow-vertical@4x.pngbin0 -> 21686 bytes
-rw-r--r--kstars/kstarslite/qml/indi/INDIControlPanel.qml8
-rw-r--r--kstars/kstarslite/qml/main.qml60
-rw-r--r--kstars/kstarslite/qml/modules/BottomMenu.qml81
-rw-r--r--kstars/kstarslite/qml/modules/SkyMapLiteWrapper.qml22
-rw-r--r--kstars/kstarslite/qml/modules/TimePage.qml4
-rw-r--r--kstars/kstarslite/qml/modules/TopMenu.qml78
-rw-r--r--kstars/kstarslite/qml/modules/tutorial/TutorialExitPopup.qml44
-rw-r--r--kstars/kstarslite/qml/modules/tutorial/TutorialPane.qml54
-rw-r--r--kstars/kstarslite/qml/modules/tutorial/TutorialPopup.qml64
-rw-r--r--kstars/kstarslite/qml/modules/tutorial/TutorialStep1.qml39
-rw-r--r--kstars/kstarslite/qml/modules/tutorial/TutorialStep2.qml39
-rw-r--r--kstars/kstarslite/qml/modules/tutorial/TutorialStep3.qml35
-rw-r--r--kstars/kstarslite/qml/modules/tutorial/TutorialStep4.qml36
-rw-r--r--kstars/kstarslite/qml/modules/tutorial/TutorialStep5.qml26
-rw-r--r--kstars/kstarslite/skyitems/deepskyitem.cpp3
-rw-r--r--kstars/kstarslite/skyitems/deepskyitem.h2
-rw-r--r--kstars/kstarslite/skyitems/rootnode.cpp11
-rw-r--r--kstars/kstarslite/skyitems/skynodes/horizonnode.h2
-rw-r--r--kstars/kstarslite/skyitems/skynodes/nodes/polynode.cpp4
-rw-r--r--kstars/kstarslite/skyitems/skynodes/satellitenode.h4
-rw-r--r--kstars/kstarslite/skyitems/skynodes/skypolygonnode.cpp2
-rw-r--r--kstars/skycomponents/deepskycomponent.cpp4
-rw-r--r--kstars/skycomponents/skymapcomposite.cpp1
-rw-r--r--kstars/skycomponents/syncedcatalogcomponent.cpp2
-rw-r--r--kstars/skymaplite.cpp27
-rw-r--r--kstars/skymaplite.h27
-rw-r--r--kstars/skymapliteevents.cpp78
-rw-r--r--kstars/time/simclock.cpp9
-rw-r--r--kstars/time/simclock.h3
56 files changed, 1341 insertions, 294 deletions
diff --git a/kstars/CMakeLists.txt b/kstars/CMakeLists.txt
index 21deda0..827f4bf 100644
--- a/kstars/CMakeLists.txt
+++ b/kstars/CMakeLists.txt
@@ -765,6 +765,15 @@ if(BUILD_KSTARS_LITE)
kstarslite/qml/indi/modules/KSINDIText.qml
kstarslite/qml/indi/modules/KSINDITextField.qml
kstarslite/qml/indi/modules/KSButtonsSwitchRow.qml
+ #Tutorial
+ kstarslite/qml/modules/tutorial/TutorialPopup.qml
+ kstarslite/qml/modules/tutorial/TutorialExitPopup.qml
+ kstarslite/qml/modules/tutorial/TutorialStep1.qml
+ kstarslite/qml/modules/tutorial/TutorialStep2.qml
+ kstarslite/qml/modules/tutorial/TutorialStep3.qml
+ kstarslite/qml/modules/tutorial/TutorialStep4.qml
+ kstarslite/qml/modules/tutorial/TutorialStep5.qml
+ kstarslite/qml/modules/tutorial/TutorialPane.qml
)
add_subdirectory(kstarslite/qml)
ADD_CUSTOM_TARGET(kstarsliteqml SOURCES ${kstarsliteqml_SRCS})
diff --git a/kstars/indi/clientmanagerlite.cpp b/kstars/indi/clientmanagerlite.cpp
index 49e1c81..09aeb6b 100644
--- a/kstars/indi/clientmanagerlite.cpp
+++ b/kstars/indi/clientmanagerlite.cpp
@@ -76,6 +76,10 @@ bool ClientManagerLite::setHost(QString ip, unsigned int port) {
qDebug() << ip << port;
if(connectServer()) {
setConnectedHost(ip + ":" + QString::number(port));
+ //Update last used server and port
+ setLastUsedServer(ip);
+ setLastUsedPort(port);
+
return true;
}
}
@@ -273,9 +277,9 @@ void ClientManagerLite::buildNumberGUI(Property * property) {
}
void ClientManagerLite::buildMenuGUI(INDI::Property * property) {
- QStringList menuOptions;
+ /*QStringList menuOptions;
QString oneOption;
- int onItem=-1;
+ int onItem=-1;*/
ISwitchVectorProperty *svp = property->getSwitch();
if (svp == NULL)
@@ -570,21 +574,20 @@ bool ClientManagerLite::saveDisplayImage() {
QString dateTime = QDateTime::currentDateTime().toString("dd-MM-yyyy-hh-mm-ss");
QString fileEnding = "kstars-lite-" + dateTime;
//QString filename = KSPaths::writableLocation(QStandardPaths::PicturesLocation);
-//#ifndef ANDROID
+ //#ifndef ANDROID
QString filename = QFileDialog::getSaveFileName(QApplication::activeWindow(), i18n("Save Image"),
KSPaths::writableLocation(QStandardPaths::PicturesLocation) + "/" + fileEnding + ".jpeg",
i18n("JPEG (*.jpeg);;JPG (*.jpg);;PNG (*.png);;BMP (*.bmp)" ));
-//#else
+ //#else
/*if(imageType.isEmpty() || !(imageType != ".jpeg" || imageType != ".jpg" || imageType != ".png" || imageType != ".bmp")) {
QString warning = imageType + " is a wrong image type. Switching to \"" + defaultImageType + "\"";
qDebug() << warning;
emit newINDIMessage(warning);
imageType = defaultImageType;
}*/
- // QString filename(defaultImagesLocation + "/" + fileEnding + defaultImageType);
-//#endif
+ // QString filename(defaultImagesLocation + "/" + fileEnding + defaultImageType);
+ //#endif
if(!filename.isEmpty()) {
- int i = 100;
if(displayImage.save(filename)) {
emit newINDIMessage("File " + filename + " was successfully saved");
return true;
@@ -794,7 +797,7 @@ bool ClientManagerLite::processBLOBasCCD(IBLOB *bp) {
{
#ifdef Q_OS_ANDROID
LibRaw RawProcessor;
- #define OUT RawProcessor.imgdata.params
+#define OUT RawProcessor.imgdata.params
OUT.user_qual = 0; // -q
OUT.use_camera_wb = 1; // -w
OUT.highlight = 5; // -H
@@ -915,6 +918,7 @@ void ClientManagerLite::newMessage(INDI::BaseDevice *dp, int messageID) {
}
void ClientManagerLite::serverDisconnected(int exit_code) {
+ Q_UNUSED(exit_code)
clearDevices();
setConnected(false);
}
@@ -929,3 +933,25 @@ void ClientManagerLite::clearDevices() {
}
m_devices.clear();
}
+
+QString ClientManagerLite::getLastUsedServer() {
+ return Options::lastServer();
+}
+
+void ClientManagerLite::setLastUsedServer(QString server) {
+ if(getLastUsedServer() != server) {
+ Options::setLastServer(server);
+ lastUsedServerChanged();
+ }
+}
+
+int ClientManagerLite::getLastUsedPort() {
+ return Options::lastServerPort();
+}
+
+void ClientManagerLite::setLastUsedPort(int port) {
+ if(getLastUsedPort() != port) {
+ Options::setLastServerPort(port);
+ lastUsedPortChanged();
+ }
+}
diff --git a/kstars/indi/clientmanagerlite.h b/kstars/indi/clientmanagerlite.h
index 82f6d25..0c2c22e 100644
--- a/kstars/indi/clientmanagerlite.h
+++ b/kstars/indi/clientmanagerlite.h
@@ -50,6 +50,14 @@ class ClientManagerLite : public INDI::BaseClientQt
Q_OBJECT
Q_PROPERTY(QString connectedHost READ connectedHost WRITE setConnectedHost NOTIFY connectedHostChanged)
Q_PROPERTY(bool connected READ isConnected WRITE setConnected NOTIFY connectedChanged)
+
+ /** A wrapper for Options::lastServer(). Used to store last used server if user successfully
+ * connected to some server at least once.**/
+ Q_PROPERTY(QString lastUsedServer READ getLastUsedServer WRITE setLastUsedServer NOTIFY lastUsedServerChanged)
+
+ /** A wrapper for Options::lastServer(). Used to store last used port if user successfully
+ * connected to some server at least once.**/
+ Q_PROPERTY(int lastUsedPort READ getLastUsedPort WRITE setLastUsedPort NOTIFY lastUsedPortChanged)
public:
typedef enum { UPLOAD_CLIENT, UPLOAD_LOCAL, UPLOAD_BOTH } UploadMode;
ClientManagerLite();
@@ -88,11 +96,11 @@ public:
QList<DeviceInfoLite *> getDevices() { return m_devices; }
- Q_INVOKABLE QString lastUsedServer() { return Options::lastServer(); }
- Q_INVOKABLE void setLastUsedServer(QString server) { Options::setLastServer(server); }
+ Q_INVOKABLE QString getLastUsedServer();
+ Q_INVOKABLE void setLastUsedServer(QString server);
- Q_INVOKABLE int lastUsedPort() { return Options::lastServerPort(); }
- Q_INVOKABLE void setLastUsedPort(int port) { Options::setLastServerPort(port); }
+ Q_INVOKABLE int getLastUsedPort();
+ Q_INVOKABLE void setLastUsedPort(int port);
/**
* @brief saveDisplayImage
* @return true if image was saved false otherwise
@@ -148,6 +156,9 @@ signals:
void connectedChanged(bool);
void telescopeAdded(TelescopeLite *newTelescope);
void telescopeRemoved(TelescopeLite *delTelescope);
+
+ void lastUsedServerChanged();
+ void lastUsedPortChanged();
private:
bool processBLOBasCCD(IBLOB *bp);
diff --git a/kstars/kstarslite.cpp b/kstars/kstarslite.cpp
index fae863a..cff418c 100644
--- a/kstars/kstarslite.cpp
+++ b/kstars/kstarslite.cpp
@@ -88,10 +88,6 @@ KStarsLite::KStarsLite( bool doSplash, bool startClock, const QString &startDate
//Set style - default is Material
QQuickStyle::setStyle("Material");
-
- //qmlRegisterType<SkyPoint>("skymaplite",1,0,"SkyMapLite");
- //qmlRegisterType<KStarsDateTime>("KStarsLite",1,0,"KStarsDateTime");
-
#ifdef Q_OS_ANDROID
QString main = KSPaths::locate(QStandardPaths::AppDataLocation, "kstarslite/qml/main.qml");
#else
@@ -294,30 +290,26 @@ void KStarsLite::loadColorScheme( const QString &name ) {
}
}
-void KStarsLite::slotSetTime() {
- //QPointer<TimeDialog> timedialog = new TimeDialog( data()->lt(), data()->geo(), this );
-
- /*if ( timedialog->exec() == QDialog::Accepted ) {
- data()->changeDateTime( data()->geo()->LTtoUT( timedialog->selectedDateTime() ) );
+void KStarsLite::slotSetTime(QDateTime time) {
+ KStarsDateTime selectedDateTime( time );
+ data()->changeDateTime( data()->geo()->LTtoUT( selectedDateTime ) );
- if ( Options::useAltAz() ) {
- if ( map()->focusObject() ) {
- map()->focusObject()->EquatorialToHorizontal( data()->lst(), data()->geo()->lat() );
- map()->setFocus( map()->focusObject() );
- } else
- map()->focus()->HorizontalToEquatorial( data()->lst(), data()->geo()->lat() );
- }
+ if ( Options::useAltAz() ) {
+ if ( map()->focusObject() ) {
+ map()->focusObject()->EquatorialToHorizontal( data()->lst(), data()->geo()->lat() );
+ map()->setFocus( map()->focusObject() );
+ } else
+ map()->focus()->HorizontalToEquatorial( data()->lst(), data()->geo()->lat() );
+ }
- map()->forceUpdateNow();
+ map()->forceUpdateNow();
- //If focusObject has a Planet Trail, clear it and start anew.
- KSPlanetBase* planet = dynamic_cast<KSPlanetBase*>( map()->focusObject() );
+ //If focusObject has a Planet Trail, clear it and start anew.
+ /*KSPlanetBase* planet = dynamic_cast<KSPlanetBase*>( map()->focusObject() );
if( planet && planet->hasTrail() ) {
planet->clearTrail();
planet->addToTrail();
- }
- }*/
- //delete timedialog;
+ }*/
}
void KStarsLite::slotToggleTimer() {
@@ -371,48 +363,48 @@ QColor KStarsLite::getColor(QString schemeColor) {
void KStarsLite::toggleObjects(ObjectsToToggle toToggle, bool toggle) {
switch(toToggle) {
- case ObjectsToToggle::Stars:
- Options::setShowStars(toggle);
- break;
- case ObjectsToToggle::DeepSky:
- Options::setShowDeepSky(toggle);
- break;
- case ObjectsToToggle::Planets:
- Options::setShowSolarSystem(toggle);
- break;
- case ObjectsToToggle::CLines:
- Options::setShowCLines(toggle);
- break;
- case ObjectsToToggle::CBounds:
- Options::setShowCBounds(toggle);
- break;
- case ObjectsToToggle::ConstellationArt:
- Options::setShowConstellationArt(toggle);
- break;
- case ObjectsToToggle::MilkyWay:
- Options::setShowMilkyWay(toggle);
- break;
- case ObjectsToToggle::CNames:
- Options::setShowCNames(toggle);
- break;
- case ObjectsToToggle::EquatorialGrid:
- Options::setShowEquatorialGrid(toggle);
- break;
- case ObjectsToToggle::HorizontalGrid:
- Options::setShowHorizontalGrid(toggle);
- break;
- case ObjectsToToggle::Ground:
- Options::setShowGround(toggle);
- break;
- case ObjectsToToggle::Flags:
- Options::setShowFlags(toggle);
- break;
- case ObjectsToToggle::Satellites:
- Options::setShowSatellites(toggle);
- break;
- case ObjectsToToggle::Supernovae:
- Options::setShowSupernovae(toggle);
- break;
+ case ObjectsToToggle::Stars:
+ Options::setShowStars(toggle);
+ break;
+ case ObjectsToToggle::DeepSky:
+ Options::setShowDeepSky(toggle);
+ break;
+ case ObjectsToToggle::Planets:
+ Options::setShowSolarSystem(toggle);
+ break;
+ case ObjectsToToggle::CLines:
+ Options::setShowCLines(toggle);
+ break;
+ case ObjectsToToggle::CBounds:
+ Options::setShowCBounds(toggle);
+ break;
+ case ObjectsToToggle::ConstellationArt:
+ Options::setShowConstellationArt(toggle);
+ break;
+ case ObjectsToToggle::MilkyWay:
+ Options::setShowMilkyWay(toggle);
+ break;
+ case ObjectsToToggle::CNames:
+ Options::setShowCNames(toggle);
+ break;
+ case ObjectsToToggle::EquatorialGrid:
+ Options::setShowEquatorialGrid(toggle);
+ break;
+ case ObjectsToToggle::HorizontalGrid:
+ Options::setShowHorizontalGrid(toggle);
+ break;
+ case ObjectsToToggle::Ground:
+ Options::setShowGround(toggle);
+ break;
+ case ObjectsToToggle::Flags:
+ Options::setShowFlags(toggle);
+ break;
+ case ObjectsToToggle::Satellites:
+ Options::setShowSatellites(toggle);
+ break;
+ case ObjectsToToggle::Supernovae:
+ Options::setShowSupernovae(toggle);
+ break;
};
// update time for all objects because they might be not initialized
@@ -425,35 +417,46 @@ void KStarsLite::toggleObjects(ObjectsToToggle toToggle, bool toggle) {
bool KStarsLite::isToggled(ObjectsToToggle toToggle) {
switch(toToggle) {
- case ObjectsToToggle::Stars:
- return Options::showStars();
- case ObjectsToToggle::DeepSky:
- return Options::showDeepSky();
- case ObjectsToToggle::Planets:
- return Options::showSolarSystem();
- case ObjectsToToggle::CLines:
- return Options::showCLines();
- case ObjectsToToggle::CBounds:
- return Options::showCBounds();
- case ObjectsToToggle::ConstellationArt:
- return Options::showConstellationArt();
- case ObjectsToToggle::MilkyWay:
- return Options::showMilkyWay();
- case ObjectsToToggle::CNames:
- return Options::showCNames();
- case ObjectsToToggle::EquatorialGrid:
- return Options::showEquatorialGrid();
- case ObjectsToToggle::HorizontalGrid:
- return Options::showHorizontalGrid();
- case ObjectsToToggle::Ground:
- return Options::showGround();
- case ObjectsToToggle::Flags:
- return Options::showFlags();
- case ObjectsToToggle::Satellites:
- return Options::showSatellites();
- case ObjectsToToggle::Supernovae:
- return Options::showSupernovae();
- default:
- return false;
+ case ObjectsToToggle::Stars:
+ return Options::showStars();
+ case ObjectsToToggle::DeepSky:
+ return Options::showDeepSky();
+ case ObjectsToToggle::Planets:
+ return Options::showSolarSystem();
+ case ObjectsToToggle::CLines:
+ return Options::showCLines();
+ case ObjectsToToggle::CBounds:
+ return Options::showCBounds();
+ case ObjectsToToggle::ConstellationArt:
+ return Options::showConstellationArt();
+ case ObjectsToToggle::MilkyWay:
+ return Options::showMilkyWay();
+ case ObjectsToToggle::CNames:
+ return Options::showCNames();
+ case ObjectsToToggle::EquatorialGrid:
+ return Options::showEquatorialGrid();
+ case ObjectsToToggle::HorizontalGrid:
+ return Options::showHorizontalGrid();
+ case ObjectsToToggle::Ground:
+ return Options::showGround();
+ case ObjectsToToggle::Flags:
+ return Options::showFlags();
+ case ObjectsToToggle::Satellites:
+ return Options::showSatellites();
+ case ObjectsToToggle::Supernovae:
+ return Options::showSupernovae();
+ default:
+ return false;
};
}
+
+void KStarsLite::setRunTutorial(bool runTutorial) {
+ if(Options::runStartupWizard() != runTutorial) {
+ Options::setRunStartupWizard(runTutorial);
+ emit runTutorialChanged();
+ }
+}
+
+bool KStarsLite::getRunTutorial() {
+ return Options::runStartupWizard();
+}
diff --git a/kstars/kstarslite.h b/kstars/kstarslite.h
index af2093c..4678da9 100644
--- a/kstars/kstarslite.h
+++ b/kstars/kstarslite.h
@@ -54,6 +54,8 @@ class QQuickItem;
class KStarsLite : public QObject
{
Q_OBJECT
+ //runTutorial is a wrapper for Options::RunStartupWizard()
+ Q_PROPERTY(bool runTutorial WRITE setRunTutorial READ getRunTutorial NOTIFY runTutorialChanged)
private:
/**
* @short Constructor.
@@ -97,6 +99,10 @@ public:
Q_INVOKABLE void fullUpdate();
void applyConfig( bool doApplyFocus = true );
+
+ void setRunTutorial(bool runTutorial);
+
+ bool getRunTutorial();
#ifdef HAVE_INDI
/** @return pointer to KStarsData object which handles connection to INDI server. */
@@ -131,10 +137,24 @@ public:
The reason for this is that you can't use Enums of another in class in Q_INVOKABLE function*/
Q_INVOKABLE void setProjection(uint proj);
- Q_INVOKABLE QColor getColor(QString schemeColor);
+ /** These functions are just convenient getters to access internals of KStars from QML **/
+
+ /**
+ * @short returns color with key name from current color scheme
+ * @param schemeColor name the key name of the color to be retrieved from current color scheme
+ * @return color from name
+ */
+ Q_INVOKABLE QColor getColor(QString name);
+ /**
+ * @short toggles on/off objects of group toToggle
+ * @see ObjectsToToggle
+ */
Q_INVOKABLE void toggleObjects(ObjectsToToggle toToggle, bool toggle);
+ /**
+ * @return true if objects from group toToggle are currently toggled on
+ **/
Q_INVOKABLE bool isToggled(ObjectsToToggle toToggle);
/** @} */ // end of kconfigwrappers group
@@ -148,6 +168,8 @@ signals:
/** Emitted whenever TimeSpinBox in QML changes the scale **/
void scaleChanged(float);
+
+ void runTutorialChanged();
public Q_SLOTS:
/**
@@ -165,8 +187,8 @@ public Q_SLOTS:
*/
void loadColorScheme( const QString &name );
- /** action slot: open a dialog for setting the time and date */
- void slotSetTime();
+ /** sets time and date according to parameter time*/
+ void slotSetTime(QDateTime time);
/** action slot: toggle whether kstars clock is running or not */
void slotToggleTimer();
diff --git a/kstars/kstarslite/dialogs/finddialoglite.cpp b/kstars/kstarslite/dialogs/finddialoglite.cpp
index 2e8362b..d7a0317 100644
--- a/kstars/kstarslite/dialogs/finddialoglite.cpp
+++ b/kstars/kstarslite/dialogs/finddialoglite.cpp
@@ -181,7 +181,6 @@ void FindDialogLite::resolveInInternet(QString searchQuery) {
selObj = dso;
}
if ( selObj == 0 ) {
- /*QString message = i18n( "No object named %1 found.", ui->SearchBox->text() );
- KMessageBox::sorry( 0, message, i18n( "Bad object name" ) );*/
+ emit notifyMessage(i18n( "No object named %1 found.", searchQuery ));
}
}
diff --git a/kstars/kstarslite/dialogs/finddialoglite.h b/kstars/kstarslite/dialogs/finddialoglite.h
index 7af1124..ed2f9f8 100644
--- a/kstars/kstarslite/dialogs/finddialoglite.h
+++ b/kstars/kstarslite/dialogs/finddialoglite.h
@@ -17,9 +17,6 @@
#ifndef FINDDIALOGLITE_H_
#define FINDDIALOGLITE_H_
-#include <QKeyEvent>
-#include <QDialog>
-
#include "skyobjects/skyobject.h"
class QTimer;
@@ -28,9 +25,7 @@ class QSortFilterProxyModel;
class SkyObjectListModel;
/** @class FindDialogLite
- * A backend of dialog declared in QML.
- *
- * @short Backend for Find Object Dialog in QML
+ * @short Backend for "Find Object" dialog in QML
* @author Artem Fedoskin, Jason Harris
* @version 1.0
*/
@@ -58,6 +53,7 @@ public:
Q_INVOKABLE void resolveInInternet(QString searchQuery);
signals:
void filterModelChanged();
+ void notifyMessage(QString message);
public slots:
/**When Text is entered in the QLineEdit, filter the List of objects
diff --git a/kstars/kstarslite/dialogs/locationdialoglite.cpp b/kstars/kstarslite/dialogs/locationdialoglite.cpp
index 460ca59..4e93da3 100644
--- a/kstars/kstarslite/dialogs/locationdialoglite.cpp
+++ b/kstars/kstarslite/dialogs/locationdialoglite.cpp
@@ -19,6 +19,8 @@
#include "kstarslite.h"
#include <QQmlContext>
#include "kspaths.h"
+#include <QGeoPositionInfoSource>
+#include "Options.h"
LocationDialogLite::LocationDialogLite()
:SelectedCity(nullptr), currentGeo(nullptr){
@@ -51,6 +53,8 @@ LocationDialogLite::LocationDialogLite()
connect(kstars, SIGNAL(dataLoadFinished()), this, SLOT(initCityList()));
KStarsData* data = KStarsData::Instance();
connect(data, SIGNAL(geoChanged()), this, SLOT(updateCurrentLocation()));
+
+ m_geoSrc = QGeoPositionInfoSource::createDefaultSource(this);
}
void LocationDialogLite::initCityList() {
@@ -209,7 +213,6 @@ bool LocationDialogLite::deleteCity(QString fullName) {
bool LocationDialogLite::editCity(QString fullName, QString city, QString province, QString country, QString latitude, QString longitude, QString TimeZoneString, QString TZRule) {
QSqlDatabase mycitydb = getDB();
GeoLocation *geo = filteredCityList.value(fullName);
- KStarsData *data = KStarsData::Instance();
bool latOk(false), lngOk(false), tzOk(false);
dms lat = createDms( latitude, true, &latOk );
@@ -398,7 +401,6 @@ bool LocationDialogLite::checkLongLat(QString longitude, QString latitude) {
bool LocationDialogLite::setLocation(QString fullName) {
KStarsData *data = KStarsData::Instance();
GeoLocation *geo = filteredCityList.value(fullName);
-
if(!geo) {
foreach ( GeoLocation *loc, data->getGeoList() )
{
@@ -410,8 +412,33 @@ bool LocationDialogLite::setLocation(QString fullName) {
}
if(geo) {
- data->setLocation(*geo);
+ // set new location in options
+ data->setLocation( *geo );
+
+ // adjust local time to keep UT the same.
+ // create new LT without DST offset
+ KStarsDateTime ltime = geo->UTtoLT( data->ut() );
+
+ // reset timezonerule to compute next dst change
+ geo->tzrule()->reset_with_ltime( ltime, geo->TZ0(), data->isTimeRunningForward() );
+
+ // reset next dst change time
+ data->setNextDSTChange( geo->tzrule()->nextDSTChange() );
+
+ // reset local sideral time
+ data->syncLST();
+
+ // Make sure Numbers, Moon, planets, and sky objects are updated immediately
data->setFullTimeUpdate();
+
+ // If the sky is in Horizontal mode and not tracking, reset focus such that
+ // Alt/Az remain constant.
+ if ( ! Options::isTracking() && Options::useAltAz() ) {
+ SkyMapLite::Instance()->focus()->HorizontalToEquatorial( data->lst(), data->geo()->lat() );
+ }
+
+ // recalculate new times and objects
+ data->setSnapNextFocus();
KStarsLite::Instance()->updateTime();
return true;
}
@@ -428,6 +455,8 @@ dms LocationDialogLite::createDms (QString degree, bool deg, bool *ok )
return dmsAngle;
}
+
+
void LocationDialogLite::setCurrentLocation(QString loc) {
if(m_currentLocation != loc) {
m_currentLocation = loc;
diff --git a/kstars/kstarslite/dialogs/locationdialoglite.h b/kstars/kstarslite/dialogs/locationdialoglite.h
index a718e19..1e4cb4b 100644
--- a/kstars/kstarslite/dialogs/locationdialoglite.h
+++ b/kstars/kstarslite/dialogs/locationdialoglite.h
@@ -31,6 +31,7 @@
*/
class GeoLocation;
+class QGeoPositionInfoSource;
class LocationDialogLite : public QObject {
Q_OBJECT
@@ -104,6 +105,7 @@ private:
QStringList m_TZList;
QStringList m_DSTRules;
+ QGeoPositionInfoSource *m_geoSrc;
};
#endif
diff --git a/kstars/kstarslite/qml/CMakeLists.txt b/kstars/kstarslite/qml/CMakeLists.txt
index ae74205..4fecfc3 100644
--- a/kstars/kstarslite/qml/CMakeLists.txt
+++ b/kstars/kstarslite/qml/CMakeLists.txt
@@ -48,5 +48,15 @@ install( FILES modules/helpers/TopMenuButton.qml
modules/helpers/TelescopeControl.qml
DESTINATION ${KDE_INSTALL_DATADIR}/kstars/kstarslite/qml/modules/helpers )
+install( FILES modules/tutorial/TutorialStep1.qml
+ modules/tutorial/TutorialStep2.qml
+ modules/tutorial/TutorialStep3.qml
+ modules/tutorial/TutorialStep4.qml
+ modules/tutorial/TutorialStep5.qml
+ modules/tutorial/TutorialPopup.qml
+ modules/tutorial/TutorialExitPopup.qml
+ modules/tutorial/TutorialPane.qml
+ DESTINATION ${KDE_INSTALL_DATADIR}/kstars/kstarslite/qml/modules/tutorial )
+
add_subdirectory(images)
add_subdirectory(indi)
diff --git a/kstars/kstarslite/qml/dialogs/FindDialog.qml b/kstars/kstarslite/qml/dialogs/FindDialog.qml
index 9a2a63e..3f7a9c9 100644
--- a/kstars/kstarslite/qml/dialogs/FindDialog.qml
+++ b/kstars/kstarslite/qml/dialogs/FindDialog.qml
@@ -91,6 +91,7 @@ KSPage {
RowLayout {
Button {
+ enabled: searchQuery.text.length > 0
text: "Search in internet"
onClicked: {
FindDialogLite.resolveInInternet(searchQuery.text)
diff --git a/kstars/kstarslite/qml/dialogs/helpers/LocationLoading.qml b/kstars/kstarslite/qml/dialogs/helpers/LocationLoading.qml
index e070714..6f5a8c8 100644
--- a/kstars/kstarslite/qml/dialogs/helpers/LocationLoading.qml
+++ b/kstars/kstarslite/qml/dialogs/helpers/LocationLoading.qml
@@ -11,7 +11,7 @@ Popup {
focus: true
modal: true
- Pane {
+ ColumnLayout {
id: aboutDialog
focus: true
width: Math.min(window.width, window.height) / 3 * 2
diff --git a/kstars/kstarslite/qml/images/CMakeLists.txt b/kstars/kstarslite/qml/images/CMakeLists.txt
index 93122a8..e41dee3 100644
--- a/kstars/kstarslite/qml/images/CMakeLists.txt
+++ b/kstars/kstarslite/qml/images/CMakeLists.txt
@@ -116,4 +116,12 @@ install( FILES
splash@2x.png
splash@3x.png
splash@4x.png
- DESTINATION ${KDE_INSTALL_DATADIR}/kstars/kstarslite/qml/images )
+ tutorial-arrow-horizontal.png
+ tutorial-arrow-horizontal@2x.png
+ tutorial-arrow-horizontal@3x.png
+ tutorial-arrow-horizontal@4x.png
+ tutorial-arrow-vertical.png
+ tutorial-arrow-vertical@2x.png
+ tutorial-arrow-vertical@3x.png
+ tutorial-arrow-vertical@4x.png
+ DESTINATION ${KDE_INSTALL_DATADIR}/kstars/kstarslite/qml/images )
diff --git a/kstars/kstarslite/qml/images/svg/114x80/gen2x.sh b/kstars/kstarslite/qml/images/svg/114x80/gen2x.sh
new file mode 100755
index 0000000..fbeaa7a
--- /dev/null
+++ b/kstars/kstarslite/qml/images/svg/114x80/gen2x.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+width=114
+dir="../../"
+
+for file in *.svg
+do
+ filename="${file%.*}"
+ /usr/bin/inkscape -z -f "${file}" -w $width -e "${dir}/${filename}.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*2)) -e "${dir}/${filename}@2x.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*3)) -e "${dir}/${filename}@3x.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*4)) -e "${dir}/${filename}@4x.png"
+done
diff --git a/kstars/kstarslite/qml/images/svg/114x80/tutorial-arrow-horizontal.svg b/kstars/kstarslite/qml/images/svg/114x80/tutorial-arrow-horizontal.svg
new file mode 100644
index 0000000..59cc85e
--- /dev/null
+++ b/kstars/kstarslite/qml/images/svg/114x80/tutorial-arrow-horizontal.svg
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 1052.3622 744.09448"
+ id="svg5000"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/polaris/dev/KDE/kstars/kstars/kstarslite/qml/images/blue-arrow@4x.png"
+ inkscape:export-xdpi="60.34"
+ inkscape:export-ydpi="60.34"
+ sodipodi:docname="tutorial-arrow-horizontal.svg">
+ <defs
+ id="defs5002">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4746">
+ <path
+ d="M 0,800 800,800 800,0 0,0 0,800 Z"
+ id="path4748"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4754">
+ <path
+ d="m 394.073,510.366 133.92,0 0,-168 -133.92,0 0,168 z"
+ id="path4756"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <mask
+ maskUnits="userSpaceOnUse"
+ x="0"
+ y="0"
+ width="1"
+ height="1"
+ id="mask4762">
+ <g
+ id="g4764">
+ <g
+ clip-path="url(#clipPath4758)"
+ id="g4766">
+ <g
+ id="g4768">
+ <g
+ transform="matrix(133.92001,0,0,168.00001,394.07324,342.3662)"
+ id="g4770">
+ <image
+ width="1"
+ height="1"
+ preserveAspectRatio="none"
+ transform="matrix(1,0,0,-1,0,1)"
+ xlink:href="data:image/png;base64,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"
+ id="image4772" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </mask>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4758">
+ <path
+ d="m 394.073,510.366 133.92,0 0,-168 -133.92,0 0,168 z"
+ id="path4760"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <mask
+ maskUnits="userSpaceOnUse"
+ x="0"
+ y="0"
+ width="1"
+ height="1"
+ id="mask4774">
+ <image
+ width="1"
+ height="1"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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"
+ id="image4776" />
+ </mask>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4800">
+ <path
+ d="m 436.163,495.366 8.767,-74.477 -31.857,13.519 47.957,-68.959 47.955,68.959 -31.857,-13.519 8.768,74.477 -49.733,0 z"
+ id="path4802"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.7e-6,129.91748,129.91748,5.7e-6,461.0293,365.44824)"
+ spreadMethod="pad"
+ id="linearGradient4808">
+ <stop
+ style="stop-opacity:1;stop-color:#1b1464"
+ offset="0"
+ id="stop4810" />
+ <stop
+ style="stop-opacity:1;stop-color:#26527b"
+ offset="0.38946118"
+ id="stop4812" />
+ <stop
+ style="stop-opacity:1;stop-color:#26527b"
+ offset="1"
+ id="stop4814" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.39878653"
+ inkscape:cx="401.99685"
+ inkscape:cy="504.71434"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1366"
+ inkscape:window-height="703"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5005">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.26772)">
+ <g
+ id="g3453"
+ transform="matrix(0,1,-1,0,1096.9679,131.58516)">
+ <g
+ id="g3433">
+ <g
+ id="g4742"
+ transform="matrix(5.3462695,0,0,-6.0799377,-1913.1166,3161.5565)">
+ <g
+ id="g4744"
+ clip-path="url(#clipPath4746)">
+ <g
+ id="g4750">
+ <g
+ id="g4752" />
+ <g
+ id="g4778">
+ <g
+ clip-path="url(#clipPath4754)"
+ id="g4780"
+ style="opacity:0.30000299">
+ <g
+ id="g4782">
+ <g
+ id="g4784" />
+ <g
+ mask="url(#mask4762)"
+ id="g4786">
+ <g
+ transform="matrix(133.92001,0,0,168.00001,394.07324,342.3662)"
+ id="g4788">
+ <image
+ width="1"
+ height="1"
+ preserveAspectRatio="none"
+ transform="matrix(1,0,0,-1,0,1)"
+ xlink:href="data:image/png;base64,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"
+ mask="url(#mask4774)"
+ id="image4790" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g
+ id="g4792"
+ transform="translate(461.0293,355.4482)">
+ <path
+ d="m 0,0 c -3.274,0 -6.341,1.603 -8.21,4.29 l -47.956,68.96 c -2.544,3.657 -2.36,8.556 0.448,12.014 1.944,2.392 4.82,3.695 7.765,3.695 1.312,0 2.639,-0.258 3.903,-0.794 l 16.007,-6.792 -6.756,57.376 c -0.334,2.836 0.561,5.68 2.459,7.814 1.898,2.134 4.617,3.355 7.473,3.355 l 49.734,0 c 2.856,0 5.575,-1.221 7.473,-3.355 1.898,-2.134 2.793,-4.978 2.459,-7.814 L 28.043,81.373 44.05,88.165 c 1.263,0.536 2.591,0.794 3.903,0.794 2.945,0 5.821,-1.303 7.765,-3.695 2.808,-3.458 2.992,-8.357 0.448,-12.014 L 8.21,4.29 C 6.341,1.603 3.274,0 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path4794"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g4796"
+ transform="matrix(5.3462695,0,0,-6.0799377,-1913.1166,3161.5565)">
+ <g
+ id="g4798"
+ clip-path="url(#clipPath4800)">
+ <g
+ id="g4804">
+ <g
+ id="g4806">
+ <path
+ d="m 436.163,495.366 8.767,-74.477 -31.857,13.519 47.957,-68.959 47.955,68.959 -31.857,-13.519 8.768,74.477 -49.733,0 z"
+ style="fill:url(#linearGradient4808);stroke:none"
+ id="path4816"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/kstars/kstarslite/qml/images/svg/250x40/gen2x.sh b/kstars/kstarslite/qml/images/svg/250x40/gen2x.sh
index 014151e..75ee75c 100755
--- a/kstars/kstarslite/qml/images/svg/250x40/gen2x.sh
+++ b/kstars/kstarslite/qml/images/svg/250x40/gen2x.sh
@@ -1,14 +1,13 @@
#!/bin/sh
width=250
-halfwidth=$((width/2))
dir="../../"
for file in *.svg
do
filename="${file%.*}"
/usr/bin/inkscape -z -f "${file}" -w $width -e "${dir}/${filename}.png"
- /usr/bin/inkscape -z -f "${file}" -w $(($width + halfwidth*2)) -e "${dir}/${filename}@2x.png"
- /usr/bin/inkscape -z -f "${file}" -w $(($width + halfwidth*4)) -e "${dir}/${filename}@3x.png"
- /usr/bin/inkscape -z -f "${file}" -w $(($width + halfwidth*6)) -e "${dir}/${filename}@4x.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*2)) -e "${dir}/${filename}@2x.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*3)) -e "${dir}/${filename}@3x.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*4)) -e "${dir}/${filename}@4x.png"
done
diff --git a/kstars/kstarslite/qml/images/svg/80x114/gen2x.sh b/kstars/kstarslite/qml/images/svg/80x114/gen2x.sh
new file mode 100755
index 0000000..2ffd83d
--- /dev/null
+++ b/kstars/kstarslite/qml/images/svg/80x114/gen2x.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+width=80
+dir="../../"
+
+for file in *.svg
+do
+ filename="${file%.*}"
+ /usr/bin/inkscape -z -f "${file}" -w $width -e "${dir}/${filename}.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*2)) -e "${dir}/${filename}@2x.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*3)) -e "${dir}/${filename}@3x.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*4)) -e "${dir}/${filename}@4x.png"
+done
diff --git a/kstars/kstarslite/qml/images/svg/80x114/tutorial-arrow-vertical.svg b/kstars/kstarslite/qml/images/svg/80x114/tutorial-arrow-vertical.svg
new file mode 100644
index 0000000..bb718c0
--- /dev/null
+++ b/kstars/kstarslite/qml/images/svg/80x114/tutorial-arrow-vertical.svg
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ viewBox="0 0 744.09448819 1052.3622047"
+ id="svg5000"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ inkscape:export-filename="/home/polaris/dev/KDE/kstars/kstars/kstarslite/qml/images/blue-arrow@4x.png"
+ inkscape:export-xdpi="60.34"
+ inkscape:export-ydpi="60.34"
+ sodipodi:docname="tutorial-arrow-vertical.svg">
+ <defs
+ id="defs5002">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4746">
+ <path
+ d="M 0,800 800,800 800,0 0,0 0,800 Z"
+ id="path4748"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4754">
+ <path
+ d="m 394.073,510.366 133.92,0 0,-168 -133.92,0 0,168 z"
+ id="path4756"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <mask
+ maskUnits="userSpaceOnUse"
+ x="0"
+ y="0"
+ width="1"
+ height="1"
+ id="mask4762">
+ <g
+ id="g4764">
+ <g
+ clip-path="url(#clipPath4758)"
+ id="g4766">
+ <g
+ id="g4768">
+ <g
+ transform="matrix(133.92001,0,0,168.00001,394.07324,342.3662)"
+ id="g4770">
+ <image
+ width="1"
+ height="1"
+ preserveAspectRatio="none"
+ transform="matrix(1,0,0,-1,0,1)"
+ xlink:href="data:image/png;base64,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"
+ id="image4772" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </mask>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4758">
+ <path
+ d="m 394.073,510.366 133.92,0 0,-168 -133.92,0 0,168 z"
+ id="path4760"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <mask
+ maskUnits="userSpaceOnUse"
+ x="0"
+ y="0"
+ width="1"
+ height="1"
+ id="mask4774">
+ <image
+ width="1"
+ height="1"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARcAAAFeCAAAAACK7wSsAAAAAXNCSVQI5gpbmQAAH8BJREFUeJztXet627iuBUhKsp3z/k9aXyRecH4ApCjGTlOJlOz5NmYmaTupDS3hviAT4H/yP/m94Ie85o9C9V+y8jXgi183Enrx6+1SU3lcvuKeuNDyt9ulmvIYXyz9oj0wMxq0+EUFqaS7gIH8JcOmsQgUBEDyvRIyVbTHBAoif9sFmgQKAQFRgqYGMhVUT6ggAsqXiExjYVSIgORLNWS2Ky+YACIiosIEzS7xJYJCgUjAqQLMVt0zVBSq9AUzb2ok0YOIAlFIXyohY7b99ehAiAqViCADmNJTA+EERBBRYUEKRACEBLgNmG24IAAioEJUSimtlFaasUElFtNOCAgoEGPigw/Bh4CBKADAVmA24YKQbEUrHUVphUq1Dr4x5IZAwQcfJfhAQLQZmC24JFiU0lobbbQx2kRkBJg2yHCKJqKIivPOeeedRx8g8I9sAWYDLgKLUkppo40xnemMMcawMyFiwxqGAICIiF3IOeecddYpp9Ajhs2utM2PorEYY7ooxmiTcGmajyIuzjtnrbXWWKscogcABma9rMeFy1ultDLGdF3f9X3f913XGWM0x972uIQQgnfOWWunaZq0Tm8bgJDWG8xqXBgWVEoZ03V93w9DPwx933fGGK0zXBpgM4eXELx3ztlpmsaxM6NSiACOgAC3ALMp7iIqpY3p+n4YhuE0nCIwe+Nip2ka+27UWisum4ACbnGktbhEY1HadH0/nE6n8+l0Og0DG4zS0hA0jLtc/vvA5jKOj64zWgkqRACBK7xVssGPABHZXIbz6Xw+n8/n0zAMXW+MURr3iS/kg3NusuM49p3R7EbcKuGWqnclLjFHsxedTufL5XI5n0+nk9iL2stegtjL49EZNheKgrg+V2/zI6216frhdL5cvr4ul/P5NPR912nNhV37ui5Q8N5bO019H71I2iUiwr39iNtFji5dfzqdL19fX1+Xy+l06nvTaa0UKmjvRxAoBO+tm6ZoLcClXghBEa1vIDfUL4hKa2P6YTidL19f//d1uZxOQ99zOkqjhlYShwzBe+c6dl4EoNgrhRBw9/olNgDG9H1/Op/PF7GXQcwli7qN8nSeqW3XGa0Rgch7753z3nuliHBt1bsKF4RYvGjTsb2cL5fL1/l0EnNBVLAHLhCIgvfGaa0UsrE4a52zTnvFBrPKaFbHXURErU3X9cNwOp0v5zOH3S4m6dbjl+hJgXxgx4UYhK21nXPa43oFVsddCbsRmNP5fOIszTVnSy8CWHgSaa90hMXZaRqmWHIHXNsKrMElzV04TffDMJxisdsbztHtrQUgjuyUUgoAKATv7DQMwyi9CCKuDb3r6904YZDuaBh67gF0HL3sxJMQEk96KHg7TMMw9H3XxRYNYF2AWZ2PQJpGbqZlxsCtdBZzGwsXboFr/+B7a/tBFBFYDrAXSUim67q+k8FLKl32W/ZAUjy8C1ET1kPHieEqWZenMZtgGpNGmHo5j9qDV0MgBFCklNZGd53pjOmM1jobGe6YpzEVMFozNDrTZS9zQQAgBJiB0cYYo5PZ4srqZZsfMZWmtTZG69lY2rZF3/QAQgBUJLpEskbCy9qXVWs0gWQwnJT4PwFlz9iS9Jn5GiWgbLxDK3ARbTCN7BL/qloyIz/qEvMAouiBedBdodFqXCCFX8QsquxvLokNjvsUMyr7+lGuUVQnqrK/rSRV5OtsKpt02YYLpO2o4wCZVcFkr9tv0FZcKFUHb4BMRdmGS1qIJNpC1lQUSgt3mUIrVNuCS1zhIqq07LdN4j5m2ieDDTdrBS5iJERLZBiew4Rm7iRDZjUwa+1lvjOZJkdbTXabZmTWyXo/onwNMsQ9UYD9wUkGnEnY6N0rcYm7xLLdFqIeR4kYK4W4g7jVkVbhErWgSIUKLHQgOEtLiY4Ea51pQ3yJ1kKyK3po2AUQ0iSKuPbaF1sdX9KeddSDjrSWuPcd0r0KR8XdtH4+gyK7o+tfcrUmok9I4W5rvFsbdyWehMxwj6x5Y7ALhfmuBme7vUQ9Qgx0h8hcuXw3mDUqrcFl5voC71sT63Fol5QSwfx1izbr4648tTDDEpIi+4ITrSJPAmGr9a7P0+kRl6ywe4PiZRledu+PIFssTsAcWtjl+SiWL+vT4zpc5NGn2V6SRx8lc7Ebs0A4tG+sp8l6aXGXNs3rqlruRqns1avjbvVIt0XqZ4F1/bR8q5oZN0n1qmFrPqpXSa1XIypTs8rcEHfn5wuzniTXdVep3JVsqnfzXi2bB619ydUiplqzi13dT6fUWOSjoyT6dG4vG5Ljpn4a5Dn3pMlhpV11XbbWLzXv0WotGtjuhjlmdZ9eLQ1iXQV7eYPJVP3cuLJvjNq8y2Sqei21sa47fjLVqPbeXtcdP5lq0attiy9vNJl6lo82pMb1/fQ7TaaSvVSbBW3bC6qtzTotWtyhjft1la13vR61PXrzHPMNJlMtMsDq/Rf+Vjk7rpQGFcP2fHTsZKpVhbkp7r7PZKp6R7J9jlmzW1unB5tp3Q52017Q+0ymoj9Xm3hs7KffYzLVQI/t9cvBk6lGdrt1L+gNJlNN4lwVezl4MtUiL27Zg3+byVSDOmpzXXfsZKpZ3V2jrjt2MtWmT9saX95kMvUsHx22F/Quk6lkLxXnQBuf42ug0b9q0ObubH3u8y0mUw28ucIc8+DJVJvov2HPg79Vz5ArNGlQLdTIR8dNptpVl1ufn36LyVSDbqTGHLNux/avOrCJ1u5eN+4FvcdkKvpyxWnH5n76+MlUEx1q1C8HTqaa2ez2vaCDJ1ONYlwlezlwMtUmJ27ZfxGtjp5MNamhKtR1x02mGtbcdeq64yZTrXq07fHlDSZTz/LRoXtB7zCZSvZSdQa0+XO3mmj1+3dvdWc2+9Hxk6kmnlxljnngZKpV5N+058HfGmTJf9KiSaVQJx8dM5lqWVnW+LzD+lX4v6nQohOpM8es3bX9/v3ZPOt3rpv3go6fTEU/rjrpqNBPHzuZavT+deqXgyZTDe21xl7QgZOpZvGtmr0cNJlqlQ+37b+IZkdOphrVT1XqumMmU03r7Vp13TGTqXb9WY34cvBk6lk+Onwv6Nn8I+xNwzaY/2y3l6Ulx3y0BzIt54W/O7cFAX6KouxHVFryLh+d/09e/JfryOQvuOD3Xy9fNkW+RWFHRHIAT1v5ddT/63WU8hMuTw7UIzl0aKldXljVSgi/k5+qhCi4+Bb/Hvx85OVLXNIJH99vO8lrJuCX9rJTJ/D3qhIpv4Qn1/EDNC9wwQjM8ngaQhAHmb2EFi5OqXOExU81k+ddSLqKiMmL66BXp4w9xQXjicHpH341AYFfM71edHFJlZKPiNqD8rprzZDJLmI2cCAk5Mt4jswTXHA+UUhOf4rOKN4MlB2iSc9Swt4FjES31EkTACBFUNK/6ToISC7jFTLfcYnHOy3ONWIV5uzDBQqJLbG5hCD5ercCppxKpfdGJCTGJLuQZC+zAL44o7rEZUZFISo5fgr4tL+5tIz3RbITFbX4PgXMi6kUv22CZXGGFl8GyDUEosCYfDeZAhdMR04pPm1PoZz2KumYg35WKEipJP8nUIw1exQwy6kUZS6M8yG2qFCuQo5LzU+lwEAE8MRklrhwXGFLUVpppVQ6CHEZ32JOFL9d5umw12Aqm0oRpRkmxlyabm68w3J7A/kQQvDBI1KgAAAlMAtcEsZKKS2HISqtlEJALp/41TyfIE+BCDABk1L1znXdMu4CpBPF+BRFPrxQxQMdCUguwnuvgg8YgN1+AUyOSzrtTymtjOZzM7WceQ1AjIoLznsGh++P4t5zNud8lNjMlxZTqSUqikCOI5XzHI0yjIyYffDee+eddx49AjyxmAyXGZZ4tml+Ai2bS3o9xiZQAA7RkLf8URoHmPmNUjlJAKiCQgCFbPJG/onnLhPxYe/OOeu0Vc6jD/ANmKUfxTNfjTGd6bt4RrBSmHB2Ubxjk2E3jvkqZLlqF5lvBlA8FVsRyOnYcqyv3F6FCHx8t3POWmsn5SQOMDCzzLhgBgsfWNz3fHqy1gkXhsRaZ51zznsfAkE8uTfWMTvXL+ld5cZqDJBur+kM31w5MBz4tHdn7WSnSWuLyoIHAWY2mIQLZ7Z4onTfD/0w9EPf8dHf7EfeO+essyyMTAgASmsdc2CKuvvko8VbAqLWhAGAr8OYjiWeAp0uw9ppmsbOaI1KiuBAgDMwi7irGBc5sn44DcMgZ38jAoUQnGdQJmsna62z3vlAgIoPNoYMm+aFXSrrIiZyV0ERoNJGd2z2Xc/QaKOUYlycY1jGeLg6EBAuaruIy+xFpuv74XQ6n06n02no+67TWikACGIvk53sNDE0zrkQCJSWg9PlJsqtbB13s/cCjijGkwqASvEB813X9308wzy7DGunaXzwlSFInoaQeVLuR3xifdf1w/l0Pl/Op/NpGHJcgvPWWTtNdhonO012YmAAVTQrsZi2gBToxLSsjekIAwHD0nd93/VD3/V915lOG5XjMo59J5ETACgoQoRvfoSzHXb9cDpdLpfL+XI6D0PfRz+K8cVOkx0nFmut84FAma6XjB4nenvVu1JgKK216Ql1AFScOVgGxiWPL87aaXzwnQQuzIiIRw+CTOlHxnT9cDpfLl+Xr/PldBr6bsYlMC424jJOk7XW+wCoTc/4izPtKpKUuz6A9gRK645Th+DC9YZWCRdnx77vGJY4ByCeOSz8KJmLMV0/DOfz5evr6+tyZnvRMy4RmAgLA8MGIxAqlZ2IvQcoXLMYhsUFQKXFWhiYCMuMi7c2wRILvRAUZTOH5EdS/xvT9afT5XL5+vr6Op+HoZdkxuYWK6LJMiwjexIBatOfhj4CkxJRq9g7D+QiLL0LoDpWpeu6fmBgorWkvBDIe+umzhiOucFz8R5CwO/1CwIiam1M3w/D6Xz+irh0ndFKcCEfvPMJGIZmjjDDwHdB7XbIPULKFr31hMbF6BKtRWDRRiuNCZfOGaM1IhDFVslrr2iehBt5eZiz9HA6nS7nC/tRn/IMEVHwwecmw47kosEMp76LwOzjSjgnUU+oRRETg+5sLFpp1oqIfHCOcyy3StY664zXYjBIMMeXBEvX98PpfLqcz+fz+TTMBsDznOCDy5GxkpIAle6GYRg6s5vFzNZiusET6s5zLSVtzIyKUVrJfI2IQoi9UvDe22maps5qrZQKGEveLE/Pcfd0Op/O5/P5dOp7o7WWuy+DKeNTPxCLO+8JUbMn9RLh8AVrUwkTKVr4bvbeB1TGeSKURqbr+lT/c5pU8SrIK60UcmgRq++sY6iyPJ3cSAxmGIbhNAyDxIusXCMxGe+865yzgzRK3hOA1qbvT3NSam0wSCnmdp5Aaec9gOASmyKOLIxKGscqlVUy4zBwiac9YnKkLB/lTaOgIsWujOSAiBQF0sEb750YjbPOcfeojOn7ITWajYFB4mSktekCAerOsRbamM6IqXBgkeFuugqM8wY7TNMw9LEJlIEeQJaPMLlqClocyJWaXzFDJhjvvOu8la6aUpmZIlLz+EKicyBAbaSF5U66089QSbiA4GLlSlPhtajrkD1JaR2NsO/6rkueGUNFRCaooIJmo+m88957IsJowjHANIaFnZ90IL4n3hMhok5DOhnrChOAkZLlqRkF441caJeNrYDbapPeAZU0GcbEKG4SLByxEJCQiJAUhcBGwxKIldPamM4YiS87AKNIGQBAZbwPxO2jzib2KufU4lWAAtIhzq3maV5mMHM/LQWv1tpoLT8ZX1d+hF8UCYgIFbuTTMADAUCcHWpdMHwtICFJFxoAUGkfQgBulZgA0Ik1WtL2bDUqiA1ok641r7qyejdBw1N0pRPaRVWPPNlSFIJiJoaZAfZ2NZtke0FUfJk+U0EppTSmexozY34R8ceUygxLzSsKYHIgUaWfx8jQLfItAgEC079EhIqCosR/IuQsVuvIywYjsAQdAmvArBEuHChHRfI7ImbKqmWiQMrnUomsZ3SSAy0ujn1pdicViT6ZDqlIfO4TXwAUAKIKsgQqwGAea7/XC6koRLEA/GYBz/dfEsDPLg9zdyIkUtncGSOy2d5MI+GdBVBAKCrEMVK0lG+mMv/d+bqe38CnuMgSB//y2atm7pQmzxTfr3nIzRQhBFAk+yyQwmQea5/qkdE4zxmdhEtal4nCs3Z4PkJJ7oSEFJeoWK+4irND30iy/DPv1MlqVErLz1UgkIuj/HrjQhEAAJj5utOCS9pL4D98cXkYF9Rwsb3w0qkbCAODlPE+8f1fmwpAnAvP+xkZBcX/O9kLl7KBKWheV2Bo5OKfqgUzNLj44x+VqihIMdpl6Qb+CgovwQRZzwgyrVs8iDL7kfTK3ns/k89BEeEPs0iONEvgms4Xnr9/8Wd/ef95vYu7X67Yl48ACi6zBwk1LzNPCnE177Vmr1TbRxDo2/v9+PaU2wDP2JLBzBsHhn8UZazNswPnLLfJXite6fyLags2ekdQ4vv907tLyJDpmpUrluWMmJ9SfGF78d5Zx8NJ67wPXiGqnw3mt+q0lH94dwLZ5GH63trJTs7yqCRbUFHxp+d9GR5oyyCuDNWfLinpetmAmabJTuJL2YUakKRCQg/ZyTIz1PfW8GyPYmn5+UKZBVhrIwc28cxRAm82f6G4JyYrEOM4TBOvBAUE9d8AhUXSi5MdmHGcphmWFKo0QFY98/yFR4AmH+xA825nF4nrm7zRcL/fr7fr7Xa7Px7jZK3380M6nI9QFhtlk2gcx0f/SKtS/xlPmr2IrWV8jI9xHJkz9XGhkwDEXmJTg3EbU6Z22drrXp1ga5FoYadpvN/vt+v1er3d7o9xmngnLuYXwYXHLxjXo3ngrbOx8X/Bk5Ze9Ljfrtfb9XplWKwUMHl8yQ0GFa+/x9Fx9sjBhwOTeZEdx/F+v90Elsc4CgmWAm/EJfkRKoUqGYtW/ylPyrzocbtdr9fr9Xa/38dxcs6H/NFIwSUZTDb8Tn6UzXk/GJjkRc5N4/iI1sLRxVoueKHwozS0UCn4CjazK8FHAzMHFzdN00PMhZP0ZJ13C3NJuMQRW5yox0cxlOLFERWt6ZirqiDErbFz1k6PB6ei6/V6vz8mqV3ybewZF0lJMwUjz6jMTEwaEH6gUKzQnLPjY7zfrtfrn+v1dmcvcmFpLjMucXqeBvqRYZu3JOBzQ0x8NNV7N02ciyTqPh7jFKs6eOJHMi6WfdVUx4jZRPLjQ5N1XJn33tkEi5gLd0dLVHJc5HoTODMlmyWlz/Uk6aLtNI2P++12/RMr3ZG9qPiUgAyXpSelZxxlB0u2Zj7Sk9ID3s5N0+Nxv9+uf65/rtf7jYPLNy8qcMmevxZXkhapWK75MGDS06Hfgst95MaoRGWJy8xbYw7MYt7woWVvLHRt8qI/19uNYUkTqRyYBS7sSTFfx1ytY4D50AYybxfH2Yt47GKdc+lB+EwKXOJKGfBD1Jh50rz28VnAZIVubBdTip7sJMuB5QB7iUvipCQl4cKTUgP5WWUvxUcbslz053q7PR7iRc8m+wUuEM1lfsBcpaWsjyx7s0J3Gh+P+/16i140TpN9AcsTXDDL1bHszXPSZ5W93wvd2ACkQvfpx8qVuGTbCFnZm2Z3n1b2FoXuI++LYrv49IMjv+GSPCnvIWN4UagUfJgnEVHwYU7R1z9ZofvCi57jkpZ6VAoy2YrwJ5W9WaFrx/FxvzMsPNK1UyKNvst3XCBdNte9C0/Cjyp7l4XuPHS53e880n398atPcHnWQGae9Fllb1noLrzoe7uY5Dkuyway8KSPKXsXhe43L5rbxWfyDJdnDWQ+pPoQT8p5kUlGl3+etYvPoHmKy7cGEhXONe8H8SaJFxkfsdC9Xe8/tItJnuOSGkhYOFKcUX0Eb5LzItP4eNzydjEVut8aI5FXuOTNwNwPCF/9CbzJghfhXCSw3Ln+f9ouJnmBy9xAAoKs/OvUEHwEb1LyItksaoyF7utFsFe4PCt75QGcj2ggv/Eii6HLD4WuyA+4LMreIiW9ewP5pF2cvejHQlfkJS552YtLT3p/3uQpL5Kl6B8KXZHXn9dMSAABEL08G5c+2is+9shr6G8q83bhNI6Px/12v90fj9gt/pSiAeAneynL3uW09615kxe8SJ6LXha6Ij/g8q3sxQ/hTX7Ni/wAzU+4fDBv8s+8SCk/4vKZvMkqXqSUv+DygbzJOl6klJ9x+UjeZBUvUspfcPk83mQlL1LK33H5LN5kLS9Syt9w+TDeZDUvUspfcfk43mQdL1LKb3D5HN5kPS9Syt9x+SDeZAMvUsovcPko3mQtL1LK73D5DN5kCy9Sym9w+RDeZBMvUsqvcPkY3mQ9L1LK73D5BN5kGy9Sym9xeXveZCMvUsovcfkA3mQbL1LKb3F5d95kKy9Syj/g8s68yWZepJRf4/LWvMl2XqSU352DCvD2vMlGXqSU39vLG/MmFXiRUv4Bl7flTWrwIqX8Cy5vzJts5kVK+Sdc3pM3qcKLlPKPuLwhb1KHFynl33B5S96kCi9Syj/i8n68SSVepJR/x+W9eJNavEgp/4rLm/Em1XiRUv4Zl7fjTerwIqWsweV9eJN6vEgp/47LG/EmFXmRUlbg8la8SS1epJR1uLwHb1KTFyllDS5vwptU5UVKWYXL2/Am9XiRUtbh8g68SV1epJS1uBzOm1TmRUpZicsb8CZ1eZFS1uJyNG9SmxcpZQMuR/Im1XmRUlbjcihvUp8XKeX3PMk33Y7lTSrzIqWst5cDeZMGvEgpG3A5jDdpwYuUsgWXA3mT6rxIKZtw+YE3adhANuFFStmIyyveJDsisLYnteFFStmGS8mbKKUxtQOtGsgmvEgpG3EpeJP5o56zPqmuJzXiRUrZjkvGm6i5H1h+lHw9YFrxIqVsxWXBmyB/0HPDBrIZL1LKZlx2byDb8CKl1MBlvwayHS9SynZcdmwgG/IipVTAJfEm0hcUQ826H/TcihcppQ4u+zSQLXmRUmrgslMD2ZQXKaUKLrs1kO14kVLq4LLH4l1bXqSUWrg0X7xrzIuUUgmXsoFssHjXlhcpZf18dymEBEAUvBxeFye9Zl6konTI7ZrXj+2i924ap8VEd3KuNizV7GXZQFZfvGvOi5RSDZdFA1l78a49L1JKPVyeNZAVF+/o2/kikovSkXFVT2utikurxbsdeJFSKuKSN5BVF+/24EVKqYlLaiDrL94150VKqYxLi8W7XXiRUqri8q2BLIZUqzxpH16klLq4fGsgayze7cKLlFIZl/qLdzvxIqVUx6Xy4t1evEgptXGZG0iosXi3Gy9SSnVcqvMm+/AipbTApR5vsh8vUkp9XCryJjvyIqU0wKUqb7IXL1JKG1zq8CZ78iKltMClEm+yKy9SShNcqvEm+/EipbTBpQZvsi8vUkorXDbzJjvzIqU0wqUCb7IvL1JKLZ6klK28yd68SCmt7GUjb7I7L1JKM1w28Sb78yKltMNlI2+yMy9SSlNc1vImB/AipTTEZTVvcgQvUkpLXDbwJrvzIqU0xmUNb3IIL1JKU1xe8SbL500KYLIUvSMvUkpbXF7wJuXzJjkweYpmL4oEQFNepJTGuLzgTbIRFTAyERgCAAoy0R1j/d+eFymlOS5PeRP5EsMOxHw+pyKe6O7Hi5TSGpdnvInSKusfBZJkL0QheO+cncbHPY0uW/MipTTH5XXZi2V8QQIgCJyi3TSOj/v9etuHFyllD1yWZW+0mMTkzz/KETcE75ybpvF+nwmA1rxIKe1xWZa9MVkrpeN8CrOYS+JF3Bbdb9fb9c/1drs9WvMipeyAy9OyNw00Y7zlyDLXudPjfr9eb9fr9SqwNOVFStkHl7LsxbwTAIBY5AbywTsuXB73G1d0t/sOvEgpe+CyLHu5lVZxOIWx7qcQZlimhMr1dr/fH3u1i0l2wWVZ9gowqABjDpKxQvDeOWftOD4eNy50r7dd28Ukrea7SyG2Cp72qnloB0CBvPdGa/4dd4uWaZHb9cb13Gita8yLlLIPLoxMAAzeqbQlBAyEc70xSjMu3vtsuHC93e/37CNd9kJlN1wIufHxsUniwiWWtp3RSvHvnczoJOayE9m92sUk+9nLzJtMkpaETbS26zqtEZEoBBcXo25XLlxk5hLCnrDshgsAAFEA9GgjFcCwuGnqemOUQpTwIrjcbkKLWOvDjikaAHbEhZCQgAIgWk7ZUvHbYeg7YzT7kTSMj/v9frtz5TJZ5zztVeiK7Gcv8jld4ON8jojb5mFge1EAge1lejwej/v9fo/s4o6FrsiefgRAQAHRR3Px3rtpGvq+40Sd0vQ4Ph6Px+MxjvPMZU8v2hUXQkIiCAAAGBtnO01935uFH9lpHMdxfIzjJKkoUNjVi3aOu0gouERS3rlp7PvOGB1x8c5aO03jNE7jZCfn5kH3fzLuAsQqJgLDwaTv+q4zWvI0cScw2Wma7GSddV68aF9Ydo4vXK8G4EELx91u4k9IjAWNd85aZ6211jkfu6J9o8vucRcjMASBnaaLHxyJMXV755yzzjnnXZhh+c/GXYAMGCIlGBittVYaFQBAIB+898477zy70CGw7O9HAkxMSNpprXnpDpCEOvLeex988ILK/rDsjosAQwhIpILy86NJAABETAcEH7iWCwRHwPLrpzrqviVCmmdiXIcBjDPeEEKgkGzlCFiOwCUCk43uZrqEJ5oUiMLcEu0PyyG4LJCZuRJMNKwIHGUscBQu2UpisWXHYOSYHALLUbjMyMBMw8o2A6RQexgqB+Iys/UJFYAZGUj/HSMH4jLvOizUoOWXg2Qf/ui1PFk5XHw7Sg61F5En+7uHyzvgIoJvAcj/5H+yQv4fdBKkII4uja0AAAAASUVORK5CYII="
+ id="image4776" />
+ </mask>
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4800">
+ <path
+ d="m 436.163,495.366 8.767,-74.477 -31.857,13.519 47.957,-68.959 47.955,68.959 -31.857,-13.519 8.768,74.477 -49.733,0 z"
+ id="path4802"
+ inkscape:connector-curvature="0" />
+ </clipPath>
+ <linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-5.7e-6,129.91748,129.91748,5.7e-6,461.0293,365.44824)"
+ spreadMethod="pad"
+ id="linearGradient4808">
+ <stop
+ style="stop-opacity:1;stop-color:#1b1464"
+ offset="0"
+ id="stop4810" />
+ <stop
+ style="stop-opacity:1;stop-color:#26527b"
+ offset="0.38946118"
+ id="stop4812" />
+ <stop
+ style="stop-opacity:1;stop-color:#26527b"
+ offset="1"
+ id="stop4814" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.39878653"
+ inkscape:cx="401.99685"
+ inkscape:cy="504.71434"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1366"
+ inkscape:window-height="703"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5005">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g4742"
+ transform="matrix(5.3462695,0,0,-6.0799377,-2093.6644,3118.9272)">
+ <g
+ id="g4744"
+ clip-path="url(#clipPath4746)">
+ <g
+ id="g4750">
+ <g
+ id="g4752" />
+ <g
+ id="g4778">
+ <g
+ clip-path="url(#clipPath4754)"
+ id="g4780"
+ style="opacity:0.30000299">
+ <g
+ id="g4782">
+ <g
+ id="g4784" />
+ <g
+ mask="url(#mask4762)"
+ id="g4786">
+ <g
+ transform="matrix(133.92001,0,0,168.00001,394.07324,342.3662)"
+ id="g4788">
+ <image
+ width="1"
+ height="1"
+ preserveAspectRatio="none"
+ transform="matrix(1,0,0,-1,0,1)"
+ xlink:href="data:image/png;base64,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"
+ mask="url(#mask4774)"
+ id="image4790" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g
+ id="g4792"
+ transform="translate(461.0293,355.4482)">
+ <path
+ d="m 0,0 c -3.274,0 -6.341,1.603 -8.21,4.29 l -47.956,68.96 c -2.544,3.657 -2.36,8.556 0.448,12.014 1.944,2.392 4.82,3.695 7.765,3.695 1.312,0 2.639,-0.258 3.903,-0.794 l 16.007,-6.792 -6.756,57.376 c -0.334,2.836 0.561,5.68 2.459,7.814 1.898,2.134 4.617,3.355 7.473,3.355 l 49.734,0 c 2.856,0 5.575,-1.221 7.473,-3.355 1.898,-2.134 2.793,-4.978 2.459,-7.814 L 28.043,81.373 44.05,88.165 c 1.263,0.536 2.591,0.794 3.903,0.794 2.945,0 5.821,-1.303 7.765,-3.695 2.808,-3.458 2.992,-8.357 0.448,-12.014 L 8.21,4.29 C 6.341,1.603 3.274,0 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path4794"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g4796"
+ transform="matrix(5.3462695,0,0,-6.0799377,-2093.6644,3118.9272)">
+ <g
+ id="g4798"
+ clip-path="url(#clipPath4800)">
+ <g
+ id="g4804">
+ <g
+ id="g4806">
+ <path
+ d="m 436.163,495.366 8.767,-74.477 -31.857,13.519 47.957,-68.959 47.955,68.959 -31.857,-13.519 8.768,74.477 -49.733,0 z"
+ style="fill:url(#linearGradient4808);stroke:none"
+ id="path4816"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/kstars/kstarslite/qml/images/svg/gen2x.sh b/kstars/kstarslite/qml/images/svg/gen2x.sh
index 6157e61..795116f 100755
--- a/kstars/kstarslite/qml/images/svg/gen2x.sh
+++ b/kstars/kstarslite/qml/images/svg/gen2x.sh
@@ -1,14 +1,13 @@
#!/bin/sh
width=32
-halfwidth=$((width/2))
dir="../"
for file in *.svg
do
- filename="${file%.*}"
+ filename="${file%.*}"
/usr/bin/inkscape -z -f "${file}" -w $width -e "${dir}/${filename}.png"
- /usr/bin/inkscape -z -f "${file}" -w $(($width + halfwidth*2)) -e "${dir}/${filename}@2x.png"
- /usr/bin/inkscape -z -f "${file}" -w $(($width + halfwidth*4)) -e "${dir}/${filename}@3x.png"
- /usr/bin/inkscape -z -f "${file}" -w $(($width + halfwidth*6)) -e "${dir}/${filename}@4x.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*2)) -e "${dir}/${filename}@2x.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*3)) -e "${dir}/${filename}@3x.png"
+ /usr/bin/inkscape -z -f "${file}" -w $(($width*4)) -e "${dir}/${filename}@4x.png"
done \ No newline at end of file
diff --git a/kstars/kstarslite/qml/images/tutorial-arrow-horizontal.png b/kstars/kstarslite/qml/images/tutorial-arrow-horizontal.png
new file mode 100644
index 0000000..c331385
--- /dev/null
+++ b/kstars/kstarslite/qml/images/tutorial-arrow-horizontal.png
Binary files differ
diff --git a/kstars/kstarslite/qml/images/tutorial-arrow-horizontal@2x.png b/kstars/kstarslite/qml/images/tutorial-arrow-horizontal@2x.png
new file mode 100644
index 0000000..608543c
--- /dev/null
+++ b/kstars/kstarslite/qml/images/tutorial-arrow-horizontal@2x.png
Binary files differ
diff --git a/kstars/kstarslite/qml/images/tutorial-arrow-horizontal@3x.png b/kstars/kstarslite/qml/images/tutorial-arrow-horizontal@3x.png
new file mode 100644
index 0000000..6aa37a6
--- /dev/null
+++ b/kstars/kstarslite/qml/images/tutorial-arrow-horizontal@3x.png
Binary files differ
diff --git a/kstars/kstarslite/qml/images/tutorial-arrow-horizontal@4x.png b/kstars/kstarslite/qml/images/tutorial-arrow-horizontal@4x.png
new file mode 100644
index 0000000..060e9b5
--- /dev/null
+++ b/kstars/kstarslite/qml/images/tutorial-arrow-horizontal@4x.png
Binary files differ
diff --git a/kstars/kstarslite/qml/images/tutorial-arrow-vertical.png b/kstars/kstarslite/qml/images/tutorial-arrow-vertical.png
new file mode 100644
index 0000000..8f22798
--- /dev/null
+++ b/kstars/kstarslite/qml/images/tutorial-arrow-vertical.png
Binary files differ
diff --git a/kstars/kstarslite/qml/images/tutorial-arrow-vertical@2x.png b/kstars/kstarslite/qml/images/tutorial-arrow-vertical@2x.png
new file mode 100644
index 0000000..f49ef71
--- /dev/null
+++ b/kstars/kstarslite/qml/images/tutorial-arrow-vertical@2x.png
Binary files differ
diff --git a/kstars/kstarslite/qml/images/tutorial-arrow-vertical@3x.png b/kstars/kstarslite/qml/images/tutorial-arrow-vertical@3x.png
new file mode 100644
index 0000000..b05c2ce
--- /dev/null
+++ b/kstars/kstarslite/qml/images/tutorial-arrow-vertical@3x.png
Binary files differ
diff --git a/kstars/kstarslite/qml/images/tutorial-arrow-vertical@4x.png b/kstars/kstarslite/qml/images/tutorial-arrow-vertical@4x.png
new file mode 100644
index 0000000..6c51641
--- /dev/null
+++ b/kstars/kstarslite/qml/images/tutorial-arrow-vertical@4x.png
Binary files differ
diff --git a/kstars/kstarslite/qml/indi/INDIControlPanel.qml b/kstars/kstarslite/qml/indi/INDIControlPanel.qml
index 3751ad9..1c34cb5 100644
--- a/kstars/kstarslite/qml/indi/INDIControlPanel.qml
+++ b/kstars/kstarslite/qml/indi/INDIControlPanel.qml
@@ -14,7 +14,7 @@ KSPage {
Component.onCompleted: {
if(Qt.platform.os != "android") {
- ClientManagerLite.setHost("localhost", parseInt(7624))
+ //ClientManagerLite.setHost("localhost", parseInt(7624))
}
}
@@ -57,7 +57,7 @@ KSPage {
Layout.alignment: Qt.AlignHCenter
Layout.maximumWidth: parent.width*0.8
Layout.fillWidth: true
- text: ClientManagerLite.lastUsedServer()
+ text: ClientManagerLite.lastUsedServer
}
TextField {
@@ -66,7 +66,7 @@ KSPage {
Layout.alignment: Qt.AlignHCenter
Layout.maximumWidth: parent.width*0.2
Layout.fillWidth: true
- text: ClientManagerLite.lastUsedPort()
+ text: ClientManagerLite.lastUsedPort
}
}
}
@@ -84,8 +84,6 @@ KSPage {
if(!indiPage.connected) {
if(ClientManagerLite.setHost(ipHost.text, parseInt(portHost.text))) {
notification.showNotification(xi18n("Successfully connected to the server"))
- ClientManagerLite.setLastUsedServer(ipHost.text)
- ClientManagerLite.setLastUsedPort(portHost.text)
} else {
notification.showNotification(xi18n("Couldn't connect to the server"))
}
diff --git a/kstars/kstarslite/qml/main.qml b/kstars/kstarslite/qml/main.qml
index b5d84d0..f1d8ade 100644
--- a/kstars/kstarslite/qml/main.qml
+++ b/kstars/kstarslite/qml/main.qml
@@ -11,6 +11,8 @@ import "modules"
import "modules/helpers"
import "modules/popups"
import "modules/menus"
+import "modules/tutorial"
+
import "dialogs"
import "dialogs/menus"
@@ -33,7 +35,10 @@ ApplicationWindow {
signal loaded();
onIsLoadedChanged: {
- if(isLoaded) loaded()
+ if(isLoaded) {
+ loaded()
+ if(KStarsLite.runTutorial) tutorialPopup.open()
+ }
}
header: ToolBar {
@@ -149,6 +154,7 @@ ApplicationWindow {
Page {
id: initPage
title: "Sky Map"
+ padding: 0
Rectangle {
anchors.fill: parent
@@ -161,6 +167,7 @@ ApplicationWindow {
opacity. Each time we go from / to initPage this component is made invisible / visible and
skyMapLiteWrapper is anchored to fill null / parent*/
id: skyMapLite
+ anchors.fill: parent
}
//Popups
@@ -186,6 +193,18 @@ ApplicationWindow {
y: (window.height - height)/2
}
+ TutorialPopup {
+ id: tutorialPopup
+ x: (window.width - width)/2
+ y: (window.height - height)/2
+ }
+
+ TutorialExitPopup {
+ id: tutorialExitPopup
+ x: (window.width - width)/2
+ y: (window.height - height)/2
+ }
+
//Menus
ContextMenu {
id: contextMenu
@@ -199,7 +218,6 @@ ApplicationWindow {
y: (window.height - height)/2
}
-
Drawer {
id: globalDrawer
width: Math.min(window.width, window.height) / 4 * 2
@@ -248,11 +266,9 @@ ApplicationWindow {
onClicked: {
if(stackView.currentItem != model.objID) {
if(model.objID != initPage) {
- //skyMapLiteWrapper.visible = false
stackView.replace(null, [initPage, model.objID])
} else {
stackView.replace(null, initPage)
- //skyMapLiteWrapper.visible = true
}
globalDrawer.close()
}
@@ -275,6 +291,42 @@ ApplicationWindow {
}
}
+ //Study mode
+ property bool step1: false
+ property bool step2: false
+ property bool step3: false
+ property bool step4: false
+ property bool step5: false
+
+ function askExitTutorial() {
+ tutorialExitPopup.open()
+ }
+
+ function exitTutorial() {
+ KStarsLite.runTutorial = false
+ tutorialPopup.close()
+ step1 = false
+ step2 = false
+ step3 = false
+ step4 = false
+ step5 = false
+ }
+
+ //Step 1 - Global Drawer
+ TutorialStep1 {
+
+ }
+
+ //Step 2 - Context Drawer
+ TutorialStep2 {
+
+ }
+
+ //Step 5 - Location
+ TutorialStep5 {
+
+ }
+
Drawer {
id: contextDrawer
width: Math.min(window.width, window.height) / 4 * 2
diff --git a/kstars/kstarslite/qml/modules/BottomMenu.qml b/kstars/kstarslite/qml/modules/BottomMenu.qml
index 5f0059f..6e9eb66 100644
--- a/kstars/kstarslite/qml/modules/BottomMenu.qml
+++ b/kstars/kstarslite/qml/modules/BottomMenu.qml
@@ -11,11 +11,26 @@ import "helpers"
ColumnLayout {
id: bottomMenu
property int padding: 10
+
property double openOffset: bottomMenu.height - bottomBar.background.radius //Hide bottom round corners
property double closedOffset: arrowUp.height + padding
+ property string prevState
property bool isWindowWidthSmall: window.width < menuGrid.maxWidth
+ //Hide on slew
+ Connections {
+ target: SkyMapLite
+ onSlewingChanged: {
+ if(SkyMapLite.slewing) {
+ prevState = state
+ state = "hidden"
+ } else {
+ state = prevState
+ }
+ }
+ }
+
state: "closed"
spacing: padding
@@ -37,52 +52,60 @@ ColumnLayout {
target: bottomMenu
y: parent.height - closedOffset
}
+ },
+ State {
+ name: "hidden"
+ PropertyChanges {
+ target: bottomMenu
+ y: parent.height
+ }
}
]
transitions: [
Transition {
- from: "closed"; to: "open"
+ to: "open"
PropertyAnimation { target: bottomMenu
properties: "y"; duration: 300 }
},
Transition {
- from: "open"; to: "closed"
+ to: "closed"
PropertyAnimation { target: bottomMenu
properties: "y"; duration: 300 }
+ },
+ Transition {
+ to: "hidden"
+ PropertyAnimation { target: bottomMenu
+ properties: "y"; duration: 200 }
}
]
- Item {
- width: arrowUp.sourceSize.width/num.pixelRatio
- height: arrowUp.sourceSize.height/num.pixelRatio
- anchors.horizontalCenter: parent.horizontalCenter
+ Image {
+ id: arrowUp
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ }
+ state: "open"
+ source: "../images/arrow.png"
+ rotation: {
+ if(bottomMenu.state == "closed")
+ return 0
+ else if(bottomMenu.state == "open")
+ return 180
+ return rotation //If it state is "hidden" return current rotation
+ }
+ mirror: true // Make sure that arrows in both menus look symmetric
- Image {
- id: arrowUp
- anchors {
- fill: parent
- horizontalCenter: parent.horizontalCenter
- }
- state: "open"
- source: "../images/arrow.png"
- rotation: bottomMenu.state == "closed" ? 0 : 180
- mirror: true // Make sure that arrows in both menus look symmetric
-
- //transform: Rotation { axis { x: 1; y: 0; z: 0 } angle: 90 }
- //rotation: 180
-
- MouseArea {
- anchors.fill: parent
- onPressed: {
- bottomMenu.state = bottomMenu.state == "closed" ? "open" : "closed"
- }
+ MouseArea {
+ anchors.fill: parent
+ onPressed: {
+ bottomMenu.state = bottomMenu.state == "closed" ? "open" : "closed"
}
+ }
- Behavior on rotation {
- RotationAnimation {
- duration: 200; direction: RotationAnimation.Counterclockwise
- }
+ Behavior on rotation {
+ RotationAnimation {
+ duration: 200; direction: RotationAnimation.Counterclockwise
}
}
}
diff --git a/kstars/kstarslite/qml/modules/SkyMapLiteWrapper.qml b/kstars/kstarslite/qml/modules/SkyMapLiteWrapper.qml
index bc4e6f6..884c537 100644
--- a/kstars/kstarslite/qml/modules/SkyMapLiteWrapper.qml
+++ b/kstars/kstarslite/qml/modules/SkyMapLiteWrapper.qml
@@ -1,10 +1,10 @@
import QtQuick 2.6
import QtQuick.Controls 2.0
import "../constants" 1.0
+import "tutorial"
Item {
id: skyMapLiteItem
- anchors.fill: parent
visible: isLoaded
Rectangle {
@@ -41,6 +41,7 @@ Item {
}
}
+ /** Circle that appears after user taps on screen **/
Rectangle {
id: tapCircle
z: 1
@@ -74,12 +75,25 @@ Item {
}
}
+ TopMenu {
+ id: topMenu
+ }
+
+ //Step 3 - Top Menu
+ TutorialStep3 {
+ anchors{
+ top: topMenu.bottom
+ }
+ }
+
BottomMenu {
id: bottomMenu
}
-
- TopMenu {
- id: topMenu
+ //Step 4 - Bottom Menu
+ TutorialStep4 {
+ anchors{
+ bottom: bottomMenu.top
+ }
}
}
diff --git a/kstars/kstarslite/qml/modules/TimePage.qml b/kstars/kstarslite/qml/modules/TimePage.qml
index c3dfe7c..b030c14 100644
--- a/kstars/kstarslite/qml/modules/TimePage.qml
+++ b/kstars/kstarslite/qml/modules/TimePage.qml
@@ -535,7 +535,7 @@ KSPage {
}
onClicked: {
var date = new Date(userYear, userMonth, userDay, userHour, userMinutes)
- SimClock.setFromQDateTime(date)
+ KStarsLite.slotSetTime(date)
notification.showNotification("Setting time to " + date)
stackView.pop()
}
@@ -550,7 +550,7 @@ KSPage {
text: "Ok"
onClicked: {
var date = new Date(userYear, userMonth, userDay, userHour, userMinutes)
- SimClock.setFromQDateTime(date)
+ KStarsLite.slotSetTime(date)
notification.showNotification("Setting time to " + date)
stackView.pop()
}
diff --git a/kstars/kstarslite/qml/modules/TopMenu.qml b/kstars/kstarslite/qml/modules/TopMenu.qml
index 53d5b69..ebbfece 100644
--- a/kstars/kstarslite/qml/modules/TopMenu.qml
+++ b/kstars/kstarslite/qml/modules/TopMenu.qml
@@ -14,6 +14,19 @@ ColumnLayout {
property int padding: 10
property double openOffset: -topBar.background.radius //Hide top round corners
property double closedOffset: -topBar.height // Hide top bar when closed
+ property string prevState
+
+ Connections {
+ target: SkyMapLite
+ onSlewingChanged: {
+ if(SkyMapLite.slewing) {
+ prevState = state
+ state = "hidden"
+ } else {
+ state = prevState
+ }
+ }
+ }
state: "closed"
spacing: padding
@@ -37,19 +50,31 @@ ColumnLayout {
target: topMenu
y: closedOffset
}
+ },
+ State {
+ name: "hidden"
+ PropertyChanges {
+ target: topMenu
+ y: -topMenu.height
+ }
}
]
transitions: [
Transition {
- from: "closed"; to: "open"
+ to: "open"
PropertyAnimation { target: topMenu
properties: "y"; duration: 300 }
},
Transition {
- from: "open"; to: "closed"
+ to: "closed"
PropertyAnimation { target: topMenu
properties: "y"; duration: 300 }
+ },
+ Transition {
+ to: "hidden"
+ PropertyAnimation { target: topMenu
+ properties: "y"; duration: 200 }
}
]
@@ -216,37 +241,30 @@ ColumnLayout {
}
}
- Item {
- width: arrowDown.sourceSize.width/num.pixelRatio
- height: arrowDown.sourceSize.height/num.pixelRatio
- anchors.horizontalCenter: parent.horizontalCenter
+ Image {
+ id: arrowDown
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ }
+ state: "open"
+ source: "../images/arrow.png"
+ rotation: {
+ if(topMenu.state == "closed")
+ return 180
+ else if(topMenu.state == "open")
+ return 0
+ }
- Image {
- id: arrowDown
- anchors {
- fill: parent
- horizontalCenter: parent.horizontalCenter
- }
- width: sourceSize.width/num.pixelRatio
- height: sourceSize.height/num.pixelRatio
- state: "open"
- source: "../images/arrow.png"
- rotation: topMenu.state == "closed" ? 180 : 0
-
- //transform: Rotation { axis { x: 1; y: 0; z: 0 } angle: 90 }
- //rotation: 180
-
- MouseArea {
- anchors.fill: parent
- onPressed: {
- topMenu.state = topMenu.state == "closed" ? "open" : "closed"
- }
+ MouseArea {
+ anchors.fill: parent
+ onPressed: {
+ topMenu.state = topMenu.state == "closed" ? "open" : "closed"
}
+ }
- Behavior on rotation {
- RotationAnimation {
- duration: 200; direction: RotationAnimation.Counterclockwise
- }
+ Behavior on rotation {
+ RotationAnimation {
+ duration: 200; direction: RotationAnimation.Counterclockwise
}
}
}
diff --git a/kstars/kstarslite/qml/modules/tutorial/TutorialExitPopup.qml b/kstars/kstarslite/qml/modules/tutorial/TutorialExitPopup.qml
new file mode 100644
index 0000000..bb2f2e7
--- /dev/null
+++ b/kstars/kstarslite/qml/modules/tutorial/TutorialExitPopup.qml
@@ -0,0 +1,44 @@
+import QtQuick 2.7
+
+import QtQuick.Controls 2.0
+import QtQuick.Controls.Material 2.0
+import QtQuick.Controls.Universal 2.0
+
+import QtQuick.Window 2.2 as Window
+import QtQuick.Layouts 1.1
+
+Popup {
+ id: tutorialExit
+ focus: true
+ modal: true
+
+ ColumnLayout {
+ id: studyCol
+ width: parent.width
+ height: childrenRect.height
+
+ Text {
+ width: parent.width
+ wrapMode: Text.Wrap
+ horizontalAlignment: Text.AlignHCenter
+ text: xi18n("Are you sure you want to exit tutorial?")
+ }
+
+ RowLayout {
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ Button {
+ text: xi18n("Cancel")
+ onClicked: close()
+ }
+
+ Button {
+ text: xi18n("Yes")
+ onClicked: {
+ exitTutorial()
+ close()
+ }
+ }
+ }
+ }
+}
diff --git a/kstars/kstarslite/qml/modules/tutorial/TutorialPane.qml b/kstars/kstarslite/qml/modules/tutorial/TutorialPane.qml
new file mode 100644
index 0000000..894cb83
--- /dev/null
+++ b/kstars/kstarslite/qml/modules/tutorial/TutorialPane.qml
@@ -0,0 +1,54 @@
+import QtQuick 2.7
+
+import QtQuick.Controls 2.0
+import QtQuick.Controls.Material 2.0
+import QtQuick.Controls.Universal 2.0
+
+import QtQuick.Window 2.2 as Window
+import QtQuick.Layouts 1.1
+
+Pane {
+ property string title
+ property string description
+ signal nextClicked()
+ focus: true
+ Column {
+ width: parent.width
+ height: childrenRect.height
+
+ Label {
+ width: parent.width
+ wrapMode: Text.Wrap
+ horizontalAlignment: Text.AlignHCenter
+ text: title
+ font.pointSize: 20
+ }
+
+ Text {
+ width: parent.width
+ wrapMode: Text.Wrap
+ horizontalAlignment: Text.AlignHCenter
+ text: description
+ }
+
+ Flow {
+ property int buttonWidth: children[0].width + children[1].width + spacing * 2
+ width: parent.width > buttonWidth ? buttonWidth : parent.width
+ spacing: 5
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ Button {
+ text: xi18n("Exit")
+ onClicked: askExitTutorial()
+ }
+
+ Button {
+ text: xi18n("Next")
+ onClicked: {
+ nextClicked()
+ }
+ }
+ }
+ }
+}
+
diff --git a/kstars/kstarslite/qml/modules/tutorial/TutorialPopup.qml b/kstars/kstarslite/qml/modules/tutorial/TutorialPopup.qml
new file mode 100644
index 0000000..4b944c9
--- /dev/null
+++ b/kstars/kstarslite/qml/modules/tutorial/TutorialPopup.qml
@@ -0,0 +1,64 @@
+import QtQuick 2.7
+
+import QtQuick.Controls 2.0
+import QtQuick.Controls.Material 2.0
+import QtQuick.Controls.Universal 2.0
+
+import QtQuick.Window 2.2 as Window
+import QtQuick.Layouts 1.1
+
+Popup {
+ id: studyMode
+ contentWidth: parent.width * 0.75
+
+ focus: true
+ modal: true
+
+ Column {
+ id: studyCol
+ width: parent.width
+ height: childrenRect.height
+
+ Label {
+ width: parent.width
+ wrapMode: Text.Wrap
+ horizontalAlignment: Text.AlignHCenter
+ text: xi18n("Welcome to KStars Lite!")
+ font.pointSize: 20
+ }
+
+ Text {
+ width: parent.width
+ wrapMode: Text.Wrap
+ horizontalAlignment: Text.AlignHCenter
+ text: xi18n("KStars Lite is a free, open source, cross-platform Astronomy Software designed for mobile devices.")
+ }
+
+ Text {
+ width: parent.width
+ wrapMode: Text.Wrap
+ horizontalAlignment: Text.AlignHCenter
+ text: xi18n("A quick tutorial will introduce you to main functions of KStars Lite")
+ }
+
+ Flow {
+ property int buttonWidth: children[0].width + children[1].width + spacing * 2
+ width: parent.width > buttonWidth ? buttonWidth : parent.width
+ spacing: 5
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ Button {
+ text: xi18n("Close")
+ onClicked: askExitTutorial()
+ }
+
+ Button {
+ text: xi18n("Start tutorial")
+ onClicked: {
+ studyMode.close()
+ step1 = true
+ }
+ }
+ }
+ }
+}
diff --git a/kstars/kstarslite/qml/modules/tutorial/TutorialStep1.qml b/kstars/kstarslite/qml/modules/tutorial/TutorialStep1.qml
new file mode 100644
index 0000000..274bba6
--- /dev/null
+++ b/kstars/kstarslite/qml/modules/tutorial/TutorialStep1.qml
@@ -0,0 +1,39 @@
+import QtQuick 2.7
+
+import QtQuick.Controls 2.0
+import QtQuick.Controls.Material 2.0
+import QtQuick.Controls.Universal 2.0
+
+import QtQuick.Window 2.2 as Window
+import QtQuick.Layouts 1.1
+
+RowLayout {
+ signal stepFinished()
+
+ visible: step1
+ anchors {
+ left: parent.left
+ verticalCenter: parent.verticalCenter
+ right: parent.right
+ }
+
+ Image {
+ id: arrow
+ source: "../../images/tutorial-arrow-horizontal.png"
+ }
+
+ TutorialPane {
+ anchors{
+ left: arrow.right
+ verticalCenter: arrow.verticalCenter
+ }
+
+ contentWidth: (parent.width - arrow.width) * 0.75
+ title: xi18n("Global Drawer")
+ description: xi18n("By swiping from left to right on any page of KStars Lite you can access global drawer")
+ onNextClicked: {
+ step1 = false
+ step2 = true
+ }
+ }
+}
diff --git a/kstars/kstarslite/qml/modules/tutorial/TutorialStep2.qml b/kstars/kstarslite/qml/modules/tutorial/TutorialStep2.qml
new file mode 100644
index 0000000..7801332
--- /dev/null
+++ b/kstars/kstarslite/qml/modules/tutorial/TutorialStep2.qml
@@ -0,0 +1,39 @@
+import QtQuick 2.7
+
+import QtQuick.Controls 2.0
+import QtQuick.Controls.Material 2.0
+import QtQuick.Controls.Universal 2.0
+
+import QtQuick.Window 2.2 as Window
+import QtQuick.Layouts 1.1
+
+RowLayout {
+ visible: step2
+ anchors {
+ left: parent.left
+ verticalCenter: parent.verticalCenter
+ right: parent.right
+ }
+
+ TutorialPane {
+ anchors{
+ right: arrow.left
+ verticalCenter: arrow.verticalCenter
+ }
+
+ contentWidth: (parent.width - arrow.width) * 0.75
+ title: xi18n("Context Drawer")
+ description: xi18n("By swiping from right to left you can access context drawer with functions related to Sky Map. This menu is available only on Sky Map.")
+
+ onNextClicked: {
+ step2 = false
+ step3 = true
+ }
+ }
+
+ Image {
+ id: arrow
+ rotation: 180
+ source: "../../images/tutorial-arrow-horizontal.png"
+ }
+}
diff --git a/kstars/kstarslite/qml/modules/tutorial/TutorialStep3.qml b/kstars/kstarslite/qml/modules/tutorial/TutorialStep3.qml
new file mode 100644
index 0000000..188fdf5
--- /dev/null
+++ b/kstars/kstarslite/qml/modules/tutorial/TutorialStep3.qml
@@ -0,0 +1,35 @@
+import QtQuick 2.7
+
+import QtQuick.Controls 2.0
+import QtQuick.Controls.Material 2.0
+import QtQuick.Controls.Universal 2.0
+
+import QtQuick.Window 2.2 as Window
+import QtQuick.Layouts 1.1
+
+ColumnLayout {
+ visible: step3
+ anchors {
+ left: parent.left
+ right: parent.right
+ }
+
+ Image {
+ rotation: 180
+ source: "../../images/tutorial-arrow-vertical.png"
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+
+ TutorialPane {
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ contentWidth: parent.width * 0.75
+ title: xi18n("Top Menu")
+ description: xi18n("By tapping on this arrow you can access top menu from which you can control visibility of different sky objects")
+
+ onNextClicked: {
+ step3 = false
+ step4 = true
+ }
+ }
+}
diff --git a/kstars/kstarslite/qml/modules/tutorial/TutorialStep4.qml b/kstars/kstarslite/qml/modules/tutorial/TutorialStep4.qml
new file mode 100644
index 0000000..7e4edf5
--- /dev/null
+++ b/kstars/kstarslite/qml/modules/tutorial/TutorialStep4.qml
@@ -0,0 +1,36 @@
+
+import QtQuick 2.7
+
+import QtQuick.Controls 2.0
+import QtQuick.Controls.Material 2.0
+import QtQuick.Controls.Universal 2.0
+
+import QtQuick.Window 2.2 as Window
+import QtQuick.Layouts 1.1
+
+ColumnLayout {
+ visible: step4
+ spacing: 10
+ anchors {
+ left: parent.left
+ right: parent.right
+ }
+
+ TutorialPane {
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ contentWidth: parent.width * 0.75
+ title: xi18n("Bottom Menu")
+ description: xi18n("By tapping on this arrow you can access bottom menu from which you can set time and start time simulation")
+
+ onNextClicked: {
+ step4 = false
+ step5 = true
+ }
+ }
+
+ Image {
+ source: "../../images/tutorial-arrow-vertical.png"
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+}
diff --git a/kstars/kstarslite/qml/modules/tutorial/TutorialStep5.qml b/kstars/kstarslite/qml/modules/tutorial/TutorialStep5.qml
new file mode 100644
index 0000000..b20d640
--- /dev/null
+++ b/kstars/kstarslite/qml/modules/tutorial/TutorialStep5.qml
@@ -0,0 +1,26 @@
+import QtQuick 2.7
+
+import QtQuick.Controls 2.0
+import QtQuick.Controls.Material 2.0
+import QtQuick.Controls.Universal 2.0
+
+import QtQuick.Window 2.2 as Window
+import QtQuick.Layouts 1.1
+
+TutorialPane {
+ visible: step5
+ anchors.centerIn: parent
+
+ contentWidth: parent.width * 0.75
+ title: xi18n("Set Location")
+ description: xi18n("Congratulations with your first steps in KStars Lite! Your tutorial is almost
+ over. The last step to do is to set your location (you can do that either manually or from GPS).
+ Click next to proceed.")
+
+ onNextClicked: {
+ step5 = false
+ stackView.push(locationDialog)
+ //Finish tutorial
+ exitTutorial()
+ }
+}
diff --git a/kstars/kstarslite/skyitems/deepskyitem.cpp b/kstars/kstarslite/skyitems/deepskyitem.cpp
index 0e5ebfb..0a3273b 100644
--- a/kstars/kstarslite/skyitems/deepskyitem.cpp
+++ b/kstars/kstarslite/skyitems/deepskyitem.cpp
@@ -202,7 +202,6 @@ void DeepSkyItem::updateDeepSkyNode(DSOIndexNode *indexNode, bool drawObject, Me
double lgz = log10(Options::zoomFactor());
if ( lgz <= 0.75 * lgmax )
maglim -= (Options::magLimitDrawDeepSky() - Options::magLimitDrawDeepSkyZoomOut() )*(0.75*lgmax - lgz)/(0.75*lgmax - lgmin);
- double m_zoomMagLimit = maglim;
double labelMagLim = Options::deepSkyLabelDensity();
labelMagLim += ( Options::magLimitDrawDeepSky() - labelMagLim ) * ( lgz - lgmin) / (lgmax - lgmin );
@@ -210,7 +209,7 @@ void DeepSkyItem::updateDeepSkyNode(DSOIndexNode *indexNode, bool drawObject, Me
//DrawID drawID = m_skyMesh->drawID();
- int regionID = -1;
+ uint regionID = 0;
if(region->hasNext()) {
regionID = region->next();
}
diff --git a/kstars/kstarslite/skyitems/deepskyitem.h b/kstars/kstarslite/skyitems/deepskyitem.h
index 8df8f3d..fb7ed03 100644
--- a/kstars/kstarslite/skyitems/deepskyitem.h
+++ b/kstars/kstarslite/skyitems/deepskyitem.h
@@ -25,8 +25,8 @@ class DSOIndexNode : public SkyOpacityNode {
public:
DSOIndexNode(DeepSkyIndex *index, LabelsItem::label_t labelType, QString colorString);
- QSGNode *m_trixels;
DeepSkyIndex *m_index;
+ QSGNode *m_trixels;
LabelsItem::label_t m_labelType;
QString schemeColor;
diff --git a/kstars/kstarslite/skyitems/rootnode.cpp b/kstars/kstarslite/skyitems/rootnode.cpp
index 92990e8..4020837 100644
--- a/kstars/kstarslite/skyitems/rootnode.cpp
+++ b/kstars/kstarslite/skyitems/rootnode.cpp
@@ -184,10 +184,6 @@ QSGTexture* RootNode::getCachedTexture(int size, char spType) {
void RootNode::updateClipPoly() {
QPolygonF newClip = m_skyMapLite->projector()->clipPoly();
m_clipPoly = newClip;
-/* if(m_clipPoly != newClip) {
- } else {
- return; //We don't need to triangulate polygon and update geometry if polygon wasn't changed
- }*/
const int size = m_clipPoly.size();
if(!m_clipGeometry) {
@@ -196,12 +192,7 @@ void RootNode::updateClipPoly() {
m_clipGeometry->setDrawingMode(GL_TRIANGLE_FAN);
setGeometry(m_clipGeometry);
setFlag(QSGNode::OwnsGeometry);
- /*m_visualizeClipping = new QSGGeometryNode;
- m_visualizeClipping->setGeometry(m_clipGeometry);
- QSGFlatColorMaterial *material = new QSGFlatColorMaterial;
- material->setColor(QColor("red"));
- m_visualizeClipping->setMaterial(material);
- appendChildNode(m_visualizeClipping);*/
+
}
m_clipGeometry->allocate(size);
diff --git a/kstars/kstarslite/skyitems/skynodes/horizonnode.h b/kstars/kstarslite/skyitems/skynodes/horizonnode.h
index 70b3e9f..db540cf 100644
--- a/kstars/kstarslite/skyitems/skynodes/horizonnode.h
+++ b/kstars/kstarslite/skyitems/skynodes/horizonnode.h
@@ -32,8 +32,8 @@ public:
virtual void hide() override;
private:
- PolyNode *m_polygonNode;
QList<SkyPoint*>& m_pointList;
+ PolyNode *m_polygonNode;
};
diff --git a/kstars/kstarslite/skyitems/skynodes/nodes/polynode.cpp b/kstars/kstarslite/skyitems/skynodes/nodes/polynode.cpp
index fae6b9f..cec2879 100644
--- a/kstars/kstarslite/skyitems/skynodes/nodes/polynode.cpp
+++ b/kstars/kstarslite/skyitems/skynodes/nodes/polynode.cpp
@@ -29,8 +29,7 @@ extern "C"
}
PolyNode::PolyNode()
- :m_geometryNode(new QSGGeometryNode), m_geometry(0),
- m_material(new QSGFlatColorMaterial)
+ :m_geometryNode(new QSGGeometryNode), m_material(new QSGFlatColorMaterial)
{
m_geometry = new QSGGeometry (QSGGeometry::defaultAttributes_Point2D(),0);
m_geometryNode->setGeometry(m_geometry);
@@ -107,5 +106,4 @@ void PolyNode::updateGeometry(const QPolygonF &polygon, bool filled) {
if (tris_out) free(tris_out);
}
m_geometryNode->markDirty(QSGNode::DirtyGeometry);
-
}
diff --git a/kstars/kstarslite/skyitems/skynodes/satellitenode.h b/kstars/kstarslite/skyitems/skynodes/satellitenode.h
index 6d63c88..29c8732 100644
--- a/kstars/kstarslite/skyitems/skynodes/satellitenode.h
+++ b/kstars/kstarslite/skyitems/skynodes/satellitenode.h
@@ -33,12 +33,10 @@ public:
SatelliteNode(Satellite* sat, RootNode *rootNode);
void update();
- //virtual void hide() override;
+ virtual void hide() override;
void initLines();
void initPoint();
- void hide();
-
void changePos(QPointF pos);
inline Satellite *sat() { return m_sat; }
diff --git a/kstars/kstarslite/skyitems/skynodes/skypolygonnode.cpp b/kstars/kstarslite/skyitems/skynodes/skypolygonnode.cpp
index e0bf2d1..00e0d30 100644
--- a/kstars/kstarslite/skyitems/skynodes/skypolygonnode.cpp
+++ b/kstars/kstarslite/skyitems/skynodes/skypolygonnode.cpp
@@ -22,7 +22,7 @@
SkyPolygonNode::SkyPolygonNode(LineList* list)
:m_list(list), m_polygonNode(new PolyNode)
{
- addChildNode(m_polygonNode);
+ //addChildNode(m_polygonNode);
}
void SkyPolygonNode::update(bool forceClip) {
diff --git a/kstars/skycomponents/deepskycomponent.cpp b/kstars/skycomponents/deepskycomponent.cpp
index 78136ad..bffb6f4 100644
--- a/kstars/skycomponents/deepskycomponent.cpp
+++ b/kstars/skycomponents/deepskycomponent.cpp
@@ -377,11 +377,11 @@ void DeepSkyComponent::appendIndex( DeepSkyObject *o, DeepSkyIndex* dsIndex, Tri
void DeepSkyComponent::draw( SkyPainter *skyp )
{
+#ifndef KSTARS_LITE
if ( ! selected() ) return;
bool drawFlag;
-#ifndef KSTARS_LITE
drawFlag = Options::showMessier() &&
! ( Options::hideOnSlew() && Options::hideMessier() && SkyMap::IsSlewing() );
@@ -401,6 +401,8 @@ void DeepSkyComponent::draw( SkyPainter *skyp )
! ( Options::hideOnSlew() && Options::hideOther() && SkyMap::IsSlewing() );
drawDeepSkyCatalog( skyp, drawFlag, &m_OtherIndex, "NGCColor" );
+#else
+ Q_UNUSED(skyp)
#endif
}
diff --git a/kstars/skycomponents/skymapcomposite.cpp b/kstars/skycomponents/skymapcomposite.cpp
index c4967f7..1111fd3 100644
--- a/kstars/skycomponents/skymapcomposite.cpp
+++ b/kstars/skycomponents/skymapcomposite.cpp
@@ -231,6 +231,7 @@ void SkyMapComposite::updateMoons(KSNumbers *num )
//should appear "behind" others should be drawn first.
void SkyMapComposite::draw( SkyPainter *skyp )
{
+ Q_UNUSED(skyp)
#ifndef KSTARS_LITE
SkyMap *map = SkyMap::Instance();
diff --git a/kstars/skycomponents/syncedcatalogcomponent.cpp b/kstars/skycomponents/syncedcatalogcomponent.cpp
index 74e78ec..7d67a5d 100644
--- a/kstars/skycomponents/syncedcatalogcomponent.cpp
+++ b/kstars/skycomponents/syncedcatalogcomponent.cpp
@@ -92,10 +92,12 @@ DeepSkyObject *SyncedCatalogComponent::addObject( CatalogEntryData catalogEntry
if( newObj->hasLongName() ) {
// newObj->setName( newObj->longname() );
objectNames()[ newObj->type() ].append( newObj->longname() );
+ objectLists()[ newObj->type() ].append( QPair<QString, const SkyObject *>(newObj->longname(), newObj) );
}
else {
qWarning() << "Created object with name " << newObj->name() << " which is probably fake!";
objectNames()[ newObj->type() ].append( newObj->name() );
+ objectLists()[ newObj->type() ].append( QPair<QString, const SkyObject *>(newObj->name(), newObj) );
}
m_ObjectList.append( newObj );
qDebug() << "Added new SkyObject " << newObj->name() << " to synced catalog " << m_catName << " which now contains " << m_ObjectList.count() << " objects.";
diff --git a/kstars/skymaplite.cpp b/kstars/skymaplite.cpp
index 437b654..b2582d1 100644
--- a/kstars/skymaplite.cpp
+++ b/kstars/skymaplite.cpp
@@ -114,7 +114,7 @@ SkyMapLite::SkyMapLite()
midMouseButtonDown = false;
mouseButtonDown = false;
- slewing = false;
+ setSlewing(false);
clockSlewing = false;
ClickedObject = NULL;
@@ -153,13 +153,13 @@ void SkyMapLite::setUpdateCounter() {
m_updatesCountTemp = 0;
}
-void SkyMapLite::addTelescope(TelescopeLite *) {
+//void SkyMapLite::addTelescope(TelescopeLite *) {
-}
+//}
-void SkyMapLite::removeDevice(QString device) {
+//void SkyMapLite::removeDevice(QString device) {
-}
+//}
QSGNode* SkyMapLite::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData) {
Q_UNUSED(updatePaintNodeData);
@@ -277,7 +277,7 @@ void SkyMapLite::setFocusAltAz( const dms &alt, const dms &az) {
focus()->setAz(az);
focus()->HorizontalToEquatorial( data->lst(), data->geo()->lat() );
- slewing = false;
+ setSlewing(false);
forceUpdate(); //need a total update, or slewing with the arrow keys doesn't work.
}
@@ -426,7 +426,7 @@ void SkyMapLite::slewFocus() {
focus()->EquatorialToHorizontal( data->lst(), data->geo()->lat() );
}
- slewing = true;
+ setSlewing(true);
forceUpdate();
qApp->processEvents(); //keep up with other stuff
@@ -463,7 +463,7 @@ void SkyMapLite::slewFocus() {
focus()->EquatorialToHorizontal( data->lst(), data->geo()->lat() );
}
- slewing = false;
+ setSlewing(false);
//Turn off snapNextFocus, we only want it to happen once
if ( data->snapNextFocus() ) {
@@ -614,7 +614,7 @@ void SkyMapLite::slotUpdateSky( bool now ) {
}
void SkyMapLite::updateFocus() {
- if( slewing )
+ if( getSlewing() )
return;
//Tracking on an object
@@ -714,7 +714,7 @@ void SkyMapLite::setMouseMoveCursor()
}
bool SkyMapLite::isSlewing() const {
- return (slewing || ( clockSlewing && data->clock()->isActive() ) );
+ return (getSlewing() || ( clockSlewing && data->clock()->isActive() ) );
}
int SkyMapLite::harvardToIndex(char c) {
@@ -797,6 +797,13 @@ void SkyMapLite::setFOVVisible(int index, bool visible) {
}
}
+void SkyMapLite::setSlewing(bool newSlewing) {
+ if(m_slewing != newSlewing) {
+ m_slewing = newSlewing;
+ emit slewingChanged(newSlewing);
+ }
+}
+
void SkyMapLite::initStarImages()
{
if(isInitialized) {
diff --git a/kstars/skymaplite.h b/kstars/skymaplite.h
index 6a54af5..fb19834 100644
--- a/kstars/skymaplite.h
+++ b/kstars/skymaplite.h
@@ -80,6 +80,7 @@ class SkyMapLite : public QQuickItem {
Q_PROPERTY(SkyPointLite *clickedPointLite READ getClickedPointLite NOTIFY pointLiteChanged)
Q_PROPERTY(SkyObjectLite *clickedObjectLite READ getClickedObjectLite NOTIFY objectLiteChanged)
Q_PROPERTY(QStringList FOVSymbols READ getFOVSymbols NOTIFY symbolsFOVChanged)
+ Q_PROPERTY(bool slewing READ getSlewing WRITE setSlewing NOTIFY slewingChanged)
protected:
/**
*Constructor.
@@ -359,10 +360,20 @@ public:
SkyObjectLite *getClickedObjectLite() { return m_ClickedObjectLite; }
/**
- *@short Proxy method for SkyMapDrawAbstract::drawObjectLabels()
+ * @short Proxy method for SkyMapDrawAbstract::drawObjectLabels()
*/
//inline void drawObjectLabels( QList< SkyObject* >& labelObjects ) { dynamic_cast<SkyMapDrawAbstract *>(m_SkyMapDraw)->drawObjectLabels( labelObjects ); }
+ /**
+ * @return true if SkyMapLite is being slewed
+ */
+ bool getSlewing() const { return m_slewing; }
+
+ /**
+ * @short sets whether SkyMapLite is being slewed
+ */
+ void setSlewing(bool newSlewing);
+
/*void setPreviewLegend(bool preview) { m_previewLegend = preview; }
void setLegend(const Legend &legend) { m_legend = legend; }
@@ -525,6 +536,9 @@ signals:
/** Emitted when FOVSymbols list was changed (new value appended) **/
void symbolsFOVChanged(QStringList);
+ /** Emitted when SkyMapLite is being slewed or slewing is finished **/
+ void slewingChanged(bool);
+
protected:
/** Process keystrokes:
* @li arrow keys Slew the map
@@ -594,11 +608,11 @@ private slots:
/** resets updates counter **/
void setUpdateCounter();
- /** adds telescope to TelescopeSymbolsItem **/
- void addTelescope(TelescopeLite *);
+// /** adds telescope to TelescopeSymbolsItem **/
+// void addTelescope(TelescopeLite *);
- /** deletes all device-related SkyItems or SkyNodes **/
- void removeDevice(QString device);
+// /** deletes all device-related SkyItems or SkyNodes **/
+// void removeDevice(QString device);
private:
@@ -649,7 +663,8 @@ private:
bool mouseButtonDown, midMouseButtonDown;
// true if mouseMoveEvent; needed by setMouseMoveCursor
bool mouseMoveCursor;
- bool slewing, clockSlewing;
+ bool m_slewing;
+ bool clockSlewing;
// true if pinch to zoom or pinch to rotate is performed
bool pinch;
//if false only old pixmap will repainted with bitBlt(), this
diff --git a/kstars/skymapliteevents.cpp b/kstars/skymapliteevents.cpp
index 31909db..34a45c4 100644
--- a/kstars/skymapliteevents.cpp
+++ b/kstars/skymapliteevents.cpp
@@ -15,14 +15,12 @@
#include <QTapSensor>
void SkyMapLite::mousePressEvent( QMouseEvent *e ) {
- KStarsLite* kstars = KStarsLite::Instance();
-
- /*if ( ( e->modifiers() & Qt::ControlModifier ) && (e->button() == Qt::LeftButton) ) {
+ if ( ( e->modifiers() & Qt::ControlModifier ) && (e->button() == Qt::LeftButton) ) {
ZoomRect.moveCenter( e->pos() );
setZoomMouseCursor();
update(); //refresh without redrawing skymap
return;
- }*/
+ }
// if button is down and cursor is not moved set the move cursor after 500 ms
QTimer::singleShot(500, this, SLOT (setMouseMoveCursor()));
@@ -34,7 +32,6 @@ void SkyMapLite::mousePressEvent( QMouseEvent *e ) {
y0 = 0.5*height() - e->y(); //record y pixel coordinate for middle-button zooming
midMouseButtonDown = true;
}
-
if ( !mouseButtonDown ) {
if ( e->button() == Qt::LeftButton ) {
mouseButtonDown = true;
@@ -46,7 +43,6 @@ void SkyMapLite::mousePressEvent( QMouseEvent *e ) {
//Find object nearest to clickedPoint()
double maxrad = 1000.0/Options::zoomFactor();
- double zoom = Options::zoomFactor();
SkyObject* obj = data->skyComposite()->objectNearest( clickedPoint(), maxrad );
setClickedObject( obj );
if( obj )
@@ -109,8 +105,8 @@ void SkyMapLite::mouseReleaseEvent( QMouseEvent * ) {
//false if double-clicked, because it's unset there.
if (mouseButtonDown) {
mouseButtonDown = false;
- if ( slewing ) {
- slewing = false;
+ if ( getSlewing() ) {
+ setSlewing(false);
if ( Options::useAltAz() )
setDestinationAltAz( focus()->alt(), focus()->az() );
else
@@ -182,12 +178,11 @@ void SkyMapLite::mouseMoveEvent( QMouseEvent *e ) {
slotZoomOut();
}
}
-
if ( mouseButtonDown ) {
- // set the mouseMoveCursor and set slewing=true, if they are not set yet
+ // set the mouseMoveCursor and set slewing to true, if they are not set yet
if( !mouseMoveCursor ) setMouseMoveCursor();
- if( !slewing ) {
- slewing = true;
+ if( !getSlewing() ) {
+ setSlewing(true);
stopTracking(); //toggle tracking off
}
@@ -240,14 +235,14 @@ void SkyMapLite::wheelEvent( QWheelEvent *e ) {
void SkyMapLite::touchEvent( QTouchEvent *e) {
QList<QTouchEvent::TouchPoint> points = e->touchPoints();
-
if(points.length() == 2) {
+ //Set tapBegan to false because user doesn't tap but either pans or pinches to zoom
+ tapBegan = false;
if ( projector()->unusablePoint( points[0].pos() ) ||
projector()->unusablePoint( points[1].pos() ))
return;
//Pinch to zoom
-
double x_old_diff = abs(points[1].lastPos().x() - points[0].lastPos().x());
double y_old_diff = abs(points[1].lastPos().y() - points[0].lastPos().y());
@@ -318,7 +313,7 @@ void SkyMapLite::touchEvent( QTouchEvent *e) {
mouseMoveEvent(event);
if( e->touchPointStates() & Qt::TouchPointReleased ) {
- slewing = false;
+ setSlewing(false);
if(pinch) {
pinch = false;
mouseButtonDown = false;
@@ -326,51 +321,54 @@ void SkyMapLite::touchEvent( QTouchEvent *e) {
}
delete event;
-
} else if (points.length() == 1 && !pinch) {
+ QPointF point = points[0].screenPos();
+ //Set clicked point (needed for pan)
+ if(e->type() == QEvent::TouchBegin) {
+ m_MousePoint = projector()->fromScreen( point, data->lst(), data->geo()->lat() );
+ setClickedPoint( &m_MousePoint );
+ mouseButtonDown = true;
+ } else if(e->type() == QEvent::TouchEnd) {
+ mouseButtonDown = false;
+ if ( getSlewing() ) {
+ setSlewing(false);
+ if ( Options::useAltAz() )
+ setDestinationAltAz( focus()->alt(), focus()->az() );
+ else
+ setDestination( *focus() );
+ }
+ }
+
if ( !projector()->unusablePoint( points[0].screenPos() ) ) {
if( !tapBegan && (e->touchPointStates() & Qt::TouchPointPressed) ) {
+ //We set tapBegan to true whenever user tapped on the screen
tapBegan = true;
- } else if(e->touchPointStates() & Qt::TouchPointMoved || slewing) {
- QPointF newFocus = points[0].screenPos();
+ } else if((e->touchPointStates() & Qt::TouchPointMoved) || getSlewing()) {
+ //Set tapBegan to false because user doesn't tap but either pans or pinches to zoom
tapBegan = false;
- QMouseEvent *event = new QMouseEvent(QEvent::MouseButtonPress, newFocus,
+ QMouseEvent *event = new QMouseEvent(QEvent::MouseButtonPress, point,
Qt::LeftButton, Qt::LeftButton, Qt::ControlModifier);
- if(e->type() == QEvent::TouchBegin) {
- if(mouseButtonDown) mouseButtonDown = false;
- }
- mousePressEvent(event);
mouseMoveEvent(event);
- if(e->type() == QEvent::TouchEnd) {
- if (mouseButtonDown) {
- mouseButtonDown = false;
- if ( slewing ) {
- slewing = false;
- if ( Options::useAltAz() )
- setDestinationAltAz( focus()->alt(), focus()->az() );
- else
- setDestination( *focus() );
- }
- }
- }
+
delete event;
- } else if((e->touchPointStates() & Qt::TouchPointReleased) && tapBegan ) { //&& !slewing && points.length() == 1) {
- if(slewing) slewing = false;
+
+ //If user didn't pan and pinch to zoom tapBegan will be true
+ } else if((e->touchPointStates() & Qt::TouchPointReleased) && tapBegan ) {
+ if(getSlewing()) setSlewing(false);
tapBegan = false;
//Show tap animation
- emit posClicked(points[0].screenPos());
+ emit posClicked(point);
//determine RA, Dec of touch
- m_MousePoint = projector()->fromScreen( points[0].screenPos() , data->lst(), data->geo()->lat() );
+ m_MousePoint = projector()->fromScreen( point , data->lst(), data->geo()->lat() );
setClickedPoint( &m_MousePoint );
//Find object nearest to clickedPoint()
double maxrad = 1000.0/Options::zoomFactor(); /* On high zoom-level it is very hard to select the object using touch screen.
That's why radius remains constant*/
maxrad = qMax(maxrad,2.5);
- qDebug() << maxrad << "maxrad";
SkyObject* obj = data->skyComposite()->objectNearest( clickedPoint(), maxrad );
setClickedObject( obj );
if( obj ) setClickedPoint( obj );
diff --git a/kstars/time/simclock.cpp b/kstars/time/simclock.cpp
index 64bc893..ff226c7 100644
--- a/kstars/time/simclock.cpp
+++ b/kstars/time/simclock.cpp
@@ -153,14 +153,7 @@ void SimClock::setUTC(const KStarsDateTime &newtime) {
qDebug() << "Cannot set SimClock: Invalid Date/Time.";
}
}
-#ifdef KSTARS_LITE
-void SimClock::setFromQDateTime(const QDateTime &dateTime) {
- KStarsDateTime dt;
- dt.setDate(dateTime.date());
- dt.setTime(dateTime.time());
- setUTC(dt);
-}
-#endif
+
void SimClock::setClockScale(float s) {
if (Scale != s ) {
qDebug() << "New clock scale: " << s << " sec";
diff --git a/kstars/time/simclock.h b/kstars/time/simclock.h
index 416ef77..317bb8c 100644
--- a/kstars/time/simclock.h
+++ b/kstars/time/simclock.h
@@ -99,9 +99,6 @@ public Q_SLOTS:
/** Function to set the time of the SimClock. */
void setUTC(const KStarsDateTime &newtime);
- /** Sets time and date from QDateTime **/
- Q_INVOKABLE void setFromQDateTime(const QDateTime &dateTime);
-
/** Function to set scale of simclock. */
void setClockScale(float s);
#endif