From f7dbf18fb39688318e5127628f23a75b842840c0 Mon Sep 17 00:00:00 2001 From: ruglory Date: Sun, 17 Jan 2010 07:30:27 +0000 Subject: [PATCH] implemented first version of software preview git-svn-id: https://svn.code.sf.net/p/qlscribe/svn/trunk@163 cac9541e-1b8d-4bfa-827e-589bba606050 --- src/mainwindow.cpp | 100 ++++++++++++++++++++++++++++++++++++---- src/qdialogprint.cpp | 19 ++++++-- src/qdialogprint.h | 2 +- src/qdialogprogress.cpp | 2 +- 4 files changed, 107 insertions(+), 16 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 426fd00..4209c60 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -42,6 +42,7 @@ #include #include #include +#include MainWindow::MainWindow( bool enablePrint ) @@ -380,6 +381,24 @@ void MainWindow::onMenuProperties() QDialogCDProperties::exec( this, scene ); } +namespace { + const int bigImageSize = 1600; +} + +inline +void drawCircle( QPainter &painter, double radi ) +{ + const int half = bigImageSize / 2; + painter.drawEllipse( QRectF( half - radi, half - radi, radi * 2, radi * 2 ) ); +} + +inline +void drawCircle( QPainterPath &path, double radi ) +{ + const int half = bigImageSize / 2; + path.addEllipse( QRectF( half - radi, half - radi, radi * 2, radi * 2 ) ); +} + void MainWindow::onMenuPrintPreview() { QCDScene *cdscene = getScene( m_mdiArea ); @@ -388,21 +407,84 @@ void MainWindow::onMenuPrintPreview() PrintParameters params; params.m_labelMode = cdscene->labelMode(); - QLightDrive *drive = QDialogPrint::exec( this, params ); - if( !drive ) + QPair< bool, QLightDrive * > bd = QDialogPrint::exec( this, params, true ); + if( !bd.first ) return; - try { - QPixmap pixmap = drive->preview( params, cdscene, QSize( 400, 400 ) ); + if( !bd.second ) { + QPixmap image( bigImageSize, bigImageSize ); + image.fill( 0xFFFFFFFF ); + cdscene->clearSelection(); + { + QPainter painter( &image ); + QColor circleColor( 0xd8, 0xd8, 0xd8 ); + painter.setPen( circleColor ); + painter.setBrush( circleColor ); + drawCircle( painter, bigImageSize / 2 ); + + cdscene->render( &painter, image.rect() ); + + QPainterPath p1; + p1.addRect( image.rect() ); + { + QPainterPath p2; + drawCircle( p2, bigImageSize / 2 ); + painter.setClipPath( p1.subtracted( p2 ) ); + painter.fillRect( image.rect(), Qt::white ); + painter.setClipPath( p1 ); + } + + painter.setBrush( circleColor ); + + if( params.m_labelMode == modeTitle ) { + // 3.22 + QPainterPath p2; + drawCircle( p2, bigImageSize / 3.20 ); + painter.setClipPath( p1.subtracted( p2 ) ); + drawCircle( painter, bigImageSize / 2 ); + // 3.74 + painter.setClipPath( p1 ); + drawCircle( painter, bigImageSize / 3.74 ); + } else + if( params.m_labelMode == modeContent ) { + // 3.22 + QPainterPath p2; + drawCircle( p2, bigImageSize / 3.20 ); + painter.setClipPath( p1.subtracted( p2 ) ); + drawCircle( painter, bigImageSize / 2 ); + + // 4.69 + painter.setClipPath( p1 ); + drawCircle( painter, bigImageSize / 4.69 ); + } + + painter.setBrush( Qt::white ); + drawCircle( painter, bigImageSize / 4.93 ); + + //painter.setBrush( circleColor ); + //drawCircle( painter, bigImageSize / 2 ); + } QLabel *label = new QLabel; - label->setPixmap( pixmap ); + //label->setPixmap( QPixmap::fromImage( image, Qt::MonoOnly ).scaled( QSize( 400, 400 ) ) ); + label->setPixmap( image.scaled( QSize( 400, 400 ) ) ); + QMdiSubWindow *subWindow = m_mdiArea->addSubWindow( label ); - subWindow->setWindowTitle( "Preview: " + cdscene->name() ); + subWindow->setWindowTitle( "Software preview: " + cdscene->name() ); subWindow->show(); - } - catch( const QString &err ) { - QMessageBox::critical( this, tr( "Error on print preview" ), err ); + + } else { + try { + QPixmap pixmap = bd.second->preview( params, cdscene, QSize( 400, 400 ) ); + QLabel *label = new QLabel; + label->setPixmap( pixmap ); + QMdiSubWindow *subWindow = m_mdiArea->addSubWindow( label ); + subWindow->setWindowTitle( "Preview: " + cdscene->name() ); + subWindow->show(); + } + catch( const QString &err ) { + QMessageBox::critical( this, tr( "Error on print preview" ), err ); + } } } diff --git a/src/qdialogprint.cpp b/src/qdialogprint.cpp index 8b7f58e..c0a4f8e 100644 --- a/src/qdialogprint.cpp +++ b/src/qdialogprint.cpp @@ -46,12 +46,14 @@ void QDialogPrint::changeEvent(QEvent *e) } } -QLightDrive *QDialogPrint::exec( QWidget *parent, PrintParameters ¶ms ) +QPair QDialogPrint::exec( QWidget *parent, PrintParameters ¶ms, bool preview ) { + QPair rez( false, 0 ); + QList drives = QLightScribe::instance()->getDrives(); - if( drives.isEmpty() ) { + if( !preview && drives.isEmpty() ) { QMessageBox::critical( parent, tr( "Error" ), tr( "Cannot find any lightScribe drive" ) ); - return 0; + return rez; } QDialogPrint dialog( parent ); switch( params.m_labelMode ) { @@ -64,8 +66,11 @@ QLightDrive *QDialogPrint::exec( QWidget *parent, PrintParameters ¶ms ) foreach( QLightDrive *drv, drives ) { dialog.m_ui->comboDrive->insertItem( index++, drv->displayName() ); } + if( preview ) + dialog.m_ui->comboDrive->insertItem( index++, tr( "Software renderer" ) ); + if( dialog.QDialog::exec() == Rejected ) - return 0; + return rez; params = PrintParameters(); // reset to default @@ -87,5 +92,9 @@ QLightDrive *QDialogPrint::exec( QWidget *parent, PrintParameters ¶ms ) if( dialog.m_ui->radioMediaGeneric->isChecked() ) params.m_mediaOptimizationLevel = mediaGeneric; - return drives.at( dialog.m_ui->comboDrive->currentIndex() ); + rez.first = true; + if( dialog.m_ui->comboDrive->currentIndex() < drives.size() ) + rez.second = drives.at( dialog.m_ui->comboDrive->currentIndex() ); + + return rez; } diff --git a/src/qdialogprint.h b/src/qdialogprint.h index 10ddb2d..ce68a9a 100644 --- a/src/qdialogprint.h +++ b/src/qdialogprint.h @@ -33,7 +33,7 @@ class QDialogPrint : public QDialog { Q_OBJECT Q_DISABLE_COPY(QDialogPrint) public: - static QLightDrive *exec( QWidget *parent, PrintParameters ¶ms ); + static QPair exec( QWidget *parent, PrintParameters ¶ms, bool preview ); protected: explicit QDialogPrint(QWidget *parent = 0); diff --git a/src/qdialogprogress.cpp b/src/qdialogprogress.cpp index 8a89e40..8d72eb9 100644 --- a/src/qdialogprogress.cpp +++ b/src/qdialogprogress.cpp @@ -65,7 +65,7 @@ bool QDialogProgress::exec( QWidget *parent, QCDScene *scene ) { PrintParameters params; params.m_labelMode = scene->labelMode(); - QLightDrive *drive = QDialogPrint::exec( parent, params ); + QLightDrive *drive = QDialogPrint::exec( parent, params, false ).second; if( !drive ) return false;