summaryrefslogtreecommitdiffstats
path: root/kio/kfile/kmetaprops.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/kmetaprops.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/kmetaprops.cpp')
-rw-r--r--kio/kfile/kmetaprops.cpp268
1 files changed, 268 insertions, 0 deletions
diff --git a/kio/kfile/kmetaprops.cpp b/kio/kfile/kmetaprops.cpp
new file mode 100644
index 000000000..b3ff504fc
--- /dev/null
+++ b/kio/kfile/kmetaprops.cpp
@@ -0,0 +1,268 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 2001,2002 Rolf Magnus <[email protected]>
+
+ 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 "kmetaprops.h"
+
+#include <kdebug.h>
+#include <kfilemetainfowidget.h>
+#include <kfilemetainfo.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kprotocolinfo.h>
+
+#include <qvalidator.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qfileinfo.h>
+#include <qdatetime.h>
+#include <qstylesheet.h>
+#include <qvgroupbox.h>
+
+#undef Bool
+
+class MetaPropsScrollView : public QScrollView
+{
+public:
+ MetaPropsScrollView(QWidget* parent = 0, const char* name = 0)
+ : QScrollView(parent, name)
+ {
+ setFrameStyle(QFrame::NoFrame);
+ m_frame = new QFrame(viewport(), "MetaPropsScrollView::m_frame");
+ m_frame->setFrameStyle(QFrame::NoFrame);
+ addChild(m_frame, 0, 0);
+ };
+
+ QFrame* frame() {return m_frame;};
+
+protected:
+ virtual void viewportResizeEvent(QResizeEvent* ev)
+ {
+ QScrollView::viewportResizeEvent(ev);
+ m_frame->resize( kMax(m_frame->sizeHint().width(), ev->size().width()),
+ kMax(m_frame->sizeHint().height(), ev->size().height()));
+ };
+
+private:
+ QFrame* m_frame;
+};
+
+class KFileMetaPropsPlugin::KFileMetaPropsPluginPrivate
+{
+public:
+ KFileMetaPropsPluginPrivate() {}
+ ~KFileMetaPropsPluginPrivate() {}
+
+ QFrame* m_frame;
+ QGridLayout* m_framelayout;
+ KFileMetaInfo m_info;
+// QPushButton* m_add;
+ QPtrList<KFileMetaInfoWidget> m_editWidgets;
+};
+
+KFileMetaPropsPlugin::KFileMetaPropsPlugin(KPropertiesDialog* props)
+ : KPropsDlgPlugin(props)
+{
+ d = new KFileMetaPropsPluginPrivate;
+
+ KFileItem * fileitem = properties->item();
+ kdDebug(250) << "KFileMetaPropsPlugin constructor" << endl;
+
+ d->m_info = fileitem->metaInfo();
+ if (!d->m_info.isValid())
+ {
+ d->m_info = KFileMetaInfo(properties->kurl().path(-1));
+ fileitem->setMetaInfo(d->m_info);
+ }
+
+ if ( properties->items().count() > 1 )
+ {
+ // not yet supported
+ // we should allow setting values for a list of files. Itt makes sense
+ // in some cases, like the album of a list of mp3s
+ return;
+ }
+
+ createLayout();
+
+ setDirty(true);
+}
+
+void KFileMetaPropsPlugin::createLayout()
+{
+ QFileInfo file_info(properties->item()->url().path());
+
+ kdDebug(250) << "KFileMetaPropsPlugin::createLayout" << endl;
+
+ // is there any valid and non-empty info at all?
+ if ( !d->m_info.isValid() || (d->m_info.preferredKeys()).isEmpty() )
+ return;
+
+ // now get a list of groups
+ KFileMetaInfoProvider* prov = KFileMetaInfoProvider::self();
+ QStringList groupList = d->m_info.preferredGroups();
+
+ const KFileMimeTypeInfo* mtinfo = prov->mimeTypeInfo(d->m_info.mimeType());
+ if (!mtinfo)
+ {
+ kdDebug(7034) << "no mimetype info there\n";
+ return;
+ }
+
+ // let the dialog create the page frame
+ QFrame* topframe = properties->addPage(i18n("&Meta Info"));
+ topframe->setFrameStyle(QFrame::NoFrame);
+ QVBoxLayout* tmp = new QVBoxLayout(topframe);
+
+ // create a scroll view in the page
+ MetaPropsScrollView* view = new MetaPropsScrollView(topframe);
+
+ tmp->addWidget(view);
+
+ d->m_frame = view->frame();
+
+ QVBoxLayout *toplayout = new QVBoxLayout(d->m_frame);
+ toplayout->setSpacing(KDialog::spacingHint());
+
+ for (QStringList::Iterator git=groupList.begin();
+ git!=groupList.end(); ++git)
+ {
+ kdDebug(7033) << *git << endl;
+
+ QStringList itemList = d->m_info.group(*git).preferredKeys();
+ if (itemList.isEmpty())
+ continue;
+
+ QGroupBox *groupBox = new QGroupBox(2, Qt::Horizontal,
+ QStyleSheet::escape(mtinfo->groupInfo(*git)->translatedName()),
+ d->m_frame);
+
+ toplayout->addWidget(groupBox);
+
+ QValueList<KFileMetaInfoItem> readItems;
+ QValueList<KFileMetaInfoItem> editItems;
+
+ for (QStringList::Iterator iit = itemList.begin();
+ iit!=itemList.end(); ++iit)
+ {
+ KFileMetaInfoItem item = d->m_info[*git][*iit];
+ if ( !item.isValid() ) continue;
+
+ bool editable = file_info.isWritable() && item.isEditable();
+
+ if (editable)
+ editItems.append( item );
+ else
+ readItems.append( item );
+ }
+
+ KFileMetaInfoWidget* w = 0L;
+ // then first add the editable items to the layout
+ for (QValueList<KFileMetaInfoItem>::Iterator iit= editItems.begin();
+ iit!=editItems.end(); ++iit)
+ {
+ QLabel* l = new QLabel((*iit).translatedKey() + ":", groupBox);
+ l->setAlignment( AlignAuto | AlignTop | ExpandTabs );
+ QValidator* val = mtinfo->createValidator(*git, (*iit).key());
+ if (!val) kdDebug(7033) << "didn't get a validator for " << *git << "/" << (*iit).key() << endl;
+ w = new KFileMetaInfoWidget(*iit, val, groupBox);
+ d->m_editWidgets.append( w );
+ connect(w, SIGNAL(valueChanged(const QVariant&)), this, SIGNAL(changed()));
+ }
+
+ // and then the read only items
+ for (QValueList<KFileMetaInfoItem>::Iterator iit= readItems.begin();
+ iit!=readItems.end(); ++iit)
+ {
+ QLabel* l = new QLabel((*iit).translatedKey() + ":", groupBox);
+ l->setAlignment( AlignAuto | AlignTop | ExpandTabs );
+ (new KFileMetaInfoWidget(*iit, KFileMetaInfoWidget::ReadOnly, 0L, groupBox));
+ }
+ }
+
+ toplayout->addStretch(1);
+
+ // the add key (disabled until fully implemented)
+/* d->m_add = new QPushButton(i18n("&Add"), topframe);
+ d->m_add->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,
+ QSizePolicy::Fixed));
+ connect(d->m_add, SIGNAL(clicked()), this, SLOT(slotAdd()));
+ tmp->addWidget(d->m_add);
+
+ // if nothing can be added, deactivate it
+ if ( !d->m_info.supportsVariableKeys() )
+ {
+ // if supportedKeys() does contain anything not in preferredKeys,
+ // we have something addable
+
+ QStringList sk = d->m_info.supportedKeys();
+ d->m_add->setEnabled(false);
+ for (QStringList::Iterator it = sk.begin(); it!=sk.end(); ++it)
+ {
+ if ( l.find(*it)==l.end() )
+ {
+ d->m_add->setEnabled(true);
+ kdDebug(250) << "**first addable key is " << (*it).latin1() << "**" <<endl;
+ break;
+ }
+ kdDebug(250) << "**already existing key is " << (*it).latin1() << "**" <<endl;
+ }
+ } */
+}
+
+/*void KFileMetaPropsPlugin::slotAdd()
+{
+ // add a lineedit for the name
+
+
+
+ // insert the item in the list
+
+}*/
+
+KFileMetaPropsPlugin::~KFileMetaPropsPlugin()
+{
+ delete d;
+}
+
+bool KFileMetaPropsPlugin::supports( KFileItemList _items )
+{
+#ifdef _GNUC
+#warning TODO: Add support for more than one item
+#endif
+ if (KExecPropsPlugin::supports(_items) || KURLPropsPlugin::supports(_items))
+ return false; // Having both is redundant.
+
+ bool metaDataEnabled = KGlobalSettings::showFilePreview(_items.first()->url());
+ return _items.count() == 1 && metaDataEnabled;
+}
+
+void KFileMetaPropsPlugin::applyChanges()
+{
+ kdDebug(250) << "applying changes" << endl;
+ // insert the fields that changed into the info object
+
+ QPtrListIterator<KFileMetaInfoWidget> it( d->m_editWidgets );
+ KFileMetaInfoWidget* w;
+ for (; (w = it.current()); ++it) w->apply();
+ d->m_info.applyChanges(properties->kurl().path());
+}
+
+#include "kmetaprops.moc"