Kstars

opscolors.cpp
1 /*
2  SPDX-FileCopyrightText: 2004 Jason Harris <[email protected]>
3 
4  SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "opscolors.h"
8 
9 #include "colorscheme.h"
10 #include "config-kstars.h"
11 #include "kspaths.h"
12 #include "kstars.h"
13 #include "ksnotification.h"
14 #include "kstarsdata.h"
15 #include "skymap.h"
16 #include "thememanager.h"
17 #ifdef HAVE_CFITSIO
18 #include "fitsviewer/fitsviewer.h"
19 #include "fitsviewer/fitsview.h"
20 #endif
21 #include "skyobjects/starobject.h"
22 
23 #include <KActionCollection>
24 #include <KLocalizedString>
25 #include <KMessageBox>
26 
27 #include <QColorDialog>
28 #include <QComboBox>
29 #include <QDoubleSpinBox>
30 #include <QFile>
31 #include <QInputDialog>
32 #include <QPixmap>
33 #include <QPushButton>
34 #include <QStandardPaths>
35 #include <QTextStream>
36 
37 static int ItemColorData = Qt::UserRole + 1;
38 
39 OpsColors::OpsColors() : QFrame(KStars::Instance())
40 {
41  setupUi(this);
42 
43  //Populate list of Application Themes
44  KSTheme::Manager::instance()->populateThemeQListWidget(themesWidget);
45  connect(themesWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(slotChangeTheme(QListWidgetItem*)));
46 
47  //Populate list of adjustable colors
48  for (unsigned int i = 0; i < KStarsData::Instance()->colorScheme()->numberOfColors(); ++i)
49  {
50  QPixmap col(30, 20);
51  QColor itemColor(KStarsData::Instance()->colorScheme()->colorAt(i));
52  col.fill(itemColor);
53  QListWidgetItem *item = new QListWidgetItem(KStarsData::Instance()->colorScheme()->nameAt(i), ColorPalette);
54  item->setData(Qt::DecorationRole, col);
55  item->setData(ItemColorData, itemColor);
56  }
57 
58  PresetBox->addItem(i18nc("use default color scheme", "Default Colors"));
59  PresetBox->addItem(i18nc("use 'star chart' color scheme", "Star Chart"));
60  PresetBox->addItem(i18nc("use 'night vision' color scheme", "Night Vision"));
61  PresetBox->addItem(i18nc("use 'moonless night' color scheme", "Moonless Night"));
62 
63  PresetFileList.append("classic.colors");
64  PresetFileList.append("chart.colors");
65  PresetFileList.append("night.colors");
66  PresetFileList.append("moonless-night.colors");
67 
68  QFile file;
69  QString line, schemeName, filename;
70  file.setFileName(KSPaths::locate(QStandardPaths::AppLocalDataLocation, "colors.dat"));
71  if (file.exists() && file.open(QIODevice::ReadOnly))
72  {
73  QTextStream stream(&file);
74 
75  while (!stream.atEnd())
76  {
77  line = stream.readLine();
78  schemeName = line.left(line.indexOf(':'));
79  filename = line.mid(line.indexOf(':') + 1, line.length());
80  PresetBox->addItem(schemeName);
81  PresetFileList.append(filename);
82  }
83  file.close();
84  }
85 
86  kcfg_StarColorIntensity->setValue(KStarsData::Instance()->colorScheme()->starColorIntensity());
87  kcfg_StarColorMode->addItem(i18nc("use realistic star colors", "Real Colors"));
88  kcfg_StarColorMode->addItem(i18nc("show stars as red circles", "Solid Red"));
89  kcfg_StarColorMode->addItem(i18nc("show stars as black circles", "Solid Black"));
90  kcfg_StarColorMode->addItem(i18nc("show stars as white circles", "Solid White"));
91  kcfg_StarColorMode->addItem(i18nc("show stars as colored circles", "Solid Colors"));
92  kcfg_StarColorMode->setCurrentIndex(KStarsData::Instance()->colorScheme()->starColorMode());
93 
94  if (KStarsData::Instance()->colorScheme()->starColorMode() != 0) //mode is not "Real Colors"
95  kcfg_StarColorIntensity->setEnabled(false);
96  else
97  kcfg_StarColorIntensity->setEnabled(true);
98 
99  connect(ColorPalette, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(newColor(QListWidgetItem*)));
100  connect(kcfg_StarColorIntensity, SIGNAL(valueChanged(int)), this, SLOT(slotStarColorIntensity(int)));
101  connect(kcfg_StarColorMode, SIGNAL(activated(int)), this, SLOT(slotStarColorMode(int)));
102  connect(PresetBox, SIGNAL(currentRowChanged(int)), this, SLOT(slotPreset(int)));
103  connect(AddPreset, SIGNAL(clicked()), this, SLOT(slotAddPreset()));
104  connect(RemovePreset, SIGNAL(clicked()), this, SLOT(slotRemovePreset()));
105  connect(SavePreset, SIGNAL(clicked()), this, SLOT(slotSavePreset()));
106 
107  RemovePreset->setEnabled(false);
108  SavePreset->setEnabled(false);
109 }
110 
111 void OpsColors::slotChangeTheme(QListWidgetItem *item)
112 {
113  KSTheme::Manager::instance()->setCurrentTheme(item->text());
114 }
115 
116 void OpsColors::newColor(QListWidgetItem *item)
117 {
118  if (!item)
119  return;
120 
121  QPixmap pixmap(30, 20);
122  QColor NewColor;
123 
124  int index = ColorPalette->row(item);
125  if (index < 0 || index >= ColorPalette->count())
126  return;
127  QColor col = item->data(ItemColorData).value<QColor>();
128  NewColor = QColorDialog::getColor(col);
129 
130  //NewColor will only be valid if the above if statement was found to be true during one of the for loop iterations
131  if (NewColor.isValid())
132  {
133  pixmap.fill(NewColor);
134  item->setData(Qt::DecorationRole, pixmap);
135  item->setData(ItemColorData, NewColor);
136  KStarsData::Instance()->colorScheme()->setColor(KStarsData::Instance()->colorScheme()->keyAt(index),
137  NewColor.name());
138  }
139 
140  if (PresetBox->currentRow() > 3)
141  SavePreset->setEnabled(true);
142 
144 
145 #ifdef HAVE_CFITSIO
147  for (auto &viewer : viewers)
148  {
149  QSharedPointer<FITSView> currentView;
150  if (viewer->getCurrentView(currentView))
151  currentView->updateFrame();
152  }
153 #endif
154 }
155 
156 void OpsColors::slotPreset(int index)
157 {
158  QString sPreset = PresetFileList.at(index);
159  setColors(sPreset);
160 }
161 
162 bool OpsColors::setColors(const QString &filename)
163 {
164  QPixmap temp(30, 20);
165 
166  //check if colorscheme is removable...
167  QFile test;
168  //try filename in local user KDE directory tree.
169  test.setFileName(QDir(KSPaths::writableLocation(QStandardPaths::AppLocalDataLocation)).filePath(filename));
170  if (test.exists())
171  {
172  RemovePreset->setEnabled(true);
173  SavePreset->setEnabled(true);
174  }
175  else
176  {
177  RemovePreset->setEnabled(false);
178  SavePreset->setEnabled(false);
179  }
180  test.close();
181 
182  QString actionName = QString("cs_" + filename.left(filename.indexOf(".colors"))).toUtf8();
183  QAction *a = KStars::Instance()->actionCollection()->action(actionName);
184  if (a)
185  a->setChecked(true);
186  qApp->processEvents();
187 
188  kcfg_StarColorMode->setCurrentIndex(KStarsData::Instance()->colorScheme()->starColorMode());
189  kcfg_StarColorIntensity->setValue(KStarsData::Instance()->colorScheme()->starColorIntensity());
190 
191  for (unsigned int i = 0; i < KStarsData::Instance()->colorScheme()->numberOfColors(); ++i)
192  {
193  QColor itemColor(KStarsData::Instance()->colorScheme()->colorAt(i));
194  temp.fill(itemColor);
195  ColorPalette->item(i)->setData(Qt::DecorationRole, temp);
196  ColorPalette->item(i)->setData(ItemColorData, itemColor);
197  }
198 
200 #ifdef HAVE_CFITSIO
202  for (auto &viewer : viewers)
203  {
204  QSharedPointer<FITSView> currentView;
205  if (viewer->getCurrentView(currentView))
206  currentView->updateFrame();
207  }
208 #endif
209 
210  return true;
211 }
212 
213 void OpsColors::slotAddPreset()
214 {
215  bool okPressed = false;
216  QString schemename =
217  QInputDialog::getText(nullptr, i18n("New Color Scheme"), i18n("Enter a name for the new color scheme:"),
218  QLineEdit::Normal, QString(), &okPressed);
219 
220  if (okPressed && !schemename.isEmpty())
221  {
222  if (KStarsData::Instance()->colorScheme()->save(schemename))
223  {
224  QListWidgetItem *item = new QListWidgetItem(schemename, PresetBox);
225  QString fname = KStarsData::Instance()->colorScheme()->fileName();
226  PresetFileList.append(fname);
227  QString actionName = QString("cs_" + fname.left(fname.indexOf(".colors"))).toUtf8();
228  KStars::Instance()->addColorMenuItem(schemename, actionName);
229 
230  QAction *a = KStars::Instance()->actionCollection()->action(actionName);
231  if (a)
232  a->setChecked(true);
233  PresetBox->setCurrentItem(item);
234  }
235  }
236 }
237 
238 void OpsColors::slotSavePreset()
239 {
240  QString schemename = PresetBox->currentItem()->text();
241  KStarsData::Instance()->colorScheme()->save(schemename);
242  SavePreset->setEnabled(false);
243 }
244 
245 void OpsColors::slotRemovePreset()
246 {
247  QListWidgetItem *current = PresetBox->currentItem();
248  if (!current)
249  return;
250  QString name = current->text();
251  QString filename = PresetFileList[PresetBox->currentRow()];
252  QFile cdatFile;
253  //determine filename in local user KDE directory tree.
254  cdatFile.setFileName(QDir(KSPaths::writableLocation(QStandardPaths::AppLocalDataLocation)).filePath("colors.dat"));
255 
256  //Remove action from color-schemes menu
257  KStars::Instance()->removeColorMenuItem(QString("cs_" + filename.left(filename.indexOf(".colors"))).toUtf8());
258 
259  if (!cdatFile.exists() || !cdatFile.open(QIODevice::ReadWrite))
260  {
261  QString message = i18n("Local color scheme index file could not be opened.\nScheme cannot be removed.");
262  KSNotification::sorry(message, i18n("Could Not Open File"));
263  }
264  else
265  {
266  //Remove entry from the ListBox and from the QStringList holding filenames.
267  //There seems to be no way to set no item selected, so select
268  // the first item.
269  PresetBox->setCurrentRow(0);
270  PresetFileList.removeOne(filename);
271  delete current;
272  RemovePreset->setEnabled(false);
273 
274  //Read the contents of colors.dat into a QStringList, except for the entry to be removed.
275  QTextStream stream(&cdatFile);
276  QStringList slist;
277  bool removed = false;
278 
279  while (!stream.atEnd())
280  {
281  QString line = stream.readLine();
282  if (line.left(line.indexOf(':')) != name)
283  slist.append(line);
284  else
285  removed = true;
286  }
287 
288  if (removed) //Entry was removed; delete the corresponding .colors file.
289  {
290  QFile colorFile;
291  //determine filename in local user KDE directory tree.
292  colorFile.setFileName(QDir(KSPaths::writableLocation(QStandardPaths::AppLocalDataLocation)).filePath(filename));
293  if (!colorFile.remove())
294  {
295  QString message = i18n("Could not delete the file: %1", colorFile.fileName());
296  KSNotification::sorry(message, i18n("Error Deleting File"));
297  }
298 
299  //remove the old colors.dat file, and rebuild it with the modified string list.
300  cdatFile.remove();
301  cdatFile.open(QIODevice::ReadWrite);
302  QTextStream stream2(&cdatFile);
303  for (int i = 0; i < slist.count(); ++i)
304  stream << slist[i] << '\n';
305  }
306  else
307  {
308  QString message = i18n("Could not find an entry named %1 in colors.dat.", name);
309  KSNotification::sorry(message, i18n("Scheme Not Found"));
310  }
311  cdatFile.close();
312  }
313 }
314 
315 void OpsColors::slotStarColorMode(int i)
316 {
317  KStarsData::Instance()->colorScheme()->setStarColorMode(i);
318 
319  if (KStarsData::Instance()->colorScheme()->starColorMode() != 0) //mode is not "Real Colors"
320  kcfg_StarColorIntensity->setEnabled(false);
321  else
322  kcfg_StarColorIntensity->setEnabled(true);
323 }
324 
325 void OpsColors::slotStarColorIntensity(int i)
326 {
327  KStarsData::Instance()->colorScheme()->setStarColorIntensity(i);
328 }
void append(const T &value)
bool save(const QString &name)
Save the current color scheme to a *.colors file.
QString text() const const
QAction * action(const QString &name) const
unsigned int numberOfColors() const
Definition: colorscheme.h:100
UserRole
bool remove()
virtual bool open(QIODevice::OpenMode mode) override
int count(const T &value) const const
T value() const const
QString name() const const
SkyMap * map() const
Definition: kstars.h:143
void setStarColorMode(int mode)
Set the star color mode used by the color scheme mode the star color mode to use.
bool exists() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
virtual QString fileName() const const override
static KStars * Instance()
Definition: kstars.h:125
QColor getColor(const QColor &initial, QWidget *parent, const QString &title, QColorDialog::ColorDialogOptions options)
virtual QVariant data(int role) const const
KGuiItem test()
void setEnabled(bool enable)
QString i18n(const char *text, const TYPE &arg...)
virtual void setData(int role, const QVariant &value)
ColorScheme * colorScheme()
Definition: kstarsdata.h:171
Primary window to view monochrome and color FITS images. The FITSviewer can open multiple images each...
Definition: fitsviewer.h:48
bool isEmpty() const const
QList< T > findChildren(const QString &name, Qt::FindChildOptions options) const const
QByteArray toUtf8() const const
int length() const const
QString fileName() const
Definition: colorscheme.h:91
QString getText(QWidget *parent, const QString &title, const QString &label, QLineEdit::EchoMode mode, const QString &text, bool *ok, Qt::WindowFlags flags, Qt::InputMethodHints inputMethodHints)
void setFileName(const QString &name)
virtual void close() override
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const const
This is the main window for KStars. In addition to the GUI elements, the class contains the program c...
Definition: kstars.h:92
void setupUi(QWidget *widget)
virtual KActionCollection * actionCollection() const
QString left(int n) const const
const char * name(StandardAction id)
const QChar at(int position) const const
QString i18nc(const char *context, const char *text, const TYPE &arg...)
bool isValid() const const
void setColor(const QString &key, const QString &color)
Change the color with the given key to the given value key the key-name of the color to be changed co...
void removeColorMenuItem(const QString &actionName)
Remove an item from the color-scheme action manu.
void addColorMenuItem(QString name, const QString &actionName)
Add an item to the color-scheme action manu.
void forceUpdate(bool now=false)
Recalculates the positions of objects in the sky, and then repaints the sky map.
Definition: skymap.cpp:1186
void setChecked(bool)
void setStarColorIntensity(int intens)
Set the star color intensity value used by the color scheme intens The star color intensity value.
QString mid(int position, int n) const const
QString message
QString & append(QChar ch)
QAction * save(const QObject *recvr, const char *slot, QObject *parent)
This file is part of the KDE documentation.
Documentation copyright © 1996-2022 The KDE developers.
Generated on Tue Aug 16 2022 04:00:57 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.