From bfa2c336f62a70d9b34d5b641d11ccb6ca5d8803 Mon Sep 17 00:00:00 2001 From: Herwig Birke Date: Thu, 7 Nov 2019 09:11:11 +0100 Subject: [PATCH] initial commit --- cmainwindow.cpp | 215 +++++++++++++++++++++++++++++++-------------- cmainwindow.h | 8 +- cmainwindow.ui | 2 +- fileFormats.xlsx | Bin 0 -> 11688 bytes pictureConvert.pro | 1 + 5 files changed, 159 insertions(+), 67 deletions(-) create mode 100644 fileFormats.xlsx diff --git a/cmainwindow.cpp b/cmainwindow.cpp index ad04ad2..b2e0bc9 100644 --- a/cmainwindow.cpp +++ b/cmainwindow.cpp @@ -16,29 +16,12 @@ #include #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), @@ -47,53 +30,8 @@ cMainWindow::cMainWindow(cSplashScreen* lpSplashScreen, QWidget *parent) : initUI(); createActions(); + setImageFormats(); 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() @@ -173,12 +111,159 @@ void cMainWindow::createFileActions() { } +void cMainWindow::setImageFormats() +{ + QList readList = QImageReader::supportedImageFormats(); + QList writeList = QImageWriter::supportedImageFormats(); + + addImageFormat("bmp", "Windows Bitmap", "*.bmp", readList, writeList); + addImageFormat("gif", "Graphic Interchange Format (optional)", "*.gif", readList, writeList); + addImageFormat("jpg", "Joint Photographic Experts Group", "*.jpg", readList, writeList); + addImageFormat("png", "Portable Network Graphics", "*.png", readList, writeList); + addImageFormat("pbm", "Portable Bitmap", "*.pbm", readList, writeList); + addImageFormat("pgm", "Portable Graymap", "*.pgm", readList, writeList); + addImageFormat("ppm", "Portable Pixmap", "*.ppm", readList, writeList); + addImageFormat("xbm", "X11 Bitmap", "*.xbm", readList, writeList); + addImageFormat("xpm", "X11 Pixmap", "*.xpm", readList, writeList); + addImageFormat("svg", "Scalable Vector Graphics", "*.svg", readList, writeList); + addImageFormat("icns", "Apple Icon Image", "*.icns", readList, writeList); + addImageFormat("jp2", "Joint Photographic Experts Group 2000", "*.jp2", readList, writeList); + addImageFormat("mng", "Multiple-image Network Graphics", "*.mng", readList, writeList); + addImageFormat("tga", "Truevision Graphics Adapter", "*.tga", readList, writeList); + addImageFormat("tiff", "Tagged Image File Format", "*.tiff", readList, writeList); + addImageFormat("wbmp", "Wireless Bitmap", "*.wbmp", readList, writeList); + addImageFormat("webp", "WebP", "*.webp", readList, writeList); + addImageFormat("", "Hasselblad", "*.3fr", readList, writeList); + addImageFormat("", "Arri_Alexa", "*.ari", readList, writeList); + addImageFormat("", "Sony", "*.arw *.srf *.sr2", readList, writeList); + addImageFormat("", "Casio", "*.bay", readList, writeList); + addImageFormat("", "Blackmagic Design", "*.braw", readList, writeList); + addImageFormat("", "Cintel", "*.cri", readList, writeList); + addImageFormat("", "Canon", "*.crw *.cr2 *.cr3", readList, writeList); + addImageFormat("", "Phase_One", "*.cap *.iiq *.eip", readList, writeList); + addImageFormat("", "Kodak", "*.dcs *.dcr *.drf *.k25 *.kdc", readList, writeList); + addImageFormat("", "Adobe", "*.dng", readList, writeList); + addImageFormat("", "Epson", "*.erf", readList, writeList); + addImageFormat("", "Imacon/Hasselblad raw", "*.fff", readList, writeList); + addImageFormat("", "GoPro", "*.gpr", readList, writeList); + addImageFormat("", "Mamiya", "*.mef", readList, writeList); + addImageFormat("", "Minolta, Agfa", "*.mdc", readList, writeList); + addImageFormat("", "Leaf", "*.mos", readList, writeList); + addImageFormat("", "Minolta, Konica Minolta", "*.mrw", readList, writeList); + addImageFormat("", "Nikon", "*.nef *.nrw", readList, writeList); + addImageFormat("", "Olympus", "*.orf", readList, writeList); + addImageFormat("", "Pentax", "*.pef *.ptx", readList, writeList); + addImageFormat("", "Logitech", "*.pxn", readList, writeList); + addImageFormat("", "RED Digital Cinema", "*.R3D", readList, writeList); + addImageFormat("", "Fuji", "*.raf", readList, writeList); + addImageFormat("", "Panasonic", "*.raw *.rw2", readList, writeList); + addImageFormat("", "Leica", "*.raw *.rwl *.dng", readList, writeList); + addImageFormat("", "Rawzor", "*.rwz", readList, writeList); + addImageFormat("", "Samsung", "*.srw", readList, writeList); + addImageFormat("", "Sigma", "*.x3f", readList, writeList); +} + +void cMainWindow::addImageFormat(const char* shortName, const char* description, const char* extension, QList& readList, QList& writeList) +{ + bool r = readList.contains(QByteArray(shortName)); + bool w = writeList.contains(QByteArray(shortName)); + + if(QString(shortName).isEmpty()) + r = true; + + IMAGEFORMAT i; + i.shortName = shortName; + i.description = description; + i.extension = extension; + i.read = r; + i.write = w; + m_imageFormats.append(i); +} + +QString cMainWindow::generateReadList() +{ + QString all("all supported files ("); + QString readList; + + for(int z = 0;z < m_imageFormats.count();z++) + { + IMAGEFORMAT i = m_imageFormats[z]; + + if(i.read) + { + all.append(i.extension); + all.append(" "); + + readList.append(";;"); + readList.append(i.description); + readList.append(" ("); + readList.append(i.shortName); + readList.append(")"); + } + } + + readList.prepend(all); + return(readList); +} + +QString cMainWindow::generateWriteList() +{ + QString all("all supported files ("); + QString writeList; + + for(int z = 0;z < m_imageFormats.count();z++) + { + IMAGEFORMAT i = m_imageFormats[z]; + + if(i.write) + { + all.append(i.extension); + all.append(" "); + + writeList.append(";;"); + writeList.append(i.description); + writeList.append(" ("); + writeList.append(i.shortName); + writeList.append(")"); + } + } + + writeList.prepend(all); + return(writeList); +} + void cMainWindow::onAddFile() { + QSettings settings; + QString path = settings.value("import/oldPath", QVariant::fromValue(QDir::homePath())).toString(); + + QStringList fileList = QFileDialog::getOpenFileNames(this, "Import from", path, generateReadList()); + + if(fileList.isEmpty()) + return; + + QFileInfo info(fileList[0]); + + path = info.path(); + settings.setValue("import/oldPath", QVariant::fromValue(path)); + + for(int i = 0;i < fileList.count();i++) + onAddEntry(fileList[i]); } void cMainWindow::onAddFolder() { + QSettings settings; + QString path = settings.value("import/oldPath", QVariant::fromValue(QDir::homePath())).toString(); + + path = QFileDialog::getExistingDirectory(this, "Import from", path); + + if(path.isEmpty()) + return; + + settings.setValue("import/oldPath", QVariant::fromValue(path)); + + onAddEntry(path); } void cMainWindow::onRemoveSelected() diff --git a/cmainwindow.h b/cmainwindow.h index 2317dc9..b04974d 100644 --- a/cmainwindow.h +++ b/cmainwindow.h @@ -19,6 +19,7 @@ QT_END_NAMESPACE typedef struct tagIMAGEFORMAT { QString shortName; + QString description; QString extension; bool read; bool write; @@ -64,6 +65,11 @@ private slots: protected: void closeEvent(QCloseEvent* event); - void addImageFormat(const char* shortName, const char* extension); + + void setImageFormats(); + void addImageFormat(const char* shortName, const char* description, const char* extension, QList& readList, QList& writeList); + + QString generateReadList(); + QString generateWriteList(); }; #endif // CMAINWINDOW_H diff --git a/cmainwindow.ui b/cmainwindow.ui index 7327768..f428d0c 100644 --- a/cmainwindow.ui +++ b/cmainwindow.ui @@ -98,7 +98,7 @@ - TextLabel + diff --git a/fileFormats.xlsx b/fileFormats.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9b6a565b53a9f39d9aa44f4e39b26c18932b2a49 GIT binary patch literal 11688 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