summaryrefslogtreecommitdiffstats
path: root/tdeio/tdefile/kmetaprops.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdeio/tdefile/kmetaprops.cpp')
-rw-r--r--tdeio/tdefile/kmetaprops.cpp268
1 files changed, 268 insertions, 0 deletions
diff --git a/tdeio/tdefile/kmetaprops.cpp b/tdeio/tdefile/kmetaprops.cpp
new file mode 100644
index 000000000..ce6201177
--- /dev/null
+++ b/tdeio/tdefile/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 <tdefilemetainfowidget.h>
+#include <tdefilemetainfo.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kprotocolinfo.h>
+
+#include <tqvalidator.h>
+#include <tqlayout.h>
+#include <tqlabel.h>
+#include <tqfileinfo.h>
+#include <tqdatetime.h>
+#include <tqstylesheet.h>
+#include <tqvgroupbox.h>
+
+#undef Bool
+
+class MetaPropsScrollView : public TQScrollView
+{
+public:
+ MetaPropsScrollView(TQWidget* parent = 0, const char* name = 0)
+ : TQScrollView(parent, name)
+ {
+ setFrameStyle(TQFrame::NoFrame);
+ m_frame = new TQFrame(viewport(), "MetaPropsScrollView::m_frame");
+ m_frame->setFrameStyle(TQFrame::NoFrame);
+ addChild(m_frame, 0, 0);
+ };
+
+ TQFrame* frame() {return m_frame;};
+
+protected:
+ virtual void viewportResizeEvent(TQResizeEvent* ev)
+ {
+ TQScrollView::viewportResizeEvent(ev);
+ m_frame->resize( kMax(m_frame->sizeHint().width(), ev->size().width()),
+ kMax(m_frame->sizeHint().height(), ev->size().height()));
+ };
+
+private:
+ TQFrame* m_frame;
+};
+
+class KFileMetaPropsPlugin::KFileMetaPropsPluginPrivate
+{
+public:
+ KFileMetaPropsPluginPrivate() {}
+ ~KFileMetaPropsPluginPrivate() {}
+
+ TQFrame* m_frame;
+ TQGridLayout* m_framelayout;
+ KFileMetaInfo m_info;
+// TQPushButton* m_add;
+ TQPtrList<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()
+{
+ TQFileInfo 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();
+ TQStringList 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
+ TQFrame* topframe = properties->addPage(i18n("&Meta Info"));
+ topframe->setFrameStyle(TQFrame::NoFrame);
+ TQVBoxLayout* tmp = new TQVBoxLayout(topframe);
+
+ // create a scroll view in the page
+ MetaPropsScrollView* view = new MetaPropsScrollView(topframe);
+
+ tmp->addWidget(view);
+
+ d->m_frame = view->frame();
+
+ TQVBoxLayout *toplayout = new TQVBoxLayout(d->m_frame);
+ toplayout->setSpacing(KDialog::spacingHint());
+
+ for (TQStringList::Iterator git=groupList.begin();
+ git!=groupList.end(); ++git)
+ {
+ kdDebug(7033) << *git << endl;
+
+ TQStringList itemList = d->m_info.group(*git).preferredKeys();
+ if (itemList.isEmpty())
+ continue;
+
+ TQGroupBox *groupBox = new TQGroupBox(2, Qt::Horizontal,
+ TQStyleSheet::escape(mtinfo->groupInfo(*git)->translatedName()),
+ d->m_frame);
+
+ toplayout->addWidget(groupBox);
+
+ TQValueList<KFileMetaInfoItem> readItems;
+ TQValueList<KFileMetaInfoItem> editItems;
+
+ for (TQStringList::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 (TQValueList<KFileMetaInfoItem>::Iterator iit= editItems.begin();
+ iit!=editItems.end(); ++iit)
+ {
+ TQLabel* l = new TQLabel((*iit).translatedKey() + ":", groupBox);
+ l->setAlignment( AlignAuto | AlignTop | ExpandTabs );
+ TQValidator* 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, TQT_SIGNAL(valueChanged(const TQVariant&)), this, TQT_SIGNAL(changed()));
+ }
+
+ // and then the read only items
+ for (TQValueList<KFileMetaInfoItem>::Iterator iit= readItems.begin();
+ iit!=readItems.end(); ++iit)
+ {
+ TQLabel* l = new TQLabel((*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 TQPushButton(i18n("&Add"), topframe);
+ d->m_add->setSizePolicy(TQSizePolicy(TQSizePolicy::Fixed,
+ TQSizePolicy::Fixed));
+ connect(d->m_add, TQT_SIGNAL(clicked()), this, TQT_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
+
+ TQStringList sk = d->m_info.supportedKeys();
+ d->m_add->setEnabled(false);
+ for (TQStringList::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 = TDEGlobalSettings::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
+
+ TQPtrListIterator<KFileMetaInfoWidget> it( d->m_editWidgets );
+ KFileMetaInfoWidget* w;
+ for (; (w = it.current()); ++it) w->apply();
+ d->m_info.applyChanges(properties->kurl().path());
+}
+
+#include "kmetaprops.moc"