• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
  • fitsviewer
fitstab.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  FITS Tab
3  -------------------
4  copyright : (C) 2012 by Jasem Mutlaq
5  email : mutlaqja@ikarustech.com
6  ***************************************************************************/
7 
8 /***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
17 #include <QClipboard>
18 
19 #include <KUndoStack>
20 #include <KLocale>
21 #include <KMessageBox>
22 #include <KFileDialog>
23 
24 #include "Options.h"
25 #include "fitstab.h"
26 #include "fitsview.h"
27 #include "fitshistogram.h"
28 #include "fitsviewer.h"
29 
30 #include "ui_statform.h"
31 #include "ui_fitsheaderdialog.h"
32 
33 FITSTab::FITSTab(FITSViewer *parent) : QWidget()
34 {
35  image = NULL;
36  histogram = NULL;
37  viewer = parent;
38 
39  mDirty = false;
40  undoStack = new KUndoStack(this);
41  undoStack->setUndoLimit(10);
42  undoStack->clear();
43  connect(undoStack, SIGNAL(cleanChanged(bool)), this, SLOT(modifyFITSState(bool)));
44 }
45 
46 FITSTab::~FITSTab()
47 {
48  disconnect(0,0,0);
49 }
50 
51 void FITSTab::saveUnsaved()
52 {
53 
54  if( undoStack->isClean() || image->getMode() != FITS_NORMAL)
55  return;
56 
57  QString caption = i18n( "Save Changes to FITS?" );
58  QString message = i18n( "The current FITS file has unsaved changes. Would you like to save before closing it?" );
59  int ans = KMessageBox::warningYesNoCancel( 0, message, caption, KStandardGuiItem::save(), KStandardGuiItem::discard() );
60  if( ans == KMessageBox::Yes )
61  saveFile();
62  if( ans == KMessageBox::No )
63  {
64  undoStack->clear();
65  modifyFITSState();
66  }
67 }
68 
69 
70 void FITSTab::closeEvent(QCloseEvent *ev)
71 {
72  saveUnsaved();
73  if( undoStack->isClean() )
74  ev->accept();
75  else
76  ev->ignore();
77 
78 }
79 
80 bool FITSTab::loadFITS(const KUrl *imageURL, FITSMode mode, FITSScale filter)
81 {
82  if (image == NULL)
83  {
84  image = new FITSView(this, mode);
85  image->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
86  QVBoxLayout *vlayout = new QVBoxLayout();
87 
88  vlayout->addWidget(image);
89 
90  setLayout(vlayout);
91  connect(image, SIGNAL(newStatus(QString,FITSBar)), this, SIGNAL(newStatus(QString,FITSBar)));
92  }
93 
94  currentURL = *imageURL;
95 
96  bool imageLoad = image->loadFITS(imageURL->url());
97 
98  if (imageLoad)
99  {
100  if (histogram == NULL)
101  histogram = new FITSHistogram(this);
102  else
103  histogram->updateHistogram();
104 
105  FITSImage *image_data = image->getImageData();
106 
107  image_data->setHistogram(histogram);
108  image_data->applyFilter(filter);
109 
110  if (filter != FITS_NONE)
111  image->rescale(ZOOM_KEEP_LEVEL);
112 
113  if (viewer->isStarsMarked())
114  image->toggleStars(true);
115 
116  image->updateFrame();
117  }
118 
119 
120  return imageLoad;
121 }
122 
123 void FITSTab::modifyFITSState(bool clean)
124 {
125  if (clean)
126  {
127  if (undoStack->isClean() == false)
128  undoStack->setClean();
129 
130  mDirty = false;
131  }
132  else
133  mDirty = true;
134 
135  emit changeStatus(clean);
136 }
137 
138 int FITSTab::saveFITS(const QString &filename)
139 {
140  return image->saveFITS(filename);
141 }
142 
143 void FITSTab::copyFITS()
144 {
145  QApplication::clipboard()->setImage( *(image->getDisplayImage()) );
146 }
147 
148 void FITSTab::histoFITS()
149 {
150  histogram->show();
151 }
152 
153 
154 void FITSTab::statFITS()
155 {
156  QDialog statDialog;
157  Ui::statForm stat;
158  stat.setupUi(&statDialog);
159 
160  FITSImage *image_data = image->getImageData();
161 
162  stat.widthOUT->setText(QString::number(image_data->getWidth()));
163  stat.heightOUT->setText(QString::number(image_data->getHeight()));
164  stat.bitpixOUT->setText(QString::number(image_data->getBPP()));
165  stat.maxOUT->setText(QString::number(image_data->getMax()));
166  stat.minOUT->setText(QString::number(image_data->getMin()));
167  stat.meanOUT->setText(QString::number(image_data->getAverage()));
168  stat.stddevOUT->setText(QString::number(image_data->getStdDev(), 'g', 3));
169  stat.HFROUT->setText(QString::number(image_data->getHFR(), 'g', 3));
170 
171  statDialog.exec();
172 }
173 
174 void FITSTab::headerFITS()
175 {
176  QString recordList;
177  int nkeys;
178  int err_status;
179  char err_text[FLEN_STATUS];
180 
181  FITSImage *image_data = image->getImageData();
182 
183  if ( (err_status = image_data->getFITSRecord(recordList, nkeys)) < 0)
184  {
185  fits_get_errstatus(err_status, err_text);
186  KMessageBox::error(0, i18n("FITS record error: %1", QString::fromUtf8(err_text)), i18n("FITS Header"));
187  return;
188  }
189 
190  //FIXME: possible crash! Must use QPointer<...>!
191  QDialog fitsHeaderDialog;
192  Ui::fitsHeaderDialog header;
193  header.setupUi(&fitsHeaderDialog);
194  header.tableWidget->setRowCount(nkeys);
195  for(int i = 0; i < nkeys; i++)
196  {
197  QString record = recordList.mid(i*80, 80);
198  // I love regexp!
199  QStringList properties = record.split(QRegExp("[=/]"));
200 
201  QTableWidgetItem* tempItem = new QTableWidgetItem(properties[0].simplified());
202  tempItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
203  header.tableWidget->setItem(i, 0, tempItem);
204 
205  if (properties.size() > 1)
206  {
207  tempItem = new QTableWidgetItem(properties[1].simplified());
208  tempItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
209  header.tableWidget->setItem(i, 1, tempItem);
210  }
211 
212  if (properties.size() > 2)
213  {
214  tempItem = new QTableWidgetItem(properties[2].simplified());
215  tempItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
216  header.tableWidget->setItem(i, 2, tempItem);
217  }
218 
219  }
220 
221  header.tableWidget->resizeColumnsToContents();
222  fitsHeaderDialog.exec();
223 
224 }
225 
226 
227 void FITSTab::saveFile()
228 {
229  int err_status;
230  char err_text[FLEN_STATUS];
231 
232  KUrl backupCurrent = currentURL;
233  QString currentDir = Options::fitsDir();
234 
235  if (currentURL.path().contains("/tmp/"))
236  currentURL.clear();
237 
238  // If no changes made, return.
239  if( mDirty == false && !currentURL.isEmpty())
240  return;
241 
242  if (currentURL.isEmpty())
243  {
244  currentURL = KFileDialog::getSaveUrl( currentDir, "*.fits |Flexible Image Transport System");
245  // if user presses cancel
246  if (currentURL.isEmpty())
247  {
248  currentURL = backupCurrent;
249  return;
250  }
251 
252  if (currentURL.path().contains('.') == 0)
253  currentURL.setPath(currentURL.path() + ".fits");
254 
255  if (QFile::exists(currentURL.path()))
256  {
257  int r = KMessageBox::warningContinueCancel(0,
258  i18n( "A file named \"%1\" already exists. "
259  "Overwrite it?", currentURL.fileName() ),
260  i18n( "Overwrite File?" ),
261  KGuiItem(i18n( "&Overwrite" )) );
262  if(r==KMessageBox::Cancel) return;
263  }
264  }
265 
266  if ( currentURL.isValid() )
267  {
268  if ( (err_status = saveFITS('!' + currentURL.path())) < 0)
269  {
270  fits_get_errstatus(err_status, err_text);
271  // Use KMessageBox or something here
272  KMessageBox::error(0, i18n("FITS file save error: %1",
273  QString::fromUtf8(err_text)), i18n("FITS Save"));
274  return;
275  }
276 
277  //statusBar()->changeItem(i18n("File saved."), 3);
278 
279  emit newStatus(i18n("File saved."), FITS_MESSAGE);
280  modifyFITSState();
281  } else
282  {
283  QString message = i18n( "Invalid URL: %1", currentURL.url() );
284  KMessageBox::sorry( 0, message, i18n( "Invalid URL" ) );
285  }
286 }
287 
288 void FITSTab::saveFileAs()
289 {
290  currentURL.clear();
291  saveFile();
292 }
293 
294 void FITSTab::ZoomIn()
295 {
296  image->ZoomIn();
297 }
298 
299 void FITSTab::ZoomOut()
300 {
301  image->ZoomOut();
302 }
303 
304 void FITSTab::ZoomDefault()
305 {
306  image->ZoomDefault();
307 }
308 
309 void FITSTab::tabPositionUpdated()
310 {
311  undoStack->setActive(true);
312  emit newStatus(QString("%1%").arg(image->getCurrentZoom()), FITS_ZOOM);
313  emit newStatus(QString("%1x%2").arg(image->getImageData()->getWidth()).arg(image->getImageData()->getHeight()), FITS_RESOLUTION);
314 }
FITSTab::saveFile
void saveFile()
Definition: fitstab.cpp:227
FITSView::getImageData
FITSImage * getImageData()
Definition: fitsview.h:98
fitstab.h
FITSTab::headerFITS
void headerFITS()
Definition: fitstab.cpp:174
FITSView::loadFITS
bool loadFITS(const QString &filename)
Definition: fitsview.cpp:162
FITSImage
Definition: fitsimage.h:73
FITSTab::closeEvent
virtual void closeEvent(QCloseEvent *ev)
Definition: fitstab.cpp:70
FITSTab::FITSTab
FITSTab(FITSViewer *parent)
Definition: fitstab.cpp:33
FITSViewer::isStarsMarked
bool isStarsMarked()
Definition: fitsviewer.h:65
FITSTab::ZoomIn
void ZoomIn()
Definition: fitstab.cpp:294
QDialog
FITSTab::saveUnsaved
void saveUnsaved()
Definition: fitstab.cpp:51
FITSTab::ZoomOut
void ZoomOut()
Definition: fitstab.cpp:299
QWidget
FITSImage::getFITSRecord
int getFITSRecord(QString &recordList, int &nkeys)
Definition: fitsimage.cpp:451
FITSTab::statFITS
void statFITS()
Definition: fitstab.cpp:154
FITS_NORMAL
Definition: fitscommon.h:20
FITSView
Definition: fitsview.h:81
FITS_MESSAGE
Definition: fitscommon.h:21
FITSTab::newStatus
void newStatus(const QString &msg, FITSBar id)
FITSTab::changeStatus
void changeStatus(bool clean)
fitsview.h
FITSHistogram::updateHistogram
void updateHistogram()
Definition: fitshistogram.cpp:300
FITSView::rescale
int rescale(FITSZoom type)
Definition: fitsview.cpp:222
FITSImage::getHeight
long getHeight()
Definition: fitsimage.h:99
FITSView::getCurrentZoom
double getCurrentZoom()
Definition: fitsview.h:99
FITSTab::saveFileAs
void saveFileAs()
Definition: fitstab.cpp:288
FITSView::saveFITS
int saveFITS(const QString &filename)
Definition: fitsview.cpp:216
fitshistogram.h
FITSView::getDisplayImage
QImage * getDisplayImage()
Definition: fitsview.h:100
FITSImage::applyFilter
void applyFilter(FITSScale type, float *image=NULL, int min=-1, int max=-1)
Definition: fitsimage.cpp:829
FITSScale
FITSScale
Definition: fitscommon.h:22
FITSView::toggleStars
void toggleStars(bool enable)
Definition: fitsview.cpp:458
FITSImage::getMin
double getMin()
Definition: fitsimage.h:94
Options::fitsDir
static QString fitsDir()
Get FITS Default directory.
Definition: Options.h:695
FITSTab::loadFITS
bool loadFITS(const KUrl *imageURL, FITSMode mode=FITS_NORMAL, FITSScale filter=FITS_NONE)
Definition: fitstab.cpp:80
FITSView::ZoomDefault
void ZoomDefault()
Definition: fitsview.cpp:378
FITSTab::~FITSTab
~FITSTab()
Definition: fitstab.cpp:46
FITSTab::histoFITS
void histoFITS()
Definition: fitstab.cpp:148
ZOOM_KEEP_LEVEL
Definition: fitscommon.h:23
FITS_RESOLUTION
Definition: fitscommon.h:21
FITSTab::modifyFITSState
void modifyFITSState(bool clean=true)
Definition: fitstab.cpp:123
FITSTab::saveFITS
int saveFITS(const QString &filename)
Definition: fitstab.cpp:138
Options.h
FITSView::ZoomOut
void ZoomOut()
Definition: fitsview.cpp:331
FITSImage::getWidth
long getWidth()
Definition: fitsimage.h:98
FITSTab::tabPositionUpdated
void tabPositionUpdated()
Definition: fitstab.cpp:309
FITSHistogram
Definition: fitshistogram.h:48
FITSTab::copyFITS
void copyFITS()
Definition: fitstab.cpp:143
FITSImage::setHistogram
void setHistogram(FITSHistogram *inHistogram)
Definition: fitsimage.h:111
FITSBar
FITSBar
Definition: fitscommon.h:21
FITS_ZOOM
Definition: fitscommon.h:21
FITSImage::getHFR
double getHFR(HFRType type=HFR_AVERAGE)
Definition: fitsimage.cpp:782
fitsviewer.h
FITS_NONE
Definition: fitscommon.h:22
FITSView::updateFrame
void updateFrame()
Definition: fitsview.cpp:352
FITSImage::getMax
double getMax()
Definition: fitsimage.h:95
FITSImage::getBPP
int getBPP()
Definition: fitsimage.h:102
FITSTab::ZoomDefault
void ZoomDefault()
Definition: fitstab.cpp:304
FITSView::ZoomIn
void ZoomIn()
Definition: fitsview.cpp:309
FITSViewer
Definition: fitsviewer.h:51
FITSImage::getStdDev
double getStdDev()
Definition: fitsimage.h:100
FITSView::getMode
FITSMode getMode()
Definition: fitsview.h:101
FITSMode
FITSMode
Definition: fitscommon.h:20
FITSImage::getAverage
double getAverage()
Definition: fitsimage.h:101
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:19 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

Skip menu "kstars"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal