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.9 KiB
232 lines
4.9 KiB
// 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(TQWidget *parent, Oblique *oblique, File file)
|
|
: KPopupMenu(parent)
|
|
{
|
|
if (file)
|
|
mFiles.append(file);
|
|
insertItem(
|
|
BarIconSet("delete"), i18n("&Remove From Playlist"),
|
|
this, TQT_SLOT(removeFromList())
|
|
);
|
|
insertItem(i18n("&Properties"), this, TQT_SLOT(properties()));
|
|
|
|
(new SliceListAction(
|
|
i18n("&Slices"), oblique,
|
|
TQT_TQOBJECT(this), TQT_SLOT(toggleInSlice(Slice *)),
|
|
mFiles, TQT_TQOBJECT(this)
|
|
))->plug(this);
|
|
}
|
|
|
|
static void addTo(TQValueList<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(TQWidget *parent, Oblique *oblique, TreeItem *items)
|
|
: KPopupMenu(parent)
|
|
{
|
|
addTo(mFiles, items);
|
|
|
|
insertItem(
|
|
BarIconSet("delete"), i18n("&Remove From Playlist"),
|
|
this, TQT_SLOT(removeFromList())
|
|
);
|
|
insertItem(i18n("&Properties"), this, TQT_SLOT(properties()));
|
|
|
|
(new SliceListAction(
|
|
i18n("&Slices"), oblique,
|
|
TQT_TQOBJECT(this), TQT_SLOT(toggleInSlice(Slice *)),
|
|
mFiles,TQT_TQOBJECT(this)
|
|
))->plug(this);
|
|
}
|
|
|
|
void FileMenu::removeFromList()
|
|
{
|
|
for (TQValueList<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 (TQValueList<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 TQString &text, Oblique *oblique,
|
|
TQObject *reciever, const char *slot,
|
|
const TQValueList<File> &files, TQObject *parent, const char *name
|
|
) : KActionMenu(text, parent, name)
|
|
{
|
|
mFiles = files;
|
|
mOblique = oblique;
|
|
slicesModified();
|
|
if (reciever)
|
|
connect(this, TQT_SIGNAL(activated(Slice*)), reciever, slot);
|
|
connect(popupMenu(), TQT_SIGNAL(activated(int)), TQT_SLOT(hit(int)));
|
|
connect(oblique->base(), TQT_SIGNAL(slicesModified()), TQT_SLOT(slicesModified()));
|
|
}
|
|
|
|
void SliceListAction::slicesModified()
|
|
{
|
|
mIndexToSlices.clear();
|
|
KPopupMenu *menu = popupMenu();
|
|
menu->clear();
|
|
|
|
TQPtrList<Slice> slices = mOblique->base()->slices();
|
|
int id=1;
|
|
|
|
|
|
|
|
for (TQPtrListIterator<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 TQString &text,
|
|
TQObject *reciever, const char *slot,
|
|
TQObject *parent, const char *name
|
|
) : KActionMenu(text, parent, name)
|
|
{
|
|
mTree = 0;
|
|
if (reciever)
|
|
connect(this, TQT_SIGNAL(activated(const TQString&)), reciever, slot);
|
|
connect(popupMenu(), TQT_SIGNAL(aboutToShow()), TQT_SLOT(prepare()));
|
|
connect(popupMenu(), TQT_SIGNAL(activated(int)), TQT_SLOT(hit(int)));
|
|
}
|
|
|
|
void SchemaListAction::prepare()
|
|
{
|
|
assert(mTree);
|
|
mIndexToSchemas.clear();
|
|
KPopupMenu *menu = popupMenu();
|
|
menu->clear();
|
|
|
|
if (!mTree) return;
|
|
|
|
int id=1;
|
|
|
|
TQStringList names = mTree->oblique()->schemaNames();
|
|
|
|
for (TQStringList::Iterator i(names.begin()); i != names.end(); ++i)
|
|
{
|
|
Query q;
|
|
TQString 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 TQValueList<File> &files, TQWidget *parent)
|
|
: KPropertiesDialog(makeItems(files), parent), mFiles(files)
|
|
{
|
|
connect(this, TQT_SIGNAL(propertiesClosed()), TQT_SLOT(deleteLater()));
|
|
connect(this, TQT_SIGNAL(applied()), TQT_SLOT(modified()));
|
|
|
|
show();
|
|
}
|
|
|
|
void ObliquePropertiesDialog::modified()
|
|
{
|
|
// TODO reload the file's info
|
|
for (TQValueList<File>::Iterator i(mFiles.begin()); i != mFiles.end(); ++i)
|
|
{
|
|
(*i).makeCache();
|
|
(*i).base()->notifyChanged(*i);
|
|
}
|
|
}
|
|
|
|
KFileItemList ObliquePropertiesDialog::makeItems(const TQValueList<File> &files)
|
|
{
|
|
KFileItemList kl;
|
|
for (TQValueList<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"
|
|
|