Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_dlg_import_image_sequence.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Jouni Pentikäinen <joupent@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include "KisDocument.h"
10#include "KisMainWindow.h"
11#include "kis_image.h"
14#include "KoFileDialog.h"
15#include <QStandardPaths>
16#include <QRegExp>
17#include <QListWidgetItem>
18
19class KisDlgImportImageSequence::ListItem : QListWidgetItem {
20
21public:
22 ListItem(const QString &text, QListWidget *view, QCollator *collator)
23 : QListWidgetItem(text, view)
25 {}
26
27 bool operator <(const QListWidgetItem &other) const override
28 {
29 if (collator->numericMode()) {
30 const QRegExp rx(QLatin1String("[^0-9]+"));
31#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
32 QStringList ours = text().split(rx, Qt::SkipEmptyParts);
33 QStringList theirs = other.text().split(rx, Qt::SkipEmptyParts);
34#else
35 QStringList ours = rx.splitString(this->text(), Qt::SkipEmptyParts);
36 QStringList theirs = rx.splitString(other.text(), Qt::SkipEmptyParts);
37#endif
38
39 // Let's compare the last numbers -- they are most likely to be the serial numbers
40 if (ours.size() > 0 && theirs.size() > 0) {
41 return (ours.last().toInt() < theirs.last().toInt());
42 }
43
44 }
45 return collator->compare(this->text(), other.text()) < 0;
46 }
47
48private:
49 QCollator *collator;
50};
51
53 KoDialog(mainWindow),
54 m_mainWindow(mainWindow),
55 m_document(document)
56{
59
60 QWidget * page = new QWidget(this);
61 m_ui.setupUi(page);
62 setMainWidget(page);
63
64 enableButtonOk(false);
65
66 m_ui.cmbOrder->addItem(i18n("Ascending"), Ascending);
67 m_ui.cmbOrder->addItem(i18n("Descending"), Descending);
68 m_ui.cmbOrder->setCurrentIndex(0);
69
70 m_ui.cmbSortMode->addItem(i18n("Alphabetical"), Natural);
71 m_ui.cmbSortMode->addItem(i18n("Numerical"), Numerical);
72 m_ui.cmbSortMode->setCurrentIndex(1);
73
74 m_ui.lstFiles->setSelectionMode(QAbstractItemView::ExtendedSelection);
75
76 connect(m_ui.btnAddImages, &QAbstractButton::clicked, this, &KisDlgImportImageSequence::slotAddFiles);
77 connect(m_ui.btnRemove, &QAbstractButton::clicked, this, &KisDlgImportImageSequence::slotRemoveFiles);
78 connect(m_ui.spinStep, SIGNAL(valueChanged(int)), this, SLOT(slotSkipChanged(int)));
79 connect(m_ui.cmbOrder, SIGNAL(currentIndexChanged(int)), this, SLOT(slotOrderOptionsChanged(int)));
80 connect(m_ui.cmbSortMode, SIGNAL(currentIndexChanged(int)), this, SLOT(slotOrderOptionsChanged(int)));
81 connect(m_ui.autoAddHoldframesBox, &QCheckBox::stateChanged, this, &KisDlgImportImageSequence::autoAddHoldframes);
82 // cold initialization of the controls
83 slotSkipChanged(m_ui.spinStep->value());
84 slotOrderOptionsChanged(m_ui.cmbOrder->currentIndex());
85 slotOrderOptionsChanged(m_ui.cmbSortMode->currentIndex());
86 m_ui.beginFromZeroIndexBox->hide();
87}
88
90{
91 QStringList list;
92
93 for (int i=0; i < m_ui.lstFiles->count(); i++) {
94 list.append(m_ui.lstFiles->item(i)->text());
95 }
96
97 return list;
98}
99
101{
102 return m_ui.spinFirstFrame->value();
103}
104
106{
107 return m_ui.spinStep->value();
108}
109
111
112 bool isChecked = m_ui.autoAddHoldframesBox->isChecked();
113 if(isChecked && m_ui.cmbOrder->currentIndex() == 0){
114 m_ui.beginFromZeroIndexBox->show();
115 }
116 else {
117 m_ui.beginFromZeroIndexBox->hide();
118 }
119 return isChecked;
120}
121
123{
125
126 if (!urls.isEmpty()) {
127 Q_FOREACH(QString url, urls) {
128 new ListItem(url, m_ui.lstFiles, &m_collator);
129 }
130
131 sortFileList();
132 }
133
134 enableButtonOk(m_ui.lstFiles->count() > 0);
135}
136
138{
139 KoFileDialog dialog(this, KoFileDialog::ImportFiles, "OpenDocument");
140 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
142 dialog.setCaption(i18n("Import Images"));
143
144 return dialog.filenames();
145}
146
147
148
150{
151 QList<QListWidgetItem*> selected = m_ui.lstFiles->selectedItems();
152
153 Q_FOREACH(QListWidgetItem *item, selected) {
154 delete item;
155 }
156
157 enableButtonOk(m_ui.lstFiles->count() > 0);
158}
159
161{
162 int documentFps = m_document->image()->animationInterface()->framerate();
163 float sourceFps = 1.0f * documentFps / m_ui.spinStep->value();
164
165 m_ui.lblFramerate->setText(i18n("Source fps: %1", sourceFps));
166}
167
169{
170
171 if(m_ui.cmbSortMode->currentIndex() == 0){ // we shouldn't add hold frames automatically if they are sorted alphabetically
172 m_ui.autoAddHoldframesBox->setChecked(false);
173 m_ui.autoAddHoldframesBox->setEnabled(false);
174 }
175 else {
176 m_ui.autoAddHoldframesBox->setEnabled(true);
177 }
178
179 if(m_ui.cmbOrder->currentIndex() == 1){
180 m_ui.beginFromZeroIndexBox->setChecked(false); //redundant
181 m_ui.beginFromZeroIndexBox->hide();
182 }
183 this->sortOrder = m_ui.cmbOrder->currentIndex();
184 sortFileList();
185}
186
188 return m_ui.beginFromZeroIndexBox->isChecked();
189}
190
194
196{
197 int order = m_ui.cmbOrder->currentData().toInt();
198 bool numeric = m_ui.cmbSortMode->currentData().toInt() == Numerical;
199
200 m_collator.setNumericMode(numeric);
201 m_ui.lstFiles->sortItems((order == Ascending) ? Qt::AscendingOrder : Qt::DescendingOrder);
202}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
bool operator<(const QListWidgetItem &other) const override
ListItem(const QString &text, QListWidget *view, QCollator *collator)
KisDlgImportImageSequence(KisMainWindow *m_mainWindow, KisDocument *m_document)
KisImageSP image
KisImageAnimationInterface * animationInterface() const
static QStringList supportedMimeTypes(Direction direction)
Main window for Krita.
A dialog base class with standard buttons and predefined layouts.
Definition KoDialog.h:116
void enableButtonOk(bool state)
Definition KoDialog.cpp:615
void setMainWidget(QWidget *widget)
Definition KoDialog.cpp:354
void setButtons(ButtonCodes buttonMask)
Definition KoDialog.cpp:195
void setDefaultButton(ButtonCode id)
Definition KoDialog.cpp:302
@ Ok
Show Ok button. (this button accept()s the dialog; result set to QDialog::Accepted)
Definition KoDialog.h:127
@ Cancel
Show Cancel-button. (this button reject()s the dialog; result set to QDialog::Rejected)
Definition KoDialog.h:130