diff --git a/kstars/CMakeLists.txt b/kstars/CMakeLists.txt index 1cfa14766..666dd7414 100644 --- a/kstars/CMakeLists.txt +++ b/kstars/CMakeLists.txt @@ -1,1178 +1,1179 @@ add_subdirectory( data ) add_subdirectory( icons ) add_subdirectory( htmesh ) if (${KF5_VERSION} VERSION_EQUAL 5.18.0 OR ${KF5_VERSION} VERSION_GREATER 5.18.0) SET(HAVE_KF5WIT 1) # if(NOT BUILD_KSTARS_LITE) # add_subdirectory( tools/whatsinteresting/qml) # endif(NOT BUILD_KSTARS_LITE) else() SET(HAVE_KF5WIT 0) endif() if (ANDROID AND CMAKE_TOOLCHAIN_FILE) include(${CMAKE_TOOLCHAIN_FILE}) endif () if (NOT ANDROID) find_package(ZLIB REQUIRED) find_package(Threads REQUIRED) endif () if(MSVC) add_definitions(-D_USE_MATH_DEFINES=1) add_definitions(-DNOMINMAX) endif() include_directories( ${kstars_SOURCE_DIR}/kstars ${kstars_SOURCE_DIR}/kstars/skyobjects ${kstars_SOURCE_DIR}/kstars/skycomponents ${kstars_SOURCE_DIR}/kstars/auxiliary ${kstars_SOURCE_DIR}/kstars/time ${kstars_SOURCE_DIR}/kstars/tools ) if (INDI_FOUND) if(BUILD_KSTARS_LITE) set (fits_klite_SRCS fitsviewer/fitsdata.cpp ) set (fits2_klite_SRCS fitsviewer/bayer.c fitsviewer/fpack.c fitsviewer/fpackutil.c ) include_directories(${CFITSIO_INCLUDE_DIR}) include_directories(${NOVA_INCLUDE_DIR}) set (indi_klite_SRCS indi/clientmanagerlite.cpp indi/inditelescopelite.cpp kstarslite/skyitems/skynodes/crosshairnode.cpp kstarslite/skyitems/telescopesymbolsitem.cpp ) endif () set(indiui_SRCS indi/streamform.ui indi/drivermanager.ui indi/opsindi.ui indi/indihostconf.ui indi/customdrivers.ui #indi/telescopewizard.ui ) set(indi_SRCS indi/drivermanager.cpp indi/servermanager.cpp indi/clientmanager.cpp indi/blobmanager.cpp indi/guimanager.cpp indi/driverinfo.cpp indi/deviceinfo.cpp indi/indidevice.cpp indi/indigroup.cpp indi/indiproperty.cpp indi/indielement.cpp indi/indistd.cpp indi/indilistener.cpp indi/inditelescope.cpp indi/indiccd.cpp indi/indifocuser.cpp indi/indifilter.cpp indi/indidome.cpp indi/indiweather.cpp indi/indicap.cpp indi/indilightbox.cpp indi/indidbus.cpp indi/opsindi.cpp #indi/telescopewizardprocess.cpp indi/streamwg.cpp indi/videowg.cpp indi/indiwebmanager.cpp indi/customdrivers.cpp ) if (CFITSIO_FOUND) set(ekosui_SRCS ekos/opsekos.ui ekos/manager.ui ekos/profileeditor.ui ekos/profilewizard.ui # Scheduler ekos/scheduler/scheduler.ui ekos/scheduler/mosaic.ui # Capture ekos/capture/capture.ui ekos/capture/calibrationoptions.ui ekos/capture/dslrinfo.ui ekos/capture/rotatorsettings.ui ekos/capture/customproperties.ui # Align ekos/align/align.ui ekos/align/opsastrometry.ui ekos/align/opsalign.ui ekos/align/opsastrometrycfg.ui ekos/align/opsastrometryindexfiles.ui ekos/align/mountmodel.ui # Focus ekos/focus/focus.ui # Mount ekos/mount/mount.ui # Guide ekos/guide/guide.ui ekos/guide/opscalibration.ui ekos/guide/opsguide.ui ekos/guide/manualdither.ui #TODO remove from GIT #ekos/guide/guider.ui #ekos/guide/rcalibration.ui # Auxiliary ekos/auxiliary/filtersettings.ui ekos/auxiliary/opslogs.ui ekos/auxiliary/serialportassistant.ui # Ekos Live ekos/ekoslive/ekoslivedialog.ui ) set(ekos_SRCS ekos/ekos.cpp ekos/manager.cpp ekos/profileeditor.cpp ekos/profilewizard.cpp ekos/qMDNS.cpp ekos/opsekos.cpp # Auxiliary ekos/auxiliary/dome.cpp ekos/auxiliary/weather.cpp ekos/auxiliary/dustcap.cpp ekos/auxiliary/darklibrary.cpp ekos/auxiliary/filtermanager.cpp ekos/auxiliary/filterdelegate.cpp ekos/auxiliary/opslogs.cpp ekos/auxiliary/serialportassistant.cpp # Capture ekos/capture/capture.cpp ekos/capture/sequencejob.cpp ekos/capture/dslrinfodialog.cpp ekos/capture/rotatorsettings.cpp ekos/capture/customproperties.cpp # Scheduler ekos/scheduler/schedulerjob.cpp ekos/scheduler/scheduler.cpp ekos/scheduler/mosaic.cpp # Focus ekos/focus/focus.cpp # Mount ekos/mount/mount.cpp # Align ekos/align/align.cpp ekos/align/alignview.cpp ekos/align/astrometryparser.cpp ekos/align/opsastrometry.cpp ekos/align/opsalign.cpp ekos/align/opsastrometrycfg.cpp ekos/align/opsastrometryindexfiles.cpp ekos/align/offlineastrometryparser.cpp ekos/align/onlineastrometryparser.cpp ekos/align/remoteastrometryparser.cpp # Guide ekos/guide/guide.cpp ekos/guide/guideinterface.cpp ekos/guide/opscalibration.cpp ekos/guide/opsguide.cpp # Internal Guide ekos/guide/internalguide/gmath.cpp ekos/guide/internalguide/internalguider.cpp #ekos/guide/internalguide/guider.cpp ekos/guide/internalguide/matr.cpp #ekos/guide/internalguide/rcalibration.cpp ekos/guide/internalguide/vect.cpp ekos/guide/internalguide/imageautoguiding.cpp # External Guide ekos/guide/externalguide/phd2.cpp ekos/guide/externalguide/linguider.cpp # Ekos Live ekos/ekoslive/ekosliveclient.cpp ekos/ekoslive/message.cpp ekos/ekoslive/media.cpp ekos/ekoslive/cloud.cpp ) endif(CFITSIO_FOUND) include_directories(${INDI_INCLUDE_DIR}) endif (INDI_FOUND) if (CFITSIO_FOUND) set (sep_SRCS fitsviewer/sep/analyse.c fitsviewer/sep/aperture.c fitsviewer/sep/background.c fitsviewer/sep/convolve.c fitsviewer/sep/deblend.c fitsviewer/sep/extract.c fitsviewer/sep/lutz.c fitsviewer/sep/util.c ) set (fits_SRCS fitsviewer/fitslabel.cpp fitsviewer/fitsviewer.cpp fitsviewer/fitstab.cpp fitsviewer/fitsdebayer.cpp fitsviewer/opsfits.cpp ) if (Qt5DataVisualization_FOUND) set(fits_SRCS ${fits_SRCS} fitsviewer/starprofileviewer.cpp) endif() set (fits2_SRCS fitsviewer/bayer.c fitsviewer/fpack.c fitsviewer/fpackutil.c fitsviewer/fitshistogram.cpp fitsviewer/fitsview.cpp fitsviewer/fitsdata.cpp ) set (fitsui_SRCS fitsviewer/fitsheaderdialog.ui fitsviewer/statform.ui fitsviewer/fitsdebayer.ui indi/streamform.ui indi/recordingoptions.ui fitsviewer/fitshistogramui.ui fitsviewer/opsfits.ui ) include_directories(${CFITSIO_INCLUDE_DIR}) endif(CFITSIO_FOUND) IF (CFITSIO_FOUND) IF (("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")) IF (SANITIZERS) SET_SOURCE_FILES_PROPERTIES(fitsviewer/bayer.c PROPERTIES COMPILE_FLAGS "-Wno-cast-align -fno-sanitize=address,undefined -fomit-frame-pointer") SET_SOURCE_FILES_PROPERTIES(fitsviewer/fitsdata.cpp PROPERTIES COMPILE_FLAGS "-fno-sanitize=address,undefined -fomit-frame-pointer") SET_SOURCE_FILES_PROPERTIES(fitsviewer/fitshistogram.cpp PROPERTIES COMPILE_FLAGS "-fno-sanitize=address,undefined -fomit-frame-pointer") SET_SOURCE_FILES_PROPERTIES(fitsviewer/fitsview.cpp PROPERTIES COMPILE_FLAGS "-fno-sanitize=address,undefined -fomit-frame-pointer") ELSE () SET_SOURCE_FILES_PROPERTIES(fitsviewer/bayer.c PROPERTIES COMPILE_FLAGS "-Wno-cast-align") ENDIF () SET_SOURCE_FILES_PROPERTIES(fitsviewer/sep/analyse.c PROPERTIES COMPILE_FLAGS "-Wno-cast-align") SET_SOURCE_FILES_PROPERTIES(fitsviewer/sep/aperture.c PROPERTIES COMPILE_FLAGS "-Wno-cast-align -Wno-pointer-arith") SET_SOURCE_FILES_PROPERTIES(fitsviewer/sep/background.c PROPERTIES COMPILE_FLAGS "-Wno-cast-align") SET_SOURCE_FILES_PROPERTIES(fitsviewer/sep/deblend.c PROPERTIES COMPILE_FLAGS "-Wno-cast-align -Wno-incompatible-pointer-types-discards-qualifiers") SET_SOURCE_FILES_PROPERTIES(fitsviewer/sep/extract.c PROPERTIES COMPILE_FLAGS "-Wno-cast-align") SET_SOURCE_FILES_PROPERTIES(fitsviewer/sep/lutz.c PROPERTIES COMPILE_FLAGS "-Wno-cast-align") SET_SOURCE_FILES_PROPERTIES(fitsviewer/sep/util.c PROPERTIES COMPILE_FLAGS "-Wno-incompatible-pointer-types-discards-qualifiers") SET_SOURCE_FILES_PROPERTIES(fitsviewer/fpack.c PROPERTIES COMPILE_FLAGS "-Wno-error") SET_SOURCE_FILES_PROPERTIES(fitsviewer/fpackutil.c PROPERTIES COMPILE_FLAGS "-Wno-error") ELSEIF (NOT WIN32) SET_SOURCE_FILES_PROPERTIES(fitsviewer/fpack.c PROPERTIES COMPILE_FLAGS "-Wno-error") SET_SOURCE_FILES_PROPERTIES(fitsviewer/fpackutil.c PROPERTIES COMPILE_FLAGS "-Wno-error") SET_SOURCE_FILES_PROPERTIES(fitsviewer/sep/aperture.c PROPERTIES COMPILE_FLAGS "-Wno-pointer-arith") SET_SOURCE_FILES_PROPERTIES(fitsviewer/sep/deblend.c PROPERTIES COMPILE_FLAGS "-Wno-discarded-qualifiers") SET_SOURCE_FILES_PROPERTIES(fitsviewer/sep/util.c PROPERTIES COMPILE_FLAGS "-Wno-discarded-qualifiers") ENDIF () ENDIF () if(WCSLIB_FOUND) include_directories( ${WCSLIB_INCLUDE_DIR} ) endif(WCSLIB_FOUND) set(xplanet_SRCS xplanet/opsxplanet.cpp ) set(xplanetui_SRCS xplanet/opsxplanet.ui ) ########### next target ############### set(libkstarstools_SRCS tools/altvstime.cpp tools/avtplotwidget.cpp tools/calendarwidget.cpp tools/conjunctions.cpp tools/eclipsetool.cpp tools/eclipsehandler.cpp tools/eclipsetool/lunareclipsehandler.cpp # tools/jmoontool.cpp tools/approachsolver.cpp tools/ksconjunct.cpp tools/eqplotwidget.cpp tools/astrocalc.cpp tools/modcalcangdist.cpp tools/modcalcapcoord.cpp tools/modcalcaltaz.cpp tools/modcalcdaylength.cpp tools/modcalceclipticcoords.cpp tools/modcalcvizequinox.cpp tools/modcalcgalcoord.cpp tools/modcalcgeodcoord.cpp tools/modcalcjd.cpp tools/modcalcplanets.cpp tools/modcalcsidtime.cpp tools/modcalcvlsr.cpp tools/observinglist.cpp tools/obslistpopupmenu.cpp tools/sessionsortfilterproxymodel.cpp tools/obslistwizard.cpp tools/planetviewer.cpp tools/pvplotwidget.cpp tools/scriptargwidgets.cpp tools/scriptbuilder.cpp tools/scriptfunction.cpp tools/skycalendar.cpp tools/wutdialog.cpp tools/flagmanager.cpp tools/horizonmanager.cpp tools/nameresolver.cpp tools/polarishourangle.cpp #FIXME Port to KF5 #tools/moonphasetool.cpp tools/starhopper.cpp tools/eyepiecefield.cpp tools/exporteyepieceview.cpp tools/starhopperdialog.cpp tools/adddeepskyobject.cpp ) if(${KF5_VERSION} VERSION_EQUAL 5.18.0 OR ${KF5_VERSION} VERSION_GREATER 5.18.0) set(libkstarstools_SRCS ${libkstarstools_SRCS} tools/whatsinteresting/skyobjlistmodel.cpp tools/whatsinteresting/wiview.cpp tools/whatsinteresting/modelmanager.cpp tools/whatsinteresting/skyobjitem.cpp tools/whatsinteresting/wilpsettings.cpp tools/whatsinteresting/wiequipsettings.cpp tools/whatsinteresting/obsconditions.cpp tools/whatsinteresting/skyobjdescription.cpp ) endif() ki18n_wrap_ui(libkstarstools_ui_SRCS tools/altvstime.ui tools/argchangeviewoption.ui tools/argexportimage.ui tools/argloadcolorscheme.ui tools/arglooktoward.ui tools/argfindobject.ui tools/argprintimage.ui tools/argsetaltaz.ui tools/argsetcolor.ui tools/argsetgeolocation.ui tools/argsetlocaltime.ui tools/argsetradec.ui tools/argsettrack.ui tools/argtimescale.ui tools/argwaitfor.ui tools/argwaitforkey.ui tools/argzoom.ui tools/conjunctions.ui tools/eclipsetool.ui tools/modcalcangdist.ui tools/modcalcapcoord.ui tools/modcalcaltaz.ui tools/modcalcdaylength.ui tools/modcalceclipticcoords.ui tools/modcalcvizequinox.ui tools/modcalcgalcoord.ui tools/modcalcgeod.ui tools/modcalcjd.ui tools/modcalcplanets.ui tools/modcalcsidtime.ui tools/modcalcvlsr.ui tools/observinglist.ui tools/obslistwizard.ui tools/optionstreeview.ui tools/planetviewer.ui tools/scriptbuilder.ui tools/scriptnamedialog.ui tools/skycalendar.ui tools/wutdialog.ui tools/flagmanager.ui tools/starhopperdialog.ui tools/horizonmanager.ui tools/adddeepskyobject.ui tools/polarishourangle.ui ) if (${KF5_VERSION} VERSION_EQUAL 5.18.0 OR ${KF5_VERSION} VERSION_GREATER 5.18.0) ki18n_wrap_ui(libkstarstools_ui_SRCS tools/whatsinteresting/wilpsettings.ui tools/whatsinteresting/wiequipsettings.ui ) endif() set(libkstarswidgets_SRCS widgets/clicklabel.cpp widgets/dmsbox.cpp widgets/draglistbox.cpp widgets/fovwidget.cpp widgets/logedit.cpp widgets/magnitudespinbox.cpp widgets/mapcanvas.cpp widgets/thumbimage.cpp widgets/timespinbox.cpp widgets/timestepbox.cpp widgets/timeunitbox.cpp widgets/infoboxwidget.cpp # widgets/genericcalendarwidget.cpp # widgets/moonphasecalendarwidget.cpp widgets/kshelplabel.cpp widgets/unitspinboxwidget.cpp ) ki18n_wrap_ui(libkstarswidgets_ui_SRCS # widgets/genericcalendarwidget.ui widgets/unitspinboxwidget.ui ) set(kstars_KCFG_SRCS Options.kcfgc) set(kstars_options_SRCS options/opsadvanced.cpp options/opscatalog.cpp options/opscolors.cpp options/opsguides.cpp options/opssolarsystem.cpp options/opssatellites.cpp options/opssupernovae.cpp ) set(kstars_optionsui_SRCS options/opsadvanced.ui options/opscatalog.ui options/opscolors.ui options/opsguides.ui options/opssolarsystem.ui options/opssatellites.ui options/opssupernovae.ui ) set(kstars_dialogs_SRCS dialogs/addcatdialog.cpp dialogs/addlinkdialog.cpp dialogs/detaildialog.cpp dialogs/finddialog.cpp dialogs/focusdialog.cpp dialogs/fovdialog.cpp dialogs/locationdialog.cpp dialogs/timedialog.cpp dialogs/exportimagedialog.cpp ) set(kstars_dialogsui_SRCS dialogs/addcatdialog.ui dialogs/addlinkdialog.ui dialogs/details_database.ui dialogs/details_data.ui dialogs/details_data_comet.ui dialogs/details_links.ui dialogs/details_log.ui dialogs/details_position.ui dialogs/finddialog.ui dialogs/focusdialog.ui dialogs/fovdialog.ui dialogs/locationdialog.ui dialogs/wizwelcome.ui dialogs/wizlocation.ui dialogs/wizdownload.ui dialogs/wizdata.ui dialogs/newfov.ui dialogs/exportimagedialog.ui ) set(hips_SRCS hips/healpix.cpp hips/hipsrenderer.cpp hips/scanrender.cpp hips/pixcache.cpp hips/urlfiledownload.cpp hips/opships.cpp ) set(hips_manager_SRCS hips/hipsmanager.cpp ) set(oal_SRCS oal/log.cpp oal/observer.cpp oal/site.cpp oal/session.cpp oal/scope.cpp oal/eyepiece.cpp oal/filter.cpp oal/observation.cpp oal/lens.cpp oal/equipmentwriter.cpp oal/observeradd.cpp oal/execute.cpp ) set(printing_SRCS printing/detailstable.cpp printing/finderchart.cpp printing/foveditordialog.cpp printing/fovsnapshot.cpp printing/kstarsdocument.cpp printing/legend.cpp printing/loggingform.cpp printing/printingwizard.cpp printing/pwizchartconfig.cpp printing/pwizchartcontents.cpp printing/pwizfovbrowse.cpp printing/pwizfovconfig.cpp printing/pwizfovmanual.cpp printing/pwizfovsh.cpp printing/pwizfovtypeselection.cpp printing/pwizobjectselection.cpp printing/pwizprint.cpp printing/shfovexporter.cpp printing/simplefovexporter.cpp ) set(printingui_SRCS printing/foveditordialog.ui printing/pwizchartconfig.ui printing/pwizchartcontents.ui printing/pwizfovbrowse.ui printing/pwizfovconfig.ui printing/pwizfovmanual.ui printing/pwizfovsh.ui printing/pwizfovtypeselection.ui printing/pwizobjectselection.ui printing/pwizprint.ui printing/pwizwelcome.ui ) set( kstars_KCFG_SRCS Options.kcfgc ) set(libkstarscomponents_SRCS skycomponents/skylabeler.cpp skycomponents/highpmstarlist.cpp skycomponents/skymapcomposite.cpp skycomponents/skymesh.cpp skycomponents/linelistindex.cpp skycomponents/linelistlabel.cpp skycomponents/noprecessindex.cpp skycomponents/listcomponent.cpp skycomponents/pointlistcomponent.cpp skycomponents/solarsystemsinglecomponent.cpp skycomponents/solarsystemlistcomponent.cpp skycomponents/earthshadowcomponent.cpp skycomponents/asteroidscomponent.cpp skycomponents/cometscomponent.cpp skycomponents/planetmoonscomponent.cpp skycomponents/solarsystemcomposite.cpp skycomponents/satellitescomponent.cpp skycomponents/starcomponent.cpp skycomponents/deepstarcomponent.cpp skycomponents/deepskycomponent.cpp skycomponents/catalogcomponent.cpp skycomponents/syncedcatalogcomponent.cpp skycomponents/constellationartcomponent.cpp skycomponents/constellationboundarylines.cpp skycomponents/constellationlines.cpp skycomponents/constellationnamescomponent.cpp skycomponents/supernovaecomponent.cpp skycomponents/coordinategrid.cpp skycomponents/equatorialcoordinategrid.cpp skycomponents/horizontalcoordinategrid.cpp skycomponents/localmeridiancomponent.cpp skycomponents/ecliptic.cpp skycomponents/equator.cpp skycomponents/artificialhorizoncomponent.cpp skycomponents/hipscomponent.cpp skycomponents/horizoncomponent.cpp skycomponents/milkyway.cpp skycomponents/skycomponent.cpp skycomponents/skycomposite.cpp skycomponents/starblock.cpp skycomponents/starblocklist.cpp skycomponents/starblockfactory.cpp skycomponents/culturelist.cpp skycomponents/flagcomponent.cpp skycomponents/targetlistcomponent.cpp ) #LIST(APPEND libkstarscomponents_SRCS # #skycomponents/notifyupdatesui.cpp # ) IF (BUILD_KSTARS_LITE) set(libkstarstools_ui_klite_SRCS tools/nameresolver.cpp ) ENDIF () set(kstars_skyobjects_SRCS skyobjects/constellationsart.cpp skyobjects/deepskyobject.cpp # skyobjects/jupitermoons.cpp skyobjects/planetmoons.cpp skyobjects/ksasteroid.cpp skyobjects/kscomet.cpp skyobjects/ksmoon.cpp skyobjects/ksearthshadow.cpp skyobjects/ksplanetbase.cpp skyobjects/ksplanet.cpp #skyobjects/kspluto.cpp skyobjects/kssun.cpp skyobjects/skyline.cpp skyobjects/skyobject.cpp skyobjects/skypoint.cpp skyobjects/starobject.cpp skyobjects/trailobject.cpp skyobjects/satellite.cpp skyobjects/satellitegroup.cpp skyobjects/supernova.cpp ) set(kstars_projection_SRCS projections/projector.cpp projections/lambertprojector.cpp projections/gnomonicprojector.cpp projections/stereographicprojector.cpp projections/orthographicprojector.cpp projections/azimuthalequidistantprojector.cpp projections/equirectangularprojector.cpp ) set(kstars_extra_SRCS auxiliary/colorscheme.cpp auxiliary/dms.cpp auxiliary/cachingdms.cpp auxiliary/geolocation.cpp auxiliary/ksfilereader.cpp auxiliary/ksuserdb.cpp auxiliary/binfilehelper.cpp auxiliary/ksutils.cpp auxiliary/ksdssimage.cpp auxiliary/ksdssdownloader.cpp auxiliary/nonlineardoublespinbox.cpp auxiliary/profileinfo.cpp auxiliary/filedownloader.cpp auxiliary/kspaths.cpp auxiliary/QRoundProgressBar.cpp auxiliary/skyobjectlistmodel.cpp auxiliary/ksnotification.cpp auxiliary/QProgressIndicator.cpp time/simclock.cpp time/kstarsdatetime.cpp time/timezonerule.cpp ksnumbers.cpp kstarsdata.cpp texturemanager.cpp #to minimize number of indef KSTARS_LITE skypainter.cpp ) SET(kstars_extra_kstars_SRCS auxiliary/thememanager.cpp auxiliary/schememanager.cpp auxiliary/imageviewer.cpp auxiliary/xplanetimageviewer.cpp auxiliary/fov.cpp auxiliary/thumbnailpicker.cpp auxiliary/thumbnaileditor.cpp auxiliary/imageexporter.cpp auxiliary/kswizard.cpp auxiliary/qcustomplot.cpp kstarsdbus.cpp kspopupmenu.cpp ksalmanac.cpp kstarsactions.cpp kstarsinit.cpp kstars.cpp kstarssplash.cpp skymap.cpp skymapdrawabstract.cpp skymapqdraw.cpp skymapevents.cpp skyqpainter.cpp ) # Temporary solution to allow use of qml files from source dir DELETE SET(KSTARSLITE_CPP_OPTIONS -DSOURCE_DIR=\"${kstars_SOURCE_DIR}\" -DQML_IMPORT="${CMAKE_CURRENT_SOURCE_DIR}") set(klite_SRCS kstarslite.cpp kstarsliteinit.cpp skymaplite.cpp skymapliteevents.cpp #Wrappers kstarslite/skypointlite.cpp kstarslite/skyobjectlite.cpp #ImageProvider kstarslite/imageprovider.cpp #Dialogs kstarslite/dialogs/detaildialoglite.cpp kstarslite/dialogs/finddialoglite.cpp kstarslite/dialogs/locationdialoglite.cpp #RootNode kstarslite/skyitems/rootnode.cpp kstarslite/skyitems/skyopacitynode.cpp kstarslite/skyitems/typedeflite.h #SkyItems kstarslite/skyitems/skyitem.cpp kstarslite/skyitems/planetsitem.cpp kstarslite/skyitems/asteroidsitem.cpp kstarslite/skyitems/cometsitem.cpp kstarslite/skyitems/horizonitem.cpp kstarslite/skyitems/labelsitem.cpp kstarslite/skyitems/constellationnamesitem.cpp kstarslite/skyitems/staritem.cpp kstarslite/skyitems/deepstaritem.cpp kstarslite/skyitems/deepskyitem.cpp kstarslite/skyitems/constellationartitem.cpp kstarslite/skyitems/satellitesitem.cpp kstarslite/skyitems/supernovaeitem.cpp kstarslite/skyitems/fovitem.cpp kstarslite/skyitems/syncedcatalogitem.cpp #Line kstarslite/skyitems/lines/linesitem.cpp kstarslite/skyitems/lines/equatoritem.cpp kstarslite/skyitems/lines/eclipticitem.cpp kstarslite/skyitems/lines/milkywayitem.cpp #SkyNodes kstarslite/skyitems/skynodes/planetnode.cpp kstarslite/skyitems/skynodes/skynode.cpp kstarslite/skyitems/skynodes/pointsourcenode.cpp kstarslite/skyitems/skynodes/planetmoonsnode.cpp kstarslite/skyitems/skynodes/horizonnode.cpp kstarslite/skyitems/skynodes/labelnode.cpp kstarslite/skyitems/skynodes/guidelabelnode.cpp kstarslite/skyitems/skynodes/deepskynode.cpp kstarslite/skyitems/skynodes/dsosymbolnode.cpp kstarslite/skyitems/skynodes/skypolygonnode.cpp kstarslite/skyitems/skynodes/constellationartnode.cpp kstarslite/skyitems/skynodes/satellitenode.cpp kstarslite/skyitems/skynodes/supernovanode.cpp kstarslite/skyitems/skynodes/trixelnode.cpp kstarslite/skyitems/skynodes/fovsymbolnode.cpp #Nodes kstarslite/skyitems/skynodes/nodes/pointnode.cpp kstarslite/skyitems/skynodes/nodes/polynode.cpp kstarslite/skyitems/skynodes/nodes/linenode.cpp kstarslite/skyitems/skynodes/nodes/ellipsenode.cpp kstarslite/skyitems/skynodes/nodes/rectnode.cpp #Other kstarslite/deviceorientation.cpp ) set(kstarslite_libtess_SRC #libtess libtess/gluos.h libtess/priorityq-sort.h libtess/sweep.c libtess/tessmono.c libtess/dict-list.h libtess/glu.h libtess/tessellate.c libtess/dict.c libtess/geom.c libtess/memalloc.c libtess/mesh.c libtess/normal.c libtess/priorityq.c libtess/priorityq-heap.c libtess/render.c libtess/tess.c ) IF (BUILD_KSTARS_LITE) ADD_CUSTOM_TARGET(convert_translations ${CMAKE_SOURCE_DIR}/tools/convert_translations.sh ${CMAKE_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) ADD_DEPENDENCIES(convert_translations fetch-translations) IF (ANDROID) ADD_CUSTOM_TARGET(convert_translations_to_android ${CMAKE_SOURCE_DIR}/tools/convert_translations.sh ${CMAKE_BINARY_DIR}/packaging/android/export/share/kstars WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) ADD_DEPENDENCIES(convert_translations_to_android fetch-translations) ENDIF () ENDIF () IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") SET_SOURCE_FILES_PROPERTIES(${kstarslite_libtess_SRC} PROPERTIES COMPILE_FLAGS "-Wno-error") ENDIF () #Qml files will be probably moved to user's data dir, but for use #with QtCreator it is more convenient to have them here set(kstarsliteqml_SRCS kstarslite/qml/main.qml kstarslite/qml/constants/Constants.qml kstarslite/qml/modules/SkyMapLiteWrapper.qml kstarslite/qml/modules/BottomMenu.qml kstarslite/qml/modules/KSPage.qml kstarslite/qml/modules/KSListView.qml kstarslite/qml/modules/KSLabel.qml kstarslite/qml/modules/KSText.qml kstarslite/qml/modules/KSTabButton.qml kstarslite/qml/modules/KSTab.qml kstarslite/qml/modules/KSTabBarArrow.qml kstarslite/qml/modules/KSTextField.qml kstarslite/qml/modules/KSButton.qml kstarslite/qml/modules/TopMenu.qml kstarslite/qml/modules/helpers/TopMenuButton.qml kstarslite/qml/modules/helpers/BottomMenuButton.qml kstarslite/qml/modules/Splash.qml kstarslite/qml/modules/helpers/TimeSpinBox.qml kstarslite/qml/modules/TimePage.qml #Popups kstarslite/qml/modules/popups/ProjectionsPopup.qml kstarslite/qml/modules/popups/FOVPopup.qml kstarslite/qml/modules/popups/ColorSchemePopup.qml #Menus kstarslite/qml/modules/menus/ContextMenu.qml #Helpers kstarslite/qml/modules/helpers/PassiveNotification.qml kstarslite/qml/modules/helpers/KSMenuItem.qml kstarslite/qml/modules/helpers/TelescopeControl.qml #Dialogs kstarslite/qml/dialogs/FindDialog.qml kstarslite/qml/dialogs/LocationDialog.qml kstarslite/qml/dialogs/DetailsDialog.qml kstarslite/qml/dialogs/AboutDialog.qml kstarslite/qml/dialogs/helpers/DetailsItem.qml kstarslite/qml/dialogs/helpers/DetailsAddLink.qml kstarslite/qml/dialogs/helpers/LocationEdit.qml kstarslite/qml/dialogs/helpers/LocationLoading.qml kstarslite/qml/dialogs/menus/DetailsLinkMenu.qml kstarslite/qml/dialogs/menus/LocationsGeoMenu.qml #INDI kstarslite/qml/indi/INDIControlPanel.qml kstarslite/qml/indi/DevicePanel.qml kstarslite/qml/indi/ImagePreview.qml kstarslite/qml/indi/modules/MotionControl.qml kstarslite/qml/indi/modules/Led.qml kstarslite/qml/indi/modules/KSLed.qml kstarslite/qml/indi/modules/Property.qml kstarslite/qml/indi/modules/KSComboBox.qml kstarslite/qml/indi/modules/KSButtonSwitch.qml kstarslite/qml/indi/modules/KSCheckBox.qml 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}) if(ANDROID) add_subdirectory(kstarslite/res) endif(ANDROID) set(kstars_SRCS ${indi_SRCS} ${fits_SRCS} ${ekos_SRCS} ${libkstarswidgets_SRCS} ${libkstarscomponents_SRCS} ${libkstarstools_SRCS} ${kstars_extra_SRCS} ${kstars_extra_kstars_SRCS} ${kstars_projection_SRCS} ${xplanet_SRCS} ${kstars_options_SRCS} ${kstars_skyobjects_SRCS} ${kstars_dialogs_SRCS} ${hips_SRCS} ${oal_SRCS} ${printing_SRCS} #KStars Lite ${kstarslite_SRCS} # Generated files ${libkstarstools_ui_SRCS} ${libkstarswidgets_ui_SRCS} ) set(kstarslite_SRCS ${indi_klite_SRCS} ${libkstarscomponents_SRCS} ${kstars_extra_SRCS} ${kstars_projection_SRCS} ${kstars_skyobjects_SRCS} # KStars Lite sources ${klite_SRCS} # Generated files ${libkstarstools_ui_klite_SRCS} ) # Generate all the necessary QLoggingCategory files ecm_qt_declare_logging_category(kstars_SRCS HEADER kstars_debug.h IDENTIFIER KSTARS CATEGORY_NAME org.kde.kstars) ecm_qt_declare_logging_category(kstars_SRCS HEADER indi_debug.h IDENTIFIER KSTARS_INDI CATEGORY_NAME org.kde.kstars.indi) ecm_qt_declare_logging_category(kstars_SRCS HEADER fits_debug.h IDENTIFIER KSTARS_FITS CATEGORY_NAME org.kde.kstars.fits) ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_debug.h IDENTIFIER KSTARS_EKOS CATEGORY_NAME org.kde.kstars.ekos) ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_capture_debug.h IDENTIFIER KSTARS_EKOS_CAPTURE CATEGORY_NAME org.kde.kstars.ekos.capture) ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_focus_debug.h IDENTIFIER KSTARS_EKOS_FOCUS CATEGORY_NAME org.kde.kstars.ekos.focus) ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_align_debug.h IDENTIFIER KSTARS_EKOS_ALIGN CATEGORY_NAME org.kde.kstars.ekos.align) ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_guide_debug.h IDENTIFIER KSTARS_EKOS_GUIDE CATEGORY_NAME org.kde.kstars.ekos.guide) ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_mount_debug.h IDENTIFIER KSTARS_EKOS_MOUNT CATEGORY_NAME org.kde.kstars.ekos.mount) ecm_qt_declare_logging_category(kstars_SRCS HEADER ekos_scheduler_debug.h IDENTIFIER KSTARS_EKOS_SCHEDULER CATEGORY_NAME org.kde.kstars.ekos.scheduler) kconfig_add_kcfg_files(kstars_SRCS ${kstars_KCFG_SRCS}) ecm_qt_declare_logging_category(kstarslite_SRCS HEADER kstars_debug.h IDENTIFIER KSTARS CATEGORY_NAME org.kde.kstars) ecm_qt_declare_logging_category(kstarslite_SRCS HEADER fits_debug.h IDENTIFIER KSTARS_FITS CATEGORY_NAME org.kde.kstars.fits) kconfig_add_kcfg_files(kstarslite_SRCS ${kstars_KCFG_SRCS}) IF (UNITY_BUILD) ENABLE_UNITY_BUILD(kstars kstars_SRCS 10 cpp) ENABLE_UNITY_BUILD(kstarslite kstarslite_SRCS 10 cpp) ENDIF () set(kstars_SRCS ${kstars_SRCS} ${fits2_SRCS} ${sep_SRCS} ${hips_manager_SRCS}) set(kstarslite_SRCS ${kstarslite_SRCS} ${fits_klite_SRCS} ${sep_SRCS} ${fits2_klite_SRCS} ${kstarslite_libtess_SRC}) IF (NOT ANDROID) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.xml kstars.h KStars) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.SimClock.xml simclock.h SimClock) + qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.FOV.xml fov.h FOV) IF (INDI_FOUND) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.INDI.xml indi/indidbus.h INDIDBus) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.Ekos.xml ekos/manager.h Ekos::Manager) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.Ekos.Capture.xml ekos/capture/capture.h Ekos::Capture) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.Ekos.Focus.xml ekos/focus/focus.h Ekos::Focus) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.Ekos.Guide.xml ekos/guide/guide.h Ekos::Guide) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.Ekos.Align.xml ekos/align/align.h Ekos::Align) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.Ekos.Mount.xml ekos/mount/mount.h Ekos::Mount) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.Ekos.Dome.xml ekos/auxiliary/dome.h Ekos::Dome) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.Ekos.Weather.xml ekos/auxiliary/weather.h Ekos::Weather) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.Ekos.DustCap.xml ekos/auxiliary/dustcap.h Ekos::DustCap) qt5_add_dbus_adaptor(kstars_SRCS org.kde.kstars.Ekos.Scheduler.xml ekos/scheduler/scheduler.h Ekos::Scheduler) ENDIF () ki18n_wrap_ui(kstars_SRCS ${indiui_SRCS} ${ui_SRCS} ${fitsui_SRCS} ${ekosui_SRCS} ${xplanetui_SRCS} ${kstars_optionsui_SRCS} ${kstars_dialogsui_SRCS} ${printingui_SRCS} auxiliary/thumbnailpicker.ui auxiliary/thumbnaileditor.ui oal/observeradd.ui oal/equipmentwriter.ui oal/execute.ui hips/opships.ui hips/opshipsdisplay.ui hips/opshipscache.ui #skycomponents/notifyupdatesui.ui ) add_library(KStarsLib STATIC ${kstars_SRCS}) target_link_libraries(KStarsLib LibKSDataHandlers htmesh KF5::Crash KF5::I18n KF5::NewStuff KF5::KIOFileWidgets KF5::WidgetsAddons KF5::Plotting KF5::Notifications Qt5::Gui Qt5::PrintSupport Qt5::Sql Qt5::Svg Qt5::Qml Qt5::Quick Qt5::Network #Qt5::Positioning Qt5::Concurrent Qt5::WebSockets ${ZLIB_LIBRARIES} ) if (Qt5Keychain_FOUND) include_directories(KStarsLib PUBLIC ${QTKEYCHAIN_INCLUDE_DIRS}) target_link_libraries(KStarsLib ${QTKEYCHAIN_LIBRARIES}) endif(Qt5Keychain_FOUND) if (Qt5DataVisualization_FOUND) target_link_libraries(KStarsLib Qt5::DataVisualization) endif(Qt5DataVisualization_FOUND) if (KF5NotifyConfig_FOUND) target_link_libraries(KStarsLib KF5::NotifyConfig) endif(KF5NotifyConfig_FOUND) if(NOT WIN32) target_link_libraries(KStarsLib m) endif(NOT WIN32) ENDIF () if (BUILD_KSTARS_LITE) add_library(KStarsLiteLib STATIC ${kstarslite_SRCS}) target_link_libraries(KStarsLiteLib LibKSDataHandlers htmesh KF5::I18n KF5::Plotting KF5::ConfigGui Qt5::Gui Qt5::Sql Qt5::Qml Qt5::Quick Qt5::QuickControls2 Qt5::Positioning Qt5::PositioningQuick Qt5::Concurrent ${ZLIB_LIBRARIES} ) if (ANDROID) target_link_libraries(KStarsLiteLib Qt5::AndroidExtras) endif () endif () if (CFITSIO_FOUND) if (NOT ANDROID) target_include_directories(KStarsLib PUBLIC ${CFITSIO_INCLUDE_DIR}) target_link_libraries(KStarsLib ${CFITSIO_LIBRARIES}) endif() if (BUILD_KSTARS_LITE) target_include_directories(KStarsLiteLib PUBLIC ${CFITSIO_INCLUDE_DIR}) target_link_libraries(KStarsLiteLib ${CFITSIO_LIBRARIES}) endif() endif(CFITSIO_FOUND) if(INDI_FOUND) if (NOT ANDROID) find_package(Nova REQUIRED) include_directories(${NOVA_INCLUDE_DIR}) endif () ## Support Multiple Platforms. All Require INDI ## WIN32 Desktop: Requires INDI Qt5 Client + GSL ## WIN32 Lite: Requires INDI Qt5 Client ## Linux + MacOS Desktop: Requires INDI Client + GSL ## Linux + MacOS Lite: Requires INDI Qt5 Client ## Android: Requires INDI Qt5 Client built for Android if (NOT ANDROID) find_package(GSL REQUIRED) include_directories(${GSL_INCLUDE_DIRS}) target_link_libraries(KStarsLib ${GSL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} KF5::Notifications) endif () if(WIN32 OR ANDROID) if(ANDROID) target_link_libraries(KStarsLiteLib ${INDI_CLIENT_ANDROID_LIBRARIES} ${CFITSIO_LIBRARIES} ${LIBRAW_LIBRARIES}) target_compile_options(KStarsLiteLib PRIVATE ${KSTARSLITE_CPP_OPTIONS} -DUSE_QT5_INDI -DKSTARS_LITE) else(ANDROID) target_link_libraries(KStarsLib ${INDI_CLIENT_LIBRARIES} ${NOVA_LIBRARIES}) endif(ANDROID) else(WIN32 OR ANDROID) if (BUILD_KSTARS_LITE) target_link_libraries(KStarsLiteLib ${INDI_CLIENT_QT_LIBRARIES} ${NOVA_LIBRARIES} z) target_compile_options(KStarsLiteLib PRIVATE ${KSTARSLITE_CPP_OPTIONS} -DUSE_QT5_INDI -DKSTARS_LITE) endif(BUILD_KSTARS_LITE) target_link_libraries(KStarsLib ${INDI_CLIENT_LIBRARIES} ${NOVA_LIBRARIES} z) endif(WIN32 OR ANDROID) endif(INDI_FOUND) if(WCSLIB_FOUND) target_link_libraries(KStarsLib ${WCSLIB_LIBRARIES}) if (BUILD_KSTARS_LITE) target_link_libraries(KStarsLiteLib ${WCSLIB_LIBRARIES}) endif() endif (WCSLIB_FOUND) if(LibRaw_FOUND) if (NOT ANDROID) target_link_libraries(KStarsLib ${LibRaw_LIBRARIES}) endif() if (BUILD_KSTARS_LITE) target_link_libraries(KStarsLiteLib ${LibRaw_LIBRARIES}) endif() endif (LibRaw_FOUND) #FIXME Enable OpenGL Later #if( OPENGL_FOUND ) # target_link_libraries(KStarsLib # ${OPENGL_LIBRARIES} # ${QT_QTOPENGL_LIBRARY} # ) #endif( OPENGL_FOUND ) set (KSTARS_APP_SRCS main.cpp ) # add icon to application sources ecm_add_app_icon(KSTARS_APP_SRCS ICONS ${CMAKE_CURRENT_SOURCE_DIR}/icons/16-apps-kstars.png ${CMAKE_CURRENT_SOURCE_DIR}/icons/32-apps-kstars.png ${CMAKE_CURRENT_SOURCE_DIR}/icons/48-apps-kstars.png ${CMAKE_CURRENT_SOURCE_DIR}/icons/64-apps-kstars.png ${CMAKE_CURRENT_SOURCE_DIR}/icons/128-apps-kstars.png ) qt5_add_resources(KSTARS_APP_SRCS data/kstars.qrc) if (ANDROID) add_library(kstars SHARED ${KSTARS_APP_SRCS}) target_compile_options(kstars PRIVATE ${KSTARSLITE_CPP_OPTIONS} -DUSE_QT5_INDI -DKSTARS_LITE) add_dependencies(KStarsLiteLib cfitsio indi raw) target_link_libraries(kstars KStarsLiteLib) else () if (BUILD_KSTARS_LITE) add_executable(kstars_lite ${KSTARS_APP_SRCS}) target_compile_options(kstars_lite PRIVATE ${KSTARSLITE_CPP_OPTIONS} -DUSE_QT5_INDI -DKSTARS_LITE) target_link_libraries(kstars_lite KStarsLiteLib) endif() add_executable(kstars ${KSTARS_APP_SRCS}) target_link_libraries(kstars KStarsLib) endif () install(TARGETS kstars ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) ########### install files ############### install(PROGRAMS org.kde.kstars.desktop DESTINATION ${KDE_INSTALL_APPDIR}) install(FILES kstars.kcfg DESTINATION ${KDE_INSTALL_KCFGDIR}) install(FILES kstars.notifyrc DESTINATION ${KNOTIFYRC_INSTALL_DIR}) if(INDI_FOUND) #install(FILES ekos/mount/mountbox.qml DESTINATION ${KDE_INSTALL_DATADIR}/kstars/ekos/mount/qml) #install(DIRECTORY ekos/mount/ DESTINATION ${KDE_INSTALL_DATADIR}/kstars/ekos/mount/qml # FILES_MATCHING PATTERN "*.png") endif() if (NOT ANDROID AND BUILD_KSTARS_LITE) install(TARGETS kstars_lite ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) endif() diff --git a/kstars/auxiliary/fov.cpp b/kstars/auxiliary/fov.cpp index be6a54784..a864be9d0 100644 --- a/kstars/auxiliary/fov.cpp +++ b/kstars/auxiliary/fov.cpp @@ -1,363 +1,406 @@ /*************************************************************************** fov.cpp - description ------------------- begin : Fri 05 Sept 2003 copyright : (C) 2003 by Jason Harris email : kstars@30doradus.org ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "fov.h" #include "geolocation.h" #include "kspaths.h" #ifndef KSTARS_LITE #include "kstars.h" #endif #include "kstarsdata.h" #include "Options.h" #include "skymap.h" #include "projections/projector.h" +#include "fovadaptor.h" #include #include #include #include #include #include QList FOVManager::m_FOVs; +int FOV::m_ID=1; FOVManager::~FOVManager() { qDeleteAll(m_FOVs); } QList FOVManager::defaults() { QList fovs; fovs << new FOV(i18nc("use field-of-view for binoculars", "7x35 Binoculars"), 558, 558, 0, 0, 0, FOV::CIRCLE, "#AAAAAA") << new FOV(i18nc("use a Telrad field-of-view indicator", "Telrad"), 30, 30, 0, 0, 0, FOV::BULLSEYE, "#AA0000") << new FOV(i18nc("use 1-degree field-of-view indicator", "One Degree"), 60, 60, 0, 0, 0, FOV::CIRCLE, "#AAAAAA") << new FOV(i18nc("use HST field-of-view indicator", "HST WFPC2"), 2.4, 2.4, 0, 0, 0, FOV::SQUARE, "#AAAAAA") << new FOV(i18nc("use Radiotelescope HPBW", "30m at 1.3cm"), 1.79, 1.79, 0, 0, 0, FOV::SQUARE, "#AAAAAA"); return fovs; } bool FOVManager::save() { QFile f; // TODO: Move FOVs to user database instead of file!! f.setFileName(KSPaths::writableLocation(QStandardPaths::GenericDataLocation) + "fov.dat"); if (!f.open(QIODevice::WriteOnly)) { qDebug() << "Could not open fov.dat."; return false; } QTextStream ostream(&f); foreach (FOV *fov, m_FOVs) { ostream << fov->name() << ':' << fov->sizeX() << ':' << fov->sizeY() << ':' << fov->offsetX() << ':' << fov->offsetY() << ':' << fov->PA() << ':' << QString::number(fov->shape()) << ':' << fov->color() << ':' << (fov->lockCelestialPole() ? 1 : 0) << endl; } f.close(); return true; } const QList &FOVManager::readFOVs() { qDeleteAll(m_FOVs); m_FOVs.clear(); QFile f; f.setFileName(KSPaths::writableLocation(QStandardPaths::GenericDataLocation) + "fov.dat"); if (!f.exists()) { m_FOVs = defaults(); save(); return m_FOVs; } if (f.open(QIODevice::ReadOnly)) { QTextStream istream(&f); while (!istream.atEnd()) { QStringList fields = istream.readLine().split(':'); bool ok; QString name, color; float sizeX, sizeY, xoffset, yoffset, rot; bool lockedCP = false; FOV::Shape shape; if (fields.count() >= 8) { name = fields[0]; sizeX = fields[1].toFloat(&ok); if (!ok) { return m_FOVs; } sizeY = fields[2].toFloat(&ok); if (!ok) { return m_FOVs; } xoffset = fields[3].toFloat(&ok); if (!ok) { return m_FOVs; } yoffset = fields[4].toFloat(&ok); if (!ok) { return m_FOVs; } rot = fields[5].toFloat(&ok); if (!ok) { return m_FOVs; } - shape = FOV::intToShape(fields[6].toInt(&ok)); + shape = static_cast(fields[6].toInt(&ok)); if (!ok) { return m_FOVs; } color = fields[7]; if (fields.count() == 9) lockedCP = (fields[8].toInt(&ok) == 1); } else { continue; } m_FOVs.append(new FOV(name, sizeX, sizeY, xoffset, yoffset, rot, shape, color, lockedCP)); } } return m_FOVs; } void FOVManager::releaseCache() { qDeleteAll(m_FOVs); m_FOVs.clear(); } -FOV::Shape FOV::intToShape(int s) +FOV::FOV(const QString &n, float a, float b, float xoffset, float yoffset, float rot, Shape sh, const QString &col, bool useLockedCP) : QObject() { - return (s >= FOV::UNKNOWN || s < 0) ? FOV::UNKNOWN : static_cast(s); -} + new FovAdaptor(this); + QDBusConnection::sessionBus().registerObject(QString("/KStars/FOV/%1").arg(getID()) , this); -FOV::FOV(const QString &n, float a, float b, float xoffset, float yoffset, float rot, Shape sh, const QString &col, bool useLockedCP) -{ m_name = n; m_sizeX = a; m_sizeY = (b < 0.0) ? a : b; m_offsetX = xoffset; m_offsetY = yoffset; m_PA = rot; m_shape = sh; m_color = col; m_northPA = 0; m_center.setRA(0); m_center.setDec(0); m_imageDisplay = false; m_lockCelestialPole = useLockedCP; } -FOV::FOV() +FOV::FOV() : QObject() { + new FovAdaptor(this); + QDBusConnection::sessionBus().registerObject(QString("/KStars/FOV/%1").arg(getID()) , this); + m_name = i18n("No FOV"); m_color = "#FFFFFF"; m_sizeX = m_sizeY = 0; m_shape = SQUARE; - m_offsetX = m_offsetY = m_PA = 0, m_northPA = 0; m_imageDisplay = false; m_lockCelestialPole = false; } +FOV::FOV(const FOV &other) : QObject() +{ + m_name = other.m_name; + m_color = other.m_color; + m_sizeX = other.m_sizeX; + m_sizeY = other.m_sizeY; + m_shape = other.m_shape; + m_offsetX= other.m_offsetX; + m_offsetY= other.m_offsetY; + m_PA = other.m_PA; + m_imageDisplay = other.m_imageDisplay; + m_lockCelestialPole = other.m_lockCelestialPole; +} + +void FOV::sync(const FOV &other) +{ + m_name = other.m_name; + m_color = other.m_color; + m_sizeX = other.m_sizeX; + m_sizeY = other.m_sizeY; + m_shape = other.m_shape; + m_offsetX= other.m_offsetX; + m_offsetY= other.m_offsetY; + m_PA = other.m_PA; + m_imageDisplay = other.m_imageDisplay; + m_lockCelestialPole = other.m_lockCelestialPole; +} + void FOV::draw(QPainter &p, float zoomFactor) { // Do not draw empty FOVs if (m_sizeX == 0 || m_sizeY == 0) return; p.setPen(QColor(color())); p.setBrush(Qt::NoBrush); p.setRenderHint(QPainter::Antialiasing, Options::useAntialias()); float pixelSizeX = sizeX() * zoomFactor / 57.3 / 60.0; float pixelSizeY = sizeY() * zoomFactor / 57.3 / 60.0; float offsetXPixelSize = offsetX() * zoomFactor / 57.3 / 60.0; float offsetYPixelSize = offsetY() * zoomFactor / 57.3 / 60.0; p.save(); if (m_center.ra().Degrees() > 0) { m_center.EquatorialToHorizontal(KStarsData::Instance()->lst(), KStarsData::Instance()->geo()->lat()); QPointF skypoint_center = KStars::Instance()->map()->projector()->toScreen(&m_center); p.translate(skypoint_center.toPoint()); } else p.translate(p.viewport().center()); p.translate(offsetXPixelSize, offsetYPixelSize); p.rotate( (m_PA - m_northPA) * -1); QPointF center(0, 0); switch (shape()) { case SQUARE: { QRect targetRect(center.x() - pixelSizeX / 2, center.y() - pixelSizeY / 2, pixelSizeX, pixelSizeY); if (m_imageDisplay) p.drawImage(targetRect, m_image); p.drawRect(targetRect); p.drawRect(center.x(), center.y() - (3 * pixelSizeY / 5), pixelSizeX / 40, pixelSizeX / 10); p.drawLine(center.x() - pixelSizeX / 30, center.y() - (3 * pixelSizeY / 5), center.x() + pixelSizeX / 20, center.y() - (3 * pixelSizeY / 5)); p.drawLine(center.x() - pixelSizeX / 30, center.y() - (3 * pixelSizeY / 5), center.x() + pixelSizeX / 70, center.y() - (0.7 * pixelSizeY)); p.drawLine(center.x() + pixelSizeX / 20, center.y() - (3 * pixelSizeY / 5), center.x() + pixelSizeX / 70, center.y() - (0.7 * pixelSizeY)); int fontSize = pixelSizeX / 15; if (fontSize <= 4) break; QFont font = p.font(); font.setPixelSize(fontSize); p.setFont(font); QRect nameRect(targetRect.topLeft().x(), targetRect.topLeft().y()-(pixelSizeY/8), targetRect.width()/2, pixelSizeX / 10); p.drawText(nameRect, Qt::AlignCenter, name()); QRect sizeRect(targetRect.center().x(), targetRect.topLeft().y()-(pixelSizeY/8), targetRect.width()/2, pixelSizeX / 10); p.drawText(sizeRect, Qt::AlignCenter, QString("%1'x%2'").arg(QString::number(m_sizeX, 'f', 1), QString::number(m_sizeY, 'f', 1))); } break; case CIRCLE: p.drawEllipse(center, pixelSizeX / 2, pixelSizeY / 2); break; case CROSSHAIRS: //Draw radial lines p.drawLine(center.x() + 0.5 * pixelSizeX, center.y(), center.x() + 1.5 * pixelSizeX, center.y()); p.drawLine(center.x() - 0.5 * pixelSizeX, center.y(), center.x() - 1.5 * pixelSizeX, center.y()); p.drawLine(center.x(), center.y() + 0.5 * pixelSizeY, center.x(), center.y() + 1.5 * pixelSizeY); p.drawLine(center.x(), center.y() - 0.5 * pixelSizeY, center.x(), center.y() - 1.5 * pixelSizeY); //Draw circles at 0.5 & 1 degrees p.drawEllipse(center, 0.5 * pixelSizeX, 0.5 * pixelSizeY); p.drawEllipse(center, pixelSizeX, pixelSizeY); break; case BULLSEYE: p.drawEllipse(center, 0.5 * pixelSizeX, 0.5 * pixelSizeY); p.drawEllipse(center, 2.0 * pixelSizeX, 2.0 * pixelSizeY); p.drawEllipse(center, 4.0 * pixelSizeX, 4.0 * pixelSizeY); break; case SOLIDCIRCLE: { QColor colorAlpha = color(); colorAlpha.setAlpha(127); p.setBrush(QBrush(colorAlpha)); p.drawEllipse(center, pixelSizeX / 2, pixelSizeY / 2); p.setBrush(Qt::NoBrush); break; } default:; } p.restore(); } void FOV::draw(QPainter &p, float x, float y) { float xfactor = x / sizeX() * 57.3 * 60.0; float yfactor = y / sizeY() * 57.3 * 60.0; float zoomFactor = std::min(xfactor, yfactor); switch (shape()) { case CROSSHAIRS: zoomFactor /= 3; break; case BULLSEYE: zoomFactor /= 8; break; default:; } draw(p, zoomFactor); } -void FOV::setShape(int s) -{ - m_shape = intToShape(s); -} - SkyPoint FOV::center() const { return m_center; } void FOV::setCenter(const SkyPoint ¢er) { m_center = center; } float FOV::northPA() const { return m_northPA; } void FOV::setNorthPA(float northPA) { m_northPA = northPA; } void FOV::setImage(const QImage &image) { m_image = image; } void FOV::setImageDisplay(bool value) { m_imageDisplay = value; } bool FOV::lockCelestialPole() const { return m_lockCelestialPole; } void FOV::setLockCelestialPole(bool lockCelestialPole) { m_lockCelestialPole = lockCelestialPole; } + +QDBusArgument &operator<<(QDBusArgument &argument, const FOV::Shape& source) +{ + argument.beginStructure(); + argument << static_cast(source); + argument.endStructure(); + return argument; +} + +const QDBusArgument &operator>>(const QDBusArgument &argument, FOV::Shape &dest) +{ + int a; + argument.beginStructure(); + argument >> a; + argument.endStructure(); + dest = static_cast(a); + return argument; +} diff --git a/kstars/auxiliary/fov.h b/kstars/auxiliary/fov.h index d3c48d90a..31a6db8e7 100644 --- a/kstars/auxiliary/fov.h +++ b/kstars/auxiliary/fov.h @@ -1,161 +1,190 @@ /*************************************************************************** fov.h - description ------------------- begin : Fri 05 Sept 2003 copyright : (C) 2003 by Jason Harris email : kstars@30doradus.org ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #pragma once #include "skypoint.h" #include #include #include +#include class QPainter; /** * @class FOV * A simple class encapsulating a Field-of-View symbol + * + * The FOV size, shape, name, and color can be customized. The rotation is by default 0 degrees East Of North. * @author Jason Harris - * @version 1.0 + * @author Jasem Mutlaq + * @version 1.1 */ -class FOV +class FOV : public QObject { + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.kde.kstars.fov") + + Q_PROPERTY(QString name MEMBER m_name) + Q_PROPERTY(Shape shape MEMBER m_shape) + Q_PROPERTY(float sizeX MEMBER m_sizeX) + Q_PROPERTY(float sizeY MEMBER m_sizeY) + Q_PROPERTY(float offsetX MEMBER m_offsetX) + Q_PROPERTY(float offsetY MEMBER m_offsetY) + Q_PROPERTY(float rotation MEMBER m_rotation) + Q_PROPERTY(QString color MEMBER m_color) + Q_PROPERTY(bool cpLock MEMBER m_lockCelestialPole) + public: enum Shape { SQUARE, CIRCLE, CROSSHAIRS, BULLSEYE, SOLIDCIRCLE, UNKNOWN }; - static FOV::Shape intToShape(int); /** Default constructor */ FOV(); FOV(const QString &name, float a, float b = -1, float xoffset = 0, float yoffset = 0, float rot = 0, Shape shape = SQUARE, const QString &color = "#FFFFFF", bool useLockedCP = false); + FOV(const FOV &other); + virtual ~FOV() = default; - inline QString name() const { return m_name; } + void sync(const FOV &other); + + inline Q_SCRIPTABLE QString name() const { return m_name; } void setName(const QString &n) { m_name = n; } inline Shape shape() const { return m_shape; } void setShape(Shape s) { m_shape = s; } - void setShape(int s); + //void setShape(int s); inline float sizeX() const { return m_sizeX; } inline float sizeY() const { return m_sizeY; } void setSize(float s) { m_sizeX = m_sizeY = s; } void setSize(float sx, float sy) { m_sizeX = sx; m_sizeY = sy; } void setOffset(float fx, float fy) { m_offsetX = fx; m_offsetY = fy; } inline float offsetX() const { return m_offsetX; } inline float offsetY() const { return m_offsetY; } + // Position Angle void setPA(float rt) { m_PA = rt; } inline float PA() const { return m_PA; } inline QString color() const { return m_color; } void setColor(const QString &c) { m_color = c; } /** * @short draw the FOV symbol on a QPainter * @param p reference to the target QPainter. The painter should already be started. * @param zoomFactor is zoom factor as in SkyMap. */ void draw(QPainter &p, float zoomFactor); /** * @short draw FOV symbol so it will be inside a rectangle * @param p reference to the target QPainter. The painter should already be started. * @param x is X size of rectangle * @param y is Y size of rectangle */ void draw(QPainter &p, float x, float y); SkyPoint center() const; void setCenter(const SkyPoint ¢er); float northPA() const; void setNorthPA(float northPA); void setImage(const QImage &image); void setImageDisplay(bool value); bool lockCelestialPole() const; void setLockCelestialPole(bool lockCelestialPole); private: QString m_name, m_color; Shape m_shape; float m_sizeX { 0 }, m_sizeY { 0 }; float m_offsetX { 0 }, m_offsetY { 0 }; float m_PA { 0 }; float m_northPA { 0 }; SkyPoint m_center; QImage m_image; bool m_imageDisplay { false }; bool m_lockCelestialPole { false }; + + static int getID() { return m_ID++; } + static int m_ID; }; /** * @class FOVManager * A simple class handling FOVs. * @note Should migrate this from file (fov.dat) to using the user sqlite database * @author Jasem Mutlaq * @version 1.0 */ class FOVManager { public: /** @short Read list of FOVs from "fov.dat" */ static const QList &readFOVs(); /** @short Release the FOV cache */ static void releaseCache(); static void addFOV(FOV *newFOV) { Q_ASSERT(newFOV); m_FOVs.append(newFOV); } static void removeFOV(FOV *fov) { Q_ASSERT(fov); m_FOVs.removeOne(fov); } static const QList &getFOVs() { return m_FOVs; } /** @short Write list of FOVs to "fov.dat" */ static bool save(); private: FOVManager() = default; ~FOVManager(); /** @short Fill list with default FOVs*/ static QList defaults(); static QList m_FOVs; }; + +// Shape +Q_DECLARE_METATYPE(FOV::Shape) +QDBusArgument &operator<<(QDBusArgument &argument, const FOV::Shape& source); +const QDBusArgument &operator>>(const QDBusArgument &argument, FOV::Shape &dest); diff --git a/kstars/dialogs/fovdialog.cpp b/kstars/dialogs/fovdialog.cpp index d9ec7dbe8..ce5330073 100644 --- a/kstars/dialogs/fovdialog.cpp +++ b/kstars/dialogs/fovdialog.cpp @@ -1,421 +1,421 @@ /*************************************************************************** fovdialog.cpp - description ------------------- begin : Fri 05 Sept 2003 copyright : (C) 2003 by Jason Harris email : kstars@30doradus.org ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "fovdialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kstars.h" #include "kstarsdata.h" #include "widgets/fovwidget.h" #include "Options.h" // This is needed to make FOV work with QVariant Q_DECLARE_METATYPE(FOV *) int FOVDialog::fovID = -1; namespace { // Try to convert text in KLine edit to double inline double textToDouble(const QLineEdit *edit, bool *ok = nullptr) { return edit->text().replace(QLocale().decimalPoint(), ".").toDouble(ok); } // Extract FOV from QListWidget. No checking is done FOV *getFOV(QListWidgetItem *item) { return item->data(Qt::UserRole).value(); } // Convert double to QString QString toString(double x, int precision = 2) { return QString::number(x, 'f', precision).replace('.', QLocale().decimalPoint()); } } FOVDialogUI::FOVDialogUI(QWidget *parent) : QFrame(parent) { setupUi(this); } NewFOVUI::NewFOVUI(QWidget *parent) : QFrame(parent) { setupUi(this); } //---------FOVDialog---------------// FOVDialog::FOVDialog(QWidget *p) : QDialog(p) { #ifdef Q_OS_OSX setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint); #endif // Register FOV* data type if (fovID == -1) fovID = qRegisterMetaType("FOV*"); fov = new FOVDialogUI(this); setWindowTitle(i18n("Set FOV Indicator")); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(fov); setLayout(mainLayout); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Close); mainLayout->addWidget(buttonBox); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); connect(fov->FOVListBox, SIGNAL(currentRowChanged(int)), SLOT(slotSelect(int))); connect(fov->NewButton, SIGNAL(clicked()), SLOT(slotNewFOV())); connect(fov->EditButton, SIGNAL(clicked()), SLOT(slotEditFOV())); connect(fov->RemoveButton, SIGNAL(clicked()), SLOT(slotRemoveFOV())); // Read list of FOVs and for each FOV create listbox entry, which stores it. foreach (FOV *f, FOVManager::getFOVs()) { addListWidget(f); } } FOVDialog::~FOVDialog() { // Delete FOVs //for(int i = 0; i < fov->FOVListBox->count(); i++) { //delete getFOV( fov->FOVListBox->item(i) ); //} } QListWidgetItem *FOVDialog::addListWidget(FOV *f) { QListWidgetItem *item = new QListWidgetItem(f->name(), fov->FOVListBox); item->setData(Qt::UserRole, QVariant::fromValue(f)); return item; } void FOVDialog::slotSelect(int irow) { bool enable = irow >= 0; fov->RemoveButton->setEnabled(enable); fov->EditButton->setEnabled(enable); if (enable) { //paint dialog with selected FOV symbol fov->ViewBox->setFOV(getFOV(fov->FOVListBox->currentItem())); fov->ViewBox->update(); } } void FOVDialog::slotNewFOV() { QPointer newfdlg = new NewFOV(this); if (newfdlg->exec() == QDialog::Accepted) { FOV *newfov = new FOV(newfdlg->getFOV()); FOVManager::addFOV(newfov); addListWidget(newfov); fov->FOVListBox->setCurrentRow(fov->FOVListBox->count() - 1); } delete newfdlg; } void FOVDialog::slotEditFOV() { //Preload current values QListWidgetItem *item = fov->FOVListBox->currentItem(); if (item == nullptr) return; FOV *f = item->data(Qt::UserRole).value(); // Create dialog QPointer newfdlg = new NewFOV(this, f); if (newfdlg->exec() == QDialog::Accepted) { // Overwrite FOV - *f = newfdlg->getFOV(); + f->sync(newfdlg->getFOV()); fov->ViewBox->update(); } delete newfdlg; } void FOVDialog::slotRemoveFOV() { int i = fov->FOVListBox->currentRow(); if (i >= 0) { QListWidgetItem *item = fov->FOVListBox->takeItem(i); FOVManager::removeFOV(getFOV(item)); delete item; } } //-------------NewFOV------------------// NewFOV::NewFOV(QWidget *parent, const FOV *fov) : QDialog(parent), f() { ui = new NewFOVUI(this); setWindowTitle(i18n("New FOV Indicator")); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(ui); setLayout(mainLayout); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); mainLayout->addWidget(buttonBox); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); okB = buttonBox->button(QDialogButtonBox::Ok); // Initialize FOV if required if (fov != nullptr) { - f = *fov; + f.sync(*fov); ui->FOVName->setText(f.name()); ui->FOVEditX->setText(toString(f.sizeX())); ui->FOVEditY->setText(toString(f.sizeY())); ui->FOVEditOffsetX->setText(toString(f.offsetX())); ui->FOVEditOffsetY->setText(toString(f.offsetY())); ui->FOVEditRotation->setText(toString(f.PA())); ui->ColorButton->setColor(QColor(f.color())); ui->ShapeBox->setCurrentIndex(f.shape()); ui->FOVLockCP->setChecked(f.lockCelestialPole()); ui->TLength2->setValue(Options::telescopeFocalLength()); ui->cameraWidth->setValue(Options::cameraWidth()); ui->cameraHeight->setValue(Options::cameraHeight()); ui->cameraPixelSizeW->setValue(Options::cameraPixelWidth()); ui->cameraPixelSizeH->setValue(Options::cameraPixelHeight()); ui->ViewBox->setFOV(&f); ui->ViewBox->update(); } connect(ui->FOVName, SIGNAL(textChanged(QString)), SLOT(slotUpdateFOV())); connect(ui->FOVEditX, SIGNAL(textChanged(QString)), SLOT(slotUpdateFOV())); connect(ui->FOVEditY, SIGNAL(textChanged(QString)), SLOT(slotUpdateFOV())); connect(ui->FOVEditOffsetX, SIGNAL(textChanged(QString)), SLOT(slotUpdateFOV())); connect(ui->FOVEditOffsetY, SIGNAL(textChanged(QString)), SLOT(slotUpdateFOV())); connect(ui->FOVEditRotation, SIGNAL(textChanged(QString)), SLOT(slotUpdateFOV())); connect(ui->FOVLockCP, SIGNAL(toggled(bool)), SLOT(slotUpdateFOV())); connect(ui->ColorButton, SIGNAL(changed(QColor)), SLOT(slotUpdateFOV())); connect(ui->ShapeBox, SIGNAL(activated(int)), SLOT(slotUpdateFOV())); connect(ui->ComputeEyeFOV, SIGNAL(clicked()), SLOT(slotComputeFOV())); connect(ui->ComputeCameraFOV, SIGNAL(clicked()), SLOT(slotComputeFOV())); connect(ui->ComputeHPBW, SIGNAL(clicked()), SLOT(slotComputeFOV())); connect(ui->ComputeBinocularFOV, SIGNAL(clicked()), SLOT(slotComputeFOV())); connect(ui->ComputeTLengthFromFNum1, SIGNAL(clicked()), SLOT(slotComputeTelescopeFL())); connect(ui->DetectFromINDI, SIGNAL(clicked()), SLOT(slotDetectFromINDI())); #ifndef HAVE_INDI ui->DetectFromINDI->setEnabled(false); #endif // Populate eyepiece AFOV options. The userData field contains the apparent FOV associated with that option ui->EyepieceAFOV->insertItem(0, i18nc("Specify the apparent field of view (AFOV) manually", "Specify AFOV"), -1); ui->EyepieceAFOV->addItem(i18nc("Eyepiece Design / Brand / Name; Optional", "Ramsden (Typical)"), 30); ui->EyepieceAFOV->addItem(i18nc("Eyepiece Design / Brand / Name; Optional", "Orthoscopic (Typical)"), 45); ui->EyepieceAFOV->addItem(i18nc("Eyepiece Design / Brand / Name; Optional", "Ploessl (Typical)"), 50); ui->EyepieceAFOV->addItem(i18nc("Eyepiece Design / Brand / Name; Optional", "Erfle (Typical)"), 60); ui->EyepieceAFOV->addItem(i18nc("Eyepiece Design / Brand / Name; Optional", "Tele Vue Radian"), 60); ui->EyepieceAFOV->addItem(i18nc("Eyepiece Design / Brand / Name; Optional", "Baader Hyperion"), 68); ui->EyepieceAFOV->addItem(i18nc("Eyepiece Design / Brand / Name; Optional", "Tele Vue Panoptic"), 68); ui->EyepieceAFOV->addItem(i18nc("Eyepiece Design / Brand / Name; Optional", "Tele Vue Delos"), 72); ui->EyepieceAFOV->addItem(i18nc("Eyepiece Design / Brand / Name; Optional", "Meade UWA"), 82); ui->EyepieceAFOV->addItem(i18nc("Eyepiece Design / Brand / Name; Optional", "Tele Vue Nagler"), 82); ui->EyepieceAFOV->addItem(i18nc("Eyepiece Design / Brand / Name; Optional", "Tele Vue Ethos (Typical)"), 100); connect(ui->EyepieceAFOV, SIGNAL(currentIndexChanged(int)), SLOT(slotEyepieceAFOVChanged(int))); ui->LinearFOVDistance->insertItem(0, i18n("1000 yards")); ui->LinearFOVDistance->insertItem(1, i18n("1000 meters")); connect(ui->LinearFOVDistance, SIGNAL(currentIndexChanged(int)), SLOT(slotBinocularFOVDistanceChanged(int))); slotUpdateFOV(); } void NewFOV::slotBinocularFOVDistanceChanged(int index) { QString text = (index == 0 ? i18n("feet") : i18n("meters")); ui->LabelUnits->setText(text); } void NewFOV::slotUpdateFOV() { bool okX, okY; f.setName(ui->FOVName->text()); float sizeX = textToDouble(ui->FOVEditX, &okX); float sizeY = textToDouble(ui->FOVEditY, &okY); if (okX && okY) f.setSize(sizeX, sizeY); float xoffset = textToDouble(ui->FOVEditOffsetX, &okX); float yoffset = textToDouble(ui->FOVEditOffsetY, &okY); if (okX && okY) f.setOffset(xoffset, yoffset); float rot = textToDouble(ui->FOVEditRotation, &okX); if (okX) f.setPA(rot); - f.setShape(ui->ShapeBox->currentIndex()); + f.setShape(static_cast(ui->ShapeBox->currentIndex())); f.setColor(ui->ColorButton->color().name()); f.setLockCelestialPole(ui->FOVLockCP->isChecked()); okB->setEnabled(!f.name().isEmpty() && okX && okY); ui->ViewBox->setFOV(&f); ui->ViewBox->update(); } void NewFOV::slotComputeFOV() { if (sender() == ui->ComputeEyeFOV && ui->TLength1->value() > 0.0) { ui->FOVEditX->setText(toString(60.0 * ui->EyeFOV->value() * ui->EyeLength->value() / ui->TLength1->value())); ui->FOVEditY->setText(ui->FOVEditX->text()); } else if (sender() == ui->ComputeCameraFOV && ui->TLength2->value() > 0.0) { /*double sx = (double)ui->ChipWidth->value() * 3438.0 / ui->TLength2->value(); double sy = (double)ui->ChipHeight->value() * 3438.0 / ui->TLength2->value(); //const double aspectratio = 3.0/2.0; // Use the default aspect ratio for DSLRs / Film (i.e. 3:2)*/ // FOV in arcmins double fov_x = 206264.8062470963552 * ui->cameraWidth->value() * ui->cameraPixelSizeW->value() / 60000.0 / ui->TLength2->value(); double fov_y = 206264.8062470963552 * ui->cameraHeight->value() * ui->cameraPixelSizeH->value() / 60000.0 / ui->TLength2->value(); ui->FOVEditX->setText(toString(fov_x)); ui->FOVEditY->setText(toString(fov_y)); } else if (sender() == ui->ComputeHPBW && ui->RTDiameter->value() > 0.0 && ui->WaveLength->value() > 0.0) { ui->FOVEditX->setText(toString(34.34 * 1.2 * ui->WaveLength->value() / ui->RTDiameter->value())); // Beam width for an antenna is usually a circle on the sky. ui->ShapeBox->setCurrentIndex(4); ui->FOVEditY->setText(ui->FOVEditX->text()); slotUpdateFOV(); } else if (sender() == ui->ComputeBinocularFOV && ui->LinearFOV->value() > 0.0 && ui->LinearFOVDistance->currentIndex() >= 0) { double sx = atan((double)ui->LinearFOV->value() / ((ui->LinearFOVDistance->currentIndex() == 0) ? 3000.0 : 1000.0)) * 180.0 * 60.0 / dms::PI; ui->FOVEditX->setText(toString(sx)); ui->FOVEditY->setText(ui->FOVEditX->text()); } } void NewFOV::slotEyepieceAFOVChanged(int index) { if (index == 0) { ui->EyeFOV->setEnabled(true); } else { bool ok; ui->EyeFOV->setEnabled(false); ui->EyeFOV->setValue(ui->EyepieceAFOV->itemData(index).toFloat(&ok)); Q_ASSERT(ok); } } void NewFOV::slotComputeTelescopeFL() { TelescopeFL *telescopeFLDialog = new TelescopeFL(this); if (telescopeFLDialog->exec() == QDialog::Accepted) { ui->TLength1->setValue(telescopeFLDialog->computeFL()); } delete telescopeFLDialog; } //-------------TelescopeFL------------------// TelescopeFL::TelescopeFL(QWidget *parent) : QDialog(parent), aperture(nullptr), fNumber(nullptr), apertureUnit(nullptr) { setWindowTitle(i18n("Telescope Focal Length Calculator")); //QWidget *mainWidget = new QWidget( this ); QGridLayout *mainLayout = new QGridLayout(this); setLayout(mainLayout); aperture = new QDoubleSpinBox(); aperture->setRange(0.0, 100000.0); aperture->setDecimals(2); aperture->setSingleStep(0.1); fNumber = new QDoubleSpinBox(); fNumber->setRange(0.0, 99.9); fNumber->setDecimals(2); fNumber->setSingleStep(0.1); apertureUnit = new QComboBox(this); apertureUnit->insertItem(0, i18nc("millimeters", "mm")); apertureUnit->insertItem(1, i18n("inch")); mainLayout->addWidget(new QLabel(i18n("Aperture diameter: "), this), 0, 0); mainLayout->addWidget(aperture, 0, 1); mainLayout->addWidget(apertureUnit, 0, 2); mainLayout->addWidget(new QLabel(i18nc("F-Number or F-Ratio of optical system", "F-Number: "), this), 1, 0); mainLayout->addWidget(fNumber, 1, 1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); mainLayout->addWidget(buttonBox); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); show(); } double TelescopeFL::computeFL() const { const double inch_to_mm = 25.4; // 1 inch, by definition, is 25.4 mm return (aperture->value() * fNumber->value() * ((apertureUnit->currentIndex() == 1) ? inch_to_mm : 1.0)); // Focal Length = Aperture * F-Number, by definition of F-Number } unsigned int FOVDialog::currentItem() const { return fov->FOVListBox->currentRow(); } void FOVDialog::slotDetectFromINDI() { // TODO } diff --git a/kstars/org.kde.kstars.FOV.xml b/kstars/org.kde.kstars.FOV.xml new file mode 100644 index 000000000..cd2f66d36 --- /dev/null +++ b/kstars/org.kde.kstars.FOV.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + +