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

kompare

  • sources
  • kde-4.14
  • kdesdk
  • kompare
  • komparepart
komparesplitter.cpp
Go to the documentation of this file.
1 /**************************************************************************
2 ** komparesplitter.cpp
3 ** -------------------
4 ** begin : Wed Jan 14 2004
5 ** Copyright 2004-2005 Jeff Snyder <jeff-webcvsspam@caffeinated.me.uk>
6 ** Copyright 2007-2011 Kevin Kofler <kevin.kofler@chello.at>
7 ***************************************************************************/
8 
9 /**************************************************************************
10 **
11 ** This program is free software; you can redistribute it and/or modify
12 ** it under the terms of the GNU General Public License as published by
13 ** the Free Software Foundation; either version 2 of the License, or
14 ** (at your option) any later version.
15 **
16 ***************************************************************************/
17 
18 // associated header
19 #include "komparesplitter.h"
20 
21 // qt
22 #include <QtGui/QStyle>
23 #include <QtCore/QString>
24 #include <QtCore/QTimer>
25 #include <QtGui/QScrollBar>
26 #include <QtCore/QMap>
27 #include <QtGui/QSplitter>
28 #include <QtGui/QApplication>
29 #include <QtGui/QPainter>
30 #include <QtGui/QPixmap>
31 #include <QtGui/QKeyEvent>
32 #include <QtGui/QGridLayout>
33 #include <QtGui/QResizeEvent>
34 #include <QtCore/QChildEvent>
35 #include <QtCore/QEvent>
36 #include <QtGui/QWheelEvent>
37 
38 // kde
39 #include <kdebug.h>
40 #include <kapplication.h>
41 #include <kglobalsettings.h>
42 
43 // kompare
44 #include "komparelistview.h"
45 #include "viewsettings.h"
46 #include "kompareconnectwidget.h"
47 #include "diffmodel.h"
48 #include "difference.h"
49 
50 using namespace Diff2;
51 
52 KompareSplitter::KompareSplitter( ViewSettings *settings, QWidget *parent ) :
53  QSplitter( Qt::Horizontal, parent ),
54  m_settings( settings )
55 {
56  QFrame *scrollFrame = static_cast<QFrame *>(parent);
57 
58  // Set up the scrollFrame
59  scrollFrame->setFrameStyle( QFrame::NoFrame | QFrame::Plain );
60  scrollFrame->setLineWidth(scrollFrame->style()->pixelMetric(QStyle::PM_DefaultFrameWidth));
61  QGridLayout *pairlayout = new QGridLayout(scrollFrame);
62  pairlayout->setSpacing(0);
63  pairlayout->setContentsMargins( 0, 0, 0, 0 );
64  m_vScroll = new QScrollBar( Qt::Vertical, scrollFrame );
65  pairlayout->addWidget( m_vScroll, 0, 1 );
66  m_hScroll = new QScrollBar( Qt::Horizontal, scrollFrame );
67  pairlayout->addWidget( m_hScroll, 1, 0 );
68 
69  new KompareListViewFrame(true, m_settings, this, "source");
70  new KompareListViewFrame(false, m_settings, this, "destination");
71  pairlayout->addWidget( this, 0, 0 );
72 
73  // set up our looks
74  setLineWidth( style()->pixelMetric( QStyle::PM_DefaultFrameWidth ) );
75 
76  setHandleWidth(50);
77  setChildrenCollapsible( false );
78  setFrameStyle( QFrame::NoFrame );
79  setSizePolicy( QSizePolicy (QSizePolicy::Ignored, QSizePolicy::Ignored ));
80  setOpaqueResize( true );
81  setFocusPolicy( Qt::WheelFocus );
82 
83  connect( this, SIGNAL(configChanged()), SLOT(slotConfigChanged()) );
84  connect( this, SIGNAL(configChanged()), SLOT(slotDelayedRepaintHandles()) );
85  connect( this, SIGNAL(configChanged()), SLOT(slotDelayedUpdateScrollBars()) );
86 
87  // scrolling
88  connect( m_vScroll, SIGNAL(valueChanged(int)), SLOT(slotScrollToId(int)) );
89  connect( m_vScroll, SIGNAL(sliderMoved(int)), SLOT(slotScrollToId(int)) );
90  connect( m_hScroll, SIGNAL(valueChanged(int)), SIGNAL(setXOffset(int)) );
91  connect( m_hScroll, SIGNAL(sliderMoved(int)), SIGNAL(setXOffset(int)) );
92 
93  m_scrollTimer=new QTimer(this);
94  m_restartTimer = false;
95  connect (m_scrollTimer, SIGNAL(timeout()), SLOT(timerTimeout()) );
96 
97  // we need to receive childEvents now so that d->list is ready for when
98  // slotSetSelection(...) arrives
99  kapp->sendPostedEvents(this, QEvent::ChildAdded);
100 
101  // init stuff
102  slotUpdateScrollBars();
103 }
104 
105 KompareSplitter::~KompareSplitter()
106 {
107 }
108 
109 QSplitterHandle* KompareSplitter::createHandle()
110 {
111  return new KompareConnectWidgetFrame(m_settings, this);
112 }
113 
114 void KompareSplitter::slotDelayedRepaintHandles()
115 {
116  QTimer::singleShot(0, this, SLOT(slotRepaintHandles()));
117 }
118 
119 void KompareSplitter::slotRepaintHandles()
120 {
121  const int end = count();
122  for ( int i = 1; i < end; ++i )
123  handle(i)->update();
124 }
125 
126 void KompareSplitter::timerTimeout()
127 {
128  if ( m_restartTimer )
129  m_restartTimer = false;
130  else
131  m_scrollTimer->stop();
132 
133  slotDelayedRepaintHandles();
134 
135  emit scrollViewsToId( m_scrollTo );
136  slotRepaintHandles();
137  m_vScroll->setValue( m_scrollTo );
138 }
139 
140 void KompareSplitter::slotScrollToId( int id )
141 {
142  m_scrollTo = id;
143 
144  if( m_restartTimer )
145  return;
146 
147  if( m_scrollTimer->isActive() )
148  {
149  m_restartTimer = true;
150  }
151  else
152  {
153  emit scrollViewsToId( id );
154  slotRepaintHandles();
155  m_vScroll->setValue( id );
156  m_scrollTimer->start( 30 );
157  }
158 }
159 
160 void KompareSplitter::slotDelayedUpdateScrollBars()
161 {
162  QTimer::singleShot( 0, this, SLOT( slotUpdateScrollBars() ) );
163 }
164 
165 void KompareSplitter::slotUpdateScrollBars()
166 {
167  const int end = count();
168  for ( int i = 0; i < end; ++i ) {
169  KompareListView* lv = listView(i);
170  int minHScroll = minHScrollId();
171  if (lv->contentsX() < minHScroll) {
172  lv->setXOffset(minHScroll);
173  }
174  }
175 
176  int m_scrollDistance = m_settings->m_scrollNoOfLines * lineHeight();
177  int m_pageSize = pageSize();
178 
179  if( needVScrollBar() )
180  {
181  m_vScroll->show();
182 
183  m_vScroll->blockSignals( true );
184  m_vScroll->setRange( minVScrollId(),
185  maxVScrollId() );
186  m_vScroll->setValue( scrollId() );
187  m_vScroll->setSingleStep( m_scrollDistance );
188  m_vScroll->setPageStep( m_pageSize );
189  m_vScroll->blockSignals( false );
190  }
191  else
192  {
193  m_vScroll->hide();
194  }
195 
196  if( needHScrollBar() )
197  {
198  m_hScroll->show();
199  m_hScroll->blockSignals( true );
200  m_hScroll->setRange( minHScrollId(), maxHScrollId() );
201  m_hScroll->setValue( maxContentsX() );
202  m_hScroll->setSingleStep( 10 );
203  m_hScroll->setPageStep( minVisibleWidth() - 10 );
204  m_hScroll->blockSignals( false );
205  }
206  else
207  {
208  m_hScroll->hide();
209  }
210 }
211 
212 void KompareSplitter::slotDelayedUpdateVScrollValue()
213 {
214  QTimer::singleShot( 0, this, SLOT( slotUpdateVScrollValue() ) );
215 }
216 
217 void KompareSplitter::slotUpdateVScrollValue()
218 {
219  m_vScroll->setValue( scrollId() );
220 }
221 
222 void KompareSplitter::keyPressEvent( QKeyEvent* e )
223 {
224  //keyboard scrolling
225  switch ( e->key() ) {
226  case Qt::Key_Right:
227  case Qt::Key_L:
228  m_hScroll->triggerAction( QAbstractSlider::SliderSingleStepAdd );
229  break;
230  case Qt::Key_Left:
231  case Qt::Key_H:
232  m_hScroll->triggerAction( QAbstractSlider::SliderSingleStepSub );
233  break;
234  case Qt::Key_Up:
235  case Qt::Key_K:
236  m_vScroll->triggerAction( QAbstractSlider::SliderSingleStepSub );
237  break;
238  case Qt::Key_Down:
239  case Qt::Key_J:
240  m_vScroll->triggerAction( QAbstractSlider::SliderSingleStepAdd );
241  break;
242  case Qt::Key_PageDown:
243  m_vScroll->triggerAction( QAbstractSlider::SliderPageStepAdd );
244  break;
245  case Qt::Key_PageUp:
246  m_vScroll->triggerAction( QAbstractSlider::SliderPageStepSub );
247  break;
248  }
249  e->accept();
250  slotRepaintHandles();
251 }
252 
253 void KompareSplitter::wheelEvent( QWheelEvent* e )
254 {
255  if ( e->orientation() == Qt::Vertical )
256  {
257  if ( e->modifiers() & Qt::ControlModifier ) {
258  if ( e->delta() < 0 ) // scroll down one page
259  m_vScroll->triggerAction( QAbstractSlider::SliderPageStepAdd );
260  else // scroll up one page
261  m_vScroll->triggerAction( QAbstractSlider::SliderPageStepSub );
262  } else {
263  if ( e->delta() < 0 ) // scroll down
264  m_vScroll->triggerAction( QAbstractSlider::SliderSingleStepAdd );
265  else // scroll up
266  m_vScroll->triggerAction( QAbstractSlider::SliderSingleStepSub );
267  }
268  }
269  else
270  {
271  if ( e->modifiers() & Qt::ControlModifier ) {
272  if ( e->delta() < 0 ) // scroll right one page
273  m_hScroll->triggerAction( QAbstractSlider::SliderPageStepAdd );
274  else // scroll left one page
275  m_hScroll->triggerAction( QAbstractSlider::SliderPageStepSub );
276  } else {
277  if ( e->delta() < 0 ) // scroll to the right
278  m_hScroll->triggerAction( QAbstractSlider::SliderSingleStepAdd );
279  else // scroll to the left
280  m_hScroll->triggerAction( QAbstractSlider::SliderSingleStepSub );
281  }
282  }
283  e->accept();
284  slotDelayedRepaintHandles();
285 }
286 
287 /* FIXME: this should return/the scrollId() from the listview containing the
288  * /base/ of the diff. but there's bigger issues with that atm.
289  */
290 
291 int KompareSplitter::scrollId()
292 {
293  if(widget(0))
294  return listView(0)->scrollId();
295  return minVScrollId();
296 }
297 
298 int KompareSplitter::lineHeight()
299 {
300  if(widget(0))
301  return listView(0)->fontMetrics().height();
302  return 1;
303 }
304 
305 int KompareSplitter::pageSize()
306 {
307  if(widget(0)) {
308  KompareListView *view = listView(0);
309  return view->visibleHeight() - view->style()->pixelMetric( QStyle::PM_ScrollBarExtent );
310  }
311  return 1;
312 }
313 
314 bool KompareSplitter::needVScrollBar()
315 {
316  int pagesize = pageSize();
317  const int end = count();
318  for ( int i = 0; i < end; ++i ) {
319  KompareListView *view = listView(i);
320  if( view ->contentsHeight() > pagesize)
321  return true;
322  }
323  return false;
324 }
325 
326 int KompareSplitter::minVScrollId()
327 {
328 
329  int min = -1;
330  int mSId;
331  const int end = count();
332  for ( int i = 0; i < end; ++i ) {
333  mSId = listView(i)->minScrollId();
334  if (mSId < min || min == -1)
335  min = mSId;
336  }
337  return ( min == -1 ) ? 0 : min;
338 }
339 
340 int KompareSplitter::maxVScrollId()
341 {
342  int max = 0;
343  int mSId;
344  const int end = count();
345  for ( int i = 0; i < end; ++i ) {
346  mSId = listView(i)->maxScrollId();
347  if ( mSId > max )
348  max = mSId;
349  }
350  return max;
351 }
352 
353 bool KompareSplitter::needHScrollBar()
354 {
355  const int end = count();
356  for ( int i = 0; i < end; ++i ) {
357  KompareListView *view = listView(i);
358  if ( view->contentsWidth() > view->visibleWidth() )
359  return true;
360  }
361  return false;
362 }
363 
364 int KompareSplitter::minHScrollId()
365 {
366  // hardcode an offset to hide the tree controls
367  return 6;
368 }
369 
370 int KompareSplitter::maxHScrollId()
371 {
372  int max = 0;
373  int mHSId;
374  const int end = count();
375  for ( int i = 0; i < end; ++i ) {
376  KompareListView *view = listView(i);
377  mHSId = view->contentsWidth() - view->visibleWidth();
378  if ( mHSId > max )
379  max = mHSId;
380  }
381  return max;
382 }
383 
384 int KompareSplitter::maxContentsX()
385 {
386  int max = 0;
387  int mCX;
388  const int end = count();
389  for ( int i = 0; i < end; ++i ) {
390  mCX = listView(i)->contentsX();
391  if ( mCX > max )
392  max = mCX;
393  }
394  return max;
395 }
396 
397 int KompareSplitter::minVisibleWidth()
398 {
399  // Why the hell do we want to know this?
400  // ah yes, it is because we use it to set the "page size" for horiz. scrolling.
401  // despite the fact that *none* has a pgright and pgleft key :P
402  // But we do have mousewheels with horizontal scrolling functionality,
403  // pressing shift and scrolling then goes left and right one page at the time
404  int min = -1;
405  int vW;
406  const int end = count();
407  for ( int i = 0; i < end; ++i ) {
408  vW = listView(i)->visibleWidth();
409  if ( vW < min || min == -1 )
410  min = vW;
411  }
412  return ( min == -1 ) ? 0 : min;
413 }
414 
415 KompareListView* KompareSplitter::listView( int index )
416 {
417  return static_cast<KompareListViewFrame*>(widget(index))->view();
418 }
419 
420 KompareConnectWidget* KompareSplitter::connectWidget( int index )
421 {
422  return static_cast<KompareConnectWidgetFrame*>(handle(index))->wid();
423 }
424 
425 void KompareSplitter::slotSetSelection( const DiffModel* model, const Difference* diff )
426 {
427  const int end = count();
428  for ( int i = 0; i < end; ++i ) {
429  connectWidget(i)->slotSetSelection( model, diff );
430  listView(i)->slotSetSelection( model, diff );
431  static_cast<KompareListViewFrame*>(widget(i))->slotSetModel( model );
432  }
433 
434  slotDelayedRepaintHandles();
435  slotDelayedUpdateScrollBars();
436 }
437 
438 void KompareSplitter::slotSetSelection( const Difference* diff )
439 {
440  const int end = count();
441  for ( int i = 0; i < end; ++i ) {
442  connectWidget(i)->slotSetSelection( diff );
443  listView(i)->slotSetSelection( diff );
444  }
445 
446  slotDelayedRepaintHandles();
447  slotDelayedUpdateScrollBars();
448 }
449 
450 void KompareSplitter::slotApplyDifference( bool apply )
451 {
452  const int end = count();
453  for ( int i = 0; i < end; ++i )
454  listView(i)->slotApplyDifference( apply );
455  slotDelayedRepaintHandles();
456 }
457 
458 void KompareSplitter::slotApplyAllDifferences( bool apply )
459 {
460  const int end = count();
461  for ( int i = 0; i < end; ++i )
462  listView(i)->slotApplyAllDifferences( apply );
463  slotDelayedRepaintHandles();
464  slotScrollToId( m_scrollTo ); // FIXME!
465 }
466 
467 void KompareSplitter::slotApplyDifference( const Difference* diff, bool apply )
468 {
469  const int end = count();
470  for ( int i = 0; i < end; ++i )
471  listView(i)->slotApplyDifference( diff, apply );
472  slotDelayedRepaintHandles();
473 }
474 
475 void KompareSplitter::slotDifferenceClicked( const Difference* diff )
476 {
477  const int end = count();
478  for ( int i = 0; i < end; ++i )
479  listView(i)->setSelectedDifference( diff, false );
480  emit selectionChanged( diff );
481 }
482 
483 void KompareSplitter::slotConfigChanged()
484 {
485  const int end = count();
486  for ( int i = 0; i < end; ++i ) {
487  KompareListView *view = listView(i);
488  view->setFont( m_settings->m_font );
489  view->update();
490  }
491 }
492 #include "komparesplitter.moc"
KompareSplitter::scrollViewsToId
void scrollViewsToId(int id)
KompareSplitter::setXOffset
void setXOffset(int x)
KompareSplitter::configChanged
void configChanged()
QWidget
KompareSplitter::slotDelayedRepaintHandles
void slotDelayedRepaintHandles()
Definition: komparesplitter.cpp:114
KompareListView::scrollId
int scrollId()
Definition: komparelistview.cpp:310
QLayout::setContentsMargins
void setContentsMargins(int left, int top, int right, int bottom)
KompareSplitter::slotUpdateScrollBars
void slotUpdateScrollBars()
Definition: komparesplitter.cpp:165
QGridLayout::addWidget
void addWidget(QWidget *widget, int row, int column, QFlags< Qt::AlignmentFlag > alignment)
QAbstractSlider::setRange
void setRange(int min, int max)
KompareSplitter::slotApplyAllDifferences
void slotApplyAllDifferences(bool apply)
Definition: komparesplitter.cpp:458
ViewSettings::m_scrollNoOfLines
int m_scrollNoOfLines
Definition: viewsettings.h:55
KompareSplitter::~KompareSplitter
~KompareSplitter()
Definition: komparesplitter.cpp:105
QSplitter::setHandleWidth
void setHandleWidth(int)
QWidget::setFocusPolicy
void setFocusPolicy(Qt::FocusPolicy policy)
KompareSplitter::slotSetSelection
void slotSetSelection(const Diff2::DiffModel *model, const Diff2::Difference *diff)
KompareSplitter::connectWidget
KompareConnectWidget * connectWidget(int index)
Definition: komparesplitter.cpp:420
KompareConnectWidget::slotSetSelection
void slotSetSelection(const Diff2::DiffModel *model, const Diff2::Difference *diff)
KompareSplitter::slotUpdateVScrollValue
void slotUpdateVScrollValue()
Definition: komparesplitter.cpp:217
QWidget::style
QStyle * style() const
QStyle::pixelMetric
virtual int pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const =0
QSplitter::widget
QWidget * widget(int index) const
QSizePolicy
KompareConnectWidget
Definition: kompareconnectwidget.h:38
QWheelEvent
KompareSplitter::slotDelayedUpdateScrollBars
void slotDelayedUpdateScrollBars()
Definition: komparesplitter.cpp:160
KompareListView::slotApplyDifference
void slotApplyDifference(bool apply)
Definition: komparelistview.cpp:473
QScrollBar
KompareListView
Definition: komparelistview.h:47
komparesplitter.h
QSplitterHandle
QGridLayout
QAbstractSlider::setPageStep
void setPageStep(int)
QFrame::setFrameStyle
void setFrameStyle(int style)
QFrame::setLineWidth
void setLineWidth(int)
KompareSplitter::keyPressEvent
void keyPressEvent(QKeyEvent *e)
Definition: komparesplitter.cpp:222
QWidget::update
void update()
QGridLayout::setSpacing
void setSpacing(int spacing)
KompareConnectWidgetFrame
Definition: kompareconnectwidget.h:66
QSplitter::count
int count() const
KompareListView::setSelectedDifference
void setSelectedDifference(const Diff2::Difference *diff, bool scroll)
Definition: komparelistview.cpp:317
QSplitter::setChildrenCollapsible
void setChildrenCollapsible(bool)
QAbstractItemView::update
void update(const QModelIndex &index)
QTimer
KompareSplitter::wheelEvent
void wheelEvent(QWheelEvent *e)
Definition: komparesplitter.cpp:253
QWheelEvent::orientation
Qt::Orientation orientation() const
KompareSplitter::slotConfigChanged
void slotConfigChanged()
Definition: komparesplitter.cpp:483
komparelistview.h
QSplitter::setOpaqueResize
void setOpaqueResize(bool opaque)
QWidget::hide
void hide()
QWidget::setSizePolicy
void setSizePolicy(QSizePolicy)
QInputEvent::modifiers
Qt::KeyboardModifiers modifiers() const
kompareconnectwidget.h
QKeyEvent::key
int key() const
QEvent::accept
void accept()
QObject::blockSignals
bool blockSignals(bool block)
QWidget::setFont
void setFont(const QFont &)
KompareSplitter::KompareSplitter
KompareSplitter(ViewSettings *settings, QWidget *parent)
Definition: komparesplitter.cpp:52
QAbstractSlider::setValue
void setValue(int)
QFrame
KompareListView::slotSetSelection
void slotSetSelection(const Diff2::DiffModel *model, const Diff2::Difference *diff)
QTimer::stop
void stop()
QWheelEvent::delta
int delta() const
KompareSplitter::slotRepaintHandles
void slotRepaintHandles()
Definition: komparesplitter.cpp:119
QKeyEvent
QSplitter
QWidget::fontMetrics
QFontMetrics fontMetrics() const
KompareSplitter::slotApplyDifference
void slotApplyDifference(bool apply)
Definition: komparesplitter.cpp:450
QAbstractSlider::setSingleStep
void setSingleStep(int)
KompareSplitter::slotDelayedUpdateVScrollValue
void slotDelayedUpdateVScrollValue()
Definition: komparesplitter.cpp:212
KompareSplitter::slotDifferenceClicked
void slotDifferenceClicked(const Diff2::Difference *diff)
Definition: komparesplitter.cpp:475
ViewSettings
Definition: viewsettings.h:29
ViewSettings::m_font
QFont m_font
Definition: viewsettings.h:58
QAbstractSlider::triggerAction
void triggerAction(SliderAction action)
viewsettings.h
QFontMetrics::height
int height() const
KompareListView::setXOffset
void setXOffset(int x)
Definition: komparelistview.cpp:267
KompareListView::minScrollId
int minScrollId()
Definition: komparelistview.cpp:212
KompareSplitter::slotScrollToId
void slotScrollToId(int id)
Definition: komparesplitter.cpp:140
KompareSplitter::listView
KompareListView * listView(int index)
Definition: komparesplitter.cpp:415
KompareListView::visibleWidth
int visibleWidth()
Definition: komparelistview.cpp:242
KompareListView::maxScrollId
int maxScrollId()
Definition: komparelistview.cpp:217
QTimer::start
void start(int msec)
QWidget::show
void show()
KompareSplitter::selectionChanged
void selectionChanged(const Diff2::Difference *diff)
KompareListView::contentsX
int contentsX()
Definition: komparelistview.cpp:247
QSplitter::handle
QSplitterHandle * handle(int index) const
KompareListView::slotApplyAllDifferences
void slotApplyAllDifferences(bool apply)
Definition: komparelistview.cpp:481
KompareSplitter::KompareConnectWidgetFrame
friend class KompareConnectWidgetFrame
Definition: komparesplitter.h:119
KompareSplitter::timerTimeout
void timerTimeout()
Definition: komparesplitter.cpp:126
KompareListView::contentsWidth
int contentsWidth()
Definition: komparelistview.cpp:232
QTimer::isActive
bool isActive() const
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::parent
QObject * parent() const
KompareListView::visibleHeight
int visibleHeight()
Definition: komparelistview.cpp:237
KompareListViewFrame
Definition: komparelistview.h:116
QTimer::singleShot
singleShot
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:40:01 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kompare

Skip menu "kompare"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdesdk API Reference

Skip menu "kdesdk API Reference"
  • kapptemplate
  • kcachegrind
  • kompare
  • lokalize
  • umbrello
  •   umbrello

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