Subversion Repositories Scribus

Rev

Rev 17510 | Rev 18194 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
3 paul 7
/***************************************************************************
8
                          picstatus.cpp  -  description
9
                             -------------------
10
    begin                : Fri Nov 29 2001
11
    copyright            : (C) 2001 by Franz Schmid
12
    email                : Franz.Schmid@altmuehlnet.de
13
 ***************************************************************************/
14
 
15
/***************************************************************************
16
 *                                                                         *
17
 *   This program is free software; you can redistribute it and/or modify  *
18
 *   it under the terms of the GNU General Public License as published by  *
19
 *   the Free Software Foundation; either version 2 of the License, or     *
20
 *   (at your option) any later version.                                   *
21
 *                                                                         *
22
 ***************************************************************************/
9943 fschmid 23
#include "picstatus.h"
24
 
25
#include <QListWidget>
26
#include <QPushButton>
27
#include <QToolButton>
28
#include <QLabel>
29
#include <QCheckBox>
30
#include <QMessageBox>
8501 cbradney 31
#include <QPixmap>
9943 fschmid 32
#include <QFileInfo>
33
#include <QPainter>
11207 fschmid 34
#include <QAction>
35
#include <QMenu>
3 paul 36
#include <cstdio>
7214 subik 37
 
10203 cbradney 38
#include "commonstrings.h"
39
#include "effectsdialog.h"
40
#include "extimageprops.h"
41
#include "filesearch.h"
42
#include "pageitem.h"
3 paul 43
#include "picsearch.h"
8377 fschmid 44
#include "picsearchoptions.h"
10203 cbradney 45
#include "scribuscore.h"
838 cbradney 46
#include "scribusdoc.h"
10601 mrdocs 47
#include "units.h"
10203 cbradney 48
#include "util_color.h"
10212 cbradney 49
#include "util_formats.h"
10200 cbradney 50
#include "util_icon.h"
6548 subik 51
 
10203 cbradney 52
 
9943 fschmid 53
PicItem::PicItem(QListWidget* parent, QString text, QPixmap pix, PageItem* pgItem)
54
        : QListWidgetItem(pix, text, parent)
8372 fschmid 55
{
56
        PageItemObject = pgItem;
57
}
3205 craig 58
 
9943 fschmid 59
PicStatus::PicStatus(QWidget* parent, ScribusDoc *docu) : QDialog( parent )
8372 fschmid 60
{
8524 subik 61
        setupUi(this);
9943 fschmid 62
        setModal(true);
63
        imageViewArea->setIconSize(QSize(128, 128));
11207 fschmid 64
        imageViewArea->setContextMenuPolicy(Qt::CustomContextMenu);
8372 fschmid 65
        m_Doc = docu;
66
        currItem = NULL;
9943 fschmid 67
        setWindowIcon(QIcon(loadIcon ( "AppIcon.png" )));
8372 fschmid 68
        fillTable();
10767 fschmid 69
        workTab->setCurrentIndex(0);
8372 fschmid 70
        connect(closeButton, SIGNAL(clicked()), this, SLOT(accept()));
14116 jghali 71
        connect(imageViewArea, SIGNAL(itemSelectionChanged()), this, SLOT(newImageSelected()));
8372 fschmid 72
        connect(isPrinting, SIGNAL(clicked()), this, SLOT(PrintPic()));
8561 subik 73
        connect(isVisibleCheck, SIGNAL(clicked()), this, SLOT(visiblePic()));
8372 fschmid 74
        connect(goPageButton, SIGNAL(clicked()), this, SLOT(GotoPic()));
75
        connect(selectButton, SIGNAL(clicked()), this, SLOT(SelectPic()));
76
        connect(searchButton, SIGNAL(clicked()), this, SLOT(SearchPic()));
77
        connect(effectsButton, SIGNAL(clicked()), this, SLOT(doImageEffects()));
78
        connect(buttonLayers, SIGNAL(clicked()), this, SLOT(doImageExtProp()));
79
        connect(buttonEdit, SIGNAL(clicked()), this, SLOT(doEditImage()));
11207 fschmid 80
        connect(imageViewArea, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(slotRightClick()));
8372 fschmid 81
}
82
 
8422 fschmid 83
QPixmap PicStatus::createImgIcon(PageItem* item)
84
{
85
        QPainter p;
86
        QPixmap pm(128, 128);
87
        QBrush b(QColor(205,205,205), loadIcon("testfill.png"));
88
        p.begin(&pm);
9943 fschmid 89
        p.fillRect(0, 0, 128, 128, imageViewArea->palette().window());
8522 cbradney 90
        p.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
10553 fschmid 91
        p.setBrush(palette().window());
9094 fschmid 92
        p.drawRoundRect(0, 0, 127, 127, 10, 10);
8422 fschmid 93
        p.setPen(Qt::NoPen);
94
        p.setBrush(b);
95
        p.drawRect(12, 12, 104, 104);
13097 subik 96
        if (item->PictureIsAvailable && QFile::exists(item->externalFile()))
8422 fschmid 97
        {
10398 cbradney 98
                QImage im2 = item->pixm.scaled(104, 104, Qt::KeepAspectRatio, Qt::SmoothTransformation);
8422 fschmid 99
                p.drawImage((104 - im2.width()) / 2 + 12, (104 - im2.height()) / 2 + 12, im2);
100
        }
101
        else
102
        {
103
                p.setBrush(Qt::NoBrush);
8522 cbradney 104
                p.setPen(QPen(Qt::red, 2, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
8422 fschmid 105
                p.drawLine(12, 12, 116, 116);
106
                p.drawLine(12, 116, 116, 12);
107
        }
8522 cbradney 108
        p.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
8422 fschmid 109
        p.setBrush(Qt::NoBrush);
110
        p.drawRect(12, 12, 104, 104);
111
        p.end();
112
        return pm;
113
}
114
 
8372 fschmid 115
void PicStatus::fillTable()
116
{
117
        PageItem *item;
118
        imageViewArea->clear();
10990 cbradney 119
        QListWidgetItem *firstItem=0;
120
        QListWidgetItem *tempItem=0;
11069 subik 121
 
16148 fschmid 122
        QList<PageItem*> allItems;
10990 cbradney 123
        for (int i = 0; i < m_Doc->MasterItems.count(); ++i)
8372 fschmid 124
        {
16148 fschmid 125
                PageItem *currItem = m_Doc->MasterItems.at(i);
126
                if (currItem->isGroup())
127
                        allItems = currItem->getItemList();
12862 fschmid 128
                else
16148 fschmid 129
                        allItems.append(currItem);
130
                for (int ii = 0; ii < allItems.count(); ii++)
131
                {
132
                        item = allItems.at(ii);
133
                        QFileInfo fi = QFileInfo(item->Pfile);
134
                        QString Iname = "";
135
                        if (item->isInlineImage)
136
                                Iname = tr("Embedded Image");
137
                        else
138
                                Iname = fi.fileName();
139
                        if ((item->itemType() == PageItem::ImageFrame) && (!item->asLatexFrame()))
140
                                tempItem = new PicItem(imageViewArea, Iname, createImgIcon(item), item);
141
                        if (firstItem == 0)
142
                                firstItem = tempItem;
143
                }
144
                allItems.clear();
8372 fschmid 145
        }
16148 fschmid 146
        allItems.clear();
13548 jghali 147
        for (int i = 0; i < m_Doc->DocItems.count(); ++i)
8372 fschmid 148
        {
16148 fschmid 149
                PageItem *currItem = m_Doc->DocItems.at(i);
150
                if (currItem->isGroup())
151
                        allItems = currItem->getItemList();
12862 fschmid 152
                else
16148 fschmid 153
                        allItems.append(currItem);
154
                for (int ii = 0; ii < allItems.count(); ii++)
155
                {
156
                        item = allItems.at(ii);
157
                        QFileInfo fi = QFileInfo(item->Pfile);
158
                        QString Iname = "";
159
                        if (item->isInlineImage)
160
                                Iname = tr("Embedded Image");
161
                        else
162
                                Iname = fi.fileName();
163
                        if ((item->itemType() == PageItem::ImageFrame) && (!item->asLatexFrame()))
164
                                tempItem = new PicItem(imageViewArea, Iname, createImgIcon(item), item);
165
                        // if an image is selected in a doc, Manage Pictures should
166
                        // display the selected image and its values
167
                        if (firstItem == 0 || item->isSelected())
168
                                firstItem = tempItem;
169
                }
170
                allItems.clear();
8372 fschmid 171
        }
10990 cbradney 172
        imageViewArea->setCurrentItem(firstItem);
173
        if (firstItem!=0)
174
                imageSelected(firstItem);
11129 subik 175
 
176
        // Disable all features when there is no image in the document.
177
        // It should never be used (see ScribusMainWindow::extrasMenuAboutToShow())
178
        // but who knows if it can be configured for shortcut or macro...
179
        imageViewArea->setEnabled(imageViewArea->count() > 0);
180
        workTab->setEnabled(imageViewArea->count() > 0);
11207 fschmid 181
        sortByName();
8372 fschmid 182
}
183
 
11207 fschmid 184
void PicStatus::sortByName()
185
{
186
        QListWidgetItem *firstItem = 0;
187
        QMap<QString, PicItem*> sorted;
188
        int num = imageViewArea->count();
189
        if (num != 0)
190
        {
191
                firstItem = imageViewArea->currentItem();
192
                for (int a = num-1; a > -1; --a)
193
                {
194
                        QListWidgetItem *ite = imageViewArea->takeItem(a);
195
                        PicItem *item = (PicItem*)ite;
196
                        QFileInfo fi = QFileInfo(item->PageItemObject->Pfile);
197
                        sorted.insertMulti(fi.fileName(), item);
198
                }
199
                int counter = 0;
200
                foreach (QString i, sorted.uniqueKeys())
201
                {
202
                        foreach (PicItem* val, sorted.values(i))
203
                        {
204
                                imageViewArea->insertItem(counter, val);
205
                                counter++;
206
                        }
207
                }
208
                imageViewArea->setCurrentItem(firstItem);
209
                imageSelected(firstItem);
210
                sortOrder = 0;
211
        }
212
}
213
 
214
void PicStatus::sortByPage()
215
{
216
        QListWidgetItem *firstItem = 0;
217
        QMap<int, PicItem*> sorted;
218
        int num = imageViewArea->count();
219
        if (num != 0)
220
        {
221
                firstItem = imageViewArea->currentItem();
222
                for (int a = num-1; a > -1; --a)
223
                {
224
                        QListWidgetItem *ite = imageViewArea->takeItem(a);
225
                        PicItem *item = (PicItem*)ite;
226
                        sorted.insertMulti(item->PageItemObject->OwnPage, item);
227
                }
228
                int counter = 0;
229
                foreach (int i, sorted.uniqueKeys())
230
                {
231
                        foreach (PicItem* val, sorted.values(i))
232
                        {
233
                                imageViewArea->insertItem(counter, val);
234
                                counter++;
235
                        }
236
                }
237
                imageViewArea->setCurrentItem(firstItem);
238
                imageSelected(firstItem);
239
                sortOrder = 1;
240
        }
241
}
242
 
243
void PicStatus::slotRightClick()
244
{
245
        QMenu *pmen = new QMenu();
246
        qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
247
        QAction* Act1 = pmen->addAction( tr("Sort by Name"));
248
        Act1->setCheckable(true);
249
        QAction* Act2 = pmen->addAction( tr("Sort by Page"));
250
        Act2->setCheckable(true);
251
        if (sortOrder == 0)
252
                Act1->setChecked(true);
253
        else if (sortOrder == 1)
254
                Act2->setChecked(true);
255
        connect(Act1, SIGNAL(triggered()), this, SLOT(sortByName()));
256
        connect(Act2, SIGNAL(triggered()), this, SLOT(sortByPage()));
257
        pmen->exec(QCursor::pos());
258
        delete pmen;
259
}
260
 
14116 jghali 261
void PicStatus::newImageSelected()
262
{
263
        QList<QListWidgetItem*> items = imageViewArea->selectedItems();
264
        imageSelected((items.count() > 0) ? items.at(0) : NULL);
265
}
266
 
9943 fschmid 267
void PicStatus::imageSelected(QListWidgetItem *ite)
8372 fschmid 268
{
269
        if (ite != NULL)
270
        {
271
                PicItem *item = (PicItem*)ite;
272
                currItem = item->PageItemObject;
273
                if (!currItem->OnMasterPage.isEmpty())
274
                        displayPage->setText(currItem->OnMasterPage);
275
                else
8378 fschmid 276
                {
277
                        if (currItem->OwnPage == -1)
278
                                displayPage->setText(  tr("Not on a Page"));
279
                        else
280
                                displayPage->setText(QString::number(currItem->OwnPage + 1));
281
                }
8372 fschmid 282
                displayObjekt->setText(currItem->itemName());
13097 subik 283
                if (currItem->PictureIsAvailable)
8372 fschmid 284
                {
285
                        QFileInfo fi = QFileInfo(currItem->Pfile);
10553 fschmid 286
                        QString ext = fi.suffix().toLower();
12862 fschmid 287
                        if (currItem->isInlineImage)
288
                        {
289
                                displayName->setText( tr("Embedded Image"));
290
                                displayPath->setText("");
291
                                searchButton->setEnabled(false);
292
                        }
293
                        else
294
                        {
295
                                displayName->setText(fi.fileName());
16577 craig 296
                                displayPath->setText(QDir::toNativeSeparators(fi.path()));
12862 fschmid 297
                                searchButton->setEnabled(true);
298
                        }
8372 fschmid 299
                        QString format = "";
300
                        switch (currItem->pixm.imgInfo.type)
301
                        {
302
                                case 0:
303
                                        format = tr("JPG");
304
                                        break;
305
                                case 1:
306
                                        format = tr("TIFF");
307
                                        break;
308
                                case 2:
309
                                        format = tr("PSD");
310
                                        break;
311
                                case 3:
312
                                        format = tr("EPS/PS");
313
                                        break;
314
                                case 4:
315
                                        format = tr("PDF");
316
                                        break;
317
                                case 5:
318
                                        format = tr("JPG2000");
319
                                        break;
320
                                case 6:
10398 cbradney 321
                                        format = ext.toUpper();
8372 fschmid 322
                                        break;
323
                                case 7:
324
                                        format = tr("emb. PSD");
325
                                        break;
326
                        }
327
                        displayFormat->setText(format);
328
                        QString cSpace;
11331 jghali 329
                        if ((extensionIndicatesPDF(ext) || extensionIndicatesEPSorPS(ext)) && (currItem->pixm.imgInfo.type != ImageType7))
8372 fschmid 330
                                cSpace = tr("Unknown");
331
                        else
10121 cbradney 332
                                cSpace=colorSpaceText(currItem->pixm.imgInfo.colorspace);
8372 fschmid 333
                        displayColorspace->setText(cSpace);
334
                        displayDPI->setText(QString("%1 x %2").arg(qRound(currItem->pixm.imgInfo.xres)).arg(qRound(currItem->pixm.imgInfo.yres)));
335
                        displayEffDPI->setText(QString("%1 x %2").arg(qRound(72.0 / currItem->imageXScale())).arg(qRound(72.0 / currItem->imageYScale())));
336
                        displaySizePixel->setText(QString("%1 x %2").arg(currItem->OrigW).arg(currItem->OrigH));
337
                        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));
338
                        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())));
339
                        isPrinting->setChecked(currItem->printEnabled());
8561 subik 340
                        isVisibleCheck->setChecked(currItem->imageShown());
10767 fschmid 341
                        buttonEdit->setEnabled(currItem->isRaster);
342
                        effectsButton->setEnabled(currItem->isRaster);
343
                        buttonLayers->setEnabled(currItem->pixm.imgInfo.valid);
8372 fschmid 344
                }
345
                else
346
                {
10764 cbradney 347
                        QString trNA = tr("n/a");
8372 fschmid 348
                        if (!currItem->Pfile.isEmpty())
349
                        {
350
                                QFileInfo fi = QFileInfo(currItem->Pfile);
351
                                displayName->setText(fi.fileName());
16577 craig 352
                                displayPath->setText(QDir::toNativeSeparators(fi.path()));
11131 fschmid 353
                                searchButton->setEnabled(true);
8372 fschmid 354
                        }
355
                        else
356
                        {
10764 cbradney 357
                                displayName->setText(trNA);
358
                                displayPath->setText(trNA);
11131 fschmid 359
                                searchButton->setEnabled(false);
8372 fschmid 360
                        }
10764 cbradney 361
                        displayFormat->setText(trNA);
362
                        displayColorspace->setText(trNA);
363
                        displayDPI->setText(trNA);
364
                        displayEffDPI->setText(trNA);
365
                        displaySizePixel->setText(trNA);
366
                        displayScale->setText(trNA);
367
                        displayPrintSize->setText(trNA);
8372 fschmid 368
                        buttonEdit->setEnabled(false);
369
                        effectsButton->setEnabled(false);
370
                        buttonLayers->setEnabled(false);
371
                }
372
        }
373
        else
8409 fschmid 374
        {
8372 fschmid 375
                currItem = NULL;
8409 fschmid 376
                imageViewArea->clearSelection();
377
        }
8372 fschmid 378
}
379
 
380
void PicStatus::PrintPic()
381
{
382
        if (currItem != NULL)
383
                currItem->setPrintEnabled(isPrinting->isChecked());
384
}
385
 
386
void PicStatus::visiblePic()
387
{
388
        if (currItem != NULL)
389
        {
8561 subik 390
                currItem->setImageShown(isVisibleCheck->isChecked());
8372 fschmid 391
                emit refreshItem(currItem);
392
        }
393
}
394
 
395
void PicStatus::GotoPic()
396
{
397
        if (currItem != NULL)
398
        {
17512 jghali 399
                if (currItem->OnMasterPage.isEmpty() && m_Doc->masterPageMode())
17510 jghali 400
                        ScCore->primaryMainWindow()->closeActiveWindowMasterPageEditor();
8372 fschmid 401
                if (!currItem->OnMasterPage.isEmpty())
402
                        emit selectMasterPage(currItem->OnMasterPage);
403
                else
404
                        emit selectPage(currItem->OwnPage);
405
        }
406
}
407
 
408
void PicStatus::SelectPic()
409
{
11129 subik 410
        if (currItem == NULL)
411
                return;
412
 
17512 jghali 413
        if (currItem->OnMasterPage.isEmpty() && m_Doc->masterPageMode())
17510 jghali 414
                ScCore->primaryMainWindow()->closeActiveWindowMasterPageEditor();
17512 jghali 415
        else if (!currItem->OnMasterPage.isEmpty() && !m_Doc->masterPageMode())
17510 jghali 416
                emit selectMasterPage(currItem->OnMasterPage);
417
 
16148 fschmid 418
        emit selectElementByItem(currItem, true);
8372 fschmid 419
}
420
 
421
bool PicStatus::loadPict(const QString & newFilePath)
422
{
423
        // Hack to fool the LoadPict function
424
        currItem->Pfile = newFilePath;
13548 jghali 425
        bool masterPageMode = !currItem->OnMasterPage.isEmpty();
426
        bool oldMasterPageMode = m_Doc->masterPageMode();
427
        if (masterPageMode != oldMasterPageMode)
428
                m_Doc->setMasterPageMode(masterPageMode);
16943 fschmid 429
        m_Doc->loadPict(newFilePath, currItem, true);
13548 jghali 430
        if (masterPageMode != oldMasterPageMode)
431
                m_Doc->setMasterPageMode(oldMasterPageMode);
13097 subik 432
        return currItem->PictureIsAvailable;
8372 fschmid 433
}
434
 
435
void PicStatus::SearchPic()
436
{
11129 subik 437
        // no action where is no item selected. It should never happen.
438
        if (currItem == NULL)
439
                return;
11658 fschmid 440
        static QString lastSearchPath;
11129 subik 441
 
11658 fschmid 442
        if (lastSearchPath.isEmpty())
443
                lastSearchPath = displayPath->text();
444
        PicSearchOptions *dia = new PicSearchOptions(this, displayName->text(), lastSearchPath);
8377 fschmid 445
        if (dia->exec())
8372 fschmid 446
        {
11658 fschmid 447
                lastSearchPath = dia->getLastDirSearched();
448
                if (dia->getMatches().count() == 0)
8372 fschmid 449
                {
11658 fschmid 450
                        QMessageBox::information(this, tr("Scribus - Image Search"), tr("No images named \"%1\" were found.").arg(dia->getFileName()),
8377 fschmid 451
                                        QMessageBox::Ok|QMessageBox::Default|QMessageBox::Escape,
452
                                        QMessageBox::NoButton);
453
                }
454
                else
455
                {
11658 fschmid 456
                        PicSearch *dia2 = new PicSearch(this, dia->getFileName(), dia->getMatches());
8377 fschmid 457
                        if (dia2->exec())
8372 fschmid 458
                        {
8377 fschmid 459
                                Q_ASSERT(!dia2->currentImage.isEmpty());
460
                                loadPict(dia2->currentImage);
461
                                refreshItem(currItem);
462
                                QFileInfo fi = QFileInfo(currItem->Pfile);
463
                                imageViewArea->currentItem()->setText(fi.fileName());
9943 fschmid 464
                                imageViewArea->currentItem()->setIcon(createImgIcon(currItem));
8377 fschmid 465
                                imageSelected(imageViewArea->currentItem());
8372 fschmid 466
                        }
8377 fschmid 467
                        delete dia2;
8372 fschmid 468
                }
469
        }
8377 fschmid 470
        delete dia;
8372 fschmid 471
}
472
 
473
void PicStatus::doImageEffects()
474
{
11129 subik 475
        if (currItem == NULL)
476
                return;
477
 
478
        EffectsDialog* dia = new EffectsDialog(this, currItem, m_Doc);
479
        if (dia->exec())
8372 fschmid 480
        {
11129 subik 481
                currItem->effectsInUse = dia->effectsList;
482
                loadPict(currItem->Pfile);
483
                refreshItem(currItem);
484
                imageViewArea->currentItem()->setIcon(createImgIcon(currItem));
8372 fschmid 485
        }
11129 subik 486
        delete dia;
8372 fschmid 487
}
488
 
489
void PicStatus::doImageExtProp()
490
{
491
        if (currItem != NULL)
492
        {
493
                ExtImageProps* dia = new ExtImageProps(this, &currItem->pixm.imgInfo, currItem, m_Doc->view());
494
                dia->exec();
8396 fschmid 495
                loadPict(currItem->Pfile);
496
                refreshItem(currItem);
9943 fschmid 497
                imageViewArea->currentItem()->setIcon(createImgIcon(currItem));
8372 fschmid 498
                delete dia;
499
        }
500
}
501
 
502
void PicStatus::doEditImage()
503
{
504
        if (currItem != NULL)
505
        {
506
                SelectPic();
507
                ScCore->primaryMainWindow()->callImageEditor();
508
        }
509
}