// Copyright (c) 2003,2004 Charles Samuels // See the file COPYING for redistribution terms. #include "menu.h" #include #include #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 &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::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::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 &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 slices = mOblique->base()->slices(); int id=1; for (TQPtrListIterator 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 &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::Iterator i(mFiles.begin()); i != mFiles.end(); ++i) { (*i).makeCache(); (*i).base()->notifyChanged(*i); } } KFileItemList ObliquePropertiesDialog::makeItems(const TQValueList &files) { KFileItemList kl; for (TQValueList::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"