* 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@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@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>