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

kcachegrind

  • sources
  • kde-4.12
  • kdesdk
  • kcachegrind
  • libviews
traceitemview.cpp
Go to the documentation of this file.
1 /* This file is part of KCachegrind.
2  Copyright (C) 2003-2009 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
3 
4  KCachegrind is free software; you can redistribute it and/or
5  modify it under the terms of the GNU General Public
6  License as published by the Free Software Foundation, version 2.
7 
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License
14  along with this program; see the file COPYING. If not, write to
15  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16  Boston, MA 02110-1301, USA.
17 */
18 
19 /*
20  * Trace Item View
21  */
22 
23 #include "traceitemview.h"
24 
25 #include <QWidget>
26 
27 #include "toplevelbase.h"
28 
29 #define TRACE_UPDATES 0
30 
31 
32 // TraceItemViewUpdateTimer
33 
34 TraceItemViewUpdateTimer::TraceItemViewUpdateTimer(TraceItemView* view)
35 {
36  _view = view;
37  setSingleShot(true);
38  connect(this, SIGNAL(timeout()), this, SLOT(timeoutTriggered()));
39 }
40 
41 void TraceItemViewUpdateTimer::timeoutTriggered()
42 {
43  _view->triggerUpdate(false);
44 }
45 
46 // TraceItemView
47 
48 TraceItemView::TraceItemView(TraceItemView* parentView, TopLevelBase* top)
49 {
50  _parentView = parentView;
51  _topLevel = top ? top : parentView->topLevel();
52 
53  _data = _newData = 0;
54  // _partList and _newPartList is empty
55  _activeItem = _newActiveItem = 0;
56  _selectedItem = _newSelectedItem = 0;
57  _eventType = _newEventType = 0;
58  _eventType2 = _newEventType2 = 0;
59  _groupType = _newGroupType = ProfileContext::InvalidType;
60 
61  _status = nothingChanged;
62  _needsUpdate = false;
63  _pos = Hidden;
64 
65  _mergeUpdates = true;
66  _updateTimer = new TraceItemViewUpdateTimer(this);
67 }
68 
69 TraceItemView::~TraceItemView()
70 {
71  delete _updateTimer;
72 }
73 
74 QString TraceItemView::whatsThis() const
75 {
76  return QObject::tr("No description available");
77 }
78 
79 void TraceItemView::select(CostItem* i)
80 {
81  if (_selectedItem == i) return;
82 
83  _newSelectedItem = i;
84  updateView();
85 }
86 
87 void TraceItemView::saveLayout(const QString&, const QString&)
88 {
89 #if 0
90  qDebug("In '%s', saveLayout not implemented",
91  widget()->name());
92 #endif
93 }
94 
95 void TraceItemView::saveOptions(const QString&, const QString&)
96 {
97 #if 0
98  qDebug("In '%s', saveOptions not implemented",
99  widget()->name());
100 #endif
101 }
102 
103 void TraceItemView::restoreLayout(const QString&, const QString&)
104 {}
105 
106 void TraceItemView::restoreOptions(const QString&, const QString&)
107 {}
108 
109 
110 bool TraceItemView::activate(CostItem* i)
111 {
112  i = canShow(i);
113  if (_activeItem == i) return (i != 0);
114 
115  _newActiveItem = i;
116  updateView();
117 
118  return (i != 0);
119 }
120 
121 TraceFunction* TraceItemView::activeFunction()
122 {
123  if (!_activeItem) return 0;
124 
125  ProfileContext::Type t = _activeItem->type();
126  switch(t) {
127  case ProfileContext::Function:
128  case ProfileContext::FunctionCycle:
129  return (TraceFunction*) _activeItem;
130  default:
131  break;
132  }
133  return 0;
134 }
135 
136 bool TraceItemView::set(int changeType, TraceData* d,
137  EventType* t1, EventType* t2,
138  ProfileContext::Type g, const TracePartList& l,
139  CostItem* a, CostItem* s)
140 {
141  _status |= changeType;
142  _newData = d;
143  _newGroupType = g;
144  _newEventType = t1;
145  _newEventType2 = t2;
146  _newPartList = l;
147  _newSelectedItem = s;
148  _newActiveItem = canShow(a);
149  if (!_newActiveItem)
150  _newSelectedItem = 0;
151  updateView();
152 
153  return (_newActiveItem != 0);
154 }
155 
156 
157 bool TraceItemView::isViewVisible()
158 {
159  QWidget* w = widget();
160  if (w)
161  return w->isVisible();
162  return false;
163 }
164 
165 void TraceItemView::setData(TraceData* d)
166 {
167  if (_data == d) return;
168  _newData = d;
169 
170  // invalidate all pointers to old data
171  _activeItem = _newActiveItem = 0;
172  _selectedItem = _newSelectedItem = 0;
173  _eventType = _newEventType = 0;
174  _eventType2 = _newEventType2 = 0;
175  _groupType = _newGroupType = ProfileContext::InvalidType;
176  _partList.clear();
177  _newPartList.clear();
178 
179  // updateView will change this to dataChanged
180  _status = nothingChanged;
181  updateView();
182 }
183 
184 // force: update immediately even if invisible and no change was detected
185 void TraceItemView::updateView(bool force)
186 {
187  if (!_mergeUpdates || force) {
188  _needsUpdate = true;
189  _updateTimer->stop();
190  triggerUpdate(force);
191  return;
192  }
193 
194  // if _needsUpdate is true, an update is already scheduled
195  if (_needsUpdate) return;
196 
197  _needsUpdate = true;
198  _updateTimer->start(1);
199 }
200 
201 
202 void TraceItemView::triggerUpdate(bool force)
203 {
204  // If already updated no need to update again.
205  // This can happen if a update by timer is scheduled, but a "force"d
206  // update is done before the timer triggers
207  if (!_needsUpdate) return;
208  _needsUpdate = false;
209 
210  if (!force) {
211  if (!isViewVisible()) return;
212  }
213 
214  if (_newData != _data) {
215  _status |= dataChanged;
216  _data = _newData;
217  }
218  else {
219  _status &= ~dataChanged;
220 
221  // if there is no data change and data is 0, no update needed
222  if (!_data) return;
223  }
224 
225  if (!(_newPartList == _partList)) {
226  _status |= partsChanged;
227  _partList = _newPartList;
228  }
229  else
230  _status &= ~partsChanged;
231 
232  if (_newActiveItem != _activeItem) {
233 
234  // when setting a new active item, there is no selection
235  _selectedItem = 0;
236 
237  _status |= activeItemChanged;
238  _activeItem = _newActiveItem;
239  }
240  else
241  _status &= ~activeItemChanged;
242 
243  if (_newEventType != _eventType) {
244  _status |= eventTypeChanged;
245  _eventType = _newEventType;
246  }
247  else
248  _status &= ~eventTypeChanged;
249 
250  if (_newEventType2 != _eventType2) {
251  _status |= eventType2Changed;
252  _eventType2 = _newEventType2;
253  }
254  else
255  _status &= ~eventType2Changed;
256 
257  if (_newGroupType != _groupType) {
258  _status |= groupTypeChanged;
259  _groupType = _newGroupType;
260  }
261  else
262  _status &= ~groupTypeChanged;
263 
264 
265  if (_newSelectedItem != _selectedItem) {
266  _status |= selectedItemChanged;
267  _selectedItem = _newSelectedItem;
268  }
269  else
270  _status &= ~selectedItemChanged;
271 
272 
273  if (!force && (_status == nothingChanged)) return;
274 
275 #if TRACE_UPDATES
276  qDebug() << (widget() ? widget()->name() : "TraceItemView")
277  << "::doUpdate ( "
278  << ((_status & dataChanged) ? "data ":"")
279  << ((_status & configChanged) ? "config ":"")
280  << ")";
281 
282  if (_status & partsChanged)
283  qDebug() << " Part List "
284  << _partList.names();
285 
286  if (_status & eventTypeChanged)
287  qDebug() << " Cost type "
288  << (_eventType ? qPrintable( _eventType->name() ) : "?");
289 
290  if (_status & eventType2Changed)
291  qDebug() << " Cost type 2 "
292  << (_eventType2 ? qPrintable( _eventType2->name() ) : "?");
293 
294  if (_status & groupTypeChanged)
295  qDebug() << " Group type "
296  << ProfileContext::typeName(_groupType);
297 
298  if (_status & activeItemChanged)
299  qDebug() << " Active: "
300  << (_activeItem ? qPrintable( _activeItem->fullName() ) : "?");
301 
302  if (_status & selectedItemChanged)
303  qDebug() << " Selected: "
304  << (_selectedItem ? qPrintable( _selectedItem->fullName() ) : "?");
305 #endif
306 
307  int st = _status;
308  _status = nothingChanged;
309  doUpdate(st, force);
310 }
311 
312 
313 void TraceItemView::selected(TraceItemView* /*sender*/, CostItem* i)
314 {
315 #if TRACE_UPDATES
316  qDebug() << (widget() ? widget()->name() : "TraceItemView")
317  << "::selected "
318  << (i ? qPrintable( i->name() ): "(nil)")
319  << ", sender "
320  << sender->widget()->name() << endl;
321 #endif
322 
323  if (_parentView) _parentView->selected(this, i);
324 }
325 
326 void TraceItemView::partsSelected(TraceItemView* /*sender*/, const TracePartList& l)
327 {
328 #if TRACE_UPDATES
329  qDebug() << (widget() ? widget()->name() : "TraceItemView")
330  << "::selected "
331  << l.names()
332  << ", sender "
333  << sender->widget()->name();
334 #endif
335 
336  if (_parentView)
337  _parentView->partsSelected(this, l);
338  else
339  if (_topLevel) _topLevel->activePartsChangedSlot(l);
340 }
341 
342 void TraceItemView::activated(TraceItemView* /*sender*/, CostItem* i)
343 {
344 #if TRACE_UPDATES
345  qDebug() << (widget() ? widget()->name() : "TraceItemView")
346  << "::activated "
347  << (i ? qPrintable( i->name() ) : "(nil)")
348  << ", sender "
349  << sender->widget()->name();
350 #endif
351 
352  if (_parentView)
353  _parentView->activated(this, i);
354  else
355  if (_topLevel) _topLevel->setTraceItemDelayed(i);
356 }
357 
358 void TraceItemView::selectedEventType(TraceItemView*, EventType* t)
359 {
360  if (_parentView)
361  _parentView->selectedEventType(this, t);
362  else
363  if (_topLevel) _topLevel->setEventTypeDelayed(t);
364 }
365 
366 void TraceItemView::selectedEventType2(TraceItemView*, EventType* t)
367 {
368  if (_parentView)
369  _parentView->selectedEventType2(this, t);
370  else
371  if (_topLevel) _topLevel->setEventType2Delayed(t);
372 }
373 
374 void TraceItemView::selectedGroupType(TraceItemView*, ProfileContext::Type t)
375 {
376  if (_parentView)
377  _parentView->selectedGroupType(this, t);
378  else
379  if (_topLevel) _topLevel->setGroupTypeDelayed(t);
380 }
381 
382 
383 void TraceItemView::directionActivated(TraceItemView*, TraceItemView::Direction d)
384 {
385  if (_parentView)
386  _parentView->directionActivated(this, d);
387  else
388  if (_topLevel) _topLevel->setDirectionDelayed(d);
389 }
390 
391 void TraceItemView::doUpdate(int, bool)
392 {
393 }
394 
395 void TraceItemView::selected(CostItem* i)
396 {
397  if (_parentView)
398  _parentView->selected(this, i);
399 
400 }
401 
402 void TraceItemView::partsSelected(const TracePartList& l)
403 {
404  if (_parentView)
405  _parentView->partsSelected(this, l);
406  else
407  if (_topLevel) _topLevel->activePartsChangedSlot(l);
408 }
409 
410 void TraceItemView::activated(CostItem* i)
411 {
412 #if TRACE_UPDATES
413  qDebug() << (widget() ? widget()->name() : "TraceItemView")
414  << "::activated "
415  << (i ? qPrintable( i->name() ): "(nil)");
416 #endif
417 
418  if (_parentView)
419  _parentView->activated(this, i);
420  else
421  if (_topLevel) _topLevel->setTraceItemDelayed(i);
422 }
423 
424 void TraceItemView::selectedEventType(EventType* t)
425 {
426  if (_parentView)
427  _parentView->selectedEventType(this, t);
428  else
429  if (_topLevel) _topLevel->setEventTypeDelayed(t);
430 }
431 
432 void TraceItemView::selectedEventType2(EventType* t)
433 {
434  if (_parentView)
435  _parentView->selectedEventType2(this, t);
436  else
437  if (_topLevel) _topLevel->setEventType2Delayed(t);
438 }
439 
440 void TraceItemView::selectedGroupType(ProfileContext::Type t)
441 {
442  if (_parentView)
443  _parentView->selectedGroupType(this, t);
444  else
445  if (_topLevel) _topLevel->setGroupTypeDelayed(t);
446 }
447 
448 void TraceItemView::directionActivated(TraceItemView::Direction d)
449 {
450  if (_parentView)
451  _parentView->directionActivated(this, d);
452  else
453  if (_topLevel) _topLevel->setDirectionDelayed(d);
454 }
455 
456 void TraceItemView::addEventTypeMenu(QMenu* p, bool withCost2)
457 {
458  if (_topLevel) _topLevel->addEventTypeMenu(p, withCost2);
459 }
460 
461 void TraceItemView::addGoMenu(QMenu* p)
462 {
463  if (_topLevel) _topLevel->addGoMenu(p);
464 }
465 
466 #include "traceitemview.moc"
TraceItemView::TraceItemView
TraceItemView(TraceItemView *parentView, TopLevelBase *top=0)
Definition: traceitemview.cpp:48
TraceItemView::selectedItemChanged
Definition: traceitemview.h:86
TraceItemView::_topLevel
TopLevelBase * _topLevel
Definition: traceitemview.h:207
TraceItemView::_parentView
TraceItemView * _parentView
Definition: traceitemview.h:206
TraceItemView::_selectedItem
CostItem * _selectedItem
Definition: traceitemview.h:211
TraceItemView::selectedEventType2
virtual void selectedEventType2(TraceItemView *sender, EventType *)
Definition: traceitemview.cpp:366
ProfileContext::FunctionCycle
Definition: context.h:46
TopLevelBase::addEventTypeMenu
virtual void addEventTypeMenu(QMenu *, bool)=0
TopLevelBase::setEventTypeDelayed
virtual void setEventTypeDelayed(EventType *)=0
TraceItemView::set
void set(ProfileContext::Type g)
Definition: traceitemview.h:115
TraceItemView::partsSelected
virtual void partsSelected(TraceItemView *sender, const TracePartList &)
Definition: traceitemview.cpp:326
TraceItemView::directionActivated
virtual void directionActivated(TraceItemView *sender, Direction)
Definition: traceitemview.cpp:383
ProfileContext::typeName
static QString typeName(Type)
Definition: context.cpp:62
TraceItemView::addEventTypeMenu
void addEventTypeMenu(QMenu *, bool withCost2=true)
Definition: traceitemview.cpp:456
CostItem::type
ProfileContext::Type type() const
Definition: costitem.h:45
TraceItemView::configChanged
Definition: traceitemview.h:88
QWidget
TraceFunction
A traced function.
Definition: tracedata.h:1122
TraceItemView::_data
TraceData * _data
Definition: traceitemview.h:209
TraceItemView::addGoMenu
void addGoMenu(QMenu *)
Definition: traceitemview.cpp:461
TraceItemView::restoreLayout
virtual void restoreLayout(const QString &prefix, const QString &postfix)
Definition: traceitemview.cpp:103
CostItem
Base class for cost items.
Definition: costitem.h:37
TraceItemView::updateView
void updateView(bool force=false)
Definition: traceitemview.cpp:185
traceitemview.h
TraceItemView::activeFunction
TraceFunction * activeFunction()
Definition: traceitemview.cpp:121
TraceItemView::_groupType
ProfileContext::Type _groupType
Definition: traceitemview.h:213
TraceItemView::whatsThis
virtual QString whatsThis() const
Definition: traceitemview.cpp:74
EventType
A cost type, e.g.
Definition: eventtype.h:43
TraceItemView::_eventType2
EventType * _eventType2
Definition: traceitemview.h:212
TraceItemView
Abstract Base Class for KCachegrind Views.
Definition: traceitemview.h:70
TraceItemView::setData
virtual void setData(TraceData *d)
Definition: traceitemview.cpp:165
TraceItemView::_eventType
EventType * _eventType
Definition: traceitemview.h:212
TraceItemView::partsChanged
Definition: traceitemview.h:84
toplevelbase.h
TraceItemView::dataChanged
Definition: traceitemview.h:87
CostItem::name
virtual QString name() const
Returns dynamic name info (without type)
Definition: costitem.cpp:53
TopLevelBase
Definition: toplevelbase.h:34
TopLevelBase::activePartsChangedSlot
virtual void activePartsChangedSlot(const TracePartList &list)=0
CostItem::fullName
QString fullName() const
Returns type name + dynamic name.
Definition: costitem.cpp:76
TraceItemView::canShow
virtual CostItem * canShow(CostItem *i)
This function is called when a new item should become active.
Definition: traceitemview.h:182
TraceItemView::topLevel
TopLevelBase * topLevel() const
Definition: traceitemview.h:161
TraceItemView::nothingChanged
Definition: traceitemview.h:80
TraceItemView::_activeItem
CostItem * _activeItem
Definition: traceitemview.h:211
TraceItemView::activate
bool activate(CostItem *i)
Definition: traceitemview.cpp:110
TraceItemView::eventTypeChanged
Definition: traceitemview.h:81
TopLevelBase::setTraceItemDelayed
virtual void setTraceItemDelayed(CostItem *)=0
TraceItemView::selected
virtual void selected(TraceItemView *sender, CostItem *)
Notification from child views.
Definition: traceitemview.cpp:313
TopLevelBase::addGoMenu
virtual void addGoMenu(QMenu *)=0
TraceItemView::activated
virtual void activated(TraceItemView *sender, CostItem *)
Definition: traceitemview.cpp:342
TraceItemView::TraceItemViewUpdateTimer
friend class TraceItemViewUpdateTimer
Definition: traceitemview.h:72
TraceItemView::isViewVisible
virtual bool isViewVisible()
Definition: traceitemview.cpp:157
TraceItemView::saveLayout
virtual void saveLayout(const QString &prefix, const QString &postfix)
Definition: traceitemview.cpp:87
TopLevelBase::setDirectionDelayed
virtual void setDirectionDelayed(TraceItemView::Direction)=0
TraceItemView::~TraceItemView
virtual ~TraceItemView()
Definition: traceitemview.cpp:69
TraceItemView::saveOptions
virtual void saveOptions(const QString &prefix, const QString &postfix)
Definition: traceitemview.cpp:95
TraceItemView::restoreOptions
virtual void restoreOptions(const QString &prefix, const QString &postfix)
Definition: traceitemview.cpp:106
TraceItemView::doUpdate
virtual void doUpdate(int changeType, bool force)
Definition: traceitemview.cpp:391
TraceItemView::activeItemChanged
Definition: traceitemview.h:85
TraceItemView::Direction
Direction
Definition: traceitemview.h:90
ProfileContext::Type
Type
Definition: context.h:36
TraceItemViewUpdateTimer::TraceItemViewUpdateTimer
TraceItemViewUpdateTimer(TraceItemView *view)
Definition: traceitemview.cpp:34
TraceItemView::Hidden
Definition: traceitemview.h:93
TraceItemView::groupTypeChanged
Definition: traceitemview.h:83
TracePartList
QList< TracePart * > TracePartList
Definition: tracedata.h:176
TraceItemView::eventType2Changed
Definition: traceitemview.h:82
TraceItemView::widget
virtual QWidget * widget()=0
TraceData
This class holds profiling data of multiple tracefiles generated with cachegrind on one command...
Definition: tracedata.h:1363
TraceItemView::select
void select(CostItem *i)
Definition: traceitemview.cpp:79
TraceItemView::selectedGroupType
virtual void selectedGroupType(TraceItemView *sender, ProfileContext::Type)
Definition: traceitemview.cpp:374
TopLevelBase::setGroupTypeDelayed
virtual void setGroupTypeDelayed(ProfileContext::Type)=0
TraceItemView::_partList
TracePartList _partList
Definition: traceitemview.h:210
TraceItemView::selectedEventType
virtual void selectedEventType(TraceItemView *sender, EventType *)
Definition: traceitemview.cpp:358
TopLevelBase::setEventType2Delayed
virtual void setEventType2Delayed(EventType *)=0
EventType::name
const QString & name()
Definition: eventtype.h:65
ProfileContext::Function
Definition: context.h:46
ProfileContext::InvalidType
Definition: context.h:37
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:03:27 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kcachegrind

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

kdesdk API Reference

Skip menu "kdesdk API Reference"
  • kapptemplate
  • kcachegrind
  • kompare
  • lokalize
  • okteta
  • 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