#include #include #include #include #include #include #include #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; KConfig 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; KConfig *config = new KConfig(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; }