summaryrefslogtreecommitdiffstats
path: root/kio/kfile/kfilemetainfowidget.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commitce4a32fe52ef09d8f5ff1dd22c001110902b60a2 (patch)
tree5ac38a06f3dde268dc7927dc155896926aaf7012 /kio/kfile/kfilemetainfowidget.cpp
downloadtdelibs-ce4a32fe52ef09d8f5ff1dd22c001110902b60a2.tar.gz
tdelibs-ce4a32fe52ef09d8f5ff1dd22c001110902b60a2.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kio/kfile/kfilemetainfowidget.cpp')
-rw-r--r--kio/kfile/kfilemetainfowidget.cpp375
1 files changed, 375 insertions, 0 deletions
diff --git a/kio/kfile/kfilemetainfowidget.cpp b/kio/kfile/kfilemetainfowidget.cpp
new file mode 100644
index 000000000..ee76c82e2
--- /dev/null
+++ b/kio/kfile/kfilemetainfowidget.cpp
@@ -0,0 +1,375 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 2001,2002 Rolf Magnus <ramagnus@kde.org>
+
+ library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ $Id$
+ */
+
+#include "kfilemetainfowidget.h"
+
+#include <keditcl.h>
+#include <klocale.h>
+#include <knuminput.h>
+#include <kcombobox.h>
+#include <klineedit.h>
+#include <kstringvalidator.h>
+#include <kdebug.h>
+
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qspinbox.h>
+#include <qdatetimeedit.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qlayout.h>
+#include <qvalidator.h>
+
+/*
+ Widgets used for different types:
+
+ bool : QCheckBox
+ int : QSpinBox
+ QString : KComboBox if the validator is a KStringListValidator, else lineedit
+ QDateTime : QDateTimeEdit
+
+*/
+
+KFileMetaInfoWidget::KFileMetaInfoWidget(KFileMetaInfoItem item,
+ QValidator* val,
+ QWidget* parent, const char* name)
+ : QWidget(parent, name),
+ m_value(item.value()),
+ m_item(item),
+ m_validator(val)
+{
+ init(item, ReadWrite);
+}
+
+KFileMetaInfoWidget::KFileMetaInfoWidget(KFileMetaInfoItem item,
+ Mode mode,
+ QValidator* val,
+ QWidget* parent, const char* name)
+ : QWidget(parent, name),
+ m_value(item.value()),
+ m_item(item),
+ m_validator(val)
+{
+ init(item, mode);
+}
+
+void KFileMetaInfoWidget::init(KFileMetaInfoItem item, Mode mode)
+{
+ kdDebug(7033) << "*** item " << m_item.key()
+ << " is a " << value().typeName() << endl;
+
+ if (m_item.isEditable() && !(mode & ReadOnly))
+ m_widget = makeWidget();
+ else
+ switch (m_value.type())
+ {
+ case QVariant::Image :
+ m_widget = new QLabel(this, "info image");
+ static_cast<QLabel*>(m_widget)->setPixmap(QPixmap(m_value.toImage()));
+ break;
+ case QVariant::Pixmap :
+ m_widget = new QLabel(this, "info pixmap");
+ static_cast<QLabel*>(m_widget)->setPixmap(m_value.toPixmap());
+ break;
+ default:
+ m_widget = new QLabel(item.string(true), this, "info label");
+ }
+
+ (new QHBoxLayout(this))->addWidget(m_widget);
+}
+
+KFileMetaInfoWidget::~KFileMetaInfoWidget()
+{
+}
+
+QWidget* KFileMetaInfoWidget::makeWidget()
+{
+ QString valClass;
+ QWidget* w;
+
+ switch (m_value.type())
+ {
+ case QVariant::Invalid: // no type
+ // just make a label
+ w = new QLabel(i18n("<Error>"), this, "label");
+ break;
+
+ case QVariant::Int: // an int
+ case QVariant::UInt: // an unsigned int
+ w = makeIntWidget();
+ break;
+
+ case QVariant::Bool: // a bool
+ w = makeBoolWidget();
+ break;
+
+ case QVariant::Double: // a double
+ w = makeDoubleWidget();
+ break;
+
+
+ case QVariant::Date: // a QDate
+ w = makeDateWidget();
+ break;
+
+ case QVariant::Time: // a QTime
+ w = makeTimeWidget();
+ break;
+
+ case QVariant::DateTime: // a QDateTime
+ w = makeDateTimeWidget();
+ break;
+
+#if 0
+ case QVariant::Size: // a QSize
+ case QVariant::String: // a QString
+ case QVariant::List: // a QValueList
+ case QVariant::Map: // a QMap
+ case QVariant::StringList: // a QStringList
+ case QVariant::Font: // a QFont
+ case QVariant::Pixmap: // a QPixmap
+ case QVariant::Brush: // a QBrush
+ case QVariant::Rect: // a QRect
+ case QVariant::Color: // a QColor
+ case QVariant::Palette: // a QPalette
+ case QVariant::ColorGroup: // a QColorGroup
+ case QVariant::IconSet: // a QIconSet
+ case QVariant::Point: // a QPoint
+ case QVariant::Image: // a QImage
+ case QVariant::CString: // a QCString
+ case QVariant::PointArray: // a QPointArray
+ case QVariant::Region: // a QRegion
+ case QVariant::Bitmap: // a QBitmap
+ case QVariant::Cursor: // a QCursor
+ case QVariant::ByteArray: // a QByteArray
+ case QVariant::BitArray: // a QBitArray
+ case QVariant::SizePolicy: // a QSizePolicy
+ case QVariant::KeySequence: // a QKeySequence
+#endif
+ default:
+ w = makeStringWidget();
+ }
+
+ kdDebug(7033) << "*** item " << m_item.key()
+ << "is a " << m_item.value().typeName() << endl;
+ if (m_validator)
+ kdDebug(7033) << " and validator is a " << m_validator->className() << endl;
+
+ kdDebug(7033) << "*** created a " << w->className() << " for it\n";
+
+ return w;
+}
+
+// ****************************************************************
+// now the different methods to make the widgets for specific types
+// ****************************************************************
+
+QWidget* KFileMetaInfoWidget::makeBoolWidget()
+{
+ QCheckBox* cb = new QCheckBox(this, "metainfo bool widget");
+ cb->setChecked(m_item.value().toBool());
+ connect(cb, SIGNAL(toggled(bool)), this, SLOT(slotChanged(bool)));
+ return cb;
+}
+
+QWidget* KFileMetaInfoWidget::makeIntWidget()
+{
+ QSpinBox* sb = new QSpinBox(this, "metainfo integer widget");
+ sb->setValue(m_item.value().toInt());
+
+ if (m_validator)
+ {
+ if (m_validator->inherits("QIntValidator"))
+ {
+ sb->setMinValue(static_cast<QIntValidator*>(m_validator)->bottom());
+ sb->setMaxValue(static_cast<QIntValidator*>(m_validator)->top());
+ }
+ reparentValidator(sb, m_validator);
+ sb->setValidator(m_validator);
+ }
+
+ // make sure that an uint cannot be set to a value < 0
+ if (m_item.type() == QVariant::UInt)
+ sb->setMinValue(QMAX(sb->minValue(), 0));
+
+ connect(sb, SIGNAL(valueChanged(int)), this, SLOT(slotChanged(int)));
+ return sb;
+}
+
+QWidget* KFileMetaInfoWidget::makeDoubleWidget()
+{
+ KDoubleNumInput* dni = new KDoubleNumInput(m_item.value().toDouble(),
+ this, "metainfo double widget");
+
+
+ if (m_validator)
+ {
+ if (m_validator->inherits("QDoubleValidator"))
+ {
+ dni->setMinValue(static_cast<QDoubleValidator*>(m_validator)->bottom());
+ dni->setMaxValue(static_cast<QDoubleValidator*>(m_validator)->top());
+ }
+ reparentValidator(dni, m_validator);
+ }
+
+ connect(dni, SIGNAL(valueChanged(double)), this, SLOT(slotChanged(double)));
+ return dni;
+}
+
+QWidget* KFileMetaInfoWidget::makeStringWidget()
+{
+ if (m_validator && m_validator->inherits("KStringListValidator"))
+ {
+ KComboBox* b = new KComboBox(true, this, "metainfo combobox");
+ KStringListValidator* val = static_cast<KStringListValidator*>
+ (m_validator);
+ b->insertStringList(val->stringList());
+ b->setCurrentText(m_item.value().toString());
+ connect(b, SIGNAL(activated(const QString &)), this, SLOT(slotComboChanged(const QString &)));
+ b->setValidator(val);
+ reparentValidator(b, val);
+ return b;
+ }
+
+ if ( m_item.attributes() & KFileMimeTypeInfo::MultiLine ) {
+ KEdit *edit = new KEdit( this );
+ edit->setText( m_item.value().toString() );
+ connect( edit, SIGNAL( textChanged() ),
+ this, SLOT( slotMultiLineEditChanged() ));
+ // can't use a validator with a QTextEdit, but we may need to delete it
+ if ( m_validator )
+ reparentValidator( edit, m_validator );
+ return edit;
+ }
+
+ KLineEdit* e = new KLineEdit(m_item.value().toString(), this);
+ if (m_validator)
+ {
+ e->setValidator(m_validator);
+ reparentValidator(e, m_validator);
+ }
+ connect(e, SIGNAL(textChanged(const QString&)),
+ this, SLOT(slotLineEditChanged(const QString&)));
+ return e;
+}
+
+QWidget* KFileMetaInfoWidget::makeDateWidget()
+{
+ QWidget *e = new QDateEdit(m_item.value().toDate(), this);
+ connect(e, SIGNAL(valueChanged(const QDate&)),
+ this, SLOT(slotDateChanged(const QDate&)));
+ return e;
+}
+
+QWidget* KFileMetaInfoWidget::makeTimeWidget()
+{
+ return new QTimeEdit(m_item.value().toTime(), this);
+}
+
+QWidget* KFileMetaInfoWidget::makeDateTimeWidget()
+{
+ return new QDateTimeEdit(m_item.value().toDateTime(), this);
+}
+
+void KFileMetaInfoWidget::reparentValidator( QWidget *widget,
+ QValidator *validator )
+{
+ if ( !validator->parent() )
+ widget->insertChild( validator );
+}
+
+// ****************************************************************
+// now the slots that let us get notified if the value changed in the child
+// ****************************************************************
+
+void KFileMetaInfoWidget::slotChanged(bool value)
+{
+ Q_ASSERT(m_widget->inherits("QComboBox"));
+ m_value = QVariant(value);
+ emit valueChanged(m_value);
+ m_dirty = true;
+}
+
+void KFileMetaInfoWidget::slotChanged(int value)
+{
+ Q_ASSERT(m_widget->inherits("QSpinBox"));
+ m_value = QVariant(value);
+ emit valueChanged(m_value);
+ m_dirty = true;
+}
+
+void KFileMetaInfoWidget::slotChanged(double value)
+{
+ Q_ASSERT(m_widget->inherits("KDoubleNumInput"));
+ m_value = QVariant(value);
+ emit valueChanged(m_value);
+ m_dirty = true;
+}
+
+void KFileMetaInfoWidget::slotComboChanged(const QString &value)
+{
+ Q_ASSERT(m_widget->inherits("KComboBox"));
+ m_value = QVariant(value);
+ emit valueChanged(m_value);
+ m_dirty = true;
+}
+
+void KFileMetaInfoWidget::slotLineEditChanged(const QString& value)
+{
+ Q_ASSERT(m_widget->inherits("KLineEdit"));
+ m_value = QVariant(value);
+ emit valueChanged(m_value);
+ m_dirty = true;
+}
+
+// that may be a little expensive for long texts, but what can we do?
+void KFileMetaInfoWidget::slotMultiLineEditChanged()
+{
+ Q_ASSERT(m_widget->inherits("QTextEdit"));
+ m_value = QVariant( static_cast<const QTextEdit*>( sender() )->text() );
+ emit valueChanged(m_value);
+ m_dirty = true;
+}
+
+void KFileMetaInfoWidget::slotDateChanged(const QDate& value)
+{
+ Q_ASSERT(m_widget->inherits("QDateEdit"));
+ m_value = QVariant(value);
+ emit valueChanged(m_value);
+ m_dirty = true;
+}
+
+void KFileMetaInfoWidget::slotTimeChanged(const QTime& value)
+{
+ Q_ASSERT(m_widget->inherits("QTimeEdit"));
+ m_value = QVariant(value);
+ emit valueChanged(m_value);
+ m_dirty = true;
+}
+
+void KFileMetaInfoWidget::slotDateTimeChanged(const QDateTime& value)
+{
+ Q_ASSERT(m_widget->inherits("QDateTimeEdit"));
+ m_value = QVariant(value);
+ emit valueChanged(m_value);
+ m_dirty = true;
+}
+
+#include "kfilemetainfowidget.moc"