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 <QRegularExpression>
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 QRegularExpression rx(QLatin1String("[^0-9]+"));
31 QStringList ours = text().split(rx, Qt::SkipEmptyParts);
32 QStringList theirs = other.text().split(rx, Qt::SkipEmptyParts);
33
34 // Let's compare the last numbers -- they are most likely to be the serial numbers
35 if (ours.size() > 0 && theirs.size() > 0) {
36 return (ours.last().toInt() < theirs.last().toInt());
37 }
38
39 }
40 return collator->compare(this->text(), other.text()) < 0;
41 }
42
43private:
44 QCollator *collator;
45};
46
48 KoDialog(mainWindow),
49 m_mainWindow(mainWindow),
50 m_document(document)
51{
54
55 QWidget * page = new QWidget(this);
56 m_ui.setupUi(page);
57 setMainWidget(page);
58
59 enableButtonOk(false);
60
61 m_ui.cmbOrder->addItem(i18n("Ascending"), Ascending);
62 m_ui.cmbOrder->addItem(i18n("Descending"), Descending);
63 m_ui.cmbOrder->setCurrentIndex(0);
64
65 m_ui.cmbSortMode->addItem(i18n("Alphabetical"), Natural);
66 m_ui.cmbSortMode->addItem(i18n("Numerical"), Numerical);
67 m_ui.cmbSortMode->setCurrentIndex(1);
68
69 m_ui.lstFiles->setSelectionMode(QAbstractItemView::ExtendedSelection);
70
71 connect(m_ui.btnAddImages, &QAbstractButton::clicked, this, &KisDlgImportImageSequence::slotAddFiles);
72 connect(m_ui.btnRemove, &QAbstractButton::clicked, this, &KisDlgImportImageSequence::slotRemoveFiles);
73 connect(m_ui.spinStep, SIGNAL(valueChanged(int)), this, SLOT(slotSkipChanged(int)));
74 connect(m_ui.cmbOrder, SIGNAL(currentIndexChanged(int)), this, SLOT(slotOrderOptionsChanged(int)));
75 connect(m_ui.cmbSortMode, SIGNAL(currentIndexChanged(int)), this, SLOT(slotOrderOptionsChanged(int)));
76#if QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
77 connect(m_ui.autoAddHoldframesBox, &QCheckBox::stateChanged, this, &KisDlgImportImageSequence::autoAddHoldframes);
78#else
79 connect(m_ui.autoAddHoldframesBox, &QCheckBox::checkStateChanged, this, &KisDlgImportImageSequence::autoAddHoldframes);
80#endif
81 // cold initialization of the controls
82 slotSkipChanged(m_ui.spinStep->value());
83 slotOrderOptionsChanged(m_ui.cmbOrder->currentIndex());
84 slotOrderOptionsChanged(m_ui.cmbSortMode->currentIndex());
85 m_ui.beginFromZeroIndexBox->hide();
86}
87
89{
90 QStringList list;
91
92 for (int i=0; i < m_ui.lstFiles->count(); i++) {
93 list.append(m_ui.lstFiles->item(i)->text());
94 }
95
96 return list;
97}
98
100{
101 return m_ui.spinFirstFrame->value();
102}
103
105{
106 return m_ui.spinStep->value();
107}
108
110
111 bool isChecked = m_ui.autoAddHoldframesBox->isChecked();
112 if(isChecked && m_ui.cmbOrder->currentIndex() == 0){
113 m_ui.beginFromZeroIndexBox->show();
114 }
115 else {
116 m_ui.beginFromZeroIndexBox->hide();
117 }
118 return isChecked;
119}
120
122{
124
125 if (!urls.isEmpty()) {
126 Q_FOREACH(QString url, urls) {
127 new ListItem(url, m_ui.lstFiles, &m_collator);
128 }
129
130 sortFileList();
131 }
132
133 enableButtonOk(m_ui.lstFiles->count() > 0);
134}
135
137{
138 KoFileDialog dialog(this, KoFileDialog::ImportFiles, "OpenDocument");
139 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
141 dialog.setCaption(i18n("Import Images"));
142
143 return dialog.filenames();
144}
145
146
147
149{
150 QList<QListWidgetItem*> selected = m_ui.lstFiles->selectedItems();
151
152 Q_FOREACH(QListWidgetItem *item, selected) {
153 delete item;
154 }
155
156 enableButtonOk(m_ui.lstFiles->count() > 0);
157}
158
160{
161 int documentFps = m_document->image()->animationInterface()->framerate();
162 float sourceFps = 1.0f * documentFps / m_ui.spinStep->value();
163
164 m_ui.lblFramerate->setText(i18n("Source fps: %1", sourceFps));
165}
166
168{
169
170 if(m_ui.cmbSortMode->currentIndex() == 0){ // we shouldn't add hold frames automatically if they are sorted alphabetically
171 m_ui.autoAddHoldframesBox->setChecked(false);
172 m_ui.autoAddHoldframesBox->setEnabled(false);
173 }
174 else {
175 m_ui.autoAddHoldframesBox->setEnabled(true);
176 }
177
178 if(m_ui.cmbOrder->currentIndex() == 1){
179 m_ui.beginFromZeroIndexBox->setChecked(false); //redundant
180 m_ui.beginFromZeroIndexBox->hide();
181 }
182 this->sortOrder = m_ui.cmbOrder->currentIndex();
183 sortFileList();
184}
185
187 return m_ui.beginFromZeroIndexBox->isChecked();
188}
189
193
195{
196 int order = m_ui.cmbOrder->currentData().toInt();
197 bool numeric = m_ui.cmbSortMode->currentData().toInt() == Numerical;
198
199 m_collator.setNumericMode(numeric);
200 m_ui.lstFiles->sortItems((order == Ascending) ? Qt::AscendingOrder : Qt::DescendingOrder);
201}
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:606
void setMainWidget(QWidget *widget)
Definition KoDialog.cpp:345
void setButtons(ButtonCodes buttonMask)
Definition KoDialog.cpp:195
void setDefaultButton(ButtonCode id)
Definition KoDialog.cpp:293
@ 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