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.
ksquirrel/ksquirrel/sidebar/sq_imagebasket.cpp

292 lines
9.3 KiB

/***************************************************************************
sq_imagebasket.cpp - description
-------------------
begin : ??? Feb 24 2007
copyright : (C) 2004 by Baryshev Dmitry
email : ksquirrel.iv@gmail.com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <tqfile.h>
#include <kmdcodec.h>
#include <kfileview.h>
#include <klocale.h>
#include <kglobal.h>
#include <kpopupmenu.h>
#include <kfileiconview.h>
#include <kpropertiesdialog.h>
#include <kio/netaccess.h>
#include <kapplication.h>
#include <kmimetype.h>
#include "ksquirrel.h"
#include "sq_config.h"
#include "sq_imagebasket.h"
#include "sq_storagefile.h"
#include "sq_dir.h"
#include "sq_widgetstack.h"
#include "sq_diroperator.h"
SQ_ImageBasket * SQ_ImageBasket::m_inst;
SQ_ImageBasket::SQ_ImageBasket(TQWidget *parent, const char *name) : KDirOperator((dir = new SQ_Dir(SQ_Dir::Basket))->root(), parent, name)
{
m_inst = this;
connect(this, TQT_SIGNAL(dropped(const KFileItem *, TQDropEvent*, const KURL::List&)),
this, TQT_SLOT(slotDropped(const KFileItem *, TQDropEvent*, const KURL::List&)));
disconnect(dirLister(), TQT_SIGNAL(refreshItems(const KFileItemList &)), 0, 0);
// redirect "Properties" dialog
disconnect(actionCollection()->action("properties"), 0, 0, 0);
connect(actionCollection()->action("properties"), TQT_SIGNAL(activated()), this, TQT_SLOT(slotBasketProperties()));
disconnect(dirLister(), TQT_SIGNAL(newItems(const KFileItemList &)), 0, 0);
connect(dirLister(), TQT_SIGNAL(newItems(const KFileItemList &)), this, TQT_SLOT(insertNewFiles(const KFileItemList &)));
connect(this, TQT_SIGNAL(viewChanged(KFileView *)), this, TQT_SLOT(slotViewChanged(KFileView *)));
connect(this, TQT_SIGNAL(fileSelected(const KFileItem *)), this, TQT_SLOT(slotExecuted(const KFileItem *)));
setView(KFile::Simple);
setMode(KFile::Files);
setAcceptDrops(true);
SQ_Config::instance()->setGroup("Fileview");
int sorting = 0;
if(SQ_Config::instance()->readBoolEntry("basket_sorting_name", true)) sorting |= TQDir::Name;
if(SQ_Config::instance()->readBoolEntry("basket_sorting_time", false)) sorting |= TQDir::Time;
if(SQ_Config::instance()->readBoolEntry("basket_sorting_size", false)) sorting |= TQDir::Size;
if(SQ_Config::instance()->readBoolEntry("basket_sorting_dirs", true)) sorting |= TQDir::DirsFirst;
if(SQ_Config::instance()->readBoolEntry("basket_sorting_reverse", false)) sorting |= TQDir::Reversed;
if(SQ_Config::instance()->readBoolEntry("basket_sorting_ignore", false)) sorting |= TQDir::IgnoreCase;
setSorting(static_cast<TQDir::SortSpec>(sorting));
}
SQ_ImageBasket::~SQ_ImageBasket()
{
delete dir;
}
void SQ_ImageBasket::insertNewFiles(const KFileItemList &list)
{
TQString n;
int ind;
KFileItemListIterator it(list);
KFileItem *tmp;
for(; (tmp = it.current()); ++it)
{
n = tmp->name();
ind = n.findRev('.');
// OOPS
if(ind != -1)
n.truncate(ind);
// force determining mimetype
(void)tmp->mimetype();
tmp->setName(n);
TQStringList list = TQStringList::split(TQChar('\n'), SQ_StorageFile::readStorageFileAsString(tmp->url().path()), true);
TQStringList::iterator it = list.begin();
if(list.count() > 1)
{
++it; // skip url
tmp->setMimeType(*it);
}
else
{
KURL url = KURL::fromPathOrURL(*it);
TQString mime = KMimeType::findByURL(url)->name();
tmp->setMimeType(mime);
static const TQString &nl = TDEGlobal::staticQString("\n");
TQString inurl = url.prettyURL() + nl + mime;
SQ_StorageFile::writeStorageFileAsString(
dir->root() + TQDir::separator() + url.fileName(),
url, inurl);
}
}
view()->addItemList(list);
}
void SQ_ImageBasket::add(const KFileItemList &list)
{
KFileItem *tmp;
static const TQString &nl = TDEGlobal::staticQString("\n");
for(KFileItemListIterator it(list); (tmp = it.current()); ++it)
{
if(tmp->isFile())
{
TQString inurl = tmp->url().prettyURL() + nl + tmp->mimetype();
SQ_StorageFile::writeStorageFileAsString(
dir->root() + TQDir::separator() + tmp->name(),
tmp->url(), inurl);
}
}
}
void SQ_ImageBasket::slotDropped(const KFileItem *, TQDropEvent*, const KURL::List &list)
{
TQString name;
KURL::List::const_iterator itEnd = list.end();
static const TQString &nl = TDEGlobal::staticQString("\n");
for(KURL::List::const_iterator it = list.begin();it != itEnd;++it)
{
TQString inurl = (*it).prettyURL() + nl + KMimeType::findByURL(*it)->name();
SQ_StorageFile::writeStorageFileAsString(
dir->root() + TQDir::separator() + (*it).fileName(),
*it, inurl);
}
}
void SQ_ImageBasket::slotBasketProperties()
{
KFileView *fileView = view();
if(fileView)
{
KFileItemList newlist;
KFileItem *item = 0;
newlist.setAutoDelete(true);
for((item = fileView->firstFileItem()); item; item = fileView->nextItem(item))
{
if(fileView->isSelected(item))
{
KFileItem *realFile = new KFileItem(KFileItem::Unknown, KFileItem::Unknown,
SQ_StorageFile::readStorageFile(item->url().path()));
newlist.append(realFile);
}
}
if (!newlist.isEmpty())
(void)new KPropertiesDialog(newlist, KSquirrel::app(), "props dlg", true);
}
}
KFileItemList SQ_ImageBasket::realItems() const
{
KFileView *fileView = view();
KFileItemList newlist;
newlist.setAutoDelete(true);
if(fileView)
{
KFileItem *item = 0;
for((item = fileView->firstFileItem()); item; item = fileView->nextItem(item))
{
KFileItem *realFile = new KFileItem(KFileItem::Unknown, KFileItem::Unknown,
SQ_StorageFile::readStorageFile(item->url().path()));
newlist.append(realFile);
}
}
return newlist;
}
void SQ_ImageBasket::slotSync()
{
KFileView *fileView = view();
if(fileView)
{
KFileItem *item = 0;
KURL path;
TDEIO::UDSEntry entry;
for((item = fileView->firstFileItem()); item; item = fileView->nextItem(item))
{
path = SQ_StorageFile::readStorageFile(item->url().path());
if(!TDEIO::NetAccess::stat(path, entry, KSquirrel::app()))
TQFile::remove(item->url().path());
}
}
}
void SQ_ImageBasket::slotViewChanged(KFileView *v)
{
KFileIconView *iv = dynamic_cast<KFileIconView *>(v);
if(iv)
{
KAction *a;
a = iv->actionCollection()->action("zoomIn");
if(a) a->setShortcut(0);
a = iv->actionCollection()->action("zoomOut");
if(a) a->setShortcut(0);
a = iv->actionCollection()->action("show previews");
if(a) a->setShortcut(0);
}
}
void SQ_ImageBasket::slotExecuted(const KFileItem *fi)
{
if(!fi)
return;
KURL inpath = SQ_StorageFile::readStorageFile(fi->url().path());
KFileItem f(KFileItem::Unknown, KFileItem::Unknown, inpath);
SQ_WidgetStack::instance()->diroperator()->execute(&f);
}
void SQ_ImageBasket::activatedMenu(const KFileItem *, const TQPoint &pos)
{
setupMenu(KDirOperator::AllActions ^ KDirOperator::NavActions ^ KDirOperator::ViewActions);
updateSelectionDependentActions();
KActionMenu *pADirOperatorMenu = dynamic_cast<KActionMenu *>(actionCollection()->action("popupMenu"));
pADirOperatorMenu->popupMenu()->insertItem(i18n("Synchronize"), this, TQT_SLOT(slotSync()), 0, -1, 0);
pADirOperatorMenu->popupMenu()->insertSeparator(1);
pADirOperatorMenu->popup(pos);
}
void SQ_ImageBasket::saveConfig()
{
TQDir::SortSpec sort = sorting();
SQ_Config::instance()->writeEntry("basket_sorting_name", KFile::isSortByName(sort));
SQ_Config::instance()->writeEntry("basket_sorting_time", KFile::isSortByDate(sort));
SQ_Config::instance()->writeEntry("basket_sorting_size", KFile::isSortBySize(sort));
SQ_Config::instance()->writeEntry("basket_sorting_dirs", KFile::isSortDirsFirst(sort));
SQ_Config::instance()->writeEntry("basket_sorting_reverse", (sort & TQDir::Reversed) == TQDir::Reversed);
SQ_Config::instance()->writeEntry("basket_sorting_ignore", KFile::isSortCaseInsensitive(sort));
SQ_Config::instance()->writeEntry("show hidden", showHiddenFiles());
}
#include "sq_imagebasket.moc"