|
|
|
/* ============================================================
|
|
|
|
*
|
|
|
|
* 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 <klocale.h>
|
|
|
|
#include <kiconloader.h>
|
|
|
|
#include <kapplication.h>
|
|
|
|
#include <kaction.h>
|
|
|
|
#include <kinputdialog.h>
|
|
|
|
#include <kmessagebox.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());
|
|
|
|
KIconLoader* iconLoader = KApplication::kApplication()->iconLoader();
|
|
|
|
logo->setPixmap(iconLoader->loadIcon("digikam", KIcon::NoGroup, 128, KIcon::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", KIcon::NoGroup,
|
|
|
|
AlbumSettings::instance()->getDefaultTreeIconSize(), KIcon::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(), TQT_SIGNAL(signalAlbumAdded(Album*)),
|
|
|
|
this, TQT_SLOT(slotAlbumAdded(Album*)));
|
|
|
|
|
|
|
|
connect(AlbumManager::instance(), TQT_SIGNAL(signalAlbumDeleted(Album*)),
|
|
|
|
this, TQT_SLOT(slotAlbumDeleted(Album*)));
|
|
|
|
|
|
|
|
connect(AlbumManager::instance(), TQT_SIGNAL(signalAlbumsCleared()),
|
|
|
|
this, TQT_SLOT(slotAlbumsCleared()));
|
|
|
|
|
|
|
|
connect(d->folderView, TQT_SIGNAL(selectionChanged()),
|
|
|
|
this, TQT_SLOT(slotSelectionChanged()));
|
|
|
|
|
|
|
|
connect(d->folderView, TQT_SIGNAL(contextMenuRequested(TQListViewItem*, const TQPoint&, int)),
|
|
|
|
this, TQT_SLOT(slotContextMenu(TQListViewItem*, const TQPoint&, int)));
|
|
|
|
|
|
|
|
connect(d->searchBar, TQT_SIGNAL(signalTextChanged(const TQString&)),
|
|
|
|
this, TQT_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;
|
|
|
|
}
|
|
|
|
|
|
|
|
KIconLoader *iconLoader = KApplication::kApplication()->iconLoader();
|
|
|
|
TQPixmap icon = iconLoader->loadIcon("folder", KIcon::NoGroup,
|
|
|
|
AlbumSettings::instance()->getDefaultTreeIconSize(),
|
|
|
|
KIcon::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);
|
|
|
|
KAction *action = new KAction(i18n( "Create New Album" ),
|
|
|
|
"albumfolder-new", 0, TQT_TQOBJECT(this),
|
|
|
|
TQT_SLOT( slotUser1() ),
|
|
|
|
TQT_TQOBJECT(&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:")
|
|
|
|
.tqarg(album->prettyURL()),
|
|
|
|
d->newAlbumString, &ok, this);
|
|
|
|
if (!ok)
|
|
|
|
return;
|
|
|
|
|
|
|
|
TQString errMsg;
|
|
|
|
PAlbum* newAlbum = AlbumManager::instance()->createPAlbum(album, newAlbumName,
|
|
|
|
TQString(), TQDate::tqcurrentDate(),
|
|
|
|
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 tqchildren 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
|