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.
 
 
 
 
 

195 lines
5.4 KiB

/***************************************************************************
* Copyright (C) 2007 by Pino Toscano <pino@kde.org> *
* Copyright (C) 2009 by Eike Hein <hein@kde.org> *
* *
* 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 "sidebar.h"
#include <qaction.h>
#include <qapplication.h>
#include <qevent.h>
#include <qfont.h>
#include <qfontmetrics.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qlist.h>
#include <qpainter.h>
#include <qscrollbar.h>
#include <qsplitter.h>
#include <qtabwidget.h>
#include <qmimedata.h>
#include <kiconloader.h>
#include <KLocalizedString>
#include <qmenu.h>
#include <kcolorscheme.h>
#include <kurlmimedata.h>
#include "settings.h"
/* Private storage. */
class Sidebar::Private
{
public:
Private()
: sideWidget( nullptr ), bottomWidget( nullptr ), splitterSizesSet( false )
{
}
QSplitter *splitter;
QTabWidget *viewChooserTabs;
QWidget *sideContainer;
QVBoxLayout *vlay;
QWidget *sideWidget;
QWidget *bottomWidget;
bool splitterSizesSet;
};
Sidebar::Sidebar( QWidget *parent )
: QWidget( parent ), d( new Private )
{
QHBoxLayout *mainlay = new QHBoxLayout( this );
mainlay->setContentsMargins( 0, 0, 0, 0 );
mainlay->setSpacing( 0 );
setAutoFillBackground( true );
setAcceptDrops( true );
d->splitter = new QSplitter( this );
mainlay->addWidget( d->splitter );
d->splitter->setOpaqueResize( true );
d->splitter->setChildrenCollapsible( false );
// d->sideContainer holds all the actual content
d->sideContainer = new QWidget( d->splitter );
d->sideContainer->setMinimumWidth( 90 );
d->sideContainer->setMaximumWidth( 600 );
d->vlay = new QVBoxLayout( d->sideContainer );
d->vlay->setContentsMargins( 0, 0, 0, 0 );
d->viewChooserTabs = new QTabWidget( d->sideContainer );
d->viewChooserTabs->setDocumentMode(true);
d->vlay->addWidget( d->viewChooserTabs );
connect(d->splitter, &QSplitter::splitterMoved, this, &Sidebar::splitterMoved);
}
Sidebar::~Sidebar()
{
delete d;
}
int Sidebar::addItem( QWidget *widget, const QIcon &icon, const QString &text )
{
if ( !widget )
return -1;
widget->setParent( d->viewChooserTabs );
d->viewChooserTabs->addTab( widget, icon, text );
const int thisTabIndex = d->viewChooserTabs->count() - 1;
// Hide all text and use large icons
d->viewChooserTabs->setTabText( thisTabIndex, QString() );
d->viewChooserTabs->setIconSize( QSize(22, 22) );
d->viewChooserTabs->setTabToolTip( thisTabIndex, text );
return thisTabIndex;
}
void Sidebar::setMainWidget( QWidget *widget )
{
delete d->sideWidget;
d->sideWidget = widget;
if ( d->sideWidget )
{
// setting the splitter as parent for the widget automatically plugs it
// into the splitter, neat!
d->sideWidget->setParent( d->splitter );
if ( !d->splitterSizesSet )
{
QList<int> splitterSizes = Okular::Settings::splitterSizes();
if ( splitterSizes.isEmpty() )
{
// the first time use 1/10 for the panel and 9/10 for the pageView
splitterSizes.push_back( 50 );
splitterSizes.push_back( 500 );
}
d->splitter->setSizes( splitterSizes );
d->splitterSizesSet = true;
}
}
}
void Sidebar::setBottomWidget( QWidget *widget )
{
delete d->bottomWidget;
d->bottomWidget = widget;
if ( d->bottomWidget )
{
d->bottomWidget->setParent( this );
d->vlay->addWidget( d->bottomWidget );
}
}
void Sidebar::setCurrentItem( QWidget *widget )
{
d->viewChooserTabs->setCurrentWidget( widget );
}
QWidget *Sidebar::currentItem() const
{
if ( d->viewChooserTabs->currentIndex() == -1 )
return nullptr;
return d->viewChooserTabs->currentWidget();
}
void Sidebar::setSidebarVisibility( bool visible )
{
d->sideContainer->setHidden( !visible );
}
bool Sidebar::isSidebarVisible() const
{
return !d->sideContainer->isHidden();
}
void Sidebar::moveSplitter(int sideWidgetSize)
{
QList<int> splitterSizeList = d->splitter->sizes();
const int total = splitterSizeList.at( 0 ) + splitterSizeList.at( 1 );
splitterSizeList.replace( 0, total - sideWidgetSize );
splitterSizeList.replace( 1, sideWidgetSize );
d->splitter->setSizes( splitterSizeList );
}
void Sidebar::splitterMoved( int /*pos*/, int index )
{
// if the side panel has been resized, save splitter sizes
if ( index == 1 )
saveSplitterSize();
}
void Sidebar::saveSplitterSize() const
{
Okular::Settings::setSplitterSizes( d->splitter->sizes() );
Okular::Settings::self()->save();
}
void Sidebar::dragEnterEvent( QDragEnterEvent* event )
{
event->setAccepted( event->mimeData()->hasUrls() );
}
void Sidebar::dropEvent( QDropEvent* event )
{
const QList<QUrl> list = KUrlMimeData::urlsFromMimeData( event->mimeData() );
emit urlsDropped( list );
}
#include "sidebar.moc"