• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdegraphics API Reference
  • KDE Home
  • Contact Us
 

kipi-plugins/common/libkipiplugins

  • kde-4.x
  • kdegraphics
  • kipi-plugins
  • common
  • libkipiplugins
  • widgets
kpimageslist.cpp
Go to the documentation of this file.
1 /* ============================================================
2  *
3  * This file is a part of KDE project
4  *
5  *
6  * Date : 2008-05-21
7  * Description : widget to display an imagelist
8  *
9  * Copyright (C) 2006-2018 by Gilles Caulier <caulier dot gilles at gmail dot com>
10  * Copyright (C) 2008-2010 by Andi Clemens <andi dot clemens at googlemail dot com>
11  * Copyright (C) 2009-2010 by Luka Renko <lure at kubuntu dot org>
12  *
13  * This program is free software; you can redistribute it
14  * and/or modify it under the terms of the GNU General
15  * Public License as published by the Free Software Foundation;
16  * either version 2, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * ============================================================ */
24 
25 #include "kpimageslist.h"
26 
27 // Qt includes
28 
29 #include <QDragEnterEvent>
30 #include <QFileInfo>
31 #include <QGridLayout>
32 #include <QGroupBox>
33 #include <QMimeData>
34 #include <QHeaderView>
35 #include <QLabel>
36 #include <QPainter>
37 #include <QPushButton>
38 #include <QUrl>
39 #include <QTimer>
40 #include <QFile>
41 #include <QPointer>
42 #include <QXmlStreamAttributes>
43 #include <QStringRef>
44 #include <QString>
45 #include <QStandardPaths>
46 #include <QFileDialog>
47 #include <QIcon>
48 #include <QApplication>
49 #include <QStyle>
50 
51 // KDE includes
52 
53 #include <klocalizedstring.h>
54 
55 // Libkipi includes
56 
57 #include <KIPI/ImageCollection>
58 #include <KIPI/Interface>
59 #include <KIPI/PluginLoader>
60 
61 // Local includes
62 
63 #include "kpimageinfo.h"
64 #include "kpimagedialog.h"
65 #include "kipiplugins_debug.h"
66 #include "kputil.h"
67 
68 using namespace KIPIPlugins;
69 
70 namespace KIPIPlugins
71 {
72 
73 const int DEFAULTSIZE = 48;
74 
75 class KPImagesListViewItem::Private
76 {
77 public:
78 
79  Private()
80  {
81  rating = -1;
82  view = nullptr;
83  state = Waiting;
84  hasThumb = false;
85  }
86 
87  bool hasThumb; // True if thumbnails is a real photo thumbs
88 
89  int rating; // Image Rating from Kipi host.
90  QString comments; // Image comments from Kipi host.
91  QStringList tags; // List of keywords from Kipi host.
92  QUrl url; // Image url provided by Kipi host.
93  QPixmap thumb; // Image thumbnail.
94  KPImagesListView* view;
95  State state;
96 };
97 
98 KPImagesListViewItem::KPImagesListViewItem(KPImagesListView* const view, const QUrl& url)
99  : QTreeWidgetItem(view),
100  d(new Private)
101 {
102  setUrl(url);
103  setRating(-1);
104  setFlags(Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsSelectable);
105 
106  d->view = view;
107  int iconSize = d->view->iconSize().width();
108  setThumb(QIcon::fromTheme(QString::fromLatin1("image-x-generic")).pixmap(iconSize, iconSize, QIcon::Disabled), false);
109 
110  qCDebug(KIPIPLUGINS_LOG) << "Creating new ImageListViewItem with url " << d->url
111  << " for list view " << d->view;
112 }
113 
114 KPImagesListViewItem::~KPImagesListViewItem()
115 {
116  delete d;
117 }
118 
119 bool KPImagesListViewItem::hasValidThumbnail() const
120 {
121  return d->hasThumb;
122 }
123 
124 void KPImagesListViewItem::updateInformation()
125 {
126  if (d->view->iface())
127  {
128  KPImageInfo info(d->url);
129 
130  setComments(info.description());
131 
132  setTags(QStringList());
133 
134  if (d->view->iface()->hasFeature(HostSupportsTags))
135  {
136  setTags(info.keywords());
137  }
138 
139  if (d->view->iface()->hasFeature(HostSupportsRating))
140  {
141  setRating(info.rating());
142  }
143  }
144 }
145 
146 void KPImagesListViewItem::setUrl(const QUrl& url)
147 {
148  d->url = url;
149  setText(KPImagesListView::Filename, d->url.fileName());
150 }
151 
152 QUrl KPImagesListViewItem::url() const
153 {
154  return d->url;
155 }
156 
157 void KPImagesListViewItem::setComments(const QString& comments)
158 {
159  d->comments = comments;
160 }
161 
162 QString KPImagesListViewItem::comments() const
163 {
164  return d->comments;
165 }
166 
167 void KPImagesListViewItem::setTags(const QStringList& tags)
168 {
169  d->tags = tags;
170 }
171 
172 QStringList KPImagesListViewItem::tags() const
173 {
174  return d->tags;
175 }
176 
177 void KPImagesListViewItem::setRating(int rating)
178 {
179  d->rating = rating;
180 }
181 
182 int KPImagesListViewItem::rating() const
183 {
184  return d->rating;
185 }
186 
187 void KPImagesListViewItem::setPixmap(const QPixmap& pix)
188 {
189  QIcon icon = QIcon(pix);
190  // We make sure the preview icon stays the same regardless of the role
191  icon.addPixmap(pix, QIcon::Selected, QIcon::On);
192  icon.addPixmap(pix, QIcon::Selected, QIcon::Off);
193  icon.addPixmap(pix, QIcon::Active, QIcon::On);
194  icon.addPixmap(pix, QIcon::Active, QIcon::Off);
195  icon.addPixmap(pix, QIcon::Normal, QIcon::On);
196  icon.addPixmap(pix, QIcon::Normal, QIcon::Off);
197  setIcon(KPImagesListView::Thumbnail, icon);
198 }
199 
200 void KPImagesListViewItem::setThumb(const QPixmap& pix, bool hasThumb)
201 {
202  if (hasThumb)
203  {
204  qCDebug(KIPIPLUGINS_LOG) << "Received new thumbnail for url "
205  << d->url << " for view " << d->view;
206  }
207 
208  if (!d->view)
209  {
210  qCCritical(KIPIPLUGINS_LOG) << "This item doesn't have a tree view. "
211  << "This should never happen!";
212  return;
213  }
214 
215  int iconSize = qMax<int>(d->view->iconSize().width(), d->view->iconSize().height());
216  QPixmap pixmap(iconSize + 2, iconSize + 2);
217  pixmap.fill(Qt::transparent);
218  QPainter p(&pixmap);
219  p.drawPixmap((pixmap.width() / 2) - (pix.width() / 2), (pixmap.height() / 2) - (pix.height() / 2), pix);
220  d->thumb = pixmap;
221  setPixmap(d->thumb);
222 
223  d->hasThumb = hasThumb;
224 }
225 
226 void KPImagesListViewItem::setProgressAnimation(const QPixmap& pix)
227 {
228  QPixmap overlay = d->thumb;
229  QPixmap mask(overlay.size());
230  mask.fill(QColor(128, 128, 128, 192));
231  QPainter p(&overlay);
232  p.drawPixmap(0, 0, mask);
233  p.drawPixmap((overlay.width() / 2) - (pix.width() / 2), (overlay.height() / 2) - (pix.height() / 2), pix);
234  setPixmap(overlay);
235 }
236 
237 void KPImagesListViewItem::setProcessedIcon(const QIcon& icon)
238 {
239  setIcon(KPImagesListView::Filename, icon);
240  // reset thumbnail back to no animation pix
241  setPixmap(d->thumb);
242 }
243 
244 void KPImagesListViewItem::setState(State state)
245 {
246  d->state = state;
247 }
248 
249 KPImagesListViewItem::State KPImagesListViewItem::state() const
250 {
251  return d->state;
252 }
253 
254 KPImagesListView* KPImagesListViewItem::view() const
255 {
256  return d->view;
257 }
258 
259 // ---------------------------------------------------------------------------
260 
261 KPImagesListView::KPImagesListView(KPImagesList* const parent)
262  : QTreeWidget(parent)
263 {
264  setup(DEFAULTSIZE);
265 }
266 
267 KPImagesListView::KPImagesListView(int iconSize, KPImagesList* const parent)
268  : QTreeWidget(parent)
269 {
270  setup(iconSize);
271 }
272 
273 KPImagesListView::~KPImagesListView()
274 {
275 }
276 
277 void KPImagesListView::setup(int iconSize)
278 {
279  m_iconSize = iconSize;
280  setIconSize(QSize(m_iconSize, m_iconSize));
281  setAlternatingRowColors(true);
282  setSelectionMode(QAbstractItemView::ExtendedSelection);
283 
284  enableDragAndDrop(true);
285 
286  setSortingEnabled(false);
287  setAllColumnsShowFocus(true);
288  setRootIsDecorated(false);
289  setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
290 
291  setColumnCount(8);
292  setHeaderLabels(QStringList() << i18n("Thumbnail")
293  << i18n("File Name")
294  << i18n("User1")
295  << i18n("User2")
296  << i18n("User3")
297  << i18n("User4")
298  << i18n("User5")
299  << i18n("User6"));
300  hideColumn(User1);
301  hideColumn(User2);
302  hideColumn(User3);
303  hideColumn(User4);
304  hideColumn(User5);
305  hideColumn(User6);
306 
307  header()->setSectionResizeMode(User1, QHeaderView::Interactive);
308  header()->setSectionResizeMode(User2, QHeaderView::Interactive);
309  header()->setSectionResizeMode(User3, QHeaderView::Interactive);
310  header()->setSectionResizeMode(User4, QHeaderView::Interactive);
311  header()->setSectionResizeMode(User5, QHeaderView::Interactive);
312  header()->setSectionResizeMode(User6, QHeaderView::Stretch);
313 
314  connect(this, &KPImagesListView::itemClicked,
315  this, &KPImagesListView::slotItemClicked);
316 }
317 
318 void KPImagesListView::enableDragAndDrop(const bool enable)
319 {
320  setDragEnabled(enable);
321  viewport()->setAcceptDrops(enable);
322  setDragDropMode(enable ? QAbstractItemView::InternalMove : QAbstractItemView::NoDragDrop);
323  setDragDropOverwriteMode(enable);
324  setDropIndicatorShown(enable);
325 }
326 
327 void KPImagesListView::drawRow(QPainter* p, const QStyleOptionViewItem& opt, const QModelIndex& index) const
328 {
329  KPImagesListViewItem* const item = dynamic_cast<KPImagesListViewItem*>(itemFromIndex(index));
330 
331  if (item && !item->hasValidThumbnail())
332  {
333  KPImagesList* const view = dynamic_cast<KPImagesList*>(parent());
334 
335  if (view)
336  {
337  view->updateThumbnail(item->url());
338  }
339  }
340 
341  QTreeWidget::drawRow(p, opt, index);
342 }
343 
344 void KPImagesListView::slotItemClicked(QTreeWidgetItem* item, int column)
345 {
346  Q_UNUSED(column)
347 
348  if (!item)
349  {
350  return;
351  }
352 
353  emit signalItemClicked(item);
354 }
355 
356 void KPImagesListView::setColumnLabel(ColumnType column, const QString& label)
357 {
358  headerItem()->setText(column, label);
359 }
360 
361 void KPImagesListView::setColumnEnabled(ColumnType column, bool enable)
362 {
363  if (enable)
364  {
365  showColumn(column);
366  }
367  else
368  {
369  hideColumn(column);
370  }
371 }
372 
373 void KPImagesListView::setColumn(ColumnType column, const QString& label, bool enable)
374 {
375  setColumnLabel(column, label);
376  setColumnEnabled(column, enable);
377 }
378 
379 KPImagesListViewItem* KPImagesListView::findItem(const QUrl& url)
380 {
381  QTreeWidgetItemIterator it(this);
382 
383  while (*it)
384  {
385  KPImagesListViewItem* const lvItem = dynamic_cast<KPImagesListViewItem*>(*it);
386 
387  if (lvItem && lvItem->url() == url)
388  {
389  return lvItem;
390  }
391 
392  ++it;
393  }
394 
395  return nullptr;
396 }
397 
398 QModelIndex KPImagesListView::indexFromItem(KPImagesListViewItem* item, int column) const
399 {
400  return QTreeWidget::indexFromItem(item, column);
401 }
402 
403 void KPImagesListView::contextMenuEvent(QContextMenuEvent* e)
404 {
405  QTreeWidget::contextMenuEvent(e);
406  emit signalContextMenuRequested();
407 }
408 
409 void KPImagesListView::dragEnterEvent(QDragEnterEvent* e)
410 {
411  QTreeWidget::dragEnterEvent(e);
412 
413  if (e->mimeData()->hasUrls())
414  {
415  e->acceptProposedAction();
416  }
417 }
418 
419 void KPImagesListView::dragMoveEvent(QDragMoveEvent* e)
420 {
421  QTreeWidget::dragMoveEvent(e);
422 
423  if (e->mimeData()->hasUrls())
424  {
425  e->acceptProposedAction();
426  }
427 }
428 
429 void KPImagesListView::dropEvent(QDropEvent* e)
430 {
431  QTreeWidget::dropEvent(e);
432  QList<QUrl> list = e->mimeData()->urls();
433  QList<QUrl> urls;
434 
435  foreach(const QUrl& url, list)
436  {
437  QFileInfo fi(url.toLocalFile());
438 
439  if (fi.isFile() && fi.exists())
440  {
441  urls.append(url);
442  }
443  }
444 
445  if (!urls.isEmpty())
446  {
447  emit signalAddedDropedItems(urls);
448  }
449 }
450 
451 Interface* KPImagesListView::iface() const
452 {
453  KPImagesList* const p = dynamic_cast<KPImagesList*>(parent());
454 
455  if (p)
456  {
457  return p->iface();
458  }
459 
460  return nullptr;
461 }
462 
463 // ---------------------------------------------------------------------------
464 
465 CtrlButton::CtrlButton(const QIcon& icon, QWidget* const parent)
466  : QPushButton(parent)
467 {
468  const int btnSize = 32;
469 
470  setMinimumSize(btnSize, btnSize);
471  setMaximumSize(btnSize, btnSize);
472  setIcon(icon);
473 }
474 
475 CtrlButton::~CtrlButton()
476 {
477 }
478 
479 // ---------------------------------------------------------------------------
480 
481 class KPImagesList::Private
482 {
483 public:
484 
485  Private()
486  {
487  listView = nullptr;
488  iface = nullptr;
489  addButton = nullptr;
490  removeButton = nullptr;
491  moveUpButton = nullptr;
492  moveDownButton = nullptr;
493  clearButton = nullptr;
494  loadButton = nullptr;
495  saveButton = nullptr;
496  iconSize = DEFAULTSIZE;
497  allowRAW = true;
498  controlButtonsEnabled = true;
499  allowDuplicate = false;
500  progressCount = 0;
501  progressTimer = nullptr;
502  progressPix = KPWorkingPixmap();
503  PluginLoader* const pl = PluginLoader::instance();
504 
505  if (pl)
506  {
507  iface = pl->interface();
508  }
509  }
510 
511  bool allowRAW;
512  bool allowDuplicate;
513  bool controlButtonsEnabled;
514  int iconSize;
515 
516  CtrlButton* addButton;
517  CtrlButton* removeButton;
518  CtrlButton* moveUpButton;
519  CtrlButton* moveDownButton;
520  CtrlButton* clearButton;
521  CtrlButton* loadButton;
522  CtrlButton* saveButton;
523 
524  QList<QUrl> processItems;
525  KPWorkingPixmap progressPix;
526  int progressCount;
527  QTimer* progressTimer;
528 
529  KPImagesListView* listView;
530  Interface* iface;
531 };
532 
533 KPImagesList::KPImagesList(QWidget* const parent, int iconSize)
534  : QWidget(parent),
535  d(new Private)
536 {
537  if (iconSize != -1) // default = ICONSIZE
538  {
539  setIconSize(iconSize);
540  }
541 
542  // --------------------------------------------------------
543 
544  d->listView = new KPImagesListView(d->iconSize, this);
545  d->listView->setSelectionMode(QAbstractItemView::ExtendedSelection);
546 
547  // --------------------------------------------------------
548 
549  d->addButton = new CtrlButton(QIcon::fromTheme(QString::fromLatin1("list-add")).pixmap(16, 16), this);
550  d->removeButton = new CtrlButton(QIcon::fromTheme(QString::fromLatin1("list-remove")).pixmap(16, 16), this);
551  d->moveUpButton = new CtrlButton(QIcon::fromTheme(QString::fromLatin1("go-up")).pixmap(16, 16), this);
552  d->moveDownButton = new CtrlButton(QIcon::fromTheme(QString::fromLatin1("go-down")).pixmap(16, 16), this);
553  d->clearButton = new CtrlButton(QIcon::fromTheme(QString::fromLatin1("edit-clear")).pixmap(16, 16), this);
554  d->loadButton = new CtrlButton(QIcon::fromTheme(QString::fromLatin1("document-open")).pixmap(16, 16), this);
555  d->saveButton = new CtrlButton(QIcon::fromTheme(QString::fromLatin1("document-save")).pixmap(16, 16), this);
556 
557  d->addButton->setToolTip(i18n("Add new images to the list"));
558  d->removeButton->setToolTip(i18n("Remove selected images from the list"));
559  d->moveUpButton->setToolTip(i18n("Move current selected image up in the list"));
560  d->moveDownButton->setToolTip(i18n("Move current selected image down in the list"));
561  d->clearButton->setToolTip(i18n("Clear the list."));
562  d->loadButton->setToolTip(i18n("Load a saved list."));
563  d->saveButton->setToolTip(i18n("Save the list."));
564 
565  d->progressTimer = new QTimer(this);
566 
567  // --------------------------------------------------------
568 
569  setControlButtons(Add | Remove | MoveUp | MoveDown | Clear | Save | Load ); // add all buttons (default)
570  setControlButtonsPlacement(ControlButtonsRight); // buttons on the right (default)
571  enableDragAndDrop(true); // enable drag and drop (default)
572 
573  // --------------------------------------------------------
574 
575  connect(d->listView, &KPImagesListView::signalAddedDropedItems,
576  this, &KPImagesList::slotAddImages);
577 
578  if (d->iface)
579  {
580  connect(d->iface, &Interface::gotThumbnail,
581  this, &KPImagesList::slotThumbnail);
582  }
583 
584  connect(d->listView, &KPImagesListView::signalItemClicked,
585  this, &KPImagesList::signalItemClicked);
586 
587  connect(d->listView, &KPImagesListView::signalContextMenuRequested,
588  this, &KPImagesList::signalContextMenuRequested);
589 
590  // queue this connection because itemSelectionChanged is emitted
591  // while items are deleted, and accessing selectedItems at that
592  // time causes a crash ...
593  connect(d->listView, &KPImagesListView::itemSelectionChanged,
594  this, &KPImagesList::slotImageListChanged, Qt::QueuedConnection);
595 
596  connect(this, &KPImagesList::signalImageListChanged,
597  this, &KPImagesList::slotImageListChanged);
598 
599  // --------------------------------------------------------
600 
601  connect(d->addButton, &CtrlButton::clicked,
602  this, &KPImagesList::slotAddItems);
603 
604  connect(d->removeButton, &CtrlButton::clicked,
605  this, &KPImagesList::slotRemoveItems);
606 
607  connect(d->moveUpButton, &CtrlButton::clicked,
608  this, &KPImagesList::slotMoveUpItems);
609 
610  connect(d->moveDownButton, &CtrlButton::clicked,
611  this, &KPImagesList::slotMoveDownItems);
612 
613  connect(d->clearButton, &CtrlButton::clicked,
614  this, &KPImagesList::slotClearItems);
615 
616  connect(d->loadButton, &CtrlButton::clicked,
617  this, &KPImagesList::slotLoadItems);
618 
619  connect(d->saveButton, &CtrlButton::clicked,
620  this, &KPImagesList::slotSaveItems);
621 
622  connect(d->progressTimer, &QTimer::timeout,
623  this, &KPImagesList::slotProgressTimerDone);
624 
625  // --------------------------------------------------------
626 
627  emit signalImageListChanged();
628 }
629 
630 void KPImagesList::enableControlButtons(bool enable)
631 {
632  d->controlButtonsEnabled = enable;
633  slotImageListChanged();
634 }
635 
636 void KPImagesList::enableDragAndDrop(const bool enable)
637 {
638  d->listView->enableDragAndDrop(enable);
639 }
640 
641 void KPImagesList::setControlButtonsPlacement(ControlButtonPlacement placement)
642 {
643  delete layout();
644 
645  const int spacing = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing);
646 
647  QGridLayout* const mainLayout = new QGridLayout;
648  mainLayout->addWidget(d->listView, 1, 1, 1, 1);
649  mainLayout->setRowStretch(1, 10);
650  mainLayout->setColumnStretch(1, 10);
651  mainLayout->setContentsMargins(spacing, spacing, spacing, spacing);
652  mainLayout->setSpacing(spacing);
653 
654  // --------------------------------------------------------
655 
656  QHBoxLayout* const hBtnLayout = new QHBoxLayout;
657  hBtnLayout->addStretch(10);
658  hBtnLayout->addWidget(d->moveUpButton);
659  hBtnLayout->addWidget(d->moveDownButton);
660  hBtnLayout->addWidget(d->addButton);
661  hBtnLayout->addWidget(d->removeButton);
662  hBtnLayout->addWidget(d->loadButton);
663  hBtnLayout->addWidget(d->saveButton);
664  hBtnLayout->addWidget(d->clearButton);
665  hBtnLayout->addStretch(10);
666 
667  // --------------------------------------------------------
668 
669  QVBoxLayout* const vBtnLayout = new QVBoxLayout;
670  vBtnLayout->addStretch(10);
671  vBtnLayout->addWidget(d->moveUpButton);
672  vBtnLayout->addWidget(d->moveDownButton);
673  vBtnLayout->addWidget(d->addButton);
674  vBtnLayout->addWidget(d->removeButton);
675  vBtnLayout->addWidget(d->loadButton);
676  vBtnLayout->addWidget(d->saveButton);
677  vBtnLayout->addWidget(d->clearButton);
678  vBtnLayout->addStretch(10);
679 
680  // --------------------------------------------------------
681 
682  switch (placement)
683  {
684  case ControlButtonsAbove:
685  mainLayout->addLayout(hBtnLayout, 0, 1, 1, 1);
686  delete vBtnLayout;
687  break;
688 
689  case ControlButtonsBelow:
690  mainLayout->addLayout(hBtnLayout, 2, 1, 1, 1);
691  delete vBtnLayout;
692  break;
693 
694  case ControlButtonsLeft:
695  mainLayout->addLayout(vBtnLayout, 1, 0, 1, 1);
696  delete hBtnLayout;
697  break;
698 
699  case ControlButtonsRight:
700  mainLayout->addLayout(vBtnLayout, 1, 2, 1, 1);
701  delete hBtnLayout;
702  break;
703 
704  case NoControlButtons:
705  default:
706  {
707  delete vBtnLayout;
708  delete hBtnLayout;
709  // set all buttons invisible
710  setControlButtons(nullptr);
711  break;
712  }
713  }
714 
715  setLayout(mainLayout);
716 }
717 
718 void KPImagesList::setControlButtons(ControlButtons buttonMask)
719 {
720  d->addButton->setVisible(buttonMask & Add);
721  d->removeButton->setVisible(buttonMask & Remove);
722  d->moveUpButton->setVisible(buttonMask & MoveUp);
723  d->moveDownButton->setVisible(buttonMask & MoveDown);
724  d->clearButton->setVisible(buttonMask & Clear);
725  d->loadButton->setVisible(buttonMask & Load);
726  d->saveButton->setVisible(buttonMask & Save);
727 }
728 
729 KPImagesList::~KPImagesList()
730 {
731  delete d;
732 }
733 
734 void KPImagesList::setAllowDuplicate(bool allow)
735 {
736  d->allowDuplicate = allow;
737 }
738 
739 void KPImagesList::setAllowRAW(bool allow)
740 {
741  d->allowRAW = allow;
742 }
743 
744 void KPImagesList::setIconSize(int size)
745 {
746  if (size < 16)
747  {
748  d->iconSize = 16;
749  }
750  else if (size > 128)
751  {
752  d->iconSize = 128;
753  }
754  else
755  {
756  d->iconSize = size;
757  }
758 }
759 
760 int KPImagesList::iconSize() const
761 {
762  return d->iconSize;
763 }
764 
765 void KPImagesList::loadImagesFromCurrentSelection()
766 {
767  if (!d->iface)
768  {
769  return;
770  }
771 
772  ImageCollection selection = d->iface->currentSelection();
773 
774  if (!selection.images().isEmpty())
775  {
776  if (selection.isValid())
777  {
778  slotAddImages(selection.images());
779  }
780  }
781  else
782  {
783  loadImagesFromCurrentAlbum();
784  }
785 }
786 
787 void KPImagesList::loadImagesFromCurrentAlbum()
788 {
789  if (!d->iface)
790  {
791  return;
792  }
793 
794  ImageCollection images = d->iface->currentAlbum();
795 
796  if (images.isValid())
797  {
798  slotAddImages(images.images());
799  }
800 }
801 
802 bool KPImagesList::isRawFile(const QUrl& url) const
803 {
804  QString rawFilesExt = d->iface->rawFiles();
805  QFileInfo fileInfo(url.toLocalFile());
806 
807  return (rawFilesExt.toUpper().contains(fileInfo.suffix().toUpper()));
808 }
809 
810 void KPImagesList::slotAddImages(const QList<QUrl>& list)
811 {
812  if (list.count() == 0)
813  {
814  return;
815  }
816 
817  QList<QUrl> urls;
818  bool raw = false;
819 
820  for (QList<QUrl>::ConstIterator it = list.constBegin(); it != list.constEnd(); ++it)
821  {
822  QUrl imageUrl = *it;
823 
824  // Check if the new item already exist in the list.
825  bool found = false;
826 
827  QTreeWidgetItemIterator iter(d->listView);
828 
829  while (*iter)
830  {
831  KPImagesListViewItem* const item = dynamic_cast<KPImagesListViewItem*>(*iter);
832 
833  if (item && item->url() == imageUrl)
834  {
835  found = true;
836  }
837 
838  ++iter;
839  }
840 
841  if (d->allowDuplicate || !found)
842  {
843  // if RAW files are not allowed, skip the image
844  if (!d->allowRAW && isRawFile(imageUrl))
845  {
846  raw = true;
847  continue;
848  }
849 
850  new KPImagesListViewItem(listView(), imageUrl);
851  urls.append(imageUrl);
852  }
853  }
854 
855  emit signalAddItems(urls);
856  emit signalImageListChanged();
857  emit signalFoundRAWImages(raw);
858 }
859 
860 void KPImagesList::slotAddItems()
861 {
862  KPImageDialog dlg(this, false);
863  QList<QUrl> urls = dlg.urls();
864 
865  if (!urls.isEmpty())
866  {
867  slotAddImages(urls);
868  }
869 
870 // emit signalImageListChanged();
871 }
872 
873 void KPImagesList::slotRemoveItems()
874 {
875  QList<QTreeWidgetItem*> selectedItemsList = d->listView->selectedItems();
876  QList<QUrl> urls;
877 
878  for (QList<QTreeWidgetItem*>::const_iterator it = selectedItemsList.constBegin();
879  it != selectedItemsList.constEnd(); ++it)
880  {
881  KPImagesListViewItem* const item = dynamic_cast<KPImagesListViewItem*>(*it);
882 
883  if (item)
884  {
885  emit signalRemovingItem(item);
886  urls.append(item->url());
887 
888  if (d->processItems.contains(item->url()))
889  {
890  d->processItems.removeAll(item->url());
891  }
892 
893  d->listView->removeItemWidget(*it, 0);
894  delete *it;
895  }
896  }
897 
898  emit signalRemovedItems(urls);
899  emit signalImageListChanged();
900 }
901 
902 void KPImagesList::slotMoveUpItems()
903 {
904  // move above item down, then we don't have to fix the focus
905  QModelIndex curIndex = listView()->currentIndex();
906 
907  if (!curIndex.isValid())
908  {
909  return;
910  }
911 
912  QModelIndex aboveIndex = listView()->indexAbove(curIndex);
913 
914  if (!aboveIndex.isValid())
915  {
916  return;
917  }
918 
919  QTreeWidgetItem* const temp = listView()->takeTopLevelItem(aboveIndex.row());
920  listView()->insertTopLevelItem(curIndex.row(), temp);
921  // this is a quick fix. We loose the extra tags in flickr upload, but at list we don't get a crash
922  KPImagesListViewItem* const uw = dynamic_cast<KPImagesListViewItem*>(temp);
923 
924  if (uw)
925  uw->updateItemWidgets();
926 
927  emit signalImageListChanged();
928  emit signalMoveUpItem();
929 }
930 
931 void KPImagesList::slotMoveDownItems()
932 {
933  // move below item up, then we don't have to fix the focus
934  QModelIndex curIndex = listView()->currentIndex();
935 
936  if (!curIndex.isValid())
937  {
938  return;
939  }
940 
941  QModelIndex belowIndex = listView()->indexBelow(curIndex);
942 
943  if (!belowIndex.isValid())
944  {
945  return;
946  }
947 
948  QTreeWidgetItem* const temp = listView()->takeTopLevelItem(belowIndex.row());
949  listView()->insertTopLevelItem(curIndex.row(), temp);
950 
951  // This is a quick fix. We can loose extra tags in uploader, but at least we don't get a crash
952  KPImagesListViewItem* const uw = dynamic_cast<KPImagesListViewItem*>(temp);
953 
954  if (uw)
955  uw->updateItemWidgets();
956 
957  emit signalImageListChanged();
958  emit signalMoveDownItem();
959 }
960 
961 void KPImagesList::slotClearItems()
962 {
963  listView()->selectAll();
964  slotRemoveItems();
965  listView()->clear();
966 }
967 
968 void KPImagesList::slotLoadItems()
969 {
970  QUrl loadLevelsFile;
971 
972  loadLevelsFile = QFileDialog::getOpenFileUrl(this, i18n("Select the image file list to load"),
973  QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)),
974  i18n("All Files (*)"));
975 
976  if ( loadLevelsFile.isEmpty() )
977  {
978  qCDebug(KIPIPLUGINS_LOG) << "empty url";
979  return;
980  }
981 
982  QFile file(loadLevelsFile.toLocalFile());
983 
984  qCDebug(KIPIPLUGINS_LOG) << "file path " << loadLevelsFile.toLocalFile();
985 
986  if (!file.open(QIODevice::ReadOnly))
987  {
988  qCDebug(KIPIPLUGINS_LOG) << "Cannot open file";
989  return;
990  }
991 
992  QXmlStreamReader xmlReader;
993  xmlReader.setDevice(&file);
994 
995  while (!xmlReader.atEnd())
996  {
997  if (xmlReader.isStartElement() && xmlReader.name() == QString::fromLatin1("Image"))
998  {
999  // get all attributes and its value of a tag in attrs variable.
1000  QXmlStreamAttributes attrs = xmlReader.attributes();
1001  // get value of each attribute from QXmlStreamAttributes
1002  QStringRef url = attrs.value(QString::fromLatin1("url"));
1003 
1004  if (url.isEmpty())
1005  {
1006  xmlReader.readNext();
1007  continue;
1008  }
1009 
1010  QList<QUrl> urls;
1011  urls.append(QUrl(url.toString()));
1012 
1013  if (!urls.isEmpty())
1014  {
1015  //allow plugins to append a new file
1016  slotAddImages(urls);
1017  // read plugin Image custom attributes and children element
1018  emit signalXMLLoadImageElement(xmlReader);
1019  }
1020  }
1021  else if (xmlReader.isStartElement() && xmlReader.name() != QString::fromLatin1("Images"))
1022  {
1023  // unmanaged start element (it should be plugins one)
1024  emit signalXMLCustomElements(xmlReader);
1025  }
1026  else if (xmlReader.isEndElement() && xmlReader.name() == QString::fromLatin1("Images"))
1027  {
1028  // if EndElement is Images return
1029  return;
1030  }
1031 
1032  xmlReader.readNext();
1033  }
1034 }
1035 
1036 void KPImagesList::slotSaveItems()
1037 {
1038  QUrl saveLevelsFile;
1039  saveLevelsFile = QFileDialog::getSaveFileUrl(this, i18n("Select the image file list to save"),
1040  QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)),
1041  i18n("All Files (*)"));
1042 
1043  qCDebug(KIPIPLUGINS_LOG) << "file url " << saveLevelsFile.toDisplayString();
1044 
1045  if (saveLevelsFile.isEmpty())
1046  {
1047  qCDebug(KIPIPLUGINS_LOG) << "empty url";
1048  return;
1049  }
1050 
1051  QFile file(saveLevelsFile.toLocalFile());
1052 
1053  if (!file.open(QIODevice::WriteOnly))
1054  {
1055  qCDebug(KIPIPLUGINS_LOG) << "Cannot open target file";
1056  return;
1057  }
1058 
1059  QXmlStreamWriter xmlWriter;
1060  xmlWriter.setDevice(&file);
1061 
1062  xmlWriter.setAutoFormatting(true);
1063  xmlWriter.writeStartDocument();
1064 
1065  xmlWriter.writeStartElement(QString::fromLatin1("Images"));
1066 
1067  QTreeWidgetItemIterator it(listView());
1068 
1069  while (*it)
1070  {
1071  KPImagesListViewItem* const lvItem = dynamic_cast<KPImagesListViewItem*>(*it);
1072 
1073  if (lvItem)
1074  {
1075  xmlWriter.writeStartElement(QString::fromLatin1("Image"));
1076 
1077  xmlWriter.writeAttribute(QString::fromLatin1("url"), lvItem->url().toDisplayString());
1078 
1079  // emit xmlWriter, item?
1080  emit signalXMLSaveItem(xmlWriter, lvItem);
1081 
1082  xmlWriter.writeEndElement(); // Image
1083  }
1084 
1085  ++it;
1086  }
1087 
1088  emit signalXMLCustomElements(xmlWriter);
1089 
1090  xmlWriter.writeEndElement(); // Images
1091 
1092  xmlWriter.writeEndDocument(); // end document
1093 }
1094 
1095 void KPImagesList::removeItemByUrl(const QUrl& url)
1096 {
1097  bool found;
1098 
1099  do
1100  {
1101  found = false;
1102  QTreeWidgetItemIterator it(d->listView);
1103 
1104  while (*it)
1105  {
1106  KPImagesListViewItem* const item = dynamic_cast<KPImagesListViewItem*>(*it);
1107 
1108  if (item && item->url() == url)
1109  {
1110  emit signalRemovingItem(item);
1111 
1112  if (d->processItems.contains(item->url()))
1113  {
1114  d->processItems.removeAll(item->url());
1115  }
1116 
1117  delete item;
1118  found = true;
1119  break;
1120  }
1121 
1122  ++it;
1123  }
1124  }
1125  while (found);
1126 
1127  emit signalImageListChanged();
1128 }
1129 
1130 QList<QUrl> KPImagesList::imageUrls(bool onlyUnprocessed) const
1131 {
1132  QList<QUrl> list;
1133  QTreeWidgetItemIterator it(d->listView);
1134 
1135  while (*it)
1136  {
1137  KPImagesListViewItem* const item = dynamic_cast<KPImagesListViewItem*>(*it);
1138 
1139  if (item)
1140  {
1141  if ((onlyUnprocessed == false) || (item->state() != KPImagesListViewItem::Success))
1142  {
1143  list.append(item->url());
1144  }
1145  }
1146 
1147  ++it;
1148  }
1149 
1150  return list;
1151 }
1152 
1153 void KPImagesList::slotProgressTimerDone()
1154 {
1155  if (!d->processItems.isEmpty())
1156  {
1157  foreach(const QUrl& url, d->processItems)
1158  {
1159  KPImagesListViewItem* const item = listView()->findItem(url);
1160 
1161  if (item)
1162  item->setProgressAnimation(d->progressPix.frameAt(d->progressCount));
1163  }
1164 
1165  d->progressCount++;
1166 
1167  if (d->progressCount == 8)
1168  {
1169  d->progressCount = 0;
1170  }
1171 
1172  d->progressTimer->start(300);
1173  }
1174 }
1175 
1176 void KPImagesList::processing(const QUrl& url)
1177 {
1178  KPImagesListViewItem* const item = listView()->findItem(url);
1179 
1180  if (item)
1181  {
1182  d->processItems.append(url);
1183  d->listView->setCurrentItem(item, true);
1184  d->listView->scrollToItem(item);
1185  d->progressTimer->start(300);
1186  }
1187 }
1188 
1189 void KPImagesList::processed(const QUrl& url, bool success)
1190 {
1191  KPImagesListViewItem* const item = listView()->findItem(url);
1192 
1193  if (item)
1194  {
1195  d->processItems.removeAll(url);
1196  item->setProcessedIcon(QIcon::fromTheme(success ? QString::fromLatin1("dialog-ok-apply")
1197  : QString::fromLatin1("dialog-cancel")).pixmap(16, 16));
1198  item->setState(success ? KPImagesListViewItem::Success
1199  : KPImagesListViewItem::Failed);
1200 
1201  if (d->processItems.isEmpty())
1202  d->progressTimer->stop();
1203  }
1204 }
1205 
1206 void KPImagesList::cancelProcess()
1207 {
1208  foreach(const QUrl& url, d->processItems)
1209  {
1210  processed(url, false);
1211  }
1212 }
1213 
1214 void KPImagesList::clearProcessedStatus()
1215 {
1216  QTreeWidgetItemIterator it(d->listView);
1217 
1218  while (*it)
1219  {
1220  KPImagesListViewItem* const lvItem = dynamic_cast<KPImagesListViewItem*>(*it);
1221 
1222  if (lvItem)
1223  {
1224  lvItem->setProcessedIcon(QIcon());
1225  }
1226 
1227  ++it;
1228  }
1229 }
1230 
1231 KPImagesListView* KPImagesList::listView() const
1232 {
1233  return d->listView;
1234 }
1235 
1236 Interface* KPImagesList::iface() const
1237 {
1238  return d->iface;
1239 }
1240 
1241 void KPImagesList::slotImageListChanged()
1242 {
1243  const QList<QTreeWidgetItem*> selectedItemsList = d->listView->selectedItems();
1244  const bool haveImages = !(imageUrls().isEmpty()) && d->controlButtonsEnabled;
1245  const bool haveSelectedImages = !(selectedItemsList.isEmpty()) && d->controlButtonsEnabled;
1246  const bool haveOnlyOneSelectedImage = (selectedItemsList.count() == 1) && d->controlButtonsEnabled;
1247 
1248  d->removeButton->setEnabled(haveSelectedImages);
1249  d->moveUpButton->setEnabled(haveOnlyOneSelectedImage);
1250  d->moveDownButton->setEnabled(haveOnlyOneSelectedImage);
1251  d->clearButton->setEnabled(haveImages);
1252 
1253  // All buttons are enabled / disabled now, but the "Add" button should always be
1254  // enabled, if the buttons are not explicitly disabled with enableControlButtons()
1255  d->addButton->setEnabled(d->controlButtonsEnabled);
1256 
1257  // TODO: should they be enabled by default now?
1258  d->loadButton->setEnabled(d->controlButtonsEnabled);
1259  d->saveButton->setEnabled(d->controlButtonsEnabled);
1260 }
1261 
1262 void KPImagesList::updateThumbnail(const QUrl& url)
1263 {
1264  if (d->iface)
1265  {
1266  qCDebug(KIPIPLUGINS_LOG) << "Request to update thumbnail for " << url;
1267  d->iface->thumbnails(QList<QUrl>() << url, DEFAULTSIZE);
1268  }
1269  else
1270  {
1271  qCDebug(KIPIPLUGINS_LOG) << "No KIPI interface available : thumbnails will not generated.";
1272  }
1273 }
1274 
1275 void KPImagesList::slotThumbnail(const QUrl& url, const QPixmap& pix)
1276 {
1277  qCDebug(KIPIPLUGINS_LOG) << "KIPI host send thumb (" << pix.size() << ") for " << url;
1278 
1279  QTreeWidgetItemIterator it(d->listView);
1280 
1281  while (*it)
1282  {
1283  KPImagesListViewItem* const item = dynamic_cast<KPImagesListViewItem*>(*it);
1284 
1285  if (item && item->url() == url)
1286  {
1287  if (!pix.isNull())
1288  {
1289  qCDebug(KIPIPLUGINS_LOG) << "Update thumb in list for " << url;
1290  item->setThumb(pix.scaled(d->iconSize, d->iconSize, Qt::KeepAspectRatio));
1291  }
1292 
1293  if (!d->allowDuplicate)
1294  return;
1295  }
1296 
1297  ++it;
1298  }
1299 }
1300 
1301 KPImagesListViewItem* KPImagesListView::getCurrentItem() const
1302 {
1303  QTreeWidgetItem* const currentTreeItem = currentItem();
1304 
1305  if (!currentTreeItem)
1306  {
1307  return nullptr;
1308  }
1309 
1310  return dynamic_cast<KPImagesListViewItem*>(currentTreeItem);
1311 }
1312 
1313 QUrl KPImagesList::getCurrentUrl() const
1314 {
1315  KPImagesListViewItem* const currentItem = d->listView->getCurrentItem();
1316 
1317  if (!currentItem)
1318  {
1319  return QUrl();
1320  }
1321 
1322  return currentItem->url();
1323 }
1324 
1325 } // namespace KIPIPlugins
QWidget::layout
QLayout * layout() const
KIPIPlugins::KPImagesListViewItem::setComments
void setComments(const QString &comments)
Definition: kpimageslist.cpp:157
KIPIPlugins::KPImageInfo::keywords
QStringList keywords() const
Get keywords list (tag names) of item with KIPI host application.
Definition: kpimageinfo.cpp:416
KIPIPlugins::KPImagesList::slotMoveUpItems
virtual void slotMoveUpItems()
Definition: kpimageslist.cpp:902
QXmlStreamReader::atEnd
bool atEnd() const
QModelIndex
KIPIPlugins::KPImagesListView::User1
Definition: kpimageslist.h:126
QPixmap::size
QSize size() const
KIPIPlugins::KPImagesList::signalMoveUpItem
void signalMoveUpItem()
QWidget
QXmlStreamAttributes
QLayout::setContentsMargins
void setContentsMargins(int left, int top, int right, int bottom)
KIPIPlugins::KPImagesList::iconSize
int iconSize() const
Definition: kpimageslist.cpp:760
QTreeView::dragMoveEvent
virtual void dragMoveEvent(QDragMoveEvent *event)
QString::toUpper
QString toUpper() const
QTreeWidget::insertTopLevelItem
void insertTopLevelItem(int index, QTreeWidgetItem *item)
QAbstractItemView::setAlternatingRowColors
void setAlternatingRowColors(bool enable)
KIPIPlugins::KPImagesList::signalXMLCustomElements
void signalXMLCustomElements(QXmlStreamWriter &)
QPixmap::width
int width() const
KIPIPlugins::KPImagesList::slotThumbnail
virtual void slotThumbnail(const QUrl &url, const QPixmap &pix)
Definition: kpimageslist.cpp:1275
KIPIPlugins::KPImagesListViewItem
Definition: kpimageslist.h:56
QTreeView::showColumn
void showColumn(int column)
QTreeView::hideColumn
void hideColumn(int column)
QTreeWidget::itemClicked
void itemClicked(QTreeWidgetItem *item, int column)
KIPIPlugins::KPImagesList::MoveDown
Definition: kpimageslist.h:212
QDropEvent::mimeData
const QMimeData * mimeData() const
KIPIPlugins::KPImagesListView::User5
Definition: kpimageslist.h:130
QAbstractItemView::setSelectionMode
void setSelectionMode(QAbstractItemView::SelectionMode mode)
QXmlStreamWriter
QPixmap::fill
void fill(const QColor &color)
QGridLayout::addWidget
void addWidget(QWidget *widget, int row, int column, QFlags< Qt::AlignmentFlag > alignment)
KIPIPlugins::KPImagesListViewItem::comments
QString comments() const
Definition: kpimageslist.cpp:162
KIPIPlugins::KPImagesListViewItem::setUrl
void setUrl(const QUrl &url)
Definition: kpimageslist.cpp:146
QDragMoveEvent
KIPIPlugins::KPImagesListViewItem::Failed
Definition: kpimageslist.h:65
KIPIPlugins::KPImagesListView::getCurrentItem
KPImagesListViewItem * getCurrentItem() const
Definition: kpimageslist.cpp:1301
KIPIPlugins::KPImageInfo
Definition: kpimageinfo.h:42
KIPIPlugins::KPImagesListView::KPImagesListView
KPImagesListView(KPImagesList *const parent=nullptr)
Definition: kpimageslist.cpp:261
KIPIPlugins::KPImageDialog::urls
QList< QUrl > urls() const
Definition: kpimagedialog.cpp:398
KIPIPlugins::KPImagesList::Save
Definition: kpimageslist.h:215
QStringRef::toString
QString toString() const
QStyle::pixelMetric
virtual int pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const =0
KIPIPlugins::KPImagesList::listView
KPImagesListView * listView() const
Definition: kpimageslist.cpp:1231
KIPIPlugins::KPImagesList::Load
Definition: kpimageslist.h:214
KIPIPlugins::KPImagesListView::signalAddedDropedItems
void signalAddedDropedItems(const QList< QUrl > &)
QTreeWidgetItemIterator
KIPIPlugins::KPImagesList::signalAddItems
void signalAddItems(const QList< QUrl > &)
QTreeWidgetItem::setIcon
void setIcon(int column, const QIcon &icon)
QAbstractItemView::setDragDropMode
void setDragDropMode(DragDropMode behavior)
KIPIPlugins::KPImagesList::NoControlButtons
Definition: kpimageslist.h:200
KIPIPlugins::KPImagesList::slotProgressTimerDone
void slotProgressTimerDone()
Definition: kpimageslist.cpp:1153
KIPIPlugins::KPImagesListViewItem::Success
Definition: kpimageslist.h:64
QHBoxLayout
QTreeView::indexBelow
QModelIndex indexBelow(const QModelIndex &index) const
KIPIPlugins::KPImagesList::loadImagesFromCurrentSelection
void loadImagesFromCurrentSelection()
Definition: kpimageslist.cpp:765
QAbstractScrollArea::viewport
QWidget * viewport() const
KIPIPlugins::KPImagesList::signalRemovedItems
void signalRemovedItems(const QList< QUrl > &)
KIPIPlugins::KPImagesListViewItem::updateInformation
void updateInformation()
Definition: kpimageslist.cpp:124
KIPIPlugins::KPImagesListView::signalContextMenuRequested
void signalContextMenuRequested()
KIPIPlugins::CtrlButton::CtrlButton
CtrlButton(const QIcon &icon, QWidget *parent=nullptr)
Definition: kpimageslist.cpp:465
QGridLayout
QTreeWidget::indexFromItem
QModelIndex indexFromItem(QTreeWidgetItem *item, int column) const
QXmlStreamAttributes::value
QStringRef value(const QString &namespaceUri, const QString &name) const
KIPIPlugins::KPImagesList::ControlButtonsLeft
Definition: kpimageslist.h:201
KIPIPlugins::KPImagesListViewItem::Waiting
Definition: kpimageslist.h:63
QXmlStreamReader::setDevice
void setDevice(QIODevice *device)
KIPIPlugins::DEFAULTSIZE
const int DEFAULTSIZE
Definition: kpimageslist.cpp:73
QDropEvent::acceptProposedAction
void acceptProposedAction()
KIPIPlugins::KPImagesListViewItem::setRating
void setRating(int rating)
Definition: kpimageslist.cpp:177
KIPIPlugins::KPImagesList::iface
Interface * iface() const
Definition: kpimageslist.cpp:1236
QUrl::isEmpty
bool isEmpty() const
KIPIPlugins::KPImagesList::cancelProcess
void cancelProcess()
Definition: kpimageslist.cpp:1206
QAbstractButton::setIcon
void setIcon(const QIcon &icon)
KIPIPlugins::KPImagesList::clearProcessedStatus
void clearProcessedStatus()
Definition: kpimageslist.cpp:1214
QList::const_iterator
kpimageinfo.h
QAbstractScrollArea::contextMenuEvent
virtual void contextMenuEvent(QContextMenuEvent *e)
QFile
KIPIPlugins::KPImagesList::slotMoveDownItems
virtual void slotMoveDownItems()
Definition: kpimageslist.cpp:931
QGridLayout::setSpacing
void setSpacing(int spacing)
KIPIPlugins::KPImageInfo::description
QString description() const
Definition: kpimageinfo.cpp:162
KIPIPlugins::KPImagesList::KPImagesList
KPImagesList(QWidget *const parent=nullptr, int iconSize=-1)
Definition: kpimageslist.cpp:533
QTreeWidget::clear
void clear()
KIPIPlugins::KPImagesListView
Definition: kpimageslist.h:116
KIPIPlugins::KPImagesListView::Thumbnail
Definition: kpimageslist.h:124
KIPIPlugins::KPImagesListView::signalItemClicked
void signalItemClicked(QTreeWidgetItem *)
QStringRef
KIPIPlugins::KPImageDialog
Definition: kpimagedialog.h:70
KIPIPlugins::KPImagesList::signalRemovingItem
void signalRemovingItem(KIPIPlugins::KPImagesListViewItem *)
KIPIPlugins::KPImagesListView::Filename
Definition: kpimageslist.h:125
QWidget::size
QSize size() const
QTreeWidgetItem::icon
QIcon icon(int column) const
QTimer::timeout
void timeout()
QWidget::setMinimumSize
void setMinimumSize(const QSize &)
QTreeWidgetItem::setFlags
void setFlags(QFlags< Qt::ItemFlag > flags)
QTreeWidget
KIPIPlugins::KPImagesListView::enableDragAndDrop
void enableDragAndDrop(const bool enable=true)
Definition: kpimageslist.cpp:318
QModelIndex::isValid
bool isValid() const
KIPIPlugins::KPImagesListViewItem::view
KPImagesListView * view() const
Definition: kpimageslist.cpp:254
KIPIPlugins::KPImagesListView::iface
Interface * iface() const
Definition: kpimageslist.cpp:451
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QList::count
int count(const T &value) const
QList::append
void append(const T &value)
QGridLayout::setRowStretch
void setRowStretch(int row, int stretch)
QWidget::setLayout
void setLayout(QLayout *layout)
KIPIPlugins::KPImagesList::loadImagesFromCurrentAlbum
void loadImagesFromCurrentAlbum()
A function to load all the images from the album if no image has been selected by user...
Definition: kpimageslist.cpp:787
QTimer
KIPIPlugins::KPImagesListViewItem::setThumb
void setThumb(const QPixmap &pix, bool hasThumb=true)
Definition: kpimageslist.cpp:200
KIPIPlugins::KPImagesListView::User2
Definition: kpimageslist.h:127
QTreeWidget::dropEvent
virtual void dropEvent(QDropEvent *event)
QStyleOptionViewItem
QContextMenuEvent
QAbstractItemView::iconSize
QSize iconSize() const
KIPIPlugins::KPImagesList::slotImageListChanged
virtual void slotImageListChanged()
Definition: kpimageslist.cpp:1241
KIPIPlugins::KPImagesListViewItem::KPImagesListViewItem
KPImagesListViewItem(KPImagesListView *const view, const QUrl &url)
Definition: kpimageslist.cpp:98
KIPIPlugins::KPImagesList::slotSaveItems
virtual void slotSaveItems()
Definition: kpimageslist.cpp:1036
KIPIPlugins::KPImagesList::slotRemoveItems
virtual void slotRemoveItems()
Definition: kpimageslist.cpp:873
KIPIPlugins::KPImagesListView::~KPImagesListView
~KPImagesListView()
Definition: kpimageslist.cpp:273
QDropEvent
QPainter::drawPixmap
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
QList::isEmpty
bool isEmpty() const
QPainter
QAbstractButton::clicked
void clicked(bool checked)
QModelIndex::row
int row() const
KIPIPlugins::KPImagesListView::User3
Definition: kpimageslist.h:128
QVBoxLayout
KIPIPlugins::KPImagesList::updateThumbnail
void updateThumbnail(const QUrl &url)
Definition: kpimageslist.cpp:1262
KIPIPlugins::CtrlButton
Definition: kpimageslist.h:180
QIcon::addPixmap
void addPixmap(const QPixmap &pixmap, Mode mode, State state)
KIPIPlugins::KPImagesList::Remove
Definition: kpimageslist.h:210
KIPIPlugins::KPImagesList::processing
void processing(const QUrl &url)
Definition: kpimageslist.cpp:1176
QAbstractItemView::dragEnterEvent
virtual void dragEnterEvent(QDragEnterEvent *event)
KIPIPlugins::KPImagesList::slotAddItems
virtual void slotAddItems()
Definition: kpimageslist.cpp:860
KIPIPlugins::KPImagesList::setControlButtonsPlacement
void setControlButtonsPlacement(ControlButtonPlacement placement)
Definition: kpimageslist.cpp:641
QPixmap::scaled
QPixmap scaled(int width, int height, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformMode) const
QTreeView::setAllColumnsShowFocus
void setAllColumnsShowFocus(bool enable)
QTreeWidget::currentItem
QTreeWidgetItem * currentItem() const
QString
QTreeWidget::takeTopLevelItem
QTreeWidgetItem * takeTopLevelItem(int index)
QList< QUrl >
QColor
KIPIPlugins::KPImagesList::ControlButtonsBelow
Definition: kpimageslist.h:204
KIPIPlugins::KPImagesListViewItem::rating
int rating() const
Definition: kpimageslist.cpp:182
KIPIPlugins::KPImagesList::imageUrls
virtual QList< QUrl > imageUrls(bool onlyUnprocessed=false) const
Definition: kpimageslist.cpp:1130
QXmlStreamReader::readNext
TokenType readNext()
KIPIPlugins::KPWorkingPixmap
A widget to draw progress wheel indicator over thumbnails.
Definition: kputil.h:99
QTreeWidget::setColumnCount
void setColumnCount(int columns)
QWidget::setSizePolicy
void setSizePolicy(QSizePolicy)
KIPIPlugins::KPImagesList::Clear
Definition: kpimageslist.h:213
KIPIPlugins::KPImagesList::slotClearItems
virtual void slotClearItems()
Definition: kpimageslist.cpp:961
QStringList
KIPIPlugins::KPImagesListViewItem::State
State
Definition: kpimageslist.h:61
KIPIPlugins::KPImagesList::signalImageListChanged
void signalImageListChanged()
KIPIPlugins::KPImagesList::~KPImagesList
virtual ~KPImagesList()
Definition: kpimageslist.cpp:729
KIPIPlugins::KPImagesList::Add
Definition: kpimageslist.h:209
QPixmap
QTreeWidget::itemFromIndex
QTreeWidgetItem * itemFromIndex(const QModelIndex &index) const
QUrl::toLocalFile
QString toLocalFile() const
QWidget::setAcceptDrops
void setAcceptDrops(bool on)
KIPIPlugins::KPImagesListViewItem::hasValidThumbnail
bool hasValidThumbnail() const
Definition: kpimageslist.cpp:119
KIPIPlugins::KPImagesList::ControlButtonPlacement
ControlButtonPlacement
Definition: kpimageslist.h:198
QFileInfo
kpimagedialog.h
QPixmap::isNull
bool isNull() const
KIPIPlugins::KPImagesList::MoveUp
Definition: kpimageslist.h:211
QString::contains
bool contains(QChar ch, Qt::CaseSensitivity cs) const
QSize
KIPIPlugins::KPImagesListViewItem::setProgressAnimation
void setProgressAnimation(const QPixmap &pix)
Definition: kpimageslist.cpp:226
QUrl
KIPIPlugins::KPImagesList::enableDragAndDrop
void enableDragAndDrop(const bool enable=true)
Definition: kpimageslist.cpp:636
QPixmap::height
int height() const
KIPIPlugins::KPImagesList::signalXMLSaveItem
void signalXMLSaveItem(QXmlStreamWriter &, KIPIPlugins::KPImagesListViewItem *)
KIPIPlugins::KPImagesListView::setColumnEnabled
void setColumnEnabled(ColumnType column, bool enable)
Definition: kpimageslist.cpp:361
KIPIPlugins::KPImagesList::ControlButtonsRight
Definition: kpimageslist.h:202
QWidget::setMaximumSize
void setMaximumSize(const QSize &)
QXmlStreamWriter::writeAttribute
void writeAttribute(const QString &qualifiedName, const QString &value)
QTreeView::selectAll
virtual void selectAll()
QXmlStreamReader
KIPIPlugins::KPImagesListViewItem::setProcessedIcon
void setProcessedIcon(const QIcon &icon)
Definition: kpimageslist.cpp:237
QTreeWidget::setHeaderLabels
void setHeaderLabels(const QStringList &labels)
QGridLayout::addLayout
void addLayout(QLayout *layout, int row, int column, QFlags< Qt::AlignmentFlag > alignment)
QTreeWidget::headerItem
QTreeWidgetItem * headerItem() const
QTreeWidget::itemSelectionChanged
void itemSelectionChanged()
kputil.h
QTreeView::setSortingEnabled
void setSortingEnabled(bool enable)
QXmlStreamReader::isStartElement
bool isStartElement() const
KIPIPlugins::KPImagesListView::findItem
KPImagesListViewItem * findItem(const QUrl &url)
Definition: kpimageslist.cpp:379
KIPIPlugins::KPImagesListViewItem::setTags
void setTags(const QStringList &tags)
Definition: kpimageslist.cpp:167
QMimeData::hasUrls
bool hasUrls() const
QDragEnterEvent
KIPIPlugins::KPImagesListViewItem::updateItemWidgets
virtual void updateItemWidgets()
Definition: kpimageslist.h:98
QTreeWidgetItem
QApplication::style
QStyle * style()
QMimeData::urls
QList< QUrl > urls() const
QBoxLayout::addStretch
void addStretch(int stretch)
QGridLayout::setColumnStretch
void setColumnStretch(int column, int stretch)
KIPIPlugins::KPImagesList::setAllowDuplicate
void setAllowDuplicate(bool allow)
Definition: kpimageslist.cpp:734
QXmlStreamWriter::setAutoFormatting
void setAutoFormatting(bool enable)
KIPIPlugins::KPImagesList::slotLoadItems
virtual void slotLoadItems()
Definition: kpimageslist.cpp:968
KIPIPlugins::KPImagesList
Definition: kpimageslist.h:192
kipiplugins_debug.h
KIPIPlugins::KPImagesListViewItem::url
QUrl url() const
Definition: kpimageslist.cpp:152
QXmlStreamWriter::writeEndDocument
void writeEndDocument()
KIPIPlugins::KPImagesList::signalFoundRAWImages
void signalFoundRAWImages(bool)
KIPIPlugins::KPImagesListView::setColumn
void setColumn(ColumnType column, const QString &label, bool enable)
Definition: kpimageslist.cpp:373
KIPIPlugins::KPImagesList::setControlButtons
void setControlButtons(ControlButtons buttonMask)
Definition: kpimageslist.cpp:718
QXmlStreamWriter::setDevice
void setDevice(QIODevice *device)
QTreeWidgetItem::setText
void setText(int column, const QString &text)
KIPIPlugins::KPImagesList::signalXMLLoadImageElement
void signalXMLLoadImageElement(QXmlStreamReader &)
KIPIPlugins::KPImagesList::signalItemClicked
void signalItemClicked(QTreeWidgetItem *)
QStringRef::isEmpty
bool isEmpty() const
KIPIPlugins::KPImagesListView::User6
Definition: kpimageslist.h:131
QXmlStreamReader::attributes
QXmlStreamAttributes attributes() const
QString::fromLatin1
QString fromLatin1(const char *str, int size)
KIPIPlugins::KPImagesList::signalMoveDownItem
void signalMoveDownItem()
KIPIPlugins::KPImagesList::getCurrentUrl
QUrl getCurrentUrl() const
Definition: kpimageslist.cpp:1313
KIPIPlugins::KPImageInfo::rating
int rating() const
Definition: kpimageinfo.cpp:349
KIPIPlugins::KPImagesList::removeItemByUrl
virtual void removeItemByUrl(const QUrl &url)
Definition: kpimageslist.cpp:1095
QPushButton
kpimageslist.h
QIcon::fromTheme
QIcon fromTheme(const QString &name, const QIcon &fallback)
QTreeView::header
QHeaderView * header() const
KIPIPlugins::KPImagesListViewItem::setState
void setState(State state)
Definition: kpimageslist.cpp:244
QAbstractItemView::setDragDropOverwriteMode
void setDragDropOverwriteMode(bool overwrite)
QXmlStreamWriter::writeStartDocument
void writeStartDocument()
KIPIPlugins::CtrlButton::~CtrlButton
virtual ~CtrlButton()
Definition: kpimageslist.cpp:475
KIPIPlugins::KPImagesList::ControlButtonsAbove
Definition: kpimageslist.h:203
KIPIPlugins::KPImagesList::slotAddImages
virtual void slotAddImages(const QList< QUrl > &list)
Definition: kpimageslist.cpp:810
QList::constEnd
const_iterator constEnd() const
QList::constBegin
const_iterator constBegin() const
KIPIPlugins::KPImagesList::signalContextMenuRequested
void signalContextMenuRequested()
KIPIPlugins::KPImagesListView::User4
Definition: kpimageslist.h:129
QAbstractItemView::currentIndex
QModelIndex currentIndex() const
QTreeView::setRootIsDecorated
void setRootIsDecorated(bool show)
KIPIPlugins::KPImagesListViewItem::tags
QStringList tags() const
Definition: kpimageslist.cpp:172
KIPIPlugins::KPImagesList::enableControlButtons
void enableControlButtons(bool enable=true)
Definition: kpimageslist.cpp:630
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::parent
QObject * parent() const
KIPIPlugins::KPImagesListViewItem::state
State state() const
Definition: kpimageslist.cpp:249
KIPIPlugins::KPImagesListViewItem::~KPImagesListViewItem
~KPImagesListViewItem()
Definition: kpimageslist.cpp:114
KIPIPlugins::KPImagesListView::setColumnLabel
void setColumnLabel(ColumnType column, const QString &label)
Definition: kpimageslist.cpp:356
QXmlStreamReader::name
QStringRef name() const
KIPIPlugins::KPImagesList::processed
void processed(const QUrl &url, bool success)
Definition: kpimageslist.cpp:1189
QTreeView::indexAbove
QModelIndex indexAbove(const QModelIndex &index) const
KIPIPlugins::KPImagesListView::ColumnType
ColumnType
Definition: kpimageslist.h:122
KIPIPlugins::KPImagesListView::indexFromItem
QModelIndex indexFromItem(KPImagesListViewItem *item, int column=0) const
Definition: kpimageslist.cpp:398
KIPIPlugins::KPImagesList::setAllowRAW
void setAllowRAW(bool allow)
Definition: kpimageslist.cpp:739
QTreeView::drawRow
virtual void drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
QIcon
QUrl::fromLocalFile
QUrl fromLocalFile(const QString &localFile)
QAbstractItemView::setDropIndicatorShown
void setDropIndicatorShown(bool enable)
QXmlStreamWriter::writeEndElement
void writeEndElement()
QXmlStreamWriter::writeStartElement
void writeStartElement(const QString &qualifiedName)
QAbstractItemView::setDragEnabled
void setDragEnabled(bool enable)
QXmlStreamReader::isEndElement
bool isEndElement() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2019 The KDE developers.
Generated on Mon Dec 16 2019 00:43:37 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kipi-plugins/common/libkipiplugins

Skip menu "kipi-plugins/common/libkipiplugins"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdegraphics API Reference

Skip menu "kdegraphics API Reference"
  •     libkipiplugins
  •     src
  •     src
  •     src
  •     src
  •     src
  • okular

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal