/* ============================================================ * * This file is a part of digiKam project * http://www.digikam.org * * Date : 2005-05-07 * Description : a dialog to delete item. * * Copyright (C) 2004 by Michael Pyne * Copyright (C) 2006 by Ian Monroe * Copyright (C) 2006-2007 by Marcel Wiesweg * * 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 #include #include #include #include #include #include #include // KDE includes. #include #include #include #include #include #include #include #include // Local includes. #include "deletedialog.h" #include "albumsettings.h" #include "deletedialog.moc" namespace Digikam { ////////////////////////////////////////////////////////////////////////////// // DeleteWidget implementation ////////////////////////////////////////////////////////////////////////////// DeleteWidget::DeleteWidget(TQWidget *parent, const char *name) : DeleteDialogBase(parent, name), m_listMode(DeleteDialogMode::Files), m_deleteMode(DeleteDialogMode::UseTrash) { ddCheckBoxStack->raiseWidget(ddShouldDeletePage); bool deleteInstead = !AlbumSettings::instance()->getUseTrash(); slotShouldDelete(deleteInstead); ddShouldDelete->setChecked(deleteInstead); } void DeleteWidget::setFiles(const KURL::List &files) { ddFileList->clear(); for( KURL::List::ConstIterator it = files.begin(); it != files.end(); it++) { if( (*it).isLocalFile() ) //path is nil for non-local ddFileList->insertItem( (*it).path() ); else if ( (*it).protocol() == "digikamalbums") ddFileList->insertItem( (*it).path() ); else ddFileList->insertItem( (*it).prettyURL() ); } updateText(); } void DeleteWidget::slotShouldDelete(bool shouldDelete) { setDeleteMode(shouldDelete ? DeleteDialogMode::DeletePermanently : DeleteDialogMode::UseTrash); } void DeleteWidget::setDeleteMode(DeleteDialogMode::DeleteMode deleteMode) { m_deleteMode = deleteMode; updateText(); } void DeleteWidget::setListMode(DeleteDialogMode::ListMode listMode) { m_listMode = listMode; updateText(); } void DeleteWidget::updateText() { switch (m_listMode) { case DeleteDialogMode::Files: // Delete files if (m_deleteMode == DeleteDialogMode::DeletePermanently) { ddDeleteText->setText(i18n("These items will be permanently " "deleted from your hard disk.")); ddWarningIcon->setPixmap(TDEGlobal::iconLoader()->loadIcon("messagebox_warning", KIcon::Desktop, KIcon::SizeLarge)); } else { ddDeleteText->setText(i18n("These items will be moved to Trash.")); ddWarningIcon->setPixmap(TDEGlobal::iconLoader()->loadIcon("trashcan_full", KIcon::Desktop, KIcon::SizeLarge)); } ddNumFiles->setText(i18n("1 file selected.", "%n files selected.", ddFileList->count())); break; case DeleteDialogMode::Albums: // Delete albums = folders if (m_deleteMode == DeleteDialogMode::DeletePermanently) { ddDeleteText->setText(i18n("These albums will be permanently " "deleted from your hard disk.")); ddWarningIcon->setPixmap(TDEGlobal::iconLoader()->loadIcon("messagebox_warning", KIcon::Desktop, KIcon::SizeLarge)); } else { ddDeleteText->setText(i18n("These albums will be moved to Trash.")); ddWarningIcon->setPixmap(TDEGlobal::iconLoader()->loadIcon("trashcan_full", KIcon::Desktop, KIcon::SizeLarge)); } ddNumFiles->setText(i18n("1 album selected.", "%n albums selected.", ddFileList->count())); break; case DeleteDialogMode::Subalbums: // As above, but display additional warning if (m_deleteMode == DeleteDialogMode::DeletePermanently) { ddDeleteText->setText(i18n("These albums will be permanently " "deleted from your hard disk.
" "Note that all subalbums " "are included in this list and will " "be deleted permanently as well.
")); ddWarningIcon->setPixmap(TDEGlobal::iconLoader()->loadIcon("messagebox_warning", KIcon::Desktop, KIcon::SizeLarge)); } else { ddDeleteText->setText(i18n("These albums will be moved to Trash.
" "Note that all subalbums " "are included in this list and will " "be moved to Trash as well.
")); ddWarningIcon->setPixmap(TDEGlobal::iconLoader()->loadIcon("trashcan_full", KIcon::Desktop, KIcon::SizeLarge)); } ddNumFiles->setText(i18n("1 album selected.", "%n albums selected.", ddFileList->count())); break; } } ////////////////////////////////////////////////////////////////////////////// // DeleteDialog implementation ////////////////////////////////////////////////////////////////////////////// DeleteDialog::DeleteDialog(TQWidget *parent, const char *name) : KDialogBase(Swallow, WStyle_DialogBorder, parent, name, true, // modal i18n("About to delete selected files"), // caption Ok | Cancel, // available buttons Ok, // default button true // use separator between buttons and the main widget ), m_saveShouldDeleteUserPreference(true), m_saveDoNotShowAgain(false), m_trashGuiItem(i18n("&Move to Trash"), "trashcan_full") { m_widget = new DeleteWidget(this, "delete_dialog_widget"); setMainWidget(m_widget); m_widget->setMinimumSize(400, 300); setMinimumSize(410, 326); adjustSize(); slotShouldDelete(shouldDelete()); connect(m_widget->ddShouldDelete, TQT_SIGNAL(toggled(bool)), this, TQT_SLOT(slotShouldDelete(bool))); actionButton(Ok)->setFocus(); } bool DeleteDialog::confirmDeleteList(const KURL::List& condemnedFiles, DeleteDialogMode::ListMode listMode, DeleteDialogMode::DeleteMode deleteMode) { setURLs(condemnedFiles); presetDeleteMode(deleteMode); setListMode(listMode); if (deleteMode == DeleteDialogMode::NoChoiceTrash) { if (!AlbumSettings::instance()->getShowTrashDeleteDialog()) return true; } return exec() == TQDialog::Accepted; } void DeleteDialog::setURLs(const KURL::List &files) { m_widget->setFiles(files); } void DeleteDialog::accept() { // Save user's preference AlbumSettings *settings = AlbumSettings::instance(); if (m_saveShouldDeleteUserPreference) { settings->setUseTrash(!shouldDelete()); } if (m_saveDoNotShowAgain) { settings->setShowTrashDeleteDialog(!m_widget->ddDoNotShowAgain->isChecked()); } settings->saveSettings(); KDialogBase::accept(); } void DeleteDialog::slotShouldDelete(bool shouldDelete) { // This is called once from constructor, and then when the user changed the checkbox state. // In that case, save the user's preference. m_saveShouldDeleteUserPreference = true; setButtonGuiItem(Ok, shouldDelete ? KStdGuiItem::del() : m_trashGuiItem); } void DeleteDialog::presetDeleteMode(DeleteDialogMode::DeleteMode mode) { switch (mode) { case DeleteDialogMode::NoChoiceTrash: { // access the widget directly, signals will be fired to DeleteDialog and DeleteWidget m_widget->ddShouldDelete->setChecked(false); m_widget->ddCheckBoxStack->raiseWidget(m_widget->ddDoNotShowAgainPage); m_saveDoNotShowAgain = true; break; } case DeleteDialogMode::NoChoiceDeletePermanently: { m_widget->ddShouldDelete->setChecked(true); m_widget->ddCheckBoxStack->hide(); break; } case DeleteDialogMode::UserPreference: { break; } case DeleteDialogMode::UseTrash: case DeleteDialogMode::DeletePermanently: { // toggles signals which do the rest m_widget->ddShouldDelete->setChecked(mode == DeleteDialogMode::DeletePermanently); // the preference set by this preset method will be ignored // for the next DeleteDialog instance and not stored as user preference. // Only if the user once changes this value, it will be taken as user preference. m_saveShouldDeleteUserPreference = false; break; } } } void DeleteDialog::setListMode(DeleteDialogMode::ListMode mode) { m_widget->setListMode(mode); switch (mode) { case DeleteDialogMode::Files: setCaption(i18n("About to delete selected files")); break; case DeleteDialogMode::Albums: case DeleteDialogMode::Subalbums: setCaption(i18n("About to delete selected albums")); break; } } } // namespace Digikam