diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 43a3ce6..c74bb9b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -25,14 +25,14 @@ SET( QLSCRIBE_SRCS main.cpp mainwindow.cpp qcdscene.cpp qcdview.cpp qdialogpixmap.cpp qdialogroundtext.cpp qdialogtext.cpp qlightroundtextitem.cpp qlightscribe.cpp qshapefactory.cpp qlighttextitem.cpp qlightpixmapitem.cpp qdialogprint.cpp qdialogprogress.cpp qdialogcdproperties.cpp qconsoleprintprogress.cpp - qdialogsettings.cpp ) + qdialogsettings.cpp previewinjector.cpp ) SET( QLSCRIBE_UIS qdialogtext.ui qdialogroundtext.ui qdialogpixmap.ui qdialogprint.ui qdialogprogress.ui qdialogcdproperties.ui qdialogsettings.ui ) SET( QLSCRIBE_MOC_HDRS mainwindow.h qcdscene.h qdialogpixmap.h qdialogroundtext.h qdialogtext.h qlightscribe.h qdialogprint.h qdialogprogress.h - qdialogcdproperties.h qconsoleprintprogress.h qdialogsettings.h ) + qdialogcdproperties.h qconsoleprintprogress.h qdialogsettings.h previewinjector.h ) ADD_DEFINITIONS( -Wall ) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 722fde1..aface6f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -28,6 +28,7 @@ #include "qdialogprogress.h" #include "qdialogcdproperties.h" #include "qdialogsettings.h" +#include "previewinjector.h" #include #include @@ -337,11 +338,16 @@ void MainWindow::onMenuOpen() } filter += tr( ");;All Files (*)" ); - QString fileName = QFileDialog::getOpenFileName( this, - tr( "Open:" ), - QString(), - filter ); - + QFileDialog fd( this, "Open:", QString(), filter ); + + bool injectPreview = QSettings().value( cfgInjectPreview, true ).toBool(); + PreviewInjector pj( injectPreview ? &fd : 0 ); + fd.setFileMode( QFileDialog::ExistingFile ); + + if( fd.exec() != QDialog::Accepted ) + return; + + QString fileName = fd.selectedFiles().value(0); if( fileName.isNull() ) return; diff --git a/src/previewinjector.cpp b/src/previewinjector.cpp new file mode 100644 index 0000000..5a35e4b --- /dev/null +++ b/src/previewinjector.cpp @@ -0,0 +1,61 @@ +#include "previewinjector.h" + +#include +#include +#include +#include + +PreviewInjector::PreviewInjector( QFileDialog * dl ) : + m_label( 0 ), + m_size( 160, 120 ) +{ + if( !dl ) + return; + + QSplitter *sp = qFindChild( dl, "splitter" ); + if( !sp ) + return; + + m_label = new QLabel; + m_label->resize( m_size ); + sp->addWidget( m_label ); + connect( dl, SIGNAL(currentChanged(QString)),SLOT(onSelectionChanged(QString))); +} + +PreviewInjector::~PreviewInjector() +{ + delete m_label; +} + +void PreviewInjector::onSelectionChanged(QString file) +{ + QImageReader reader( file ); + + if( !reader.canRead() ) { + m_label->setPixmap( QPixmap() ); + return; + } + + m_label->resize( m_size ); + QSize toSize = m_size; + QSize sz = reader.size(); + if( !sz.isNull() ) { + double r1 = m_label->size().width() / double( sz.width() ); + double r2 = m_label->size().height() / double( sz.height() ); + + double ratio = std::max( r1, r2 ); + if( ratio < 1.0 ) { + toSize.setWidth( sz.width() * ratio ); + toSize.setHeight( sz.height() * ratio ); + } + } + + reader.setScaledSize( toSize ); + QImage img = reader.read(); + if( img.isNull() ) { + m_label->setPixmap( QPixmap() ); + return; + } + m_label->setPixmap( QPixmap::fromImage( img ) ); +} + diff --git a/src/previewinjector.h b/src/previewinjector.h new file mode 100644 index 0000000..d4a3a8e --- /dev/null +++ b/src/previewinjector.h @@ -0,0 +1,27 @@ +#ifndef PREVIEWINJECTOR_HPP +#define PREVIEWINJECTOR_HPP + +#include +#include + +class QFileDialog; +class QLabel; + +class PreviewInjector : public QObject { + Q_OBJECT +public: + + PreviewInjector( QFileDialog * dl ); + ~PreviewInjector(); + + bool injected() const { return m_label; } + +private slots: + void onSelectionChanged(QString ); + +private: + QLabel *m_label; + QSize m_size; +}; + +#endif // PREVIEWINJECTOR_HPP diff --git a/src/qdialogpixmap.cpp b/src/qdialogpixmap.cpp index 4e80966..8672a6b 100644 --- a/src/qdialogpixmap.cpp +++ b/src/qdialogpixmap.cpp @@ -22,10 +22,12 @@ #include "ui_qdialogpixmap.h" #include "qlightpixmapitem.h" #include "qcdscene.h" +#include "previewinjector.h" #include #include #include +#include QDialogPixmap::QDialogPixmap(QWidget *parent) : QItemDialog( parent ), @@ -119,7 +121,18 @@ void QDialogPixmap::onLoadImage() filter += QString( "*." ) + arr.data() + " "; } filter += tr( ");;All Files (*.*)" ); - QString fileName = QFileDialog::getOpenFileName( this, "Load image:", QString(), filter ); + + QFileDialog fd( this, "Load image:", QString(), filter ); + fd.setOption( QFileDialog::DontUseNativeDialog ); // for testing + + bool injectPreview = QSettings().value( cfgInjectPreview, true ).toBool(); + PreviewInjector pj( injectPreview ? &fd : 0 ); + fd.setFileMode( QFileDialog::ExistingFile ); + + if( fd.exec() != QDialog::Accepted ) + return; + + QString fileName = fd.selectedFiles().value(0); if( fileName.isNull() ) return; diff --git a/src/qdialogsettings.cpp b/src/qdialogsettings.cpp index 1c73977..4a41acc 100644 --- a/src/qdialogsettings.cpp +++ b/src/qdialogsettings.cpp @@ -60,11 +60,13 @@ bool QDialogSettings::exec( QWidget *parent ) dialog.m_font = sts.value( cfgDefaultFont ).value(); dialog.m_ui->fontName->setCurrentFont( dialog.m_font ); dialog.m_ui->chkEject->setChecked( sts.value( cfgEjectAfterFinish, false ).toBool() ); + dialog.m_ui->chkPreview->setChecked( sts.value( cfgInjectPreview, true ).toBool() ); if( dialog.QDialog::exec() == Rejected ) return false; sts.setValue( cfgDefaultFont, dialog.m_font ); sts.setValue( cfgEjectAfterFinish, dialog.m_ui->chkEject->isChecked() ); + sts.setValue( cfgInjectPreview, dialog.m_ui->chkPreview->isChecked() ); return true; } diff --git a/src/qdialogsettings.ui b/src/qdialogsettings.ui index 8174e44..b628f7f 100644 --- a/src/qdialogsettings.ui +++ b/src/qdialogsettings.ui @@ -1,48 +1,49 @@ - + + QDialogSettings - - + + Qt::NonModal - + 0 0 - 305 - 156 + 320 + 170 - + Settings - + false - + - - + + QFrame::StyledPanel - + QFrame::Raised - + - - - - + + + + Default font: - - - + + + false - + false @@ -50,13 +51,13 @@ - + - - + + Qt::Horizontal - + 40 20 @@ -65,15 +66,15 @@ - - + + Font... - - + + Last used @@ -81,21 +82,28 @@ - - + + Eject tray after finish + + + + Enable image preview in open dialog + + + - - + + Qt::Horizontal - + QDialogButtonBox::Cancel|QDialogButtonBox::Ok @@ -110,11 +118,11 @@ QDialogSettings accept() - + 248 254 - + 157 274 @@ -126,11 +134,11 @@ QDialogSettings reject() - + 316 260 - + 286 274 diff --git a/src/qlscribe.h.in b/src/qlscribe.h.in index 2ae2047..eb43d17 100644 --- a/src/qlscribe.h.in +++ b/src/qlscribe.h.in @@ -67,6 +67,7 @@ const char * const DBusManagerPath = "@QLSCRIBE_DBUS_MANAGER_PATH@"; // config keys const char * const cfgDefaultFont = "DefaultTextFont"; const char * const cfgEjectAfterFinish = "EjectAfterFinish"; +const char * const cfgInjectPreview = "InjectPreview"; #endif // QLSCRIBE_H diff --git a/src/qlscribe.pro b/src/qlscribe.pro index 6f889b5..0ca9645 100644 --- a/src/qlscribe.pro +++ b/src/qlscribe.pro @@ -21,7 +21,8 @@ SOURCES += main.cpp \ qlightpixmapitem.cpp \ qdialogcdproperties.cpp \ qconsoleprintprogress.cpp \ - qdialogsettings.cpp + qdialogsettings.cpp \ + previewinjector.cpp QMAKE_LIBS += -llightscribe HEADERS += mainwindow.h \ qlightroundtextitem.h \ @@ -38,7 +39,8 @@ HEADERS += mainwindow.h \ qlightpixmapitem.h \ qdialogcdproperties.h \ qconsoleprintprogress.h \ - qdialogsettings.h + qdialogsettings.h \ + previewinjector.h FORMS += qdialogtext.ui \ qdialogroundtext.ui \ qdialogpixmap.ui \