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.
232 lines
4.7 KiB
232 lines
4.7 KiB
15 years ago
|
// Copyright (c) 2003,2004 Charles Samuels <charles@kde.org>
|
||
|
// See the file COPYING for redistribution terms.
|
||
|
|
||
|
#include "menu.h"
|
||
|
#include <kiconloader.h>
|
||
|
#include <klocale.h>
|
||
|
|
||
|
#include "tree.h"
|
||
|
|
||
|
FileMenu::FileMenu(QWidget *parent, Oblique *oblique, File file)
|
||
|
: KPopupMenu(parent)
|
||
|
{
|
||
|
if (file)
|
||
|
mFiles.append(file);
|
||
|
insertItem(
|
||
|
BarIconSet("delete"), i18n("&Remove From Playlist"),
|
||
|
this, SLOT(removeFromList())
|
||
|
);
|
||
|
insertItem(i18n("&Properties"), this, SLOT(properties()));
|
||
|
|
||
|
(new SliceListAction(
|
||
|
i18n("&Slices"), oblique,
|
||
|
this, SLOT(toggleInSlice(Slice *)),
|
||
|
mFiles, this
|
||
|
))->plug(this);
|
||
|
}
|
||
|
|
||
|
static void addTo(QValueList<File> &files, TreeItem *item)
|
||
|
{
|
||
|
File f = item->file();
|
||
|
if (f) files.append(f);
|
||
|
|
||
|
item = item->firstChild();
|
||
|
|
||
|
while (item)
|
||
|
{
|
||
|
addTo(files, item);
|
||
|
item = item->nextSibling();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
FileMenu::FileMenu(QWidget *parent, Oblique *oblique, TreeItem *items)
|
||
|
: KPopupMenu(parent)
|
||
|
{
|
||
|
addTo(mFiles, items);
|
||
|
|
||
|
insertItem(
|
||
|
BarIconSet("delete"), i18n("&Remove From Playlist"),
|
||
|
this, SLOT(removeFromList())
|
||
|
);
|
||
|
insertItem(i18n("&Properties"), this, SLOT(properties()));
|
||
|
|
||
|
(new SliceListAction(
|
||
|
i18n("&Slices"), oblique,
|
||
|
this, SLOT(toggleInSlice(Slice *)),
|
||
|
mFiles, this
|
||
|
))->plug(this);
|
||
|
}
|
||
|
|
||
|
void FileMenu::removeFromList()
|
||
|
{
|
||
|
for (QValueList<File>::Iterator i(mFiles.begin()); i != mFiles.end(); ++i)
|
||
|
{
|
||
|
(*i).remove();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void FileMenu::properties()
|
||
|
{
|
||
|
new ObliquePropertiesDialog(mFiles, parentWidget());
|
||
|
}
|
||
|
|
||
|
void FileMenu::toggleInSlice(Slice *slice)
|
||
|
{
|
||
|
void (File::*task)(Slice*)=0;
|
||
|
for (QValueList<File>::Iterator i(mFiles.begin()); i != mFiles.end(); ++i)
|
||
|
{
|
||
|
if (!task)
|
||
|
{ // we check with the first one
|
||
|
if ((*i).isIn(slice))
|
||
|
task = &File::removeFrom;
|
||
|
else
|
||
|
task = &File::addTo;
|
||
|
}
|
||
|
|
||
|
((*i).*task)(slice);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
SliceListAction::SliceListAction(
|
||
|
const QString &text, Oblique *oblique,
|
||
|
QObject *reciever, const char *slot,
|
||
|
const QValueList<File> &files, QObject *parent, const char *name
|
||
|
) : KActionMenu(text, parent, name)
|
||
|
{
|
||
|
mFiles = files;
|
||
|
mOblique = oblique;
|
||
|
slicesModified();
|
||
|
if (reciever)
|
||
|
connect(this, SIGNAL(activated(Slice*)), reciever, slot);
|
||
|
connect(popupMenu(), SIGNAL(activated(int)), SLOT(hit(int)));
|
||
|
connect(oblique->base(), SIGNAL(slicesModified()), SLOT(slicesModified()));
|
||
|
}
|
||
|
|
||
|
void SliceListAction::slicesModified()
|
||
|
{
|
||
|
mIndexToSlices.clear();
|
||
|
KPopupMenu *menu = popupMenu();
|
||
|
menu->clear();
|
||
|
|
||
|
QPtrList<Slice> slices = mOblique->base()->slices();
|
||
|
int id=1;
|
||
|
|
||
|
|
||
|
|
||
|
for (QPtrListIterator<Slice> i(slices); *i; ++i)
|
||
|
{
|
||
|
Slice *s = *i;
|
||
|
if (s->id()==0 && mFiles.count())
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
menu->insertItem(s->name(), id);
|
||
|
if (mFiles.count())
|
||
|
{
|
||
|
menu->setItemChecked(id, mFiles.first().isIn(s));
|
||
|
}
|
||
|
// else if (mOblique->slice() == s) // TODO: show the selected one
|
||
|
// {
|
||
|
// menu->setItemChecked(id, true);
|
||
|
// }
|
||
|
|
||
|
if (mFiles.count() && s->id() == 0)
|
||
|
{
|
||
|
menu->setItemEnabled(id, false);
|
||
|
}
|
||
|
|
||
|
mIndexToSlices.insert(id, s);
|
||
|
id++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SliceListAction::hit(int index)
|
||
|
{
|
||
|
emit activated(mIndexToSlices[index]);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
SchemaListAction::SchemaListAction(
|
||
|
const QString &text,
|
||
|
QObject *reciever, const char *slot,
|
||
|
QObject *parent, const char *name
|
||
|
) : KActionMenu(text, parent, name)
|
||
|
{
|
||
|
mTree = 0;
|
||
|
if (reciever)
|
||
|
connect(this, SIGNAL(activated(const QString&)), reciever, slot);
|
||
|
connect(popupMenu(), SIGNAL(aboutToShow()), SLOT(prepare()));
|
||
|
connect(popupMenu(), SIGNAL(activated(int)), SLOT(hit(int)));
|
||
|
}
|
||
|
|
||
|
void SchemaListAction::prepare()
|
||
|
{
|
||
|
assert(mTree);
|
||
|
mIndexToSchemas.clear();
|
||
|
KPopupMenu *menu = popupMenu();
|
||
|
menu->clear();
|
||
|
|
||
|
if (!mTree) return;
|
||
|
|
||
|
int id=1;
|
||
|
|
||
|
QStringList names = mTree->oblique()->schemaNames();
|
||
|
|
||
|
for (QStringList::Iterator i(names.begin()); i != names.end(); ++i)
|
||
|
{
|
||
|
Query q;
|
||
|
QString title = mTree->oblique()->loadSchema(q, *i);
|
||
|
|
||
|
menu->insertItem(title, id);
|
||
|
|
||
|
menu->setItemChecked(id, mTree->fileOfQuery() == *i);
|
||
|
|
||
|
mIndexToSchemas.insert(id, *i);
|
||
|
id++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SchemaListAction::hit(int index)
|
||
|
{
|
||
|
emit activated(mIndexToSchemas[index]);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
ObliquePropertiesDialog::ObliquePropertiesDialog(const QValueList<File> &files, QWidget *parent)
|
||
|
: KPropertiesDialog(makeItems(files), parent), mFiles(files)
|
||
|
{
|
||
|
connect(this, SIGNAL(propertiesClosed()), SLOT(deleteLater()));
|
||
|
connect(this, SIGNAL(applied()), SLOT(modified()));
|
||
|
|
||
|
show();
|
||
|
}
|
||
|
|
||
|
void ObliquePropertiesDialog::modified()
|
||
|
{
|
||
|
// TODO reload the file's info
|
||
|
for (QValueList<File>::Iterator i(mFiles.begin()); i != mFiles.end(); ++i)
|
||
|
{
|
||
|
(*i).makeCache();
|
||
|
(*i).base()->notifyChanged(*i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
KFileItemList ObliquePropertiesDialog::makeItems(const QValueList<File> &files)
|
||
|
{
|
||
|
KFileItemList kl;
|
||
|
for (QValueList<File>::ConstIterator i(files.begin()); i != files.end(); ++i)
|
||
|
{
|
||
|
File f = *i;
|
||
|
kl.append(new KFileItem(f.url(), f.property("mimetype"), KFileItem::Unknown));
|
||
|
}
|
||
|
return kl;
|
||
|
}
|
||
|
|
||
|
#include "menu.moc"
|
||
|
|