Я переделал механизм создания разделённых сканов - в соответствии с советами Tulon.
В первом варианте я сделал галку в главном меню "Split mixed" - и вывод делался с разделением по 2 папкам.
Оказалось, что этого недостаточно - потому что мне обязательно было нужно, чтобы вывод был в формате имён 0001.tif, 0002.tif, ...., 0010.tif, .... - этот формат я называю "сплошная нумерация" - он, кстати, и в FineReader применяется, и вообще он очень удобен.
А СТ выводит свои файлы в довольно причудливом формате имён - где указывается левая-правая страницы, и имя исходного скана - например: 0074_1L.tif, 0074_2R.tif.
Раньше я использовал утилиту ST Split - она разделяла вывод СТ на субсканы и заодно переименовывала его в сплошную нумерацию. Когда я встроил разделение сканов в СТ оказалось, что операция переименовывания в сплошную нумерацию повисла в воздухе - в СТ это сделать оказалось нереально (по словам Tulon), и Tulon предложил мне сделать разделение сканов в виде экспорта - причём экспорта в виде сплошной нумерации.
Именно этот вариант я и реализовал в своей новой сборке. Я сделал в главном меню новый пункт - Export..., по нажатию на который открывается окно, где можно указать папку вывода, разделять смешанные сканы на субсканы или нет, и ещё есть опция вывода в папку по умолчанию.
Папка по умолчанию - это автоматически создаваемая папка "export" внутри папки "out". Если пользователь указывает свою папку вывода - то всё равно в ней автоматически создается папка "export" - а уже в неё делается вывод. Это сделано для того, что если какая-то неопытная женщина выберет в качестве папки экспорта "Рабочий стол" - то он заполнился бы сотнями файлов, а так они по-любому окажутся локализованными в одной папке. У меня и в DjVu Small такой же принцип.
Так что в любом случае создаётся папка "export", куда делается вывод.
Если стоит галка "Split mixed output" - то в папке "export" автоматически создаются подпапки с именами "1" и "2" - соответственно для передних и задних субсканов. Если попадается не-"смешанный" скан, то он попадает в папку "1" - если чёрно-белый, или в папку "2" - если серый/цветной. Имена файлов, естественно, присваиваются в сплошной нумерации, и у каждой созданной пары субсканов - одинаковые имена (а папки разные - "1" и "2").
Если галка "Split mixed output" не стоит - то в папку "export" просто выводятся все сканы - но уже в сплошной нумерации.
Я хотел было сделать папки не "1" и "2" - а "text" и "pic" - но отверг этот вариант, потому что в папке "export" при упорядочивании по именам первой оказывается "pic", а "text" - только второй. Да и вообще - что такое "1" и "2" - это и ёжику ясно, а вот что такое "text" и "pic" - это ж надо будет ещё извилину напрячь некоторым юзерам...
При экспорте осуществляются все нужные проверки:
- Загружен ли проект
- Не находится ли в процессе пакетная обработка
- Нет ли знаков вопроса на какой-либо из миниатюр стадии вывода
- Нет ли отсутствующих файлов в папке out
- Если папка вывода - не "по умолчанию", выбрал ли юзер свою папку, есть ли она, не надо ли создать и т.п.
Процесс вывода отображается постранично прогресс-баром. Ещё хотел текстом показывать номер текущей страницы - но пока не получилось, потом буду делать.
Вот коды правок:
Я создал же новое окно - ExportDialog. Вот его файл ExportDialog.ui:
C:\build\scantailor-0.9.11.1\ui\ExportDialog.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ExportDialog</class>
<widget class="QDialog" name="ExportDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>486</width>
<height>202</height>
</rect>
</property>
<property name="windowTitle">
<string>Export</string>
</property>
<widget class="QCheckBox" name="SplitMixed">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>381</width>
<height>18</height>
</rect>
</property>
<property name="text">
<string>Split mixed output</string>
</property>
</widget>
<widget class="QPushButton" name="ExportButton">
<property name="geometry">
<rect>
<x>297</x>
<y>170</y>
<width>101</width>
<height>25</height>
</rect>
</property>
<property name="text">
<string>Export</string>
</property>
</widget>
<widget class="QPushButton" name="OkButton">
<property name="geometry">
<rect>
<x>400</x>
<y>170</y>
<width>77</width>
<height>25</height>
</rect>
</property>
<property name="text">
<string>OK</string>
</property>
</widget>
<widget class="QCheckBox" name="DefaultOutputFolder">
<property name="geometry">
<rect>
<x>10</x>
<y>40</y>
<width>381</width>
<height>18</height>
</rect>
</property>
<property name="text">
<string>Default output folder</string>
</property>
</widget>
<widget class="QGroupBox" name="groupBoxExport">
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<width>464</width>
<height>60</height>
</rect>
</property>
<property name="title">
<string>Output Directory</string>
</property>
<layout class="QHBoxLayout" name="ExportLayout">
<item>
<widget class="QLineEdit" name="outExportDirLine"/>
</item>
<item>
<widget class="QPushButton" name="outExportDirBrowseBtn">
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QProgressBar" name="progressBar">
<property name="geometry">
<rect>
<x>10</x>
<y>140</y>
<width>464</width>
<height>21</height>
</rect>
</property>
<property name="value">
<number>0</number>
</property>
<property name="textVisible">
<bool>false</bool>
</property>
</widget>
<widget class="QLabel" name="labelFilesProcessed">
<property name="geometry">
<rect>
<x>10</x>
<y>173</y>
<width>281</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>OkButton</sender>
<signal>clicked()</signal>
<receiver>ExportDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>438</x>
<y>162</y>
</hint>
<hint type="destinationlabel">
<x>242</x>
<y>89</y>
</hint>
</hints>
</connection>
</connections>
</ui>
ExportDialog.h
C:\build\scantailor-0.9.11.1\ExportDialog.h
/*
Scan Tailor - Interactive post-processing tool for scanned pages.
Copyright (C) 2007-2009 Joseph Artsimovich <joseph_a@mail.ru>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// This file was added by monday2000
#ifndef EXPORT_DIALOG_H_
#define EXPORT_DIALOG_H_
#include "ui_ExportDialog.h"
#include <QDialog>
class ExportDialog : public QDialog
{
Q_OBJECT
public:
ExportDialog(QWidget* parent = 0);
virtual ~ExportDialog();
void setCount(int count);
void StepProgress();
signals:
//void ExportOutputSignal(QString export_dir_path, bool default_out_dir, bool split_subscans, ExportDialog* p_ed);
void ExportOutputSignal(QString export_dir_path, bool default_out_dir, bool split_subscans);
private slots:
void OnCheckSplitMixed(bool);
void OnCheckDefaultOutputFolder(bool);
void OnClickExport();
void outExportDirBrowse();
void outExportDirEdited(QString const&);
private:
Ui::ExportDialog ui;
bool m_autoOutDir;
void setExportOutputDir(QString const& dir);
int m_count;
};
#endif
ExportDialog.cpp
C:\build\scantailor-0.9.11.1\ExportDialog.cpp
/*
Scan Tailor - Interactive post-processing tool for scanned pages.
Copyright (C) Joseph Artsimovich <joseph.artsimovich@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// This file was added by monday2000
#include "ExportDialog.h"
#include "ExportDialog.h.moc"
#include "OpenGLSupport.h"
#include "config.h"
#include <QSettings>
#include <QVariant>
#include <QDir>
#include <QFileDialog>
#include <QMessageBox>
ExportDialog::ExportDialog(QWidget* parent)
: QDialog(parent)
{
ui.setupUi(this);
QSettings settings;
// begin of added
connect(ui.SplitMixed, SIGNAL(toggled(bool)), this, SLOT(OnCheckSplitMixed(bool)));
connect(ui.DefaultOutputFolder, SIGNAL(toggled(bool)), this, SLOT(OnCheckDefaultOutputFolder(bool)));
connect(ui.ExportButton, SIGNAL(clicked()), this, SLOT(OnClickExport()));
connect(ui.outExportDirBrowseBtn, SIGNAL(clicked()), this, SLOT(outExportDirBrowse()));
connect(ui.outExportDirLine, SIGNAL(textEdited(QString const&)),
this, SLOT(outExportDirEdited(QString const&))
);
ui.SplitMixed->setChecked(settings.value("settings/split_mixed").toBool());
ui.DefaultOutputFolder->setChecked(settings.value("settings/default_output_folder").toBool());
ui.labelFilesProcessed->setText("");
// end of added
}
ExportDialog::~ExportDialog()
{
}
// begin of added
void
ExportDialog::OnCheckSplitMixed(bool state)
{
QSettings settings;
//QMessageBox::information(0, "Information", "OnCheckSplitMixed");
settings.setValue("settings/split_mixed", state);
}
void
ExportDialog::OnCheckDefaultOutputFolder(bool state)
{
QSettings settings;
//QMessageBox::information(0, "Information", "OnCheckSplitMixed");
settings.setValue("settings/default_output_folder", state);
}
void
ExportDialog::OnClickExport()
{
//QMessageBox::information(0, "Information", "ExportDialog::OnClickGenerateSubscans()");
if (ui.outExportDirLine->text().isEmpty() &&
!ui.DefaultOutputFolder->isChecked())
{
QMessageBox::warning(
this, tr("Error"),
tr("The export output directory is empty.")
);
return;
}
QDir const out_dir(ui.outExportDirLine->text());
if (out_dir.isAbsolute() && !out_dir.exists()) {
// Maybe create it.
bool create = m_autoOutDir;
if (!m_autoOutDir) {
create = QMessageBox::question(
this, tr("Create Directory?"),
tr("The export output directory doesn't exist. Create it?"),
QMessageBox::Yes|QMessageBox::No
) == QMessageBox::Yes;
if (!create) {
return;
}
}
if (create) {
if (!out_dir.mkpath(out_dir.path())) {
QMessageBox::warning(
this, tr("Error"),
tr("Unable to create the export output directory.")
);
return;
}
}
}
if ((!out_dir.isAbsolute() || !out_dir.exists())&& !ui.DefaultOutputFolder->isChecked()) {
QMessageBox::warning(
this, tr("Error"),
tr("The export output directory is not set or doesn't exist.")
);
return;
}
QString export_dir_path = ui.outExportDirLine->text();
bool split_subscans = ui.SplitMixed->isChecked();
bool default_out_dir = ui.DefaultOutputFolder->isChecked();
m_count = 0;
ui.progressBar->setValue(0);
ui.labelFilesProcessed->setText("");
emit ExportOutputSignal(export_dir_path, default_out_dir, split_subscans);
}
void
ExportDialog::outExportDirBrowse()
{
QString initial_dir(ui.outExportDirLine->text());
if (initial_dir.isEmpty() || !QDir(initial_dir).exists()) {
initial_dir = QDir::home().absolutePath();
}
QString const dir(
QFileDialog::getExistingDirectory(
this, tr("Export output directory"), initial_dir
)
);
if (!dir.isEmpty()) {
setExportOutputDir(dir);
}
}
void
ExportDialog::setExportOutputDir(QString const& dir)
{
ui.outExportDirLine->setText(QDir::toNativeSeparators(dir));
}
void
ExportDialog::outExportDirEdited(QString const& text)
{
m_autoOutDir = false;
}
void
ExportDialog::setCount(int count)
{
m_count = count;
ui.progressBar->setMaximum(m_count);
}
void
ExportDialog::StepProgress()
{
ui.progressBar->setValue(ui.progressBar->value() + 1);
ui.labelFilesProcessed->setText("Processed file " +
QString::number(ui.progressBar->value()) + " of " + QString::number(m_count));
}
// end of added
Для того, чтобы добавить в проект новые файлы с новым классом, по совету Tulon пришлось добавить упоминание о новом классе - такое:
C:\build\scantailor-0.9.11.1\CMakeLists.txt
SET(
gui_only_sources
.....
SettingsDialog.cpp SettingsDialog.h
ExportDialog.cpp ExportDialog.h
........
После этого понадобилось 2-3 перекомпиляции - пока сгенерировались автоматически нужные файлы привязки.