You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
269 lines
8.2 KiB
269 lines
8.2 KiB
/* 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 "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"
|