diff --git a/src/EditDialog.cpp b/src/EditDialog.cpp index 8514f960..77936d8f 100644 --- a/src/EditDialog.cpp +++ b/src/EditDialog.cpp @@ -18,6 +18,7 @@ #include #include #include +#include EditDialog::EditDialog(QWidget* parent) : QDialog(parent), @@ -50,12 +51,14 @@ EditDialog::EditDialog(QWidget* parent) connect(sciEdit, SIGNAL(textChanged()), this, SLOT(updateApplyButton())); connect(sciEdit, SIGNAL(textChanged()), this, SLOT(editTextChanged())); - // Create shortcuts for the widgets that doesn't have its own printing mechanism. - QShortcut* shortcutPrintHex = new QShortcut(QKeySequence::Print, hexEdit, nullptr, nullptr, Qt::WidgetShortcut); - connect(shortcutPrintHex, &QShortcut::activated, this, &EditDialog::openPrintDialog); + // Create shortcuts for the widgets that doesn't have its own print action or printing mechanism. QShortcut* shortcutPrintText = new QShortcut(QKeySequence::Print, ui->editorText, nullptr, nullptr, Qt::WidgetShortcut); connect(shortcutPrintText, &QShortcut::activated, this, &EditDialog::openPrintDialog); + // Add actions to editors that have a context menu based on actions. This also activates the shortcuts. + ui->editorImage->addAction(ui->actionPrintImage); + ui->editorBinary->addAction(ui->actionPrint); + mustIndentAndCompact = Settings::getValue("databrowser", "indent_compact").toBool(); ui->buttonIndent->setChecked(mustIndentAndCompact); @@ -359,6 +362,8 @@ void EditDialog::importData() void EditDialog::exportData() { + openPrintImageDialog(); + return; QStringList filters; switch (dataType) { case Image: { @@ -1060,3 +1065,23 @@ void EditDialog::openPrintDialog() delete dialog; delete document; } + +void EditDialog::openPrintImageDialog() +{ + QPrinter printer; + QPrintPreviewDialog *dialog = new QPrintPreviewDialog(&printer); + + connect(dialog, &QPrintPreviewDialog::paintRequested, [&](QPrinter *previewPrinter) { + QPainter painter(previewPrinter); + QRect rect = painter.viewport(); + QSize size = ui->editorImage->pixmap()->size(); + size.scale(rect.size(), Qt::KeepAspectRatio); + painter.setViewport(rect.x(), rect.y(), size.width(), size.height()); + painter.setWindow(ui->editorImage->pixmap()->rect()); + painter.drawPixmap(0, 0, *ui->editorImage->pixmap()); + }); + + dialog->exec(); + + delete dialog; +} diff --git a/src/EditDialog.h b/src/EditDialog.h index 64b34d42..4b1cba2e 100644 --- a/src/EditDialog.h +++ b/src/EditDialog.h @@ -43,6 +43,8 @@ private slots: void switchEditorMode(bool autoSwitchForType); void updateCellInfoAndMode(const QByteArray& data); void setMustIndentAndCompact(bool enable); + void openPrintDialog(); + void openPrintImageDialog(); signals: void recordTextUpdated(const QPersistentModelIndex& idx, const QByteArray& data, bool isBlob); @@ -89,7 +91,6 @@ private: bool promptInvalidData(const QString& dataType, const QString& errorString); void setDataInBuffer(const QByteArray& data, DataSources source); void setStackCurrentIndex(int editMode); - void openPrintDialog(); }; #endif diff --git a/src/EditDialog.ui b/src/EditDialog.ui index 0224095d..fff7d7ee 100644 --- a/src/EditDialog.ui +++ b/src/EditDialog.ui @@ -216,7 +216,11 @@ - + + + Qt::ActionsContextMenu + + true @@ -233,6 +237,9 @@ + + Qt::ActionsContextMenu + @@ -302,6 +309,36 @@ Errors are indicated with a red squiggle underline. + + + + :/icons/print:/icons/print + + + Print... + + + Open preview dialog for printing displayed image + + + Ctrl+P + + + + + + :/icons/print:/icons/print + + + Print... + + + Open preview dialog for printing displayed text + + + Ctrl+P + + buttonExport @@ -439,6 +476,38 @@ Errors are indicated with a red squiggle underline. + + actionPrintImage + triggered() + EditDialog + openPrintImageDialog() + + + -1 + -1 + + + 308 + 190 + + + + + actionPrint + triggered() + EditDialog + openPrintDialog() + + + -1 + -1 + + + 308 + 190 + + + importData()