diff options
Diffstat (limited to 'src/utilities/cameragui/albumselectdialog.cpp')
-rw-r--r-- | src/utilities/cameragui/albumselectdialog.cpp | 417 |
1 files changed, 417 insertions, 0 deletions
diff --git a/src/utilities/cameragui/albumselectdialog.cpp b/src/utilities/cameragui/albumselectdialog.cpp new file mode 100644 index 00000000..486c4711 --- /dev/null +++ b/src/utilities/cameragui/albumselectdialog.cpp @@ -0,0 +1,417 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2005-06-16 + * Description : a dialog to select a target album to download + * pictures from camera + * + * Copyright (C) 2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu> + * Copyright (C) 2006-2008 by Gilles Caulier <caulier dot gilles at gmail dot com> + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +// TQt includes. + +#include <tqlabel.h> +#include <tqframe.h> +#include <tqlayout.h> +#include <tqpopupmenu.h> +#include <tqcursor.h> +#include <tqdatetime.h> +#include <tqmap.h> + +// KDE includes. + +#include <tdelocale.h> +#include <kiconloader.h> +#include <tdeapplication.h> +#include <tdeaction.h> +#include <kinputdialog.h> +#include <tdemessagebox.h> + +// Local includes. + +#include "ddebug.h" +#include "folderview.h" +#include "folderitem.h" +#include "album.h" +#include "albummanager.h" +#include "albumsettings.h" +#include "searchtextbar.h" +#include "albumselectdialog.h" +#include "albumselectdialog.moc" + +namespace Digikam +{ + +class AlbumSelectDialogPrivate +{ + +public: + + AlbumSelectDialogPrivate() + { + allowRootSelection = false; + folderView = 0; + searchBar = 0; + } + + bool allowRootSelection; + + TQString newAlbumString; + + TQMap<FolderItem*, PAlbum*> albumMap; + + FolderView *folderView; + + SearchTextBar *searchBar; +}; + +AlbumSelectDialog::AlbumSelectDialog(TQWidget* parent, PAlbum* albumToSelect, + const TQString& header, + const TQString& newAlbumString, + bool allowRootSelection ) + : KDialogBase(Plain, i18n("Select Album"), + Help|User1|Ok|Cancel, Ok, + parent, 0, true, true, + i18n("&New Album")) +{ + d = new AlbumSelectDialogPrivate; + setHelp("targetalbumdialog.anchor", "digikam"); + enableButtonOK(false); + + d->allowRootSelection = allowRootSelection; + d->newAlbumString = newAlbumString; + + // ------------------------------------------------------------- + + TQGridLayout* grid = new TQGridLayout(plainPage(), 2, 1, 0, spacingHint()); + + TQLabel *logo = new TQLabel(plainPage()); + TDEIconLoader* iconLoader = TDEApplication::kApplication()->iconLoader(); + logo->setPixmap(iconLoader->loadIcon("digikam", TDEIcon::NoGroup, 128, TDEIcon::DefaultState, 0, true)); + + TQLabel *message = new TQLabel(plainPage()); + if (!header.isEmpty()) + message->setText(header); + + d->folderView = new FolderView(plainPage()); + d->folderView->addColumn(i18n("My Albums")); + d->folderView->setColumnWidthMode( 0, TQListView::Maximum ); + d->folderView->setResizeMode( TQListView::AllColumns ); + d->folderView->setRootIsDecorated(true); + + d->searchBar = new SearchTextBar(plainPage(), "AlbumSelectDialogSearchBar"); + + // ------------------------------------------------------------- + + TQPixmap icon = iconLoader->loadIcon("folder", TDEIcon::NoGroup, + AlbumSettings::instance()->getDefaultTreeIconSize(), TDEIcon::DefaultState, 0, true); + + AlbumList aList = AlbumManager::instance()->allPAlbums(); + + for (AlbumList::const_iterator it = aList.begin(); it != aList.end(); ++it) + { + PAlbum* album = (PAlbum*)(*it); + + FolderItem* viewItem = 0; + + if (album->isRoot()) + { + viewItem = new FolderItem(d->folderView, album->title()); + viewItem->setOpen(true); + } + else + { + FolderItem* parentItem = (FolderItem*)(album->parent()->extraData(d->folderView)); + + if (!parentItem) + { + DWarning() << "Failed to find parent for Album " + << album->title() << endl; + continue; + } + + viewItem = new FolderItem(parentItem, album->title()); + } + + if (viewItem) + { + viewItem->setPixmap(0, icon); + album->setExtraData(d->folderView, viewItem); + d->albumMap.insert(viewItem, album); + + if (album == albumToSelect) + { + viewItem->setOpen(true); + d->folderView->setSelected(viewItem, true); + d->folderView->ensureItemVisible(viewItem); + } + } + } + + // ------------------------------------------------------------- + + grid->addMultiCellWidget(logo, 0, 0, 0, 0); + grid->addMultiCellWidget(message, 1, 1, 0, 0); + grid->addMultiCellWidget(d->folderView, 0, 2, 1, 1); + grid->addMultiCellWidget(d->searchBar, 3, 3, 1, 1); + grid->setRowStretch(2, 10); + + // ------------------------------------------------------------- + + connect(AlbumManager::instance(), TQ_SIGNAL(signalAlbumAdded(Album*)), + this, TQ_SLOT(slotAlbumAdded(Album*))); + + connect(AlbumManager::instance(), TQ_SIGNAL(signalAlbumDeleted(Album*)), + this, TQ_SLOT(slotAlbumDeleted(Album*))); + + connect(AlbumManager::instance(), TQ_SIGNAL(signalAlbumsCleared()), + this, TQ_SLOT(slotAlbumsCleared())); + + connect(d->folderView, TQ_SIGNAL(selectionChanged()), + this, TQ_SLOT(slotSelectionChanged())); + + connect(d->folderView, TQ_SIGNAL(contextMenuRequested(TQListViewItem*, const TQPoint&, int)), + this, TQ_SLOT(slotContextMenu(TQListViewItem*, const TQPoint&, int))); + + connect(d->searchBar, TQ_SIGNAL(signalTextChanged(const TQString&)), + this, TQ_SLOT(slotSearchTextChanged(const TQString&))); + + // ------------------------------------------------------------- + + resize(650, 650); + slotSelectionChanged(); +} + +AlbumSelectDialog::~AlbumSelectDialog() +{ + delete d; +} + +void AlbumSelectDialog::slotAlbumAdded(Album* album) +{ + if (!album || album->type() != Album::PHYSICAL) + return; + + FolderItem* parentItem = (FolderItem*)(album->parent()->extraData(d->folderView)); + + if (!parentItem) + { + DWarning() << "Failed to find parent for Album " + << album->title() << endl; + return; + } + + TDEIconLoader *iconLoader = TDEApplication::kApplication()->iconLoader(); + TQPixmap icon = iconLoader->loadIcon("folder", TDEIcon::NoGroup, + AlbumSettings::instance()->getDefaultTreeIconSize(), + TDEIcon::DefaultState, 0, true); + + FolderItem* viewItem = new FolderItem(parentItem, album->title()); + viewItem->setPixmap(0, icon); + album->setExtraData(d->folderView, viewItem); + d->albumMap.insert(viewItem, (PAlbum*)album); +} + +void AlbumSelectDialog::slotAlbumDeleted(Album* album) +{ + if (!album || album->type() != Album::PHYSICAL) + return; + + FolderItem* viewItem = (FolderItem*)(album->extraData(d->folderView)); + + if (viewItem) + { + delete viewItem; + album->removeExtraData(d->folderView); + d->albumMap.remove(viewItem); + } +} + +void AlbumSelectDialog::slotAlbumsCleared() +{ + d->folderView->clear(); +} + +void AlbumSelectDialog::slotSelectionChanged() +{ + TQListViewItem* selItem = 0; + TQListViewItemIterator it(d->folderView); + + while (it.current()) + { + if (it.current()->isSelected()) + { + selItem = it.current(); + break; + } + ++it; + } + + if (!selItem || (selItem == d->folderView->firstChild()) && + !d->allowRootSelection) + { + enableButtonOK(false); + return; + } + + enableButtonOK(true); +} + +void AlbumSelectDialog::slotContextMenu(TQListViewItem *, const TQPoint &, int) +{ + TQPopupMenu popmenu(d->folderView); + TDEAction *action = new TDEAction(i18n( "Create New Album" ), + "albumfolder-new", 0, this, + TQ_SLOT( slotUser1() ), + &popmenu); + action->plug(&popmenu); + popmenu.exec(TQCursor::pos()); +} + +void AlbumSelectDialog::slotUser1() +{ + TQListViewItem* item = d->folderView->currentItem(); + if (!item) + item = d->folderView->firstChild(); + + if (!item) + return; + + PAlbum* album = d->albumMap[(FolderItem*)item]; + if (!album) + return; + + bool ok; + TQString newAlbumName = KInputDialog::getText(i18n("New Album Name"), + i18n("Creating new album in '%1'\n" + "Enter album name:") + .arg(album->prettyURL()), + d->newAlbumString, &ok, this); + if (!ok) + return; + + TQString errMsg; + PAlbum* newAlbum = AlbumManager::instance()->createPAlbum(album, newAlbumName, + TQString(), TQDate::currentDate(), + TQString(), errMsg); + if (!newAlbum) + { + KMessageBox::error(this, errMsg); + return; + } + + FolderItem* newItem = (FolderItem*)newAlbum->extraData(d->folderView); + if (newItem) + { + d->folderView->ensureItemVisible(newItem); + d->folderView->setSelected(newItem, true); + } +} + +PAlbum* AlbumSelectDialog::selectAlbum(TQWidget* parent, + PAlbum* albumToSelect, + const TQString& header, + const TQString& newAlbumString, + bool allowRootSelection ) +{ + AlbumSelectDialog dlg(parent, albumToSelect, + header, newAlbumString, + allowRootSelection); + + if (dlg.exec() != KDialogBase::Accepted) + return 0; + + FolderItem* item = (FolderItem*) dlg.d->folderView->currentItem(); + if (!item || (item == dlg.d->folderView->firstChild()) && + !allowRootSelection) + { + return 0; + } + + return dlg.d->albumMap[item]; +} + +void AlbumSelectDialog::slotSearchTextChanged(const TQString& filter) +{ + TQString search = filter.lower(); + + bool atleastOneMatch = false; + + AlbumList pList = AlbumManager::instance()->allPAlbums(); + for (AlbumList::iterator it = pList.begin(); it != pList.end(); ++it) + { + PAlbum* palbum = (PAlbum*)(*it); + + // don't touch the root Album + if (palbum->isRoot()) + continue; + + bool match = palbum->title().lower().contains(search); + if (!match) + { + // check if any of the parents match the search + Album* parent = palbum->parent(); + while (parent && !parent->isRoot()) + { + if (parent->title().lower().contains(search)) + { + match = true; + break; + } + + parent = parent->parent(); + } + } + + if (!match) + { + // check if any of the children match the search + AlbumIterator it(palbum); + while (it.current()) + { + if ((*it)->title().lower().contains(search)) + { + match = true; + break; + } + ++it; + } + } + + FolderItem* viewItem = (FolderItem*) palbum->extraData(d->folderView); + + if (match) + { + atleastOneMatch = true; + + if (viewItem) + viewItem->setVisible(true); + } + else + { + if (viewItem) + { + viewItem->setVisible(false); + } + } + } + + d->searchBar->slotSearchResult(atleastOneMatch); +} + +} // namespace Digikam |