ceres-solver-v1 / colmap /src /ui /project_widget.cc
camenduru's picture
ceres-solver and colmap
7b7496d
// Copyright (c) 2022, ETH Zurich and UNC Chapel Hill.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de)
#include "ui/project_widget.h"
#include "base/database.h"
namespace colmap {
ProjectWidget::ProjectWidget(QWidget* parent, OptionManager* options)
: QWidget(parent), options_(options), prev_selected_(false) {
setWindowFlags(Qt::Dialog);
setWindowModality(Qt::ApplicationModal);
setWindowTitle("Project");
// Database path.
QPushButton* databse_path_new = new QPushButton(tr("New"), this);
connect(databse_path_new, &QPushButton::released, this,
&ProjectWidget::SelectNewDatabasePath);
QPushButton* databse_path_open = new QPushButton(tr("Open"), this);
connect(databse_path_open, &QPushButton::released, this,
&ProjectWidget::SelectExistingDatabasePath);
database_path_text_ = new QLineEdit(this);
database_path_text_->setText(
QString::fromStdString(*options_->database_path));
// Image path.
QPushButton* image_path_select = new QPushButton(tr("Select"), this);
connect(image_path_select, &QPushButton::released, this,
&ProjectWidget::SelectImagePath);
image_path_text_ = new QLineEdit(this);
image_path_text_->setText(QString::fromStdString(*options_->image_path));
// Save button.
QPushButton* create_button = new QPushButton(tr("Save"), this);
connect(create_button, &QPushButton::released, this, &ProjectWidget::Save);
QGridLayout* grid = new QGridLayout(this);
grid->addWidget(new QLabel(tr("Database"), this), 0, 0);
grid->addWidget(database_path_text_, 0, 1);
grid->addWidget(databse_path_new, 0, 2);
grid->addWidget(databse_path_open, 0, 3);
grid->addWidget(new QLabel(tr("Images"), this), 1, 0);
grid->addWidget(image_path_text_, 1, 1);
grid->addWidget(image_path_select, 1, 2);
grid->addWidget(create_button, 2, 2);
}
bool ProjectWidget::IsValid() const {
return ExistsDir(GetImagePath()) && !ExistsDir(GetDatabasePath()) &&
ExistsDir(GetParentDir(GetDatabasePath()));
}
void ProjectWidget::Reset() {
database_path_text_->clear();
image_path_text_->clear();
}
std::string ProjectWidget::GetDatabasePath() const {
return database_path_text_->text().toUtf8().constData();
}
std::string ProjectWidget::GetImagePath() const {
return image_path_text_->text().toUtf8().constData();
}
void ProjectWidget::SetDatabasePath(const std::string& path) {
database_path_text_->setText(QString::fromStdString(path));
}
void ProjectWidget::SetImagePath(const std::string& path) {
image_path_text_->setText(QString::fromStdString(path));
}
void ProjectWidget::Save() {
if (IsValid()) {
*options_->database_path = GetDatabasePath();
*options_->image_path = GetImagePath();
// Save empty database file.
Database database(*options_->database_path);
hide();
} else {
QMessageBox::critical(this, "", tr("Invalid paths"));
}
}
void ProjectWidget::SelectNewDatabasePath() {
QString database_path = QFileDialog::getSaveFileName(
this, tr("Select database file"), DefaultDirectory(),
tr("SQLite3 database (*.db)"));
if (database_path != "") {
if (!HasFileExtension(database_path.toUtf8().constData(), ".db")) {
database_path += ".db";
}
database_path_text_->setText(database_path);
}
}
void ProjectWidget::SelectExistingDatabasePath() {
const auto database_path = QFileDialog::getOpenFileName(
this, tr("Select database file"), DefaultDirectory(),
tr("SQLite3 database (*.db)"));
if (database_path != "") {
database_path_text_->setText(database_path);
}
}
void ProjectWidget::SelectImagePath() {
const auto image_path = QFileDialog::getExistingDirectory(
this, tr("Select image path..."), DefaultDirectory(),
QFileDialog::ShowDirsOnly);
if (image_path != "") {
image_path_text_->setText(image_path);
}
}
QString ProjectWidget::DefaultDirectory() {
if (prev_selected_) {
return "";
}
prev_selected_ = true;
if (!options_->project_path->empty()) {
const auto parent_path = GetParentDir(*options_->project_path);
if (ExistsDir(parent_path)) {
return QString::fromStdString(parent_path);
}
}
if (!database_path_text_->text().isEmpty()) {
const auto parent_path =
GetParentDir(database_path_text_->text().toUtf8().constData());
if (ExistsDir(parent_path)) {
return QString::fromStdString(parent_path);
}
}
if (!image_path_text_->text().isEmpty()) {
return image_path_text_->text();
}
return "";
}
} // namespace colmap