• 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
kompareconnectwidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  kompareconnectwidget.cpp
3  ------------------------
4  begin : Tue Jun 26 2001
5  Copyright 2001-2003 John Firebaugh <jfirebaugh@kde.org>
6  Copyright 2001-2009 Otto Bruggeman <bruggie@gmail.com>
7  Copyright 2004 Jeff Snyder <jeff@caffeinated.me.uk>
8  Copyright 2007-2011 Kevin Kofler <kevin.kofler@chello.at>
9  ***************************************************************************/
10 
11 /***************************************************************************
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * *
18  ***************************************************************************/
19 
20 #include "kompareconnectwidget.h"
21 
22 #include <QtGui/QApplication>
23 #include <QtGui/QPainter>
24 #include <QtGui/QPixmap>
25 #include <QtGui/QStyle>
26 #include <QtCore/QTimer>
27 #include <QtGui/QPaintEvent>
28 #include <QFrame>
29 #include <QtGui/QMouseEvent>
30 
31 #include <kdebug.h>
32 
33 #include "viewsettings.h"
34 #include "komparelistview.h"
35 #include "komparesplitter.h"
36 
37 using namespace Diff2;
38 
39 KompareConnectWidgetFrame::KompareConnectWidgetFrame( ViewSettings* settings,
40  KompareSplitter* parent,
41  const char* name ) :
42  QSplitterHandle(Qt::Horizontal, (QSplitter *)parent),
43  m_wid ( settings, this, name ),
44  m_label ( " ", this ), // putting a space here because Qt 4 computes different size hints for empty labels
45  m_layout ( this )
46 {
47  setObjectName( name );
48  setSizePolicy ( QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Ignored) );
49  m_wid.setSizePolicy ( QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored) );
50  m_label.setSizePolicy ( QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed) );
51  m_label.setMargin(3);
52  QFrame* bottomLine = new QFrame(this);
53  bottomLine->setFrameShape(QFrame::HLine);
54  bottomLine->setFrameShadow ( QFrame::Plain );
55  bottomLine->setSizePolicy ( QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed) );
56  bottomLine->setFixedHeight(1);
57  m_layout.setSpacing(0);
58  m_layout.setMargin(0);
59  m_layout.addWidget(&m_label);
60  m_layout.addWidget(bottomLine);
61  m_layout.addWidget(&m_wid);
62 }
63 
64 KompareConnectWidgetFrame::~KompareConnectWidgetFrame()
65 {
66 }
67 
68 QSize KompareConnectWidgetFrame::sizeHint() const
69 {
70  return QSize(50, style()->pixelMetric( QStyle::PM_ScrollBarExtent ) );
71 }
72 
73 #if 0
74 static int kMouseOffset;
75 
76 void KompareConnectWidgetFrame::mouseMoveEvent( QMouseEvent *e )
77 {
78 
79  if ( !(e->state()&Qt::LeftButton) )
80  return;
81 
82  QCOORD pos = s->pick( parentWidget()->mapFromGlobal(e->globalPos()) )
83  - kMouseOffset;
84 
85  ((KompareSplitter*)s)->moveSplitter( pos, id() );
86 }
87 
88 void KompareConnectWidgetFrame::mousePressEvent( QMouseEvent *e )
89 {
90  if ( e->button() == Qt::LeftButton )
91  kMouseOffset = s->pick( e->pos() );
92  QSplitterHandle::mousePressEvent(e);
93 }
94 
95 void KompareConnectWidgetFrame::mouseReleaseEvent( QMouseEvent *e )
96 {
97  if ( !opaque() && e->button() == Qt::LeftButton ) {
98  QCOORD pos = s->pick( parentWidget()->mapFromGlobal(e->globalPos()) )
99  - kMouseOffset;
100  ((KompareSplitter*)s)->moveSplitter( pos, id() );
101  }
102 }
103 #endif
104 
105 KompareConnectWidget::KompareConnectWidget( ViewSettings* settings, QWidget* parent, const char* name )
106  : QWidget(parent),
107  m_settings( settings ),
108  m_selectedModel( 0 ),
109  m_selectedDifference( 0 )
110 {
111  setObjectName(name);
112 // connect( m_settings, SIGNAL( settingsChanged() ), this, SLOT( slotDelayedRepaint() ) );
113  setAttribute( Qt::WA_NoSystemBackground, true );
114  setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Minimum ) );
115  setFocusProxy( parent->parentWidget() );
116 }
117 
118 KompareConnectWidget::~KompareConnectWidget()
119 {
120  m_settings = 0;
121  m_selectedModel = 0;
122  m_selectedDifference = 0;
123 }
124 
125 void KompareConnectWidget::slotSetSelection( const DiffModel* model, const Difference* diff )
126 {
127  if( m_selectedModel == model && m_selectedDifference == diff )
128  return;
129 
130  if ( m_selectedModel == model && m_selectedDifference != diff )
131  {
132  m_selectedDifference = diff;
133  slotDelayedRepaint();
134  return;
135  }
136 
137  m_selectedModel = model;
138  m_selectedDifference = diff;
139 
140  slotDelayedRepaint();
141 }
142 
143 void KompareConnectWidget::slotDelayedRepaint()
144 {
145  QTimer::singleShot( 0, this, SLOT( repaint() ) );
146 }
147 
148 void KompareConnectWidget::slotSetSelection( const Difference* diff )
149 {
150  if ( m_selectedDifference == diff )
151  return;
152 
153  m_selectedDifference = diff;
154 
155  slotDelayedRepaint();
156 }
157 
158 void KompareConnectWidget::paintEvent( QPaintEvent* /* e */ )
159 {
160  QPixmap pixbuf(size());
161  QPainter paint(&pixbuf);
162  QPainter* p = &paint;
163 
164  p->setRenderHint(QPainter::Antialiasing);
165  p->fillRect( 0, 0, pixbuf.width(), pixbuf.height(), palette().color( QPalette::Window ) );
166  p->translate(QPointF(0, 0.5));
167 
168  KompareSplitter* splitter = static_cast<KompareSplitter*>( parent()->parent() );
169  int count = splitter->count();
170  KompareListView *leftView = count >= 2 ? static_cast<KompareListViewFrame*>( splitter->widget(0) )->view() : 0;
171  KompareListView *rightView = count >= 2 ? static_cast<KompareListViewFrame*>( splitter->widget(1) )->view() : 0;
172 
173  if ( m_selectedModel && leftView && rightView )
174  {
175  int firstL = leftView->firstVisibleDifference();
176  int firstR = rightView->firstVisibleDifference();
177  int lastL = leftView->lastVisibleDifference();
178  int lastR = rightView->lastVisibleDifference();
179 
180  int first = firstL < 0 ? firstR : qMin( firstL, firstR );
181  int last = lastL < 0 ? lastR : qMax( lastL, lastR );
182 // kDebug(8106) << " left: " << firstL << " - " << lastL << endl;
183 // kDebug(8106) << " right: " << firstR << " - " << lastR << endl;
184 // kDebug(8106) << " drawing: " << first << " - " << last << endl;
185  if ( first >= 0 && last >= 0 && first <= last )
186  {
187  const DifferenceList* differences = const_cast<DiffModel*>(m_selectedModel)->differences();
188  QRect leftRect, rightRect;
189  for ( int i = first; i <= last; ++i )
190  {
191  Difference* diff = differences->at(i );
192  bool selected = ( diff == m_selectedDifference );
193 
194  if ( QApplication::isRightToLeft() )
195  {
196  leftRect = rightView->itemRect( i );
197  rightRect = leftView->itemRect( i );
198  }
199  else
200  {
201  leftRect = leftView->itemRect( i );
202  rightRect = rightView->itemRect( i );
203  }
204 
205  int tl = leftRect.top();
206  int tr = rightRect.top();
207  int bl = leftRect.bottom();
208  int br = rightRect.bottom();
209 
210  // Bah, stupid 16-bit signed shorts in that crappy X stuff...
211  tl = tl >= -32768 ? tl : -32768;
212  tr = tr >= -32768 ? tr : -32768;
213  bl = bl <= 32767 ? bl : 32767;
214  br = br <= 32767 ? br : 32767;
215 
216  QPainterPath topBezier = makeBezier( tl, tr );
217  QPainterPath bottomBezier = makeBezier( bl, br );
218 
219  QPainterPath poly(topBezier);
220  poly.connectPath(bottomBezier.toReversed());
221  poly.closeSubpath();
222 
223  QColor bg = m_settings->colorForDifferenceType( diff->type(), selected, diff->applied() );
224  p->setPen( bg );
225  p->setBrush( bg );
226  p->drawPath(poly);
227 
228  if(selected)
229  {
230  p->setPen( bg.dark( 135 ) );
231  p->setBrush( Qt::NoBrush );
232  p->drawPath( topBezier );
233  p->drawPath( bottomBezier.toReversed() );
234  }
235  }
236  }
237  }
238 
239 // p->flush();
240  QPainter widgetPainter(this);
241  widgetPainter.drawImage(0, 0, pixbuf.toImage());
242 }
243 
244 QPainterPath KompareConnectWidget::makeBezier( int leftHeight, int rightHeight ) const
245 {
246  int r = width();
247  int o = (int)((double)r*0.4); // 40% of width
248 
249  QPainterPath p(QPointF(0, leftHeight));
250  if(leftHeight==rightHeight) {
251  p.lineTo(QPointF(r, rightHeight));
252  } else {
253  p.cubicTo(QPointF(o, leftHeight), QPointF(r-o, rightHeight), QPointF(r,rightHeight));
254  }
255  return p;
256 }
257 
258 #include "kompareconnectwidget.moc"
KompareListView::itemRect
QRect itemRect(int i)
Definition: komparelistview.cpp:206
QWidget
QApplication::isRightToLeft
bool isRightToLeft()
QWidget::palette
const QPalette & palette() const
KompareListView::lastVisibleDifference
int lastVisibleDifference()
Definition: komparelistview.cpp:163
QPixmap::width
int width() const
QPainter::fillRect
void fillRect(const QRectF &rectangle, const QBrush &brush)
QPainter::setRenderHint
void setRenderHint(RenderHint hint, bool on)
QSplitterHandle::mouseMoveEvent
virtual void mouseMoveEvent(QMouseEvent *e)
KompareConnectWidget::~KompareConnectWidget
~KompareConnectWidget()
Definition: kompareconnectwidget.cpp:118
QMouseEvent::state
Qt::ButtonState state() const
QPainterPath::closeSubpath
void closeSubpath()
QFrame::setFrameShape
void setFrameShape(Shape)
KompareConnectWidget::slotSetSelection
void slotSetSelection(const Diff2::DiffModel *model, const Diff2::Difference *diff)
QWidget::style
QStyle * style() const
QSplitter::widget
QWidget * widget(int index) const
QSizePolicy
QPalette::color
const QColor & color(ColorGroup group, ColorRole role) const
QPainterPath::cubicTo
void cubicTo(const QPointF &c1, const QPointF &c2, const QPointF &endPoint)
QWidget::setAttribute
void setAttribute(Qt::WidgetAttribute attribute, bool on)
QSplitterHandle::mousePressEvent
virtual void mousePressEvent(QMouseEvent *e)
KompareListView
Definition: komparelistview.h:47
komparesplitter.h
QSplitterHandle
QMouseEvent
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
QColor::dark
QColor dark(int factor) const
QSplitter::count
int count() const
QPointF
KompareConnectWidget::KompareConnectWidget
KompareConnectWidget(ViewSettings *settings, QWidget *parent, const char *name=0)
Definition: kompareconnectwidget.cpp:105
QWidget::width
int width() const
QWidget::size
QSize size() const
QRect
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QMouseEvent::globalPos
const QPoint & globalPos() const
QSplitterHandle::mouseReleaseEvent
virtual void mouseReleaseEvent(QMouseEvent *e)
QPainterPath::connectPath
void connectPath(const QPainterPath &path)
QRect::top
int top() const
QPainter::setPen
void setPen(const QColor &color)
QPainterPath::lineTo
void lineTo(const QPointF &endPoint)
QMouseEvent::button
Qt::MouseButton button() const
komparelistview.h
QPainter
QObject::setObjectName
void setObjectName(const QString &name)
QWidget::setFocusProxy
void setFocusProxy(QWidget *w)
QWidget::pos
QPoint pos() const
QPainter::setBrush
void setBrush(const QBrush &brush)
KompareConnectWidgetFrame::sizeHint
QSize sizeHint() const
Definition: kompareconnectwidget.cpp:68
QColor
KompareSplitter
Definition: komparesplitter.h:40
QLayout::setMargin
void setMargin(int margin)
QWidget::setSizePolicy
void setSizePolicy(QSizePolicy)
QPixmap
KompareConnectWidget::paintEvent
void paintEvent(QPaintEvent *e)
Definition: kompareconnectwidget.cpp:158
kompareconnectwidget.h
QSize
QPixmap::height
int height() const
QFrame
QFrame::setFrameShadow
void setFrameShadow(Shadow)
QWidget::repaint
void repaint()
QSplitter
ViewSettings::colorForDifferenceType
QColor colorForDifferenceType(int type, bool selected=false, bool applied=false)
Definition: viewsettings.cpp:77
QPainterPath
QPainter::drawImage
void drawImage(const QRectF &target, const QImage &image, const QRectF &source, QFlags< Qt::ImageConversionFlag > flags)
QPainter::drawPath
void drawPath(const QPainterPath &path)
KompareConnectWidget::slotDelayedRepaint
void slotDelayedRepaint()
Definition: kompareconnectwidget.cpp:143
QWidget::setFixedHeight
void setFixedHeight(int h)
KompareConnectWidget::makeBezier
QPainterPath makeBezier(int l, int r) const
Definition: kompareconnectwidget.cpp:244
ViewSettings
Definition: viewsettings.h:29
QWidget::parentWidget
QWidget * parentWidget() const
QWidget::mapFromGlobal
QPoint mapFromGlobal(const QPoint &pos) const
viewsettings.h
QPainterPath::toReversed
QPainterPath toReversed() const
KompareConnectWidgetFrame::~KompareConnectWidgetFrame
~KompareConnectWidgetFrame()
Definition: kompareconnectwidget.cpp:64
QRect::bottom
int bottom() const
QPainter::translate
void translate(const QPointF &offset)
KompareListView::firstVisibleDifference
int firstVisibleDifference()
Definition: komparelistview.cpp:141
QMouseEvent::pos
const QPoint & pos() const
QPixmap::toImage
QImage toImage() const
QPaintEvent
QObject::parent
QObject * parent() const
QLabel::setMargin
void setMargin(int)
QBoxLayout::setSpacing
void setSpacing(int spacing)
KompareListViewFrame
Definition: komparelistview.h:116
QTimer::singleShot
singleShot
KompareConnectWidgetFrame::KompareConnectWidgetFrame
KompareConnectWidgetFrame(ViewSettings *settings, KompareSplitter *parent, const char *name=0)
Definition: kompareconnectwidget.cpp:39
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