File indexing completed on 2024-05-19 15:27:53
0001 /* This file is part of KGraphViewer. 0002 Copyright (C) 2005-2007 Gael de Chalendar <kleag@free.fr> 0003 0004 KGraphViewer is free software; you can redistribute it and/or 0005 modify it under the terms of the GNU General Public 0006 License as published by the Free Software Foundation, version 2. 0007 0008 This program is distributed in the hope that it will be useful, 0009 but WITHOUT ANY WARRANTY; without even the implied warranty of 0010 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0011 General Public License for more details. 0012 0013 You should have received a copy of the GNU General Public License 0014 along with this program; if not, write to the Free Software 0015 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 0016 02110-1301, USA 0017 */ 0018 0019 /* This file was part of the KDE project 0020 Copyright (C) 2005 Jarosław Staniek <staniek@kde.org> 0021 0022 This program is free software; you can redistribute it and/or 0023 modify it under the terms of the GNU Library General Public 0024 License as published by the Free Software Foundation; either 0025 version 2 of the License, or (at your option) any later version. 0026 */ 0027 0028 #include "simpleprintingpagesetup.h" 0029 #include "dotgraphview.h" 0030 #include "kgraphviewerlib_debug.h" 0031 #include "simpleprintingcommand.h" 0032 #include "simpleprintingsettings.h" 0033 #include "simpleprintpreviewwindow.h" 0034 #include "ui_simpleprintingpagesetupbase.h" 0035 0036 #include <QApplication> 0037 #include <QDebug> 0038 #include <QFontDialog> 0039 #include <QIcon> 0040 #include <QLabel> 0041 #include <QLineEdit> 0042 #include <QMessageBox> 0043 #include <QPushButton> 0044 #include <QSpinBox> 0045 #include <QStandardPaths> 0046 #include <QUrl> 0047 0048 #include <QRadioButton> 0049 #include <qcheckbox.h> 0050 #include <qlabel.h> 0051 #include <qlayout.h> 0052 #include <qpainter.h> 0053 #include <qslider.h> 0054 #include <qtimer.h> 0055 #include <qtooltip.h> 0056 // Added by qt3to4: 0057 #include <QPixmap> 0058 #include <QVBoxLayout> 0059 #include <iostream> 0060 #include <klocalizedstring.h> 0061 0062 namespace KGraphViewer 0063 { 0064 KGVSimplePrintingPageSetup::KGVSimplePrintingPageSetup(KGVSimplePrintingCommand *command, DotGraphView *mainWin, QWidget *parent, QMap<QString, QString> *args) 0065 : QWidget(parent) 0066 , m_settings(command->engine()->settings()) 0067 , m_command(command) 0068 { 0069 setObjectName("KGVSimplePrintingPageSetup"); 0070 // object to print 0071 bool ok = args; 0072 m_graphView = mainWin; 0073 ok = m_graphView; 0074 0075 bool printPreview = false; 0076 bool print = false; 0077 bool pageSetup = false; 0078 if (ok) { 0079 printPreview = (*args)["action"] == "printPreview"; 0080 print = (*args)["action"] == "print"; 0081 pageSetup = (*args)["action"] == "pageSetup"; 0082 ok = printPreview || print || pageSetup; 0083 } 0084 0085 // settings 0086 //! @todo default? 0087 m_unit = QLocale().measurementSystem() == QLocale::MetricSystem ? KgvUnit::U_CM : KgvUnit::U_INCH; 0088 0089 // GUI 0090 m_contents = new Ui::KGVSimplePrintingPageSetupBase(); 0091 m_contents->setupUi(this); 0092 layout()->setMargin(0); 0093 0094 setFocusPolicy(Qt::WheelFocus); 0095 // m_contents->setFocusProxy(m_contents->headerTitleLineEdit); 0096 0097 m_contents->printButton->setIcon(QIcon::fromTheme("printer")); 0098 connect(m_contents->printButton, &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotPrint); 0099 0100 m_contents->printPreviewButton->setIcon(QIcon::fromTheme("document-print-preview")); 0101 m_contents->printPreviewButton->setText(i18n("Print Preview...")); 0102 connect(m_contents->printPreviewButton, &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotPrintPreview); 0103 0104 m_contents->headerTitleFontButton->setText(i18n("Font...")); 0105 m_contents->headerTitleFontButton->setWhatsThis(i18n("Changes font for title text.")); 0106 connect(m_contents->headerTitleFontButton, &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotChangeTitleFont); 0107 0108 if (m_graphView) { 0109 m_contents->headerTitleLineEdit->setText((*args)["title"]); 0110 QString origCaptionLabelText = m_contents->captionLabel->text(); 0111 m_contents->captionLabel->setText(i18n("<qt><h2>Page Setup for Printing Graph \"%1\"</h2></qt>", QUrl::fromLocalFile(m_graphView->dotFileName()).fileName())); 0112 } 0113 connect(m_contents->headerTitleLineEdit, &QLineEdit::textChanged, this, &KGVSimplePrintingPageSetup::slotTitleTextChanged); 0114 m_contents->headerTitleLineEdit->setFont(m_settings->pageTitleFont); 0115 0116 m_contents->saveSetupLink->setWhatsThis(i18n("Saves settings for this setup as default.")); 0117 connect(m_contents->saveSetupLink, static_cast<void (KUrlLabel::*)()>(&KUrlLabel::leftClickedUrl), this, &KGVSimplePrintingPageSetup::slotSaveSetup); 0118 0119 m_contents->addDateTimeCheckbox->setWhatsThis(i18n("Adds date and time to the header.")); 0120 m_contents->addPageNumbersCheckbox->setWhatsThis(i18n("Adds page numbers to the footer.")); 0121 m_contents->addTableBordersCheckbox->setWhatsThis(i18n("Adds table borders.")); 0122 0123 #ifdef KGV_NO_UNFINISHED 0124 m_contents->addDateTimeCheckbox->hide(); 0125 m_contents->addPageNumbersCheckbox->hide(); 0126 #endif 0127 0128 updatePageLayoutAndUnitInfo(); 0129 m_contents->changePageSizeAndMarginsButton->setText(i18n("Change Page Size and Margins...")); 0130 m_contents->changePageSizeAndMarginsButton->setWhatsThis(i18n("Changes page size and margins.")); 0131 connect(m_contents->changePageSizeAndMarginsButton, &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotChangePageSizeAndMargins); 0132 0133 connect(m_contents->addPageNumbersCheckbox, &QCheckBox::toggled, this, &KGVSimplePrintingPageSetup::slotAddPageNumbersCheckboxToggled); 0134 connect(m_contents->addDateTimeCheckbox, &QCheckBox::toggled, this, &KGVSimplePrintingPageSetup::slotAddDateTimeCheckboxToggled); 0135 connect(m_contents->addTableBordersCheckbox, &QCheckBox::toggled, this, &KGVSimplePrintingPageSetup::slotAddTableBordersCheckboxToggled); 0136 0137 // 0138 m_contents->addPageNumbersCheckbox->setChecked(m_settings->addPageNumbers); 0139 m_contents->addDateTimeCheckbox->setChecked(m_settings->addDateAndTime); 0140 m_contents->addTableBordersCheckbox->setChecked(m_settings->addTableBorders); 0141 setDirty(false); 0142 0143 // clear it back to false after widgets initialization 0144 m_printPreviewNeedsReloading = false; 0145 0146 if (printPreview) 0147 QTimer::singleShot(50, this, SLOT(printPreview())); 0148 else if (print) 0149 QTimer::singleShot(50, this, SLOT(print())); 0150 connect(this, static_cast<void (KGVSimplePrintingPageSetup::*)()>(&KGVSimplePrintingPageSetup::print), m_graphView, &DotGraphView::print); 0151 connect(this, static_cast<void (KGVSimplePrintingPageSetup::*)()>(&KGVSimplePrintingPageSetup::printPreview), m_graphView, &DotGraphView::printPreview); 0152 0153 connect(m_contents->buttonBox->button(QDialogButtonBox::Close), &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotClose); 0154 0155 m_contents->horizFitNumInput->setRange(1, m_command->engine()->maxHorizFit()); 0156 m_contents->vertFitNumInput->setRange(1, m_command->engine()->maxVertFit()); 0157 m_settings->horizFitting = m_command->engine()->maxHorizFit(); 0158 m_settings->vertFitting = m_command->engine()->maxVertFit(); 0159 m_contents->horizFitNumInput->setValue(m_settings->horizFitting); 0160 m_contents->vertFitNumInput->setValue(m_settings->vertFitting); 0161 connect(m_contents->maintainAspectButton, &QPushButton::clicked, this, &KGVSimplePrintingPageSetup::slotMaintainAspectButtonToggled); 0162 connect(m_contents->horizFitNumInput, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &KGVSimplePrintingPageSetup::slotHorizFitChanged); 0163 connect(m_contents->vertFitNumInput, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &KGVSimplePrintingPageSetup::slotVertFitChanged); 0164 0165 m_fittingModeButtons.addButton(m_contents->naturalSizeRadioButton, NaturalSize); 0166 m_fittingModeButtons.addButton(m_contents->fitToOnePageRadioButton, FitToOnePage); 0167 m_fittingModeButtons.addButton(m_contents->fitToSeveralPagesRadioButton, FitToSeveralPages); 0168 connect(&m_fittingModeButtons, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), this, &KGVSimplePrintingPageSetup::slotFittingButtonClicked); 0169 0170 m_fittingModeButtons.button(m_settings->fittingMode)->setChecked(true); 0171 if (m_settings->fittingMode != FitToSeveralPages) { 0172 m_contents->horizFitNumInput->setEnabled(false); 0173 m_contents->vertFitNumInput->setEnabled(false); 0174 m_contents->maintainAspectButton->setEnabled(false); 0175 } 0176 0177 QString chainStatePixString = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kgraphviewerpart/pics/chain.png"); 0178 if (!m_settings->chainedFittings) { 0179 chainStatePixString = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kgraphviewerpart/pics/chain-broken.png"); 0180 } 0181 if (chainStatePixString.isNull()) { 0182 std::cerr << "chain state pixmap not found !" << std::endl; 0183 } 0184 m_contents->maintainAspectButton->setIcon(QPixmap(chainStatePixString)); 0185 0186 // hides currently unused title label 0187 m_contents->headerTitleLineEdit->setText(i18n("Chosen font looks like this")); 0188 m_contents->headerTitleLineEdit->setReadOnly(true); 0189 } 0190 0191 KGVSimplePrintingPageSetup::~KGVSimplePrintingPageSetup() 0192 { 0193 delete m_contents; 0194 } 0195 0196 void KGVSimplePrintingPageSetup::updatePageLayoutAndUnitInfo() 0197 { 0198 QString s; 0199 if (m_settings->pageLayout.format == PG_CUSTOM) { 0200 s += QString(" (%1 %2 x %3 %4)").arg(m_settings->pageLayout.ptWidth).arg(KgvUnit::unitName(m_unit)).arg(m_settings->pageLayout.ptHeight).arg(KgvUnit::unitName(m_unit)); 0201 } else 0202 s += KgvPageFormat::name(m_settings->pageLayout.format); 0203 s += QString(", ") + (m_settings->pageLayout.orientation == PG_PORTRAIT ? i18n("Portrait") : i18n("Landscape")) + ", " + i18n("margins:") + ' ' + KgvUnit::toUserStringValue(m_settings->pageLayout.ptLeft, m_unit) + '/' + 0204 KgvUnit::toUserStringValue(m_settings->pageLayout.ptRight, m_unit) + '/' + KgvUnit::toUserStringValue(m_settings->pageLayout.ptTop, m_unit) + '/' + KgvUnit::toUserStringValue(m_settings->pageLayout.ptBottom, m_unit) + ' ' + 0205 KgvUnit::unitName(m_unit); 0206 m_contents->pageSizeAndMarginsLabel->setText(s); 0207 m_contents->horizFitNumInput->setRange(1, m_command->engine()->maxHorizFit()); 0208 m_contents->vertFitNumInput->setRange(1, m_command->engine()->maxVertFit()); 0209 } 0210 0211 void KGVSimplePrintingPageSetup::setDirty(bool set) 0212 { 0213 m_contents->saveSetupLink->setEnabled(set); 0214 if (set) { 0215 m_printPreviewNeedsReloading = true; 0216 m_command->engine()->clear(); 0217 emit needsRedraw(); 0218 } 0219 } 0220 0221 void KGVSimplePrintingPageSetup::slotSaveSetup() 0222 { 0223 m_settings->save(); 0224 setDirty(false); 0225 } 0226 0227 void KGVSimplePrintingPageSetup::slotPrint() 0228 { 0229 emit print(); 0230 } 0231 0232 void KGVSimplePrintingPageSetup::slotPrintPreview() 0233 { 0234 emit printPreview(); 0235 m_printPreviewNeedsReloading = false; 0236 } 0237 0238 void KGVSimplePrintingPageSetup::slotTitleTextChanged(const QString &) 0239 { 0240 if (m_contents->headerTitleLineEdit->isModified()) { 0241 m_printPreviewNeedsReloading = true; 0242 } 0243 0244 m_contents->headerTitleLineEdit->setModified(false); 0245 setDirty(true); 0246 } 0247 0248 void KGVSimplePrintingPageSetup::slotChangeTitleFont() 0249 { 0250 bool ok; 0251 QFont font = QFontDialog::getFont(&ok, m_settings->pageTitleFont, this); 0252 if (!ok) 0253 return; 0254 m_settings->pageTitleFont = font; 0255 m_contents->headerTitleLineEdit->setFont(m_settings->pageTitleFont); 0256 setDirty(true); 0257 } 0258 0259 void KGVSimplePrintingPageSetup::slotChangePageSizeAndMargins() 0260 { 0261 KgvHeadFoot headfoot; // dummy 0262 // std::cerr << "PageLayout before: " << m_settings->pageLayout.orientation << std::endl; 0263 if (int(QDialog::Accepted) != KgvPageLayoutDia::pageLayout(m_settings->pageLayout, headfoot, FORMAT_AND_BORDERS | DISABLE_UNIT, m_unit, this)) 0264 return; 0265 0266 // std::cerr << "PageLayout after: " << m_settings->pageLayout.orientation << std::endl; 0267 // update 0268 updatePageLayoutAndUnitInfo(); 0269 setDirty(true); 0270 } 0271 0272 void KGVSimplePrintingPageSetup::slotAddPageNumbersCheckboxToggled(bool set) 0273 { 0274 m_settings->addPageNumbers = set; 0275 setDirty(true); 0276 } 0277 0278 void KGVSimplePrintingPageSetup::slotAddDateTimeCheckboxToggled(bool set) 0279 { 0280 m_settings->addDateAndTime = set; 0281 setDirty(true); 0282 } 0283 0284 void KGVSimplePrintingPageSetup::slotAddTableBordersCheckboxToggled(bool set) 0285 { 0286 m_settings->addTableBorders = set; 0287 setDirty(true); 0288 } 0289 0290 void KGVSimplePrintingPageSetup::slotFittingButtonClicked(int id) 0291 { 0292 qCDebug(KGRAPHVIEWERLIB_LOG) << "KGVSimplePrintingPageSetup::slotFittingButtonClicked " << id; 0293 if (id == NaturalSize) { 0294 m_settings->fitToOnePage = false; 0295 m_contents->horizFitNumInput->setEnabled(false); 0296 m_contents->vertFitNumInput->setEnabled(false); 0297 m_contents->maintainAspectButton->setEnabled(false); 0298 } else if (id == FitToOnePage) { 0299 m_settings->fitToOnePage = true; 0300 m_contents->horizFitNumInput->setEnabled(false); 0301 m_contents->vertFitNumInput->setEnabled(false); 0302 m_contents->maintainAspectButton->setEnabled(false); 0303 } else if (id == FitToSeveralPages) { 0304 m_settings->fitToOnePage = false; 0305 m_contents->horizFitNumInput->setEnabled(true); 0306 m_contents->vertFitNumInput->setEnabled(true); 0307 m_contents->maintainAspectButton->setEnabled(true); 0308 } 0309 setDirty(true); 0310 } 0311 0312 void KGVSimplePrintingPageSetup::slotMaintainAspectButtonToggled() 0313 { 0314 if (m_settings->chainedFittings) { 0315 QString chainBreakPixString = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kgraphviewerpart/pics/chain-broken.png"); 0316 if (chainBreakPixString.isNull()) { 0317 std::cerr << "chain break pixmap not found !" << std::endl; 0318 } 0319 m_contents->maintainAspectButton->setIcon(QPixmap(chainBreakPixString)); 0320 m_settings->chainedFittings = false; 0321 } else { 0322 QString chainPixString = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kgraphviewerpart/pics/chain.png"); 0323 if (chainPixString.isNull()) { 0324 std::cerr << "chain pixmap not found !" << std::endl; 0325 } 0326 m_contents->maintainAspectButton->setIcon(QPixmap(chainPixString)); 0327 m_settings->chainedFittings = true; 0328 } 0329 emit needsRedraw(); 0330 } 0331 0332 void KGVSimplePrintingPageSetup::slotClose() 0333 { 0334 parentWidget()->hide(); 0335 } 0336 0337 void KGVSimplePrintingPageSetup::slotHorizFitChanged(int newValue) 0338 { 0339 m_settings->horizFitting = newValue; 0340 m_printPreviewNeedsReloading = true; 0341 emit needsRedraw(); 0342 } 0343 0344 void KGVSimplePrintingPageSetup::slotVertFitChanged(int newValue) 0345 { 0346 m_settings->vertFitting = newValue; 0347 m_printPreviewNeedsReloading = true; 0348 emit needsRedraw(); 0349 } 0350 0351 } 0352 0353 #include "moc_simpleprintingpagesetup.cpp"