diff --git a/cimage.cpp b/cimage.cpp index 0031ca2..1c9caa2 100644 --- a/cimage.cpp +++ b/cimage.cpp @@ -12,6 +12,7 @@ #include #include +#include cImage::cImage() : @@ -98,7 +99,6 @@ bool cImage::load(const QString &fileName, const char *format) return(loadRAW(fileName)); } - bool cImage::openBuffer(const QString &fileName, const QSharedPointer& ba, LibRaw& iProcessor) { int error = LIBRAW_DATA_ERROR; @@ -378,6 +378,7 @@ bool cImage::loadRAW(const QString &fileName) detectSpecialCamera(iProcessor); int error = iProcessor.unpack(); + if(strcmp(iProcessor.version(), "0.13.5") != 0) // fixes a bug specific to libraw 13 - version call is UNTESTED iProcessor.raw2image(); diff --git a/cmainwindow.cpp b/cmainwindow.cpp index 4493555..ad04ad2 100644 --- a/cmainwindow.cpp +++ b/cmainwindow.cpp @@ -16,29 +16,84 @@ #include #include +#include #include +void cMainWindow::addImageFormat(const char* shortName, const char* extension) +{ + QList readList = QImageReader::supportedImageFormats(); + QList writeList = QImageWriter::supportedImageFormats(); + + bool r = readList.contains(QByteArray(shortName)); + bool w = writeList.contains(QByteArray(shortName)); + + if(QString(shortName).isEmpty()) + r = true; + + IMAGEFORMAT i; + i.shortName = shortName; + i.extension = extension; + i.read = r; + i.write = w; + m_imageFormats.append(i); +} + cMainWindow::cMainWindow(cSplashScreen* lpSplashScreen, QWidget *parent) : QMainWindow(parent), ui(new Ui::cMainWindow), m_lpSplashScreen(lpSplashScreen) { -// QImageWriter writer; -// QList list = writer.supportedImageFormats(); - -// writer.setFormat("jpg"); -// QList list1 = writer.supportedSubTypes(); - -// bool b; - -// b = writer.supportsOption(QImageIOHandler::CompressionRatio); -// b = writer.supportsOption(QImageIOHandler::Quality); - initUI(); createActions(); onClearList(); + + addImageFormat("bmp", "Windows Bitmap (*.bmp)"); + addImageFormat("gif", "Graphic Interchange Format (optional) (*.gif)"); + addImageFormat("jpg", "Joint Photographic Experts Group (*.jpg)"); + addImageFormat("png", "Portable Network Graphics (*.png)"); + addImageFormat("pbm", "Portable Bitmap (*.pbm)"); + addImageFormat("pgm", "Portable Graymap (*.pgm)"); + addImageFormat("ppm", "Portable Pixmap (*.ppm)"); + addImageFormat("xbm", "X11 Bitmap (*.xbm)"); + addImageFormat("xpm", "X11 Pixmap (*.xpm)"); + addImageFormat("svg", "Scalable Vector Graphics (*.svg)"); + addImageFormat("icns", "Apple Icon Image (*.icns)"); + addImageFormat("jp2", "Joint Photographic Experts Group 2000 (*.jp2)"); + addImageFormat("mng", "Multiple-image Network Graphics (*.mng)"); + addImageFormat("tga", "Truevision Graphics Adapter (*.tga)"); + addImageFormat("tiff", "Tagged Image File Format (*.tiff)"); + addImageFormat("wbmp", "Wireless Bitmap (*.wbmp)"); + addImageFormat("webp", "WebP (*.webp)"); + addImageFormat("", "Hasselblad (*.3fr)"); + addImageFormat("", "Arri_Alexa (*.ari)"); + addImageFormat("", "Sony (*.arw *.srf *.sr2)"); + addImageFormat("", "Casio (*.bay)"); + addImageFormat("", "Blackmagic Design (*.braw)"); + addImageFormat("", "Cintel (*.cri)"); + addImageFormat("", "Canon (*.crw *.cr2 *.cr3)"); + addImageFormat("", "Phase_One (*.cap *.iiq *.eip)"); + addImageFormat("", "Kodak (*.dcs *.dcr *.drf *.k25 *.kdc)"); + addImageFormat("", "Adobe (*.dng)"); + addImageFormat("", "Epson (*.erf)"); + addImageFormat("", "Imacon/Hasselblad raw (*.fff)"); + addImageFormat("", "GoPro (*.gpr)"); + addImageFormat("", "Mamiya (*.mef)"); + addImageFormat("", "Minolta, Agfa (*.mdc)"); + addImageFormat("", "Leaf (*.mos)"); + addImageFormat("", "Minolta, Konica Minolta (*.mrw)"); + addImageFormat("", "Nikon (*.nef *.nrw)"); + addImageFormat("", "Olympus (*.orf)"); + addImageFormat("", "Pentax (*.pef *.ptx)"); + addImageFormat("", "Logitech (*.pxn)"); + addImageFormat("", "RED Digital Cinema (*.R3D)"); + addImageFormat("", "Fuji (*.raf)"); + addImageFormat("", "Panasonic (*.raw *.rw2)"); + addImageFormat("", "Leica (*.raw *.rwl *.dng)"); + addImageFormat("", "Rawzor (*.rwz)"); + addImageFormat("", "Samsung (*.srw)"); + addImageFormat("", "Sigma (*.x3f)"); } cMainWindow::~cMainWindow() @@ -58,20 +113,25 @@ void cMainWindow::closeEvent(QCloseEvent *event) else settings.setValue("main/maximized", QVariant::fromValue(false)); + settings.setValue("main/thumbnailSize", QVariant::fromValue(ui->m_lpThumbnailSize->value())); + event->accept(); } void cMainWindow::initUI() { + QSettings settings; + ui->setupUi(this); + ui->m_lpThumbnailSize->setValue(settings.value("main/thumbnailSize", QVariant::fromValue(128)).toInt()); + onThumbnailSize(ui->m_lpThumbnailSize->value()); + QIcon::setThemeName("TangoMFK"); m_lpFileListModel = new QStandardItemModel; ui->m_lpFileList->setModel(m_lpFileListModel); - QSettings settings; - if(!settings.value("main/maximized").toBool()) { qint32 iX = settings.value("main/x", QVariant::fromValue(-1)).toInt(); @@ -101,6 +161,8 @@ void cMainWindow::createActions() connect(ui->m_lpConvert, &QPushButton::clicked, this, &cMainWindow::onConvert); connect(ui->m_lpFileList, &cTreeView::addEntry, this, &cMainWindow::onAddEntry); + + connect(ui->m_lpThumbnailSize, &QSlider::valueChanged, this, &cMainWindow::onThumbnailSize); } void cMainWindow::createContextActions() @@ -144,6 +206,9 @@ void cMainWindow::onAddEntry(const QString& file) if(mimeType.name().startsWith("image")) addFile(file); } + + for(int i = 0;i < m_lpFileListModel->columnCount();i++) + ui->m_lpFileList->resizeColumnToContents(i); } void cMainWindow::addPath(const QString& path) @@ -177,14 +242,17 @@ void cMainWindow::addFile(const QString& file) items.append(new QStandardItem(info.path())); items.append(new QStandardItem(info.fileName())); - items.append(new QStandardItem(QString::number(info.size()))); - items.append(new QStandardItem(info.birthTime().toString("dd.MM.yyyy hh:mm:ss"))); + items.append(new QStandardItem(QString::number(info.size()/1024)+" kb")); + items.append(new QStandardItem(lpExif->dateTime().toString("dd.MM.yyyy hh:mm:ss"))); items.append(new QStandardItem(QString::number(lpExif->imageWidth()))); items.append(new QStandardItem(QString::number(lpExif->imageHeight()))); - items[3]->setTextAlignment(Qt::AlignRight); - items[4]->setTextAlignment(Qt::AlignRight); - items[5]->setTextAlignment(Qt::AlignRight); + items[0]->setIcon(QIcon(QPixmap::fromImage(lpExif->thumbnail()))); + items[0]->setCheckable(true); + items[2]->setTextAlignment(Qt::AlignRight | Qt::AlignCenter); + items[3]->setTextAlignment(Qt::AlignRight | Qt::AlignCenter); + items[4]->setTextAlignment(Qt::AlignRight | Qt::AlignCenter); + items[5]->setTextAlignment(Qt::AlignRight | Qt::AlignCenter); items[0]->setData(QVariant::fromValue(lpExif), Qt::UserRole+1); @@ -232,3 +300,9 @@ void cMainWindow::onConvert() image.save(newFile); } } + +void cMainWindow::onThumbnailSize(int size) +{ + ui->m_lpThumbnailSizeValue->setText(QString::number(size)); + ui->m_lpFileList->setIconSize(QSize(size, size)); +} diff --git a/cmainwindow.h b/cmainwindow.h index 4a2aef4..2317dc9 100644 --- a/cmainwindow.h +++ b/cmainwindow.h @@ -15,6 +15,16 @@ QT_BEGIN_NAMESPACE namespace Ui { class cMainWindow; } QT_END_NAMESPACE + +typedef struct tagIMAGEFORMAT +{ + QString shortName; + QString extension; + bool read; + bool write; +} IMAGEFORMAT; + + class cMainWindow : public QMainWindow { Q_OBJECT @@ -29,6 +39,7 @@ private: QStandardItemModel* m_lpFileListModel; QMimeDatabase m_mimeDB; + QList m_imageFormats; void initUI(); @@ -48,9 +59,11 @@ private slots: void onClearList(); void onConvert(); + void onThumbnailSize(int size); void onAddEntry(const QString& file); protected: void closeEvent(QCloseEvent* event); + void addImageFormat(const char* shortName, const char* extension); }; #endif // CMAINWINDOW_H diff --git a/cmainwindow.ui b/cmainwindow.ui index f6eb7bb..7327768 100644 --- a/cmainwindow.ui +++ b/cmainwindow.ui @@ -11,7 +11,7 @@ - cMainWindow + @@ -80,19 +80,21 @@ true - QAbstractItemView::MultiSelection + QAbstractItemView::ExtendedSelection + + + + 0 + 0 + + + + false - - - - TextLabel - - - @@ -106,6 +108,53 @@ + + + + + + thumbnail size: + + + + + + + 16 + + + 150 + + + 16 + + + Qt::Horizontal + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + +