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.
445 lines
12 KiB
445 lines
12 KiB
/* This file is part of the KDE project
|
|
Copyright (c) 2004 Kevin Ottens <ervin ipsquad net>
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
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.
|
|
*/
|
|
|
|
#include <kglobal.h>
|
|
#include <klocale.h>
|
|
#include <kconfig.h>
|
|
#include <kapplication.h>
|
|
#include <kaboutdata.h>
|
|
#include <kaboutapplication.h>
|
|
#include <kdebug.h>
|
|
#include <kpopupmenu.h>
|
|
#include <kiconloader.h>
|
|
|
|
#include "mediaapplet.h"
|
|
|
|
#include "preferencesdialog.h"
|
|
|
|
extern "C"
|
|
{
|
|
KDE_EXPORT KPanelApplet* init( TQWidget *parent, const TQString configFile)
|
|
{
|
|
TDEGlobal::locale()->insertCatalogue("mediaapplet");
|
|
return new MediaApplet(configFile, KPanelApplet::Normal,
|
|
KPanelApplet::About | KPanelApplet::Preferences,
|
|
parent, "mediaapplet");
|
|
}
|
|
}
|
|
|
|
MediaApplet::MediaApplet(const TQString& configFile, Type type, int actions, TQWidget *parent, const char *name)
|
|
: KPanelApplet(configFile, type, actions, parent, name),
|
|
mButtonSizeSum(0)
|
|
{
|
|
if (!parent)
|
|
setBackgroundMode(X11ParentRelative);
|
|
|
|
setBackgroundOrigin(AncestorOrigin);
|
|
|
|
setAcceptDrops(true);
|
|
|
|
loadConfig();
|
|
|
|
mpDirLister = new KDirLister();
|
|
|
|
connect( mpDirLister, TQT_SIGNAL( clear() ),
|
|
this, TQT_SLOT( slotClear() ) );
|
|
connect( mpDirLister, TQT_SIGNAL( started(const KURL&) ),
|
|
this, TQT_SLOT( slotStarted(const KURL&) ) );
|
|
connect( mpDirLister, TQT_SIGNAL( completed() ),
|
|
this, TQT_SLOT( slotCompleted() ) );
|
|
connect( mpDirLister, TQT_SIGNAL( newItems( const KFileItemList & ) ),
|
|
this, TQT_SLOT( slotNewItems( const KFileItemList & ) ) );
|
|
connect( mpDirLister, TQT_SIGNAL( deleteItem( KFileItem * ) ),
|
|
this, TQT_SLOT( slotDeleteItem( KFileItem * ) ) );
|
|
connect( mpDirLister, TQT_SIGNAL( refreshItems( const KFileItemList & ) ),
|
|
this, TQT_SLOT( slotRefreshItems( const KFileItemList & ) ) );
|
|
|
|
reloadList();
|
|
}
|
|
|
|
MediaApplet::~MediaApplet()
|
|
{
|
|
delete mpDirLister;
|
|
|
|
while (!mButtonList.isEmpty())
|
|
{
|
|
MediumButton *b = mButtonList.first();
|
|
mButtonList.remove(b);
|
|
delete b;
|
|
}
|
|
|
|
TDEGlobal::locale()->removeCatalogue("mediaapplet");
|
|
}
|
|
|
|
void MediaApplet::about()
|
|
{
|
|
TDEAboutData data("mediaapplet",
|
|
I18N_NOOP("Media Applet"),
|
|
"1.0",
|
|
I18N_NOOP("\"media:/\" ioslave frontend applet"),
|
|
TDEAboutData::License_GPL_V2,
|
|
"(c) 2004, Kevin Ottens");
|
|
|
|
data.addAuthor("Kevin \'ervin\' Ottens",
|
|
I18N_NOOP("Maintainer"),
|
|
"ervin ipsquad net",
|
|
"http://ervin.ipsquad.net");
|
|
|
|
data.addCredit("Joseph Wenninger",
|
|
I18N_NOOP("Good mentor, patient and helpful. Thanks for all!"),
|
|
"jowenn@kde.org");
|
|
|
|
KAboutApplication dialog(&data);
|
|
dialog.exec();
|
|
}
|
|
|
|
void MediaApplet::preferences()
|
|
{
|
|
PreferencesDialog dialog(mMedia);
|
|
|
|
dialog.setExcludedMediumTypes(mExcludedTypesList);
|
|
dialog.setExcludedMedia(mExcludedList);
|
|
|
|
if(dialog.exec())
|
|
{
|
|
mExcludedTypesList = dialog.excludedMediumTypes();
|
|
mExcludedList = dialog.excludedMedia();
|
|
saveConfig();
|
|
reloadList();
|
|
}
|
|
}
|
|
|
|
int MediaApplet::widthForHeight( int /*height*/ ) const
|
|
{
|
|
return mButtonSizeSum;
|
|
}
|
|
|
|
int MediaApplet::heightForWidth( int /*width*/ ) const
|
|
{
|
|
return mButtonSizeSum;
|
|
}
|
|
|
|
void MediaApplet::resizeEvent( TQResizeEvent *)
|
|
{
|
|
arrangeButtons();
|
|
}
|
|
|
|
void MediaApplet::arrangeButtons()
|
|
{
|
|
int button_size = 1;
|
|
int x_offset = 0;
|
|
int y_offset = 0;
|
|
|
|
// Determine upper bound for the button size
|
|
MediumButtonList::iterator it;
|
|
MediumButtonList::iterator end = mButtonList.end();
|
|
for ( it = mButtonList.begin(); it != end; ++it )
|
|
{
|
|
MediumButton *button = *it;
|
|
|
|
button_size = std::max(button_size,
|
|
orientation() == Qt::Vertical ?
|
|
button->heightForWidth(width()) :
|
|
button->widthForHeight(height()) );
|
|
// button->widthForHeight(height()) :
|
|
// button->heightForWidth(width()) );
|
|
}
|
|
|
|
int kicker_size;
|
|
if (orientation() == Qt::Vertical)
|
|
{
|
|
kicker_size = width();
|
|
}
|
|
else
|
|
{
|
|
kicker_size = height();
|
|
}
|
|
|
|
unsigned int max_packed_buttons = kicker_size / button_size;
|
|
// Center icons if we only have one column/row
|
|
if (mButtonList.count() < max_packed_buttons)
|
|
{
|
|
max_packed_buttons = TQMAX(uint(1), mButtonList.count());
|
|
}
|
|
max_packed_buttons = TQMAX(uint(1), max_packed_buttons);
|
|
|
|
int padded_button_size = kicker_size / max_packed_buttons;
|
|
mButtonSizeSum = 0;
|
|
unsigned int pack_count = 0;
|
|
|
|
// Arrange the buttons. If kicker is more than twice as high/wide
|
|
// as the maximum preferred size of an icon, we put several icons
|
|
// in one column/row
|
|
for ( it = mButtonList.begin(); it != end; ++it )
|
|
{
|
|
MediumButton *button = *it;
|
|
|
|
button->move(x_offset, y_offset);
|
|
button->setPanelPosition(position());
|
|
|
|
if(pack_count == 0)
|
|
{
|
|
mButtonSizeSum += button_size;
|
|
}
|
|
|
|
++pack_count;
|
|
|
|
if(orientation() == Qt::Vertical)
|
|
{
|
|
if (pack_count < max_packed_buttons)
|
|
{
|
|
x_offset += padded_button_size;
|
|
}
|
|
else
|
|
{
|
|
x_offset = 0;
|
|
y_offset += button_size;
|
|
pack_count = 0;
|
|
}
|
|
|
|
button->resize(padded_button_size, button_size);
|
|
}
|
|
else
|
|
{
|
|
if (pack_count < max_packed_buttons)
|
|
{
|
|
y_offset += padded_button_size;
|
|
}
|
|
else
|
|
{
|
|
y_offset = 0;
|
|
x_offset += button_size;
|
|
pack_count = 0;
|
|
}
|
|
|
|
button->resize(button_size, padded_button_size);
|
|
}
|
|
|
|
button->unsetPalette();
|
|
button->setBackgroundOrigin(AncestorOrigin);
|
|
}
|
|
|
|
updateGeometry();
|
|
emit updateLayout();
|
|
}
|
|
|
|
void MediaApplet::slotClear()
|
|
{
|
|
kdDebug()<<"MediaApplet::slotClear"<<endl;
|
|
|
|
while (!mButtonList.isEmpty())
|
|
{
|
|
MediumButton *b = mButtonList.first();
|
|
mButtonList.remove(b);
|
|
delete b;
|
|
}
|
|
|
|
arrangeButtons();
|
|
}
|
|
|
|
void MediaApplet::slotStarted(const KURL &/*url*/)
|
|
{
|
|
}
|
|
|
|
void MediaApplet::slotCompleted()
|
|
{
|
|
mMedia = mpDirLister->items(KDirLister::AllItems);
|
|
}
|
|
|
|
void MediaApplet::slotNewItems(const KFileItemList &entries)
|
|
{
|
|
kdDebug()<<"MediaApplet::slotNewItems"<<endl;
|
|
|
|
for(KFileItemListIterator it(entries); it.current(); ++it)
|
|
{
|
|
kdDebug() << "item: " << it.current()->url() << endl;
|
|
|
|
bool found = false;
|
|
MediumButtonList::iterator it2;
|
|
MediumButtonList::iterator end = mButtonList.end();
|
|
for ( it2 = mButtonList.begin(); it2 != end; ++it2 )
|
|
{
|
|
MediumButton *button = *it2;
|
|
|
|
if(button->fileItem().url()==it.current()->url())
|
|
{
|
|
found = true;
|
|
button->setFileItem(*it.current());
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!found && !mExcludedList.contains(it.current()->url().url()) )
|
|
{
|
|
MediumButton *button = new MediumButton(this, *it.current());
|
|
button->show();
|
|
mButtonList.append(button);
|
|
}
|
|
}
|
|
|
|
arrangeButtons();
|
|
}
|
|
|
|
void MediaApplet::slotDeleteItem(KFileItem *fileItem)
|
|
{
|
|
kdDebug()<<"MediumApplet::slotDeleteItem:"<< fileItem->url() << endl;
|
|
|
|
MediumButtonList::iterator it;
|
|
MediumButtonList::iterator end = mButtonList.end();
|
|
for ( it = mButtonList.begin(); it != end; ++it )
|
|
{
|
|
MediumButton *button = *it;
|
|
|
|
if(button->fileItem().url()==fileItem->url())
|
|
{
|
|
mButtonList.remove(button);
|
|
delete button;
|
|
break;
|
|
}
|
|
}
|
|
slotCompleted();
|
|
arrangeButtons();
|
|
}
|
|
|
|
void MediaApplet::slotRefreshItems(const KFileItemList &entries)
|
|
{
|
|
for(KFileItemListIterator it(entries); it.current(); ++it)
|
|
{
|
|
kdDebug()<<"MediaApplet::slotRefreshItems:"<<(*it.current()).url().url()<<endl;
|
|
|
|
TQString mimetype = (*it.current()).mimetype();
|
|
bool found = false;
|
|
|
|
kdDebug()<<"mimetype="<<mimetype<<endl;
|
|
|
|
MediumButtonList::iterator it2;
|
|
MediumButtonList::iterator end = mButtonList.end();
|
|
for ( it2 = mButtonList.begin(); it2 != end; ++it2 )
|
|
{
|
|
MediumButton *button = *it2;
|
|
|
|
if(button->fileItem().url()==(*it.current()).url())
|
|
{
|
|
if(mExcludedTypesList.contains(mimetype))
|
|
{
|
|
mButtonList.remove(button);
|
|
delete button;
|
|
}
|
|
else
|
|
{
|
|
button->setFileItem(*it.current());
|
|
}
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!found && !mExcludedTypesList.contains(mimetype) && !mExcludedList.contains(it.current()->url().url()) )
|
|
{
|
|
MediumButton *button = new MediumButton(this, *it.current());
|
|
button->show();
|
|
mButtonList.append(button);
|
|
}
|
|
}
|
|
|
|
arrangeButtons();
|
|
}
|
|
|
|
void MediaApplet::positionChange(Position)
|
|
{
|
|
arrangeButtons();
|
|
}
|
|
|
|
void MediaApplet::loadConfig()
|
|
{
|
|
KConfig *c = config();
|
|
c->setGroup("General");
|
|
|
|
if(c->hasKey("ExcludedTypes"))
|
|
{
|
|
mExcludedTypesList = c->readListEntry("ExcludedTypes",';');
|
|
}
|
|
else
|
|
{
|
|
mExcludedTypesList.clear();
|
|
mExcludedTypesList << "media/hdd_mounted";
|
|
mExcludedTypesList << "media/hdd_unmounted";
|
|
mExcludedTypesList << "media/nfs_mounted";
|
|
mExcludedTypesList << "media/nfs_unmounted";
|
|
mExcludedTypesList << "media/smb_mounted";
|
|
mExcludedTypesList << "media/smb_unmounted";
|
|
}
|
|
|
|
if(c->hasKey("ExcludedMedia"))
|
|
{
|
|
mExcludedList = c->readListEntry("ExcludedMedia",';');
|
|
}
|
|
else
|
|
{
|
|
mExcludedList.clear();
|
|
}
|
|
}
|
|
|
|
void MediaApplet::saveConfig()
|
|
{
|
|
KConfig *c = config();
|
|
c->setGroup("General");
|
|
|
|
c->writeEntry("ExcludedTypes", mExcludedTypesList, ';');
|
|
c->writeEntry("ExcludedMedia", mExcludedList, ';');
|
|
|
|
c->sync();
|
|
}
|
|
|
|
void MediaApplet::reloadList()
|
|
{
|
|
mpDirLister->stop();
|
|
|
|
while (!mButtonList.isEmpty())
|
|
{
|
|
MediumButton *b = mButtonList.first();
|
|
mButtonList.remove(b);
|
|
delete b;
|
|
}
|
|
|
|
mpDirLister->clearMimeFilter();
|
|
mpDirLister->setMimeExcludeFilter(mExcludedTypesList);
|
|
mpDirLister->openURL(KURL("media:/"));
|
|
}
|
|
|
|
void MediaApplet::mousePressEvent(TQMouseEvent *e)
|
|
{
|
|
if(e->button()==Qt::RightButton)
|
|
{
|
|
KPopupMenu menu(this);
|
|
|
|
menu.insertTitle(i18n("Media"));
|
|
menu.insertItem(SmallIcon("configure"), i18n("&Configure..."), 1);
|
|
|
|
int choice = menu.exec(this->mapToGlobal(e->pos()));
|
|
|
|
if(choice==1)
|
|
{
|
|
preferences();
|
|
}
|
|
}
|
|
}
|
|
|
|
#include "mediaapplet.moc"
|