mirror of
https://github.com/KDE/konsole.git
synced 2026-05-04 12:44:23 -04:00
190 lines
6.5 KiB
C++
190 lines
6.5 KiB
C++
/*
|
|
This file is part of the Konsole Terminal.
|
|
|
|
Copyright 2006-2008 Robert Knight <robertknight@gmail.com>
|
|
|
|
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.
|
|
|
|
This program 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301 USA.
|
|
*/
|
|
|
|
#ifndef VIEWSPLITTER_H
|
|
#define VIEWSPLITTER_H
|
|
|
|
// Qt
|
|
#include <QtCore/QList>
|
|
#include <QtGui/QSplitter>
|
|
|
|
class QFocusEvent;
|
|
|
|
namespace Konsole
|
|
{
|
|
class ViewContainer;
|
|
|
|
/**
|
|
* A splitter which holds a number of ViewContainer objects and allows
|
|
* the user to control the size of each view container by dragging a splitter
|
|
* bar between them.
|
|
*
|
|
* Each splitter can also contain child ViewSplitter widgets, allowing
|
|
* for a hierarchy of view splitters and containers.
|
|
*
|
|
* The addContainer() method is used to split the existing view and
|
|
* insert a new view container.
|
|
* Containers can only be removed from the hierarchy by deleting them.
|
|
*/
|
|
class ViewSplitter : public QSplitter
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit ViewSplitter(QWidget* parent = 0);
|
|
|
|
/**
|
|
* Locates the child ViewSplitter widget which currently has the focus
|
|
* and inserts the container into it.
|
|
*
|
|
* @param container The container to insert
|
|
* @param orientation Specifies whether the view should be split
|
|
* horizontally or vertically. If the orientation
|
|
* is the same as the ViewSplitter into which the
|
|
* container is to be inserted, or if the splitter
|
|
* has fewer than two child widgets then the container
|
|
* will be added to that splitter. If the orientation
|
|
* is different, then a new child splitter
|
|
* will be created, into which the container will
|
|
* be inserted.
|
|
*/
|
|
void addContainer(ViewContainer* container , Qt::Orientation orientation);
|
|
|
|
/** Removes a container from the splitter. The container is not deleted. */
|
|
void removeContainer(ViewContainer* container);
|
|
|
|
/** Returns the child ViewSplitter widget which currently has the focus */
|
|
ViewSplitter* activeSplitter();
|
|
|
|
/**
|
|
* Returns the container which currently has the focus or 0 if none
|
|
* of the immediate child containers have the focus. This does not
|
|
* search through child splitters. activeSplitter() can be used
|
|
* to search recursively through child splitters for the splitter
|
|
* which currently has the focus.
|
|
*
|
|
* To find the currently active container, use
|
|
* mySplitter->activeSplitter()->activeContainer() where mySplitter
|
|
* is the ViewSplitter widget at the top of the hierarchy.
|
|
*/
|
|
ViewContainer* activeContainer() const;
|
|
|
|
/**
|
|
* Gives the focus to the active view in the specified container
|
|
*/
|
|
void setActiveContainer(ViewContainer* container);
|
|
|
|
/**
|
|
* Returns a list of the containers held by this splitter
|
|
*/
|
|
QList<ViewContainer*> containers() const {
|
|
return _containers;
|
|
}
|
|
|
|
/**
|
|
* Gives the focus to the active view in the next container
|
|
*/
|
|
void activateNextContainer();
|
|
|
|
/**
|
|
* Changes the size of the specified @p container by a given @p percentage.
|
|
* @p percentage may be positive ( in which case the size of the container
|
|
* is increased ) or negative ( in which case the size of the container
|
|
* is decreased ).
|
|
*
|
|
* The sizes of the remaining containers are increased or decreased
|
|
* uniformly to maintain the width of the splitter.
|
|
*/
|
|
void adjustContainerSize(ViewContainer* container , int percentage);
|
|
|
|
/**
|
|
* Gives the focus to the active view in the previous container
|
|
*/
|
|
void activatePreviousContainer();
|
|
|
|
/**
|
|
* Specifies whether the view may be split recursively.
|
|
*
|
|
* If this is false, all containers will be placed into the same
|
|
* top-level splitter. Adding a container with an orientation
|
|
* which is different to that specified when adding the previous
|
|
* containers will change the orientation for all dividers
|
|
* between containers.
|
|
*
|
|
* If this is true, adding a container to the view splitter with
|
|
* an orientation different to the orientation of the previous
|
|
* area will result in the previously active container being
|
|
* replaced with a new splitter containing the active container
|
|
* and the newly added container.
|
|
*/
|
|
void setRecursiveSplitting(bool recursive);
|
|
|
|
/**
|
|
* Returns whether the view may be split recursively.
|
|
* See setRecursiveSplitting()
|
|
*/
|
|
bool recursiveSplitting() const;
|
|
|
|
signals:
|
|
/** Signal emitted when the last child widget is removed from the splitter */
|
|
void empty(ViewSplitter* splitter);
|
|
|
|
/**
|
|
* Signal emitted when the containers held by this splitter become empty, this
|
|
* differs from the empty() signal which is only emitted when all of the containers
|
|
* are deleted. This signal is emitted even if there are still container widgets.
|
|
*
|
|
* TODO: This does not yet work recursively (ie. when splitters inside splitters have empty containers)
|
|
*/
|
|
void allContainersEmpty();
|
|
|
|
protected:
|
|
//virtual void focusEvent(QFocusEvent* event);
|
|
|
|
private:
|
|
// Adds container to splitter's internal list and
|
|
// connects signals and slots
|
|
void registerContainer(ViewContainer* container);
|
|
// Removes container from splitter's internal list and
|
|
// removes signals and slots
|
|
void unregisterContainer(ViewContainer* container);
|
|
|
|
void updateSizes();
|
|
|
|
private slots:
|
|
// Called to indicate that a child ViewContainer has been deleted
|
|
void containerDestroyed(ViewContainer* container);
|
|
|
|
// Called to indicate that a child ViewContainer is empty
|
|
void containerEmpty(ViewContainer* container);
|
|
|
|
// Called to indicate that a child ViewSplitter is empty
|
|
// (ie. all child widgets have been deleted)
|
|
void childEmpty(ViewSplitter* splitter);
|
|
|
|
private:
|
|
QList<ViewContainer*> _containers;
|
|
bool _recursiveSplitting;
|
|
};
|
|
}
|
|
#endif //VIEWSPLITTER_H
|
|
|