46
#include "albummanager.h"
47
#include "albummodificationhelper.h"
48
#include "albumtreeview.h"
47
49
#include "albumthumbnailloader.h"
48
#include "treefolderitem.h"
49
50
#include "collectionmanager.h"
51
#include "contextmenuhelper.h"
50
52
#include "kipiinterface.h"
51
53
#include "kipiimagecollection.h"
58
class AlbumSelectTreeViewPriv
61
AlbumSelectTreeViewPriv() :
62
albumModificationHelper(0)
66
AlbumModificationHelper *albumModificationHelper;
68
KAction *newAlbumAction;
72
AlbumSelectTreeView::AlbumSelectTreeView(AlbumModel *model,
73
AlbumModificationHelper *albumModificationHelper,
75
AlbumTreeView(model, parent),
76
d(new AlbumSelectTreeViewPriv)
79
d->albumModificationHelper = albumModificationHelper;
81
d->newAlbumAction = new KAction(KIcon("albumfolder-new"), i18n("Create New Album"), this);
85
AlbumSelectTreeView::~AlbumSelectTreeView()
90
void AlbumSelectTreeView::addCustomContextMenuActions(ContextMenuHelper &cmh,
93
cmh.addAction(d->newAlbumAction);
94
d->newAlbumAction->setEnabled(album);
97
void AlbumSelectTreeView::handleCustomContextMenuAction(QAction *action,
98
AlbumPointer<Album> album)
102
PAlbum *palbum = dynamic_cast<PAlbum*> (a);
103
if (palbum && action == d->newAlbumAction)
105
d->albumModificationHelper->slotAlbumNew(palbum);
110
void AlbumSelectTreeView::slotNewAlbum()
112
PAlbum *palbum = currentAlbum();
115
PAlbum *createdAlbum = d->albumModificationHelper->slotAlbumNew(palbum);
118
slotSelectAlbum(createdAlbum, false);
56
123
class AlbumSelectWidgetPriv
60
AlbumSelectWidgetPriv()
127
AlbumSelectWidgetPriv() :
130
albumModificationHelper(0),
67
QTreeWidget *albumsView;
136
AlbumModel *albumModel;
137
AlbumSelectTreeView *albumTreeView;
139
AlbumModificationHelper *albumModificationHelper;
69
141
SearchTextBar *searchBar;
75
147
: QWidget(parent),
76
148
d(new AlbumSelectWidgetPriv)
151
setObjectName("AlbumSelectWidget");
153
d->albumModificationHelper = new AlbumModificationHelper(this, this);
155
// TODO let this class implement StateSavingObject
156
KConfigGroup group = KGlobal::config()->group(objectName());
78
158
QGridLayout *grid = new QGridLayout(this);
79
d->albumsView = new QTreeWidget(this);
80
d->albumsView->setDragEnabled(false);
81
d->albumsView->setDropIndicatorShown(false);
82
d->albumsView->setAcceptDrops(false);
83
d->albumsView->header()->hide();
84
d->albumsView->setContextMenuPolicy(Qt::CustomContextMenu);
85
d->albumsView->setSelectionMode(QAbstractItemView::SingleSelection);
159
d->albumModel = new AlbumModel(AbstractAlbumModel::IgnoreRootAlbum, this);
160
d->albumTreeView = new AlbumSelectTreeView(d->albumModel, d->albumModificationHelper, this);
161
d->albumTreeView->setDragEnabled(false);
162
d->albumTreeView->setDropIndicatorShown(false);
163
d->albumTreeView->setAcceptDrops(false);
164
d->albumTreeView->setSelectAlbumOnClick(false);
165
d->albumTreeView->setSelectOnContextMenu(false);
166
d->albumTreeView->setEnableContextMenu(true);
167
d->albumTreeView->setSortingEnabled(true);
168
d->albumTreeView->setConfigGroup(group);
169
d->albumTreeView->setEntryPrefix("AlbumTreeView");
87
171
d->searchBar = new SearchTextBar(this, "AlbumSelectWidgetSearchBar");
172
d->searchBar->setModel(d->albumModel,
173
AbstractAlbumModel::AlbumIdRole, AbstractAlbumModel::AlbumTitleRole);
174
d->searchBar->setFilterModel(d->albumTreeView->albumFilterModel());
175
d->searchBar->setConfigGroup(group);
176
d->albumTreeView->setEntryPrefix("AlbumTreeView");
88
178
d->newAlbumBtn = new KPushButton(KGuiItem(i18n("&New Album"), "albumfolder-new",
89
179
i18n("Create new album")), this);
91
grid->addWidget(d->albumsView, 0, 0, 1, 2);
181
grid->addWidget(d->albumTreeView, 0, 0, 1, 2);
92
182
grid->addWidget(d->searchBar, 1, 0, 1, 1);
93
183
grid->addWidget(d->newAlbumBtn, 1, 1, 1, 1);
94
184
grid->setRowStretch(0, 10);
98
188
// ------------------------------------------------------------------------------------
100
if (!albumToSelect) albumToSelect = dynamic_cast<PAlbum*>(AlbumManager::instance()->currentAlbum());
101
populateTreeView(AlbumManager::instance()->allPAlbums(), d->albumsView, albumToSelect);
190
PAlbum *select = albumToSelect;
193
select = AlbumManager::instance()->currentPAlbum();
195
d->albumTreeView->slotSelectAlbum(select, false);
103
197
// ------------------------------------------------------------------------------------
105
connect(AlbumManager::instance(), SIGNAL(signalAlbumAdded(Album*)),
106
this, SLOT(slotAlbumAdded(Album*)));
108
connect(AlbumManager::instance(), SIGNAL(signalAlbumDeleted(Album*)),
109
this, SLOT(slotAlbumDeleted(Album*)));
111
connect(AlbumManager::instance(), SIGNAL(signalAlbumsCleared()),
112
this, SLOT(slotAlbumsCleared()));
199
connect(d->albumTreeView, SIGNAL(currentAlbumChanged(Album*)),
200
this, SIGNAL(itemSelectionChanged()));
114
202
connect(AlbumManager::instance(), SIGNAL(signalAlbumRenamed(Album*)),
115
203
this, SLOT(slotAlbumRenamed(Album*)));
117
connect(d->albumsView, SIGNAL(customContextMenuRequested(const QPoint&)),
118
this, SLOT(slotContextMenu()));
120
connect(d->searchBar, SIGNAL(signalSearchTextSettings(const SearchTextSettings&)),
121
this, SLOT(slotSearchTextChanged(const SearchTextSettings&)));
123
205
connect(d->newAlbumBtn, SIGNAL(clicked()),
124
this, SLOT(slotNewAlbum()));
206
d->albumTreeView, SLOT(slotNewAlbum()));
208
d->albumTreeView->loadState();
209
d->searchBar->loadState();
127
213
AlbumSelectWidget::~AlbumSelectWidget()
215
d->albumTreeView->saveState();
216
d->searchBar->saveState();
132
QTreeWidget* AlbumSelectWidget::albumView() const
134
return d->albumsView;
137
void AlbumSelectWidget::populateTreeView(const AlbumList& aList, QTreeWidget *view, PAlbum* albumToSelect)
139
for (AlbumList::const_iterator it = aList.constBegin(); it != aList.constEnd(); ++it)
142
TreeAlbumItem *item = 0;
146
item = new TreeAlbumItem(view, album);
147
item->setExpanded(true);
151
TreeAlbumItem* pitem = 0;
153
pitem = static_cast<TreeAlbumItem*>(album->parent()->extraData(view));
156
kWarning() << "Failed to find parent for Album " << album->title();
160
item = new TreeAlbumItem(pitem, album);
165
PAlbum* palbum = dynamic_cast<PAlbum*>(album);
167
item->setIcon(0, AlbumThumbnailLoader::instance()->getStandardAlbumIcon(palbum));
170
TAlbum* talbum = dynamic_cast<TAlbum*>(album);
172
item->setIcon(0, AlbumThumbnailLoader::instance()->getStandardTagIcon(talbum));
175
if (album == albumToSelect)
177
item->setExpanded(true);
178
view->setCurrentItem(item);
179
view->scrollToItem(item);
185
220
PAlbum* AlbumSelectWidget::currentAlbum() const
187
TreeAlbumItem* item = dynamic_cast<TreeAlbumItem*>(d->albumsView->currentItem());
190
PAlbum* palbum = (PAlbum*)(item->album());
222
return d->albumTreeView->currentAlbum();
196
225
void AlbumSelectWidget::setCurrentAlbum(PAlbum *albumToSelect)
198
QTreeWidgetItemIterator it(d->albumsView);
201
TreeAlbumItem* item = dynamic_cast<TreeAlbumItem*>(*it);
204
PAlbum* palbum = (PAlbum*)(item->album());
205
if (palbum == albumToSelect)
207
d->albumsView->setCurrentItem(item);
208
d->albumsView->scrollToItem(item);
209
item->setSelected(true);
227
d->albumTreeView->slotSelectAlbum(albumToSelect);
217
230
KUrl AlbumSelectWidget::currentAlbumUrl() const
219
PAlbum* palbum = currentAlbum();
232
PAlbum* palbum = d->albumTreeView->currentAlbum();
220
233
if (palbum) return palbum->fileUrl();
225
238
void AlbumSelectWidget::setCurrentAlbumUrl(const KUrl& albumUrl)
227
QTreeWidgetItemIterator it(d->albumsView);
230
TreeAlbumItem* item = dynamic_cast<TreeAlbumItem*>(*it);
233
PAlbum* palbum = (PAlbum*)(item->album());
234
if (palbum->fileUrl() == albumUrl)
236
d->albumsView->setCurrentItem(item);
237
d->albumsView->scrollToItem(item);
238
item->setSelected(true);
246
void AlbumSelectWidget::slotSearchTextChanged(const SearchTextSettings& settings)
248
QString search = settings.text;
249
bool atleastOneMatch = false;
251
AlbumList pList = AlbumManager::instance()->allPAlbums();
252
for (AlbumList::const_iterator it = pList.constBegin(); it != pList.constEnd(); ++it)
254
PAlbum* palbum = (PAlbum*)(*it);
256
// don't touch the root Album
257
if (palbum->isRoot())
260
bool match = palbum->title().contains(search, settings.caseSensitive);
263
// check if any of the parents match the search
264
Album* parent = palbum->parent();
265
while (parent && !parent->isRoot())
267
if (parent->title().contains(search, settings.caseSensitive))
273
parent = parent->parent();
279
// check if any of the children match the search
280
AlbumIterator it(palbum);
283
if ((*it)->title().contains(search, settings.caseSensitive))
292
TreeAlbumCheckListItem* viewItem = (TreeAlbumCheckListItem*) palbum->extraData(d->albumsView);
296
atleastOneMatch = true;
299
viewItem->setHidden(false);
305
viewItem->setHidden(true);
310
d->searchBar->slotSearchResult(atleastOneMatch);
313
void AlbumSelectWidget::slotNewAlbum()
315
QTreeWidgetItem* item = d->albumsView->currentItem();
317
item = d->albumsView->topLevelItem(0);
322
TreeAlbumItem* viewItem = dynamic_cast<TreeAlbumItem*>(item);
326
PAlbum* album = dynamic_cast<PAlbum*>(viewItem->album());
331
QString newAlbumName = KInputDialog::getText(i18n("New Album Name"),
332
i18n("Creating new album in '%1'\n"
335
QString(), &ok, this);
343
// if we create an album under root, need to supply the album root path.
344
// TODO: Let user choose an album root
345
newAlbum = AlbumManager::instance()->createPAlbum(CollectionManager::instance()->oneAlbumRootPath(),
346
newAlbumName, QString(), QDate::currentDate(), QString(), errMsg);
240
PAlbum *urlAlbum = AlbumManager::instance()->findPAlbum(albumUrl);
243
d->albumTreeView->slotSelectAlbum(urlAlbum);
350
newAlbum = AlbumManager::instance()->createPAlbum(album, newAlbumName, QString(),
351
QDate::currentDate(), QString(), errMsg);
356
KMessageBox::error(this, errMsg);
360
TreeAlbumItem* newItem = (TreeAlbumItem*)newAlbum->extraData(d->albumsView);
363
d->albumsView->scrollToItem(newItem);
364
d->albumsView->setCurrentItem(newItem);
365
newItem->setSelected(true);
369
void AlbumSelectWidget::slotAlbumAdded(Album* album)
371
if (!album || album->type() != Album::PHYSICAL)
374
TreeAlbumItem* parentItem = 0;
377
parentItem = static_cast<TreeAlbumItem*>(album->parent()->extraData(d->albumsView));
381
kWarning() << "Failed to find parent for Album "
386
TreeAlbumItem* item = new TreeAlbumItem(parentItem, album);
387
PAlbum* palbum = dynamic_cast<PAlbum*>(album);
389
item->setIcon(0, AlbumThumbnailLoader::instance()->getStandardAlbumIcon(palbum));
392
void AlbumSelectWidget::slotAlbumDeleted(Album* album)
394
if (!album || album->type() != Album::PHYSICAL)
397
TreeAlbumItem *item = (TreeAlbumItem*)(album->extraData(d->albumsView));
247
kError() << "Cannot find an album for " << albumUrl;
402
251
void AlbumSelectWidget::slotAlbumRenamed(Album* album)
404
253
if (!album || album->type() != Album::PHYSICAL)
407
TreeAlbumItem *item = (TreeAlbumItem*)(album->extraData(d->albumsView));
410
item->setText(0, album->title());
411
emit signalAlbumRenamed();
415
void AlbumSelectWidget::slotAlbumsCleared()
417
for(QTreeWidgetItemIterator it(d->albumsView); *it; ++it)
419
Album *album = static_cast<TreeAlbumItem*>(*it)->album();
421
album->removeExtraData(d->albumsView);
423
d->albumsView->clear();
426
void AlbumSelectWidget::slotContextMenu()
428
KMenu popmenu(d->albumsView);
430
KAction *action = new KAction(KIcon("albumfolder-new"), i18n("Create New Album"), this);
431
connect(action, SIGNAL(triggered(bool) ),
432
this, SLOT(slotNewAlbum()));
434
popmenu.addAction(action);
435
popmenu.exec(QCursor::pos());
258
QModelIndex index = d->albumModel->indexForAlbum(album);
261
emit itemSelectionChanged();
438
265
} // namespace Digikam