Subversion Repositories Scribus

Rev

Rev 17509 | 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()));
14115 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
 
10990 cbradney 122
        for (int i = 0; i < m_Doc->MasterItems.count(); ++i)
8372 fschmid 123
        {
10990 cbradney 124
                item = m_Doc->MasterItems.at(i);
8372 fschmid 125
                QFileInfo fi = QFileInfo(item->Pfile);
12862 fschmid 126
                QString Iname = "";
127
                if (item->isInlineImage)
128
                        Iname = tr("Embedded Image");
129
                else
130
                        Iname = fi.fileName();
11215 fschmid 131
                if ((item->itemType() == PageItem::ImageFrame) && (!item->asLatexFrame()))
12862 fschmid 132
                        tempItem = new PicItem(imageViewArea, Iname, createImgIcon(item), item);
11069 subik 133
                if (firstItem == 0)
134
                        firstItem = tempItem;
8372 fschmid 135
        }
11069 subik 136
 
13547 jghali 137
        for (int i = 0; i < m_Doc->DocItems.count(); ++i)
8372 fschmid 138
        {
13547 jghali 139
                item = m_Doc->DocItems.at(i);
8372 fschmid 140
                QFileInfo fi = QFileInfo(item->Pfile);
12862 fschmid 141
                QString Iname = "";
142
                if (item->isInlineImage)
143
                        Iname = tr("Embedded Image");
144
                else
145
                        Iname = fi.fileName();
11215 fschmid 146
                if ((item->itemType() == PageItem::ImageFrame) && (!item->asLatexFrame()))
12862 fschmid 147
                        tempItem = new PicItem(imageViewArea, Iname, createImgIcon(item), item);
11069 subik 148
                // if an image is selected in a doc, Manage Pictures should
149
                // display the selected image and its values
150
                if (firstItem == 0 || item->isSelected())
151
                        firstItem = tempItem;
8372 fschmid 152
        }
10990 cbradney 153
        imageViewArea->setCurrentItem(firstItem);
154
        if (firstItem!=0)
155
                imageSelected(firstItem);
11129 subik 156
 
157
        // Disable all features when there is no image in the document.
158
        // It should never be used (see ScribusMainWindow::extrasMenuAboutToShow())
159
        // but who knows if it can be configured for shortcut or macro...
160
        imageViewArea->setEnabled(imageViewArea->count() > 0);
161
        workTab->setEnabled(imageViewArea->count() > 0);
11207 fschmid 162
        sortByName();
8372 fschmid 163
}
164
 
11207 fschmid 165
void PicStatus::sortByName()
166
{
167
        QListWidgetItem *firstItem = 0;
168
        QMap<QString, PicItem*> sorted;
169
        int num = imageViewArea->count();
170
        if (num != 0)
171
        {
172
                firstItem = imageViewArea->currentItem();
173
                for (int a = num-1; a > -1; --a)
174
                {
175
                        QListWidgetItem *ite = imageViewArea->takeItem(a);
176
                        PicItem *item = (PicItem*)ite;
177
                        QFileInfo fi = QFileInfo(item->PageItemObject->Pfile);
178
                        sorted.insertMulti(fi.fileName(), item);
179
                }
180
                int counter = 0;
181
                foreach (QString i, sorted.uniqueKeys())
182
                {
183
                        foreach (PicItem* val, sorted.values(i))
184
                        {
185
                                imageViewArea->insertItem(counter, val);
186
                                counter++;
187
                        }
188
                }
189
                imageViewArea->setCurrentItem(firstItem);
190
                imageSelected(firstItem);
191
                sortOrder = 0;
192
        }
193
}
194
 
195
void PicStatus::sortByPage()
196
{
197
        QListWidgetItem *firstItem = 0;
198
        QMap<int, PicItem*> sorted;
199
        int num = imageViewArea->count();
200
        if (num != 0)
201
        {
202
                firstItem = imageViewArea->currentItem();
203
                for (int a = num-1; a > -1; --a)
204
                {
205
                        QListWidgetItem *ite = imageViewArea->takeItem(a);
206
                        PicItem *item = (PicItem*)ite;
207
                        sorted.insertMulti(item->PageItemObject->OwnPage, item);
208
                }
209
                int counter = 0;
210
                foreach (int i, sorted.uniqueKeys())
211
                {
212
                        foreach (PicItem* val, sorted.values(i))
213
                        {
214
                                imageViewArea->insertItem(counter, val);
215
                                counter++;
216
                        }
217
                }
218
                imageViewArea->setCurrentItem(firstItem);
219
                imageSelected(firstItem);
220
                sortOrder = 1;
221
        }
222
}
223
 
224
void PicStatus::slotRightClick()
225
{
226
        QMenu *pmen = new QMenu();
227
        qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
228
        QAction* Act1 = pmen->addAction( tr("Sort by Name"));
229
        Act1->setCheckable(true);
230
        QAction* Act2 = pmen->addAction( tr("Sort by Page"));
231
        Act2->setCheckable(true);
232
        if (sortOrder == 0)
233
                Act1->setChecked(true);
234
        else if (sortOrder == 1)
235
                Act2->setChecked(true);
236
        connect(Act1, SIGNAL(triggered()), this, SLOT(sortByName()));
237
        connect(Act2, SIGNAL(triggered()), this, SLOT(sortByPage()));
238
        pmen->exec(QCursor::pos());
239
        delete pmen;
240
}
241
 
14115 jghali 242
void PicStatus::newImageSelected()
243
{
244
        QList<QListWidgetItem*> items = imageViewArea->selectedItems();
245
        imageSelected((items.count() > 0) ? items.at(0) : NULL);
246
}
247
 
9943 fschmid 248
void PicStatus::imageSelected(QListWidgetItem *ite)
8372 fschmid 249
{
250
        if (ite != NULL)
251
        {
252
                PicItem *item = (PicItem*)ite;
253
                currItem = item->PageItemObject;
254
                if (!currItem->OnMasterPage.isEmpty())
255
                        displayPage->setText(currItem->OnMasterPage);
256
                else
8378 fschmid 257
                {
258
                        if (currItem->OwnPage == -1)
259
                                displayPage->setText(  tr("Not on a Page"));
260
                        else
261
                                displayPage->setText(QString::number(currItem->OwnPage + 1));
262
                }
8372 fschmid 263
                displayObjekt->setText(currItem->itemName());
13097 subik 264
                if (currItem->PictureIsAvailable)
8372 fschmid 265
                {
266
                        QFileInfo fi = QFileInfo(currItem->Pfile);
10553 fschmid 267
                        QString ext = fi.suffix().toLower();
12862 fschmid 268
                        if (currItem->isInlineImage)
269
                        {
270
                                displayName->setText( tr("Embedded Image"));
271
                                displayPath->setText("");
272
                                searchButton->setEnabled(false);
273
                        }
274
                        else
275
                        {
276
                                displayName->setText(fi.fileName());
16576 craig 277
                                displayPath->setText(QDir::toNativeSeparators(fi.path()));
12862 fschmid 278
                                searchButton->setEnabled(true);
279
                        }
8372 fschmid 280
                        QString format = "";
281
                        switch (currItem->pixm.imgInfo.type)
282
                        {
283
                                case 0:
284
                                        format = tr("JPG");
285
                                        break;
286
                                case 1:
287
                                        format = tr("TIFF");
288
                                        break;
289
                                case 2:
290
                                        format = tr("PSD");
291
                                        break;
292
                                case 3:
293
                                        format = tr("EPS/PS");
294
                                        break;
295
                                case 4:
296
                                        format = tr("PDF");
297
                                        break;
298
                                case 5:
299
                                        format = tr("JPG2000");
300
                                        break;
301
                                case 6:
10398 cbradney 302
                                        format = ext.toUpper();
8372 fschmid 303
                                        break;
304
                                case 7:
305
                                        format = tr("emb. PSD");
306
                                        break;
307
                        }
308
                        displayFormat->setText(format);
309
                        QString cSpace;
11331 jghali 310
                        if ((extensionIndicatesPDF(ext) || extensionIndicatesEPSorPS(ext)) && (currItem->pixm.imgInfo.type != ImageType7))
8372 fschmid 311
                                cSpace = tr("Unknown");
312
                        else
10121 cbradney 313
                                cSpace=colorSpaceText(currItem->pixm.imgInfo.colorspace);
8372 fschmid 314
                        displayColorspace->setText(cSpace);
315
                        displayDPI->setText(QString("%1 x %2").arg(qRound(currItem->pixm.imgInfo.xres)).arg(qRound(currItem->pixm.imgInfo.yres)));
316
                        displayEffDPI->setText(QString("%1 x %2").arg(qRound(72.0 / currItem->imageXScale())).arg(qRound(72.0 / currItem->imageYScale())));
317
                        displaySizePixel->setText(QString("%1 x %2").arg(currItem->OrigW).arg(currItem->OrigH));
318
                        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));
319
                        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())));
320
                        isPrinting->setChecked(currItem->printEnabled());
8561 subik 321
                        isVisibleCheck->setChecked(currItem->imageShown());
10767 fschmid 322
                        buttonEdit->setEnabled(currItem->isRaster);
323
                        effectsButton->setEnabled(currItem->isRaster);
324
                        buttonLayers->setEnabled(currItem->pixm.imgInfo.valid);
8372 fschmid 325
                }
326
                else
327
                {
10764 cbradney 328
                        QString trNA = tr("n/a");
8372 fschmid 329
                        if (!currItem->Pfile.isEmpty())
330
                        {
331
                                QFileInfo fi = QFileInfo(currItem->Pfile);
332
                                displayName->setText(fi.fileName());
16576 craig 333
                                displayPath->setText(QDir::toNativeSeparators(fi.path()));
11131 fschmid 334
                                searchButton->setEnabled(true);
8372 fschmid 335
                        }
336
                        else
337
                        {
10764 cbradney 338
                                displayName->setText(trNA);
339
                                displayPath->setText(trNA);
11131 fschmid 340
                                searchButton->setEnabled(false);
8372 fschmid 341
                        }
10764 cbradney 342
                        displayFormat->setText(trNA);
343
                        displayColorspace->setText(trNA);
344
                        displayDPI->setText(trNA);
345
                        displayEffDPI->setText(trNA);
346
                        displaySizePixel->setText(trNA);
347
                        displayScale->setText(trNA);
348
                        displayPrintSize->setText(trNA);
8372 fschmid 349
                        buttonEdit->setEnabled(false);
350
                        effectsButton->setEnabled(false);
351
                        buttonLayers->setEnabled(false);
352
                }
353
        }
354
        else
8409 fschmid 355
        {
8372 fschmid 356
                currItem = NULL;
8409 fschmid 357
                imageViewArea->clearSelection();
358
        }
8372 fschmid 359
}
360
 
361
void PicStatus::PrintPic()
362
{
363
        if (currItem != NULL)
364
                currItem->setPrintEnabled(isPrinting->isChecked());
365
}
366
 
367
void PicStatus::visiblePic()
368
{
369
        if (currItem != NULL)
370
        {
8561 subik 371
                currItem->setImageShown(isVisibleCheck->isChecked());
8372 fschmid 372
                emit refreshItem(currItem);
373
        }
374
}
375
 
376
void PicStatus::GotoPic()
377
{
378
        if (currItem != NULL)
379
        {
17511 jghali 380
                if (currItem->OnMasterPage.isEmpty() && m_Doc->masterPageMode())
17509 jghali 381
                        ScCore->primaryMainWindow()->closeActiveWindowMasterPageEditor();
8372 fschmid 382
                if (!currItem->OnMasterPage.isEmpty())
383
                        emit selectMasterPage(currItem->OnMasterPage);
384
                else
385
                        emit selectPage(currItem->OwnPage);
386
        }
387
}
388
 
389
void PicStatus::SelectPic()
390
{
11129 subik 391
        if (currItem == NULL)
392
                return;
393
 
17511 jghali 394
        if (currItem->OnMasterPage.isEmpty() && m_Doc->masterPageMode())
17509 jghali 395
                ScCore->primaryMainWindow()->closeActiveWindowMasterPageEditor();
17511 jghali 396
        else if (!currItem->OnMasterPage.isEmpty() && !m_Doc->masterPageMode())
17509 jghali 397
                emit selectMasterPage(currItem->OnMasterPage);
398
 
11129 subik 399
        if (currItem->Groups.count() == 0)
400
                emit selectElement(currItem->OwnPage, currItem->ItemNr, false);
401
        else
8372 fschmid 402
        {
11129 subik 403
                if (currItem->isGroupControl)
8372 fschmid 404
                        emit selectElement(currItem->OwnPage, currItem->ItemNr, false);
405
                else
11129 subik 406
                        emit selectElement(currItem->OwnPage, currItem->ItemNr, true);
8372 fschmid 407
        }
408
}
409
 
410
bool PicStatus::loadPict(const QString & newFilePath)
411
{
412
        // Hack to fool the LoadPict function
413
        currItem->Pfile = newFilePath;
13547 jghali 414
        bool masterPageMode = !currItem->OnMasterPage.isEmpty();
415
        bool oldMasterPageMode = m_Doc->masterPageMode();
416
        if (masterPageMode != oldMasterPageMode)
417
                m_Doc->setMasterPageMode(masterPageMode);
8372 fschmid 418
        m_Doc->LoadPict(newFilePath, currItem->ItemNr, true);
13547 jghali 419
        if (masterPageMode != oldMasterPageMode)
420
                m_Doc->setMasterPageMode(oldMasterPageMode);
13097 subik 421
        return currItem->PictureIsAvailable;
8372 fschmid 422
}
423
 
424
void PicStatus::SearchPic()
425
{
11129 subik 426
        // no action where is no item selected. It should never happen.
427
        if (currItem == NULL)
428
                return;
11658 fschmid 429
        static QString lastSearchPath;
11129 subik 430
 
11658 fschmid 431
        if (lastSearchPath.isEmpty())
432
                lastSearchPath = displayPath->text();
433
        PicSearchOptions *dia = new PicSearchOptions(this, displayName->text(), lastSearchPath);
8377 fschmid 434
        if (dia->exec())
8372 fschmid 435
        {
11658 fschmid 436
                lastSearchPath = dia->getLastDirSearched();
437
                if (dia->getMatches().count() == 0)
8372 fschmid 438
                {
11658 fschmid 439
                        QMessageBox::information(this, tr("Scribus - Image Search"), tr("No images named \"%1\" were found.").arg(dia->getFileName()),
8377 fschmid 440
                                        QMessageBox::Ok|QMessageBox::Default|QMessageBox::Escape,
441
                                        QMessageBox::NoButton);
442
                }
443
                else
444
                {
11658 fschmid 445
                        PicSearch *dia2 = new PicSearch(this, dia->getFileName(), dia->getMatches());
8377 fschmid 446
                        if (dia2->exec())
8372 fschmid 447
                        {
8377 fschmid 448
                                Q_ASSERT(!dia2->currentImage.isEmpty());
449
                                loadPict(dia2->currentImage);
450
                                refreshItem(currItem);
451
                                QFileInfo fi = QFileInfo(currItem->Pfile);
452
                                imageViewArea->currentItem()->setText(fi.fileName());
9943 fschmid 453
                                imageViewArea->currentItem()->setIcon(createImgIcon(currItem));
8377 fschmid 454
                                imageSelected(imageViewArea->currentItem());
8372 fschmid 455
                        }
8377 fschmid 456
                        delete dia2;
8372 fschmid 457
                }
458
        }
8377 fschmid 459
        delete dia;
8372 fschmid 460
}
461
 
462
void PicStatus::doImageEffects()
463
{
11129 subik 464
        if (currItem == NULL)
465
                return;
466
 
467
        EffectsDialog* dia = new EffectsDialog(this, currItem, m_Doc);
468
        if (dia->exec())
8372 fschmid 469
        {
11129 subik 470
                currItem->effectsInUse = dia->effectsList;
471
                loadPict(currItem->Pfile);
472
                refreshItem(currItem);
473
                imageViewArea->currentItem()->setIcon(createImgIcon(currItem));
8372 fschmid 474
        }
11129 subik 475
        delete dia;
8372 fschmid 476
}
477
 
478
void PicStatus::doImageExtProp()
479
{
480
        if (currItem != NULL)
481
        {
482
                ExtImageProps* dia = new ExtImageProps(this, &currItem->pixm.imgInfo, currItem, m_Doc->view());
483
                dia->exec();
8396 fschmid 484
                loadPict(currItem->Pfile);
485
                refreshItem(currItem);
9943 fschmid 486
                imageViewArea->currentItem()->setIcon(createImgIcon(currItem));
8372 fschmid 487
                delete dia;
488
        }
489
}
490
 
491
void PicStatus::doEditImage()
492
{
493
        if (currItem != NULL)
494
        {
495
                SelectPic();
496
                ScCore->primaryMainWindow()->callImageEditor();
497
        }
498
}