valentina_old/tablewindow.cpp
dismine 2cbe79c803 Change in license.
--HG--
branch : develop
2013-11-15 14:50:05 +02:00

413 lines
14 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************************************************************
**
** @file tablewindow.cpp
** @author Roman Telezhinsky <dismine@gmail.com>
** @date November 15, 2013
**
** @brief
** @copyright
** This source code is part of the Valentine project, a pattern making
** program, whose allow create and modeling patterns of clothing.
** Copyright (C) 2013 Valentina project
** <https://bitbucket.org/dismine/valentina> All Rights Reserved.
**
** Valentina is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** Valentina 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 Valentina. If not, see <http://www.gnu.org/licenses/>.
**
*************************************************************************/
#include "tablewindow.h"
#include "ui_tablewindow.h"
#include "widgets/vtablegraphicsview.h"
#include "options.h"
#include <QtSvg>
TableWindow::TableWindow(QWidget *parent)
:QMainWindow(parent), numberDetal(0), colission(0), ui(new Ui::TableWindow),
listDetails(QVector<VItem*>()), outItems(false), collidingItems(false), currentScene(0),
paper(0), shadowPaper(0), listOutItems(0), listCollidingItems(QList<QGraphicsItem*>()),
indexDetail(0), sceneRect(QRectF())
{
ui->setupUi(this);
numberDetal = new QLabel("Залишилось 0 деталей.", this);
colission = new QLabel("Колізій не знайдено.", this);
ui->statusBar->addWidget(numberDetal);
ui->statusBar->addWidget(colission);
outItems = collidingItems = false;
//sceneRect = QRectF(0, 0, toPixel(203), toPixel(287));
sceneRect = QRectF(0, 0, toPixel(823), toPixel(1171));
currentScene = new QGraphicsScene(sceneRect);
QBrush *brush = new QBrush();
brush->setStyle( Qt::SolidPattern );
brush->setColor( QColor( Qt::gray ) );
currentScene->setBackgroundBrush( *brush );
VTableGraphicsView* view = new VTableGraphicsView(currentScene);
view->fitInView(view->scene()->sceneRect(), Qt::KeepAspectRatio);
ui->horizontalLayout->addWidget(view);
connect(ui->actionTurn, &QAction::triggered, view, &VTableGraphicsView::rotateItems);
connect(ui->actionMirror, &QAction::triggered, view, &VTableGraphicsView::MirrorItem);
connect(ui->actionZoomIn, &QAction::triggered, view, &VTableGraphicsView::ZoomIn);
connect(ui->actionZoomOut, &QAction::triggered, view, &VTableGraphicsView::ZoomOut);
connect(ui->actionStop, &QAction::triggered, this, &TableWindow::StopTable);
connect(ui->actionSave, &QAction::triggered, this, &TableWindow::saveScene);
connect(ui->actionNext, &QAction::triggered, this, &TableWindow::GetNextDetail);
connect(ui->actionAdd, &QAction::triggered, this, &TableWindow::AddLength);
connect(ui->actionRemove, &QAction::triggered, this, &TableWindow::RemoveLength);
connect(view, &VTableGraphicsView::itemChect, this, &TableWindow::itemChect);
}
TableWindow::~TableWindow()
{
delete ui;
}
void TableWindow::AddPaper()
{
qreal x1, y1, x2, y2;
sceneRect.getCoords(&x1, &y1, &x2, &y2);
shadowPaper = new QGraphicsRectItem(QRectF(x1+4, y1+4, x2+4, y2+4));
shadowPaper->setBrush(QBrush(Qt::black));
currentScene->addItem(shadowPaper);
paper = new QGraphicsRectItem(QRectF(x1, y1, x2, y2));
paper->setPen(QPen(Qt::black, widthMainLine));
paper->setBrush(QBrush(Qt::white));
currentScene->addItem(paper);
qDebug()<<paper->rect().size().toSize();
}
void TableWindow::AddDetail()
{
if (indexDetail<listDetails.count())
{
currentScene->clearSelection();
VItem* Detail = listDetails[indexDetail];
QObject::connect(Detail, SIGNAL(itemOut(int, bool)), this, SLOT(itemOut(int, bool)));
QObject::connect(Detail, SIGNAL(itemColliding(QList<QGraphicsItem*>, int)), this,
SLOT(itemColliding(QList<QGraphicsItem*>, int)));
QObject::connect(this, SIGNAL(LengthChanged()), Detail, SLOT(LengthChanged()));
Detail->setPen(QPen(Qt::black, 1));
Detail->setBrush(QBrush(Qt::white));
Detail->setPos(paper->boundingRect().center());
Detail->setFlag(QGraphicsItem::ItemIsMovable, true);
Detail->setFlag(QGraphicsItem::ItemIsSelectable, true);
Detail->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
Detail->setPaper(paper);
currentScene->addItem(Detail);
Detail->setSelected(true);
indexDetail++;
if (indexDetail==listDetails.count())
{
ui->actionSave->setEnabled(true);
}
}
numberDetal->setText(QString("Залишилось %1 деталей.").arg(listDetails.count()-indexDetail));
}
/*
* Отримуємо деталі розрахованої моделі для подальшого укладання.
*/
void TableWindow::ModelChosen(QVector<VItem*> listDetails)
{
this->listDetails = listDetails;
listOutItems = new QBitArray(this->listDetails.count());
AddPaper();
indexDetail = 0;
AddDetail();
show();
}
void TableWindow::closeEvent(QCloseEvent *event)
{
event->ignore();
StopTable();
}
void TableWindow::moveToCenter()
{
QRect rect = frameGeometry();
rect.moveCenter(QDesktopWidget().availableGeometry().center());
move(rect.topLeft());
}
void TableWindow::showEvent ( QShowEvent * event )
{
QMainWindow::showEvent(event);
moveToCenter();
}
void TableWindow::StopTable()
{
hide();
currentScene->clear();
delete listOutItems;
listDetails.clear();
//sceneRect = QRectF(0, 0, 230*resol/25.9, 327*resol/25.9);
sceneRect = QRectF(0, 0, toPixel(823), toPixel(1171));
emit closed();
}
void TableWindow::saveScene()
{
QString name = QFileDialog::getSaveFileName(0, tr("Save layout"), "", "Images (*.png);;Svg files (*.svg)");
if (name.isNull())
{
return;
}
QBrush *brush = new QBrush();
brush->setColor( QColor( Qt::white ) );
currentScene->setBackgroundBrush( *brush );
currentScene->clearSelection(); // Selections would also render to the file
shadowPaper->setVisible(false);
QFileInfo fi(name);
if (fi.suffix() == "svg")
{
paper->setVisible(false);
SvgFile(name);
paper->setVisible(true);
}
else if (fi.suffix() == "png")
{
paper->setPen(QPen(Qt::white, 0.1, Qt::NoPen));
PngFile(name);
paper->setPen(QPen(Qt::black, widthMainLine));
}
brush->setColor( QColor( Qt::gray ) );
brush->setStyle( Qt::SolidPattern );
currentScene->setBackgroundBrush( *brush );
shadowPaper->setVisible(true);
delete brush;
}
void TableWindow::itemChect(bool flag)
{
ui->actionTurn->setDisabled(flag);
ui->actionMirror->setDisabled(flag);
}
void TableWindow::checkNext()
{
if (outItems == true && collidingItems == true)
{
colission->setText("Колізій не знайдено.");
if (indexDetail==listDetails.count())
{
ui->actionSave->setEnabled(true);
ui->actionNext->setDisabled(true);
}
else
{
ui->actionNext->setDisabled(false);
ui->actionSave->setEnabled(false);
}
}
else
{
colission->setText("Знайдено колізії.");
ui->actionNext->setDisabled(true);
ui->actionSave->setEnabled(false);
}
}
void TableWindow::itemOut(int number, bool flag)
{
listOutItems->setBit(number, flag);
for ( int i = 0; i < listOutItems->count(); ++i )
{
if (listOutItems->at(i)==true)
{
outItems=false;
qDebug()<<"itemOut::outItems="<<outItems<<"&& collidingItems"<<collidingItems;
checkNext();
return;
}
}
outItems=true;
checkNext();
}
void TableWindow::itemColliding(QList<QGraphicsItem *> list, int number)
{
//qDebug()<<"number="<<number;
if (number==0)
{
if (listCollidingItems.isEmpty()==false)
{
if (listCollidingItems.contains(list.at(0))==true)
{
listCollidingItems.removeAt(listCollidingItems.indexOf(list.at(0)));
if (listCollidingItems.size()>1)
{
for ( int i = 0; i < listCollidingItems.count(); ++i )
{
QList<QGraphicsItem *> lis = listCollidingItems.at(i)->collidingItems();
if (lis.size()-2 <= 0)
{
VItem * bitem = qgraphicsitem_cast<VItem *> ( listCollidingItems.at(i) );
if (bitem == 0)
{
qDebug()<<"Не можу привести тип об'єкту";
}
else
{
bitem->setPen(QPen(Qt::black, widthMainLine));
}
listCollidingItems.removeAt(i);
}
}
}
else if (listCollidingItems.size()==1)
{
VItem * bitem = qgraphicsitem_cast<VItem *> ( listCollidingItems.at(0) );
if (bitem == 0)
{
qDebug()<<"Не можу привести тип об'єкту";
}
else
{
bitem->setPen(QPen(Qt::black, widthMainLine));
}
listCollidingItems.clear();
collidingItems = true;
}
}
else
{
collidingItems = true;
}
}
else
{
collidingItems = true;
}
}
else if (number==1)
{
if (list.contains(paper)==true)
{
list.removeAt(list.indexOf(paper));
}
if (list.contains(shadowPaper)==true)
{
list.removeAt(list.indexOf(shadowPaper));
}
for ( int i = 0; i < list.count(); ++i )
{
if (listCollidingItems.contains(list.at(i))==false)
{
listCollidingItems.append(list.at(i));
}
}
collidingItems = false;
}
qDebug()<<"itemColliding::outItems="<<outItems<<"&& collidingItems"<<collidingItems;
checkNext();
}
void TableWindow::GetNextDetail()
{
AddDetail();
}
void TableWindow::AddLength()
{
QRectF rect = currentScene->sceneRect();
rect.setHeight(rect.height()+toPixel(279));
currentScene->setSceneRect(rect);
rect = shadowPaper->rect();
rect.setHeight(rect.height()+toPixel(279));
shadowPaper->setRect(rect);
rect = paper->rect();
rect.setHeight(rect.height()+toPixel(279));
paper->setRect(rect);
ui->actionRemove->setEnabled(true);
emit LengthChanged();
}
void TableWindow::RemoveLength()
{
if (sceneRect.height() <= currentScene->sceneRect().height() - 100)
{
QRectF rect = currentScene->sceneRect();
rect.setHeight(rect.height()-toPixel(279));
currentScene->setSceneRect(rect);
rect = shadowPaper->rect();
rect.setHeight(rect.height()-toPixel(279));
shadowPaper->setRect(rect);
rect = paper->rect();
rect.setHeight(rect.height()-toPixel(279));
paper->setRect(rect);
if (fabs(sceneRect.height() - currentScene->sceneRect().height()) < 0.01)
{
ui->actionRemove->setDisabled(true);
}
emit LengthChanged();
}
else
{
ui->actionRemove->setDisabled(true);
}
}
void TableWindow::keyPressEvent ( QKeyEvent * event )
{
if ( event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return )
{
if (ui->actionNext->isEnabled() == true )
{
AddDetail();
qDebug()<<"Додали деталь.";
}
}
QMainWindow::keyPressEvent ( event );
}
void TableWindow::SvgFile(const QString &name) const
{
QSvgGenerator generator;
generator.setFileName(name);
generator.setSize(paper->rect().size().toSize());
generator.setTitle(tr("SVG Generator Example Drawing"));
generator.setDescription(tr("An SVG drawing created by the SVG Generator "
"Example provided with Qt."));
generator.setResolution(PrintDPI);
qDebug()<<"resolution is" << generator.resolution();
QPainter painter;
painter.begin(&generator);
painter.setFont( QFont( "Arial", 8, QFont::Normal ) );
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, 1.2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
painter.setBrush ( QBrush ( Qt::NoBrush ) );
currentScene->render(&painter);
painter.end();
}
void TableWindow::PngFile(const QString &name) const
{
QRectF r = paper->rect();
qreal x=0, y=0, w=0, h=0;
r.getRect(&x, &y, &w, &h);// Re-shrink the scene to it's bounding contents
// Create the image with the exact size of the shrunk scene
QImage image(QSize(static_cast<qint32>(w), static_cast<qint32>(h)), QImage::Format_ARGB32);
image.fill(Qt::transparent); // Start all pixels transparent
QPainter painter(&image);
painter.setFont( QFont( "Arial", 8, QFont::Normal ) );
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, widthMainLine, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
painter.setBrush ( QBrush ( Qt::NoBrush ) );
currentScene->render(&painter);
image.save(name);
}