GradientMenu.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "GradientMenu.h"
  2. #include "ui_GradientMenu.h"
  3. #include "Serialize.h"
  4. #include "XmlException.h"
  5. #include <QFile>
  6. #include <QMessageBox>
  7. #include <QFileDialog>
  8. #include <QTextEdit>
  9. using alm::Gradient;
  10. const QString GradientMenu::presetNames[] = {
  11. "almond",
  12. "blue gold",
  13. "clouds",
  14. "oldschool",
  15. "element",
  16. "ikea",
  17. "grayscale",
  18. "peach",
  19. "rainbow"
  20. };
  21. GradientMenu::GradientMenu(QWidget *parent) :
  22. QWidget(parent),
  23. ui(new Ui::GradientMenu)
  24. {
  25. ui->setupUi(this);
  26. ui->gradientWidget->setGradient({
  27. std::vector<std::pair<RGBColor, float>> {
  28. { RGBColor{ 10, 200, 20 }, 0.1 },
  29. { RGBColor{ 100, 20, 120 }, 0.7 }
  30. },
  31. 1.0f
  32. });
  33. for (const auto& presetName : presetNames) {
  34. ui->presetCmb->addItem(presetName);
  35. }
  36. connect(ui->gradientWidget, &GradientWidget::gradientChanged, this, &GradientMenu::gradientChanged);
  37. connect(ui->gradientWidget, &GradientWidget::gradientChanged, this, &GradientMenu::onGradientChanged);
  38. }
  39. GradientMenu::~GradientMenu()
  40. {
  41. delete ui;
  42. }
  43. const Gradient& GradientMenu::getGradient(void)
  44. {
  45. return ui->gradientWidget->getGradient();
  46. }
  47. const Gradient& GradientMenu::getGradientBefore(void) const
  48. {
  49. return before;
  50. }
  51. void GradientMenu::setGradient(Gradient grad)
  52. {
  53. before = grad;
  54. ui->gradientWidget->setGradient(std::move(grad));
  55. }
  56. void GradientMenu::loadGradient(QFile& file)
  57. {
  58. if (file.isOpen() || file.open(QFile::ReadOnly)) {
  59. QString xml = QString::fromUtf8(file.readAll());
  60. try {
  61. ui->gradientWidget->setGradient(alm::fromXml<alm::Gradient>(xml.toStdString()));
  62. } catch (alm::XmlException& xmlex) {
  63. QMessageBox::critical(this, tr("Error Loading Gradient"), tr("Error loading gradient: ") + xmlex.what());
  64. } catch (...) {
  65. QMessageBox::critical(this, tr("Error Loading Gradient"), tr("Unknown error loading gradient."));
  66. }
  67. }
  68. }
  69. void GradientMenu::onGradientChanged(void)
  70. {
  71. ui->maxValSpb->setValue(ui->gradientWidget->getGradient().getMax());
  72. }
  73. void GradientMenu::on_removeBtn_clicked()
  74. {
  75. ui->gradientWidget->removeSelectedHandle();
  76. }
  77. void GradientMenu::on_presetCmb_currentIndexChanged(int index)
  78. {
  79. QString presetName = presetNames[index];
  80. QFile gradXml{ ":/gradients/" + presetName };
  81. loadGradient(gradXml);
  82. }
  83. void GradientMenu::on_saveBtn_clicked()
  84. {
  85. std::string xml = alm::toXml(ui->gradientWidget->getGradient());
  86. QString filename =
  87. QFileDialog::getSaveFileName(this, tr("Save Gradient"), "", "Gradient XML Files (*.xml)");
  88. if (!filename.isNull()) {
  89. QFile saveFile{ filename };
  90. bool opened = saveFile.open(QFile::WriteOnly);
  91. if (!opened) {
  92. QMessageBox::critical(this, tr("Error saving file"), tr("Error saving gradient: Could not open file."));
  93. }
  94. saveFile.write(QString::fromStdString(xml).toUtf8());
  95. saveFile.close();
  96. }
  97. }
  98. void GradientMenu::on_loadBtn_clicked()
  99. {
  100. QFileDialog openDialog{ this, tr("Load Gradient"), "", "" };
  101. connect(&openDialog, &QFileDialog::fileSelected, [this] (const QString& name) {
  102. QFile file{ name };
  103. loadGradient(file);
  104. });
  105. openDialog.exec();
  106. }
  107. void GradientMenu::on_maxValSpb_valueChanged(double maxVal)
  108. {
  109. const Gradient& old = ui->gradientWidget->getGradient();
  110. float minVal = old.getPoints().at(old.getPoints().size() - 1).second;
  111. if (maxVal < minVal) {
  112. ui->maxValSpb->setValue(minVal);
  113. maxVal = minVal;
  114. }
  115. Gradient g = Gradient{ old.getPoints(), float(maxVal), old.isRepeat() };
  116. ui->gradientWidget->setGradient(std::move(g));
  117. }
  118. void GradientMenu::on_zoomOutBtn_clicked()
  119. {
  120. int currentHeight = ui->gradientWidget->height();
  121. int minHeight = ui->gradientWidget->sizeHint().height();
  122. if (currentHeight * 0.9 >= minHeight) {
  123. ui->gradientWidget->setFixedHeight(int(currentHeight * 0.9));
  124. }
  125. else {
  126. ui->gradientWidget->setFixedHeight(minHeight);
  127. }
  128. }
  129. void GradientMenu::on_zoomInBtn_clicked()
  130. {
  131. int currentHeight = ui->gradientWidget->height();
  132. int maxHeight = 16000;
  133. if (currentHeight * 1.1 <= maxHeight)
  134. ui->gradientWidget->setFixedHeight(currentHeight * 1.1);
  135. else
  136. ui->gradientWidget->setFixedHeight(maxHeight);
  137. }
  138. void GradientMenu::on_zoomResetBtn_clicked()
  139. {
  140. ui->gradientWidget->setMinimumHeight(ui->gradientWidget->minimumSizeHint().height());
  141. ui->gradientWidget->setMaximumHeight(16000);
  142. }