* lazzara/afp/photos/gui/gui.pro,
* lazzara/afp/photos/gui/gui.qrc,
* lazzara/afp/photos/gui/icons/next.png,
* lazzara/afp/photos/gui/icons/ok.png,
* lazzara/afp/photos/gui/icons/photos.png,
* lazzara/afp/photos/gui/icons/prev.png,
* lazzara/afp/photos/gui/icons/remove.png,
* lazzara/afp/photos/gui/src/custom_delegate.cc,
* lazzara/afp/photos/gui/src/custom_delegate.hh,
* lazzara/afp/photos/gui/src/launch_dialog.cc,
* lazzara/afp/photos/gui/src/launch_dialog.hh,
* lazzara/afp/photos/gui/src/main.cc,
* lazzara/afp/photos/gui/src/main_window.cc,
* lazzara/afp/photos/gui/src/main_window.hh,
* lazzara/afp/photos/gui/ui/launch_dialog.ui,
* lazzara/afp/photos/gui/ui/main_window.ui: New files. GUI meant
to display the results of text finding in pictures.
---
milena/sandbox/ChangeLog | 22 +
milena/sandbox/lazzara/afp/photos/gui/gui.pro | 17 +
milena/sandbox/lazzara/afp/photos/gui/gui.qrc | 9 +
.../sandbox/lazzara/afp/photos/gui/icons/next.png | Bin 0 -> 3337 bytes
milena/sandbox/lazzara/afp/photos/gui/icons/ok.png | Bin 0 -> 3953 bytes
.../lazzara/afp/photos/gui/icons/photos.png | Bin 0 -> 3750 bytes
.../sandbox/lazzara/afp/photos/gui/icons/prev.png | Bin 0 -> 3334 bytes
.../lazzara/afp/photos/gui/icons/remove.png | Bin 3704 -> 3704 bytes
.../lazzara/afp/photos/gui/src/custom_delegate.cc | 105 ++++
.../lazzara/afp/photos/gui/src/custom_delegate.hh | 81 +++
.../lazzara/afp/photos/gui/src/launch_dialog.cc | 79 +++
.../lazzara/afp/photos/gui/src/launch_dialog.hh | 61 ++
milena/sandbox/lazzara/afp/photos/gui/src/main.cc | 46 ++
.../lazzara/afp/photos/gui/src/main_window.cc | 435 +++++++++++++
.../lazzara/afp/photos/gui/src/main_window.hh | 106 ++++
.../lazzara/afp/photos/gui/ui/launch_dialog.ui | 100 +++
.../lazzara/afp/photos/gui/ui/main_window.ui | 656 ++++++++++++++++++++
17 files changed, 1717 insertions(+), 0 deletions(-)
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/gui.pro
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/gui.qrc
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/icons/next.png
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/icons/ok.png
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/icons/photos.png
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/icons/prev.png
copy scribo/demo/shared/icons/Symbols-Delete-icon.png =>
milena/sandbox/lazzara/afp/photos/gui/icons/remove.png (100%)
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/src/custom_delegate.cc
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/src/custom_delegate.hh
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/src/launch_dialog.cc
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/src/launch_dialog.hh
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/src/main.cc
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/src/main_window.cc
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/src/main_window.hh
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/ui/launch_dialog.ui
create mode 100644 milena/sandbox/lazzara/afp/photos/gui/ui/main_window.ui
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index 98394ed..0d7aefd 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -1,3 +1,25 @@
+2010-02-16 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add a GUI for AFP's use case.
+
+ * lazzara/afp/photos/gui/gui.pro,
+ * lazzara/afp/photos/gui/gui.qrc,
+ * lazzara/afp/photos/gui/icons/next.png,
+ * lazzara/afp/photos/gui/icons/ok.png,
+ * lazzara/afp/photos/gui/icons/photos.png,
+ * lazzara/afp/photos/gui/icons/prev.png,
+ * lazzara/afp/photos/gui/icons/remove.png,
+ * lazzara/afp/photos/gui/src/custom_delegate.cc,
+ * lazzara/afp/photos/gui/src/custom_delegate.hh,
+ * lazzara/afp/photos/gui/src/launch_dialog.cc,
+ * lazzara/afp/photos/gui/src/launch_dialog.hh,
+ * lazzara/afp/photos/gui/src/main.cc,
+ * lazzara/afp/photos/gui/src/main_window.cc,
+ * lazzara/afp/photos/gui/src/main_window.hh,
+ * lazzara/afp/photos/gui/ui/launch_dialog.ui,
+ * lazzara/afp/photos/gui/ui/main_window.ui: New files. GUI meant
+ to display the results of text finding in pictures.
+
2010-03-22 Guillaume Lazzara <z(a)lrde.epita.fr>
Add new benchs.
diff --git a/milena/sandbox/lazzara/afp/photos/gui/gui.pro
b/milena/sandbox/lazzara/afp/photos/gui/gui.pro
new file mode 100644
index 0000000..41b8006
--- /dev/null
+++ b/milena/sandbox/lazzara/afp/photos/gui/gui.pro
@@ -0,0 +1,17 @@
+######################################################################
+# Automatically generated by qmake (2.01a) Wed Nov 25 13:42:17 2009
+######################################################################
+
+TEMPLATE = app
+TARGET =
+DEPENDPATH += . src ui
+INCLUDEPATH += . src
+
+CONFIG += release
+
+# Input
+HEADERS += src/main_window.hh src/custom_delegate.hh src/launch_dialog.hh
+FORMS += ui/main_window.ui ui/launch_dialog.ui
+SOURCES += src/main.cc src/main_window.cc src/custom_delegate.cc src/launch_dialog.cc
+
+RESOURCES = gui.qrc
diff --git a/milena/sandbox/lazzara/afp/photos/gui/gui.qrc
b/milena/sandbox/lazzara/afp/photos/gui/gui.qrc
new file mode 100644
index 0000000..e5007a8
--- /dev/null
+++ b/milena/sandbox/lazzara/afp/photos/gui/gui.qrc
@@ -0,0 +1,9 @@
+<RCC>
+ <qresource prefix="/" >
+ <file>icons/next.png</file>
+ <file>icons/ok.png</file>
+ <file>icons/photos.png</file>
+ <file>icons/prev.png</file>
+ <file>icons/remove.png</file>
+ </qresource>
+</RCC>
diff --git a/milena/sandbox/lazzara/afp/photos/gui/icons/next.png
b/milena/sandbox/lazzara/afp/photos/gui/icons/next.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef6d66d69fdcdca147974de4a15ebdf319fa7713
GIT binary patch
literal 3337
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
T0eBG~00000NkvXXu0mjf!@6M$
literal 0
HcmV?d00001
diff --git a/milena/sandbox/lazzara/afp/photos/gui/icons/ok.png
b/milena/sandbox/lazzara/afp/photos/gui/icons/ok.png
new file mode 100644
index 0000000000000000000000000000000000000000..217030a740da05d23648d40358d7d4e0773a6520
GIT binary patch
literal 3953
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
LNkvXXu0mjfyi#d`
literal 0
HcmV?d00001
diff --git a/milena/sandbox/lazzara/afp/photos/gui/icons/photos.png
b/milena/sandbox/lazzara/afp/photos/gui/icons/photos.png
new file mode 100644
index 0000000000000000000000000000000000000000..65fe33d6e0cdb06bd35b008f4535b2bd5e48eee1
GIT binary patch
literal 3750
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
Qj{pDw07*qoM6N<$f^cFl{Qv*}
literal 0
HcmV?d00001
diff --git a/milena/sandbox/lazzara/afp/photos/gui/icons/prev.png
b/milena/sandbox/lazzara/afp/photos/gui/icons/prev.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f05d74f8ce387d8a289981ef3d8a712b08aa8aa
GIT binary patch
literal 3334
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
Q4FCWD07*qoM6N<$g0TKcw*UYD
literal 0
HcmV?d00001
diff --git a/scribo/demo/shared/icons/Symbols-Delete-icon.png
b/milena/sandbox/lazzara/afp/photos/gui/icons/remove.png
similarity index 100%
copy from scribo/demo/shared/icons/Symbols-Delete-icon.png
copy to milena/sandbox/lazzara/afp/photos/gui/icons/remove.png
diff --git a/milena/sandbox/lazzara/afp/photos/gui/src/custom_delegate.cc
b/milena/sandbox/lazzara/afp/photos/gui/src/custom_delegate.cc
new file mode 100644
index 0000000..cfbb7c3
--- /dev/null
+++ b/milena/sandbox/lazzara/afp/photos/gui/src/custom_delegate.cc
@@ -0,0 +1,105 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena 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, version 2 of the License.
+//
+// Olena 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 Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#include <src/custom_delegate.hh>
+
+#include <QtCore/QtCore>
+
+namespace mln
+{
+
+ namespace demo
+ {
+
+ custom_delegate::custom_delegate(QObject * parent)
+ : QItemDelegate(parent),
+ bg_(Qt::black, Qt::SolidPattern),
+ selected_bg_(QColor(255, 100, 0), Qt::Dense5Pattern)
+ {
+ display_rect_.setSize(QSize(149, 30));
+ decoration_rect_.setSize(QSize(150, 150));
+ }
+
+
+ custom_delegate::~custom_delegate()
+ {
+ }
+
+ void
+ custom_delegate::drawDecoration(QPainter *painter,
+ const QStyleOptionViewItem& option,
+ const QRect& rect,
+ const QPixmap& pixmap) const
+ {
+ decoration_rect_.moveTo(option.rect.x() + 10, option.rect.y() + 10);
+ painter->fillRect(decoration_rect_, bg_);
+ super_::drawDecoration(painter, option, decoration_rect_, pixmap);
+ }
+
+
+ void
+ custom_delegate::drawBackground(QPainter *painter,
+ const QStyleOptionViewItem& option,
+ const QModelIndex& index) const
+ {
+ super_::drawBackground(painter, option, index);
+ }
+
+
+ void
+ custom_delegate::drawCheck(QPainter *painter,
+ const QStyleOptionViewItem& option,
+ const QRect& rect,
+ Qt::CheckState state) const
+ {
+ super_::drawCheck(painter, option, rect, state);
+ }
+
+
+ void
+ custom_delegate::drawDisplay(QPainter* painter,
+ const QStyleOptionViewItem& option,
+ const QRect& rect,
+ const QString& text) const
+ {
+ display_rect_.moveTo(option.rect.x() + 10,
+ option.rect.y() + 155);
+ super_::drawDisplay(painter, option, display_rect_, text);
+ painter->drawRect(display_rect_);
+ }
+
+
+ void
+ custom_delegate::drawFocus(QPainter* painter,
+ const QStyleOptionViewItem& option,
+ const QRect& rect ) const
+ {
+ super_::drawFocus(painter, option, display_rect_);
+ }
+
+
+ } // end of namespace mln::demo
+
+} // end of namespace mln
diff --git a/milena/sandbox/lazzara/afp/photos/gui/src/custom_delegate.hh
b/milena/sandbox/lazzara/afp/photos/gui/src/custom_delegate.hh
new file mode 100644
index 0000000..06fb69d
--- /dev/null
+++ b/milena/sandbox/lazzara/afp/photos/gui/src/custom_delegate.hh
@@ -0,0 +1,81 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena 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, version 2 of the License.
+//
+// Olena 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 Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+# include <QtGui/QtGui>
+
+namespace mln
+{
+
+ namespace demo
+ {
+
+ class custom_delegate : public QItemDelegate
+ {
+
+ typedef QItemDelegate super_;
+
+ public:
+
+ custom_delegate(QObject * parent = 0);
+ ~custom_delegate();
+
+ void
+ drawDecoration(QPainter *painter,
+ const QStyleOptionViewItem& option,
+ const QRect& rect,
+ const QPixmap& pixmap) const;
+
+ void drawBackground(QPainter *painter,
+ const QStyleOptionViewItem& option,
+ const QModelIndex& index) const;
+
+ void drawCheck(QPainter *painter,
+ const QStyleOptionViewItem& option,
+ const QRect& rect,
+ Qt::CheckState state) const;
+
+ void
+ drawDisplay(QPainter* painter,
+ const QStyleOptionViewItem& option,
+ const QRect& rect,
+ const QString& text) const;
+
+ void
+ drawFocus(QPainter* painter,
+ const QStyleOptionViewItem& option,
+ const QRect& rect ) const;
+
+ private:
+ mutable QRect display_rect_;
+ mutable QRect decoration_rect_;
+ QBrush bg_;
+ QBrush selected_bg_;
+
+ };
+
+
+ } // end of namespace mln::demo
+
+} // end of namespace mln
diff --git a/milena/sandbox/lazzara/afp/photos/gui/src/launch_dialog.cc
b/milena/sandbox/lazzara/afp/photos/gui/src/launch_dialog.cc
new file mode 100644
index 0000000..b0e0fb8
--- /dev/null
+++ b/milena/sandbox/lazzara/afp/photos/gui/src/launch_dialog.cc
@@ -0,0 +1,79 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena 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, version 2 of the License.
+//
+// Olena 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 Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+
+#include <QtCore>
+#include <QtGui>
+#include <src/launch_dialog.hh>
+#include <src/custom_delegate.hh>
+
+namespace mln
+{
+
+ namespace demo
+ {
+
+ launch_dialog::launch_dialog(QWidget *parent)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ }
+
+ launch_dialog::~launch_dialog()
+ {
+
+ }
+
+
+ void
+ launch_dialog::on_browseBtn_clicked(bool)
+ {
+ QString dirname = QFileDialog::getExistingDirectory(this, "");
+
+ if (!dirname.isEmpty())
+ {
+ pathToPics->setText(dirname);
+ }
+ }
+
+
+ void
+ launch_dialog::on_dialogBtnBox_accepted()
+ {
+ emit ok_clicked(pathToPics->text(), checkBox->isChecked());
+ }
+
+
+ void
+ launch_dialog::on_pathToPics_textChanged(const QString& str)
+ {
+ dialogBtnBox->button(QDialogButtonBox::Ok)->setEnabled(!str.isEmpty());
+ }
+
+ } // end of namespace scribo::demo
+
+} // end of namespace scribo
+
+
diff --git a/milena/sandbox/lazzara/afp/photos/gui/src/launch_dialog.hh
b/milena/sandbox/lazzara/afp/photos/gui/src/launch_dialog.hh
new file mode 100644
index 0000000..dd4ed31
--- /dev/null
+++ b/milena/sandbox/lazzara/afp/photos/gui/src/launch_dialog.hh
@@ -0,0 +1,61 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena 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, version 2 of the License.
+//
+// Olena 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 Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#ifndef MLN_DEMO_SRC_LAUNCH_DIALOG_HH
+
+# include <QtGui>
+# include <ui_launch_dialog.h>
+
+namespace mln
+{
+
+ namespace demo
+ {
+
+
+ class launch_dialog : public QDialog, private Ui::LaunchDialog
+ {
+ Q_OBJECT
+
+ public:
+ launch_dialog(QWidget *parent = 0);
+ ~launch_dialog();
+
+ private slots:
+ void on_dialogBtnBox_accepted();
+ void on_browseBtn_clicked(bool);
+ void on_pathToPics_textChanged(const QString& str);
+
+ signals:
+ void ok_clicked(const QString& path, bool fgbg);
+
+ };
+
+
+ } // end of namespace mln::demo
+
+} // end of namespace mln
+
+#endif // ! MLN_DEMO_SRC_LAUNCH_DIALOG_HH
diff --git a/milena/sandbox/lazzara/afp/photos/gui/src/main.cc
b/milena/sandbox/lazzara/afp/photos/gui/src/main.cc
new file mode 100644
index 0000000..5349bcb
--- /dev/null
+++ b/milena/sandbox/lazzara/afp/photos/gui/src/main.cc
@@ -0,0 +1,46 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena 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, version 2 of the License.
+//
+// Olena 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 Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#include <QApplication>
+#include <QtGui>
+
+#include <src/main_window.hh>
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ if (argc < 2)
+ {
+ qDebug() << "Usage: " << argv[0] << "
<path/text_in_photo_ppm>";
+ return 1;
+ }
+
+ mln::demo::main_window win(argv[1]);
+
+ win.show();
+ return app.exec();
+}
+
diff --git a/milena/sandbox/lazzara/afp/photos/gui/src/main_window.cc
b/milena/sandbox/lazzara/afp/photos/gui/src/main_window.cc
new file mode 100644
index 0000000..ea63d46
--- /dev/null
+++ b/milena/sandbox/lazzara/afp/photos/gui/src/main_window.cc
@@ -0,0 +1,435 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena 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, version 2 of the License.
+//
+// Olena 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 Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+
+#include <QtCore>
+#include <QtGui>
+#include <src/main_window.hh>
+#include <src/launch_dialog.hh>
+#include <src/custom_delegate.hh>
+
+namespace mln
+{
+
+ namespace demo
+ {
+
+ main_window::main_window(const QString& text_in_photo_ppm, QWidget *parent)
+ : QMainWindow(parent), text_in_photo_ppm_(text_in_photo_ppm)
+ {
+ setupUi(this);
+
+ // Temporary output directory
+ output_dir_ = "/tmp/";
+
+ // Setup directory listing
+ QStringList filters;
+ filters << "*.ppm";
+ dir_.setNameFilters(filters);
+ dir_.setFilter(QDir::Files);
+ dir_.setSorting(QDir::Name);
+
+ // Setup Signal/Slots connections
+ connect(&process_, SIGNAL(error(QProcess::ProcessError)),
+ this, SLOT(process__error_slot(QProcess::ProcessError)));
+ connect(&process_,
+ SIGNAL(finished(int, QProcess::ExitStatus)),
+ this,
+ SLOT(process__finished_slot(int, QProcess::ExitStatus)));
+
+ // Setup graphicsView
+ graphicsView->setScene(new QGraphicsScene());
+
+
+ // Setup StatusBar
+ QStatusBar *status = new QStatusBar();
+ setStatusBar(status);
+ status->addWidget(&progressLabel_);
+ status->addWidget(&progressBar_);
+
+ QPushButton *cancelBtn = new QPushButton(tr("Cancel"));
+ connect(cancelBtn, SIGNAL(clicked(bool)),
+ this, SLOT(cancel_clicked(bool)));
+ status->addWidget(cancelBtn);
+ statusBar()->hide();
+
+
+ // Customize item view delegate for picture with text.
+ withTextListWidget->setItemDelegate(new custom_delegate());
+
+ // Setup Toolbar.
+ toolbar_ = new QToolBar(tr("Action"));
+ toolbar_->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ QAction *removeImage = new QAction(QIcon(":/icons/remove.png"),
+ tr("Tag as image without text"),
+ toolbar_);
+ connect(removeImage, SIGNAL(triggered(bool)),
+ this, SLOT(remove_image(bool)));
+ toolbar_->addAction(removeImage);
+ addToolBar(toolbar_);
+
+
+ // Hide visualization buttons
+ textOnlyButton->hide();
+ fullImageButton->hide();
+ textBoxesButton->hide();
+ textMaskButton->hide();
+
+ // Set default visualization.
+ textBoxesButton->setChecked(true);
+ actionText_Boxes->setChecked(true);
+ QActionGroup * actionGroup = new QActionGroup(this);
+ actionGroup->addAction(actionText_Boxes);
+ actionGroup->addAction(actionFull_Image);
+ actionGroup->addAction(action_Text_Only);
+ actionGroup->addAction(actionText_Mask);
+ actionGroup->setExclusive(true);
+ }
+
+ main_window::~main_window()
+ {
+ if (process_.state() == QProcess::Running)
+ {
+ process_.disconnect();
+ process_.close();
+ }
+ }
+
+ void
+ main_window::on_actionScan_directory_triggered()
+ {
+ launch_dialog *dialog = new launch_dialog(this);
+ connect(dialog, SIGNAL(ok_clicked(const QString&, bool)),
+ this, SLOT(init_and_start_process(const QString&, bool)));
+ dialog->show();
+ }
+
+ void
+ main_window::init_and_start_process(const QString& dirname, bool bgfg)
+ {
+ dir_.setPath(dirname);
+
+ file_list_ = dir_.entryInfoList();
+ current_file_ = 0;
+ withTextListWidget->clear();
+ withoutTextListWidget->clear();
+
+ statusBar()->show();
+ progressLabel_.setText(tr("Processing images..."));
+ progressBar_.setRange(0, file_list_.size());
+ progressBar_.setValue(0);
+
+ bgfg_ = bgfg;
+ start_process();
+ }
+
+ void
+ main_window::next_process()
+ {
+ ++current_file_;
+ progressBar_.setValue(current_file_);
+
+ tabWidget->setTabText(0,
+ QString(tr("With text (%1)"))
+ .arg(withTextListWidget->count()));
+ tabWidget->setTabText(1,
+ QString(tr("Without text (%1)"))
+ .arg(withoutTextListWidget->count()));
+
+ if (current_file_ < file_list_.size())
+ start_process();
+ else
+ {
+ statusBar()->hide();
+ emit process_finished();
+ }
+ }
+
+
+ QString
+ main_window::output_file(const QString& basename)
+ {
+ return output_dir_ + basename + "_out_text.ppm";
+ }
+
+ QString
+ main_window::textBoxes_file(const QString& basename)
+ {
+ return output_dir_ + basename + "_input_with_bboxes.ppm";
+ }
+
+ QString
+ main_window::textMask_file(const QString& basename)
+ {
+ return output_dir_ + basename + "_out.ppm";
+ }
+
+
+ void
+ main_window::start_process()
+ {
+ QStringList args;
+ args << file_list_.at(current_file_).absoluteFilePath() // input file.
+ << textMask_file(file_list_.at(current_file_).baseName()) // output file.
+ << QString("%1").arg(bgfg_) // Enable/Disable remove background.
+ << "1" << "1" << "1" <<
"1" // Enable all steps.
+ << "/tmp/" + file_list_.at(current_file_).baseName();
+
+ process_.start(text_in_photo_ppm_, args);
+ }
+
+ void
+ main_window::process__error_slot(QProcess::ProcessError)
+ {
+ qDebug() << "error";
+ }
+
+ void
+ main_window::process__finished_slot(int exitCode,
+ QProcess::ExitStatus exitStatus)
+ {
+ QString filename = file_list_.at(current_file_).fileName();
+
+ if (exitStatus == QProcess::CrashExit)
+ {
+ qDebug() << "Process crashed with file "
+ << file_list_.at(current_file_).fileName();
+ }
+ else
+ {
+ QFileInfo f(filename);
+ QFileInfo text_image();
+ QPixmap pixmap(output_file(f.baseName()));
+
+ QListWidgetItem *item;
+ if (! pixmap.isNull())
+ item = new QListWidgetItem(QIcon(pixmap.scaled(150, 150, Qt::KeepAspectRatio)),
filename + QString(" (%1)").arg(exitCode));
+ else
+ item = new QListWidgetItem(filename + QString(" (%1)").arg(exitCode));
+
+ item->setData(Qt::UserRole, QVariant(current_file_));
+
+ if (exitCode)
+ {
+ item->setCheckState(Qt::Unchecked);
+ item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+
+ item->setSizeHint(QSize(170, 200));
+ withTextListWidget->addItem(item);
+ // Fixme: update tab title with number of photos.
+ if (withTextListWidget->count() == 1)
+ {
+ withTextListWidget->setCurrentRow(0, QItemSelectionModel::SelectCurrent);
+ on_withTextListWidget_itemClicked(withTextListWidget->item(0));
+ }
+ }
+ else
+ // Fixme: update tab title with number of photos.
+ withoutTextListWidget->addItem(item);
+ }
+
+ next_process();
+ }
+
+
+ void
+ main_window::display_image(const QString& filename)
+ {
+ graphicsView->scene()->clear();
+
+ QPixmap pixmap(filename);
+ QGraphicsPixmapItem *item = graphicsView->scene()->addPixmap(pixmap);
+
+ graphicsView->setSceneRect(item->boundingRect());
+
+ if (item->boundingRect().contains(graphicsView->viewport()->geometry()))
+ graphicsView->fitInView(item->boundingRect(), Qt::KeepAspectRatio);
+ else
+ graphicsView->fitInView(graphicsView->viewport()->geometry(),
+ Qt::KeepAspectRatio);
+ }
+
+
+ void
+ main_window::on_withTextListWidget_itemClicked(QListWidgetItem * item)
+ {
+ if (fullImageButton->isChecked())
+ on_fullImageButton_toggled(true);
+ else if (textOnlyButton->isChecked())
+ on_textOnlyButton_toggled(true);
+ else if (textBoxesButton->isChecked())
+ on_textBoxesButton_toggled(true);
+ else if (textMaskButton->isChecked())
+ on_textMaskButton_toggled(true);
+ else
+ {
+ QFileInfo f(item->text());
+ display_image(output_file(f.baseName()));
+ }
+ }
+
+ void
+ main_window::on_withoutTextListWidget_itemClicked(QListWidgetItem * item)
+ {
+
display_image(file_list_.at(item->data(Qt::UserRole).toInt()).absoluteFilePath());
+ }
+
+ void
+ main_window::on_fullImageButton_toggled(bool)
+ {
+ if (withTextListWidget->count())
+ {
+ QString filename =
file_list_.at(withTextListWidget->currentItem()->data(Qt::UserRole).toInt()).absoluteFilePath();
+ display_image(filename);
+ }
+ }
+
+ void
+ main_window::on_textBoxesButton_toggled(bool)
+ {
+ if (withTextListWidget->count())
+ {
+ QFileInfo f(withTextListWidget->currentItem()->text());
+ display_image(textBoxes_file(f.baseName()));
+ }
+ }
+
+ void
+ main_window::on_textMaskButton_toggled(bool)
+ {
+ if (withTextListWidget->count())
+ {
+ QFileInfo f(withTextListWidget->currentItem()->text());
+ display_image(textMask_file(f.baseName()));
+ }
+ }
+
+ void
+ main_window::on_textOnlyButton_toggled(bool)
+ {
+ if (withTextListWidget->count())
+ {
+ QFileInfo f(withTextListWidget->currentItem()->text());
+ display_image(output_file(f.baseName()));
+ }
+ }
+
+
+
+ void
+ main_window::on_tabWidget_currentChanged(int index)
+ {
+ bool b = (index == 0);
+ fullImageButton->setEnabled(b);
+ textOnlyButton->setEnabled(b);
+ textBoxesButton->setEnabled(b);
+ textMaskButton->setEnabled(b);
+ toolbar_->setEnabled(b);
+
+ if (index == 1)
+ {
+ graphicsView->scene()->clear();
+ if (withoutTextListWidget->count())
+ {
+ withoutTextListWidget->setCurrentRow(0, QItemSelectionModel::Select);
+ on_withoutTextListWidget_itemClicked(withoutTextListWidget->item(0));
+ }
+ }
+ }
+
+ void
+ main_window::cancel_clicked(bool)
+ {
+ process_.disconnect();
+ process_.kill();
+ process_.waitForFinished();
+ progressBar_.setValue(progressBar_.maximum());
+ connect_process();
+ statusBar()->hide();
+ }
+
+ void
+ main_window::remove_image(bool)
+ {
+ QList<QListWidgetItem *> items = withTextListWidget->selectedItems();
+ foreach(QListWidgetItem *item, items)
+ delete withTextListWidget->takeItem(withTextListWidget->row(item));
+
+ if (withTextListWidget->count())
+ withTextListWidget->setCurrentRow(0, QItemSelectionModel::Select);
+ }
+
+
+ void main_window::connect_process()
+ {
+ connect(&process_, SIGNAL(error(QProcess::ProcessError)),
+ this, SLOT(process__error_slot(QProcess::ProcessError)));
+ connect(&process_,
+ SIGNAL(finished(int, QProcess::ExitStatus)),
+ this,
+ SLOT(process__finished_slot(int, QProcess::ExitStatus)));
+ }
+
+
+ void
+ main_window::keyPressEvent(QKeyEvent * event)
+ {
+ if (tabWidget->currentIndex() == 0)
+ {
+ switch(event->key())
+ {
+ case Qt::Key_F1:
+ on_textOnlyButton_toggled(true);
+ break;
+ case Qt::Key_F2:
+ on_fullImageButton_toggled(true);
+ break;
+ case Qt::Key_F3:
+ on_textBoxesButton_toggled(true);
+ break;
+ case Qt::Key_F4:
+ on_textMaskButton_toggled(true);
+ break;
+ }
+ }
+ else
+ event->ignore();
+ }
+
+ void
+ main_window::resizeEvent(QResizeEvent* event)
+ {
+ if (graphicsView->scene()->items().size())
+ graphicsView->fitInView(graphicsView->scene()->items().at(0)->boundingRect(),
+ Qt::KeepAspectRatio);
+
+ event->ignore();
+ }
+
+ } // end of namespace scribo::demo
+
+} // end of namespace scribo
+
+
diff --git a/milena/sandbox/lazzara/afp/photos/gui/src/main_window.hh
b/milena/sandbox/lazzara/afp/photos/gui/src/main_window.hh
new file mode 100644
index 0000000..55ea254
--- /dev/null
+++ b/milena/sandbox/lazzara/afp/photos/gui/src/main_window.hh
@@ -0,0 +1,106 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena 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, version 2 of the License.
+//
+// Olena 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 Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#ifndef MLN_DEMO_SRC_MAIN_WINDOW_HH
+
+# include <QtGui>
+# include <ui_main_window.h>
+
+namespace mln
+{
+
+ namespace demo
+ {
+
+
+ class main_window : public QMainWindow, private Ui::MainWindow
+ {
+ Q_OBJECT
+
+ public:
+ main_window(const QString& text_in_photo_ppm, QWidget *parent = 0);
+ ~main_window();
+
+
+ private slots:
+ void process__error_slot(QProcess::ProcessError);
+ void process__finished_slot(int exitCode,
+ QProcess::ExitStatus exitStatus);
+ void on_withTextListWidget_itemClicked(QListWidgetItem * item);
+ void on_withoutTextListWidget_itemClicked(QListWidgetItem * item);
+
+ void on_fullImageButton_toggled(bool b);
+ void on_textBoxesButton_toggled(bool);
+ void on_textMaskButton_toggled(bool);
+ void on_textOnlyButton_toggled(bool);
+
+ void on_tabWidget_currentChanged(int index);
+ void on_actionScan_directory_triggered();
+ void init_and_start_process(const QString& dirname, bool bgfg);
+ void cancel_clicked(bool);
+
+ void remove_image(bool);
+
+ signals:
+ void process_finished();
+
+ private: // Members
+ void keyPressEvent(QKeyEvent* event);
+ void resizeEvent(QResizeEvent* event);
+
+ QString output_file(const QString& basename);
+ QString textBoxes_file(const QString& basename);
+ QString textMask_file(const QString& basename);
+
+ void display_image(const QString& filename);
+ void start_process();
+ void next_process();
+
+ void connect_process();
+
+ private: // Attributes
+ QString output_dir_;
+ QDir dir_;
+ QString text_in_photo_ppm_;
+ QProcess process_;
+ bool bgfg_;
+
+ QFileInfoList file_list_;
+ int current_file_;
+
+ // Status bar
+ QLabel progressLabel_;
+ QProgressBar progressBar_;
+
+ // ToolBar
+ QToolBar *toolbar_;
+ };
+
+
+ } // end of namespace mln::demo
+
+} // end of namespace mln
+
+#endif // ! MLN_DEMO_SRC_MAIN_WINDOW_HH
diff --git a/milena/sandbox/lazzara/afp/photos/gui/ui/launch_dialog.ui
b/milena/sandbox/lazzara/afp/photos/gui/ui/launch_dialog.ui
new file mode 100644
index 0000000..cc59126
--- /dev/null
+++ b/milena/sandbox/lazzara/afp/photos/gui/ui/launch_dialog.ui
@@ -0,0 +1,100 @@
+<ui version="4.0" >
+ <class>LaunchDialog</class>
+ <widget class="QDialog" name="LaunchDialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>285</width>
+ <height>165</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Dialog</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3" >
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2" >
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout" >
+ <item>
+ <widget class="QLineEdit" name="pathToPics" />
+ </item>
+ <item>
+ <widget class="QPushButton" name="browseBtn" >
+ <property name="text" >
+ <string>&Browse</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox" >
+ <property name="title" >
+ <string>Options</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout" >
+ <item>
+ <widget class="QCheckBox" name="checkBox" >
+ <property name="text" >
+ <string>Enable Foreground extraction (slower)</string>
+ </property>
+ <property name="checked" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="dialogBtnBox" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons" >
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>dialogBtnBox</sender>
+ <signal>accepted()</signal>
+ <receiver>LaunchDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>dialogBtnBox</sender>
+ <signal>rejected()</signal>
+ <receiver>LaunchDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/milena/sandbox/lazzara/afp/photos/gui/ui/main_window.ui
b/milena/sandbox/lazzara/afp/photos/gui/ui/main_window.ui
new file mode 100644
index 0000000..0d3d925
--- /dev/null
+++ b/milena/sandbox/lazzara/afp/photos/gui/ui/main_window.ui
@@ -0,0 +1,656 @@
+<ui version="4.0" >
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>708</width>
+ <height>834</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MainWindow</string>
+ </property>
+ <property name="dockNestingEnabled" >
+ <bool>true</bool>
+ </property>
+ <property name="dockOptions" >
+
<set>QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks</set>
+ </property>
+ <widget class="QWidget" name="centralwidget" >
+ <layout class="QVBoxLayout" name="verticalLayout_4" >
+ <item>
+ <widget class="QSplitter" name="splitter" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <widget class="QTabWidget" name="tabWidget" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Expanding"
>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>false</bool>
+ </property>
+ <property name="tabShape" >
+ <enum>QTabWidget::Rounded</enum>
+ </property>
+ <property name="currentIndex" >
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab" >
+ <attribute name="title" >
+ <string>With text</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout" >
+ <item row="0" column="0" >
+ <layout class="QVBoxLayout" name="verticalLayout_5"
>
+ <item>
+ <widget class="QListWidget" name="withTextListWidget"
>
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding"
hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editTriggers" >
+ <set>QAbstractItemView::NoEditTriggers</set>
+ </property>
+ <property name="tabKeyNavigation" >
+ <bool>true</bool>
+ </property>
+ <property name="showDropIndicator" stdset="0" >
+ <bool>false</bool>
+ </property>
+ <property name="selectionMode" >
+ <enum>QAbstractItemView::ExtendedSelection</enum>
+ </property>
+ <property name="iconSize" >
+ <size>
+ <width>150</width>
+ <height>150</height>
+ </size>
+ </property>
+ <property name="movement" >
+ <enum>QListView::Static</enum>
+ </property>
+ <property name="flow" >
+ <enum>QListView::LeftToRight</enum>
+ </property>
+ <property name="isWrapping" stdset="0" >
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode" >
+ <enum>QListView::Adjust</enum>
+ </property>
+ <property name="layoutMode" >
+ <enum>QListView::Batched</enum>
+ </property>
+ <property name="spacing" >
+ <number>10</number>
+ </property>
+ <property name="gridSize" >
+ <size>
+ <width>170</width>
+ <height>200</height>
+ </size>
+ </property>
+ <property name="viewMode" >
+ <enum>QListView::IconMode</enum>
+ </property>
+ <property name="uniformItemSizes" >
+ <bool>true</bool>
+ </property>
+ <property name="batchSize" >
+ <number>100</number>
+ </property>
+ <property name="wordWrap" >
+ <bool>true</bool>
+ </property>
+ <property name="selectionRectVisible" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4"
>
+ <item>
+ <spacer name="horizontalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QToolButton" name="prevBtn" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset resource="../gui.qrc" >
+
<normaloff>:/icons/prev.png</normaloff>:/icons/prev.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="comboBox" >
+ <item>
+ <property name="text" >
+ <string>Page 1</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="nextBtn" >
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="icon" >
+ <iconset resource="../gui.qrc" >
+
<normaloff>:/icons/next.png</normaloff>:/icons/next.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_2" >
+ <attribute name="title" >
+ <string>Without text</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_6" >
+ <item>
+ <widget class="QListWidget" name="withoutTextListWidget"
>
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding"
hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="layoutMode" >
+ <enum>QListView::Batched</enum>
+ </property>
+ <property name="batchSize" >
+ <number>5</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <widget class="QDockWidget" name="dockWidget" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Maximum" hsizetype="Maximum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>550</width>
+ <height>524287</height>
+ </size>
+ </property>
+ <widget class="QWidget" name="dockWidgetContents" >
+ <layout class="QGridLayout" name="gridLayout_2" >
+ <item row="0" column="0" >
+ <layout class="QVBoxLayout" name="verticalLayout_7"
>
+ <item>
+ <spacer name="verticalSpacer_3" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_4" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QGraphicsView" name="graphicsView"
>
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding"
hsizetype="Maximum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>350</width>
+ <height>512</height>
+ </size>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>512</width>
+ <height>512</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_3"
>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout"
>
+ <item>
+ <layout class="QVBoxLayout"
name="verticalLayout_2" >
+ <property name="sizeConstraint" >
+ <enum>QLayout::SetNoConstraint</enum>
+ </property>
+ <item>
+ <widget class="QLabel" name="label" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Maximum"
hsizetype="Maximum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Annnotations</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTextEdit" name="textEdit" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Maximum"
hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize" >
+ <size>
+ <width>200</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout"
>
+ <item>
+ <widget class="QPushButton"
name="textOnlyButton" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed"
hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>View text only</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="autoExclusive" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton"
name="fullImageButton" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed"
hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>View full image</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="autoExclusive" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton"
name="textBoxesButton" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed"
hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>View text boxes</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="autoExclusive" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton"
name="textMaskButton" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed"
hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>View text mask</string>
+ </property>
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="autoExclusive" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout"
name="horizontalLayout_2" >
+ <item>
+ <spacer name="horizontalSpacer_3" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pushButton_2"
>
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed"
hsizetype="Maximum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Validate</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../gui.qrc" >
+
<normaloff>:/icons/ok.png</normaloff>:/icons/ok.png</iconset>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" >
+ <spacer name="verticalSpacer_5" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menubar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>708</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuFile" >
+ <property name="title" >
+ <string>&File</string>
+ </property>
+ <addaction name="actionScan_directory" />
+ <addaction name="separator" />
+ <addaction name="action_Quit" />
+ </widget>
+ <widget class="QMenu" name="menu_View" >
+ <property name="title" >
+ <string>&View</string>
+ </property>
+ <addaction name="actionFull_Image" />
+ <addaction name="actionText_Boxes" />
+ <addaction name="separator" />
+ <addaction name="action_Text_Only" />
+ <addaction name="actionText_Mask" />
+ </widget>
+ <addaction name="menuFile" />
+ <addaction name="menu_View" />
+ </widget>
+ <widget class="QStatusBar" name="statusbar" />
+ <action name="actionScan_directory" >
+ <property name="icon" >
+ <iconset resource="../gui.qrc" >
+
<normaloff>:/icons/photos.png</normaloff>:/icons/photos.png</iconset>
+ </property>
+ <property name="text" >
+ <string>&Scan directory...</string>
+ </property>
+ </action>
+ <action name="action_Text_Only" >
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>&Text only</string>
+ </property>
+ </action>
+ <action name="actionFull_Image" >
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Full image</string>
+ </property>
+ </action>
+ <action name="actionText_Boxes" >
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Text boxes</string>
+ </property>
+ </action>
+ <action name="actionText_Mask" >
+ <property name="checkable" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>Text mask</string>
+ </property>
+ </action>
+ <action name="action_Quit" >
+ <property name="text" >
+ <string>&Quit</string>
+ </property>
+ </action>
+ </widget>
+ <resources>
+ <include location="../gui.qrc" />
+ </resources>
+ <connections>
+ <connection>
+ <sender>action_Quit</sender>
+ <signal>activated()</signal>
+ <receiver>MainWindow</receiver>
+ <slot>close()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>-1</x>
+ <y>-1</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>353</x>
+ <y>335</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>actionFull_Image</sender>
+ <signal>activated()</signal>
+ <receiver>fullImageButton</receiver>
+ <slot>toggle()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>-1</x>
+ <y>-1</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>634</x>
+ <y>492</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>action_Text_Only</sender>
+ <signal>activated()</signal>
+ <receiver>textOnlyButton</receiver>
+ <slot>toggle()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>-1</x>
+ <y>-1</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>634</x>
+ <y>457</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>actionText_Boxes</sender>
+ <signal>activated()</signal>
+ <receiver>textBoxesButton</receiver>
+ <slot>toggle()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>-1</x>
+ <y>-1</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>634</x>
+ <y>527</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>actionText_Mask</sender>
+ <signal>activated()</signal>
+ <receiver>textMaskButton</receiver>
+ <slot>toggle()</slot>
+ <hints>
+ <hint type="sourcelabel" >
+ <x>-1</x>
+ <y>-1</y>
+ </hint>
+ <hint type="destinationlabel" >
+ <x>634</x>
+ <y>562</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
--
1.5.6.5