• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • applications API Reference
  • KDE Home
  • Contact Us
 

Konsole

  • kde-4.14
  • applications
  • konsole
  • src
ViewSplitter.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the Konsole Terminal.
3 
4  Copyright 2006-2008 Robert Knight <robertknight@gmail.com>
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19  02110-1301 USA.
20 */
21 
22 // Own
23 #include "ViewSplitter.h"
24 
25 // Qt
26 
27 // Konsole
28 #include "ViewContainer.h"
29 
30 using Konsole::ViewSplitter;
31 using Konsole::ViewContainer;
32 
33 ViewSplitter::ViewSplitter(QWidget* parent)
34  : QSplitter(parent)
35  , _recursiveSplitting(true)
36 {
37 }
38 
39 void ViewSplitter::childEmpty(ViewSplitter* splitter)
40 {
41  delete splitter;
42 
43  if (count() == 0)
44  emit empty(this);
45 }
46 
47 void ViewSplitter::adjustContainerSize(ViewContainer* container , int percentage)
48 {
49  int containerIndex = indexOf(container->containerWidget());
50 
51  Q_ASSERT(containerIndex != -1);
52 
53  QList<int> containerSizes = sizes();
54 
55  const int oldSize = containerSizes[containerIndex];
56  const int newSize = static_cast<int>(oldSize * (1.0 + percentage / 100.0));
57 
58  const int perContainerDelta = (count() == 1) ? 0 : ((newSize - oldSize) / (count() - 1)) * (-1);
59 
60  for (int i = 0 ; i < containerSizes.count() ; i++) {
61  if (i == containerIndex)
62  containerSizes[i] = newSize;
63  else
64  containerSizes[i] = containerSizes[i] + perContainerDelta;
65  }
66 
67  setSizes(containerSizes);
68 }
69 
70 ViewSplitter* ViewSplitter::activeSplitter()
71 {
72  QWidget* widget = focusWidget() ? focusWidget() : this;
73 
74  ViewSplitter* splitter = 0;
75 
76  while (!splitter && widget) {
77  splitter = qobject_cast<ViewSplitter*>(widget);
78  widget = widget->parentWidget();
79  }
80 
81  Q_ASSERT(splitter);
82  return splitter;
83 }
84 
85 void ViewSplitter::registerContainer(ViewContainer* container)
86 {
87  _containers << container;
88  connect(container , SIGNAL(destroyed(ViewContainer*)) , this , SLOT(containerDestroyed(ViewContainer*)));
89  connect(container , SIGNAL(empty(ViewContainer*)) , this , SLOT(containerEmpty(ViewContainer*)));
90 }
91 
92 void ViewSplitter::unregisterContainer(ViewContainer* container)
93 {
94  _containers.removeAll(container);
95  disconnect(container , 0 , this , 0);
96 }
97 
98 void ViewSplitter::updateSizes()
99 {
100  int space;
101 
102  if (orientation() == Qt::Horizontal) {
103  space = width() / count();
104  } else {
105  space = height() / count();
106  }
107 
108  QList<int> widgetSizes;
109  for (int i = 0; i < count(); i++)
110  widgetSizes << space;
111 
112  setSizes(widgetSizes);
113 }
114 
115 void ViewSplitter::setRecursiveSplitting(bool recursive)
116 {
117  _recursiveSplitting = recursive;
118 }
119 bool ViewSplitter::recursiveSplitting() const
120 {
121  return _recursiveSplitting;
122 }
123 
124 void ViewSplitter::removeContainer(ViewContainer* container)
125 {
126  Q_ASSERT(containers().contains(container));
127 
128  unregisterContainer(container);
129 }
130 
131 void ViewSplitter::addContainer(ViewContainer* container ,
132  Qt::Orientation containerOrientation)
133 {
134  ViewSplitter* splitter = activeSplitter();
135 
136  if (splitter->count() < 2 ||
137  containerOrientation == splitter->orientation() ||
138  !_recursiveSplitting) {
139  splitter->registerContainer(container);
140  splitter->addWidget(container->containerWidget());
141 
142  if (splitter->orientation() != containerOrientation)
143  splitter->setOrientation(containerOrientation);
144 
145  splitter->updateSizes();
146  } else {
147  ViewSplitter* newSplitter = new ViewSplitter(this);
148  connect(newSplitter , SIGNAL(empty(ViewSplitter*)) , splitter , SLOT(childEmpty(ViewSplitter*)));
149 
150  ViewContainer* oldContainer = splitter->activeContainer();
151  const int oldContainerIndex = splitter->indexOf(oldContainer->containerWidget());
152 
153  splitter->unregisterContainer(oldContainer);
154 
155  newSplitter->registerContainer(oldContainer);
156  newSplitter->registerContainer(container);
157 
158  newSplitter->addWidget(oldContainer->containerWidget());
159  newSplitter->addWidget(container->containerWidget());
160  newSplitter->setOrientation(containerOrientation);
161  newSplitter->updateSizes();
162  newSplitter->show();
163 
164  splitter->insertWidget(oldContainerIndex, newSplitter);
165  }
166 }
167 
168 void ViewSplitter::containerEmpty(ViewContainer* /*container*/)
169 {
170  int children = 0;
171  foreach(ViewContainer* container, _containers) {
172  children += container->views().count();
173  }
174 
175  if (children == 0)
176  emit allContainersEmpty();
177 }
178 
179 void ViewSplitter::containerDestroyed(ViewContainer* container)
180 {
181  Q_ASSERT(_containers.contains(container));
182 
183  _containers.removeAll(container);
184 
185  if (count() == 0) {
186  emit empty(this);
187  }
188 }
189 
190 void ViewSplitter::activateNextContainer()
191 {
192  ViewContainer* active = activeContainer();
193 
194  int index = _containers.indexOf(active);
195 
196  if (index == -1)
197  return;
198 
199  if (index == _containers.count() - 1)
200  index = 0;
201  else
202  index++;
203 
204  setActiveContainer(_containers.at(index));
205 }
206 
207 void ViewSplitter::activatePreviousContainer()
208 {
209  ViewContainer* active = activeContainer();
210 
211  int index = _containers.indexOf(active);
212 
213  if (index == 0)
214  index = _containers.count() - 1;
215  else
216  index--;
217 
218  setActiveContainer(_containers.at(index));
219 }
220 
221 void ViewSplitter::setActiveContainer(ViewContainer* container)
222 {
223  QWidget* activeView = container->activeView();
224 
225  if (activeView)
226  activeView->setFocus(Qt::OtherFocusReason);
227 }
228 
229 ViewContainer* ViewSplitter::activeContainer() const
230 {
231  if (QWidget* focusW = focusWidget()) {
232  ViewContainer* focusContainer = 0;
233 
234  while (focusW != 0) {
235  foreach(ViewContainer* container, _containers) {
236  if (container->containerWidget() == focusW) {
237  focusContainer = container;
238  break;
239  }
240  }
241  focusW = focusW->parentWidget();
242  }
243 
244  if (focusContainer)
245  return focusContainer;
246  }
247 
248  QList<ViewSplitter*> splitters = findChildren<ViewSplitter*>();
249 
250  if (splitters.count() > 0) {
251  return splitters.last()->activeContainer();
252  } else {
253  if (_containers.count() > 0)
254  return _containers.last();
255  else
256  return 0;
257  }
258 }
259 
260 #include "ViewSplitter.moc"
Konsole::ViewSplitter::setRecursiveSplitting
void setRecursiveSplitting(bool recursive)
Specifies whether the view may be split recursively.
Definition: ViewSplitter.cpp:115
QWidget
Konsole::ViewSplitter::activeContainer
ViewContainer * activeContainer() const
Returns the container which currently has the focus or 0 if none of the immediate child containers ha...
Definition: ViewSplitter.cpp:229
Konsole::ViewSplitter::activeSplitter
ViewSplitter * activeSplitter()
Returns the child ViewSplitter widget which currently has the focus.
Definition: ViewSplitter.cpp:70
QSplitter::setSizes
void setSizes(const QList< int > &list)
QSplitter::insertWidget
void insertWidget(int index, QWidget *widget)
QSplitter::indexOf
int indexOf(QWidget *widget) const
Konsole::ViewSplitter::setActiveContainer
void setActiveContainer(ViewContainer *container)
Gives the focus to the active view in the specified container.
Definition: ViewSplitter.cpp:221
QSplitter::widget
QWidget * widget(int index) const
QObject::children
const QObjectList & children() const
Konsole::ViewSplitter::activatePreviousContainer
void activatePreviousContainer()
Gives the focus to the active view in the previous container.
Definition: ViewSplitter.cpp:207
Konsole::ViewSplitter::recursiveSplitting
bool recursiveSplitting() const
Returns whether the view may be split recursively.
Definition: ViewSplitter.cpp:119
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
QWidget::focusWidget
QWidget * focusWidget() const
Konsole::ViewSplitter::containers
QList< ViewContainer * > containers() const
Returns a list of the containers held by this splitter.
Definition: ViewSplitter.h:98
QSplitter::addWidget
void addWidget(QWidget *widget)
QSplitter::count
int count() const
QSplitter::orientation
Qt::Orientation orientation() const
Konsole::ViewContainer
An interface for container widgets which can hold one or more views.
Definition: ViewContainer.h:64
QWidget::width
int width() const
Konsole::ViewContainer::containerWidget
virtual QWidget * containerWidget() const =0
Returns the widget which contains the view widgets.
Konsole::ViewSplitter
A splitter which holds a number of ViewContainer objects and allows the user to control the size of e...
Definition: ViewSplitter.h:47
QList::count
int count(const T &value) const
Konsole::ViewSplitter::allContainersEmpty
void allContainersEmpty()
Signal emitted when the containers held by this splitter become empty, this differs from the empty() ...
QSplitter::sizes
QList< int > sizes() const
QWidget::setFocus
void setFocus()
Konsole::ViewSplitter::removeContainer
void removeContainer(ViewContainer *container)
Removes a container from the splitter.
Definition: ViewSplitter.cpp:124
Konsole::ViewContainer::activeView
virtual QWidget * activeView() const =0
Returns the view which currently has the focus or 0 if none of the child views have the focus...
Konsole::ViewSplitter::ViewSplitter
ViewSplitter(QWidget *parent=0)
Definition: ViewSplitter.cpp:33
QList< int >
Konsole::ViewSplitter::activateNextContainer
void activateNextContainer()
Gives the focus to the active view in the next container.
Definition: ViewSplitter.cpp:190
Konsole::ViewSplitter::addContainer
void addContainer(ViewContainer *container, Qt::Orientation orientation)
Locates the child ViewSplitter widget which currently has the focus and inserts the container into it...
Definition: ViewSplitter.cpp:131
Konsole::ViewSplitter::empty
void empty(ViewSplitter *splitter)
Signal emitted when the last child widget is removed from the splitter.
QSplitter
Konsole::ViewSplitter::adjustContainerSize
void adjustContainerSize(ViewContainer *container, int percentage)
Changes the size of the specified container by a given percentage.
Definition: ViewSplitter.cpp:47
QWidget::parentWidget
QWidget * parentWidget() const
QList::last
T & last()
Konsole::ViewContainer::views
const QList< QWidget * > views() const
Returns a list of the contained views.
Definition: ViewContainer.cpp:189
ViewContainer.h
QWidget::show
void show()
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
ViewSplitter.h
QObject::destroyed
void destroyed(QObject *obj)
QWidget::height
int height() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Sat May 9 2020 03:56:27 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Konsole

Skip menu "Konsole"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

applications API Reference

Skip menu "applications API Reference"
  •   kate
  •       kate
  •   KTextEditor
  •   Kate
  • Konsole

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal