• Skip to content
  • Skip to link menu
KDE 4.4 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

digikam

advancedrenameinput.cpp

Go to the documentation of this file.
00001 /* ============================================================
00002  *
00003  * This file is a part of digiKam project
00004  * http://www.digikam.org
00005  *
00006  * Date        : 2009-09-03
00007  * Description : an input widget for the AdvancedRename utility
00008  *
00009  * Copyright (C) 2009 by Andi Clemens <andi dot clemens at gmx dot net>
00010  *
00011  * This program is free software; you can redistribute it
00012  * and/or modify it under the terms of the GNU General
00013  * Public License as published by the Free Software Foundation;
00014  * either version 2, or (at your option)
00015  * any later version.
00016  *
00017  * This program is distributed in the hope that it will be useful,
00018  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00019  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020  * GNU General Public License for more details.
00021  *
00022  * ============================================================ */
00023 
00024 #include "advancedrenameinput.moc"
00025 
00026 // Qt includes
00027 
00028 #include <QFontMetrics>
00029 #include <QLayout>
00030 #include <QTimer>
00031 #include <QScrollBar>
00032 
00033 // KDE includes
00034 
00035 #include <kapplication.h>
00036 #include <kconfig.h>
00037 #include <kconfiggroup.h>
00038 #include <kdialog.h>
00039 #include <klocale.h>
00040 
00041 // Local includes
00042 
00043 #include "highlighter.h"
00044 #include "parser.h"
00045 
00046 // const variables
00047 
00048 const int INVALID = -1;
00049 
00050 namespace Digikam
00051 {
00052 
00053 AdvancedRenameLineEditProxy::AdvancedRenameLineEditProxy(QWidget* parent)
00054                            : ProxyLineEdit(parent)
00055 {
00056     setClearButtonShown(true);
00057 }
00058 
00059 void AdvancedRenameLineEditProxy::setWidget(QWidget *widget)
00060 {
00061     if (m_widget)
00062     {
00063         delete m_widget;
00064     }
00065 
00066     if (m_layout)
00067     {
00068         delete m_layout;
00069     }
00070 
00071     m_widget = widget;
00072     m_widget->setParent(this);
00073 
00074     QWidget* placeholder = new QWidget(this);
00075     placeholder->setFixedHeight(1);
00076     placeholder->setFixedWidth(clearButtonUsedSize().width());
00077 
00078     QGridLayout* mainLayout = new QGridLayout(this);
00079     mainLayout->addWidget(m_widget,    0, 0, 1, 1);
00080     mainLayout->addWidget(placeholder, 0, 1, 1, 1);
00081     mainLayout->setSpacing(0);
00082     mainLayout->setMargin(0);
00083     setLayout(mainLayout);
00084     updateGeometry();
00085 }
00086 
00087 void AdvancedRenameLineEditProxy::mousePressEvent(QMouseEvent* event)
00088 {
00089     KLineEdit::mousePressEvent(event);
00090 }
00091 
00092 void AdvancedRenameLineEditProxy::mouseReleaseEvent(QMouseEvent* event)
00093 {
00094     KLineEdit::mouseReleaseEvent(event);
00095 }
00096 
00097 // --------------------------------------------------------
00098 
00099 class AdvancedRenameLineEditPriv
00100 {
00101 public:
00102 
00103     AdvancedRenameLineEditPriv() :
00104         verticalSliderPosition(INVALID),
00105         parseTimer(0),
00106         parser(0)
00107     {}
00108 
00109     int     verticalSliderPosition;
00110     QTimer* parseTimer;
00111     Parser* parser;
00112 };
00113 
00114 AdvancedRenameLineEdit::AdvancedRenameLineEdit(QWidget* parent)
00115                       : KTextEdit(parent), d(new AdvancedRenameLineEditPriv)
00116 {
00117     setLineWrapMode(KTextEdit::NoWrap);
00118     setWordWrapMode(QTextOption::NoWrap);
00119     setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00120     setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00121     setFrameStyle(QFrame::NoFrame);
00122     setPalette(kapp->palette());
00123     setFocusPolicy(Qt::StrongFocus);
00124 
00125     viewport()->setAutoFillBackground(false);
00126     setAutoFillBackground(false);
00127 
00128     QFontMetrics fm = fontMetrics();
00129     setFixedHeight(fm.height());
00130 
00131     // --------------------------------------------------------
00132 
00133     d->parseTimer = new QTimer(this);
00134     d->parseTimer->setInterval(500);
00135     d->parseTimer->setSingleShot(true);
00136 
00137     // --------------------------------------------------------
00138 
00139     // layout widget correctly by setting a dummy text and calling ensureCursorVisible().
00140     // Save the scrollbar position now, to avoid scrolling of the text when selecting with the mouse
00141     setPlainText("DUMMY TEXT");
00142     ensureCursorVisible();
00143     d->verticalSliderPosition = verticalScrollBar()->value();
00144     clear();
00145 
00146     // --------------------------------------------------------
00147 
00148     connect(d->parseTimer, SIGNAL(timeout()),
00149             this, SLOT(slotParseTimer()));
00150 
00151     connect(this, SIGNAL(textChanged()),
00152             this, SLOT(slotTextChanged()));
00153 
00154     connect(this, SIGNAL(cursorPositionChanged()),
00155             this, SLOT(slotCursorPositionChanged()));
00156 }
00157 
00158 AdvancedRenameLineEdit::~AdvancedRenameLineEdit()
00159 {
00160     delete d;
00161 }
00162 
00163 void AdvancedRenameLineEdit::setParser(Parser* parser)
00164 {
00165     if (parser)
00166     {
00167         d->parser = parser;
00168     }
00169 }
00170 
00171 Parser* AdvancedRenameLineEdit::parser()
00172 {
00173     return d->parser;
00174 }
00175 
00176 void AdvancedRenameLineEdit::keyPressEvent(QKeyEvent* e)
00177 {
00178     if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return)
00179     {
00180         emit signalReturnPressed();
00181     }
00182     else
00183     {
00184         KTextEdit::keyPressEvent(e);
00185     }
00186 }
00187 
00188 void AdvancedRenameLineEdit::wheelEvent(QWheelEvent* e)
00189 {
00190     e->setAccepted(false);
00191 }
00192 
00193 void AdvancedRenameLineEdit::slotTextChanged()
00194 {
00195     d->parseTimer->start();
00196 }
00197 
00198 void AdvancedRenameLineEdit::slotParseTimer()
00199 {
00200     emit signalTextChanged(toPlainText());
00201 }
00202 
00203 void AdvancedRenameLineEdit::scrollContentsBy(int dx, int dy)
00204 {
00205     Q_UNUSED(dx)
00206     Q_UNUSED(dy)
00207 
00208     if (d->verticalSliderPosition != INVALID)
00209     {
00210         verticalScrollBar()->setValue(d->verticalSliderPosition);
00211     }
00212     viewport()->update();
00213 }
00214 
00215 void AdvancedRenameLineEdit::slotCursorPositionChanged()
00216 {
00217     bool found = false;
00218 
00219     if (d->parser)
00220     {
00221         int start           = INVALID;
00222         int length          = INVALID;
00223         QString parseString = toPlainText();
00224         int pos             = textCursor().position();
00225         found               = d->parser->tokenAtPosition(Parser::Token,
00226                                                          parseString, pos, start, length);
00227         found               = found && ( (start + length) == pos );
00228 
00229         if (!found)
00230         {
00231             found = d->parser->tokenAtPosition(Parser::TokenAndModifiers,
00232                                                parseString, pos, start, length);
00233             found = found && ( (start + length) == pos );
00234         }
00235     }
00236     emit signalTokenMarked(found);
00237 }
00238 
00239 void AdvancedRenameLineEdit::slotSetHistoryItem(const QString& text)
00240 {
00241     clear();
00242     setPlainText(text);
00243     QTextCursor cursor = textCursor();
00244     cursor.movePosition(QTextCursor::EndOfLine);
00245     setTextCursor(cursor);
00246     setFocus();
00247 }
00248 
00249 // --------------------------------------------------------
00250 
00251 class AdvancedRenameInputPriv
00252 {
00253 public:
00254 
00255     AdvancedRenameInputPriv() :
00256         configGroupName("AdvancedRename Input"),
00257         configPatternHistoryListEntry("Pattern History List"),
00258 
00259         maxVisibleItems(10),
00260         maxHistoryItems(20),
00261         lineEdit(0),
00262         highlighter(0)
00263     {}
00264 
00265     const QString           configGroupName;
00266     const QString           configPatternHistoryListEntry;
00267 
00268     const int               maxVisibleItems;
00269     const int               maxHistoryItems;
00270 
00271     QStringList             patternHistory;
00272 
00273     AdvancedRenameLineEdit* lineEdit;
00274     Highlighter*            highlighter;
00275 };
00276 
00277 // --------------------------------------------------------
00278 
00279 AdvancedRenameInput::AdvancedRenameInput(QWidget* parent)
00280                    : KComboBox(parent), d(new AdvancedRenameInputPriv)
00281 {
00282     // important: setEditable() has to be called before adding the actual line edit widget, otherwise
00283     //            our lineEdit gets removed again.
00284     setEditable(true);
00285     setMaxVisibleItems(d->maxVisibleItems);
00286     setMaxCount(d->maxHistoryItems);
00287     setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
00288 
00289     AdvancedRenameLineEditProxy* proxy = new AdvancedRenameLineEditProxy(this);
00290     d->lineEdit                        = new AdvancedRenameLineEdit(this);
00291     proxy->setWidget(d->lineEdit);
00292 
00293     setLineEdit(proxy);
00294     proxy->setAutoFillBackground(false);
00295 
00296     // --------------------------------------------------------
00297 
00298     connect(proxy, SIGNAL(clearButtonClicked()),
00299             this, SLOT(clearText()));
00300 
00301     connect(d->lineEdit, SIGNAL(signalTextChanged(const QString&)),
00302             proxy, SLOT(setText(const QString&)));
00303 
00304     connect(d->lineEdit, SIGNAL(signalTextChanged(const QString&)),
00305             this, SIGNAL(signalTextChanged(const QString&)));
00306 
00307     connect(d->lineEdit, SIGNAL(signalTokenMarked(bool)),
00308             this, SIGNAL(signalTokenMarked(bool)));
00309 
00310     connect(d->lineEdit, SIGNAL(signalReturnPressed()),
00311             this, SIGNAL(signalReturnPressed()));
00312 
00313     connect(this, SIGNAL(activated(const QString&)),
00314             d->lineEdit, SLOT(slotSetHistoryItem(const QString&)));
00315 
00316     // --------------------------------------------------------
00317 
00318     readSettings();
00319 }
00320 
00321 AdvancedRenameInput::~AdvancedRenameInput()
00322 {
00323     writeSettings();
00324     delete d;
00325 }
00326 
00327 void AdvancedRenameInput::setParser(Parser* parser)
00328 {
00329     d->lineEdit->setParser(parser);
00330 
00331     delete d->highlighter;
00332     d->highlighter = new Highlighter(d->lineEdit, parser);
00333 }
00334 
00335 void AdvancedRenameInput::setText(const QString& text)
00336 {
00337     d->lineEdit->setPlainText(text);
00338 }
00339 
00340 void AdvancedRenameInput::clearText()
00341 {
00342     d->lineEdit->clear();
00343 }
00344 
00345 void AdvancedRenameInput::clearTextAndHistory()
00346 {
00347     d->lineEdit->clear();
00348     clear();
00349 }
00350 
00351 QString AdvancedRenameInput::text() const
00352 {
00353     return d->lineEdit->toPlainText();
00354 }
00355 
00356 void AdvancedRenameInput::slotAddToken(const QString& token)
00357 {
00358     d->lineEdit->insertPlainText(token);
00359     d->lineEdit->setFocus();
00360     d->lineEdit->ensureCursorVisible();
00361 }
00362 
00363 void AdvancedRenameInput::readSettings()
00364 {
00365     KSharedConfig::Ptr config = KGlobal::config();
00366     KConfigGroup group        = config->group(d->configGroupName);
00367 
00368     d->patternHistory = group.readEntry(d->configPatternHistoryListEntry, QStringList());
00369     d->patternHistory.removeAll(QString(""));
00370     addItems(d->patternHistory);
00371     d->lineEdit->clear();
00372 }
00373 
00374 void AdvancedRenameInput::writeSettings()
00375 {
00376     KSharedConfig::Ptr config = KGlobal::config();
00377     KConfigGroup group        = config->group(d->configGroupName);
00378 
00379     // remove duplicate entries and save pattern history, omit empty strings
00380     QString pattern = d->lineEdit->toPlainText();
00381     d->patternHistory.removeAll(pattern);
00382     d->patternHistory.removeAll(QString(""));
00383     d->patternHistory.prepend(pattern);
00384     group.writeEntry(d->configPatternHistoryListEntry, d->patternHistory);
00385 }
00386 
00387 }  // namespace Digikam

digikam

Skip menu "digikam"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members

API Reference

Skip menu "API Reference"
  • digikam
Generated for API Reference by doxygen 1.5.9-20090814
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal