You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1023 lines
30 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

////////////////////////////////////////////////////////////////////////////////
/**
* \file mainwindow.cpp
* \version v1.0
* \author Ing. Dominik Malcik
*/
////////////////////////////////////////////////////////////////////////////////
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "projectwizard.h"
#include "xmlparser.h"
#include "layercomposer.h"
#include "customgraphicsview.h"
#include <QPixmapCache>
#include <QInputDialog>
#include <QCloseEvent>
#include <QColorDialog>
// CONSTS
const QString MainWindow::APPL_NAME = QString("microAnalyzer ::");
// --------------------------------------------
/**
* @brief = CONSTRUCTOR
*/
// --------------------------------------------
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// signals
connect(cProject::Instance(), SIGNAL(imagesValueChanged()), this, SLOT(reloadImagesList()));
connect(cProject::Instance(), SIGNAL(layersValueChanged()), this, SLOT(reloadLayersList()));
imageView = new CustomGraphicsView();
imageView->setBackgroundRole(QPalette::Dark);
imageView->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
setCentralWidget(imageView);
connect(imageView, SIGNAL(colorPickerPosition(int, int)), this, SLOT(graphicsClicked(int, int)));
connect(this, SIGNAL(colorPickerPosition(int, int)), this, SLOT(graphicsClicked(int, int)));
histogramBtn = false;
// init values
initStageAndValues();
// limit cache
QPixmapCache::setCacheLimit(4194304);
// statusbar init
statusBar()->showMessage("To activate function do Open project or Open image action."); // + tr("%1").arg(QPixmapCache::cacheLimit()
}
void MainWindow::initStageAndValues() {
// disable functions that are available only after a project is loaded
menuChangeAvailability(false);
openedNewProjDialog = false;
// setup of bitmap layers table
bitmapLayersTBL = NULL;
bitmapLayersTBL = new TableFormat();
ui->bitmapTableView->setModel(bitmapLayersTBL);
ui->bitmapTableView->resizeRowsToContents(); // Adjust the row height.
ui->bitmapTableView->resizeColumnsToContents(); // Adjust the column width.
ui->bitmapTableView->setColumnWidth( 0, 20 );
ui->bitmapTableView->setColumnWidth( 1, 150 );
ui->bitmapTableView->setColumnWidth( 2, 20 );
// setup of vector layers table
vectorLayersTBL = NULL;
vectorLayersTBL = new TableFormat();
ui->vectorTableView->setModel(vectorLayersTBL);
ui->vectorTableView->resizeRowsToContents(); // Adjust the row height.
ui->vectorTableView->resizeColumnsToContents(); // Adjust the column width.
ui->vectorTableView->setColumnWidth( 0, 20 );
ui->vectorTableView->setColumnWidth( 1, 150 );
ui->vectorTableView->setColumnWidth( 2, 20 );
// init the dial element
lastDialValue = 0;
onOpenNew_dialReset();
// colorpicker initial reset
QImage tmpImg(1,1, QImage::Format_ARGB32);
actualizeGraphicsView(&tmpImg);
ui->frame->setStyleSheet("QFrame {border: 1px solid #828790;}");
actualColor = qRgb(255,255,255);
actualizeFrameColor();
imageView->resetMatrix();
// channel correction sliders
ui->rLabel->setStyleSheet("QLabel { background-color: red; color: white;}");
ui->gLabel->setStyleSheet("QLabel { background-color: green; color: white;}");
ui->bLabel->setStyleSheet("QLabel { background-color: blue; color: white;}");
// colour analysis button
for (int i = 0; i < ui->menuTools->actions().count(); i++) {
if (ui->menuTools->actions().at(i)->isCheckable()) {
ui->menuTools->actions().at(i)->setChecked(false);
}
}
resetSlidersValues();
}
void MainWindow::resetSlidersValues() {
ui->rSlider->setValue(DEF_SLIDER_VALUE);
ui->gSlider->setValue(DEF_SLIDER_VALUE);
ui->bSlider->setValue(DEF_SLIDER_VALUE);
}
void MainWindow::closeThisProject() {
// project init
cProject::Instance()->valueInit();
initStageAndValues();
}
bool MainWindow::importImage(QString &imageFileName, bool addToVector) {
if (imageFileName.isEmpty()) {
return false;
}
else {
if (addToVector) {
// add an image to project
cProject::Instance()->addToImages(imageFileName);
cProject::Instance()->setFileImported(true);
}
QImage image(imageFileName);
if (image.isNull()) {
return false;
}
actualizeGraphicsView(&image);
// align an image to center after import
imageResizer(0.99999999999999);
imageView->resetMatrix();
onOpenNew_dialReset();
// allow functions from menu
menuChangeAvailability(true);
return true;
}
}
void MainWindow::menuChangeAvailability(bool setting, bool sliders) {
ui->imageDial->setEnabled(setting);
ui->rSlider->setEnabled(sliders);
ui->gSlider->setEnabled(sliders);
ui->bSlider->setEnabled(sliders);
ui->bitmapTableView->setEnabled(!sliders);
ui->vectorTableView->setEnabled(!sliders);
}
// --------------------------------------------
/**
* @brief = DESTRUKTOR
*/
// --------------------------------------------
MainWindow::~MainWindow()
{
delete ui;
}
// --------------------------------------------
/**
* @brief = TLACITKO EXIT
*/
// --------------------------------------------
void MainWindow::on_actionExit_triggered() {
close();
}
bool MainWindow::saveAskDialog() {
return true;
}
// --------------------------------------------
/**
*
*/
// --------------------------------------------
void MainWindow::on_actionHelp_triggered()
{
QMessageBox::about(this, APPL_NAME + tr(" HELP"), tr("<p><br>Under construction.</p><p></p>"));
}
// --------------------------------------------
/**
*
*/
// --------------------------------------------
void MainWindow::on_actionAbout_microAnalyzer_triggered()
{
QMessageBox::about(this, APPL_NAME + tr(" About"),
QString::fromLocal8Bit("<p>&nbsp;</p><p><strong>microAnalyzer</strong>.</p>"
"<p>Author: Ing. Dominik Malci­k</p>"
"<p>E-mail: imalcik@fit.vutbr.cz</p>"
"<p>Year: 2014-2016</p><p>&nbsp;</p>"));
}
// --------------------------------------------
/**
*
*/
// --------------------------------------------
void MainWindow::on_actionOpen_Image_triggered()
{
QString imageFileName = QFileDialog::getOpenFileName(this, tr("Open Image"), QDir::currentPath(), "*.bmp *.png *.tif *.jpg *.jpeg");
if (importImage(imageFileName, true)) {
statusBar()->showMessage("Image loaded.");
menuChangeAvailability(true);
}
else {
QMessageBox::critical(this, APPL_NAME + tr(" ERROR"), tr("Error: The image %1 could not be loaded.").arg(imageFileName));
}
}
void MainWindow::onOpenNew_dialReset() {
ui->imageDial->setValue(0);
}
// --------------------------------------------
/**
*
*/
// --------------------------------------------
void MainWindow::on_actionZoom_in_25_triggered()
{
imageResizer (1.2);
}
// --------------------------------------------
/**
*
*/
// --------------------------------------------
void MainWindow::on_actionZoom_out_25_triggered()
{
imageResizer (0.8);
}
// --------------------------------------------
/**
*
*/
// --------------------------------------------
void MainWindow::imageResizer(double resizeCoeff)
{
imageView->scale(resizeCoeff, resizeCoeff);
QString statusMessage = " OUT -" + tr("%1").arg((1.0 - resizeCoeff) * 100) + " %";
if (resizeCoeff > 1.0) {
statusMessage = " IN +" + tr("%1").arg((resizeCoeff - 1.0) * 100) + " %";
}
statusBar()->showMessage("Zoom" + statusMessage);
}
// --------------------------------------------
/**
*
*/
// --------------------------------------------
void MainWindow::on_actionFit_in_Window_triggered()
{
imageView->fitInView(imageView->scene()->sceneRect(), Qt::KeepAspectRatio);
statusBar()->showMessage("Fit in window");
}
// --------------------------------------------
/**
*
*/
// --------------------------------------------
void MainWindow::on_actionOriginal_Size_triggered()
{
imageView->resetMatrix();
statusBar()->showMessage("Original size.");
}
// --------------------------------------------
/**
* @brief = ZMENA VELIKOSTI OBRAZKU NA ZAKLADE POHYBU DIALU
*/
// --------------------------------------------
void MainWindow::on_imageDial_actionTriggered(int action) {
double newRatio = 1.0;
int dialValue = ui->imageDial->value();
int difference = lastDialValue - dialValue;
lastDialValue = dialValue;
newRatio += ((double)(difference * (-1.0)) / 10000.0);
if (newRatio <= 1.1 && newRatio >= 0.9) {
imageResizer (newRatio);
}
}
void MainWindow::invertOpenedDialog_slot() {
openedNewProjDialog = !openedNewProjDialog;
this->setEnabled(true);
}
void MainWindow::on_actionNew_Project_triggered() {
ProjectWizard * pw = new ProjectWizard;
if (!openedNewProjDialog) {
openedNewProjDialog = true;
Qt::WindowFlags flags = pw->windowFlags();
pw->setWindowFlags(flags | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint);
pw->show();
this->setEnabled(false);
connect(pw, SIGNAL(accepted()), this, SLOT(openProject_slot()));
connect(pw, SIGNAL(rejected()), this, SLOT(invertOpenedDialog_slot()));
}
}
/*
* SLOT after accepting of the wizard
*/
void MainWindow::openProject_slot() {
invertOpenedDialog_slot();
menuChangeAvailability(true);
openProject(cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getProjectFileName());
}
void MainWindow::on_actionOpen_Project_triggered() {
QString projectFileName = QFileDialog::getOpenFileName(this, tr("Open microAnalyzer Project"), QDir::currentPath(), "*.mapro");
if (!projectFileName.isEmpty()) {
openProject(projectFileName);
}
}
void MainWindow::openProject(QString projectFileName) {
// if a project file was chosen
if (!projectFileName.isEmpty()) {
// close currently opened project
closeThisProject();
QFile projFile(projectFileName);
// set root directory of the project
QFileInfo fi(projFile);
cProject::Instance()->setProjectRootDir(fi.path());
// open file for reading
if(!projFile.open(QIODevice::ReadOnly)) {
QMessageBox::critical(0, APPL_NAME + " ERROR", projFile.errorString());
}
else {
XMLparser * xml = new XMLparser;
if (!xml->read(&projFile)) {
QMessageBox::critical(0, APPL_NAME + " ERROR", "Project could not be loaded!");
statusBar()->showMessage(tr("Error within project loading! Try again, please."), 3000);
}
else {
// import bitmap layers
if (cProject::Instance()->getFileImported()) {
for (uint i = 0; i < cProject::Instance()->getImages().size(); i++) {
QString imageFileNameToOpen = cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getImagesDir() + "/" + cProject::Instance()->getImages()[i];
importImage(imageFileNameToOpen, false);
}
}
menuChangeAvailability(true);
setWindowTitle(APPL_NAME + " project - " + projectFileName);
statusBar()->showMessage(tr("Project loaded ..."));
}
projFile.close();
}
}
}
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
void MainWindow::on_actionSave_Project_triggered() {
bool removeSubDirs = false;
saveProjectToDest(cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getProjectFileName(), removeSubDirs);
}
void MainWindow::on_actionSave_Project_As_triggered() {
QString saveFileName = QFileDialog::getSaveFileName(this, "Save file", "", "*" + Project::PROJ_FILE_EXT);
if (!saveFileName.isEmpty()) {
bool removeSubDirs = true;
saveProjectToDest(saveFileName, removeSubDirs);
}
}
void MainWindow::saveProjectToDest(QString projectFileName_withPath, bool removeSubDirs) {
QFile projFile(projectFileName_withPath);
QFileInfo fi(projFile);
cProject::Instance()->prepareProject(fi.path(), fi.baseName(),
fi.fileName(), cProject::Instance()->getFileImported(),
cProject::Instance()->getImages(),
cProject::Instance()->getLayers());
// attempt to save + appropriate reaction
if (!cProject::Instance()->saveToFile(removeSubDirs)) {
QMessageBox::critical(0, APPL_NAME + " ERROR", "Project could not be saved!");
statusBar()->showMessage(tr("Error within project saving! Try again, please."), 3000);
}
else {
statusBar()->showMessage(tr("Project saved to ") + projectFileName_withPath);
setWindowTitle(APPL_NAME + " project - " + projectFileName_withPath);
}
}
void MainWindow::reloadImagesList() {
// show updated list/table of images
TableFormat * thisTable = reloadTableList(TABLE_BITMAPS);
bitmapLayersTBL = thisTable;
ui->bitmapTableView->setModel(thisTable);
ui->bitmapTableView->setStyleSheet("QTableView {selection-background-color: #D10000; selection-color: #FFFFFF;}");
}
void MainWindow::reloadLayersList() {
// show updated list/table of images
TableFormat * thisTable = reloadTableList(TABLE_LAYERS);
vectorLayersTBL = thisTable;
ui->vectorTableView->setModel(thisTable);
ui->vectorTableView->setStyleSheet("QTableView {selection-background-color: #2D60ED; selection-color: #FFFFFF;}");
}
TableFormat * MainWindow::reloadTableList(int tableSpec) {
QString name = "";
QString opacity = "100";
TableFormat * table = new TableFormat;
unsigned int size = 0;
if (tableSpec == TABLE_LAYERS) {
size = cProject::Instance()->getLayers().size();
}
else {
size = cProject::Instance()->getImages().size();
}
for (int i = (size - 1); i >= 0; i--) {
if (tableSpec == TABLE_LAYERS) {
name = cProject::Instance()->getSelectedLayer(i);
}
else {
name = cProject::Instance()->getSelectedImage(i);
}
// insert row
table->insertRows(0, 1, QModelIndex());
// insert information to the row
QModelIndex index = table->index(0, 0, QModelIndex());
table->setData(index, QVariant(Qt::Checked), Qt::CheckStateRole);
index = table->index(0, 1, QModelIndex());
table->setData(index, name, Qt::EditRole);
index = table->index(0, 2, QModelIndex());
table->setData(index, opacity, Qt::EditRole);
}
return table;
}
void MainWindow::on_bitmapTableView_activated(QModelIndex index)
{
std::vector<int> selectedIndexes = getImportedIndexes();
if (selectedIndexes.size() > 0) {
QString imageName = cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getImagesDir() + "/";
// !!!!! MAGIC 0 > we are allowing only one layer !!
imageName += cProject::Instance()->getSelectedImage (selectedIndexes[0]);
// load image
QImage image(imageName);
actualizeGraphicsView(&image);
}
}
std::vector<int> MainWindow::getImportedIndexes () {
QModelIndexList indexes = ui->bitmapTableView->selectionModel()->selectedRows(1);
return getSelectedIndexes(indexes);
}
std::vector<int> MainWindow::getAnalysingIndexes () {
QModelIndexList indexes = ui->vectorTableView->selectionModel()->selectedRows(1);
return getSelectedIndexes(indexes);
}
std::vector<int> MainWindow::getSelectedIndexes (QModelIndexList indexes) {
std::vector<int> selectedIndexes;
for (int i = 0; i < indexes.count(); ++i) {
QModelIndex index = indexes.at(i);
selectedIndexes.push_back(index.row());
}
return selectedIndexes;
}
void MainWindow::on_actionClose_Project_Image_triggered()
{
switch( QMessageBox::question(
this,
APPL_NAME + tr(" Close project?"),
tr("Do you really want to close this project?"),
QMessageBox::Yes |
QMessageBox::Cancel,
QMessageBox::Cancel ) )
{
case QMessageBox::Yes: {
closeThisProject();
break;
}
case QMessageBox::Cancel: {
}
default: {
break;
}
}
}
void MainWindow::on_actionAnalyze_edges_triggered()
{
if (cProject::Instance()->getImages().size() > 0) {
std::vector<int> selectedIdx = getImportedIndexes();
if (!(selectedIdx.size() > 0)) {
QMessageBox::information(this, APPL_NAME + " No bitmap layer selected.", tr("Please select a BACKGROUND layer in the left tools panel."
" Click on the demanded layer and try again."));
}
else {
QString fileName = cProject::Instance()->getImages()[ selectedIdx[0] ];
QString test = cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getImagesDir() + "/" + fileName;
QImage imgToAnalyze( test );
if (imgToAnalyze.isNull()) {
QMessageBox::critical(this, APPL_NAME + " ERROR", "Bad file name or out of memory limit - shrink the image resolution please!\n\n" + test);
}
else {
// ram limit !!!
if ( (imgToAnalyze.width() / 1000) * (imgToAnalyze.height() / 1000) <= 75) {
OpenCVprocessor * openCVproc = new OpenCVprocessor();
int resultDialog = getIntDialog();
bool edgeSearch = true;
if (resultDialog >= 0) {
QImage result = openCVproc->processThreshold_Edges(&imgToAnalyze, edgeSearch, resultDialog);
// ---------------- SAVE
int number = cProject::Instance()->layersCount();
QString dstDir = cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getLayersDir() + "/";
QString ext = ".png";
QString addition = "_E";
QString destFileName = saveAnalysingImageToDir(fileName, dstDir, ext, addition, number);
result.save(dstDir + destFileName, "PNG");
cProject::Instance()->addToLayers(destFileName);
// autoSave
on_actionSave_Project_triggered();
// ---------------- // SAVE
// show saved image
actualizeGraphicsView(&result);
statusBar()->showMessage(tr("Edges found ..."));
}
}
else {
QMessageBox::critical(this, APPL_NAME + " TOO BIG IMAGE", "The selected image is too big, please shrink resolution. Max. total amount of pixels is 75 mil (for example 10000 x 7500).");
}
}
}
}
}
void MainWindow::on_actionHough_triggered() {
makeCvFunction(2, -1);
}
void MainWindow::on_actionThreshold_triggered() {
int resultDialog = getIntDialog();
if (resultDialog >= 0) {
makeCvFunction(1, resultDialog);
}
}
void MainWindow::makeCvFunction(int number, int param = 0) {
std::vector<int> selectedIdx = getImportedIndexes();
QString fileName = cProject::Instance()->getImages()[selectedIdx[0]];
QImage imgToAnalyze(cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getImagesDir() + "/" + fileName);
OpenCVprocessor * openCVproc = new OpenCVprocessor();
QImage result;
QString suffix = "";
switch(number) {
case 0: {
break;
}
case 1: {
statusBar()->showMessage(tr("Threshold found ..."));
bool edgeSearch = false;
result = openCVproc->processThreshold_Edges(&imgToAnalyze, edgeSearch, param);
suffix = "TH";
break;
}
case 2: {
statusBar()->showMessage(tr("Hough proceded ..."));
bool edgeSearch = true;
result = openCVproc->processThreshold_Edges(&imgToAnalyze, edgeSearch, param);
suffix = "H";
break;
}
default: {
break;
}
}
QFileInfo fi(fileName);
QString newPngFile = fi.baseName() + suffix + ".png";
result.save(cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getImagesDir() + "/" + newPngFile, "PNG");
cProject::Instance()->addToImages(newPngFile);
actualizeGraphicsView(&result);
// autoSave
on_actionSave_Project_triggered();
}
int MainWindow::getIntDialog() {
bool ok;
int i = QInputDialog::getInt(this, tr("QInputDialog::getInteger()"),
tr("Threshold value"), 100, 0, 255, 1, &ok);
if (ok) {
return i;
}
return -1;
}
void MainWindow::closeEvent(QCloseEvent *event) {
if (!openedNewProjDialog && saveAskDialog()) {
// close window
event->accept();
}
else {
// push cancel - does not close the window
event->ignore();
}
}
void MainWindow::on_pushButton_2_clicked() {
LayerComposer * composer = new LayerComposer();
importedIndexes = getImportedIndexes();
analysingIndexes = getAnalysingIndexes();
if (importedIndexes.size() > 0 && analysingIndexes.size() > 0) {
// merging of selected layers
QString bgRootDir = cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getImagesDir() + "/";
QString overlayRootDir = cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getLayersDir() + "/";
QImage result = composer->composeLayers(cProject::Instance()->getImages(),
cProject::Instance()->getLayers(),
importedIndexes, analysingIndexes,
bgRootDir, overlayRootDir);
actualizeGraphicsView(&result);
statusBar()->showMessage("Layers merged ...");
}
else {
statusBar()->showMessage("Layers NOT merged, select layers to merge first, please.");
}
}
void MainWindow::on_pushButton_clicked() {
LayerComposer * composer = new LayerComposer();
analysingIndexes = getAnalysingIndexes();
if (analysingIndexes.size() > 0) {
std::vector<int> bgVector;
bgVector.push_back(analysingIndexes[0]); // !!!!!!! 0 v indexu
std::vector<int> analysingVector;
for (unsigned int i = 1; i < analysingIndexes.size(); i++) {
analysingVector.push_back(analysingIndexes[i]);
}
// merging of selected layers
QString bgRootDir = cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getLayersDir() + "/";
QString overlayRootDir = bgRootDir;
QImage result = composer->composeLayers(cProject::Instance()->getLayers(),
cProject::Instance()->getLayers(),
bgVector, analysingVector, bgRootDir, overlayRootDir);
actualizeGraphicsView(&result);
statusBar()->showMessage("Layers merged ...");
}
else {
statusBar()->showMessage("Layers NOT merged, select layers to merge first, please.");
}
}
void MainWindow::on_actionAnalyze_Colors_triggered() {
bool setting = ui->imageDial->isEnabled();
bool sliders = !(ui->rSlider->isEnabled());
menuChangeAvailability(setting, sliders);
if (sliders) {
makeColorAnalyzeStep();
}
else {
QString bgImageFileName = cProject::Instance()->getSelectedImage(importedIndexes[0]); // !!!!!! 0
switch( QMessageBox::question(
this,
APPL_NAME + tr(" Save this layer?"),
tr("<p>Would you like to save this layer?</p><p>Choose <b>Yes to proceed</b>, <b>No to abort</b>.</p>"),
QMessageBox::Yes |
QMessageBox::No,
QMessageBox::Yes ) )
{
case QMessageBox::Yes: {
// ---------------- SAVE
int number = cProject::Instance()->layersCount();
QString dstDir = cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getLayersDir() + "/";
QString ext = ".png";
QString addition = "_C";
QString destFileName = saveAnalysingImageToDir(bgImageFileName, dstDir, ext, addition, number);
visibleImage.save(dstDir + destFileName, "PNG");
cProject::Instance()->addToLayers(destFileName);
// autoSave
on_actionSave_Project_triggered();
// ---------------- // SAVE
statusBar()->showMessage("Layer SAVED ...");
break;
}
case QMessageBox::No: {
}
default: {
QString srcDir = cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getImagesDir() + "/";
QImage image(srcDir + bgImageFileName);
if (!(image.isNull())) {
actualizeGraphicsView(&image);
}
statusBar()->showMessage("Layer saving aborted ...");
}
}
}
resetSlidersValues();
}
void MainWindow::on_rSlider_valueChanged(int value) {
if (ui->rSlider->isEnabled()) {
makeColorAnalyzeStep();
}
}
void MainWindow::on_gSlider_valueChanged(int value) {
if (ui->gSlider->isEnabled()) {
makeColorAnalyzeStep();
}
}
void MainWindow::on_bSlider_valueChanged(int value) {
if (ui->bSlider->isEnabled()) {
makeColorAnalyzeStep();
}
}
void MainWindow::makeColorAnalyzeStep () {
importedIndexes = getImportedIndexes();
if (importedIndexes.size() > 0) {
QString bgRootDir = cProject::Instance()->getProjectRootDir() + "/" + cProject::Instance()->getImagesDir() + "/";
QString bgImageFileName = cProject::Instance()->getSelectedImage(importedIndexes[0]); // !!!!!! 0
QRgb maskColor = actualColor;
LayerComposer * composer = new LayerComposer();
visibleImage = composer->maskSelectedLayer(bgImageFileName, bgRootDir, maskColor, ui->rSlider->value(), ui->gSlider->value(), ui->bSlider->value());
actualizeGraphicsView(&visibleImage);
statusBar()->showMessage("Layer processed ...");
}
}
void MainWindow::graphicsClicked(int xPos, int yPos) {
if (!(ui->rSlider->isEnabled())) {
// find coordinates of the cursor position
QPointF point = imageView->mapToScene(xPos, yPos);
actualColor = visibleImage.pixel(point.x(), point.y());
actualizeFrameColor();
}
}
void MainWindow::actualizeFrameColor() {
QPalette palette = ui->frame->palette();
palette.setColor( backgroundRole(), actualColor);
ui->frame->setPalette(palette);
ui->frame->setAutoFillBackground(true);
}
void MainWindow::actualizeGraphicsView(QImage * toShow) {
QPixmapCache::clear();
QPixmap pm = QPixmap::fromImage(*toShow);
QPixmapCache::insert("loadedImage", pm);
// show result
visibleImage = *toShow;
QGraphicsScene * thisScene = new QGraphicsScene;
thisScene->addPixmap(pm);
if (histogramBtn) {
// DOES NOT WORK YET
}
imageView->setScene(thisScene);
}
QString MainWindow::saveAnalysingImageToDir(QString origFN, QString dstDir, QString ext, QString addition, int number) {
QFileInfo fi(origFN);
QString newExt = ext;
QString newPngFile = fi.baseName() + addition;
QString numStr = QString::number(number);
while (1) {
QFile destFile(dstDir + newPngFile + numStr + newExt);
if (!destFile.exists()) {
newPngFile = newPngFile + numStr + newExt;
break;
}
else {
number++;
}
numStr = QString::number(number);
}
return newPngFile;
}
bool MainWindow::deleteDialog(QString layerType) {
switch( QMessageBox::question(
this,
APPL_NAME + tr(" Delete selected layers?"),
tr("<p>Do you really want to permanently remove selected ") + layerType + tr(" layers.</p>"),
QMessageBox::Yes |
QMessageBox::No,
QMessageBox::No ) )
{
case QMessageBox::Yes: {
return true;
}
case QMessageBox::No: {
}
default: {
return false;
}
}
}
// delete analysing
void MainWindow::on_pushButton_3_clicked() {
QString layerType = "ANALYSING";
if (deleteDialog(layerType)) {
analysingIndexes = getAnalysingIndexes();
for (unsigned int i = 0; i < analysingIndexes.size(); i++) {
cProject::Instance()->deleteAnalysing(analysingIndexes[i]);
}
}
cProject::Instance()->emitDeleteAnalysings();
// autoSave
on_actionSave_Project_triggered();
}
// delete imported
void MainWindow::on_pushButton_4_clicked() {
QString layerType = "BACKGROUND";
if (deleteDialog(layerType)) {
importedIndexes = getImportedIndexes();
for (unsigned int i = 0; i < importedIndexes.size(); i++) {
cProject::Instance()->deleteImported(importedIndexes[i]);
}
}
cProject::Instance()->emitDeleteImported();
// autoSave
on_actionSave_Project_triggered();
}
void MainWindow::on_actionHistogram_triggered() {
histogramBtn = !histogramBtn;
}