/*************************************************************************** * Copyright (C) 2007 by Pino Toscano * * Copyright (C) 2009 by Eike Hein * * * * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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 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 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 list = KUrlMimeData::urlsFromMimeData( event->mimeData() ); emit urlsDropped( list ); } #include "sidebar.moc"