mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-17 20:50:34 +01:00
Revamp the print preview window
This commit is contained in:
@@ -117,7 +117,8 @@ INCLUDEPATH += sources \
|
|||||||
sources/pugixml \
|
sources/pugixml \
|
||||||
sources/dataBase \
|
sources/dataBase \
|
||||||
sources/dataBase/ui \
|
sources/dataBase/ui \
|
||||||
sources/factory/ui
|
sources/factory/ui \
|
||||||
|
sources/print
|
||||||
|
|
||||||
|
|
||||||
# Fichiers sources
|
# Fichiers sources
|
||||||
@@ -150,7 +151,8 @@ HEADERS += $$files(sources/*.h) $$files(sources/ui/*.h) \
|
|||||||
$$files(sources/pugixml/*.hpp) \
|
$$files(sources/pugixml/*.hpp) \
|
||||||
$$files(sources/dataBase/*.h) \
|
$$files(sources/dataBase/*.h) \
|
||||||
$$files(sources/dataBase/ui/*.h) \
|
$$files(sources/dataBase/ui/*.h) \
|
||||||
$$files(sources/factory/ui/*.h)
|
$$files(sources/factory/ui/*.h) \
|
||||||
|
$$files(sources/print/*.h)
|
||||||
|
|
||||||
SOURCES += $$files(sources/*.cpp) \
|
SOURCES += $$files(sources/*.cpp) \
|
||||||
$$files(sources/editor/*.cpp) \
|
$$files(sources/editor/*.cpp) \
|
||||||
@@ -182,7 +184,8 @@ SOURCES += $$files(sources/*.cpp) \
|
|||||||
$$files(sources/pugixml/*.cpp) \
|
$$files(sources/pugixml/*.cpp) \
|
||||||
$$files(sources/dataBase/*.cpp) \
|
$$files(sources/dataBase/*.cpp) \
|
||||||
$$files(sources/dataBase/ui/*.cpp) \
|
$$files(sources/dataBase/ui/*.cpp) \
|
||||||
$$files(sources/factory/ui/*.cpp)
|
$$files(sources/factory/ui/*.cpp) \
|
||||||
|
$$files(sources/print/*.cpp)
|
||||||
|
|
||||||
# Liste des fichiers qui seront incorpores au binaire en tant que ressources Qt
|
# Liste des fichiers qui seront incorpores au binaire en tant que ressources Qt
|
||||||
RESOURCES += qelectrotech.qrc
|
RESOURCES += qelectrotech.qrc
|
||||||
@@ -207,7 +210,8 @@ FORMS += $$files(sources/richtext/*.ui) \
|
|||||||
$$files(sources/NameList/ui/*.ui) \
|
$$files(sources/NameList/ui/*.ui) \
|
||||||
$$files(sources/qetgraphicsitem/ViewItem/ui/*.ui) \
|
$$files(sources/qetgraphicsitem/ViewItem/ui/*.ui) \
|
||||||
$$files(sources/dataBase/ui/*.ui) \
|
$$files(sources/dataBase/ui/*.ui) \
|
||||||
$$files(sources/factory/ui/*.ui)
|
$$files(sources/factory/ui/*.ui) \
|
||||||
|
$$files(sources/print/*.ui)
|
||||||
|
|
||||||
UI_SOURCES_DIR = sources/ui/
|
UI_SOURCES_DIR = sources/ui/
|
||||||
UI_HEADERS_DIR = sources/ui/
|
UI_HEADERS_DIR = sources/ui/
|
||||||
|
|||||||
@@ -1,657 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2006-2020 The QElectroTech Team
|
|
||||||
This file is part of QElectroTech.
|
|
||||||
|
|
||||||
QElectroTech 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 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#include "diagramprintdialog.h"
|
|
||||||
#include "qetprintpreviewdialog.h"
|
|
||||||
#include <math.h>
|
|
||||||
#include "diagramschooser.h"
|
|
||||||
#include "exportproperties.h"
|
|
||||||
#include "qeticons.h"
|
|
||||||
#include "qetmessagebox.h"
|
|
||||||
|
|
||||||
#include <QPrinter>
|
|
||||||
#include <QPrintDialog>
|
|
||||||
|
|
||||||
/**
|
|
||||||
Constructeur
|
|
||||||
@param project Schema a imprimer
|
|
||||||
@param parent Widget parent du dialogue
|
|
||||||
*/
|
|
||||||
DiagramPrintDialog::DiagramPrintDialog(QETProject *project, QWidget *parent) :
|
|
||||||
QWidget(parent),
|
|
||||||
project_(project),
|
|
||||||
dialog_(nullptr)
|
|
||||||
{
|
|
||||||
// initialise l'imprimante
|
|
||||||
printer_ = new QPrinter();
|
|
||||||
|
|
||||||
// orientation paysage par defaut
|
|
||||||
printer_ -> setOrientation(QPrinter::Landscape);
|
|
||||||
backup_diagram_background_color = Diagram::background_color;
|
|
||||||
Diagram::background_color = Qt::white;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Destructeur
|
|
||||||
*/
|
|
||||||
DiagramPrintDialog::~DiagramPrintDialog()
|
|
||||||
{
|
|
||||||
delete dialog_;
|
|
||||||
delete printer_;
|
|
||||||
Diagram::background_color = backup_diagram_background_color;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Definit le nom du PDF si l'utilisateur choisit une sortie vers un PDF
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::setFileName(const QString &name) {
|
|
||||||
file_name_ = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@return le nom du PDF
|
|
||||||
*/
|
|
||||||
QString DiagramPrintDialog::fileName() const
|
|
||||||
{
|
|
||||||
return(file_name_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Definit le nom du document
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::setDocName(const QString &name) {
|
|
||||||
doc_name_ = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@return le nom du document
|
|
||||||
*/
|
|
||||||
QString DiagramPrintDialog::docName() const
|
|
||||||
{
|
|
||||||
return(doc_name_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief DiagramPrintDialog::diagramRect
|
|
||||||
@param diagram : Diagram to be printed
|
|
||||||
@param options :
|
|
||||||
@return the rectangle to be printed
|
|
||||||
*/
|
|
||||||
QRect DiagramPrintDialog::diagramRect(Diagram *diagram,
|
|
||||||
const ExportProperties &options) const
|
|
||||||
{
|
|
||||||
if (!diagram) return(QRect());
|
|
||||||
|
|
||||||
QRectF diagram_rect = diagram -> border_and_titleblock.borderAndTitleBlockRect();
|
|
||||||
if (!options.draw_titleblock) {
|
|
||||||
qreal titleblock_height = diagram -> border_and_titleblock.titleBlockRect().height();
|
|
||||||
diagram_rect.setHeight(diagram_rect.height() - titleblock_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ajuste la bordure du schema d'un pixel (epaisseur du trait)
|
|
||||||
diagram_rect = diagram_rect.adjusted(0.0, 0.0, 1.0, 1.0);
|
|
||||||
|
|
||||||
return(diagram_rect.toAlignedRect());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Execute le dialogue d'impression
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::exec()
|
|
||||||
{
|
|
||||||
|
|
||||||
// prise en compte du nom du document
|
|
||||||
if (!doc_name_.isEmpty()) printer_ -> setDocName(doc_name_);
|
|
||||||
printer_ -> setCreator(QString("QElectroTech %1").arg(QET::displayedVersion));
|
|
||||||
|
|
||||||
// affichage d'un premier dialogue demandant a l'utilisateur le type
|
|
||||||
// d'impression qu'il souhaite effectuer
|
|
||||||
buildPrintTypeDialog();
|
|
||||||
if (dialog_ -> exec() == QDialog::Rejected) return;
|
|
||||||
|
|
||||||
// parametrage de l'imprimante en fonction du type d'impression choisi
|
|
||||||
if (printer_choice_ -> isChecked()) {
|
|
||||||
// affichage du dialogue d'impression standard pour parametrer l'imprimante
|
|
||||||
QPrintDialog print_dialog(printer_, parentWidget());
|
|
||||||
#ifdef Q_OS_MACOS
|
|
||||||
print_dialog.setWindowFlags(Qt::Sheet);
|
|
||||||
#endif
|
|
||||||
print_dialog.setWindowTitle(tr("Options d'impression", "window title"));
|
|
||||||
print_dialog.setEnabledOptions(QAbstractPrintDialog::PrintShowPageSize);
|
|
||||||
if (print_dialog.exec() == QDialog::Rejected) return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printer_ -> setOutputFormat(QPrinter::PdfFormat);
|
|
||||||
printer_ -> setOutputFileName(filepath_field_ -> text());
|
|
||||||
}
|
|
||||||
|
|
||||||
loadPageSetupForCurrentPrinter();
|
|
||||||
|
|
||||||
//Preview before print
|
|
||||||
#if defined Q_OS_LINUX
|
|
||||||
//Due to some bug with xfwm, we display this dialog has a windows on linux os (X11)
|
|
||||||
//@TODO see if we must this line with graphic server wayland
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO see if we must this line with graphic server wayland")
|
|
||||||
#endif
|
|
||||||
QETPrintPreviewDialog preview_dialog(project_, printer_, parentWidget(), Qt::Window);
|
|
||||||
#else
|
|
||||||
QETPrintPreviewDialog preview_dialog(project_, printer_, parentWidget());
|
|
||||||
#endif
|
|
||||||
connect(
|
|
||||||
&preview_dialog,
|
|
||||||
SIGNAL(paintRequested(const QList<Diagram *> &, bool, const ExportProperties, QPrinter *)),
|
|
||||||
this,
|
|
||||||
SLOT(print(const QList<Diagram *> &, bool, const ExportProperties))
|
|
||||||
);
|
|
||||||
DiagramsChooser *dc = preview_dialog.diagramsChooser();
|
|
||||||
dc -> setSelectedAllDiagrams();
|
|
||||||
if (preview_dialog.exec() == QDialog::Rejected) return;
|
|
||||||
|
|
||||||
savePageSetupForCurrentPrinter();
|
|
||||||
|
|
||||||
// effectue l'impression en elle-meme
|
|
||||||
print(
|
|
||||||
dc -> selectedDiagrams(),
|
|
||||||
preview_dialog.fitDiagramsToPages(),
|
|
||||||
preview_dialog.exportProperties()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@param diagram Schema a imprimer
|
|
||||||
@param options Rendering options
|
|
||||||
@param fullpage true pour utiliser toute la feuille dans le calcul
|
|
||||||
@return Le nombre de pages necessaires pour imprimer le schema
|
|
||||||
avec l'orientation et le format papier utilise dans l'imprimante en cours.
|
|
||||||
*/
|
|
||||||
int DiagramPrintDialog::pagesCount(Diagram *diagram, const ExportProperties &options, bool fullpage) const
|
|
||||||
{
|
|
||||||
return(horizontalPagesCount(diagram, options, fullpage) * verticalPagesCount(diagram, options, fullpage));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@param diagram Schema a imprimer
|
|
||||||
@param options Rendering options
|
|
||||||
@param fullpage true pour utiliser toute la feuille dans le calcul
|
|
||||||
@return La largeur du "poster" en nombre de pages pour imprimer le schema
|
|
||||||
avec l'orientation et le format papier utilise dans l'imprimante en cours.
|
|
||||||
*/
|
|
||||||
int DiagramPrintDialog::horizontalPagesCount(Diagram *diagram, const ExportProperties &options, bool fullpage) const
|
|
||||||
{
|
|
||||||
// note : pageRect et Paper Rect tiennent compte de l'orientation du papier
|
|
||||||
QRect printable_area = fullpage ? printer_ -> paperRect() : printer_ -> pageRect();
|
|
||||||
QRect diagram_rect = diagramRect(diagram, options);
|
|
||||||
|
|
||||||
int h_pages_count = int(ceil(qreal(diagram_rect.width()) / qreal(printable_area.width())));
|
|
||||||
return(h_pages_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@param diagram Schema a imprimer
|
|
||||||
@param options Rendering options
|
|
||||||
@param fullpage true pour utiliser toute la feuille dans le calcul
|
|
||||||
@return La largeur du "poster" en nombre de pages pour imprimer le schema
|
|
||||||
avec l'orientation et le format papier utilise dans l'imprimante en cours.
|
|
||||||
*/
|
|
||||||
int DiagramPrintDialog::verticalPagesCount(Diagram *diagram, const ExportProperties &options, bool fullpage) const
|
|
||||||
{
|
|
||||||
// note : pageRect et Paper Rect tiennent compte de l'orientation du papier
|
|
||||||
QRect printable_area = fullpage ? printer_ -> paperRect() : printer_ -> pageRect();
|
|
||||||
QRect diagram_rect = diagramRect(diagram, options);
|
|
||||||
|
|
||||||
int v_pages_count = int(ceil(qreal(diagram_rect.height()) / qreal(printable_area.height())));
|
|
||||||
return(v_pages_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Construit un dialogue non standard pour demander a l'utilisateur quelle type
|
|
||||||
d'impression il souhaite effectuer : PDF, PS ou imprimante physique
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::buildPrintTypeDialog()
|
|
||||||
{
|
|
||||||
// initialisation des widgets
|
|
||||||
dialog_ = new QDialog(parentWidget());
|
|
||||||
#ifdef Q_OS_MACOS
|
|
||||||
dialog_ -> setWindowFlags(Qt::Sheet);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
printtype_label_ = new QLabel(tr("Quel type d'impression désirez-vous effectuer ?"));
|
|
||||||
printer_icon_ = new QLabel();
|
|
||||||
pdf_icon_ = new QLabel();
|
|
||||||
|
|
||||||
printtype_choice_ = new QButtonGroup();
|
|
||||||
printer_choice_ = new QRadioButton(tr("Impression sur une imprimante physique", "Print type choice"));
|
|
||||||
pdf_choice_ = new QRadioButton(tr("Impression vers un fichier au format PDF", "Print type choice"));
|
|
||||||
|
|
||||||
filepath_field_ = new QLineEdit();
|
|
||||||
browse_button_ = new QPushButton("...");
|
|
||||||
buttons_ = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
|
||||||
|
|
||||||
dialog_ -> setWindowTitle(tr("Choix du type d'impression"));
|
|
||||||
printer_icon_ -> setPixmap(QET::Icons::Printer.pixmap(32, 32));
|
|
||||||
pdf_icon_ -> setPixmap(QET::Icons::PDF.pixmap(32, 32));
|
|
||||||
|
|
||||||
printtype_choice_ -> addButton(printer_choice_);
|
|
||||||
printtype_choice_ -> addButton(pdf_choice_);
|
|
||||||
|
|
||||||
printer_choice_ -> setChecked(true);
|
|
||||||
if (!file_name_.isEmpty()) filepath_field_ -> setText(file_name_ + ".pdf");
|
|
||||||
|
|
||||||
// connexions signaux / slots
|
|
||||||
connect(printer_choice_, SIGNAL(toggled(bool)), this, SLOT(updatePrintTypeDialog()));
|
|
||||||
connect(pdf_choice_, SIGNAL(toggled(bool)), this, SLOT(updatePrintTypeDialog()));
|
|
||||||
connect(browse_button_, SIGNAL(clicked(bool)), this, SLOT(browseFilePrintTypeDialog()));
|
|
||||||
connect(buttons_, SIGNAL(accepted()), this, SLOT(acceptPrintTypeDialog()));
|
|
||||||
connect(buttons_, SIGNAL(rejected()), dialog_, SLOT(reject()));
|
|
||||||
|
|
||||||
// organisation graphique
|
|
||||||
glayout0_ = new QGridLayout();
|
|
||||||
hlayout0_ = new QHBoxLayout();
|
|
||||||
vlayout0_ = new QVBoxLayout();
|
|
||||||
|
|
||||||
hlayout0_ -> addWidget(filepath_field_);
|
|
||||||
hlayout0_ -> addWidget(browse_button_);
|
|
||||||
glayout0_ -> addWidget(printer_icon_, 0, 0);
|
|
||||||
glayout0_ -> addWidget(printer_choice_, 0, 1);
|
|
||||||
glayout0_ -> addWidget(pdf_icon_, 1, 0);
|
|
||||||
glayout0_ -> addWidget(pdf_choice_, 1, 1);
|
|
||||||
glayout0_ -> addLayout(hlayout0_, 3, 1);
|
|
||||||
|
|
||||||
vlayout0_ -> addWidget(printtype_label_);
|
|
||||||
vlayout0_ -> addLayout(glayout0_);
|
|
||||||
vlayout0_ -> addWidget(buttons_);
|
|
||||||
|
|
||||||
dialog_ -> setLayout(vlayout0_);
|
|
||||||
|
|
||||||
updatePrintTypeDialog();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Assure la coherence du dialogue permettant le choix du type d'impression
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::updatePrintTypeDialog()
|
|
||||||
{
|
|
||||||
// imprime-t-on vers un fichier ?
|
|
||||||
bool file_print = !(printer_choice_ -> isChecked());
|
|
||||||
|
|
||||||
// on n'active le champ fichier que pour les impressions vers un fichier
|
|
||||||
filepath_field_ -> setEnabled(file_print);
|
|
||||||
browse_button_ -> setEnabled(file_print);
|
|
||||||
|
|
||||||
// on corrige eventuellement l'extension du fichier deja selectionne
|
|
||||||
if (file_print)
|
|
||||||
{
|
|
||||||
QString filepath = filepath_field_ -> text();
|
|
||||||
if (!filepath.isEmpty())
|
|
||||||
{
|
|
||||||
if (pdf_choice_ -> isChecked() && filepath.endsWith(".ps"))
|
|
||||||
{
|
|
||||||
QRegularExpression re
|
|
||||||
("\\.ps$",
|
|
||||||
QRegularExpression::CaseInsensitiveOption);
|
|
||||||
filepath.replace(re, ".pdf");
|
|
||||||
filepath_field_ -> setText(filepath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Verifie l'etat du dialogue permettant le choix du type d'impression lorsque
|
|
||||||
l'utilisateur le valide.
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::acceptPrintTypeDialog()
|
|
||||||
{
|
|
||||||
bool file_print = !(printer_choice_ -> isChecked());
|
|
||||||
if (file_print) {
|
|
||||||
// un fichier doit avoir ete entre
|
|
||||||
if (filepath_field_ -> text().isEmpty()) {
|
|
||||||
QET::QetMessageBox::information(
|
|
||||||
parentWidget(),
|
|
||||||
tr("Fichier manquant", "message box title"),
|
|
||||||
tr("Vous devez indiquer le chemin du fichier PDF/PS à créer.", "message box content")
|
|
||||||
);
|
|
||||||
} else dialog_ -> accept();
|
|
||||||
} else {
|
|
||||||
#if TODO_LIST
|
|
||||||
#pragma message("@TODO une imprimante doit avoir ete selectionnee")
|
|
||||||
#endif
|
|
||||||
// une imprimante doit avoir ete selectionnee
|
|
||||||
/// @todo
|
|
||||||
dialog_ -> accept();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Permet a l'utilisateur de choisir un fichier
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::browseFilePrintTypeDialog()
|
|
||||||
{
|
|
||||||
QString extension;
|
|
||||||
QString filter;
|
|
||||||
if (printer_choice_ -> isChecked()) return;
|
|
||||||
else if (pdf_choice_ -> isChecked())
|
|
||||||
{
|
|
||||||
extension = ".pdf";
|
|
||||||
filter = tr("Fichiers PDF (*.pdf)", "file filter");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString filepath = QFileDialog::getSaveFileName(
|
|
||||||
parentWidget(),
|
|
||||||
QString(),
|
|
||||||
filepath_field_ -> text(),
|
|
||||||
filter
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!filepath.isEmpty()) {
|
|
||||||
if (!filepath.endsWith(extension)) filepath += extension;
|
|
||||||
filepath = QDir::toNativeSeparators(QDir::cleanPath(filepath));
|
|
||||||
filepath_field_ -> setText(filepath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Effectue l'impression elle-meme
|
|
||||||
@param diagrams Schemas a imprimer
|
|
||||||
@param fit_page Booleen indiquant s'il faut adapter les schemas aux pages
|
|
||||||
ou non
|
|
||||||
@param options Options de rendu
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::print(const QList<Diagram *> &diagrams,
|
|
||||||
bool fit_page,
|
|
||||||
const ExportProperties& options) {
|
|
||||||
//qDebug() << "Demande d'impression de " << diagrams.count() << "schemas.";
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
#ifdef QT_DEBUG
|
|
||||||
qDebug() << "--";
|
|
||||||
qDebug() << "DiagramPrintDialog::print printer_->resolution() before " << printer_->resolution();
|
|
||||||
qDebug() << "DiagramPrintDialog::print screennumber " << QApplication::desktop()->screenNumber();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
QScreen *srn = QApplication::screens().at(QApplication::desktop()->screenNumber());
|
|
||||||
qreal dotsPerInch = (qreal)srn->logicalDotsPerInch();
|
|
||||||
printer_->setResolution(dotsPerInch);
|
|
||||||
|
|
||||||
#ifdef QT_DEBUG
|
|
||||||
qDebug() << "DiagramPrintDialog::print dotsPerInch " << dotsPerInch;
|
|
||||||
qDebug() << "DiagramPrintDialog::print printer_->resolution() after" << printer_->resolution();
|
|
||||||
qDebug() << "--";
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
// QPainter utiliser pour effectuer le rendu
|
|
||||||
QPainter qp(printer_);
|
|
||||||
|
|
||||||
// cas special : il n'y a aucun schema a imprimer
|
|
||||||
if (!diagrams.count()) {
|
|
||||||
qp.end();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// imprime les schemas
|
|
||||||
for (int i = 0 ; i < diagrams.count() ; ++ i) {
|
|
||||||
printDiagram(diagrams[i], fit_page, options, &qp, printer_);
|
|
||||||
if (i != diagrams.count() - 1) {
|
|
||||||
printer_ -> newPage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Imprime un schema
|
|
||||||
@param diagram Schema a imprimer
|
|
||||||
@param fit_page True pour adapter les schemas aux pages, false sinon
|
|
||||||
@param options Options de rendu a appliquer pour l'impression
|
|
||||||
@param qp QPainter a utiliser (deja initialise sur printer)
|
|
||||||
@param printer Imprimante a utiliser
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::printDiagram(Diagram *diagram,
|
|
||||||
bool fit_page,
|
|
||||||
const ExportProperties &options,
|
|
||||||
QPainter *qp,
|
|
||||||
QPrinter *printer) {
|
|
||||||
//qDebug() << printer -> paperSize() << printer -> paperRect() << diagram -> title();
|
|
||||||
// l'imprimante utilise-t-elle toute la feuille ?
|
|
||||||
bool full_page = printer -> fullPage();
|
|
||||||
|
|
||||||
// impression physique (!= fichier PDF)
|
|
||||||
if (printer -> outputFileName().isEmpty()) {
|
|
||||||
// utiliser cette condition pour agir differemment en cas d'impression physique
|
|
||||||
}
|
|
||||||
|
|
||||||
saveReloadDiagramParameters(diagram, options, true);
|
|
||||||
|
|
||||||
// deselectionne tous les elements
|
|
||||||
QList<QGraphicsItem *> selected_elmts = diagram -> selectedItems();
|
|
||||||
foreach (QGraphicsItem *qgi, selected_elmts) qgi -> setSelected(false);
|
|
||||||
|
|
||||||
// enleve le flag focusable de tous les elements concernes pour eviter toute reprise de focus par un champ de texte editable
|
|
||||||
QList<QGraphicsItem *> focusable_items;
|
|
||||||
foreach (QGraphicsItem *qgi, diagram -> items()) {
|
|
||||||
if (qgi -> flags() & QGraphicsItem::ItemIsFocusable) {
|
|
||||||
focusable_items << qgi;
|
|
||||||
qgi -> setFlag(QGraphicsItem::ItemIsFocusable, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// evite toute autre forme d'interaction
|
|
||||||
foreach (QGraphicsView *view, diagram -> views()) {
|
|
||||||
view -> setInteractive(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
QRect diagram_rect = diagramRect(diagram, options);
|
|
||||||
if (fit_page) {
|
|
||||||
// impression adaptee sur une seule page
|
|
||||||
diagram -> render(qp, QRectF(), diagram_rect, Qt::KeepAspectRatio);
|
|
||||||
} else {
|
|
||||||
// impression sur une ou plusieurs pages
|
|
||||||
QRect printed_area = full_page ? printer -> paperRect() : printer -> pageRect();
|
|
||||||
//qDebug() << "impression sur une ou plusieurs pages";
|
|
||||||
//qDebug() << " schema :" << diagram_rect;
|
|
||||||
//qDebug() << " page :" << printed_area;
|
|
||||||
|
|
||||||
int used_width = printed_area.width();
|
|
||||||
int used_height = printed_area.height();
|
|
||||||
int h_pages_count = horizontalPagesCount(diagram, options, full_page);
|
|
||||||
int v_pages_count = verticalPagesCount(diagram, options, full_page);
|
|
||||||
|
|
||||||
QVector< QVector< QRect > > pages_grid;
|
|
||||||
// le schema est imprime sur une matrice de feuilles
|
|
||||||
// parcourt les lignes de la matrice
|
|
||||||
int y_offset = 0;
|
|
||||||
for (int i = 0 ; i < v_pages_count ; ++ i) {
|
|
||||||
pages_grid << QVector< QRect >();
|
|
||||||
|
|
||||||
// parcourt les feuilles de la ligne
|
|
||||||
int x_offset = 0;
|
|
||||||
for (int j = 0 ; j < h_pages_count ; ++ j) {
|
|
||||||
pages_grid.last() << QRect(
|
|
||||||
QPoint(x_offset, y_offset),
|
|
||||||
QSize(
|
|
||||||
qMin(used_width, diagram_rect.width() - x_offset),
|
|
||||||
qMin(used_height, diagram_rect.height() - y_offset)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
x_offset += used_width;
|
|
||||||
}
|
|
||||||
|
|
||||||
y_offset += used_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ne retient que les pages a imprimer
|
|
||||||
QVector<QRect> pages_to_print;
|
|
||||||
for (int i = 0 ; i < v_pages_count ; ++ i) {
|
|
||||||
for (int j = 0 ; j < h_pages_count ; ++ j) {
|
|
||||||
pages_to_print << pages_grid.at(i).at(j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//qDebug() << " " << pages_to_print.count() << " pages a imprimer :";
|
|
||||||
|
|
||||||
// parcourt les pages pour impression
|
|
||||||
for (int i = 0 ; i < pages_to_print.count() ; ++ i) {
|
|
||||||
QRect current_rect(pages_to_print.at(i));
|
|
||||||
//qDebug() << " " << current_rect;
|
|
||||||
diagram -> render(
|
|
||||||
qp,
|
|
||||||
QRect(QPoint(0,0), current_rect.size()),
|
|
||||||
current_rect.translated(diagram_rect.topLeft()),
|
|
||||||
Qt::KeepAspectRatio
|
|
||||||
);
|
|
||||||
if (i != pages_to_print.count() - 1) {
|
|
||||||
printer -> newPage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// remet en place les interactions
|
|
||||||
foreach (QGraphicsView *view, diagram -> views()) {
|
|
||||||
view -> setInteractive(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// restaure les flags focusable
|
|
||||||
foreach (QGraphicsItem *qgi, focusable_items) {
|
|
||||||
qgi -> setFlag(QGraphicsItem::ItemIsFocusable, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// restaure les elements selectionnes
|
|
||||||
foreach (QGraphicsItem *qgi, selected_elmts) qgi -> setSelected(true);
|
|
||||||
|
|
||||||
saveReloadDiagramParameters(diagram, options, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Sauve ou restaure les parametres du schema
|
|
||||||
@param diagram Schema dont on sauve ou restaure les parametres
|
|
||||||
@param options Parametres a appliquer
|
|
||||||
@param save true pour memoriser les parametres du schema et appliquer ceux
|
|
||||||
definis dans options, false pour restaurer les parametres
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::saveReloadDiagramParameters(Diagram *diagram, const ExportProperties& options, bool save) {
|
|
||||||
static ExportProperties state_exportProperties;
|
|
||||||
|
|
||||||
if (save) {
|
|
||||||
// memorise les parametres relatifs au schema tout en appliquant les nouveaux
|
|
||||||
state_exportProperties = diagram -> applyProperties(options);
|
|
||||||
} else {
|
|
||||||
// restaure les parametres relatifs au schema
|
|
||||||
diagram -> applyProperties(state_exportProperties);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Save parameters set in the "page setup" dialog into the QElectroTech
|
|
||||||
configuration. Key/values pairs are associated to the printer for which
|
|
||||||
they have been set.
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::savePageSetupForCurrentPrinter()
|
|
||||||
{
|
|
||||||
QSettings settings;
|
|
||||||
QString printer_section = settingsSectionName(printer_);
|
|
||||||
|
|
||||||
while (!settings.group().isEmpty()) settings.endGroup();
|
|
||||||
settings.beginGroup("printers");
|
|
||||||
settings.beginGroup(printer_section);
|
|
||||||
|
|
||||||
settings.setValue("orientation", printer_ -> orientation() == QPrinter::Portrait ? "portrait" : "landscape");
|
|
||||||
settings.setValue("papersize", int(printer_ -> paperSize()));
|
|
||||||
if (printer_ -> paperSize() == QPrinter::Custom) {
|
|
||||||
QSizeF size = printer_ -> paperSize(QPrinter::Millimeter);
|
|
||||||
settings.setValue("customwidthmm", size.width());
|
|
||||||
settings.setValue("customheightmm", size.height());
|
|
||||||
} else {
|
|
||||||
settings.remove("customwidthmm");
|
|
||||||
settings.remove("customheightmm");
|
|
||||||
}
|
|
||||||
qreal left, top, right, bottom;
|
|
||||||
printer_ -> getPageMargins(&left, &top, &right, &bottom, QPrinter::Millimeter);
|
|
||||||
settings.setValue("marginleft", left);
|
|
||||||
settings.setValue("margintop", top);
|
|
||||||
settings.setValue("marginright", right);
|
|
||||||
settings.setValue("marginbottom", bottom);
|
|
||||||
settings.setValue("fullpage", printer_ -> fullPage() ? "true" : "false");
|
|
||||||
settings.endGroup();
|
|
||||||
settings.endGroup();
|
|
||||||
settings.sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Load parameters previously set in the "page setup" dialog for the current
|
|
||||||
printer, if any.
|
|
||||||
*/
|
|
||||||
void DiagramPrintDialog::loadPageSetupForCurrentPrinter()
|
|
||||||
{
|
|
||||||
QSettings settings;
|
|
||||||
QString printer_section = settingsSectionName(printer_);
|
|
||||||
|
|
||||||
while (!settings.group().isEmpty()) settings.endGroup();
|
|
||||||
settings.beginGroup("printers");
|
|
||||||
if (!settings.childGroups().contains(printer_section)) {
|
|
||||||
settings.endGroup();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
settings.beginGroup(printer_section);
|
|
||||||
if (settings.contains("orientation")) {
|
|
||||||
QString value = settings.value("orientation", "landscape").toString();
|
|
||||||
printer_ -> setOrientation(value == "landscape" ? QPrinter::Landscape : QPrinter::Portrait);
|
|
||||||
}
|
|
||||||
if (settings.contains("papersize")) {
|
|
||||||
int value = settings.value("papersize", QPrinter::A4).toInt();
|
|
||||||
if (value == QPrinter::Custom) {
|
|
||||||
bool w_ok, h_ok;
|
|
||||||
int w = settings.value("customwidthmm", -1).toInt(&w_ok);
|
|
||||||
int h = settings.value("customheightmm", -1).toInt(&h_ok);
|
|
||||||
if (w_ok && h_ok && w != -1 && h != -1) {
|
|
||||||
printer_ -> setPaperSize(QSizeF(w, h), QPrinter::Millimeter);
|
|
||||||
}
|
|
||||||
} else if (value < QPrinter::Custom) {
|
|
||||||
printer_ -> setPaperSize(static_cast<QPrinter::PaperSize>(value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qreal margins[4];
|
|
||||||
printer_ -> getPageMargins(&margins[0], &margins[1], &margins[2], &margins[3], QPrinter::Millimeter);
|
|
||||||
QStringList margins_names(QStringList() << "left" << "top" << "right" << "bottom");
|
|
||||||
for (int i = 0 ; i < 4 ; ++ i) {
|
|
||||||
bool conv_ok;
|
|
||||||
qreal value = settings.value("margin" + margins_names.at(i), -1.0).toReal(&conv_ok);
|
|
||||||
if (conv_ok && value != -1.0) margins[i] = value;
|
|
||||||
}
|
|
||||||
printer_ -> setPageMargins(margins[0], margins[1], margins[2], margins[3], QPrinter::Millimeter);
|
|
||||||
printer_ -> setFullPage(settings.value("fullpage", "false").toString() == "true");
|
|
||||||
|
|
||||||
settings.endGroup();
|
|
||||||
settings.endGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@return a section name for use with QSettings in order to store parameters
|
|
||||||
related to \a printer.
|
|
||||||
*/
|
|
||||||
QString DiagramPrintDialog::settingsSectionName(const QPrinter *printer) {
|
|
||||||
QPrinter::OutputFormat printer_format = printer -> outputFormat();
|
|
||||||
if (printer_format == QPrinter::NativeFormat) {
|
|
||||||
return(printer -> printerName().replace(" ", "_"));
|
|
||||||
} else if (printer_format == QPrinter::PdfFormat) {
|
|
||||||
return("QET_PDF_Printing");
|
|
||||||
}
|
|
||||||
return(QString());
|
|
||||||
}
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2006-2020 The QElectroTech Team
|
|
||||||
This file is part of QElectroTech.
|
|
||||||
|
|
||||||
QElectroTech 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 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#ifndef DIAGRAM_PRINT_DIALOG_H
|
|
||||||
#define DIAGRAM_PRINT_DIALOG_H
|
|
||||||
#include <QtWidgets>
|
|
||||||
|
|
||||||
#include "qetproject.h"
|
|
||||||
#include "diagram.h"
|
|
||||||
#include "exportproperties.h"
|
|
||||||
|
|
||||||
class QPrinter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief The DiagramPrintDialog class
|
|
||||||
This class implements both the dialog allowing users to configure
|
|
||||||
the printing of a project file and the printing itself.
|
|
||||||
*/
|
|
||||||
class DiagramPrintDialog : public QWidget
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
Q_OBJECT
|
|
||||||
// Constructors, destructor
|
|
||||||
public:
|
|
||||||
DiagramPrintDialog(QETProject *, QWidget * = nullptr);
|
|
||||||
~DiagramPrintDialog() override;
|
|
||||||
private:
|
|
||||||
DiagramPrintDialog(const DiagramPrintDialog &);
|
|
||||||
|
|
||||||
// methods
|
|
||||||
public:
|
|
||||||
void setFileName(const QString &);
|
|
||||||
QString fileName() const;
|
|
||||||
void setDocName(const QString &);
|
|
||||||
QString docName() const;
|
|
||||||
QRect diagramRect(Diagram *, const ExportProperties &) const;
|
|
||||||
int pagesCount(Diagram *,
|
|
||||||
const ExportProperties &,
|
|
||||||
bool = false) const;
|
|
||||||
int horizontalPagesCount(Diagram *,
|
|
||||||
const ExportProperties &,
|
|
||||||
bool = false) const;
|
|
||||||
int verticalPagesCount(Diagram *,
|
|
||||||
const ExportProperties &,
|
|
||||||
bool = false) const;
|
|
||||||
void exec();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void buildPrintTypeDialog();
|
|
||||||
void buildDialog();
|
|
||||||
void saveReloadDiagramParameters(Diagram *,
|
|
||||||
const ExportProperties&,
|
|
||||||
bool);
|
|
||||||
void savePageSetupForCurrentPrinter();
|
|
||||||
void loadPageSetupForCurrentPrinter();
|
|
||||||
QString settingsSectionName(const QPrinter *);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void print(const QList<Diagram *> &, bool, const ExportProperties&);
|
|
||||||
void printDiagram(Diagram *,
|
|
||||||
bool,
|
|
||||||
const ExportProperties &,
|
|
||||||
QPainter *,
|
|
||||||
QPrinter * = nullptr);
|
|
||||||
void updatePrintTypeDialog();
|
|
||||||
void acceptPrintTypeDialog();
|
|
||||||
void browseFilePrintTypeDialog();
|
|
||||||
|
|
||||||
// attributes
|
|
||||||
private:
|
|
||||||
QETProject *project_;
|
|
||||||
QPrinter *printer_;
|
|
||||||
QString doc_name_;
|
|
||||||
QString file_name_;
|
|
||||||
|
|
||||||
QDialog *dialog_;
|
|
||||||
QLabel *printtype_label_;
|
|
||||||
QGridLayout *glayout0_;
|
|
||||||
QVBoxLayout *vlayout0_;
|
|
||||||
QHBoxLayout *hlayout0_;
|
|
||||||
QLabel *printer_icon_;
|
|
||||||
QLabel *pdf_icon_;
|
|
||||||
QButtonGroup *printtype_choice_;
|
|
||||||
QRadioButton *printer_choice_;
|
|
||||||
QRadioButton *pdf_choice_;
|
|
||||||
QLineEdit *filepath_field_;
|
|
||||||
QPushButton *browse_button_;
|
|
||||||
QDialogButtonBox *buttons_;
|
|
||||||
QColor backup_diagram_background_color;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
580
sources/print/projectprintwindow.cpp
Normal file
580
sources/print/projectprintwindow.cpp
Normal file
@@ -0,0 +1,580 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2006-2020 The QElectroTech Team
|
||||||
|
This file is part of QElectroTech.
|
||||||
|
|
||||||
|
QElectroTech 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 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "projectprintwindow.h"
|
||||||
|
#include "ui_projectprintwindow.h"
|
||||||
|
|
||||||
|
#include "qetproject.h"
|
||||||
|
#include "diagram.h"
|
||||||
|
#include "qeticons.h"
|
||||||
|
|
||||||
|
#include <QPrintPreviewWidget>
|
||||||
|
#include <QDesktopWidget>
|
||||||
|
#include <QScreen>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QPageSetupDialog>
|
||||||
|
#include <QPrintDialog>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ProjectPrintWindow::ProjectPrintWindow
|
||||||
|
* Use this static function to properly lauch the print dialog.
|
||||||
|
* @param project : project to print
|
||||||
|
* @param parent : parent widget
|
||||||
|
*/
|
||||||
|
void ProjectPrintWindow::launchDialog(QETProject *project, QWidget *parent)
|
||||||
|
{
|
||||||
|
auto dir_path = project->currentDir();
|
||||||
|
auto doc_name = ProjectPrintWindow::docName(project);
|
||||||
|
QString file_name = QDir::toNativeSeparators(QDir::cleanPath(dir_path + "/" + doc_name));
|
||||||
|
if (!file_name.endsWith(".pdf")) {
|
||||||
|
file_name.append(".pdf");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto printer_ = new QPrinter();
|
||||||
|
printer_->setOrientation(QPrinter::Landscape);
|
||||||
|
printer_->setDocName(doc_name);
|
||||||
|
printer_->setOutputFileName(file_name);
|
||||||
|
printer_->setCreator(QString("QElectroTech %1").arg(QET::displayedVersion));
|
||||||
|
|
||||||
|
QPrintDialog print_dialog(printer_, parent);
|
||||||
|
#ifdef Q_OS_MACOS
|
||||||
|
print_dialog.setWindowFlags(Qt::Sheet);
|
||||||
|
#endif
|
||||||
|
print_dialog.setWindowTitle(tr("Options d'impression", "window title"));
|
||||||
|
print_dialog.setEnabledOptions(QAbstractPrintDialog::PrintToFile | QAbstractPrintDialog::PrintShowPageSize);
|
||||||
|
if (print_dialog.exec() == QDialog::Rejected) {
|
||||||
|
delete printer_;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto w = new ProjectPrintWindow(project, printer_, parent);
|
||||||
|
w->showMaximized();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ProjectPrintWindow::docName
|
||||||
|
* @param project
|
||||||
|
* @return the doc name to use for project
|
||||||
|
*/
|
||||||
|
QString ProjectPrintWindow::docName(QETProject *project)
|
||||||
|
{
|
||||||
|
QString doc_name;
|
||||||
|
if (!project->title().isEmpty()) {
|
||||||
|
doc_name = project->title();
|
||||||
|
} else if (!project->filePath().isEmpty()) {
|
||||||
|
doc_name = QFileInfo(project->filePath()).baseName();
|
||||||
|
}
|
||||||
|
|
||||||
|
doc_name = QET::stringToFileName(doc_name);
|
||||||
|
if (doc_name.isEmpty()) {
|
||||||
|
doc_name = tr("projet", "string used to generate a filename");
|
||||||
|
}
|
||||||
|
|
||||||
|
return doc_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ProjectPrintWindow::ProjectPrintWindow
|
||||||
|
* Constructor, don't use this class directly, instead use ProjectPrintWindow::launchDialog static function.
|
||||||
|
* @param project
|
||||||
|
* @param printer : QPrinter to use. Note that ProjectPrintWindow take ownerchip of @printer
|
||||||
|
* @param parent
|
||||||
|
*/
|
||||||
|
ProjectPrintWindow::ProjectPrintWindow(QETProject *project, QPrinter *printer, QWidget *parent) :
|
||||||
|
QMainWindow(parent),
|
||||||
|
ui(new Ui::ProjectPrintWindow),
|
||||||
|
m_project(project),
|
||||||
|
m_printer(printer)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
loadPageSetupForCurrentPrinter();
|
||||||
|
|
||||||
|
m_preview = new QPrintPreviewWidget(m_printer);
|
||||||
|
connect(m_preview, &QPrintPreviewWidget::paintRequested, this, &ProjectPrintWindow::requestPaint);
|
||||||
|
ui->m_vertical_layout->addWidget(m_preview);
|
||||||
|
|
||||||
|
setUpDiagramList();
|
||||||
|
|
||||||
|
auto print_button = new QPushButton(QET::Icons::DocumentPrint, tr("Imprimer"));
|
||||||
|
ui->m_button_box->addButton(print_button, QDialogButtonBox::ActionRole);
|
||||||
|
connect(print_button, &QPushButton::clicked, this, &ProjectPrintWindow::print);
|
||||||
|
|
||||||
|
auto exp = ExportProperties::defaultPrintProperties();
|
||||||
|
ui->m_draw_border_cb->setChecked(exp.draw_border);
|
||||||
|
ui->m_draw_titleblock_cb->setChecked(exp.draw_titleblock);
|
||||||
|
ui->m_draw_terminal_cb->setChecked(exp.draw_terminals);
|
||||||
|
ui->m_keep_conductor_color_cb->setChecked(exp.draw_colored_conductors);
|
||||||
|
|
||||||
|
m_backup_diagram_background_color = Diagram::background_color;
|
||||||
|
Diagram::background_color = Qt::white;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ProjectPrintWindow::~ProjectPrintWindow
|
||||||
|
*/
|
||||||
|
ProjectPrintWindow::~ProjectPrintWindow()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
delete m_printer;
|
||||||
|
Diagram::background_color = m_backup_diagram_background_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ProjectPrintWindow::requestPaint
|
||||||
|
* @param slot called when m_preview emit paintRequested
|
||||||
|
*/
|
||||||
|
void ProjectPrintWindow::requestPaint()
|
||||||
|
{
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
#ifdef QT_DEBUG
|
||||||
|
qDebug() << "--";
|
||||||
|
qDebug() << "DiagramPrintDialog::print printer_->resolution() before " << printer->resolution();
|
||||||
|
qDebug() << "DiagramPrintDialog::print screennumber " << QApplication::desktop()->screenNumber();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QScreen *srn = QApplication::screens().at(QApplication::desktop()->screenNumber());
|
||||||
|
qreal dotsPerInch = (qreal)srn->logicalDotsPerInch();
|
||||||
|
printer->setResolution(dotsPerInch);
|
||||||
|
|
||||||
|
#ifdef QT_DEBUG
|
||||||
|
qDebug() << "DiagramPrintDialog::print dotsPerInch " << dotsPerInch;
|
||||||
|
qDebug() << "DiagramPrintDialog::print printer_->resolution() after" << printer->resolution();
|
||||||
|
qDebug() << "--";
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!m_project->diagrams().count()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool first = true;
|
||||||
|
QPainter painter(m_printer);
|
||||||
|
for (auto diagram : selectedDiagram())
|
||||||
|
{
|
||||||
|
first ? first = false : m_printer->newPage();
|
||||||
|
printDiagram(diagram, ui->m_fit_in_page_cb->isChecked(), &painter, m_printer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ProjectPrintWindow::printDiagram
|
||||||
|
* Print @diagram on the @printer
|
||||||
|
* @param diagram
|
||||||
|
* @param fit_page
|
||||||
|
* @param printer
|
||||||
|
*/
|
||||||
|
void ProjectPrintWindow::printDiagram(Diagram *diagram, bool fit_page, QPainter *painter, QPrinter *printer)
|
||||||
|
{
|
||||||
|
|
||||||
|
////Prepare the print////
|
||||||
|
//Deselect all
|
||||||
|
diagram->deselectAll();
|
||||||
|
//Disable focus flags
|
||||||
|
QList<QGraphicsItem *> focusable_items;
|
||||||
|
for (auto qgi : diagram->items()) {
|
||||||
|
if (qgi->flags() & QGraphicsItem::ItemIsFocusable) {
|
||||||
|
focusable_items << qgi;
|
||||||
|
qgi->setFlag(QGraphicsItem::ItemIsFocusable, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Disable intercation
|
||||||
|
for (auto view : diagram->views()) {
|
||||||
|
view->setInteractive(false);
|
||||||
|
}
|
||||||
|
auto option = exportProperties();
|
||||||
|
saveReloadDiagramParameters(diagram, option, true);
|
||||||
|
////Prepare end////
|
||||||
|
|
||||||
|
|
||||||
|
auto full_page = printer->fullPage();
|
||||||
|
auto diagram_rect = diagramRect(diagram, option);
|
||||||
|
if (fit_page) {
|
||||||
|
diagram->render(painter, QRectF(), diagram_rect, Qt::KeepAspectRatio);
|
||||||
|
} else {
|
||||||
|
//Print on one or several pages
|
||||||
|
auto printed_rect = full_page ? printer->paperRect() : printer->pageRect();
|
||||||
|
|
||||||
|
auto used_width = printed_rect.width();
|
||||||
|
auto used_height = printed_rect.height();
|
||||||
|
auto h_pages_count = horizontalPagesCount(diagram, option, full_page);
|
||||||
|
auto v_pages_count = verticalPagesCount(diagram, option, full_page);
|
||||||
|
|
||||||
|
QVector<QVector<QRect>> page_grid;
|
||||||
|
//The diagram is printed on a matrix of sheet
|
||||||
|
//scrolls through the rows of the matrix
|
||||||
|
auto y_offset = 0;
|
||||||
|
for (auto i=0 ; i<v_pages_count ; ++i)
|
||||||
|
{
|
||||||
|
page_grid << QVector<QRect>();
|
||||||
|
//scrolls through the lines of sheet
|
||||||
|
auto x_offset = 0;
|
||||||
|
for (auto j=0 ; j<h_pages_count ; ++j)
|
||||||
|
{
|
||||||
|
page_grid.last() << QRect(QPoint(x_offset, y_offset),
|
||||||
|
QSize(qMin(used_width, diagram_rect.width() - x_offset),
|
||||||
|
qMin(used_height, diagram_rect.height() - y_offset)));
|
||||||
|
x_offset += used_width;
|
||||||
|
}
|
||||||
|
y_offset += used_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Retains only the pages to be printed
|
||||||
|
QVector<QRect> page_to_print;
|
||||||
|
for (auto i=0 ; i < v_pages_count ; ++i) {
|
||||||
|
for (int j=0 ; j < h_pages_count ; ++j) {
|
||||||
|
page_to_print << page_grid.at(i).at(j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Scrolls through the page for print
|
||||||
|
bool first_ = true;
|
||||||
|
for (auto page : page_to_print)
|
||||||
|
{
|
||||||
|
first_ ? first_ = false : m_printer->newPage();
|
||||||
|
diagram->render(painter, QRect(QPoint(0,0), page.size()), page.translated(diagram_rect.topLeft()), Qt::KeepAspectRatio);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////Print is finished, restore diagram and graphics item properties
|
||||||
|
for (auto view : diagram->views()) {
|
||||||
|
view->setInteractive(true);
|
||||||
|
}
|
||||||
|
for (auto qgi : focusable_items) {
|
||||||
|
qgi->setFlag(QGraphicsItem::ItemIsFocusable, true);
|
||||||
|
}
|
||||||
|
saveReloadDiagramParameters(diagram, option, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ProjectPrintWindow::diagramRect
|
||||||
|
* @param diagram
|
||||||
|
* @param option
|
||||||
|
* @return The rectangle of diagram to be printed
|
||||||
|
*/
|
||||||
|
QRect ProjectPrintWindow::diagramRect(Diagram *diagram, const ExportProperties &option) const
|
||||||
|
{
|
||||||
|
auto diagram_rect = diagram->border_and_titleblock.borderAndTitleBlockRect();
|
||||||
|
if (!option.draw_titleblock) {
|
||||||
|
auto titleblock_height = diagram->border_and_titleblock.titleBlockRect().height();
|
||||||
|
diagram_rect.setHeight(diagram_rect.height() - titleblock_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Adjust the border of diagram to 1px (width of the line)
|
||||||
|
diagram_rect.adjust(0,0,1,1);
|
||||||
|
|
||||||
|
return (diagram_rect.toAlignedRect());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ProjectPrintWindow::horizontalPagesCount
|
||||||
|
* @param diagram : diagram to print
|
||||||
|
* @param option : option used to render
|
||||||
|
* @param full_page : full page or not
|
||||||
|
* @return The width of the "poster" in number of page for print the diagram
|
||||||
|
* with the orientation and the paper format used by the actual printer
|
||||||
|
*/
|
||||||
|
int ProjectPrintWindow::horizontalPagesCount(Diagram *diagram, const ExportProperties &option, bool full_page) const
|
||||||
|
{
|
||||||
|
QRect printable_area = full_page ? m_printer-> paperRect() : m_printer-> pageRect();
|
||||||
|
QRect diagram_rect = diagramRect(diagram, option);
|
||||||
|
|
||||||
|
int h_pages_count = int(ceil(qreal(diagram_rect.width()) / qreal(printable_area.width())));
|
||||||
|
return(h_pages_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ProjectPrintWindow::verticalPagesCount
|
||||||
|
* @param diagram : diagram to print
|
||||||
|
* @param option : option used to render
|
||||||
|
* @param full_page : full page or not
|
||||||
|
* @return The height of the "poster" in number of pages for print the diagram
|
||||||
|
* with the orientation and paper format used by the actual printer
|
||||||
|
*/
|
||||||
|
int ProjectPrintWindow::verticalPagesCount(Diagram *diagram, const ExportProperties &option, bool full_page) const
|
||||||
|
{
|
||||||
|
QRect printable_area = full_page ? m_printer->paperRect() : m_printer->pageRect();
|
||||||
|
QRect diagram_rect = diagramRect(diagram, option);
|
||||||
|
|
||||||
|
int v_pages_count = int(ceil(qreal(diagram_rect.height()) / qreal(printable_area.height())));
|
||||||
|
return(v_pages_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
ExportProperties ProjectPrintWindow::exportProperties() const
|
||||||
|
{
|
||||||
|
ExportProperties exp;
|
||||||
|
exp.draw_border = ui->m_draw_border_cb->isChecked();
|
||||||
|
exp.draw_titleblock = ui->m_draw_titleblock_cb->isChecked();
|
||||||
|
exp.draw_terminals = ui->m_draw_terminal_cb->isChecked();
|
||||||
|
exp.draw_colored_conductors = ui->m_keep_conductor_color_cb->isChecked();
|
||||||
|
exp.draw_grid = false;
|
||||||
|
|
||||||
|
return exp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::setUpDiagramList()
|
||||||
|
{
|
||||||
|
auto layout = new QVBoxLayout();
|
||||||
|
auto widget = new QWidget();
|
||||||
|
widget->setLayout(layout);
|
||||||
|
widget->setMinimumSize(170, 0);
|
||||||
|
widget->setMaximumSize(470, 10000);
|
||||||
|
widget->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
|
||||||
|
ui->m_diagram_list->setWidget(widget);
|
||||||
|
|
||||||
|
for (auto diagram : m_project->diagrams())
|
||||||
|
{
|
||||||
|
auto title = diagram->title();
|
||||||
|
if (title.isEmpty()) {
|
||||||
|
title = tr("Folio sans titre");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto checkbox = new QCheckBox(title);
|
||||||
|
checkbox->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum));
|
||||||
|
checkbox->setChecked(true);
|
||||||
|
layout->addWidget(checkbox, 0, Qt::AlignLeft | Qt::AlignTop);
|
||||||
|
connect(checkbox, &QCheckBox::clicked, m_preview, &QPrintPreviewWidget::updatePreview);
|
||||||
|
m_diagram_list_hash.insert(diagram, checkbox);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ProjectPrintWindow::settingsSectionName(const QPrinter *printer)
|
||||||
|
{
|
||||||
|
QPrinter::OutputFormat printer_format = printer -> outputFormat();
|
||||||
|
if (printer_format == QPrinter::NativeFormat) {
|
||||||
|
return(printer -> printerName().replace(" ", "_"));
|
||||||
|
} else if (printer_format == QPrinter::PdfFormat) {
|
||||||
|
return("QET_PDF_Printing");
|
||||||
|
}
|
||||||
|
return(QString());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::loadPageSetupForCurrentPrinter()
|
||||||
|
{
|
||||||
|
QSettings settings;
|
||||||
|
QString printer_section = settingsSectionName(m_printer);
|
||||||
|
|
||||||
|
while (!settings.group().isEmpty()) settings.endGroup();
|
||||||
|
settings.beginGroup("printers");
|
||||||
|
if (!settings.childGroups().contains(printer_section)) {
|
||||||
|
settings.endGroup();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.beginGroup(printer_section);
|
||||||
|
if (settings.contains("orientation")) {
|
||||||
|
QString value = settings.value("orientation", "landscape").toString();
|
||||||
|
m_printer -> setOrientation(value == "landscape" ? QPrinter::Landscape : QPrinter::Portrait);
|
||||||
|
}
|
||||||
|
if (settings.contains("papersize")) {
|
||||||
|
int value = settings.value("papersize", QPrinter::A4).toInt();
|
||||||
|
if (value == QPrinter::Custom) {
|
||||||
|
bool w_ok, h_ok;
|
||||||
|
int w = settings.value("customwidthmm", -1).toInt(&w_ok);
|
||||||
|
int h = settings.value("customheightmm", -1).toInt(&h_ok);
|
||||||
|
if (w_ok && h_ok && w != -1 && h != -1) {
|
||||||
|
m_printer -> setPaperSize(QSizeF(w, h), QPrinter::Millimeter);
|
||||||
|
}
|
||||||
|
} else if (value < QPrinter::Custom) {
|
||||||
|
m_printer -> setPaperSize(static_cast<QPrinter::PaperSize>(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal margins[4];
|
||||||
|
m_printer -> getPageMargins(&margins[0], &margins[1], &margins[2], &margins[3], QPrinter::Millimeter);
|
||||||
|
QStringList margins_names(QStringList() << "left" << "top" << "right" << "bottom");
|
||||||
|
for (int i = 0 ; i < 4 ; ++ i) {
|
||||||
|
bool conv_ok;
|
||||||
|
qreal value = settings.value("margin" + margins_names.at(i), -1.0).toReal(&conv_ok);
|
||||||
|
if (conv_ok && value != -1.0) margins[i] = value;
|
||||||
|
}
|
||||||
|
m_printer -> setPageMargins(margins[0], margins[1], margins[2], margins[3], QPrinter::Millimeter);
|
||||||
|
m_printer -> setFullPage(settings.value("fullpage", "false").toString() == "true");
|
||||||
|
|
||||||
|
settings.endGroup();
|
||||||
|
settings.endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::savePageSetupForCurrentPrinter()
|
||||||
|
{
|
||||||
|
QSettings settings;
|
||||||
|
QString printer_section = settingsSectionName(m_printer);
|
||||||
|
|
||||||
|
while (!settings.group().isEmpty()) settings.endGroup();
|
||||||
|
settings.beginGroup("printers");
|
||||||
|
settings.beginGroup(printer_section);
|
||||||
|
|
||||||
|
settings.setValue("orientation", m_printer -> orientation() == QPrinter::Portrait ? "portrait" : "landscape");
|
||||||
|
settings.setValue("papersize", int(m_printer -> paperSize()));
|
||||||
|
if (m_printer -> paperSize() == QPrinter::Custom) {
|
||||||
|
QSizeF size = m_printer -> paperSize(QPrinter::Millimeter);
|
||||||
|
settings.setValue("customwidthmm", size.width());
|
||||||
|
settings.setValue("customheightmm", size.height());
|
||||||
|
} else {
|
||||||
|
settings.remove("customwidthmm");
|
||||||
|
settings.remove("customheightmm");
|
||||||
|
}
|
||||||
|
qreal left, top, right, bottom;
|
||||||
|
m_printer->getPageMargins(&left, &top, &right, &bottom, QPrinter::Millimeter);
|
||||||
|
settings.setValue("marginleft", left);
|
||||||
|
settings.setValue("margintop", top);
|
||||||
|
settings.setValue("marginright", right);
|
||||||
|
settings.setValue("marginbottom", bottom);
|
||||||
|
settings.setValue("fullpage", m_printer->fullPage() ? "true" : "false");
|
||||||
|
settings.endGroup();
|
||||||
|
settings.endGroup();
|
||||||
|
settings.sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief ProjectPrintWindow::saveReloadDiagramParameters
|
||||||
|
* Save or restor the parameter of @diagram
|
||||||
|
* @param diagram
|
||||||
|
* @param options
|
||||||
|
* @param save
|
||||||
|
*/
|
||||||
|
void ProjectPrintWindow::saveReloadDiagramParameters(Diagram *diagram, const ExportProperties &options, bool save)
|
||||||
|
{
|
||||||
|
static ExportProperties state_exportProperties;
|
||||||
|
|
||||||
|
if (save) {
|
||||||
|
state_exportProperties = diagram -> applyProperties(options);
|
||||||
|
} else {
|
||||||
|
diagram -> applyProperties(state_exportProperties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<Diagram *> ProjectPrintWindow::selectedDiagram() const
|
||||||
|
{
|
||||||
|
QList<Diagram *> selected_diagram;
|
||||||
|
for (auto diagram : m_project->diagrams()) {
|
||||||
|
auto cb = m_diagram_list_hash[diagram];
|
||||||
|
if (cb && cb->isChecked()) {
|
||||||
|
selected_diagram << diagram;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return selected_diagram;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::exportToPDF()
|
||||||
|
{
|
||||||
|
auto file_name = QFileDialog::getSaveFileName(this);
|
||||||
|
m_printer->setOutputFileName(file_name);
|
||||||
|
m_printer->setOutputFormat(QPrinter::PdfFormat);
|
||||||
|
m_preview->print();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_draw_border_cb_clicked() { m_preview->updatePreview(); }
|
||||||
|
void ProjectPrintWindow::on_m_draw_titleblock_cb_clicked() { m_preview->updatePreview(); }
|
||||||
|
void ProjectPrintWindow::on_m_keep_conductor_color_cb_clicked() { m_preview->updatePreview(); }
|
||||||
|
void ProjectPrintWindow::on_m_draw_terminal_cb_clicked() { m_preview->updatePreview(); }
|
||||||
|
void ProjectPrintWindow::on_m_fit_in_page_cb_clicked() { m_preview->updatePreview(); }
|
||||||
|
void ProjectPrintWindow::on_m_use_full_page_cb_clicked()
|
||||||
|
{
|
||||||
|
m_printer->setFullPage(ui->m_use_full_page_cb->isChecked());
|
||||||
|
m_preview->updatePreview();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_zoom_out_action_triggered() {
|
||||||
|
m_preview->zoomOut(4.0/3.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_zoom_in_action_triggered() {
|
||||||
|
m_preview->zoomIn(4.0/3.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_adjust_width_action_triggered() {
|
||||||
|
m_preview->fitToWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_adjust_page_action_triggered() {
|
||||||
|
m_preview->fitInView();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_landscape_action_triggered() {
|
||||||
|
m_preview->setLandscapeOrientation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_portrait_action_triggered() {
|
||||||
|
m_preview->setPortraitOrientation();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_first_page_action_triggered() {
|
||||||
|
m_preview->setCurrentPage(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_previous_page_action_triggered()
|
||||||
|
{
|
||||||
|
auto previous_page = m_preview->currentPage() - 1;
|
||||||
|
m_preview->setCurrentPage(std::max(previous_page, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_next_page_action_triggered()
|
||||||
|
{
|
||||||
|
auto next_page = m_preview->currentPage() + 1;
|
||||||
|
m_preview->setCurrentPage(std::min(next_page, m_preview->pageCount()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_last_page_action_triggered() {
|
||||||
|
m_preview->setCurrentPage(m_preview->pageCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_display_single_page_action_triggered() {
|
||||||
|
m_preview->setSinglePageViewMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_display_two_page_action_triggered() {
|
||||||
|
m_preview->setFacingPagesViewMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_display_all_page_action_triggered() {
|
||||||
|
m_preview->setAllPagesViewMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_page_setup_triggered()
|
||||||
|
{
|
||||||
|
QPageSetupDialog d(m_printer, this);
|
||||||
|
if (d.exec() == QDialog::Accepted) {
|
||||||
|
m_preview->updatePreview();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_check_all_pb_clicked()
|
||||||
|
{
|
||||||
|
for (auto cb : m_diagram_list_hash.values()) {
|
||||||
|
cb->setChecked(true);
|
||||||
|
}
|
||||||
|
m_preview->updatePreview();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::on_m_uncheck_all_clicked()
|
||||||
|
{
|
||||||
|
for (auto cb : m_diagram_list_hash.values()) {
|
||||||
|
cb->setChecked(false);
|
||||||
|
}
|
||||||
|
m_preview->updatePreview();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectPrintWindow::print()
|
||||||
|
{
|
||||||
|
m_preview->print();
|
||||||
|
savePageSetupForCurrentPrinter();
|
||||||
|
this->close();
|
||||||
|
}
|
||||||
101
sources/print/projectprintwindow.h
Normal file
101
sources/print/projectprintwindow.h
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2006-2020 The QElectroTech Team
|
||||||
|
This file is part of QElectroTech.
|
||||||
|
|
||||||
|
QElectroTech 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 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef PROJECTPRINTWINDOW_H
|
||||||
|
#define PROJECTPRINTWINDOW_H
|
||||||
|
|
||||||
|
#include <QMainWindow>
|
||||||
|
|
||||||
|
#include "exportproperties.h"
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class ProjectPrintWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
class QETProject;
|
||||||
|
class QPrintPreviewWidget;
|
||||||
|
class QPrinter;
|
||||||
|
class ExportProperties;
|
||||||
|
class Diagram;
|
||||||
|
class QCheckBox;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The ProjectPrintWindow class
|
||||||
|
* Windows used to configur and view diagram befor print
|
||||||
|
*/
|
||||||
|
class ProjectPrintWindow : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void launchDialog(QETProject *project, QWidget *parent = nullptr);
|
||||||
|
static QString docName(QETProject *project);
|
||||||
|
|
||||||
|
explicit ProjectPrintWindow(QETProject *project, QPrinter *printer, QWidget *parent = nullptr);
|
||||||
|
~ProjectPrintWindow();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_m_draw_border_cb_clicked();
|
||||||
|
void on_m_draw_titleblock_cb_clicked();
|
||||||
|
void on_m_keep_conductor_color_cb_clicked();
|
||||||
|
void on_m_draw_terminal_cb_clicked();
|
||||||
|
void on_m_fit_in_page_cb_clicked();
|
||||||
|
void on_m_use_full_page_cb_clicked();
|
||||||
|
void on_m_zoom_out_action_triggered();
|
||||||
|
void on_m_zoom_in_action_triggered();
|
||||||
|
void on_m_adjust_width_action_triggered();
|
||||||
|
void on_m_adjust_page_action_triggered();
|
||||||
|
void on_m_landscape_action_triggered();
|
||||||
|
void on_m_portrait_action_triggered();
|
||||||
|
void on_m_first_page_action_triggered();
|
||||||
|
void on_m_previous_page_action_triggered();
|
||||||
|
void on_m_next_page_action_triggered();
|
||||||
|
void on_m_last_page_action_triggered();
|
||||||
|
void on_m_display_single_page_action_triggered();
|
||||||
|
void on_m_display_two_page_action_triggered();
|
||||||
|
void on_m_display_all_page_action_triggered();
|
||||||
|
void on_m_page_setup_triggered();
|
||||||
|
void on_m_check_all_pb_clicked();
|
||||||
|
void on_m_uncheck_all_clicked();
|
||||||
|
void print();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void requestPaint();
|
||||||
|
void printDiagram(Diagram *diagram, bool fit_page, QPainter *painter, QPrinter *printer);
|
||||||
|
QRect diagramRect(Diagram *diagram, const ExportProperties &option) const;
|
||||||
|
int horizontalPagesCount(Diagram *diagram, const ExportProperties &option, bool full_page) const;
|
||||||
|
int verticalPagesCount(Diagram *diagram, const ExportProperties &option, bool full_page) const;
|
||||||
|
ExportProperties exportProperties() const;
|
||||||
|
void setUpDiagramList();
|
||||||
|
QString settingsSectionName(const QPrinter *printer);
|
||||||
|
void loadPageSetupForCurrentPrinter();
|
||||||
|
void savePageSetupForCurrentPrinter();
|
||||||
|
void saveReloadDiagramParameters(Diagram *diagram, const ExportProperties &options, bool save);
|
||||||
|
QList<Diagram *> selectedDiagram() const;
|
||||||
|
void exportToPDF();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::ProjectPrintWindow *ui;
|
||||||
|
QETProject *m_project = nullptr;
|
||||||
|
QPrinter *m_printer = nullptr;
|
||||||
|
QPrintPreviewWidget *m_preview=nullptr;
|
||||||
|
QColor m_backup_diagram_background_color;
|
||||||
|
QHash<Diagram *, QCheckBox *> m_diagram_list_hash;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PROJECTPRINTWINDOW_H
|
||||||
367
sources/print/projectprintwindow.ui
Normal file
367
sources/print/projectprintwindow.ui
Normal file
@@ -0,0 +1,367 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>ProjectPrintWindow</class>
|
||||||
|
<widget class="QMainWindow" name="ProjectPrintWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>956</width>
|
||||||
|
<height>506</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>MainWindow</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="centralwidget">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="m_vertical_layout">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Folios à imprimer :</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QScrollArea" name="m_diagram_list">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="lineWidth">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="midLineWidth">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="widgetResizable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>932</width>
|
||||||
|
<height>60</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="m_check_all_pb">
|
||||||
|
<property name="text">
|
||||||
|
<string>Tout cocher</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="m_uncheck_all">
|
||||||
|
<property name="text">
|
||||||
|
<string>Tout décoher</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>Option de rendu</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="m_draw_border_cb">
|
||||||
|
<property name="text">
|
||||||
|
<string>Dessiner le cadre</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="m_draw_titleblock_cb">
|
||||||
|
<property name="text">
|
||||||
|
<string>Dessiner le cartouche</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="m_keep_conductor_color_cb">
|
||||||
|
<property name="text">
|
||||||
|
<string>Conserver les couleurs des conducteurs</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="m_draw_terminal_cb">
|
||||||
|
<property name="text">
|
||||||
|
<string>Dessiner les bornes</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_2">
|
||||||
|
<property name="title">
|
||||||
|
<string>Option d'impression</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QCheckBox" name="m_fit_in_page_cb">
|
||||||
|
<property name="text">
|
||||||
|
<string>Adapter le folio à la page</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="m_use_full_page_cb">
|
||||||
|
<property name="text">
|
||||||
|
<string>Utiliser toute la feuille</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Si cette option est cochée, le folio sera agrandi ou rétréci de façon à remplir toute la surface imprimable d'une et une seule page."</string>
|
||||||
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Si cette option est cochée, les marges de la feuille seront ignorées et toute sa surface sera utilisée pour l'impression. Cela peut ne pas être supporté par votre imprimante.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="openExternalLinks">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
|
<widget class="Line" name="line">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="m_button_box">
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Cancel</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QToolBar" name="toolBar">
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>toolBar</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="toolBarArea">
|
||||||
|
<enum>TopToolBarArea</enum>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="toolBarBreak">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<addaction name="m_adjust_width_action"/>
|
||||||
|
<addaction name="m_adjust_page_action"/>
|
||||||
|
<addaction name="m_zoom_out_action"/>
|
||||||
|
<addaction name="m_zoom_in_action"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
|
<addaction name="m_landscape_action"/>
|
||||||
|
<addaction name="m_portrait_action"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
|
<addaction name="m_first_page_action"/>
|
||||||
|
<addaction name="m_previous_page_action"/>
|
||||||
|
<addaction name="m_next_page_action"/>
|
||||||
|
<addaction name="m_last_page_action"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
|
<addaction name="m_display_single_page_action"/>
|
||||||
|
<addaction name="m_display_two_page_action"/>
|
||||||
|
<addaction name="m_display_all_page_action"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
|
<addaction name="m_page_setup"/>
|
||||||
|
</widget>
|
||||||
|
<action name="m_adjust_width_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/22x22/view_fit_width.png</normaloff>:/ico/22x22/view_fit_width.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Ajuster la largeur</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_adjust_page_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/22x22/view-fit-window.png</normaloff>:/ico/22x22/view-fit-window.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Ajuster la page</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_zoom_out_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/16x16/zoom-out.png</normaloff>:/ico/16x16/zoom-out.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Zoom arrière</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_zoom_in_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/16x16/zoom-in.png</normaloff>:/ico/16x16/zoom-in.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Zoom avant</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_landscape_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/22x22/landscape.png</normaloff>:/ico/22x22/landscape.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Paysage</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_portrait_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/22x22/portrait.png</normaloff>:/ico/22x22/portrait.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Portrait</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_first_page_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/16x16/arrow-left-double.png</normaloff>:/ico/16x16/arrow-left-double.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Première page</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_previous_page_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/16x16/arrow-left.png</normaloff>:/ico/16x16/arrow-left.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Page précédente</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_next_page_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/16x16/arrow-right.png</normaloff>:/ico/16x16/arrow-right.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Page suivante</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_last_page_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/22x22/arrow-right-double.png</normaloff>:/ico/22x22/arrow-right-double.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Dernière page</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_display_single_page_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/22x22/single_page.png</normaloff>:/ico/22x22/single_page.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Affichier une seul page</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_display_two_page_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/22x22/two_pages.png</normaloff>:/ico/22x22/two_pages.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Afficher deux pages</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_display_all_page_action">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/22x22/all_pages.png</normaloff>:/ico/22x22/all_pages.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Afficher un aperçu de toutes les pages</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="m_page_setup">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../qelectrotech.qrc">
|
||||||
|
<normaloff>:/ico/48x48/document-print-frame.png</normaloff>:/ico/48x48/document-print-frame.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>mise en page</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
</widget>
|
||||||
|
<resources>
|
||||||
|
<include location="../../qelectrotech.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>m_button_box</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>ProjectPrintWindow</receiver>
|
||||||
|
<slot>close()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>477</x>
|
||||||
|
<y>484</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>477</x>
|
||||||
|
<y>252</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
||||||
@@ -19,7 +19,6 @@
|
|||||||
#include "qetproject.h"
|
#include "qetproject.h"
|
||||||
#include "diagramview.h"
|
#include "diagramview.h"
|
||||||
#include "diagram.h"
|
#include "diagram.h"
|
||||||
#include "diagramprintdialog.h"
|
|
||||||
#include "exportdialog.h"
|
#include "exportdialog.h"
|
||||||
#include "qetapp.h"
|
#include "qetapp.h"
|
||||||
#include "qetelementeditor.h"
|
#include "qetelementeditor.h"
|
||||||
@@ -522,7 +521,7 @@ void ProjectView::moveDiagramUpTop(DiagramView *diagram_view)
|
|||||||
// le schema est le premier du projet
|
// le schema est le premier du projet
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_tab -> tabBar() -> moveTab(diagram_view_position, (diagram_views().size(), 0));
|
m_tab->tabBar()->moveTab(diagram_view_position, diagram_views().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -575,38 +574,6 @@ void ProjectView::moveDiagramDownx10(Diagram *diagram) {
|
|||||||
moveDiagramDownx10(findDiagram(diagram));
|
moveDiagramDownx10(findDiagram(diagram));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Ce slot demarre un dialogue permettant a l'utilisateur de parametrer et de
|
|
||||||
lancer l'impression de toute ou partie du projet.
|
|
||||||
*/
|
|
||||||
void ProjectView::printProject()
|
|
||||||
{
|
|
||||||
if (!m_project) return;
|
|
||||||
|
|
||||||
// transforme le titre du projet en nom utilisable pour le document
|
|
||||||
QString doc_name;
|
|
||||||
if (!(m_project -> title().isEmpty())) {
|
|
||||||
doc_name = m_project -> title();
|
|
||||||
} else if (!m_project -> filePath().isEmpty()) {
|
|
||||||
doc_name = QFileInfo(m_project -> filePath()).baseName();
|
|
||||||
}
|
|
||||||
doc_name = QET::stringToFileName(doc_name);
|
|
||||||
if (doc_name.isEmpty()) {
|
|
||||||
doc_name = tr("projet", "string used to generate a filename");
|
|
||||||
}
|
|
||||||
|
|
||||||
// recupere le dossier contenant le fichier courant
|
|
||||||
QString dir_path = m_project -> currentDir();
|
|
||||||
|
|
||||||
// determine un chemin pour le pdf / ps
|
|
||||||
QString file_name = QDir::toNativeSeparators(QDir::cleanPath(dir_path + "/" + doc_name));
|
|
||||||
|
|
||||||
DiagramPrintDialog print_dialog(m_project, this);
|
|
||||||
print_dialog.setDocName(doc_name);
|
|
||||||
print_dialog.setFileName(file_name);
|
|
||||||
print_dialog.exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Exporte le schema.
|
Exporte le schema.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -117,7 +117,6 @@ class ProjectView : public QWidget
|
|||||||
void moveDiagramUpx10(Diagram *);
|
void moveDiagramUpx10(Diagram *);
|
||||||
void moveDiagramDownx10(DiagramView *);
|
void moveDiagramDownx10(DiagramView *);
|
||||||
void moveDiagramDownx10(Diagram *);
|
void moveDiagramDownx10(Diagram *);
|
||||||
void printProject();
|
|
||||||
void exportProject();
|
void exportProject();
|
||||||
QETResult save();
|
QETResult save();
|
||||||
QETResult saveAs();
|
QETResult saveAs();
|
||||||
|
|||||||
@@ -39,6 +39,7 @@
|
|||||||
#include "bomexportdialog.h"
|
#include "bomexportdialog.h"
|
||||||
#include "QWidgetAnimation/qwidgetanimation.h"
|
#include "QWidgetAnimation/qwidgetanimation.h"
|
||||||
#include "qetgraphicstablefactory.h"
|
#include "qetgraphicstablefactory.h"
|
||||||
|
#include "projectprintwindow.h"
|
||||||
|
|
||||||
#include <KAutoSaveFile>
|
#include <KAutoSaveFile>
|
||||||
|
|
||||||
@@ -269,9 +270,9 @@ void QETDiagramEditor::setUpActions()
|
|||||||
m_print->setShortcut(QKeySequence(QKeySequence::Print));
|
m_print->setShortcut(QKeySequence(QKeySequence::Print));
|
||||||
m_print->setStatusTip(tr("Imprime un ou plusieurs folios du projet courant", "status bar tip"));
|
m_print->setStatusTip(tr("Imprime un ou plusieurs folios du projet courant", "status bar tip"));
|
||||||
connect(m_print, &QAction::triggered, [this]() {
|
connect(m_print, &QAction::triggered, [this]() {
|
||||||
ProjectView *current_project = currentProjectView();
|
auto project = currentProject();
|
||||||
if (current_project) {
|
if (project) {
|
||||||
current_project -> printProject();
|
ProjectPrintWindow::launchDialog(project, this);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,453 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2006-2020 The QElectroTech Team
|
|
||||||
This file is part of QElectroTech.
|
|
||||||
|
|
||||||
QElectroTech 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 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#include "qetprintpreviewdialog.h"
|
|
||||||
#include "diagramschooser.h"
|
|
||||||
#include "exportproperties.h"
|
|
||||||
#include "exportpropertieswidget.h"
|
|
||||||
#include "qeticons.h"
|
|
||||||
|
|
||||||
#include <QPrintPreviewWidget>
|
|
||||||
#include <QPageSetupDialog>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
/**
|
|
||||||
Constructeur
|
|
||||||
@param project Projet a imprimer
|
|
||||||
@param printer Imprimante a utiliser pour
|
|
||||||
@param widget Widget parent
|
|
||||||
@param f Flags passes au constructeur de QDialog puis QWidget
|
|
||||||
*/
|
|
||||||
QETPrintPreviewDialog::QETPrintPreviewDialog(
|
|
||||||
QETProject *project,
|
|
||||||
QPrinter *printer,
|
|
||||||
QWidget *widget,
|
|
||||||
Qt::WindowFlags f) :
|
|
||||||
QDialog(widget, f),
|
|
||||||
project_(project),
|
|
||||||
printer_(printer)
|
|
||||||
{
|
|
||||||
setWindowTitle(tr("QElectroTech : Aperçu avant impression"));
|
|
||||||
build();
|
|
||||||
|
|
||||||
connect(preview_, SIGNAL(paintRequested(QPrinter *)),
|
|
||||||
this, SLOT(requestPaint(QPrinter *)));
|
|
||||||
connect(diagrams_list_, SIGNAL(selectionChanged()),
|
|
||||||
preview_, SLOT(updatePreview()));
|
|
||||||
connect(diagrams_list_, SIGNAL(selectionChanged()),
|
|
||||||
this, SLOT(checkDiagramsCount()));
|
|
||||||
|
|
||||||
setWindowState(windowState() | Qt::WindowMaximized);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Destructeur
|
|
||||||
*/
|
|
||||||
QETPrintPreviewDialog::~QETPrintPreviewDialog()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@return le widget permettant de choisir les schemas a imprimer.
|
|
||||||
*/
|
|
||||||
DiagramsChooser *QETPrintPreviewDialog::diagramsChooser()
|
|
||||||
{
|
|
||||||
return(diagrams_list_);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@return true si l'option "Adapter le schema a la page" est activee
|
|
||||||
*/
|
|
||||||
bool QETPrintPreviewDialog::fitDiagramsToPages() const
|
|
||||||
{
|
|
||||||
return(fit_diagram_to_page_ -> isChecked());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@return les options de rendu definies par l'utilisateur
|
|
||||||
*/
|
|
||||||
ExportProperties QETPrintPreviewDialog::exportProperties() const
|
|
||||||
{
|
|
||||||
return(render_properties_ -> exportProperties());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Passe a la premiere page
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::firstPage()
|
|
||||||
{
|
|
||||||
preview_ -> setCurrentPage(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Passe a la page precedente
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::previousPage()
|
|
||||||
{
|
|
||||||
int preview_previous_page = preview_ -> currentPage() - 1;
|
|
||||||
preview_ -> setCurrentPage(qMax(preview_previous_page, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Passe a la page suivante
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::nextPage()
|
|
||||||
{
|
|
||||||
int preview_next_page = preview_ -> currentPage() + 1;
|
|
||||||
preview_ -> setCurrentPage(qMin(preview_next_page,
|
|
||||||
preview_ -> pageCount()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Passe a la derniere page
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::lastPage()
|
|
||||||
{
|
|
||||||
preview_ -> setCurrentPage(preview_ -> pageCount());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Copnfigure la mise en page
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::pageSetup()
|
|
||||||
{
|
|
||||||
QPageSetupDialog page_setup_dialog(printer_, this);
|
|
||||||
if (page_setup_dialog.exec() == QDialog::Accepted) {
|
|
||||||
preview_ -> updatePreview();
|
|
||||||
updateZoomList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Utilise ou non toute la page sans teni compte des marges
|
|
||||||
@param full_page true pour utiliser toute la page, false sinon
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::useFullPage(bool full_page) {
|
|
||||||
printer_ -> setFullPage(full_page);
|
|
||||||
preview_ -> updatePreview();
|
|
||||||
updateZoomList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Fait tenir ou non chaque schema sur une page
|
|
||||||
@param fit_diagram true pour adapter chaque schema sur une page,
|
|
||||||
false sinon
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::fitDiagramToPage(bool fit_diagram) {
|
|
||||||
Q_UNUSED(fit_diagram);
|
|
||||||
preview_ -> updatePreview();
|
|
||||||
updateZoomList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Effectue l'action "zoom avant" sur l'apercu avant impression
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::zoomIn()
|
|
||||||
{
|
|
||||||
preview_ -> zoomIn(4.0/3.0);
|
|
||||||
updateZoomList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Effectue l'action "zoom arriere" sur l'apercu avant impression
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::zoomOut()
|
|
||||||
{
|
|
||||||
preview_ -> zoomOut(4.0/3.0);
|
|
||||||
updateZoomList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Selectionne tous les schemas
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::selectAllDiagrams()
|
|
||||||
{
|
|
||||||
diagrams_list_ -> setSelectedAllDiagrams(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Deselectionne tous les schemas
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::selectNoDiagram()
|
|
||||||
{
|
|
||||||
diagrams_list_ -> setSelectedAllDiagrams(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Met en place le dialogue
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::build()
|
|
||||||
{
|
|
||||||
preview_ = new QPrintPreviewWidget(printer_);
|
|
||||||
diagrams_label_ = new QLabel(tr("Folios à imprimer :"));
|
|
||||||
diagrams_list_ = new DiagramsChooser(project_);
|
|
||||||
diagrams_select_all_ = new QPushButton(tr("Tout cocher"));
|
|
||||||
diagrams_select_none_ = new QPushButton(tr("Tout décocher"));
|
|
||||||
toggle_diagrams_list_ = new QAction(QET::Icons::Diagram, tr("Cacher la liste des folios"), this);
|
|
||||||
toggle_print_options_ = new QAction(QET::Icons::Configure, tr("Cacher les options d'impression"), this);
|
|
||||||
adjust_width_ = new QAction(QET::Icons::ViewFitWidth, tr("Ajuster la largeur"), this);
|
|
||||||
adjust_page_ = new QAction(QET::Icons::ViewFitWindow, tr("Ajuster la page"), this);
|
|
||||||
zoom_out_ = new QAction(QET::Icons::ZoomOut, tr("Zoom arrière"), this);
|
|
||||||
zoom_box_ = new QComboBox(this);
|
|
||||||
zoom_in_ = new QAction(QET::Icons::ZoomIn, tr("Zoom avant"), this);
|
|
||||||
landscape_ = new QAction(QET::Icons::PrintLandscape, tr("Paysage"), this);
|
|
||||||
portrait_ = new QAction(QET::Icons::PrintPortrait, tr("Portrait"), this);
|
|
||||||
first_page_ = new QAction(QET::Icons::ArrowLeftDouble, tr("Première page"), this);
|
|
||||||
previous_page_ = new QAction(QET::Icons::ArrowLeft, tr("Page précédente"), this);
|
|
||||||
next_page_ = new QAction(QET::Icons::ArrowRight, tr("Page suivante"), this);
|
|
||||||
last_page_ = new QAction(QET::Icons::ArrowRightDouble, tr("Dernière page"), this);
|
|
||||||
single_page_view_ = new QAction(QET::Icons::SinglePage, tr("Afficher une seule page"), this);
|
|
||||||
facing_pages_view_ = new QAction(QET::Icons::PrintTwoPages, tr("Afficher deux pages"), this);
|
|
||||||
all_pages_view_ = new QAction(QET::Icons::PrintAllPages, tr("Afficher un aperçu de toutes les pages"), this);
|
|
||||||
page_setup_ = new QAction(QET::Icons::DocumentPrintFrame, tr("Mise en page"), this);
|
|
||||||
|
|
||||||
toggle_diagrams_list_ -> setCheckable(true);
|
|
||||||
toggle_diagrams_list_ -> setChecked(true);
|
|
||||||
toggle_print_options_ -> setCheckable(true);
|
|
||||||
toggle_print_options_ -> setChecked(true);
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN32
|
|
||||||
/*
|
|
||||||
Sous Windows, le QPageSetupDialog utilise le dialogue natif ; ce
|
|
||||||
dernier ne peut gerer que les imprimantes physiques ("native
|
|
||||||
printers" ).
|
|
||||||
cf avertissement : QAbstractPageSetupDialog::QAbstractPageSetupDialog:
|
|
||||||
Page setup dialog cannot be used on non-native printers
|
|
||||||
*/
|
|
||||||
if (!(printer_ -> outputFileName().isEmpty())) {
|
|
||||||
page_setup_ -> setEnabled(false);
|
|
||||||
page_setup_ -> setText(tr("Mise en page (non disponible sous Windows pour l'impression PDF/PS)"));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
toolbar_ = new QToolBar();
|
|
||||||
toolbar_ -> addAction(toggle_diagrams_list_);
|
|
||||||
toolbar_ -> addAction(toggle_print_options_);
|
|
||||||
toolbar_ -> addSeparator();
|
|
||||||
toolbar_ -> addAction(adjust_width_);
|
|
||||||
toolbar_ -> addAction(adjust_page_);
|
|
||||||
toolbar_ -> addAction(zoom_out_);
|
|
||||||
toolbar_ -> addWidget(zoom_box_);
|
|
||||||
toolbar_ -> addAction(zoom_in_);
|
|
||||||
toolbar_ -> addSeparator();
|
|
||||||
toolbar_ -> addAction(landscape_);
|
|
||||||
toolbar_ -> addAction(portrait_);
|
|
||||||
toolbar_ -> addSeparator();
|
|
||||||
toolbar_ -> addAction(first_page_);
|
|
||||||
toolbar_ -> addAction(previous_page_);
|
|
||||||
toolbar_ -> addAction(next_page_);
|
|
||||||
toolbar_ -> addAction(last_page_);
|
|
||||||
toolbar_ -> addSeparator();
|
|
||||||
toolbar_ -> addAction(single_page_view_);
|
|
||||||
toolbar_ -> addAction(facing_pages_view_);
|
|
||||||
toolbar_ -> addAction(all_pages_view_);
|
|
||||||
toolbar_ -> addSeparator();
|
|
||||||
toolbar_ -> addAction(page_setup_);
|
|
||||||
|
|
||||||
print_options_box_= new QGroupBox(tr("Options d'impression"));
|
|
||||||
use_full_page_ = new QCheckBox(tr("Utiliser toute la feuille"));
|
|
||||||
use_full_page_ -> setChecked(printer_ -> fullPage());
|
|
||||||
use_full_page_label_ = new QLabel(tr(
|
|
||||||
"Si cette option est cochée, les marges de la feuille seront "
|
|
||||||
"ignorées et toute sa surface sera utilisée pour l'impression. "
|
|
||||||
"Cela peut ne pas être supporté par votre imprimante."
|
|
||||||
));
|
|
||||||
use_full_page_label_ -> setWordWrap(true);
|
|
||||||
use_full_page_label_ -> setContentsMargins(20, 0, 0, 0);
|
|
||||||
fit_diagram_to_page_ = new QCheckBox(tr("Adapter le folio à la page"));
|
|
||||||
fit_diagram_to_page_label_ = new QLabel(tr(
|
|
||||||
"Si cette option est cochée, le folio sera agrandi ou "
|
|
||||||
"rétréci de façon à remplir toute la surface imprimable "
|
|
||||||
"d'une et une seule page."
|
|
||||||
));
|
|
||||||
fit_diagram_to_page_label_ -> setWordWrap(true);
|
|
||||||
fit_diagram_to_page_label_ -> setContentsMargins(20, 0, 0, 0);
|
|
||||||
fit_diagram_to_page_ -> setChecked(true);
|
|
||||||
|
|
||||||
// recupere les parametres d'export definis dans la configuration de l'application
|
|
||||||
ExportProperties default_print_properties = ExportProperties::defaultPrintProperties();
|
|
||||||
|
|
||||||
render_properties_ = new ExportPropertiesWidget(default_print_properties);
|
|
||||||
render_properties_ -> setPrintingMode(true);
|
|
||||||
|
|
||||||
buttons_ = new QDialogButtonBox();
|
|
||||||
buttons_ -> addButton(new QPushButton(QET::Icons::DocumentPrint, tr("Imprimer")), QDialogButtonBox::AcceptRole);
|
|
||||||
buttons_ -> addButton(QDialogButtonBox::Cancel);
|
|
||||||
|
|
||||||
connect(diagrams_select_all_, SIGNAL(released()), this, SLOT(selectAllDiagrams()));
|
|
||||||
connect(diagrams_select_none_, SIGNAL(released()), this, SLOT(selectNoDiagram()));
|
|
||||||
connect(toggle_diagrams_list_, SIGNAL(toggled(bool)), this, SLOT(setDiagramsListVisible(bool)));
|
|
||||||
connect(toggle_print_options_, SIGNAL(toggled(bool)), this, SLOT(setPrintOptionsVisible(bool)));
|
|
||||||
connect(adjust_width_, SIGNAL(triggered()), preview_, SLOT(fitToWidth()));
|
|
||||||
connect(adjust_page_, SIGNAL(triggered()), preview_, SLOT(fitInView()));
|
|
||||||
connect(zoom_out_, SIGNAL(triggered()), this, SLOT(zoomOut()));
|
|
||||||
connect(zoom_in_, SIGNAL(triggered()), this, SLOT(zoomIn()));
|
|
||||||
connect(landscape_, SIGNAL(triggered()), preview_, SLOT(setLandscapeOrientation()));
|
|
||||||
connect(portrait_, SIGNAL(triggered()), preview_, SLOT(setPortraitOrientation()));
|
|
||||||
connect(first_page_, SIGNAL(triggered()), this, SLOT(firstPage()));
|
|
||||||
connect(previous_page_, SIGNAL(triggered()), this, SLOT(previousPage()));
|
|
||||||
connect(next_page_, SIGNAL(triggered()), this, SLOT(nextPage()));
|
|
||||||
connect(last_page_, SIGNAL(triggered()), this, SLOT(lastPage()));
|
|
||||||
connect(single_page_view_, SIGNAL(triggered()), preview_, SLOT(setSinglePageViewMode()));
|
|
||||||
connect(facing_pages_view_, SIGNAL(triggered()), preview_, SLOT(setFacingPagesViewMode()));
|
|
||||||
connect(all_pages_view_, SIGNAL(triggered()), preview_, SLOT(setAllPagesViewMode()));
|
|
||||||
connect(page_setup_, SIGNAL(triggered()), this, SLOT(pageSetup()));
|
|
||||||
|
|
||||||
connect(use_full_page_, SIGNAL(toggled(bool)), this, SLOT(useFullPage(bool)));
|
|
||||||
connect(fit_diagram_to_page_, SIGNAL(toggled(bool)), this, SLOT(fitDiagramToPage(bool)));
|
|
||||||
|
|
||||||
connect(render_properties_, SIGNAL(optionChanged()), preview_, SLOT(updatePreview()));
|
|
||||||
|
|
||||||
connect(preview_, SIGNAL(previewChanged()), this, SLOT(updateZoomList()));
|
|
||||||
connect(zoom_box_, SIGNAL(currentIndexChanged(int)), this, SLOT(updatePreviewZoom()));
|
|
||||||
|
|
||||||
connect(buttons_, SIGNAL(accepted()), this, SLOT(accept()));
|
|
||||||
connect(buttons_, SIGNAL(rejected()), this, SLOT(reject()));
|
|
||||||
|
|
||||||
hlayout0_ = new QHBoxLayout();
|
|
||||||
vlayout0_ = new QVBoxLayout();
|
|
||||||
vlayout1_ = new QVBoxLayout();
|
|
||||||
vlayout2_ = new QVBoxLayout();
|
|
||||||
|
|
||||||
vlayout1_ -> addWidget(use_full_page_);
|
|
||||||
vlayout1_ -> addWidget(use_full_page_label_);
|
|
||||||
vlayout1_ -> addWidget(fit_diagram_to_page_);
|
|
||||||
vlayout1_ -> addWidget(fit_diagram_to_page_label_);
|
|
||||||
print_options_box_ -> setLayout(vlayout1_);
|
|
||||||
|
|
||||||
vlayout2_ -> addWidget(diagrams_label_);
|
|
||||||
vlayout2_ -> addWidget(diagrams_list_);
|
|
||||||
vlayout2_ -> addWidget(diagrams_select_all_);
|
|
||||||
vlayout2_ -> addWidget(diagrams_select_none_);
|
|
||||||
|
|
||||||
hlayout0_ -> addLayout(vlayout2_);
|
|
||||||
hlayout0_ -> addWidget(preview_);
|
|
||||||
|
|
||||||
vlayout0_ -> addWidget(toolbar_);
|
|
||||||
vlayout0_ -> addLayout(hlayout0_);
|
|
||||||
vlayout0_ -> addWidget(render_properties_);
|
|
||||||
vlayout0_ -> addWidget(print_options_box_);
|
|
||||||
vlayout0_ -> addWidget(buttons_);
|
|
||||||
|
|
||||||
setLayout(vlayout0_);
|
|
||||||
updateZoomList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Ce slot prive emet le signal paintRequested avec :
|
|
||||||
* la liste des schemas a imprimer / selectionnes
|
|
||||||
* un booleen indiquant s'il faut adapter les schemas aux pages ou non
|
|
||||||
* l'imprimante a utiliser
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::requestPaint(QPrinter *printer) {
|
|
||||||
emit(
|
|
||||||
paintRequested(
|
|
||||||
diagrams_list_ -> selectedDiagrams(),
|
|
||||||
fit_diagram_to_page_ -> isChecked(),
|
|
||||||
render_properties_ -> exportProperties(),
|
|
||||||
printer
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Ce slot prive verifie que le nombre de schemas a imprimer est bien superieur
|
|
||||||
a 0 et active ou desactive le bouton "Imprimer" en consequence.
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::checkDiagramsCount()
|
|
||||||
{
|
|
||||||
int diagrams_count = diagrams_list_ -> selectedDiagrams().count();
|
|
||||||
|
|
||||||
// desactive le premier bouton de la liste (= le bouton "Imprimer")
|
|
||||||
QList<QAbstractButton *> buttons = buttons_ -> buttons();
|
|
||||||
if (buttons.count()) buttons[0] -> setEnabled(diagrams_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Ce slot prive affiche ou cache la liste des schemas
|
|
||||||
@param display true pour affiche la liste des schemas, false pour la cacher
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::setDiagramsListVisible(bool display) {
|
|
||||||
diagrams_label_ -> setVisible(display);
|
|
||||||
diagrams_list_ -> setVisible(display);
|
|
||||||
diagrams_select_all_ -> setVisible(display);
|
|
||||||
diagrams_select_none_ -> setVisible(display);
|
|
||||||
|
|
||||||
if (display) {
|
|
||||||
toggle_diagrams_list_ -> setText(tr("Cacher la liste des folios"));
|
|
||||||
} else {
|
|
||||||
toggle_diagrams_list_ -> setText(tr("Afficher la liste des folios"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Ce slot prive affiche ou cache les options d'impression
|
|
||||||
@param display true pour affiche les options d'impression, false pour les
|
|
||||||
cacher
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::setPrintOptionsVisible(bool display) {
|
|
||||||
print_options_box_ -> setVisible(display);
|
|
||||||
render_properties_ -> setVisible(display);
|
|
||||||
|
|
||||||
if (display) {
|
|
||||||
toggle_print_options_ -> setText(tr("Cacher les options d'impression"));
|
|
||||||
} else {
|
|
||||||
toggle_print_options_ -> setText(tr("Afficher les options d'impression"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Met a jour la liste des zooms disponibles
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::updateZoomList()
|
|
||||||
{
|
|
||||||
// recupere le zooom courant
|
|
||||||
qreal current_zoom = preview_ -> zoomFactor();
|
|
||||||
bool current_zoom_is_not_null = bool(int(current_zoom * 100.0));
|
|
||||||
|
|
||||||
// liste des zooms par defaut
|
|
||||||
QList<qreal> zooms_real;
|
|
||||||
zooms_real << 0.25 << 0.5 << 0.75 << 1.0 << 1.5 << 2.0 << 4.0 << 8.0;
|
|
||||||
|
|
||||||
// ajout du zoom en cours
|
|
||||||
if (current_zoom_is_not_null && (!zooms_real.contains(current_zoom))) {
|
|
||||||
zooms_real << current_zoom;
|
|
||||||
std::sort(zooms_real.begin(), zooms_real.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
// remplissage de la liste deroulante
|
|
||||||
int current_zoom_index = -1;
|
|
||||||
zoom_box_ -> blockSignals(true);
|
|
||||||
zoom_box_ -> clear();
|
|
||||||
foreach (qreal z, zooms_real) {
|
|
||||||
zoom_box_ -> addItem(QString(tr("%1 %")).arg(z * 100.0, 0, 'f', 2), z);
|
|
||||||
if (z == current_zoom) current_zoom_index = zoom_box_ -> count() - 1;
|
|
||||||
}
|
|
||||||
zoom_box_ -> setCurrentIndex(current_zoom_index);
|
|
||||||
zoom_box_ -> blockSignals(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Change le zoom de l'apercu en fonctiopn du contenu du zoom selectionne
|
|
||||||
*/
|
|
||||||
void QETPrintPreviewDialog::updatePreviewZoom()
|
|
||||||
{
|
|
||||||
preview_ -> setZoomFactor(
|
|
||||||
zoom_box_ -> itemData(zoom_box_ -> currentIndex()).toDouble()
|
|
||||||
);
|
|
||||||
updateZoomList();
|
|
||||||
}
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2006-2020 The QElectroTech Team
|
|
||||||
This file is part of QElectroTech.
|
|
||||||
|
|
||||||
QElectroTech 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 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#ifndef QET_PRINT_PREVIEW_DIALOG
|
|
||||||
#define QET_PRINT_PREVIEW_DIALOG
|
|
||||||
#include <QtWidgets>
|
|
||||||
#include "exportproperties.h"
|
|
||||||
|
|
||||||
class Diagram;
|
|
||||||
class DiagramsChooser;
|
|
||||||
class ExportPropertiesWidget;
|
|
||||||
class QETProject;
|
|
||||||
class QPrintPreviewWidget;
|
|
||||||
class QPrinter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
This class provides a dialog for users to refine printing options for a
|
|
||||||
particular project by relying on a visual print preview.
|
|
||||||
*/
|
|
||||||
class QETPrintPreviewDialog : public QDialog {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
// constructors, destructor
|
|
||||||
public:
|
|
||||||
QETPrintPreviewDialog(QETProject *, QPrinter *, QWidget * = nullptr, Qt::WindowFlags = Qt::Widget);
|
|
||||||
~QETPrintPreviewDialog() override;
|
|
||||||
private:
|
|
||||||
QETPrintPreviewDialog(const QETPrintPreviewDialog &);
|
|
||||||
|
|
||||||
// methods
|
|
||||||
public:
|
|
||||||
DiagramsChooser *diagramsChooser();
|
|
||||||
bool fitDiagramsToPages() const;
|
|
||||||
ExportProperties exportProperties() const;
|
|
||||||
|
|
||||||
// signaux
|
|
||||||
signals:
|
|
||||||
void paintRequested(const QList<Diagram *> &, bool, const ExportProperties, QPrinter *);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void firstPage();
|
|
||||||
void previousPage();
|
|
||||||
void nextPage();
|
|
||||||
void lastPage();
|
|
||||||
void pageSetup();
|
|
||||||
void useFullPage(bool);
|
|
||||||
void fitDiagramToPage(bool);
|
|
||||||
void zoomIn();
|
|
||||||
void zoomOut();
|
|
||||||
void selectAllDiagrams();
|
|
||||||
void selectNoDiagram();
|
|
||||||
|
|
||||||
// attributes
|
|
||||||
private:
|
|
||||||
QETProject *project_;
|
|
||||||
QPrinter *printer_;
|
|
||||||
QHBoxLayout *hlayout0_;
|
|
||||||
QVBoxLayout *vlayout0_;
|
|
||||||
QVBoxLayout *vlayout1_;
|
|
||||||
QVBoxLayout *vlayout2_;
|
|
||||||
QToolBar *toolbar_;
|
|
||||||
QPrintPreviewWidget *preview_;
|
|
||||||
QLabel *diagrams_label_;
|
|
||||||
DiagramsChooser *diagrams_list_;
|
|
||||||
QPushButton *diagrams_select_all_;
|
|
||||||
QPushButton *diagrams_select_none_;
|
|
||||||
QAction *toggle_diagrams_list_;
|
|
||||||
QAction *toggle_print_options_;
|
|
||||||
QAction *adjust_width_;
|
|
||||||
QAction *adjust_page_;
|
|
||||||
QAction *zoom_in_;
|
|
||||||
QComboBox *zoom_box_;
|
|
||||||
QAction *zoom_out_;
|
|
||||||
QAction *landscape_;
|
|
||||||
QAction *portrait_;
|
|
||||||
QAction *first_page_;
|
|
||||||
QAction *previous_page_;
|
|
||||||
QAction *next_page_;
|
|
||||||
QAction *last_page_;
|
|
||||||
QAction *all_pages_view_;
|
|
||||||
QAction *facing_pages_view_;
|
|
||||||
QAction *single_page_view_;
|
|
||||||
QAction *page_setup_;
|
|
||||||
QDialogButtonBox *buttons_;
|
|
||||||
QGroupBox *print_options_box_;
|
|
||||||
QCheckBox *use_full_page_;
|
|
||||||
QLabel *use_full_page_label_;
|
|
||||||
QCheckBox *fit_diagram_to_page_;
|
|
||||||
QLabel *fit_diagram_to_page_label_;
|
|
||||||
ExportPropertiesWidget *render_properties_;
|
|
||||||
|
|
||||||
// methods
|
|
||||||
private:
|
|
||||||
void build();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void requestPaint(QPrinter *);
|
|
||||||
void checkDiagramsCount();
|
|
||||||
void setDiagramsListVisible(bool);
|
|
||||||
void setPrintOptionsVisible(bool);
|
|
||||||
void updateZoomList();
|
|
||||||
void updatePreviewZoom();
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
Reference in New Issue
Block a user