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.
200 lines
6.8 KiB
200 lines
6.8 KiB
|
|
#include <stdlib.h>
|
|
#include <tqcursor.h>
|
|
#include <tqsplitter.h>
|
|
#include <tdelocale.h>
|
|
#include <tqdir.h>
|
|
#include <tdeconfig.h>
|
|
#include <tqtimer.h>
|
|
#include "dndlistbox.h"
|
|
#include "listboxlink.h"
|
|
#include "linkview.h"
|
|
#include "linkview.moc"
|
|
|
|
// internal class to eat invalid leave envents (i.e. leave that does not leave the rect but just enters the splitter, as styles (like baghira ;) may post install eventfilters that'd cause useless repaints and therefore flicker if the scroller appereance changes ;)
|
|
class EventKiller : public TQObject
|
|
{
|
|
protected:
|
|
virtual bool eventFilter( TQObject *o, TQEvent *e)
|
|
{
|
|
if (e->type() == TQEvent::Leave)
|
|
return ((TQScrollView*)o)->rect().contains(((TQScrollView*)o)->mapFromGlobal (TQCursor::pos()));
|
|
return false;
|
|
}
|
|
};
|
|
|
|
LinkView::LinkView(TQWidget * parent, const char * name, WFlags f):
|
|
TQScrollView(parent, name, f)
|
|
{
|
|
setFrameShape( TQFrame::StyledPanel );
|
|
setFrameShadow( TQFrame::Sunken );
|
|
setBackgroundMode(TQt::PaletteBase);
|
|
_blocked = FALSE;
|
|
splitter = new TQSplitter( TQt::Vertical, viewport() );
|
|
addChild(splitter);
|
|
splitter->setMargin(5);
|
|
splitter->setBackgroundMode(TQt::PaletteBase);
|
|
splitter->setSizePolicy(TQSizePolicy::Expanding,TQSizePolicy::Minimum);
|
|
splitter->setFrameShape( TQFrame::NoFrame );
|
|
splitter->setChildrenCollapsible(TRUE);
|
|
splitter->setHandleWidth( 3 );
|
|
splitter->setOpaqueResize();
|
|
hardware = new MediaListBox(splitter, "hardware");
|
|
splitter->setResizeMode( hardware, TQSplitter::KeepSize );
|
|
hardware->setFrameShape( TQFrame::NoFrame );
|
|
hardware->setHScrollBarMode(TQScrollView::AlwaysOff);
|
|
hardware->setVScrollBarMode(TQScrollView::AlwaysOff);
|
|
locations = new DnDListBox(splitter, "locations");
|
|
// splitter->setResizeMode( locations, TQSplitter::KeepSize );
|
|
locations->setFrameShape( TQFrame::NoFrame );
|
|
locations->setHScrollBarMode(TQScrollView::AlwaysOff);
|
|
locations->setVScrollBarMode(TQScrollView::AlwaysOff);
|
|
// custom area, locations
|
|
loadLinks();
|
|
locations->setCurrentItem(0);
|
|
locations->setSelected( locations->selectedItem(), false );
|
|
hardware->installEventFilter(this);
|
|
connect (hardware, SIGNAL(highlighted( int )), this, SLOT(unselectLocations()));
|
|
connect (locations, SIGNAL(highlighted( int )), this, SLOT(unselectHardware()));
|
|
connect (hardware, SIGNAL(scrolled(int,int)), this, SLOT(scrollBy(int,int)));
|
|
connect (locations, SIGNAL(scrolled(int,int)), this, SLOT(scrollBy(int,int)));
|
|
connect (hardware, SIGNAL(itemNumberChanged(bool)), this, SLOT(adjustSplitter2Hardware(bool)));
|
|
connect (locations, SIGNAL(itemNumberChanged(bool)), this, SLOT(adjustSplitter2Locations()));
|
|
TQTimer::singleShot(50, this, SLOT(adjustSplitter2Locations()));
|
|
TQTimer::singleShot(60, this, SLOT(postInstallEventFilter()));
|
|
}
|
|
|
|
static EventKiller *eventKiller = 0L;
|
|
|
|
LinkView::~LinkView()
|
|
{
|
|
|
|
saveLinks();
|
|
delete eventKiller; eventKiller = 0L;
|
|
}
|
|
|
|
void LinkView::postInstallEventFilter()
|
|
{
|
|
eventKiller = new EventKiller;
|
|
installEventFilter(eventKiller);
|
|
}
|
|
|
|
bool LinkView::eventFilter(TQObject *o, TQEvent *e)
|
|
{
|
|
if (o != hardware)
|
|
return TQScrollView::eventFilter(o, e);
|
|
if (_blocked || e->type() != TQEvent::Resize)
|
|
return FALSE; // not a resize - non of our business
|
|
TQResizeEvent *rev = (TQResizeEvent*)e;
|
|
if (rev->size().height() == rev->oldSize().height())
|
|
return FALSE; // height didn't change
|
|
int tmpH = rev->size().height() + locations->numRows()*locations->itemHeight()+20;
|
|
if (tmpH < viewport()->height())
|
|
tmpH = viewport()->height();
|
|
if (tmpH != splitter->height())
|
|
{
|
|
_blocked = TRUE;
|
|
splitter->resize ( splitter->width(), tmpH );
|
|
_blocked = FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void LinkView::adjustSplitter2Locations()
|
|
{
|
|
int tmpH = hardware->height() + locations->numRows()*locations->itemHeight()+20;
|
|
if (tmpH < viewport()->height())
|
|
tmpH = viewport()->height();
|
|
if (tmpH != splitter->height())
|
|
splitter->resize ( viewport()->width(), tmpH );
|
|
}
|
|
|
|
void LinkView::adjustSplitter2Hardware(bool added)
|
|
{
|
|
if (added)
|
|
{
|
|
if (hardware->height() < hardware->numRows()*hardware->itemHeight())
|
|
hardware->resize ( hardware->width(), hardware->numRows()*hardware->itemHeight() );
|
|
}
|
|
else
|
|
if (hardware->height() > hardware->numRows()*hardware->itemHeight())
|
|
hardware->resize ( hardware->width(), hardware->numRows()*hardware->itemHeight() );
|
|
}
|
|
|
|
void LinkView::viewportResizeEvent( TQResizeEvent *rev )
|
|
{
|
|
int tmpH = hardware->height() + locations->numRows()*locations->itemHeight()+20;
|
|
if (tmpH < rev->size().height())
|
|
tmpH = rev->size().height();
|
|
splitter->resize(rev->size().width(), tmpH);
|
|
}
|
|
|
|
void LinkView::unselectLocations()
|
|
{
|
|
if (locations) locations->setSelected( locations->selectedItem(), FALSE );
|
|
}
|
|
|
|
void LinkView::unselectHardware()
|
|
{
|
|
if (hardware) hardware->setSelected( hardware->selectedItem(), FALSE );
|
|
}
|
|
|
|
void LinkView::loadLinks()
|
|
{
|
|
if (!locations)
|
|
return;
|
|
TDEConfig config(TQDir::homeDirPath() + "/.qt/baghirarc");
|
|
config.setGroup("Sidebar");
|
|
splitter->setSizes(config.readIntListEntry ("Sizes"));
|
|
loadedLinks = (uint)config.readNumEntry("NumLinks", 0);
|
|
locations->blockSignals ( true );
|
|
if (loadedLinks == 0) // no settings stored - load defaults
|
|
{
|
|
locations->insertItem("desktop", i18n("Desktop"), TQDir::homeDirPath()+"/Desktop");
|
|
locations->insertItem("folder_home", getenv("USER"), TQDir::homeDirPath());
|
|
locations->insertItem("kmenu", i18n("Programs"), "programs:/");
|
|
}
|
|
TQString num;
|
|
for (uint i = 0; i < loadedLinks; i++)
|
|
{
|
|
TQString title;
|
|
TQString icon;
|
|
TQString url;
|
|
num.setNum(i);
|
|
title = config.readEntry("Link_"+num+"_Title", "???");
|
|
icon = config.readEntry("Link_"+num+"_Icon", "empty");
|
|
url = config.readEntry("Link_"+num+"_URL", TQDir::homeDirPath());
|
|
locations->insertItem(icon, title, url);
|
|
}
|
|
locations->blockSignals ( false );
|
|
}
|
|
|
|
void LinkView::saveLinks()
|
|
{
|
|
if (!locations)
|
|
return;
|
|
TDEConfig *config = new TDEConfig(TQDir::homeDirPath() + "/.qt/baghirarc");
|
|
config->setGroup("Sidebar");
|
|
config->writeEntry("Sizes", splitter->sizes());
|
|
config->writeEntry("NumLinks", (int)locations->count());
|
|
TQString num;
|
|
for (uint i = 0; i < locations->count(); i++)
|
|
{
|
|
num.setNum(i);
|
|
ListBoxLink *current = (ListBoxLink*)locations->item(i);
|
|
config->writeEntry("Link_"+num+"_Title", current->text());
|
|
config->writeEntry("Link_"+num+"_Icon", current->icon());
|
|
config->writeEntry("Link_"+num+"_URL", current->URL());
|
|
}
|
|
// reduced links, remove them from settings
|
|
for (uint i = locations->count(); i < loadedLinks; i++)
|
|
{
|
|
num.setNum(i);
|
|
config->deleteEntry("Link_"+num+"_Title");
|
|
config->deleteEntry("Link_"+num+"_Icon");
|
|
config->deleteEntry("Link_"+num+"_URL");
|
|
}
|
|
delete config;
|
|
}
|