23 #include <kmessagebox.h>
24 #include <kfiledialog.h>
27 #include <kstandardaction.h>
31 #include <ktemporaryfile.h>
33 #include <kstatusbar.h>
34 #include <klineedit.h>
40 #include <KActionCollection>
44 #include <QRadioButton>
49 #include <QCloseEvent>
50 #include <QTreeWidget>
51 #include <QHeaderView>
52 #include <QApplication>
55 #include <QSignalMapper>
65 #include <netinet/in.h>
75 << I18N_NOOP(
"Equalize") << I18N_NOOP(
"High Pass");
80 fitsTab =
new KTabWidget(
this);
81 undoGroup =
new QUndoGroup(
this);
86 fitsTab->setTabsClosable(
true);
88 setCentralWidget(fitsTab);
90 connect(fitsTab, SIGNAL(currentChanged(
int)),
this, SLOT(
tabFocusUpdated(
int)));
91 connect(fitsTab, SIGNAL(tabCloseRequested(
int)),
this, SLOT(
closeTab(
int)));
95 statusBar()->insertItem(QString(),
FITS_VALUE);
99 statusBar()->insertItem(QString(),
FITS_ZOOM);
100 statusBar()->setItemFixed(
FITS_ZOOM, 50);
101 statusBar()->insertItem(QString(),
FITS_WCS);
102 statusBar()->setItemFixed(
FITS_WCS, 200);
103 statusBar()->insertPermanentItem(i18n(
"Welcome to KStars FITS Viewer"),
FITS_MESSAGE, 1);
104 statusBar()->setItemAlignment(
FITS_MESSAGE , Qt::AlignLeft);
109 action = actionCollection()->addAction(
"image_histogram");
110 action->setText(i18n(
"Histogram"));
111 connect(action, SIGNAL(triggered(
bool)), SLOT (
histoFITS()));
112 action->setShortcuts(KShortcut( Qt::CTRL+Qt::Key_H ));
116 action->setIcon(KIcon(tempFile.fileName()));
120 action->setIcon(KIcon(
"tools-wizard"));
122 KStandardAction::open(
this, SLOT(
openFile()), actionCollection());
123 saveFileAction = KStandardAction::save(
this, SLOT(
saveFile()), actionCollection());
124 saveFileAsAction = KStandardAction::saveAs(
this, SLOT(
saveFileAs()), actionCollection());
126 action = actionCollection()->addAction(
"fits_header");
127 action->setIcon(KIcon(
"document-properties"));
128 action->setText(i18n(
"FITS Header"));
129 connect(action, SIGNAL(triggered(
bool) ), SLOT(
headerFITS()));
131 KStandardAction::close(
this, SLOT(
slotClose()), actionCollection());
133 KStandardAction::copy(
this, SLOT(
copyFITS()), actionCollection());
135 KStandardAction::zoomIn(
this, SLOT(
ZoomIn()), actionCollection());
136 KStandardAction::zoomOut(
this, SLOT(
ZoomOut()), actionCollection());
137 KStandardAction::actualSize(
this, SLOT(
ZoomDefault()), actionCollection());
139 KAction *kundo = KStandardAction::undo(undoGroup, SLOT(undo()), actionCollection());
140 KAction *kredo = KStandardAction::redo(undoGroup, SLOT(redo()), actionCollection());
142 connect(undoGroup, SIGNAL(canUndoChanged(
bool)), kundo, SLOT(setEnabled(
bool)));
143 connect(undoGroup, SIGNAL(canRedoChanged(
bool)), kredo, SLOT(setEnabled(
bool)));
145 action = actionCollection()->addAction(
"image_stats");
146 action->setIcon(KIcon(
"view-statistics"));
147 action->setText(i18n(
"Statistics"));
148 connect(action, SIGNAL(triggered(
bool)), SLOT(
statFITS()));
150 action = actionCollection()->addAction(
"mark_stars");
151 action->setText(i18n(
"Mark Stars"));
152 connect(action, SIGNAL(triggered(
bool)), SLOT(
toggleStars()));
154 QSignalMapper *filterMapper =
new QSignalMapper(
this);
161 action = actionCollection()->addAction(QString(
"filter%1").arg(filterCounter));
162 action->setText(filter);
163 filterMapper->setMapping(action, filterCounter++);
164 connect(action, SIGNAL(triggered()), filterMapper, SLOT(map()));
169 connect(filterMapper, SIGNAL(mapped(
int)),
this, SLOT(
applyFilter(
int)));
181 createGUI(
"fitsviewer.rc");
183 setWindowTitle(i18n(
"KStars FITS Viewer"));
191 fitsTab->disconnect();
193 qDeleteAll(fitsImages);
201 if (tab->
loadFITS(imageName,mode, filter) ==
false)
203 if (fitsImages.size() == 0)
217 fitsTab->addTab(tab, imageName->fileName());
221 fitsTab->addTab(tab, i18n(
"Calibrate"));
225 fitsTab->addTab(tab, i18n(
"Focus"));
229 fitsTab->addTab(tab, i18n(
"Guide"));
238 connect(tab->
getImage(), SIGNAL(actionUpdated(QString,
bool)),
this, SLOT(
updateAction(QString,
bool)));
239 connect(tab, SIGNAL(changeStatus(
bool)),
this, SLOT(
updateTabStatus(
bool)));
241 saveFileAction->setEnabled(
true);
242 saveFileAsAction->setEnabled(
true);
247 fitsImages.push_back(tab);
249 fitsMap[fitsID] = tab;
251 fitsTab->setCurrentWidget(tab);
266 FITSTab *tab = fitsMap.value(fitsUID);
276 if (currentIndex < 0 || fitsImages.empty())
279 fitsImages[currentIndex]->tabPositionUpdated();
281 fitsImages[currentIndex]->getImage()->toggleStars(markStars);
284 fitsImages[currentIndex]->getImage()->updateFrame();
287 updateStatusBar(i18np(
"%1 star detected.",
"%1 stars detected.",fitsImages[currentIndex]->
getImage()->getImageData()->getDetectedStars(),
300 fitsTab->disconnect();
302 if (undoGroup->isClean())
306 for (
int i=0; i < fitsImages.size(); i++)
316 fitsTab->disconnect();
319 for (
int i=0; i < fitsImages.size(); i++)
326 if( undoGroup->isClean() )
334 KUrl fileURL = KFileDialog::getOpenUrl( QDir::homePath(),
"*.fits *.fit *.fts|Flexible Image Transport System");
335 if (fileURL.isEmpty())
338 QString fpath = fileURL.path();
343 foreach (
FITSTab *tab, fitsImages)
348 fitsTab->setCurrentWidget(tab);
359 fitsImages[fitsTab->currentIndex()]->saveFile();
366 if (fitsImages.empty())
369 fitsImages[fitsTab->currentIndex()]->saveFileAs();
375 if (fitsImages.empty())
378 fitsImages[fitsTab->currentIndex()]->copyFITS();
383 if (fitsImages.empty())
386 fitsImages[fitsTab->currentIndex()]->histoFITS();
391 if (fitsImages.empty())
394 fitsImages[fitsTab->currentIndex()]->statFITS();
399 if (fitsImages.empty())
402 fitsImages[fitsTab->currentIndex()]->headerFITS();
409 if (index < 0 || index >= fitsImages.size())
411 targetTab = fitsImages[index];
419 QString caption = i18n(
"Save Changes to FITS?" );
420 QString message = i18n(
"%1 has unsaved changes. Would you like to save before closing it?", targetTab->
getCurrentURL()->fileName());
421 int ans = KMessageBox::warningYesNoCancel( 0, message, caption, KStandardGuiItem::save(), KStandardGuiItem::discard() );
422 if( ans == KMessageBox::Yes )
427 else if( ans == KMessageBox::No )
432 else if ( ans == KMessageBox::Cancel)
443 statusBar()->changeItem(msg,
id);
448 if (fitsImages.empty())
451 fitsImages[fitsTab->currentIndex()]->ZoomIn();
456 if (fitsImages.empty())
459 fitsImages[fitsTab->currentIndex()]->ZoomOut();
464 if (fitsImages.empty())
467 fitsImages[fitsTab->currentIndex()]->ZoomDefault();
472 QAction *toolAction = NULL;
474 toolAction = actionCollection()->action(name);
475 if (toolAction != NULL)
476 toolAction->setEnabled (enable);
481 if (fitsImages.empty() || (fitsTab->currentIndex() >= fitsImages.size()))
484 if (fitsImages[fitsTab->currentIndex()]->getImage()->getMode() !=
FITS_NORMAL)
487 QString tabText = fitsImages[fitsTab->currentIndex()]->getCurrentURL()->fileName();
489 fitsTab->setTabText(fitsTab->currentIndex(), clean ? tabText : tabText +
'*');
494 if (fitsImages.empty())
497 FITSTab *tab = fitsImages[index];
507 fitsMap.remove(tab->
getUID());
508 fitsImages.removeOne(tab);
511 if (fitsImages.empty())
513 saveFileAction->setEnabled(
false);
514 saveFileAsAction->setEnabled(
false);
525 actionCollection()->action(
"mark_stars")->setText( i18n(
"Mark Stars" ) );
530 actionCollection()->action(
"mark_stars")->setText( i18n(
"Unmark Stars" ) );
533 foreach(
FITSTab *tab, fitsImages)
546 if (fitsImages.empty())
549 fitsImages[fitsTab->currentIndex()]->getHistogram()->applyFilter((
FITSScale) ftype);
550 fitsImages[fitsTab->currentIndex()]->getImage()->updateFrame();
557 FITSTab *tab = fitsMap.value(fitsUID);
565 #include "fitsviewer.moc"
virtual void closeEvent(QCloseEvent *ev)
void updateTabStatus(bool clean)
FITSViewer(QWidget *parent)
Constructor.
bool openDataFile(QFile &file, const QString &filename)
Attempt to open the data file named filename, using the QFile object "file".
void toggleStars(bool enable)
bool loadFITS(const KUrl *imageURL, FITSMode mode=FITS_NORMAL, FITSScale filter=FITS_NONE)
QUndoStack * getUndoStack()
int addFITS(const KUrl *imageName, FITSMode mode=FITS_NORMAL, FITSScale filter=FITS_NONE)
bool updateFITS(const KUrl *imageName, int fitsUID, FITSScale filter=FITS_NONE)
void tabPositionUpdated()
int saveUnsaved(int index)
void applyFilter(int ftype)
void updateStatusBar(const QString &msg, FITSBar id)
void tabFocusUpdated(int currentIndex)
static QStringList filterTypes
FITSView * getImage(int fitsUID)
void updateAction(const QString &name, bool enable)
void newStatus(const QString &msg, FITSBar id)