diff options
Diffstat (limited to 'src/utilities/cameragui/renamecustomizer.cpp')
| -rw-r--r-- | src/utilities/cameragui/renamecustomizer.cpp | 532 | 
1 files changed, 532 insertions, 0 deletions
| diff --git a/src/utilities/cameragui/renamecustomizer.cpp b/src/utilities/cameragui/renamecustomizer.cpp new file mode 100644 index 00000000..a906ccb1 --- /dev/null +++ b/src/utilities/cameragui/renamecustomizer.cpp @@ -0,0 +1,532 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date        : 2004-09-19 + * Description : a options group to set renaming files + *               operations during camera downloading + * + * Copyright (C) 2004-2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu> + * Copyright (C) 2006-2007 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 <tqdatetime.h> +#include <tqlayout.h> +#include <tqradiobutton.h> +#include <tqcheckbox.h> +#include <tqcombobox.h> +#include <tqhbox.h> +#include <tqlabel.h> +#include <tqpushbutton.h> +#include <tqtimer.h> +#include <tqwhatsthis.h> + +// KDE includes. + +#include <tdelocale.h> +#include <tdeconfig.h> +#include <tdeapplication.h> +#include <kiconloader.h> +#include <klineedit.h> +#include <knuminput.h> +#include <kdialogbase.h> +#if KDE_IS_VERSION(3,2,0) +#include <kinputdialog.h> +#else +#include <klineeditdlg.h> +#endif + +// Local includes. + +#include "renamecustomizer.h" +#include "renamecustomizer.moc" + +namespace Digikam +{ + +class RenameCustomizerPriv +{ +public: + +    enum DateFormatOptions +    { +        DigikamStandard = 0, +        IsoDateFormat, +        TextDateFormat, +        LocalDateFormat, +        Advanced +    }; + +    RenameCustomizerPriv() +    { +        renameDefault         = 0; +        renameCustom          = 0; +        renameDefaultBox      = 0; +        renameCustomBox       = 0; +        renameDefaultCase     = 0; +        renameDefaultCaseType = 0; +        addDateTimeBox        = 0; +        addCameraNameBox      = 0; +        addSeqNumberBox       = 0; +        changedTimer          = 0; +        renameCustomPrefix    = 0; +        renameCustomSuffix    = 0; +        startIndexLabel       = 0; +        startIndexInput       = 0; +        focusedWidget         = 0; +        dateTimeButton        = 0; +        dateTimeLabel         = 0; +        dateTimeFormat        = 0; +} + +    TQWidget      *focusedWidget; + +    TQString       cameraTitle; + +    TQRadioButton *renameDefault; +    TQRadioButton *renameCustom; + +    TQGroupBox    *renameDefaultBox; +    TQGroupBox    *renameCustomBox; +     +    TQLabel       *renameDefaultCase; +    TQLabel       *startIndexLabel; +    TQLabel       *dateTimeLabel; + +    TQComboBox    *renameDefaultCaseType; +    TQComboBox    *dateTimeFormat; + +    TQCheckBox    *addDateTimeBox; +    TQCheckBox    *addCameraNameBox; +    TQCheckBox    *addSeqNumberBox; + +    TQPushButton  *dateTimeButton; +    TQString       dateTimeFormatString; + +    TQTimer       *changedTimer; + +    KLineEdit    *renameCustomPrefix; +    KLineEdit    *renameCustomSuffix; + +    KIntNumInput *startIndexInput; +}; + +RenameCustomizer::RenameCustomizer(TQWidget* parent, const TQString& cameraTitle) +                : TQButtonGroup(parent) +{ +    d = new RenameCustomizerPriv; +    d->changedTimer = new TQTimer(this); +    d->cameraTitle  = cameraTitle; + +    setFrameStyle( TQFrame::NoFrame ); +    setRadioButtonExclusive(true); +    setColumnLayout(0, TQt::Vertical); +    TQGridLayout* mainLayout = new TQGridLayout(layout(), 4, 1); + +    // ---------------------------------------------------------------- + +    d->renameDefault = new TQRadioButton(i18n("Camera filenames"), this); +    TQWhatsThis::add( d->renameDefault, i18n("<p>Turn on this option to use camera " +                                            "provided image filenames without modifications.")); +    mainLayout->addMultiCellWidget(d->renameDefault, 0, 0, 0, 1); + +    d->renameDefaultBox = new TQGroupBox( this ); +    d->renameDefaultBox->setFrameStyle(TQFrame::NoFrame|TQFrame::Plain); +    d->renameDefaultBox->setInsideMargin(0); +    d->renameDefaultBox->setColumnLayout(0, TQt::Vertical); + +    d->renameDefaultCase = new TQLabel( i18n("Change case to:"), d->renameDefaultBox ); +    d->renameDefaultCase->setSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Preferred ); + +    d->renameDefaultCaseType = new TQComboBox( d->renameDefaultBox ); +    d->renameDefaultCaseType->insertItem(i18n("Leave as Is"), 0); +    d->renameDefaultCaseType->insertItem(i18n("Upper"), 1); +    d->renameDefaultCaseType->insertItem(i18n("Lower"), 2); +    d->renameDefaultCaseType->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Preferred); +    TQWhatsThis::add( d->renameDefaultCaseType, i18n("<p>Set the method to use to change the case " +                                                    "of image filenames.")); +                                            +    TQHBoxLayout* boxLayout1 = new TQHBoxLayout( d->renameDefaultBox->layout() ); +    boxLayout1->addSpacing( 10 ); +    boxLayout1->addWidget( d->renameDefaultCase ); +    boxLayout1->addWidget( d->renameDefaultCaseType ); + +    mainLayout->addMultiCellWidget(d->renameDefaultBox, 1, 1, 0, 1); + +    // ------------------------------------------------------------- + +    d->renameCustom = new TQRadioButton(i18n("Customize"), this); +    mainLayout->addMultiCellWidget(d->renameCustom, 2, 2, 0, 1); +    TQWhatsThis::add( d->renameCustom, i18n("<p>Turn on this option to customize image filenames " +                                           "during download.")); + +    d->renameCustomBox = new TQGroupBox(this); +    d->renameCustomBox->setFrameStyle(TQFrame::NoFrame|TQFrame::Plain); +    d->renameCustomBox->setInsideMargin(0); +    d->renameCustomBox->setColumnLayout(0, TQt::Vertical); + +    TQGridLayout* renameCustomBoxLayout = new TQGridLayout(d->renameCustomBox->layout(),  +                                                         6, 2, KDialogBase::spacingHint()); +    renameCustomBoxLayout->setColSpacing( 0, 10 ); + +    TQLabel* prefixLabel = new TQLabel(i18n("Prefix:"), d->renameCustomBox); +    renameCustomBoxLayout->addMultiCellWidget(prefixLabel, 0, 0, 1, 1); +    d->renameCustomPrefix = new KLineEdit(d->renameCustomBox); +    d->focusedWidget = d->renameCustomPrefix; +    renameCustomBoxLayout->addMultiCellWidget(d->renameCustomPrefix, 0, 0, 2, 2); +    TQWhatsThis::add( d->renameCustomPrefix, i18n("<p>Set the prefix which will be added to " +                                                 "image filenames.")); + +    TQLabel* suffixLabel = new TQLabel(i18n("Suffix:"), d->renameCustomBox); +    renameCustomBoxLayout->addMultiCellWidget(suffixLabel, 1, 1, 1, 1); +    d->renameCustomSuffix = new KLineEdit(d->renameCustomBox); +    renameCustomBoxLayout->addMultiCellWidget(d->renameCustomSuffix, 1, 1, 2, 2); +    TQWhatsThis::add( d->renameCustomSuffix, i18n("<p>Set the suffix which will be added to " +                                                  "image filenames.")); + +    d->addDateTimeBox = new TQCheckBox( i18n("Add Date && Time"), d->renameCustomBox ); +    renameCustomBoxLayout->addMultiCellWidget(d->addDateTimeBox, 2, 2, 1, 2); +    TQWhatsThis::add( d->addDateTimeBox, i18n("<p>Set this option to add the camera provided date and time.")); + +    TQWidget *dateTimeWidget = new TQWidget(d->renameCustomBox); +    d->dateTimeLabel    = new TQLabel(i18n("Date format:"), dateTimeWidget); +    d->dateTimeFormat   = new TQComboBox(dateTimeWidget); +    d->dateTimeFormat->insertItem(i18n("Standard"),       RenameCustomizerPriv::DigikamStandard); +    d->dateTimeFormat->insertItem(i18n("ISO"),            RenameCustomizerPriv::IsoDateFormat); +    d->dateTimeFormat->insertItem(i18n("Full Text"),      RenameCustomizerPriv::TextDateFormat); +    d->dateTimeFormat->insertItem(i18n("Local Settings"), RenameCustomizerPriv::LocalDateFormat); +    d->dateTimeFormat->insertItem(i18n("Advanced..."),    RenameCustomizerPriv::Advanced); +    TQWhatsThis::add( d->dateTimeFormat, i18n("<p>Select your preferred date format for " +                    "creating new albums. The options available are:</p>" +                    "<p><b>Standard</b>: the date format that has been used as a standard by digiKam. " +                    "E.g.: <i>20060824T142618</i></p>" +                    "<p/><b>ISO</b>: the date format according to ISO 8601 " +                    "(YYYY-MM-DD). E.g.: <i>2006-08-24T14:26:18</i></p>" +                    "<p><b>Full Text</b>: the date format is a user-readable string. " +                    "E.g.: <i>Thu Aug 24 14:26:18 2006</i></p>" +                    "<p><b>Local Settings</b>: the date format depending on TDE control panel settings.</p>" +                    "<p><b>Advanced:</b> allows the user to specify a custom date format.</p>")); +    d->dateTimeButton = new TQPushButton(SmallIcon("configure"), TQString(), dateTimeWidget); +    TQSizePolicy policy = d->dateTimeButton->sizePolicy(); +    policy.setHorData(TQSizePolicy::Maximum); +    d->dateTimeButton->setSizePolicy(policy); +    TQHBoxLayout *boxLayout2 = new TQHBoxLayout(dateTimeWidget); +    boxLayout2->addWidget(d->dateTimeLabel); +    boxLayout2->addWidget(d->dateTimeFormat); +    boxLayout2->addWidget(d->dateTimeButton); +    renameCustomBoxLayout->addMultiCellWidget(dateTimeWidget, 3, 3, 1, 2); + +    d->addCameraNameBox = new TQCheckBox( i18n("Add Camera Name"), d->renameCustomBox ); +    renameCustomBoxLayout->addMultiCellWidget(d->addCameraNameBox, 4, 4, 1, 2); +    TQWhatsThis::add( d->addCameraNameBox, i18n("<p>Set this option to add the camera name.")); + +    d->addSeqNumberBox = new TQCheckBox( i18n("Add Sequence Number"), d->renameCustomBox ); +    renameCustomBoxLayout->addMultiCellWidget(d->addSeqNumberBox, 5, 5, 1, 2); +    TQWhatsThis::add( d->addSeqNumberBox, i18n("<p>Set this option to add a sequence number " +                                              "starting with the index set below.")); + +    d->startIndexLabel = new TQLabel( i18n("Start Index:"), d->renameCustomBox ); +    d->startIndexInput = new KIntNumInput(1, d->renameCustomBox); +    d->startIndexInput->setRange(1, 900000, 1, false); +    TQWhatsThis::add( d->startIndexInput, i18n("<p>Set the starting index value used to rename " +                                              "files with a sequence number.")); + +    renameCustomBoxLayout->addMultiCellWidget(d->startIndexLabel, 6, 6, 1, 1); +    renameCustomBoxLayout->addMultiCellWidget(d->startIndexInput, 6, 6, 2, 2); + +    mainLayout->addMultiCellWidget(d->renameCustomBox, 3, 3, 0, 1); +    mainLayout->setRowStretch(4, 10); + +    // -- setup connections ------------------------------------------------- + +    connect(this, TQ_SIGNAL(clicked(int)), +            this, TQ_SLOT(slotRadioButtonClicked(int))); +             +    connect(d->renameCustomPrefix, TQ_SIGNAL(textChanged(const TQString&)), +            this, TQ_SLOT(slotRenameOptionsChanged())); + +    connect(d->renameCustomSuffix, TQ_SIGNAL(textChanged(const TQString&)), +            this, TQ_SLOT(slotRenameOptionsChanged())); + +    connect(d->addDateTimeBox, TQ_SIGNAL(toggled(bool)), +            this, TQ_SLOT(slotRenameOptionsChanged())); + +    connect(d->addCameraNameBox, TQ_SIGNAL(toggled(bool)), +            this, TQ_SLOT(slotRenameOptionsChanged())); + +    connect(d->addSeqNumberBox, TQ_SIGNAL(toggled(bool)), +            this, TQ_SLOT(slotRenameOptionsChanged())); + +    connect(d->renameDefaultCaseType, TQ_SIGNAL(activated(const TQString&)), +            this, TQ_SLOT(slotRenameOptionsChanged())); + +    connect(d->startIndexInput, TQ_SIGNAL(valueChanged (int)), +            this, TQ_SLOT(slotRenameOptionsChanged())); + +    connect(d->changedTimer, TQ_SIGNAL(timeout()), +            this, TQ_SIGNAL(signalChanged())); + +    connect(d->dateTimeButton, TQ_SIGNAL(clicked()), +            this, TQ_SLOT(slotDateTimeButtonClicked())); + +    connect(d->dateTimeFormat, TQ_SIGNAL(activated(int)), +            this, TQ_SLOT(slotDateTimeFormatChanged(int))); + +    connect(d->addDateTimeBox, TQ_SIGNAL(toggled(bool)), +            this, TQ_SLOT(slotDateTimeBoxToggled(bool))); + +    // -- initial values --------------------------------------------------- + +    readSettings(); + +    // signal to this not yet connected when readSettings is called? Don't know +    slotDateTimeBoxToggled(d->addDateTimeBox->isChecked()); +} + +RenameCustomizer::~RenameCustomizer() +{ +    delete d->changedTimer; +    saveSettings(); +    delete d; +} + +bool RenameCustomizer::useDefault() const +{ +    return d->renameDefault->isChecked(); +} + +int RenameCustomizer::startIndex() const +{ +    return d->startIndexInput->value(); +} + +TQString RenameCustomizer::newName(const TQDateTime &dateTime, int index, const TQString &extension) const +{ +    if (d->renameDefault->isChecked()) +        return TQString(); +    else +    { +        TQString name(d->renameCustomPrefix->text()); + +        // use the "T" as a delimiter between date and time +        TQString date; +        switch (d->dateTimeFormat->currentItem()) +        { +            case RenameCustomizerPriv::DigikamStandard: +                date = dateTime.toString("yyyyMMddThhmmss"); +                break; +            case RenameCustomizerPriv::TextDateFormat: +                date = dateTime.toString(TQt::TextDate); +                break; +            case RenameCustomizerPriv::LocalDateFormat: +                date = dateTime.toString(TQt::LocalDate); +                break; +            case RenameCustomizerPriv::IsoDateFormat: +                date = dateTime.toString(TQt::ISODate); +                break; +            case RenameCustomizerPriv::Advanced: +                date = dateTime.toString(d->dateTimeFormatString); +                break; +         } + +        // it seems that TQString::number does not support padding with zeros +        TQString seq; +        seq.sprintf("-%06d", index); + +        if (d->addDateTimeBox->isChecked()) +            name += date; + +        if (d->addSeqNumberBox->isChecked()) +            name += seq; + +        if (d->addCameraNameBox->isChecked()) +            name += TQString("-%1").arg(d->cameraTitle.simplifyWhiteSpace().replace(" ", "")); + +        name += d->renameCustomSuffix->text(); +        name += extension; + +        return name; +    } +} + +RenameCustomizer::Case RenameCustomizer::changeCase() const +{ +    RenameCustomizer::Case type = NONE; + +    if (d->renameDefaultCaseType->currentItem() == 1) +        type=UPPER; +    if (d->renameDefaultCaseType->currentItem() == 2) +        type=LOWER; + +    return type; +} + +void RenameCustomizer::slotRadioButtonClicked(int) +{ +    TQRadioButton* btn = dynamic_cast<TQRadioButton*>(selected()); +    if (!btn) +        return; + +    d->renameCustomBox->setEnabled( btn != d->renameDefault ); +    d->renameDefaultBox->setEnabled( btn == d->renameDefault ); +    slotRenameOptionsChanged(); +} + +void RenameCustomizer::slotRenameOptionsChanged() +{ +    d->focusedWidget = focusWidget(); + +    if (d->addSeqNumberBox->isChecked()) +    { +        d->startIndexInput->setEnabled(true); +        d->startIndexLabel->setEnabled(true); +    } +    else +    { +        d->startIndexInput->setEnabled(false); +        d->startIndexLabel->setEnabled(false); +    } + +    d->changedTimer->start(500, true); +} + +void RenameCustomizer::slotDateTimeBoxToggled(bool on) +{ +    d->dateTimeLabel->setEnabled(on); +    d->dateTimeFormat->setEnabled(on); +    d->dateTimeButton->setEnabled(on +            && d->dateTimeFormat->currentItem() == RenameCustomizerPriv::Advanced); +    slotRenameOptionsChanged(); +} + +void RenameCustomizer::slotDateTimeFormatChanged(int index) +{ +    if (index == RenameCustomizerPriv::Advanced) +    { +        d->dateTimeButton->setEnabled(true); +        //d->dateTimeButton->show(); +        //slotDateTimeButtonClicked(); +    } +    else +    { +        d->dateTimeButton->setEnabled(false); +        //d->dateTimeButton->hide(); +    } +    slotRenameOptionsChanged(); +} + +void RenameCustomizer::slotDateTimeButtonClicked() +{ +    bool ok; +    TQString message = i18n("<qt><p>Enter the format for date and time.</p>" +                           "<p>Use <i>dd</i> for the day, " +                           "<i>MM</i> for the month, " +                           "<i>yyyy</i> for the year, " +                           "<i>hh</i> for the hour, " +                           "<i>mm</i> for the minute, " +                           "<i>ss</i> for the second.</p>" +                           "<p>Examples: <i>yyyyMMddThhmmss</i> " +                           "for 20060824T142418,<br>" +                           "<i>yyyy-MM-dd hh:mm:ss</i> " +                           "for 2006-08-24 14:24:18.</p></qt>"); + +#if KDE_IS_VERSION(3,2,0) +    TQString newFormat = KInputDialog::getText(i18n("Change Date and Time Format"), +                                              message, +                                              d->dateTimeFormatString, &ok, this); +#else +    TQString newFormat = KLineEditDlg::getText(i18n("Change Date and Time Format"), +                                              message, +                                              d->dateTimeFormatString, &ok, this); +#endif + +    if (!ok) +        return; + +    d->dateTimeFormatString = newFormat; +    slotRenameOptionsChanged(); +} + +void RenameCustomizer::readSettings() +{ +    TDEConfig* config = kapp->config(); +     +    config->setGroup("Camera Settings"); +    bool def         = config->readBoolEntry("Rename Use Default", true); +    bool addSeqNumb  = config->readBoolEntry("Add Sequence Number", true); +    bool adddateTime = config->readBoolEntry("Add Date Time", false); +    bool addCamName  = config->readBoolEntry("Add Camera Name", false); +    int chcaseT      = config->readNumEntry("Case Type", NONE); +    TQString prefix   = config->readEntry("Rename Prefix", i18n("photo")); +    TQString suffix   = config->readEntry("Rename Postfix", TQString()); +    int startIndex   = config->readNumEntry("Rename Start Index", 1); +    int dateTime     = config->readNumEntry("Date Time Format", RenameCustomizerPriv::IsoDateFormat); +    TQString format   = config->readEntry("Date Time Format String", "yyyyMMddThhmmss"); + +    if (def) +    { +        d->renameDefault->setChecked(true); +        d->renameCustom->setChecked(false); +        d->renameCustomBox->setEnabled(false); +        d->renameDefaultBox->setEnabled(true); +    } +    else +    { +        d->renameDefault->setChecked(false); +        d->renameCustom->setChecked(true); +        d->renameCustomBox->setEnabled(true); +        d->renameDefaultBox->setEnabled(false); +    } + +    d->addDateTimeBox->setChecked(adddateTime); +    d->addCameraNameBox->setChecked(addCamName); +    d->addSeqNumberBox->setChecked(addSeqNumb); +    d->renameDefaultCaseType->setCurrentItem(chcaseT); +    d->renameCustomPrefix->setText(prefix); +    d->renameCustomSuffix->setText(suffix); +    d->startIndexInput->setValue(startIndex); +    d->dateTimeFormat->setCurrentItem(dateTime); +    d->dateTimeFormatString = format; +    slotRenameOptionsChanged(); +} + +void RenameCustomizer::saveSettings() +{ +    TDEConfig* config = kapp->config(); + +    config->setGroup("Camera Settings"); +    config->writeEntry("Rename Use Default", d->renameDefault->isChecked()); +    config->writeEntry("Add Camera Name", d->addCameraNameBox->isChecked()); +    config->writeEntry("Add Date Time", d->addDateTimeBox->isChecked()); +    config->writeEntry("Add Sequence Number", d->addSeqNumberBox->isChecked()); +    config->writeEntry("Case Type", d->renameDefaultCaseType->currentItem()); +    config->writeEntry("Rename Prefix", d->renameCustomPrefix->text()); +    config->writeEntry("Rename Suffix", d->renameCustomSuffix->text()); +    config->writeEntry("Rename Start Index", d->startIndexInput->value()); +    config->writeEntry("Date Time Format", d->dateTimeFormat->currentItem()); +    config->writeEntry("Date Time Format String", d->dateTimeFormatString); +    config->sync(); +} + +void RenameCustomizer::restoreFocus() +{ +    d->focusedWidget->setFocus(); +} + +}  // namespace Digikam + | 
