diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b6cfee1..1bf36fc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -20,12 +20,12 @@ SET( QLSCRIBE_SRCS main.cpp mainwindow.cpp qcdscene.cpp qcdview.cpp qdialogpixmap.cpp qdialogroundtext.cpp qdialogtext.cpp qgraphicsroundtextitem.cpp qlightscribe.cpp qshapecontrollers.cpp qshapefactory.cpp - qdialogprint.cpp ) + qdialogprint.cpp qdialogprogress.cpp ) -SET( QLSCRIBE_UIS qdialogtext.ui qdialogroundtext.ui qdialogpixmap.ui qdialogprint.ui ) +SET( QLSCRIBE_UIS qdialogtext.ui qdialogroundtext.ui qdialogpixmap.ui qdialogprint.ui qdialogprogress.ui ) SET( QLSCRIBE_MOC_HDRS mainwindow.h qcdscene.h qdialogpixmap.h qdialogroundtext.h - qdialogtext.h qlightscribe.h qdialogprint.h ) + qdialogtext.h qlightscribe.h qdialogprint.h qdialogprogress.h ) ADD_DEFINITIONS( -Wall ) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 53eccc1..01340ef 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -25,6 +25,7 @@ #include "qshapefactory.h" #include "qlightscribe.h" #include "qdialogprint.h" +#include "qdialogprogress.h" #include #include @@ -231,12 +232,7 @@ void MainWindow::onMenuPrint() if( !cdscene ) return; - QLightScribe::PrintParameters params; - QLightDrive *drive = QDialogPrint::exec( this, params ); - if( !drive ) - return; - - QLightScribe::instance()->print( drive, params, cdscene ); + QDialogProgress::exec( this, cdscene ); } void MainWindow::onMenuSaveAs() diff --git a/src/qdialogprogress.cpp b/src/qdialogprogress.cpp new file mode 100644 index 0000000..e3c02ac --- /dev/null +++ b/src/qdialogprogress.cpp @@ -0,0 +1,88 @@ +#include "qdialogprogress.h" +#include "ui_qdialogprogress.h" +#include "qlightscribe.h" +#include "qdialogprint.h" + +#include +#include + +QDialogProgress::QDialogProgress(QWidget *parent) : + QDialog(parent), + m_ui(new Ui::QDialogProgress) +{ + m_ui->setupUi(this); +} + +QDialogProgress::~QDialogProgress() +{ + delete m_ui; +} + +void QDialogProgress::changeEvent(QEvent *e) +{ + switch (e->type()) { + case QEvent::LanguageChange: + m_ui->retranslateUi(this); + break; + default: + break; + } +} + +bool QDialogProgress::exec( QWidget *parent, QCDScene *scene ) +{ + QLightScribe::PrintParameters params; + QLightDrive *drive = QDialogPrint::exec( parent, params ); + if( !drive ) + return false; + + QLightScribe *scribe = QLightScribe::instance(); + QDialogProgress dialog( parent ); + + connect( dialog.m_ui->buttonBox, SIGNAL(clicked(QAbstractButton*)), &dialog, SLOT(onButtonClicked(QAbstractButton*)) ); + connect( scribe, SIGNAL(prepareProgress(long,long)), &dialog, SLOT(onPrepareProgress(long,long)) ); + connect( scribe, SIGNAL(labelProgress(long,long)), &dialog, SLOT(onLabelProgress(long,long)) ); + connect( scribe, SIGNAL(timeEstimate(long)), &dialog, SLOT(onTimeEstimate(long)) ); + connect( scribe, SIGNAL(finished(int)), &dialog, SLOT(onFinished(int)) ); + + scribe->print( drive, params, scene ); + dialog.QDialog::exec(); + return true; +} + +void QDialogProgress::onButtonClicked( QAbstractButton *button ) +{ + if( ( QAbstractButton * ) m_ui->buttonBox->button( QDialogButtonBox::Abort ) == button ) { + if( QMessageBox::question( this, + tr( "Confirmation" ), + tr( "Are you sure you want to interrupt?" ), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No ) == QMessageBox::Yes ) { + QLightScribe::instance()->abort(); + button->setDisabled( true ); + } + } else + done( 0 ); +} + +void QDialogProgress::onPrepareProgress( long current, long final ) +{ + m_ui->progressPreparation->setMaximum( final ); + m_ui->progressPreparation->setValue( current ); +} + +void QDialogProgress::onLabelProgress( long current, long final ) +{ + m_ui->progressPrinting->setMaximum( final ); + m_ui->progressPrinting->setValue( current ); +} + +void QDialogProgress::onTimeEstimate( long time ) +{ +} + +void QDialogProgress::onFinished(int status ) +{ + m_ui->lineResult->setText( status ? tr( "Failed - error code: 0x" ) + QString::number( status, 16 ) : tr( "Success" ) ); + m_ui->buttonBox->setStandardButtons( QDialogButtonBox::Close ); +} diff --git a/src/qdialogprogress.h b/src/qdialogprogress.h new file mode 100644 index 0000000..f5179bf --- /dev/null +++ b/src/qdialogprogress.h @@ -0,0 +1,36 @@ +#ifndef QDIALOGPROGRESS_H +#define QDIALOGPROGRESS_H + +#include + +namespace Ui { + class QDialogProgress; +} + +class QCDScene; +class QAbstractButton; + +class QDialogProgress : public QDialog { + Q_OBJECT + Q_DISABLE_COPY(QDialogProgress) +public: + static bool exec( QWidget *parent, QCDScene *scene ); + +protected slots: + void onButtonClicked( QAbstractButton* button ); + void onPrepareProgress( long current, long final ); + void onLabelProgress( long current, long final ); + void onTimeEstimate( long time ); + void onFinished(int status ); + +protected: + virtual void changeEvent(QEvent *e); + +private: + explicit QDialogProgress(QWidget *parent = 0); + virtual ~QDialogProgress(); + + Ui::QDialogProgress *m_ui; +}; + +#endif // QDIALOGPROGRESS_H diff --git a/src/qdialogprogress.ui b/src/qdialogprogress.ui new file mode 100644 index 0000000..e191035 --- /dev/null +++ b/src/qdialogprogress.ui @@ -0,0 +1,177 @@ + + QDialogProgress + + + + 0 + 0 + 550 + 204 + + + + Dialog + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + Preparation: + + + + + + + 0 + + + + + + + Printing: + + + + + + + 0 + + + + + + + + + + + + + Elapsed time: + + + + + + + Qt::AlignCenter + + + true + + + QAbstractSpinBox::NoButtons + + + false + + + QDateTimeEdit::HourSection + + + hh:mm:ss + + + + + + + Estimated time: + + + + + + + Qt::AlignCenter + + + true + + + QAbstractSpinBox::NoButtons + + + false + + + QDateTimeEdit::HourSection + + + hh:mm:ss + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Result: + + + + + + + Qt::AlignCenter + + + true + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Abort + + + true + + + + + + + + diff --git a/src/qlightscribe.cpp b/src/qlightscribe.cpp index bbeecdd..ee821e1 100644 --- a/src/qlightscribe.cpp +++ b/src/qlightscribe.cpp @@ -146,8 +146,6 @@ QPixmap QLightScribe::preview( QLightDrive *drive, const PrintParameters ¶ms return pixmap; } -#include - void QLightScribe::print( QLightDrive *drive, const PrintParameters ¶ms, QCDScene *scene ) { QMutexLocker lock( m_mutex ); @@ -162,14 +160,6 @@ void QLightScribe::print( QLightDrive *drive, const PrintParameters ¶ms, QCD m_aborted = false; m_waitQueue->wakeOne(); - - while( !m_task->m_done ) - m_waitDone->wait( m_mutex ); - - std::cout << "print Error: " << m_task->m_error.toStdString() << std::endl; - - delete m_task; - m_task = 0; } void QLightScribe::abort() @@ -185,8 +175,6 @@ void QLightScribe::stopThread() m_waitQueue->wakeOne(); } -const size_t bitmapHeaderSize = 54; - bool QLightScribe::clAbortLabel() { return QLightScribe::instance()->m_aborted; @@ -194,22 +182,22 @@ bool QLightScribe::clAbortLabel() void QLightScribe::clReportPrepareProgress(long current, long final) { - std::cout << "clReportPrepareProgress - " << current << " final: " << final << std::endl; + emit instance()->prepareProgress( current, final ); } void QLightScribe::clReportLabelProgress(long current, long final) { - std::cout << "clReportLabelProgress - " << current << " final: " << final << std::endl; + emit instance()->labelProgress( current, final ); } void QLightScribe::clReportFinished(LSError status) { - std::cout << "clReporrFinished " << status << std::endl; + emit instance()->finished( status ); } bool QLightScribe::clReportLabelTimeEstimate(long time) { - std::cout << "clReportLabelTimeEstimate " << time << std::endl; + emit instance()->timeEstimate( time ); return false; } @@ -278,6 +266,8 @@ void QLightScribe::run() session.SetProgressCallback( &callbacks ); + const size_t bitmapHeaderSize = 54; + if( m_task->m_action == Task::preview ) { LS_Size size; @@ -301,40 +291,46 @@ void QLightScribe::run() size, true ); } else { + PrintParameters params = m_task->m_parameters; + delete m_task; + m_task = 0; + lock.unlock(); // print here - function = "LS_DiscPrinter_LockDriveTray"; - //printer.LockDriveTray(); + try { + //printer.AddExclusiveUse(); + //printer.LockDriveTray(); + session.PrintDisc( LS_windows_bitmap, + LS_LabelMode( params.m_labelMode ), + LS_DrawOptions( params.m_drawOptions ), + LS_PrintQuality( params.m_printQuality ), + LS_MediaOptimizationLevel( params.m_mediaOptimizationLevel ), + ba.data() + 14, + bitmapHeaderSize - 14, + ba.data() + bitmapHeaderSize, + ba.size() - bitmapHeaderSize ); + } + catch( LightScribe::LSException &ex ) { + emit finished( ex.GetCode() ); + throw; + } - function = "LS_DiscPrinter_AddExclusiveUse"; - //printer.AddExclusiveUse(); - - function = "LS_DiscPrintSession_Print"; - session.PrintDisc( LS_windows_bitmap, - LS_LabelMode( m_task->m_parameters.m_labelMode ), - LS_DrawOptions( m_task->m_parameters.m_drawOptions ), - LS_PrintQuality( m_task->m_parameters.m_printQuality ), - LS_MediaOptimizationLevel( m_task->m_parameters.m_mediaOptimizationLevel ), - ba.data() + 14, - bitmapHeaderSize - 14, - ba.data() + bitmapHeaderSize, - ba.size() - bitmapHeaderSize ); - - function = "LS_DiscPrinter_ReleaseExclusiveUse"; - //printer.ReleaseExclusiveUse(); - - function = "LS_DiscPrinter_UnlockDriveTray"; //printer.UnlockDriveTray(); + //printer.ReleaseExclusiveUse(); } function = ""; } } catch( LightScribe::LSException &ex ) { - m_task->m_error = function + tr( " failed with code 0x" ) + QString::number( ex.GetCode(), 16 ); + if( m_task ) + m_task->m_error = function + tr( " failed with code 0x" ) + QString::number( ex.GetCode(), 16 ); } catch( const QString &err ) { - m_task->m_error = err; + if( m_task ) + m_task->m_error = err; + } + if( m_task ) { + m_task->m_done = true; + m_waitDone->wakeAll(); } - m_task->m_done = true; - m_waitDone->wakeAll(); } } diff --git a/src/qlscribe.pro b/src/qlscribe.pro index 4dd70ce..2b183ac 100644 --- a/src/qlscribe.pro +++ b/src/qlscribe.pro @@ -15,7 +15,8 @@ SOURCES += main.cpp \ qdialogroundtext.cpp \ qlightscribe.cpp \ qdialogpixmap.cpp \ - qdialogprint.cpp + qdialogprint.cpp \ + qdialogprogress.cpp QMAKE_LIBS += -llightscribe HEADERS += mainwindow.h \ qgraphicsroundtextitem.h \ @@ -27,8 +28,10 @@ HEADERS += mainwindow.h \ qdialogroundtext.h \ qlightscribe.h \ qdialogpixmap.h \ - qdialogprint.h + qdialogprint.h \ + qdialogprogress.h FORMS += qdialogtext.ui \ qdialogroundtext.ui \ qdialogpixmap.ui \ - qdialogprint.ui + qdialogprint.ui \ + qdialogprogress.ui