sequencewindow.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. Zint Barcode Generator - the open source barcode generator
  3. Copyright (C) 2009-2024 Robin Stuart <rstuart114@gmail.com>
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License along
  13. with this program; if not, write to the Free Software Foundation, Inc.,
  14. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  15. */
  16. /* SPDX-License-Identifier: GPL-3.0-or-later */
  17. //#include <QDebug>
  18. #include <QFile>
  19. #include <QFileDialog>
  20. #include <QMessageBox>
  21. #include <QSettings>
  22. #include <QUiLoader>
  23. #include "sequencewindow.h"
  24. #include "exportwindow.h"
  25. // Shorthand
  26. #define QSL QStringLiteral
  27. #define QSEmpty QLatin1String("")
  28. SequenceWindow::SequenceWindow(BarcodeItem *bc) : m_bc(bc)
  29. {
  30. setupUi(this);
  31. QSettings settings;
  32. #if QT_VERSION < 0x60000
  33. settings.setIniCodec("UTF-8");
  34. #endif
  35. QByteArray geometry = settings.value(QSL("studio/sequence/window_geometry")).toByteArray();
  36. restoreGeometry(geometry);
  37. spnSeqStartVal->setValue(settings.value(QSL("studio/sequence/start_value"), 1).toInt());
  38. spnSeqEndVal->setValue(settings.value(QSL("studio/sequence/end_value"), 10).toInt());
  39. spnSeqIncVal->setValue(settings.value(QSL("studio/sequence/increment"), 1).toInt());
  40. linSeqFormat->setText(settings.value(QSL("studio/sequence/format"), QSL("$$$$$$")).toString());
  41. txtSeqPreview->setPlainText(settings.value(QSL("studio/sequence/preview"), QSEmpty).toString());
  42. QIcon closeIcon(QIcon::fromTheme(QSL("window-close"), QIcon(QSL(":res/x.svg"))));
  43. QIcon clearIcon(QSL(":res/delete.svg"));
  44. btnSeqClose->setIcon(closeIcon);
  45. btnSeqClear->setIcon(clearIcon);
  46. check_generate();
  47. connect(btnSeqClose, SIGNAL(clicked(bool)), SLOT(close()));
  48. connect(btnSeqClear, SIGNAL(clicked(bool)), SLOT(clear_preview()));
  49. connect(btnSeqCreate, SIGNAL(clicked(bool)), SLOT(create_sequence()));
  50. connect(txtSeqPreview, SIGNAL(textChanged()), SLOT(check_generate()));
  51. connect(btnSeqFromFile, SIGNAL(clicked(bool)), SLOT(from_file()));
  52. connect(btnSeqExport, SIGNAL(clicked(bool)), SLOT(generate_sequence()));
  53. }
  54. SequenceWindow::~SequenceWindow()
  55. {
  56. QSettings settings;
  57. #if QT_VERSION < 0x60000
  58. settings.setIniCodec("UTF-8");
  59. #endif
  60. settings.setValue(QSL("studio/sequence/window_geometry"), saveGeometry());
  61. settings.setValue(QSL("studio/sequence/start_value"), spnSeqStartVal->value());
  62. settings.setValue(QSL("studio/sequence/end_value"), spnSeqEndVal->value());
  63. settings.setValue(QSL("studio/sequence/increment"), spnSeqIncVal->value());
  64. settings.setValue(QSL("studio/sequence/format"), linSeqFormat->text());
  65. settings.setValue(QSL("studio/sequence/preview"), txtSeqPreview->toPlainText());
  66. }
  67. void SequenceWindow::clear_preview()
  68. {
  69. txtSeqPreview->clear();
  70. }
  71. QString SequenceWindow::apply_format(const QString& raw_number)
  72. {
  73. QString adjusted, reversed;
  74. QString format;
  75. int format_len, input_len, i, inpos;
  76. QChar format_qchar;
  77. format = linSeqFormat->text();
  78. input_len = raw_number.length();
  79. format_len = format.length();
  80. inpos = input_len;
  81. for (i = format_len; i > 0; i--) {
  82. format_qchar = format[i - 1];
  83. char format_char = format_qchar.toLatin1();
  84. switch (format_char) {
  85. case '#':
  86. if (inpos > 0) {
  87. adjusted += raw_number[inpos - 1];
  88. inpos--;
  89. } else {
  90. adjusted += ' ';
  91. }
  92. break;
  93. case '$':
  94. if (inpos > 0) {
  95. adjusted += raw_number[inpos - 1];
  96. inpos--;
  97. } else {
  98. adjusted += '0';
  99. }
  100. break;
  101. case '*':
  102. if (inpos > 0) {
  103. adjusted += raw_number[inpos - 1];
  104. inpos--;
  105. } else {
  106. adjusted += '*';
  107. }
  108. break;
  109. default:
  110. adjusted += format_char;
  111. break;
  112. }
  113. }
  114. for (i = format_len; i > 0; i--) {
  115. reversed += adjusted[i - 1];
  116. }
  117. return reversed;
  118. }
  119. void SequenceWindow::create_sequence()
  120. {
  121. QStringList outputtext;
  122. int start, stop, step, i;
  123. start = spnSeqStartVal->value();
  124. stop = spnSeqEndVal->value();
  125. step = spnSeqIncVal->value();
  126. if (stop < start) {
  127. QMessageBox::critical(this, tr("Sequence Error"),
  128. tr("End Value must be greater than or equal to Start Value."));
  129. return;
  130. }
  131. if ((stop - start) / step > 10000) {
  132. QMessageBox::critical(this, tr("Sequence Error"), tr("The maximum sequence allowed is 10,000 items."));
  133. return;
  134. }
  135. for (i = start; i <= stop; i += step) {
  136. outputtext << apply_format(QString::number(i, 10));
  137. }
  138. txtSeqPreview->setPlainText(outputtext.join('\n'));
  139. }
  140. void SequenceWindow::check_generate()
  141. {
  142. QString preview_copy;
  143. preview_copy = txtSeqPreview->toPlainText();
  144. if (preview_copy.isEmpty()) {
  145. btnSeqExport->setEnabled(false);
  146. btnSeqClear->setEnabled(false);
  147. } else {
  148. btnSeqExport->setEnabled(true);
  149. btnSeqClear->setEnabled(true);
  150. }
  151. }
  152. void SequenceWindow::from_file()
  153. {
  154. QSettings settings;
  155. #if QT_VERSION < 0x60000
  156. settings.setIniCodec("UTF-8");
  157. #endif
  158. QFileDialog import_dialog;
  159. QString filename;
  160. QFile file;
  161. QByteArray outstream;
  162. import_dialog.setWindowTitle(tr("Import File"));
  163. import_dialog.setDirectory(settings.value(QSL("studio/default_dir"),
  164. QDir::toNativeSeparators(QDir::homePath())).toString());
  165. if (import_dialog.exec()) {
  166. filename = import_dialog.selectedFiles().at(0);
  167. } else {
  168. return;
  169. }
  170. file.setFileName(filename);
  171. if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
  172. QMessageBox::critical(this, tr("Open Error"), tr("Could not open selected file."));
  173. return;
  174. }
  175. outstream = file.readAll();
  176. txtSeqPreview->setPlainText(QString(outstream));
  177. file.close();
  178. settings.setValue(QSL("studio/default_dir"), filename.mid(0, filename.lastIndexOf(QDir::separator())));
  179. }
  180. void SequenceWindow::generate_sequence()
  181. {
  182. ExportWindow dlg(m_bc, txtSeqPreview->toPlainText());
  183. dlg.exec();
  184. }
  185. /* vim: set ts=4 sw=4 et : */