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 */
7 #include <QtGui>
8 #include <QMessageBox>
9 #include <QSignalBlocker>
10
11 #include <iostream>
12
13 #include "picturebrowser.h"
14
15 #include "collection.h"
16 #include "fileloader.h"
17 #include "findimage.h"
18 #include "iconmanager.h"
19 #include "loadimage.h"
20 #include "loadsaveplugin.h"
21 #include "prefsfile.h"
22 #include "prefsmanager.h"
23 #include "previewimage.h"
24 #include "scribusapp.h"
25 #include "ui/scmessagebox.h"
26 #include "util_formats.h"
27
28 #include "../../plugins/formatidlist.h"
29
PictureBrowser(ScribusDoc * doc,QWidget * parent)30 PictureBrowser::PictureBrowser(ScribusDoc* doc, QWidget *parent):
31 QDialog(parent),
32 pModel(nullptr),
33 pImages(nullptr)
34 {
35 setupUi(this);
36
37 //set Scribusdoc
38 m_Doc = doc;
39 m_ScMW = doc->scMW();
40
41 //load settings
42 pbSettings.load();
43
44 documentChanged = false;
45
46 insertPositionXSpinbox->setNewUnit(doc->unitIndex());
47 insertPositionYSpinbox->setNewUnit(doc->unitIndex());
48 insertWidthSpinbox->setNewUnit(doc->unitIndex());
49 insertHeightSpinbox->setNewUnit(doc->unitIndex());
50
51 connect(navigationBox, SIGNAL(currentIndexChanged(int)), this, SLOT(navigate(int)));
52 connect(sortCombobox, SIGNAL(currentIndexChanged(int)), this, SLOT(sortChanged(int)));
53 connect(previewModeCombobox, SIGNAL(currentIndexChanged(int)), this, SLOT(previewModeChanged(int)));
54 connect(moreButton, SIGNAL(clicked()), this, SLOT(moreButtonClicked()));
55 connect(resetSettingsButton, SIGNAL(clicked()), this, SLOT(resetSettingsButtonClicked()));
56 connect(sortOrderButton, SIGNAL(clicked()), this, SLOT(sortOrderButtonClicked()));
57 connect(actionsGoButton, SIGNAL(clicked()), this, SLOT(actionsGoButtonClicked()));
58
59 connect(zoomPlusButton, SIGNAL(clicked()), this, SLOT(zoomPlusButtonClicked()));
60 connect(zoomMinusButton, SIGNAL(clicked()), this, SLOT(zoomMinusButtonClicked()));
61
62 //close button
63 connect(closeButton, SIGNAL(clicked()), this, SLOT(accept()));
64
65 connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tabWidgetCurrentChanged(int)));
66
67 //"goto page" button in documentbrowser
68 connect(gotoPageButton, SIGNAL(clicked()), this, SLOT(gotoPageButtonClicked()));
69
70 connect(folderView, SIGNAL(activated(const QModelIndex &)), this, SLOT(dirChosen(const QModelIndex &)));
71 connect(folderView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(dirChosen(const QModelIndex &)));
72 connect(folderView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(dirChosen(const QModelIndex &)));
73
74 //changing page
75 connect(this, SIGNAL(selectPage(int)), ScCore->primaryMainWindow(), SLOT(selectPagesFromOutlines(int)));
76 connect(this, SIGNAL(selectMasterPage(QString)), ScCore->primaryMainWindow(), SLOT(editMasterPagesStart(QString)));
77
78 //always-on-top checkbox
79 connect(alwaysOnTopCheckbox, SIGNAL(stateChanged(int)), this, SLOT(alwaysOnTopCheckboxStateChanged()));
80 //save settings checkbox
81 connect(saveSettingsCheckbox, SIGNAL(stateChanged(int)), this, SLOT(saveSettingsCheckboxStateChanged()));
82
83 //folderbrowser:include subdirs
84 connect(subdirsCheckbox, SIGNAL(stateChanged(int)), this, SLOT(subdirsCheckboxStateChanged()));
85
86 loadIcons();
87
88 setSettings();
89
90 navigationStack->setCurrentIndex(0);
91
92
93 //maybe add QDir::Readable, although users might wonder where their folders are
94 folderModel.setFilter(QDir::AllDirs|QDir::Drives|QDir::NoDotAndDotDot|QDir::NoSymLinks/*|QDir::Hidden*/);
95 folderView->setModel(&folderModel);
96
97 // this should give a little performance boost
98 folderView->setUniformRowHeights(true);
99 folderView->setCurrentIndex(folderModel.index(QDir::currentPath()));
100 folderView->scrollTo(folderView->currentIndex(), QAbstractItemView::PositionAtTop);
101 folderView->resizeColumnToContents(0);
102
103 //this needs to be calculated later from height/width of QListView!
104 previewIconsVisible = 8;
105 folderBrowserIncludeSubdirs = false;
106
107 imagesDisplayed = 0;
108 imagesFiltered = 0;
109 previewIconIndex = -1;
110 insertCustomPosition = false;
111 insertCustomSize = false;
112 currentRow = 0;
113
114 //set up previewimages instance, fill with last shown images later
115 pImages = new previewImages(QStringList());
116
117 //set threadpointer to 0
118 fit = nullptr;
119 crt = nullptr;
120 cdbwt = nullptr;
121 clrt = nullptr;
122
123
124 pModel = new PreviewImagesModel(this);
125
126 //create loadImagesThread instance, connect and run it
127 lit = new loadImagesThread(this, pModel);
128 lit->start();
129
130 connect(imageViewArea, SIGNAL(clicked(const QModelIndex &)), this, SLOT(previewIconClicked(const QModelIndex &)));
131 connect(imageViewArea, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(previewIconDoubleClicked(const QModelIndex &)));
132
133 imageViewArea->SetIconSize(QSize(pbSettings.previewIconSize, pbSettings.previewIconSize));
134 imageViewArea->SetGridSize(QSize(qRound(( 1.1)*pbSettings.previewIconSize),(qRound(( 1.1)*pbSettings.previewIconSize)+ pbSettings.previewMode*10)));
135 imageViewArea->SetModel(pModel);
136
137 //register item selections
138 connect(imageViewArea->SelectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this, SLOT(previewImageSelectionChanged(const QItemSelection &, const QItemSelection &)));
139
140 //documentbrowser setup
141 connect(documentWidget, SIGNAL(itemActivated(QTreeWidgetItem * , int)), this, SLOT(documentChosen(QTreeWidgetItem * , int)));
142 connect(documentWidget, SIGNAL(itemClicked(QTreeWidgetItem * , int)), this, SLOT(documentChosen(QTreeWidgetItem * , int)));
143
144 documentWidget->setColumnCount(1);
145 documentWidget->setHeaderLabels(QStringList("Pages"));
146
147
148 //collectionsbrowser setup
149 connect(collectionsWidget, SIGNAL(itemActivated(QTreeWidgetItem * , int)), this, SLOT(collectionChosen(QTreeWidgetItem * , int)));
150 connect(collectionsWidget, SIGNAL(itemClicked(QTreeWidgetItem * , int)), this, SLOT(collectionChosen(QTreeWidgetItem * , int)));
151 connect(collectionsWidget, SIGNAL(itemChanged(QTreeWidgetItem * , int)), this, SLOT(collectionsWidgetItemEdited(QTreeWidgetItem * , int)));
152 connect(collectionsNewCategoryButton, SIGNAL(clicked()), this, SLOT(collectionsNewCategoryButtonClicked()));
153 connect(collectionsNewButton, SIGNAL(clicked()), this, SLOT(collectionsNewButtonClicked()));
154 connect(collectionsImportButton, SIGNAL(clicked()), this, SLOT(collectionsImportButtonClicked()));
155 connect(collectionsExportButton, SIGNAL(clicked()), this, SLOT(collectionsExportButtonClicked()));
156 connect(collectionsDeleteButton, SIGNAL(clicked()), this, SLOT(collectionsDeleteButtonClicked()));
157 connect(collectionsRenameButton, SIGNAL(clicked()), this, SLOT(collectionsRenameButtonClicked()));
158
159 connect(collectionsAddImagesButton, SIGNAL(clicked()), this, SLOT(collectionsAddImagesButtonClicked()));
160 connect(collectionsRemoveImagesButton, SIGNAL(clicked()), this, SLOT(collectionsRemoveImagesButtonClicked()));
161 connect(collectionsTagImagesButton, SIGNAL(clicked()), this, SLOT(collectionsTagImagesButtonClicked()));
162 connect(collectionsAddImagesOkButton, SIGNAL(clicked()), this, SLOT(collectionsAddImagesOkButtonClicked()));
163 connect(collectionsAddImagesCancelButton, SIGNAL(clicked()), this, SLOT(collectionsAddImagesCancelButtonClicked()));
164
165 connect(collectionsSetTagsButton, SIGNAL(clicked()), this, SLOT(collectionsSetTagsButtonClicked()));
166 connect(collectionsAddNewTagButton, SIGNAL(clicked()), this, SLOT(collectionsAddNewTagButtonClicked()));
167
168 connect (jumpToImageButton, SIGNAL(clicked()), this, SLOT(jumpToImageFolder()));
169
170 collectionsWidget->setColumnCount(1);
171 collectionsWidget->setHeaderLabels(QStringList("Name"));
172
173 cdbFile = ScPaths::instance().pluginDataDir(true) + QString("collectionsdb.xml");
174 //emtpy initialization, maybe accessed before collection is actually loaded
175 currCollection = new imageCollection;
176 currCollection->name = "empty";
177 currCollection->file = "empty";
178
179 crt = new collectionReaderThread(cdbFile, false);
180 connect(crt, SIGNAL(finished()), this, SLOT(collectionReaderThreadFinished()));
181 crt->start();
182
183 connect(insertPositionCombobox, SIGNAL(currentIndexChanged(int)), this, SLOT(insertPositionComboboxChanged(int)));
184 connect(insertSizeCombobox, SIGNAL(currentIndexChanged(int)), this, SLOT(insertSizeComboboxChanged(int)));
185 connect(insertImageButton, SIGNAL(clicked()), this, SLOT(insertImageButtonClicked()));
186 connect(insertPagesCombobox, SIGNAL(checkstateChanged(int)), this, SLOT(insertPagesComboboxCheckstateChanged(int)));
187 insertPagesCombobox->addItem("Current Page", 1);
188 insertPagesCombobox->addItem("All Pages", 0);
189
190 for (int i = 0; i < (int)(m_Doc->Pages->count()); ++i)
191 {
192 insertPagesCombobox->addItem(QString("Page %1").arg(i+1), 0);
193 }
194
195 insertFramesCombobox->addItem("All Frames", 0);
196 insertFramesCombobox->addItem("All Empty Frames", 0);
197
198 PageItem *pItem;
199 QList<PageItem*> allItems;
200 for (int i = 0; i < m_Doc->MasterItems.count(); ++i)
201 {
202 PageItem *currItem = m_Doc->MasterItems.at(i);
203 if (currItem->isGroup())
204 allItems = currItem->getAllChildren();
205 else
206 allItems.append(currItem);
207 for (int ii = 0; ii < allItems.count(); ii++)
208 {
209 pItem = allItems.at(ii);
210 if ((pItem->itemType() == PageItem::ImageFrame) && (!pItem->isLatexFrame()))
211 {
212 QString itemText;
213 if (pItem->imageIsAvailable)
214 itemText = QString("Frame %1").arg(pItem->itemName());
215 else
216 itemText = QString("Frame %1 (empty)").arg(pItem->itemName());
217 insertFramesCombobox->addItem(itemText, 0);
218 }
219 }
220 allItems.clear();
221 }
222
223 for (int i = 0; i < m_Doc->DocItems.count(); ++i)
224 {
225 PageItem *currItem = m_Doc->DocItems.at(i);
226 if (currItem->isGroup())
227 allItems = currItem->getAllChildren();
228 else
229 allItems.append(currItem);
230 for (int ii = 0; ii < allItems.count(); ii++)
231 {
232 pItem = allItems.at(ii);
233 if ((pItem->itemType() == PageItem::ImageFrame) && (!pItem->isLatexFrame()))
234 {
235 QString itemText;
236 if (pItem->imageIsAvailable)
237 itemText = QString("Frame %1").arg(pItem->itemName());
238 else
239 itemText = QString("Frame %1 (empty)").arg(pItem->itemName());
240 insertFramesCombobox->addItem(itemText, 0);
241 }
242 }
243 allItems.clear();
244 }
245
246 //set namefilters for global use
247 // nameFilters << "*.jpg" << "*.jpeg" << "*.gif" << "*.png" << "*.ps" << "*.psd" << "*.tif" << "*.tiff" << "*.xpm" << "*.eps" << "*.epsf" << "*.epsi" << "*.eps2" << "*.eps3" << "*.epi" << "*.epg";
248
249 QString formatD(FormatsManager::instance()->extensionListForFormat(FormatsManager::IMAGESIMGFRAME, 0));
250 nameFilters = formatD.split(" ", Qt::SkipEmptyParts);
251 nameFilters.append("*.svg");
252
253 QStringList vectorFiles = LoadSavePlugin::getExtensionsForPreview(FORMATID_FIRSTUSER);
254 for (int v = 0; v < vectorFiles.count(); v++)
255 {
256 nameFilters.append("*." + vectorFiles[v]);
257 }
258
259
260 //filter/search setup
261 connect(filterTargetCombobox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterTargetComboboxChanged(int)));
262 connect(filterCriteriaCombobox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterCriteriaComboboxChanged(int)));
263 connect(filterFilterButton, SIGNAL(clicked()), this, SLOT(filterFilterButtonClicked()));
264 connect(filterClearButton, SIGNAL(clicked()), this, SLOT(filterClearButtonClicked()));
265 connect(filterAddCriterionButton, SIGNAL(clicked()), this, SLOT(filterAddCriterionButtonClicked()));
266 connect(filterSearchDirButton, SIGNAL(clicked()), this, SLOT(filterSearchDirButtonClicked()));
267
268 filters = new imageFilters;
269
270 filterTypeCombobox->addItem("All Supported Formats", 1);
271
272 for (int i = 0; i < nameFilters.size(); ++i)
273 {
274 filterTypeCombobox->addItem(nameFilters.at(i), 1);
275 }
276
277 //fix: scrollperitem doesnt work
278 //imageViewArea->setLayoutMode(QListView::Batched);
279 //imageViewArea->setBatchSize(4);
280 //imageViewArea->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
281 //imageViewArea->setHorizontalScrollMode(QAbstractItemView::ScrollPerItem);
282
283 //Actually select the current folder to generate the preview from it's contents
284 dirChosen(folderModel.index( QDir::currentPath()));
285
286 connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
287 }
288
289
~PictureBrowser()290 PictureBrowser::~PictureBrowser()
291 {
292 }
293
closeEvent(QCloseEvent * e)294 void PictureBrowser::closeEvent(QCloseEvent* e)
295 {
296 delete pImages;
297 pImages=nullptr;
298 delete pModel;
299 pModel=nullptr;
300 }
301
302
callLoadImageThread(int row,int pId)303 void PictureBrowser::callLoadImageThread(int row, int pId)
304 {
305 previewImage *imageToLoad = pModel->modelItemsList.at(row);
306
307 emit loadImageJob(row, imageToLoad->fileInformation.absoluteFilePath(), pbSettings.previewIconSize, pId);
308 }
309
310
navigate(int index)311 void PictureBrowser::navigate(int index)
312 {
313 //this check shouldnt be necessary but you never know...
314 if ((index >= 0) && (index < 3))
315 {
316 if (index == 2)
317 {
318 updateDocumentBrowser();
319 }
320
321 navigationStack->setCurrentIndex(index);
322 }
323 }
324
325
previewIconClicked(const QModelIndex & index)326 void PictureBrowser::previewIconClicked(const QModelIndex &index)
327 {
328 int row = index.row();
329
330 if (row >= 0)
331 {
332 previewIconIndex = row;
333 updateInformationTab(previewIconIndex);
334 }
335 }
336
337
previewIconDoubleClicked(const QModelIndex & index)338 void PictureBrowser::previewIconDoubleClicked(const QModelIndex &index)
339 {
340 int row = index.row();
341
342 if (row >= 0)
343 {
344 ScribusDoc *currentDoc(m_ScMW->doc);
345 Imagedialog *id(new Imagedialog(pImages->previewImagesList.at(row)->fileInformation.absoluteFilePath(), currentDoc ,this));
346
347 if (id)
348 {
349 id->setAttribute(Qt::WA_DeleteOnClose);
350 id->show();
351 id->raise();
352 id->activateWindow();
353 }
354 }
355 }
356
357
sortChanged(int index)358 void PictureBrowser::sortChanged(int index)
359 {
360 //this check shouldnt be necessary but you never know...
361 if ((index >= 0) && (index < 4))
362 {
363 pbSettings.sortSetting = index;
364
365 if (saveSettingsCheckbox->isChecked())
366 pbSettings.save();
367
368 updateBrowser(false, true, false);
369 }
370 }
371
372
previewModeChanged(int index)373 void PictureBrowser::previewModeChanged(int index)
374 {
375 if ((index >= 0) && (index < 2))
376 {
377 pbSettings.previewMode = index;
378 imageViewArea->SetGridSize(QSize(qRound(( 1.1)*pbSettings.previewIconSize),(qRound(( 1.1)*pbSettings.previewIconSize)+ pbSettings.previewMode*10)));
379
380 if (saveSettingsCheckbox->isChecked())
381 pbSettings.save();
382 }
383 }
384
385
386 // enlarge dialog to show more information/options
387 //FIXME: still quick and dirty, professional animation required
moreButtonClicked()388 void PictureBrowser::moreButtonClicked()
389 {
390 // dialog is not enlarged -> enlarge, change buttontext/icon
391 if (!pbSettings.showMore)
392 {
393 expandDialog(true);
394 pbSettings.showMore = true;
395
396 if (tabWidget->currentIndex() == 0)
397 updateInformationTab(previewIconIndex);
398 }
399 // dialog is enlarged, set back to original size, change buttontext/icon
400 else
401 {
402 expandDialog(false);
403 pbSettings.showMore = false;
404 }
405
406 if (saveSettingsCheckbox->isChecked())
407 pbSettings.save();
408 }
409
410
resetSettingsButtonClicked()411 void PictureBrowser::resetSettingsButtonClicked()
412 {
413 pbSettings.reset();
414 setSettings();
415 }
416
417
actionsGoButtonClicked()418 void PictureBrowser::actionsGoButtonClicked()
419 {
420 int index = actionsCombobox->currentIndex();
421
422 if ((previewIconIndex < 0) || (previewIconIndex > pImages->previewImagesList.size()))
423 {
424 ScMessageBox::warning(this, tr("Picture Browser Error"), tr("No Image(s) Selected"));
425 return;
426 }
427
428 if (index == 0)
429 {
430 previewImage *tmpImage;
431
432 //image from pModel needed here
433 tmpImage = pModel->modelItemsList.at(previewIconIndex);
434 InsertAFrameData iafData;
435
436 iafData.frameType=PageItem::ImageFrame;
437 iafData.source=tmpImage->fileInformation.absoluteFilePath();
438 iafData.locationType = 0;
439 iafData.pageList = QString("");
440 iafData.positionType = 0;
441 iafData.sizeType = 0;
442 iafData.x = 0;
443 iafData.y = 0;
444 iafData.width = 0;
445 iafData.height = 0;
446 //iafData.impsetup=m_ImportSetup;
447 iafData.columnCount = 0;
448 iafData.columnGap = 0;
449 iafData.linkTextFrames = false;
450 iafData.linkToExistingFrame = false;
451 iafData.linkToExistingFramePtr=nullptr;
452
453 tmpImage->insertIntoDocument(m_Doc, iafData);
454 }
455 else if (index == 1)
456 {
457 if (!pbSettings.showMore)
458 expandDialog(true);
459
460 if (tabWidget->currentIndex() != 3)
461 tabWidget->setCurrentIndex(3);
462 }
463 else if (index == 2)
464 {
465 navigationBox->setCurrentIndex(1);
466 collectionsStackedwidget->setCurrentIndex(1);
467 updateCollectionsWidget(true);
468 collectionsWidget->blockSignals(true);
469 }
470 }
471
472
sortOrderButtonClicked()473 void PictureBrowser::sortOrderButtonClicked()
474 {
475 if (!pbSettings.sortOrder)
476 {
477 pbSettings.sortOrder = true;
478 sortOrderButton->setIcon(iconArrowUp);
479 }
480 else
481 {
482 pbSettings.sortOrder = false;
483 sortOrderButton->setIcon(iconArrowDown);
484 }
485
486 if (saveSettingsCheckbox->isChecked())
487 pbSettings.save();
488
489 updateBrowser(false, false, false);
490 }
491
492
zoomPlusButtonClicked()493 void PictureBrowser::zoomPlusButtonClicked()
494 {
495 if (pbSettings.previewIconSize < 500)
496 {
497 pbSettings.previewIconSize += 20;
498
499 imageViewArea->SetIconSize(QSize(pbSettings.previewIconSize, pbSettings.previewIconSize));
500 imageViewArea->SetGridSize(QSize(qRound(( 1.1)*pbSettings.previewIconSize),(qRound(( 1.1)*pbSettings.previewIconSize)+ pbSettings.previewMode*10)));
501
502 pModel->createDefaultIcon(pbSettings.previewIconSize);
503
504 if (saveSettingsCheckbox->isChecked())
505 pbSettings.save();
506
507 updateBrowser(false, false, true);
508 }
509 }
510
511
zoomMinusButtonClicked()512 void PictureBrowser::zoomMinusButtonClicked()
513 {
514 if (pbSettings.previewIconSize > 50)
515 {
516 pbSettings.previewIconSize -= 20;
517
518 imageViewArea->SetIconSize(QSize(pbSettings.previewIconSize, pbSettings.previewIconSize));
519 imageViewArea->SetGridSize(QSize(qRound(( 1.1)*pbSettings.previewIconSize),(qRound(( 1.1)*pbSettings.previewIconSize)+ pbSettings.previewMode*10)));
520
521 pModel->createDefaultIcon(pbSettings.previewIconSize);
522
523 if (saveSettingsCheckbox->isChecked())
524 pbSettings.save();
525
526 updateBrowser(false, false, true);
527 }
528 }
529
530
tabWidgetCurrentChanged(int index)531 void PictureBrowser::tabWidgetCurrentChanged(int index)
532 {
533 if (index == 0)
534 updateInformationTab(previewIconIndex);
535 }
536
537
gotoPageButtonClicked()538 void PictureBrowser::gotoPageButtonClicked()
539 {
540 QTreeWidgetItem *item = documentWidget->currentItem();
541
542 if (!item)
543 return;
544
545 int id = item->data(0, Qt::UserRole).toInt();
546 if (id > 0)
547 id--;
548
549 ScCore->primaryMainWindow()->closeActiveWindowMasterPageEditor();
550 emit selectPage(id);
551 }
552
553
alwaysOnTopCheckboxStateChanged()554 void PictureBrowser::alwaysOnTopCheckboxStateChanged()
555 {
556 pbSettings.alwaysOnTop = alwaysOnTopCheckbox->isChecked();
557
558 if (saveSettingsCheckbox->isChecked())
559 pbSettings.save();
560
561 setAlwaysOnTop(pbSettings.alwaysOnTop);
562 }
563
564
saveSettingsCheckboxStateChanged()565 void PictureBrowser::saveSettingsCheckboxStateChanged()
566 {
567 pbSettings.saveSettings = saveSettingsCheckbox->isChecked();
568 pbSettings.save();
569 }
570
571
subdirsCheckboxStateChanged()572 void PictureBrowser::subdirsCheckboxStateChanged()
573 {
574 folderBrowserIncludeSubdirs = subdirsCheckbox->isChecked();
575 }
576
577
578 // processes chosen dirs in the folderbrowser
dirChosen(const QModelIndex & index)579 void PictureBrowser::dirChosen(const QModelIndex &index)
580 {
581 // as long as the folder doesnt change, only the first signal (click, doubleclick or activated) is processed
582 if (documentChanged || !tmpindex.isValid() || (tmpindex != index))
583 {
584 tmpindex = index;
585 documentChanged = false;
586 currPath = folderModel.filePath(index);
587
588 if (!fit)
589 {
590 fit = new findImagesThread(currPath, nameFilters, QDir::Name, folderBrowserIncludeSubdirs);
591 connect(fit, SIGNAL(finished()), this, SLOT(findImagesThreadFinished()), Qt::QueuedConnection);
592 fit->start();
593 }
594 else
595 {
596 fit->restart();
597 }
598 }
599 }
600
601
documentChosen(QTreeWidgetItem * item,int column)602 void PictureBrowser::documentChosen(QTreeWidgetItem * item, int column)
603 {
604 PageItem *pItem;
605 QStringList imageFiles;
606 int id = item->data(0, Qt::UserRole).toInt();
607 QList<PageItem*> allItems;
608 for (int a = 0; a < m_Doc->MasterItems.count(); ++a)
609 {
610 PageItem *currItem = m_Doc->MasterItems.at(a);
611 if (currItem->isGroup())
612 allItems = currItem->getAllChildren();
613 else
614 allItems.append(currItem);
615 for (int ii = 0; ii < allItems.count(); ii++)
616 {
617 pItem = allItems.at(ii);
618 if ((pItem->itemType() == PageItem::ImageFrame) && (pItem->imageIsAvailable) && (!pItem->isLatexFrame()))
619 {
620 if ((id == 0) || ((id - 1) == pItem->OwnPage))
621 {
622 imageFiles.append(pItem->Pfile);
623 }
624 }
625 }
626 allItems.clear();
627 }
628 for (int a = 0; a < m_Doc->Items->count(); ++a)
629 {
630 PageItem *currItem = m_Doc->Items->at(a);
631 if (currItem->isGroup())
632 allItems = currItem->getAllChildren();
633 else
634 allItems.append(currItem);
635 for (int ii = 0; ii < allItems.count(); ii++)
636 {
637 pItem = allItems.at(ii);
638 if ((pItem->itemType() == PageItem::ImageFrame) && (pItem->imageIsAvailable) && (!pItem->isLatexFrame()))
639 {
640 if ((id == 0) || ((id - 1) == pItem->OwnPage))
641 {
642 imageFiles.append(pItem->Pfile);
643 }
644 }
645 }
646 allItems.clear();
647 }
648
649 //todo: check if item is selected: item->isSelected()
650
651
652 pImages->createPreviewImagesList(imageFiles);
653
654 updateBrowser(true, true, false);
655 }
656
657
collectionChosen(QTreeWidgetItem * item,int column)658 void PictureBrowser::collectionChosen(QTreeWidgetItem * item, int column)
659 {
660 QString collectionFile = item->data(0, Qt::UserRole).toString();
661
662 if (collectionFile == "Category")
663 {
664 return;
665 }
666
667 currCollectionFile = collectionFile;
668
669 if (!crt)
670 {
671 crt = new collectionReaderThread(currCollectionFile, false);
672 connect(crt, SIGNAL(finished()), this, SLOT(collectionReaderThreadFinished()));
673 crt->start();
674 }
675 else
676 {
677 crt->restart();
678 }
679 }
680
681
collectionsWidgetItemEdited(QTreeWidgetItem * item,int column)682 void PictureBrowser::collectionsWidgetItemEdited(QTreeWidgetItem * item, int column)
683 {
684 saveCollectionsDb();
685 }
686
687
findImagesThreadFinished()688 void PictureBrowser::findImagesThreadFinished()
689 {
690 if (fit->restartThread)
691 {
692 delete fit;
693
694 //maybe the state of folderBrowserIncludeSubdirs needs to be saved when canceling the old thread
695 fit = new findImagesThread(currPath, nameFilters, QDir::Name, folderBrowserIncludeSubdirs);
696 connect(fit, SIGNAL(finished()), this, SLOT(findImagesThreadFinished()), Qt::QueuedConnection);
697 fit->start();
698 }
699 else
700 {
701 pImages->createPreviewImagesList(fit->imageFiles);
702
703 updateBrowser(true, true, false);
704
705 delete fit;
706 fit = nullptr;
707 }
708 }
709
710
collectionReaderThreadFinished()711 void PictureBrowser::collectionReaderThreadFinished()
712 {
713 if (crt->restartThread)
714 {
715 bool import = crt->import;
716 delete crt;
717
718 crt = new collectionReaderThread(currCollectionFile, import);
719 connect(crt, SIGNAL(finished()), this, SLOT(collectionReaderThreadFinished()));
720 crt->start();
721
722 return;
723 }
724
725 switch (crt->type)
726 {
727 case 0:
728 // ScMessageBox::warning(this, tr("Picture Browser Error"), tr("File not found or file is not a collection file"));
729 break;
730
731 case 1:
732 collectionsDb += crt->collectionsSet;
733
734 updateCollectionsWidget(false);
735 updateCollectionsAddImagesCombobox();
736 break;
737
738 case 2:
739 if (crt->import)
740 {
741 collectionsWidget->blockSignals(true);
742
743 QTreeWidgetItem *currItem = collectionsWidget->currentItem();
744
745 if (!currItem)
746 {
747 currItem = collectionsWidget->topLevelItem(0);
748
749 if (!currItem)
750 {
751 ScMessageBox::warning(this, tr("Picture Browser Error"), tr("You have to create a category first"));
752 return;
753 }
754 }
755
756 QTreeWidgetItem *tmpItem;
757
758 if (currItem->parent())
759 {
760 tmpItem = new QTreeWidgetItem(currItem->parent(), QStringList(crt->collection->name));
761 }
762 else
763 {
764 tmpItem = new QTreeWidgetItem(currItem, QStringList(crt->collection->name));
765 }
766
767 tmpItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled);
768 tmpItem->setData(0, Qt::UserRole, crt->collection->file);
769 tmpItem->setIcon(0, iconCollection);
770 collectionsWidget->blockSignals(false);
771
772 collectionsWidget->setCurrentItem(tmpItem);
773 saveCollectionsDb();
774 }
775
776 currCollection = crt->collection;
777 pImages->createPreviewImagesList(currCollection);
778
779 //update view
780 updateBrowser(true, true, false);
781 updateCollectionsAddImagesCombobox();
782 break;
783
784 default:
785 break;
786 }
787
788 delete crt;
789 crt = nullptr;
790 }
791
792
collectionListReaderThreadFinished()793 void PictureBrowser::collectionListReaderThreadFinished()
794 {
795 /* if (clrt->restartThread)
796 {
797 delete clrt;
798
799 clrt = new collectionListReaderThread(collections);
800 connect(clrt, SIGNAL(finished()), this, SLOT(collectionListReaderThreadFinished()));
801 clrt->start();
802 }
803 else
804 {
805 pImages->createPreviewImagesList(clrt->imageFiles);
806
807 updateBrowser(true, true, false);
808
809 delete clrt;
810 clrt = 0;
811 }*/
812 }
813
814
collectionReaderThreadListFinishedSave()815 void PictureBrowser::collectionReaderThreadListFinishedSave()
816 {
817 collectionReaderThread *tmpCrt;
818 collectionWriterThread *tmpCwt;
819 imageCollection *tmpCollection;
820
821 for (int i = 0; i < crtList.size(); ++i)
822 {
823 tmpCrt = crtList.at(i);
824
825 if (tmpCrt->isFinished())
826 {
827 QStringList tmpTags;
828
829 if (!tmpCrt->type)
830 {
831 ScMessageBox::warning(this, tr("Picture Browser Error"), QString("A collection was not found:\n%1\nit will be created").arg(tmpCrt->xmlFile));
832 tmpCollection = new imageCollection;
833 tmpCollection->imageFiles = tmpCrt->addImages;
834 }
835 else
836 {
837 tmpCollection = tmpCrt->collection;
838 tmpCollection->imageFiles += tmpCrt->addImages;
839 }
840
841 //add empty tags for list consistency
842 for (int j = 0; j < tmpCrt->addImages.size(); ++j)
843 {
844 tmpCollection->tags.append(tmpTags);
845 }
846
847 tmpCwt = new collectionWriterThread(tmpCrt->xmlFile, *tmpCollection);
848 connect(tmpCwt, SIGNAL(finished()), this, SLOT(collectionWriterThreadListFinished()));
849 cwtList.append(tmpCwt);
850 tmpCwt->start();
851
852 delete tmpCollection;
853 delete crtList.takeAt(i);
854 }
855 }
856 }
857
858
collectionsDbWriterThreadFinished()859 void PictureBrowser::collectionsDbWriterThreadFinished()
860 {
861 if (cdbwt->restartThread)
862 {
863 delete cdbwt;
864
865 cdbwt = new collectionsWriterThread(cdbFile, collectionsDb);
866 connect(cdbwt, SIGNAL(finished()), this, SLOT(collectionsDbWriterThreadFinished()));
867 cdbwt->start();
868 }
869 else
870 {
871 delete cdbwt;
872 cdbwt = nullptr;
873 }
874 }
875
876
collectionWriterThreadListFinished()877 void PictureBrowser::collectionWriterThreadListFinished()
878 {
879 for (int i = 0; i < cwtList.size(); ++i)
880 {
881 if (cwtList.at(i)->isFinished())
882 {
883 delete cwtList.takeAt(i);
884 }
885 }
886 }
887
888
insertPagesComboboxCheckstateChanged(int row)889 void PictureBrowser::insertPagesComboboxCheckstateChanged(int row)
890 {
891 int tmpState = insertPagesCombobox->checkstate(1);
892
893 if (row == 1)
894 {
895 int itemsCount = insertPagesCombobox->count();
896
897 for (int i = 2; i < itemsCount; ++i)
898 {
899 insertPagesCombobox->setCheckstate(i, tmpState);
900 }
901 }
902 else if ((tmpState == 1) && (row > 1))
903 {
904 insertPagesCombobox->setCheckstate(1, 0);
905 }
906
907 insertPagesCombobox->setCurrentIndex(row);
908 }
909
910
insertImageButtonClicked()911 void PictureBrowser::insertImageButtonClicked()
912 {
913 if ((previewIconIndex < 0) || (previewIconIndex > pModel->modelItemsList.size()))
914 {
915 ScMessageBox::warning(this, tr("Picture Browser Error"), tr("No image(s) selected"));
916 return;
917 }
918
919 previewImage *tmpImage;
920
921 //image from pModel needed here
922 tmpImage = pModel->modelItemsList.at(previewIconIndex);
923 InsertAFrameData iafData;
924
925 iafData.frameType=PageItem::ImageFrame;
926 iafData.source=tmpImage->fileInformation.absoluteFilePath();
927
928 QString pageList = "";
929
930 if (insertPagesCombobox->checkstate(1) == 1)
931 {
932 iafData.locationType = 1;
933 }
934 else
935 {
936 iafData.locationType = 2;
937
938 //current page has been selected
939 if (insertPagesCombobox->checkstate(0) == 1)
940 {
941 int currPage = m_Doc->currentPageNumber() + 1;
942
943 //prevent double insert, only add current page to pagelist if the page isn't selected yet
944 if (insertPagesCombobox->checkstate(currPage + 1) == 0)
945 pageList += QString("%1,").arg(currPage);
946 }
947
948 for (int i = 2; i < insertPagesCombobox->count(); ++i)
949 {
950 if (insertPagesCombobox->checkstate(i) == 1)
951 pageList += QString("%1,").arg(i-1);
952 }
953
954 if (pageList.isEmpty())
955 {
956 ScMessageBox::warning(this, tr("Picture Browser Error"), tr("No page/image frame selected"));
957 return;
958 }
959
960 pageList.chop(1);
961 }
962
963 iafData.pageList = pageList;
964 iafData.positionType = insertPositionCombobox->currentIndex();
965 iafData.sizeType = insertSizeCombobox->currentIndex();
966 iafData.x = insertPositionXSpinbox->value() / insertPositionXSpinbox->unitRatio();
967 iafData.y = insertPositionYSpinbox->value() / insertPositionYSpinbox->unitRatio();
968 iafData.width = insertWidthSpinbox->value() / insertWidthSpinbox->unitRatio();
969 iafData.height = insertHeightSpinbox->value() / insertHeightSpinbox->unitRatio();
970
971 /*dont need all this crap */
972 //iafData.impsetup=m_ImportSetup;
973 iafData.columnCount = 0;
974 iafData.columnGap = 0;
975 iafData.linkTextFrames = false;
976 iafData.linkToExistingFrame = false;
977 iafData.linkToExistingFramePtr=nullptr;
978
979 tmpImage->insertIntoDocument(m_Doc, iafData);
980 }
981
982
insertPositionComboboxChanged(int index)983 void PictureBrowser::insertPositionComboboxChanged(int index)
984 {
985 if ((index == 3) && !insertCustomPosition)
986 {
987 insertPositionXSpinbox->setEnabled(true);
988 insertPositionYSpinbox->setEnabled(true);
989 insertPositionXLabel->setEnabled(true);
990 insertPositionYLabel->setEnabled(true);
991 insertCustomPosition = true;
992 }
993 else if (insertCustomPosition)
994 {
995 insertPositionXSpinbox->setEnabled(false);
996 insertPositionYSpinbox->setEnabled(false);
997 insertPositionXLabel->setEnabled(false);
998 insertPositionYLabel->setEnabled(false);
999 insertCustomPosition = false;
1000 }
1001 }
1002
1003
insertSizeComboboxChanged(int index)1004 void PictureBrowser::insertSizeComboboxChanged(int index)
1005 {
1006 if ((index == 4) && !insertCustomSize)
1007 {
1008 insertWidthSpinbox->setEnabled(true);
1009 insertHeightSpinbox->setEnabled(true);
1010 insertWidthLabel->setEnabled(true);
1011 insertHeightLabel->setEnabled(true);
1012 insertCustomSize = true;
1013 }
1014 else if (insertCustomSize)
1015 {
1016 insertWidthSpinbox->setEnabled(false);
1017 insertHeightSpinbox->setEnabled(false);
1018 insertWidthLabel->setEnabled(false);
1019 insertHeightLabel->setEnabled(false);
1020 insertCustomSize = false;
1021 }
1022 }
1023
1024
filterCriteriaComboboxChanged(int index)1025 void PictureBrowser::filterCriteriaComboboxChanged(int index)
1026 {
1027 //this check shouldnt be necessary but you never know...
1028 if ((index >= 0) && (index < 5))
1029 {
1030 filterStackedwidget->setCurrentIndex(index);
1031 }
1032 }
1033
1034
filterTargetComboboxChanged(int index)1035 void PictureBrowser::filterTargetComboboxChanged(int index)
1036 {
1037 if ((index >= 0) && (index < 3))
1038 {
1039 filterTargetStackedWidget->setCurrentIndex(index);
1040 }
1041
1042 if (index == 1)
1043 {
1044 filterFilterButton->setText("Search");
1045 }
1046 else
1047 {
1048 filterFilterButton->setText("Apply Filters");
1049 }
1050 }
1051
1052
filterFilterButtonClicked()1053 void PictureBrowser::filterFilterButtonClicked()
1054 {
1055 if (filterTargetCombobox->currentIndex() == 1)
1056 {
1057 QString searchDir = filterSearchLineedit->text();
1058 QDir dir(searchDir);
1059
1060 if (!dir.exists())
1061 {
1062 ScMessageBox::warning(this, tr("Picture Browser Error"), tr("Directory does not exist"));
1063 return;
1064 }
1065
1066 currPath = searchDir;
1067
1068 if (!fit)
1069 {
1070 fit = new findImagesThread(currPath, nameFilters, QDir::Name, folderBrowserIncludeSubdirs);
1071 connect(fit, SIGNAL(finished()), this, SLOT(findImagesThreadFinished()));
1072 fit->start();
1073 }
1074 else
1075 {
1076 fit->restart();
1077 }
1078 }
1079 else if (filterTargetCombobox->currentIndex() == 2)
1080 {
1081 /* if (!clrt)
1082 {
1083 clrt = new collectionListReaderThread(collections);
1084 connect(clrt, SIGNAL(finished()), this, SLOT(collectionListReaderThreadFinished()));
1085 clrt->start();
1086 }
1087 else
1088 {
1089 clrt->restart();
1090 }*/
1091 }
1092 else
1093 {
1094 updateBrowser(true, false, false);
1095 }
1096 }
1097
1098
filterClearButtonClicked()1099 void PictureBrowser::filterClearButtonClicked()
1100 {
1101 pImages->clearFilters();
1102 filterFiltersListwidget->clear();
1103
1104 delete filters;
1105 filters = new imageFilters;
1106
1107 updateBrowser(true, false, false);
1108 }
1109
1110
filterAddCriterionButtonClicked()1111 void PictureBrowser::filterAddCriterionButtonClicked()
1112 {
1113 QListWidgetItem *newItem = new QListWidgetItem;
1114
1115 newItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
1116 newItem->setCheckState(Qt::Checked);
1117
1118 int index = filterCriteriaCombobox->currentIndex();
1119 QString filterText = "Empty Filter";
1120
1121 if (index == 0)
1122 {
1123 if (filterNameCombobox->currentIndex() == 0)
1124 {
1125 filterText = QString("Name contains \"%1\"").arg(filterNameLineedit->text());
1126 filters->nameInverts.append(true);
1127 }
1128 else
1129 {
1130 filterText = QString("Name does not contain \"%1\"").arg(filterNameLineedit->text());
1131 filters->nameInverts.append(false);
1132 }
1133
1134 filters->nameFilters.append(filterNameLineedit->text());
1135 }
1136 else if (index == 1)
1137 {
1138 if (filterDateCombobox->currentIndex() == 0)
1139 {
1140 filterText = QString("Newer than %1").arg(filterDateDatetimeedit->dateTime().toString("dd.MM.yyyy hh:mm"));
1141 filters->dateInverts.append(false);
1142 }
1143 else
1144 {
1145 filterText = QString("Older than %1").arg(filterDateDatetimeedit->dateTime().toString("dd.MM.yyyy hh:mm"));
1146 filters->dateInverts.append(true);
1147 }
1148
1149 filters->dateFilters.append(filterDateDatetimeedit->dateTime());
1150 }
1151 else if (index == 2)
1152 {
1153 if (filterSizeCombobox->currentIndex() == 0)
1154 {
1155 filterText = QString("Smaller than %1 KB").arg(filterSizeSpinbox->value());
1156 filters->sizeInverts.append(true);
1157 }
1158 else
1159 {
1160 filterText = QString("Bigger than %1 KB").arg(filterSizeSpinbox->value());
1161 filters->sizeInverts.append(false);
1162 }
1163
1164 filters->sizeFilters.append(filterSizeSpinbox->value());
1165 }
1166 else if (index == 3)
1167 {
1168 QStringList types;
1169 filterText = QString("Allowed types: ");
1170
1171 if (filterTypeCombobox->checkstate(0) == 1)
1172 {
1173 filterText += QString("All supported types (really a useful filter...)");
1174 types = nameFilters;
1175 }
1176 else
1177 {
1178 int itemsCount = filterTypeCombobox->count();
1179
1180 for (int i = 1; i < itemsCount; ++i)
1181 {
1182 if (filterTypeCombobox->checkstate(i) == 1)
1183 {
1184 filterText += QString("\"%1\", ").arg(nameFilters.at(i - 1));
1185 types.append(nameFilters.at(i - 1));
1186 }
1187 }
1188 }
1189
1190 filters->typeFilters.append(types);
1191 }
1192 else if (index == 4)
1193 {
1194 QStringList tags;
1195 filterText = QString("Has tags: ");
1196
1197 int itemsCount = filterTagsCombobox->count();
1198
1199 for (int i = 1; i < itemsCount; ++i)
1200 {
1201 if (filterTagsCombobox->checkstate(i) == 1)
1202 {
1203 filterText += QString("\"%1\", ").arg(filterTagsCombobox->itemText(i));
1204 tags.append(filterTagsCombobox->itemText(i));
1205 }
1206 }
1207
1208 filters->tagFilters.append(tags);
1209 }
1210
1211 filters->filterMap.append(index);
1212
1213 newItem->setText(filterText);
1214 filterFiltersListwidget->addItem(newItem);
1215 }
1216
1217
filterSearchDirButtonClicked()1218 void PictureBrowser::filterSearchDirButtonClicked()
1219 {
1220 QString searchDir = QFileDialog::getExistingDirectory(this, tr("Select Directory"), QDir::rootPath(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
1221 filterSearchLineedit->setText(searchDir);
1222 }
1223
1224
collectionsNewCategoryButtonClicked()1225 void PictureBrowser::collectionsNewCategoryButtonClicked()
1226 {
1227 collectionsWidget->blockSignals(true);
1228
1229 QTreeWidgetItem *tmpCategory;
1230
1231 tmpCategory = new QTreeWidgetItem(collectionsWidget, QStringList("New Category"));
1232 tmpCategory->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled);
1233 tmpCategory->setData(0, Qt::UserRole, QString("Category"));
1234 tmpCategory->setExpanded(true);
1235
1236 collectionsWidget->blockSignals(false);
1237
1238 collectionsWidget->setCurrentItem(tmpCategory);
1239 collectionsWidget->editItem(tmpCategory);
1240
1241 saveCollectionsDb();
1242 }
1243
1244
collectionsNewButtonClicked()1245 void PictureBrowser::collectionsNewButtonClicked()
1246 {
1247 collectionsWidget->blockSignals(true);
1248
1249 QTreeWidgetItem *currItem = collectionsWidget->currentItem();
1250
1251 if (!currItem)
1252 {
1253 currItem = collectionsWidget->topLevelItem(0);
1254
1255 if (!currItem)
1256 {
1257 ScMessageBox::warning(this, tr("Picture Browser Error"), tr("You have to create a category first"));
1258 return;
1259 }
1260 }
1261
1262 QTreeWidgetItem *parentItem, *tmpItem;
1263 QString newCollectionFile = ScPaths::instance().pluginDataDir(false);
1264
1265 parentItem = currItem->parent();
1266
1267 if (parentItem)
1268 {
1269 tmpItem = new QTreeWidgetItem(parentItem, QStringList("New Collection"));
1270 newCollectionFile += QString("c%1_%2.sic").arg(collectionsWidget->indexOfTopLevelItem(parentItem)).arg(parentItem->childCount());
1271 }
1272 else
1273 {
1274 tmpItem = new QTreeWidgetItem(currItem, QStringList("New Collection"));
1275 newCollectionFile += QString("c%1_%2.sic").arg(collectionsWidget->indexOfTopLevelItem(currItem)).arg(currItem->childCount());
1276 }
1277
1278 tmpItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled);
1279 tmpItem->setData(0, Qt::UserRole, newCollectionFile);
1280 tmpItem->setIcon(0, iconCollection);
1281 collectionsWidget->blockSignals(false);
1282
1283 collectionsWidget->setCurrentItem(tmpItem);
1284 collectionsWidget->editItem(tmpItem);
1285
1286 saveCollectionsDb();
1287
1288 imageCollection tmpCollection;
1289 collectionWriterThread *tmpCwt;
1290 tmpCwt = new collectionWriterThread(newCollectionFile, tmpCollection);
1291 connect(tmpCwt, SIGNAL(finished()), this, SLOT(collectionWriterThreadListFinished()));
1292 cwtList.append(tmpCwt);
1293 tmpCwt->start();
1294 }
1295
1296
collectionsImportButtonClicked()1297 void PictureBrowser::collectionsImportButtonClicked()
1298 {
1299 QString fileName = QFileDialog::getOpenFileName(this, tr("Import Image Collection"), QDir::rootPath(), tr("Scribus ImageCollection (*.sic)"));
1300
1301 if (!fileName.isEmpty())
1302 {
1303 currCollectionFile = fileName;
1304
1305 if (!crt)
1306 {
1307 crt = new collectionReaderThread(currCollectionFile, true);
1308 connect(crt, SIGNAL(finished()), this, SLOT(collectionReaderThreadFinished()));
1309 crt->start();
1310 }
1311 else
1312 {
1313 crt->restart();
1314 }
1315 }
1316 }
1317
1318
collectionsExportButtonClicked()1319 void PictureBrowser::collectionsExportButtonClicked()
1320 {
1321 QString fileName = QFileDialog::getSaveFileName(this, tr("Export Image Collection"), QDir::rootPath(), tr("Scribus ImageCollection (*.sic)"));
1322
1323 QTreeWidgetItem *currItem = collectionsWidget->currentItem();
1324
1325 if (!currItem)
1326 {
1327 ScMessageBox::warning(this, tr("Picture Browser Error"), tr("You have to select something you want to export"));
1328 return;
1329 }
1330
1331 //collection
1332 if (currItem->parent())
1333 {
1334 collectionWriterThread *tmpCwt;
1335 tmpCwt = new collectionWriterThread(fileName, *currCollection);
1336 connect(tmpCwt, SIGNAL(finished()), this, SLOT(collectionWriterThreadListFinished()));
1337 cwtList.append(tmpCwt);
1338 tmpCwt->start();
1339 }
1340 //category
1341 else
1342 {
1343
1344 }
1345 }
1346
1347
collectionsDeleteButtonClicked()1348 void PictureBrowser::collectionsDeleteButtonClicked()
1349 {
1350 QTreeWidgetItem *currItem = collectionsWidget->currentItem();
1351
1352 if (!currItem)
1353 {
1354 return;
1355 }
1356
1357 delete currItem;
1358
1359 saveCollectionsDb();
1360 }
1361
1362
collectionsRenameButtonClicked()1363 void PictureBrowser::collectionsRenameButtonClicked()
1364 {
1365 QTreeWidgetItem *currItem = collectionsWidget->currentItem();
1366
1367 if (!currItem)
1368 {
1369 return;
1370 }
1371
1372 collectionsWidget->editItem(currItem);
1373 }
1374
1375
collectionsAddImagesButtonClicked()1376 void PictureBrowser::collectionsAddImagesButtonClicked()
1377 {
1378 collectionsStackedwidget->setCurrentIndex(1);
1379 updateCollectionsWidget(true);
1380 collectionsWidget->blockSignals(true);
1381 }
1382
1383
collectionsSetTagsButtonClicked()1384 void PictureBrowser::collectionsSetTagsButtonClicked()
1385 {
1386 for (int i = 0; i < collectionsTagImagesCombobox->count(); ++i)
1387 {
1388 if (collectionsTagImagesCombobox->checkstate(i)== 0)
1389 {
1390 for (int j = 0; j < selectedIndexes.size(); ++j)
1391 {
1392 pImages->previewImagesList.at(selectedIndexes.at(j))->tags.removeAll(collectionsTagImagesCombobox->itemText(i));
1393 }
1394 }
1395 else if (collectionsTagImagesCombobox->checkstate(i)== 1)
1396 {
1397 for (int j = 0; j < selectedIndexes.size(); ++j)
1398 {
1399 if (!pImages->previewImagesList.at(selectedIndexes.at(j))->tags.contains(collectionsTagImagesCombobox->itemText(i)))
1400 {
1401 pImages->previewImagesList.at(selectedIndexes.at(j))->tags.append(collectionsTagImagesCombobox->itemText(i));
1402 }
1403 }
1404 }
1405 }
1406
1407
1408 collectionWriterThread *tmpCwt;
1409
1410 currCollection->imageFiles.clear();
1411 currCollection->tags.clear();
1412
1413 for (int i = 0; i < pImages->previewImagesList.size(); ++i)
1414 {
1415 currCollection->imageFiles.append(pImages->previewImagesList.at(i)->fileInformation.absoluteFilePath());
1416 currCollection->tags.append(pImages->previewImagesList.at(i)->tags);
1417 }
1418
1419 tmpCwt = new collectionWriterThread(currCollection->file, *currCollection);
1420 connect(tmpCwt, SIGNAL(finished()), this, SLOT(collectionWriterThreadListFinished()));
1421 cwtList.append(tmpCwt);
1422 tmpCwt->start();
1423 }
1424
1425
collectionsAddNewTagButtonClicked()1426 void PictureBrowser::collectionsAddNewTagButtonClicked()
1427 {
1428 QString newTag = collectionsAddNewTagLineedit->text();
1429
1430 if (!newTag.isEmpty())
1431 collectionsTagImagesCombobox->addItem(newTag, 1);
1432 else
1433 ScMessageBox::warning(this, tr("Picture Browser Error"), tr("No tag entered"));
1434 }
1435
jumpToImageFolder()1436 void PictureBrowser::jumpToImageFolder()
1437 {
1438 QString searchDir = informationFilePathLabel->text();
1439 QDir dir(searchDir);
1440
1441 if (!dir.exists())
1442 return;
1443
1444 currPath = searchDir;
1445 folderView->setCurrentIndex(folderModel.index(currPath));
1446 folderView->scrollTo(folderView->currentIndex(), QAbstractItemView::PositionAtTop);
1447
1448 if (!fit)
1449 {
1450 fit = new findImagesThread(currPath, nameFilters, QDir::Name, folderBrowserIncludeSubdirs);
1451 connect(fit, SIGNAL(finished()), this, SLOT(findImagesThreadFinished()));
1452 fit->start();
1453 }
1454 else
1455 {
1456 fit->restart();
1457 }
1458 navigationBox->setCurrentIndex(0);
1459 }
1460
1461
collectionsRemoveImagesButtonClicked()1462 void PictureBrowser::collectionsRemoveImagesButtonClicked()
1463 {
1464 collectionWriterThread *tmpCwt;
1465 QList<previewImage *> tmpPreviewImagesList;
1466
1467 for (int i = 0; i < selectedIndexes.size(); ++i)
1468 {
1469 tmpPreviewImagesList.append(pImages->previewImagesList.takeAt(selectedIndexes.at(i)));
1470 }
1471
1472 //update view
1473 updateBrowser(false, false, false);
1474
1475 for (int i = 0; i < tmpPreviewImagesList.size(); ++i)
1476 {
1477 delete tmpPreviewImagesList.at(i);
1478 }
1479
1480 currCollection->imageFiles.clear();
1481 currCollection->tags.clear();
1482
1483 for (int i = 0; i < pImages->previewImagesList.size(); ++i)
1484 {
1485 currCollection->imageFiles.append(pImages->previewImagesList.at(i)->fileInformation.absoluteFilePath());
1486 currCollection->tags.append(pImages->previewImagesList.at(i)->tags);
1487 }
1488
1489 tmpCwt = new collectionWriterThread(currCollection->file, *currCollection);
1490 connect(tmpCwt, SIGNAL(finished()), this, SLOT(collectionWriterThreadListFinished()));
1491 cwtList.append(tmpCwt);
1492 tmpCwt->start();
1493 }
1494
1495
collectionsTagImagesButtonClicked()1496 void PictureBrowser::collectionsTagImagesButtonClicked()
1497 {
1498 }
1499
1500
collectionsAddImagesOkButtonClicked()1501 void PictureBrowser::collectionsAddImagesOkButtonClicked()
1502 {
1503 QTreeWidgetItem *tmpItem, *tmpItem2;
1504 QString collectionFile;
1505 collectionReaderThread *tmpCrt;
1506
1507 QStringList addImages;
1508
1509 for (int k = 0; k < selectedIndexes.size(); ++k)
1510 {
1511 addImages.append(pModel->modelItemsList.at(selectedIndexes.at(k))->fileInformation.absoluteFilePath());
1512 }
1513
1514
1515 for (int i = 0; i < collectionsWidget->topLevelItemCount(); ++i)
1516 {
1517 tmpItem = collectionsWidget->topLevelItem(i);
1518
1519 for (int j = 0; j < tmpItem->childCount(); ++j)
1520 {
1521 tmpItem2 = tmpItem->child(j);
1522
1523 if (tmpItem2->checkState(0)== Qt::Checked)
1524 {
1525 //add images here
1526 collectionFile = tmpItem2->data(0, Qt::UserRole).toString();
1527
1528 tmpCrt = new collectionReaderThread(collectionFile, false);
1529 tmpCrt->addImages = addImages;
1530 connect(tmpCrt, SIGNAL(finished()), this, SLOT(collectionReaderThreadListFinishedSave()));
1531 crtList.append(tmpCrt);
1532 tmpCrt->start();
1533 }
1534 }
1535 }
1536
1537 collectionsStackedwidget->setCurrentIndex(0);
1538 updateCollectionsWidget(false);
1539 collectionsWidget->blockSignals(false);
1540 }
1541
1542
collectionsAddImagesCancelButtonClicked()1543 void PictureBrowser::collectionsAddImagesCancelButtonClicked()
1544 {
1545 collectionsStackedwidget->setCurrentIndex(0);
1546 updateCollectionsWidget(false);
1547 collectionsWidget->blockSignals(false);
1548 }
1549
1550
updateBrowser(bool filter,bool sort,bool reload)1551 void PictureBrowser::updateBrowser(bool filter, bool sort, bool reload)
1552 {
1553 if (filter)
1554 applyFilters();
1555
1556 if (sort)
1557 {
1558 if (pImages)
1559 pImages->sortPreviewImages(pbSettings.sortSetting);
1560 }
1561
1562 if (reload)
1563 {
1564 previewImage *tmpImage;
1565
1566 //force reload, check if needed is necessary
1567 for (int i = 0; i < pImages->previewImagesList.size(); ++i)
1568 {
1569 tmpImage = pImages->previewImagesList.at(i);
1570 tmpImage->previewImageLoading = false;
1571 tmpImage->previewIconCreated = false;
1572 }
1573 }
1574
1575 if (pModel)
1576 pModel->setModelItemsList(pImages->previewImagesList);
1577 statusLabel->setText(tr("%1 image(s) displayed, %2 image(s) filtered").arg(imagesDisplayed).arg(imagesFiltered));
1578 }
1579
1580
loadIcons()1581 void PictureBrowser::loadIcons()
1582 {
1583 IconManager& im = IconManager::instance();
1584
1585 iconArrowUp = QIcon(im.loadIcon("pitr_green_arrows_set_1.svg"));
1586 iconArrowDown = QIcon(im.loadIcon("pitr_green_arrows_set_5.svg"));
1587 iconFolderBrowser = QIcon(im.loadIcon("sarxos_Simple_Folder_Seek.svg"));
1588 iconCollectionsBrowser = QIcon(im.loadIcon("sarxos_Simple_Green_Yellow_Blue_Violet_Folders.svg"));
1589 iconDocumentBrowser = QIcon(im.loadIcon("sarxos_Paper_Sheets.svg"));
1590 iconDocument = QIcon(im.loadIcon("doc.png"));
1591 iconCollection = QIcon(im.loadIcon("cmyk.png"));
1592 iconOk = QIcon(im.loadIcon("ok22.png"));
1593 iconClose = QIcon(im.loadIcon("/16/close.png"));
1594 iconZoomPlus = QIcon(im.loadIcon("viewmagin.png"));
1595 iconZoomMinus = QIcon(im.loadIcon("viewmagout.png"));
1596 iconNew = QIcon(im.loadIcon("/16/insert-table.png"));
1597 iconNew2 = QIcon(im.loadIcon("/16/document-new.png"));
1598 iconEdit = QIcon(im.loadIcon("/16/document-properties.png"));
1599 iconRemove = QIcon(im.loadIcon("/16/edit-cut.png"));
1600 iconLoad = QIcon(im.loadIcon("/16/document-open.png"));
1601 iconSave = QIcon(im.loadIcon("/16/document-save.png"));
1602 iconPlus = QIcon(im.loadIcon("/16/list-add.png"));
1603 iconMinus = QIcon(im.loadIcon("/16/list-remove.png"));
1604 iconPen = QIcon(im.loadIcon("/16/story-editor.png"));
1605
1606 collectionsNewCategoryButton->setIcon(iconNew);
1607 collectionsNewButton->setIcon(iconNew2);
1608 collectionsRenameButton->setIcon(iconEdit);
1609 collectionsDeleteButton->setIcon(iconRemove);
1610 collectionsImportButton->setIcon(iconLoad);
1611 collectionsExportButton->setIcon(iconSave);
1612 collectionsAddImagesButton->setIcon(iconPlus);
1613 collectionsRemoveImagesButton->setIcon(iconMinus);
1614 collectionsTagImagesButton->setIcon(iconPen);
1615 collectionsAddImagesOkButton->setIcon(iconOk);
1616 collectionsAddImagesCancelButton->setIcon(iconClose);
1617
1618 navigationBox->setItemIcon(0, iconFolderBrowser);
1619 navigationBox->setItemIcon(1, iconCollectionsBrowser);
1620 navigationBox->setItemIcon(2, iconDocumentBrowser);
1621
1622 zoomPlusButton->setIcon(iconZoomPlus);
1623 zoomMinusButton->setIcon(iconZoomMinus);
1624
1625 actionsGoButton->setIcon(iconOk);
1626
1627 closeButton->setIcon(iconClose);
1628
1629 moreButton->setIcon(iconArrowDown);
1630
1631 filterSearchDirButton->setIcon(im.loadIcon("ellipsis.png"));
1632 }
1633
1634
setSettings()1635 void PictureBrowser::setSettings()
1636 {
1637 //set settings
1638 if (pbSettings.saveSettings)
1639 {
1640 saveSettingsCheckbox->setCheckState(Qt::Checked);
1641 }
1642
1643 if (pbSettings.showMore)
1644 {
1645 expandDialog(true);
1646 }
1647 else
1648 {
1649 expandDialog(false);
1650 }
1651
1652 if (pbSettings.sortOrder)
1653 {
1654 sortOrderButton->setIcon(iconArrowUp);
1655 }
1656 else
1657 {
1658 sortOrderButton->setIcon(iconArrowDown);
1659 }
1660
1661 sortCombobox->setCurrentIndex(pbSettings.sortSetting);
1662 previewModeCombobox->setCurrentIndex(pbSettings.previewMode);
1663
1664 if (pbSettings.alwaysOnTop)
1665 {
1666 alwaysOnTopCheckbox->setCheckState(Qt::Checked);
1667 setAlwaysOnTop(true);
1668 }
1669 }
1670
changedDocument(ScribusDoc * doc)1671 void PictureBrowser::changedDocument(ScribusDoc* doc)
1672 {
1673 m_Doc = doc;
1674
1675 unitChange();
1676 updateDocumentBrowser();
1677 actionsGoButton->setEnabled(true);
1678 insertImageButton->setEnabled(true);
1679 documentChanged=true;
1680 dirChosen(folderModel.index( QDir::currentPath()));
1681 }
1682
closedDocument()1683 void PictureBrowser::closedDocument()
1684 {
1685 documentWidget->clear();
1686 documentItems.clear();
1687 m_Doc = nullptr;
1688 pImages->clearPreviewImagesList();
1689 updateBrowser(false, false, false);
1690 actionsGoButton->setEnabled(false);
1691 insertImageButton->setEnabled(false);
1692 }
1693
updateDocumentBrowser()1694 void PictureBrowser::updateDocumentBrowser()
1695 {
1696 documentWidget->clear();
1697 documentItems.clear();
1698 QTreeWidgetItem* allpages=new QTreeWidgetItem(documentWidget, QStringList("All Pages"));
1699 allpages->setData(0, Qt::UserRole, 0);
1700 allpages->setExpanded(true);
1701 documentWidget->addTopLevelItem(allpages);
1702
1703 QTreeWidgetItem *tmpItem;
1704
1705 for (int i = 0; i < (int)(m_Doc->Pages->count()); ++i)
1706 {
1707 tmpItem = new QTreeWidgetItem(allpages, QStringList(QString("Page %1").arg(i+1)));
1708 tmpItem->setData(0, Qt::UserRole,(i+1));
1709 tmpItem->setIcon(0, iconDocument);
1710 documentItems.append(tmpItem);
1711 }
1712
1713 documentWidget->insertTopLevelItems(0, documentItems);
1714 }
1715
1716
previewImageSelectionChanged(const QItemSelection & selected,const QItemSelection & deselected)1717 void PictureBrowser::previewImageSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected)
1718 {
1719 QItemSelectionModel *selectionModel = imageViewArea->SelectionModel();
1720 QModelIndexList selection = selectionModel->selectedIndexes();
1721 int tmpIndex;
1722
1723 selectedIndexes.clear();
1724
1725 for (int i = 0; i < selection.size(); ++i)
1726 {
1727 tmpIndex = selection.at(i).row();
1728
1729 //take filtered images into account
1730 for (int j = 0;(j <= tmpIndex)&&(j < pImages->previewImagesList.size()); ++j)
1731 {
1732 if (pImages->previewImagesList.at(j)->filtered)
1733 {
1734 tmpIndex++;
1735 }
1736 }
1737
1738 selectedIndexes.append(tmpIndex);
1739 }
1740
1741 updateTagImagesTab();
1742 }
1743
1744
updateInformationTab(int index)1745 void PictureBrowser::updateInformationTab(int index)
1746 {
1747 if (pbSettings.showMore &&(tabWidget->currentIndex() == 0))
1748 {
1749 if ((index >= 0) && (index < pModel->modelItemsList.size()))
1750 {
1751 previewImage *tmpImage;
1752 tmpImage = pModel->modelItemsList.at(index);
1753
1754 informationFileNameLabel->setText(tmpImage->fileInformation.fileName());
1755 informationFilePathLabel->setText(tmpImage->fileInformation.absolutePath());
1756 informationFileSizeLabel->setText(QString("%1 Bytes").arg(tmpImage->fileInformation.size()));
1757 informationFileDateLabel->setText(tmpImage->fileInformation.lastModified().toString("dd.MM.yyyy hh:mm:ss"));
1758 informationFilePathLabel->setToolTip(tmpImage->fileInformation.absoluteFilePath());
1759
1760 if (tmpImage->previewImageLoading)
1761 informationFileNameLabel->setText (tr("Image still loading"));
1762 else if (tmpImage->imgInfo->valid)
1763 {
1764 QString format;
1765
1766 switch (tmpImage->imgInfo->type)
1767 {
1768 case 0:
1769 format = tr("JPG");
1770 break;
1771
1772 case 1:
1773 format = tr("TIFF");
1774 break;
1775
1776 case 2:
1777 format = tr("PSD");
1778 break;
1779
1780 case 3:
1781 format = tr("EPS/PS");
1782 break;
1783
1784 case 4:
1785 format = tr("PDF");
1786 break;
1787
1788 case 5:
1789 format = tr("JPG2000");
1790 break;
1791
1792 case 6:
1793 format = tmpImage->fileInformation.suffix().toUpper();
1794 break;
1795
1796 case 7:
1797 format = tr("emb. PSD");
1798 break;
1799
1800 default:
1801 format = tr("not available");
1802 break;
1803 }
1804
1805 informationFormatLabel->setText(format);
1806 informationColorspaceLabel->setText(colorSpaceText(tmpImage->imgInfo->colorspace));
1807 informationDpiLabel->setText(QString("%1 x %2").arg(tmpImage->imgInfo->xdpi).arg(tmpImage->imgInfo->ydpi));
1808 informationWidthLabel->setText(QString("%1 Pixels").arg(tmpImage->imgInfo->width));
1809 informationHeightLabel->setText(QString("%1 Pixels").arg(tmpImage->imgInfo->height));
1810 informationLayersLabel->setText(QString("%1").arg(tmpImage->imgInfo->layers));
1811
1812 if (tmpImage->imgInfo->embedded)
1813 informationEmbeddedLabel->setText(QString("Yes"));
1814 else
1815 informationEmbeddedLabel->setText(QString("No"));
1816
1817 informationProfileNameLabel->setText(QString("%1").arg(tmpImage->imgInfo->profileName));
1818 }
1819 }
1820 else
1821 {
1822 informationFileNameLabel->setText(tr("No image selected"));
1823 }
1824 }
1825 }
1826
1827
updateCollectionsWidget(bool addImages)1828 void PictureBrowser::updateCollectionsWidget(bool addImages)
1829 {
1830 collectionsWidget->blockSignals(true);
1831 collectionsWidget->clear();
1832
1833 for (int i = 0; i < collectionsDb.size(); ++i)
1834 {
1835 collections *tmpCollections = collectionsDb.at(i);
1836
1837 QTreeWidgetItem *tmpCategory;
1838 tmpCategory = new QTreeWidgetItem(collectionsWidget, QStringList(tmpCollections->name));
1839 tmpCategory->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled);
1840 tmpCategory->setData(0, Qt::UserRole, QString("Category"));
1841 tmpCategory->setExpanded(true);
1842
1843 for (int j = 0; j < tmpCollections->collectionNames.size(); ++j)
1844 {
1845 QTreeWidgetItem *tmpItem;
1846 tmpItem = new QTreeWidgetItem(tmpCategory, QStringList(tmpCollections->collectionNames.at(j)));
1847
1848 if (addImages)
1849 {
1850 tmpItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
1851 tmpItem->setCheckState(0, Qt::Unchecked);
1852 }
1853 else
1854 {
1855 tmpItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled);
1856 }
1857
1858 tmpItem->setData(0, Qt::UserRole, tmpCollections->collectionFiles.at(j));
1859 tmpItem->setIcon(0, iconCollection);
1860 }
1861 }
1862
1863 collectionsWidget->blockSignals(false);
1864 }
1865
1866
updateCollectionsAddImagesCombobox()1867 void PictureBrowser::updateCollectionsAddImagesCombobox()
1868 {
1869 /*
1870 collections *tmpCollections;
1871
1872 for (int i = 0; i < collectionsDb.size(); ++i)
1873 {
1874 tmpCollections = collectionsDb.at(i);
1875
1876 for (int j = 0; j < tmpCollections->collectionNames.size(); ++j)
1877 {
1878 collectionsAddImagesCombobox->addItem(QString("%1/%2").arg(tmpCollections->name).arg(tmpCollections->collectionNames.at(j)), false);
1879 }
1880 }*/
1881 }
1882
1883
expandDialog(bool expand)1884 void PictureBrowser::expandDialog(bool expand)
1885 {
1886 if (expand)
1887 {
1888 tabWidget->show();
1889
1890 resize(872, 550);
1891 moreButton->setText(tr("Hide"));
1892 moreButton->setIcon(iconArrowUp);
1893 }
1894 else
1895 {
1896 tabWidget->hide();
1897
1898 resize(872, 385);
1899 moreButton->setText(tr("More"));
1900 moreButton->setIcon(iconArrowDown);
1901 }
1902 }
1903
1904
setAlwaysOnTop(bool alwaysOnTop)1905 void PictureBrowser::setAlwaysOnTop(bool alwaysOnTop)
1906 {
1907 Qt::WindowFlags flags = windowFlags();
1908
1909 //save current position of the window
1910 QPoint pos = mapToParent(QPoint(0, 0));
1911
1912 if (alwaysOnTop)
1913 flags |= Qt::WindowStaysOnTopHint;
1914 else
1915 flags ^= Qt::WindowStaysOnTopHint;
1916 this->setWindowFlags(flags);
1917
1918 //move to previous position
1919 move(pos);
1920
1921 //FIXME: calling setWindowFlags sets window invisible (odd behaviour, documented). causes flickering
1922 this->show();
1923 }
1924
1925
saveCollectionsDb()1926 void PictureBrowser::saveCollectionsDb()
1927 {
1928 QTreeWidgetItem *tmpItem, *tmpItem2;
1929 collections *tmpCollections;
1930
1931 for (int i = 0; i < collectionsDb.size(); ++i)
1932 {
1933 delete collectionsDb.at(i);
1934 }
1935
1936 collectionsDb.clear();
1937
1938
1939 for (int i = 0; i < collectionsWidget->topLevelItemCount(); ++i)
1940 {
1941 tmpItem = collectionsWidget->topLevelItem(i);
1942
1943 tmpCollections = new collections(tmpItem->text(0));
1944 collectionsDb.append(tmpCollections);
1945
1946 for (int j = 0; j < tmpItem->childCount(); ++j)
1947 {
1948 tmpItem2 = tmpItem->child(j);
1949 tmpCollections->collectionNames.append(tmpItem2->text(0));
1950 tmpCollections->collectionFiles.append(tmpItem2->data(0, Qt::UserRole).toString());
1951 }
1952 }
1953
1954
1955 if (!cdbwt)
1956 {
1957 cdbwt = new collectionsWriterThread(cdbFile, collectionsDb);
1958 connect(cdbwt, SIGNAL(finished()), this, SLOT(collectionsDbWriterThreadFinished()));
1959 cdbwt->start();
1960 }
1961 else
1962 {
1963 cdbwt->restart();
1964 }
1965 }
1966
1967
applyFilters()1968 void PictureBrowser::applyFilters()
1969 {
1970 QListWidgetItem *item;
1971 int c[5] = {0, 0, 0, 0, 0};
1972 int filterType;
1973
1974 pImages->clearFilters();
1975
1976 for (int i = 0; i < filterFiltersListwidget->count(); ++i)
1977 {
1978 item = filterFiltersListwidget->item(i);
1979 filterType = filters->filterMap.at(i);
1980
1981 if (item->checkState() == Qt::Checked)
1982 {
1983 switch (filterType)
1984 {
1985 case 0:
1986 if (c[0] < filters->nameFilters.size())
1987 {
1988 pImages->filterFileName(filters->nameFilters.at(c[0]), filters->nameInverts.at(c[0]));
1989 }
1990 break;
1991
1992 case 1:
1993 if (c[1] < filters->dateFilters.size())
1994 {
1995 pImages->filterFileModified(filters->dateFilters.at(c[1]), filters->dateInverts.at(c[1]));
1996 }
1997 break;
1998
1999 case 2:
2000 if (c[2] < filters->sizeFilters.size())
2001 {
2002 pImages->filterFileSize(( filters->sizeFilters.at(c[2])*1024), filters->sizeInverts.at(c[2]));
2003 }
2004 break;
2005
2006 case 3:
2007 if (c[3] < filters->typeFilters.size())
2008 {
2009 pImages->filterFileType(filters->typeFilters.at(c[3]), true);
2010 }
2011 break;
2012
2013 case 4:
2014 if (c[4] < filters->tagFilters.size())
2015 {
2016 pImages->filterTag(filters->tagFilters.at(c[4]), true);
2017 }
2018 break;
2019 }
2020 }
2021
2022 c[filterType]++;
2023 }
2024 }
2025
2026
updateTagImagesTab()2027 void PictureBrowser::updateTagImagesTab()
2028 {
2029 QStringList tmpTags, tmpTagList;
2030
2031
2032 collectionsSelectedImagesListwidget->clear();
2033 collectionsTagImagesCombobox->clear();
2034
2035
2036 for (int i = 0;(i < selectedIndexes.size())&&(i < currCollection->imageFiles.size()); ++i)
2037 {
2038 new QListWidgetItem(pImages->previewImagesList.at(selectedIndexes.at(i))->fileInformation.absoluteFilePath(), collectionsSelectedImagesListwidget);
2039 }
2040
2041 for (int i = 0; i < currCollection->tags.size(); ++i)
2042 {
2043 tmpTags = currCollection->tags.at(i);
2044
2045 for (int j = 0; j < tmpTags.size(); ++j)
2046 {
2047 if (!tmpTagList.contains(tmpTags.at(j)))
2048 tmpTagList.append(tmpTags.at(j));
2049 }
2050 }
2051
2052
2053 for (int i = 0; i < tmpTagList.size(); ++i)
2054 {
2055 collectionsTagImagesCombobox->addItem(tmpTagList.at(i), 0);
2056
2057 int tagCount=0;
2058
2059 for (int j = 0; j < selectedIndexes.size(); ++j)
2060 {
2061 if (pImages->previewImagesList.at(selectedIndexes.at(j))->tags.contains(tmpTagList.at(i)))
2062 {
2063 tagCount++;
2064 }
2065 else if (tagCount > 0)
2066 {
2067 break;
2068 }
2069 }
2070
2071 if (tagCount == selectedIndexes.size())
2072 {
2073 collectionsTagImagesCombobox->setCheckstate(i, 1);
2074 }
2075 else if (tagCount > 0)
2076 {
2077 collectionsTagImagesCombobox->setCheckstate(i, 2);
2078 }
2079 }
2080 }
2081
iconSetChange()2082 void PictureBrowser::iconSetChange()
2083 {
2084 loadIcons();
2085 }
2086
unitChange()2087 void PictureBrowser::unitChange()
2088 {
2089 if (m_Doc == nullptr)
2090 return;
2091
2092 QSignalBlocker insertPositionXSpinboxBlocker(insertPositionXSpinbox);
2093 QSignalBlocker insertPositionYSpinboxBlocker(insertPositionYSpinbox);
2094 QSignalBlocker insertWidthSpinboxBlocker(insertWidthSpinbox);
2095 QSignalBlocker insertHeightSpinboxBlocker(insertHeightSpinbox);
2096
2097 insertPositionXSpinbox->setNewUnit(m_Doc->unitIndex());
2098 insertPositionYSpinbox->setNewUnit(m_Doc->unitIndex());
2099 insertWidthSpinbox->setNewUnit(m_Doc->unitIndex());
2100 insertHeightSpinbox->setNewUnit(m_Doc->unitIndex());
2101 }
2102
imageFilters()2103 imageFilters::imageFilters()
2104 {
2105 }
2106
2107
PictureBrowserSettings()2108 PictureBrowserSettings::PictureBrowserSettings() :
2109 saveSettings(false),
2110 showMore(false),
2111 sortOrder(false),
2112 sortSetting(0),
2113 previewMode(0),
2114 previewIconSize(0),
2115 alwaysOnTop(false)
2116 {
2117 }
2118
2119
load()2120 void PictureBrowserSettings::load()
2121 {
2122 PrefsContext *pictureBrowserPluginPrefs = PrefsManager::instance().prefsFile->getPluginContext("picturebrowser");
2123
2124 saveSettings = pictureBrowserPluginPrefs->getBool("pb_savesettings", true);
2125 showMore = pictureBrowserPluginPrefs->getBool("pb_showmore", false);
2126 sortOrder = pictureBrowserPluginPrefs->getBool("pb_sortorder", false);
2127 sortSetting = pictureBrowserPluginPrefs->getInt("pb_sortsetting", 0);
2128 previewMode = pictureBrowserPluginPrefs->getInt("pb_previewmode", 0);
2129 previewIconSize = pictureBrowserPluginPrefs->getInt("pb_previewiconsize", 128);
2130 alwaysOnTop = pictureBrowserPluginPrefs->getBool("pb_alwaysontop", false);
2131
2132 // default value "dog" will be used if "s" doesn't already exist
2133 //QString s = myPluginPrefs->get("s", "dog");
2134 }
2135
2136
save()2137 void PictureBrowserSettings::save()
2138 {
2139 PrefsContext *pictureBrowserPluginPrefs = PrefsManager::instance().prefsFile->getPluginContext("picturebrowser");
2140
2141 pictureBrowserPluginPrefs->set("pb_savesettings", saveSettings);
2142 pictureBrowserPluginPrefs->set("pb_showmore", showMore);
2143 pictureBrowserPluginPrefs->set("pb_sortorder", sortOrder);
2144 pictureBrowserPluginPrefs->set("pb_sortsetting", sortSetting);
2145 pictureBrowserPluginPrefs->set("pb_previewmode", previewMode);
2146 pictureBrowserPluginPrefs->set("pb_previewiconsize", previewIconSize);
2147 pictureBrowserPluginPrefs->set("pb_alwaysontop", alwaysOnTop);
2148
2149 //pictureBrowserPluginPrefs->set("previewMode", "cat");
2150 }
2151
2152
reset()2153 void PictureBrowserSettings::reset()
2154 {
2155 saveSettings = true;
2156 showMore = false;
2157 sortOrder = false;
2158 sortSetting = 0;
2159 previewMode = 0;
2160 previewIconSize = 128;
2161 alwaysOnTop = false;
2162
2163 save();
2164 }
2165