diff options
| author | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
|---|---|---|
| committer | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
| commit | 7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch) | |
| tree | 4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/picstatus.cpp | |
| download | scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.gz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.xz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.zip | |
Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/picstatus.cpp')
| -rw-r--r-- | scribus/picstatus.cpp | 493 |
1 files changed, 493 insertions, 0 deletions
diff --git a/scribus/picstatus.cpp b/scribus/picstatus.cpp new file mode 100644 index 0000000..22362cd --- /dev/null +++ b/scribus/picstatus.cpp @@ -0,0 +1,493 @@ +/* +For general Scribus (>=1.3.2) copyright and licensing information please refer +to the COPYING file provided with the program. Following this notice may exist +a copyright and/or license notice that predates the release of Scribus 1.3.2 +for which a new license (GPL+exception) is in place. +*/ +/*************************************************************************** + picstatus.cpp - description + ------------------- + begin : Fri Nov 29 2001 + copyright : (C) 2001 by Franz Schmid + email : Franz.Schmid@altmuehlnet.de + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#include "picstatus.h" + +#include <QListWidget> +#include <QPushButton> +#include <QToolButton> +#include <QLabel> +#include <QCheckBox> +#include <QMessageBox> +#include <QPixmap> +#include <QFileInfo> +#include <QPainter> +#include <QAction> +#include <QMenu> +#include <cstdio> + +#include "commonstrings.h" +#include "effectsdialog.h" +#include "extimageprops.h" +#include "filesearch.h" +#include "pageitem.h" +#include "picsearch.h" +#include "picsearchoptions.h" +#include "scribuscore.h" +#include "scribusdoc.h" +#include "units.h" +#include "util_color.h" +#include "util_formats.h" +#include "util_icon.h" + + +PicItem::PicItem(QListWidget* parent, QString text, QPixmap pix, PageItem* pgItem) + : QListWidgetItem(pix, text, parent) +{ + PageItemObject = pgItem; +} + +PicStatus::PicStatus(QWidget* parent, ScribusDoc *docu) : QDialog( parent ) +{ + setupUi(this); + setModal(true); + imageViewArea->setIconSize(QSize(128, 128)); + imageViewArea->setContextMenuPolicy(Qt::CustomContextMenu); + m_Doc = docu; + currItem = NULL; + setWindowIcon(QIcon(loadIcon ( "AppIcon.png" ))); + fillTable(); + workTab->setCurrentIndex(0); + connect(closeButton, SIGNAL(clicked()), this, SLOT(accept())); + connect(imageViewArea, SIGNAL(itemSelectionChanged()), this, SLOT(newImageSelected())); + connect(isPrinting, SIGNAL(clicked()), this, SLOT(PrintPic())); + connect(isVisibleCheck, SIGNAL(clicked()), this, SLOT(visiblePic())); + connect(goPageButton, SIGNAL(clicked()), this, SLOT(GotoPic())); + connect(selectButton, SIGNAL(clicked()), this, SLOT(SelectPic())); + connect(searchButton, SIGNAL(clicked()), this, SLOT(SearchPic())); + connect(effectsButton, SIGNAL(clicked()), this, SLOT(doImageEffects())); + connect(buttonLayers, SIGNAL(clicked()), this, SLOT(doImageExtProp())); + connect(buttonEdit, SIGNAL(clicked()), this, SLOT(doEditImage())); + connect(imageViewArea, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(slotRightClick())); +} + +QPixmap PicStatus::createImgIcon(PageItem* item) +{ + QPainter p; + QPixmap pm(128, 128); + QBrush b(QColor(205,205,205), loadIcon("testfill.png")); + p.begin(&pm); + p.fillRect(0, 0, 128, 128, imageViewArea->palette().window()); + p.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); + p.setBrush(palette().window()); + p.drawRoundRect(0, 0, 127, 127, 10, 10); + p.setPen(Qt::NoPen); + p.setBrush(b); + p.drawRect(12, 12, 104, 104); + if (item->PictureIsAvailable && QFile::exists(item->externalFile())) + { + QImage im2 = item->pixm.scaled(104, 104, Qt::KeepAspectRatio, Qt::SmoothTransformation); + p.drawImage((104 - im2.width()) / 2 + 12, (104 - im2.height()) / 2 + 12, im2); + } + else + { + p.setBrush(Qt::NoBrush); + p.setPen(QPen(Qt::red, 2, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); + p.drawLine(12, 12, 116, 116); + p.drawLine(12, 116, 116, 12); + } + p.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); + p.setBrush(Qt::NoBrush); + p.drawRect(12, 12, 104, 104); + p.end(); + return pm; +} + +void PicStatus::fillTable() +{ + PageItem *item; + imageViewArea->clear(); + QListWidgetItem *firstItem=0; + QListWidgetItem *tempItem=0; + + for (int i = 0; i < m_Doc->MasterItems.count(); ++i) + { + item = m_Doc->MasterItems.at(i); + QFileInfo fi = QFileInfo(item->Pfile); + QString Iname = ""; + if (item->isInlineImage) + Iname = tr("Embedded Image"); + else + Iname = fi.fileName(); + if ((item->itemType() == PageItem::ImageFrame) && (!item->asLatexFrame())) + tempItem = new PicItem(imageViewArea, Iname, createImgIcon(item), item); + if (firstItem == 0) + firstItem = tempItem; + } + + for (int i = 0; i < m_Doc->DocItems.count(); ++i) + { + item = m_Doc->DocItems.at(i); + QFileInfo fi = QFileInfo(item->Pfile); + QString Iname = ""; + if (item->isInlineImage) + Iname = tr("Embedded Image"); + else + Iname = fi.fileName(); + if ((item->itemType() == PageItem::ImageFrame) && (!item->asLatexFrame())) + tempItem = new PicItem(imageViewArea, Iname, createImgIcon(item), item); + // if an image is selected in a doc, Manage Pictures should + // display the selected image and its values + if (firstItem == 0 || item->isSelected()) + firstItem = tempItem; + } + imageViewArea->setCurrentItem(firstItem); + if (firstItem!=0) + imageSelected(firstItem); + + // Disable all features when there is no image in the document. + // It should never be used (see ScribusMainWindow::extrasMenuAboutToShow()) + // but who knows if it can be configured for shortcut or macro... + imageViewArea->setEnabled(imageViewArea->count() > 0); + workTab->setEnabled(imageViewArea->count() > 0); + sortByName(); +} + +void PicStatus::sortByName() +{ + QListWidgetItem *firstItem = 0; + QMap<QString, PicItem*> sorted; + int num = imageViewArea->count(); + if (num != 0) + { + firstItem = imageViewArea->currentItem(); + for (int a = num-1; a > -1; --a) + { + QListWidgetItem *ite = imageViewArea->takeItem(a); + PicItem *item = (PicItem*)ite; + QFileInfo fi = QFileInfo(item->PageItemObject->Pfile); + sorted.insertMulti(fi.fileName(), item); + } + int counter = 0; + foreach (QString i, sorted.uniqueKeys()) + { + foreach (PicItem* val, sorted.values(i)) + { + imageViewArea->insertItem(counter, val); + counter++; + } + } + imageViewArea->setCurrentItem(firstItem); + imageSelected(firstItem); + sortOrder = 0; + } +} + +void PicStatus::sortByPage() +{ + QListWidgetItem *firstItem = 0; + QMap<int, PicItem*> sorted; + int num = imageViewArea->count(); + if (num != 0) + { + firstItem = imageViewArea->currentItem(); + for (int a = num-1; a > -1; --a) + { + QListWidgetItem *ite = imageViewArea->takeItem(a); + PicItem *item = (PicItem*)ite; + sorted.insertMulti(item->PageItemObject->OwnPage, item); + } + int counter = 0; + foreach (int i, sorted.uniqueKeys()) + { + foreach (PicItem* val, sorted.values(i)) + { + imageViewArea->insertItem(counter, val); + counter++; + } + } + imageViewArea->setCurrentItem(firstItem); + imageSelected(firstItem); + sortOrder = 1; + } +} + +void PicStatus::slotRightClick() +{ + QMenu *pmen = new QMenu(); + qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor)); + QAction* Act1 = pmen->addAction( tr("Sort by Name")); + Act1->setCheckable(true); + QAction* Act2 = pmen->addAction( tr("Sort by Page")); + Act2->setCheckable(true); + if (sortOrder == 0) + Act1->setChecked(true); + else if (sortOrder == 1) + Act2->setChecked(true); + connect(Act1, SIGNAL(triggered()), this, SLOT(sortByName())); + connect(Act2, SIGNAL(triggered()), this, SLOT(sortByPage())); + pmen->exec(QCursor::pos()); + delete pmen; +} + +void PicStatus::newImageSelected() +{ + QList<QListWidgetItem*> items = imageViewArea->selectedItems(); + imageSelected((items.count() > 0) ? items.at(0) : NULL); +} + +void PicStatus::imageSelected(QListWidgetItem *ite) +{ + if (ite != NULL) + { + PicItem *item = (PicItem*)ite; + currItem = item->PageItemObject; + if (!currItem->OnMasterPage.isEmpty()) + displayPage->setText(currItem->OnMasterPage); + else + { + if (currItem->OwnPage == -1) + displayPage->setText( tr("Not on a Page")); + else + displayPage->setText(QString::number(currItem->OwnPage + 1)); + } + displayObjekt->setText(currItem->itemName()); + if (currItem->PictureIsAvailable) + { + QFileInfo fi = QFileInfo(currItem->Pfile); + QString ext = fi.suffix().toLower(); + if (currItem->isInlineImage) + { + displayName->setText( tr("Embedded Image")); + displayPath->setText(""); + searchButton->setEnabled(false); + } + else + { + displayName->setText(fi.fileName()); + displayPath->setText(QDir::toNativeSeparators(fi.path())); + searchButton->setEnabled(true); + } + QString format = ""; + switch (currItem->pixm.imgInfo.type) + { + case 0: + format = tr("JPG"); + break; + case 1: + format = tr("TIFF"); + break; + case 2: + format = tr("PSD"); + break; + case 3: + format = tr("EPS/PS"); + break; + case 4: + format = tr("PDF"); + break; + case 5: + format = tr("JPG2000"); + break; + case 6: + format = ext.toUpper(); + break; + case 7: + format = tr("emb. PSD"); + break; + } + displayFormat->setText(format); + QString cSpace; + if ((extensionIndicatesPDF(ext) || extensionIndicatesEPSorPS(ext)) && (currItem->pixm.imgInfo.type != ImageType7)) + cSpace = tr("Unknown"); + else + cSpace=colorSpaceText(currItem->pixm.imgInfo.colorspace); + displayColorspace->setText(cSpace); + displayDPI->setText(QString("%1 x %2").arg(qRound(currItem->pixm.imgInfo.xres)).arg(qRound(currItem->pixm.imgInfo.yres))); + displayEffDPI->setText(QString("%1 x %2").arg(qRound(72.0 / currItem->imageXScale())).arg(qRound(72.0 / currItem->imageYScale()))); + displaySizePixel->setText(QString("%1 x %2").arg(currItem->OrigW).arg(currItem->OrigH)); + displayScale->setText(QString("%1 x %2 %").arg(currItem->imageXScale() * 100 / 72.0 * currItem->pixm.imgInfo.xres, 5, 'f', 1).arg(currItem->imageYScale() * 100 / 72.0 * currItem->pixm.imgInfo.yres, 5, 'f', 1)); + displayPrintSize->setText(QString("%1 x %2%3").arg(currItem->OrigW * currItem->imageXScale() * m_Doc->unitRatio(), 7, 'f', 2).arg(currItem->OrigH * currItem->imageXScale() * m_Doc->unitRatio(), 7, 'f', 2).arg(unitGetSuffixFromIndex(m_Doc->unitIndex()))); + isPrinting->setChecked(currItem->printEnabled()); + isVisibleCheck->setChecked(currItem->imageShown()); + buttonEdit->setEnabled(currItem->isRaster); + effectsButton->setEnabled(currItem->isRaster); + buttonLayers->setEnabled(currItem->pixm.imgInfo.valid); + } + else + { + QString trNA = tr("n/a"); + if (!currItem->Pfile.isEmpty()) + { + QFileInfo fi = QFileInfo(currItem->Pfile); + displayName->setText(fi.fileName()); + displayPath->setText(QDir::toNativeSeparators(fi.path())); + searchButton->setEnabled(true); + } + else + { + displayName->setText(trNA); + displayPath->setText(trNA); + searchButton->setEnabled(false); + } + displayFormat->setText(trNA); + displayColorspace->setText(trNA); + displayDPI->setText(trNA); + displayEffDPI->setText(trNA); + displaySizePixel->setText(trNA); + displayScale->setText(trNA); + displayPrintSize->setText(trNA); + buttonEdit->setEnabled(false); + effectsButton->setEnabled(false); + buttonLayers->setEnabled(false); + } + } + else + { + currItem = NULL; + imageViewArea->clearSelection(); + } +} + +void PicStatus::PrintPic() +{ + if (currItem != NULL) + currItem->setPrintEnabled(isPrinting->isChecked()); +} + +void PicStatus::visiblePic() +{ + if (currItem != NULL) + { + currItem->setImageShown(isVisibleCheck->isChecked()); + emit refreshItem(currItem); + } +} + +void PicStatus::GotoPic() +{ + if (currItem != NULL) + { + ScCore->primaryMainWindow()->closeActiveWindowMasterPageEditor(); + if (!currItem->OnMasterPage.isEmpty()) + emit selectMasterPage(currItem->OnMasterPage); + else + emit selectPage(currItem->OwnPage); + } +} + +void PicStatus::SelectPic() +{ + if (currItem == NULL) + return; + + ScCore->primaryMainWindow()->closeActiveWindowMasterPageEditor(); + if (currItem->Groups.count() == 0) + emit selectElement(currItem->OwnPage, currItem->ItemNr, false); + else + { + if (currItem->isGroupControl) + emit selectElement(currItem->OwnPage, currItem->ItemNr, false); + else + emit selectElement(currItem->OwnPage, currItem->ItemNr, true); + } +} + +bool PicStatus::loadPict(const QString & newFilePath) +{ + // Hack to fool the LoadPict function + currItem->Pfile = newFilePath; + bool masterPageMode = !currItem->OnMasterPage.isEmpty(); + bool oldMasterPageMode = m_Doc->masterPageMode(); + if (masterPageMode != oldMasterPageMode) + m_Doc->setMasterPageMode(masterPageMode); + m_Doc->LoadPict(newFilePath, currItem->ItemNr, true); + if (masterPageMode != oldMasterPageMode) + m_Doc->setMasterPageMode(oldMasterPageMode); + return currItem->PictureIsAvailable; +} + +void PicStatus::SearchPic() +{ + // no action where is no item selected. It should never happen. + if (currItem == NULL) + return; + static QString lastSearchPath; + + if (lastSearchPath.isEmpty()) + lastSearchPath = displayPath->text(); + PicSearchOptions *dia = new PicSearchOptions(this, displayName->text(), lastSearchPath); + if (dia->exec()) + { + lastSearchPath = dia->getLastDirSearched(); + if (dia->getMatches().count() == 0) + { + QMessageBox::information(this, tr("Scribus - Image Search"), tr("No images named \"%1\" were found.").arg(dia->getFileName()), + QMessageBox::Ok|QMessageBox::Default|QMessageBox::Escape, + QMessageBox::NoButton); + } + else + { + PicSearch *dia2 = new PicSearch(this, dia->getFileName(), dia->getMatches()); + if (dia2->exec()) + { + Q_ASSERT(!dia2->currentImage.isEmpty()); + loadPict(dia2->currentImage); + refreshItem(currItem); + QFileInfo fi = QFileInfo(currItem->Pfile); + imageViewArea->currentItem()->setText(fi.fileName()); + imageViewArea->currentItem()->setIcon(createImgIcon(currItem)); + imageSelected(imageViewArea->currentItem()); + } + delete dia2; + } + } + delete dia; +} + +void PicStatus::doImageEffects() +{ + if (currItem == NULL) + return; + + EffectsDialog* dia = new EffectsDialog(this, currItem, m_Doc); + if (dia->exec()) + { + currItem->effectsInUse = dia->effectsList; + loadPict(currItem->Pfile); + refreshItem(currItem); + imageViewArea->currentItem()->setIcon(createImgIcon(currItem)); + } + delete dia; +} + +void PicStatus::doImageExtProp() +{ + if (currItem != NULL) + { + ExtImageProps* dia = new ExtImageProps(this, &currItem->pixm.imgInfo, currItem, m_Doc->view()); + dia->exec(); + loadPict(currItem->Pfile); + refreshItem(currItem); + imageViewArea->currentItem()->setIcon(createImgIcon(currItem)); + delete dia; + } +} + +void PicStatus::doEditImage() +{ + if (currItem != NULL) + { + SelectPic(); + ScCore->primaryMainWindow()->callImageEditor(); + } +} |
