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

kcachegrind

  • sources
  • kde-4.14
  • 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 <QtGlobal>
26 #include <QWidget>
27 
28 #include "toplevelbase.h"
29 
30 #define TRACE_UPDATES 0
31 
32 
33 // TraceItemViewUpdateTimer
34 
35 TraceItemViewUpdateTimer::TraceItemViewUpdateTimer(TraceItemView* view)
36 {
37  _view = view;
38  setSingleShot(true);
39  connect(this, SIGNAL(timeout()), this, SLOT(timeoutTriggered()));
40 }
41 
42 void TraceItemViewUpdateTimer::timeoutTriggered()
43 {
44  _view->triggerUpdate(false);
45 }
46 
47 // TraceItemView
48 
49 TraceItemView::TraceItemView(TraceItemView* parentView, TopLevelBase* top)
50 {
51  _parentView = parentView;
52  _topLevel = top ? top : parentView->topLevel();
53 
54  _data = _newData = 0;
55  // _partList and _newPartList is empty
56  _activeItem = _newActiveItem = 0;
57  _selectedItem = _newSelectedItem = 0;
58  _eventType = _newEventType = 0;
59  _eventType2 = _newEventType2 = 0;
60  _groupType = _newGroupType = ProfileContext::InvalidType;
61 
62  _status = nothingChanged;
63  _needsUpdate = false;
64  _pos = Hidden;
65 
66  _mergeUpdates = true;
67  _updateTimer = new TraceItemViewUpdateTimer(this);
68 }
69 
70 TraceItemView::~TraceItemView()
71 {
72  delete _updateTimer;
73 }
74 
75 QString TraceItemView::whatsThis() const
76 {
77  return QObject::tr("No description available");
78 }
79 
80 void TraceItemView::select(CostItem* i)
81 {
82  if (_selectedItem == i) return;
83 
84  _newSelectedItem = i;
85  updateView();
86 }
87 
88 void TraceItemView::saveLayout(const QString&, const QString&)
89 {
90 #if 0
91  qDebug("In '%s', saveLayout not implemented",
92  widget()->name());
93 #endif
94 }
95 
96 void TraceItemView::saveOptions(const QString&, const QString&)
97 {
98 #if 0
99  qDebug("In '%s', saveOptions not implemented",
100  widget()->name());
101 #endif
102 }
103 
104 void TraceItemView::restoreLayout(const QString&, const QString&)
105 {}
106 
107 void TraceItemView::restoreOptions(const QString&, const QString&)
108 {}
109 
110 
111 bool TraceItemView::activate(CostItem* i)
112 {
113  _newActiveItem = canShow(i);
114  if (_activeItem != _newActiveItem) {
115  // new item activated, start with empty selection
116  _newSelectedItem = 0;
117  updateView();
118  }
119 
120  return (_newActiveItem != 0);
121 }
122 
123 TraceFunction* TraceItemView::activeFunction()
124 {
125  if (!_activeItem) return 0;
126 
127  ProfileContext::Type t = _activeItem->type();
128  switch(t) {
129  case ProfileContext::Function:
130  case ProfileContext::FunctionCycle:
131  return (TraceFunction*) _activeItem;
132  default:
133  break;
134  }
135  return 0;
136 }
137 
138 bool TraceItemView::set(int changeType, TraceData* d,
139  EventType* t1, EventType* t2,
140  ProfileContext::Type g, const TracePartList& l,
141  CostItem* a, CostItem* s)
142 {
143  _status |= changeType;
144  _newData = d;
145  _newGroupType = g;
146  _newEventType = t1;
147  _newEventType2 = t2;
148  _newPartList = l;
149  _newSelectedItem = s;
150  _newActiveItem = canShow(a);
151  if (_activeItem != _newActiveItem) {
152  // new item activated, start with empty selection
153  _newSelectedItem = 0;
154  }
155  updateView();
156 
157  return (_newActiveItem != 0);
158 }
159 
160 
161 bool TraceItemView::isViewVisible()
162 {
163  QWidget* w = widget();
164  if (w)
165  return w->isVisible();
166  return false;
167 }
168 
169 void TraceItemView::setData(TraceData* d)
170 {
171  if (_data == d) return;
172  _newData = d;
173 
174  // invalidate all pointers to old data
175  _activeItem = _newActiveItem = 0;
176  _selectedItem = _newSelectedItem = 0;
177  _eventType = _newEventType = 0;
178  _eventType2 = _newEventType2 = 0;
179  _groupType = _newGroupType = ProfileContext::InvalidType;
180  _partList.clear();
181  _newPartList.clear();
182 
183  // updateView will change this to dataChanged
184  _status = nothingChanged;
185  updateView();
186 }
187 
188 // force: update immediately even if invisible and no change was detected
189 void TraceItemView::updateView(bool force)
190 {
191  if (!_mergeUpdates || force) {
192  _needsUpdate = true;
193  _updateTimer->stop();
194  triggerUpdate(force);
195  return;
196  }
197 
198  // if _needsUpdate is true, an update is already scheduled
199  if (_needsUpdate) return;
200 
201  _needsUpdate = true;
202  _updateTimer->start(1);
203 }
204 
205 
206 void TraceItemView::triggerUpdate(bool force)
207 {
208  // If already updated no need to update again.
209  // This can happen if a update by timer is scheduled, but a "force"d
210  // update is done before the timer triggers
211  if (!_needsUpdate) return;
212  _needsUpdate = false;
213 
214  if (!force) {
215  if (!isViewVisible()) return;
216  }
217 
218  if (_newData != _data) {
219  _status |= dataChanged;
220  _data = _newData;
221  }
222  else {
223  _status &= ~dataChanged;
224 
225  // if there is no data change and data is 0, no update needed
226  if (!_data) return;
227  }
228 
229  if (!(_newPartList == _partList)) {
230  _status |= partsChanged;
231  _partList = _newPartList;
232  }
233  else
234  _status &= ~partsChanged;
235 
236  if (_newActiveItem != _activeItem) {
237 
238  // when setting a new active item, there is no selection
239  _selectedItem = 0;
240 
241  _status |= activeItemChanged;
242  _activeItem = _newActiveItem;
243  }
244  else
245  _status &= ~activeItemChanged;
246 
247  if (_newEventType != _eventType) {
248  _status |= eventTypeChanged;
249  _eventType = _newEventType;
250  }
251  else
252  _status &= ~eventTypeChanged;
253 
254  if (_newEventType2 != _eventType2) {
255  _status |= eventType2Changed;
256  _eventType2 = _newEventType2;
257  }
258  else
259  _status &= ~eventType2Changed;
260 
261  if (_newGroupType != _groupType) {
262  _status |= groupTypeChanged;
263  _groupType = _newGroupType;
264  }
265  else
266  _status &= ~groupTypeChanged;
267 
268 
269  if (_newSelectedItem != _selectedItem) {
270  _status |= selectedItemChanged;
271  _selectedItem = _newSelectedItem;
272  }
273  else
274  _status &= ~selectedItemChanged;
275 
276 
277  if (!force && (_status == nothingChanged)) return;
278 
279 #if TRACE_UPDATES
280  qDebug("%s::doUpate",
281  widget() ? qPrintable(widget()->objectName()) : "TraceItemView");
282 
283  if (_status & dataChanged)
284  qDebug(" data changed");
285 
286  if (_status & configChanged)
287  qDebug(" config changed");
288 
289  if (_status & partsChanged)
290  qDebug(" parts changed: %s", qPrintable(_partList[0]->name()) );
291 
292  if (_status & eventTypeChanged)
293  qDebug(" event type 1 changed: %s",
294  _eventType ? qPrintable( _eventType->name() ) : "(None)");
295 
296  if (_status & eventType2Changed)
297  qDebug(" event type 2 changed: %s",
298  _eventType2 ? qPrintable( _eventType2->name() ) : "(None)");
299 
300  if (_status & groupTypeChanged)
301  qDebug(" group type changed: %s",
302  qPrintable(ProfileContext::typeName(_groupType)));
303 
304  if (_status & activeItemChanged)
305  qDebug(" active item changed: %s",
306  _activeItem ? qPrintable( _activeItem->fullName() ) : "(none)");
307 
308  if (_status & selectedItemChanged)
309  qDebug(" selected item changed: %s",
310  _selectedItem ? qPrintable( _selectedItem->fullName() ) : "(none)");
311 #endif
312 
313  int st = _status;
314  _status = nothingChanged;
315  doUpdate(st, force);
316 }
317 
318 
319 void TraceItemView::selected(TraceItemView* /*sender*/, CostItem* i)
320 {
321 #if 0 // TRACE_UPDATES
322  qDebug("%s::selected( item %s, sender %s )",
323  widget() ? qPrintable(widget()->objectName()) : "TraceItemView",
324  i ? qPrintable( i->name() ): "(none)",
325  qPrintable(sender->widget()->objectName()) );
326 #endif
327 
328  if (_parentView) _parentView->selected(this, i);
329 }
330 
331 void TraceItemView::partsSelected(TraceItemView* /*sender*/, const TracePartList& l)
332 {
333 #if 0 // TRACE_UPDATES
334  qDebug() << (widget() ? widget()->name() : "TraceItemView")
335  << "::selected "
336  << l.names()
337  << ", sender "
338  << sender->widget()->name();
339 #endif
340 
341  if (_parentView)
342  _parentView->partsSelected(this, l);
343  else
344  if (_topLevel) _topLevel->activePartsChangedSlot(l);
345 }
346 
347 void TraceItemView::activated(TraceItemView* /*sender*/, CostItem* i)
348 {
349 #if 0 // TRACE_UPDATES
350  qDebug("%s::activated( item %s, sender %s )",
351  widget() ? qPrintable(widget()->objectName()) : "TraceItemView",
352  i ? qPrintable( i->name() ): "(none)",
353  qPrintable(sender->widget()->objectName()) );
354 #endif
355 
356  if (_parentView)
357  _parentView->activated(this, i);
358  else
359  if (_topLevel) _topLevel->setTraceItemDelayed(i);
360 }
361 
362 void TraceItemView::selectedEventType(TraceItemView*, EventType* t)
363 {
364  if (_parentView)
365  _parentView->selectedEventType(this, t);
366  else
367  if (_topLevel) _topLevel->setEventTypeDelayed(t);
368 }
369 
370 void TraceItemView::selectedEventType2(TraceItemView*, EventType* t)
371 {
372  if (_parentView)
373  _parentView->selectedEventType2(this, t);
374  else
375  if (_topLevel) _topLevel->setEventType2Delayed(t);
376 }
377 
378 void TraceItemView::selectedGroupType(TraceItemView*, ProfileContext::Type t)
379 {
380  if (_parentView)
381  _parentView->selectedGroupType(this, t);
382  else
383  if (_topLevel) _topLevel->setGroupTypeDelayed(t);
384 }
385 
386 
387 void TraceItemView::directionActivated(TraceItemView*, TraceItemView::Direction d)
388 {
389  if (_parentView)
390  _parentView->directionActivated(this, d);
391  else
392  if (_topLevel) _topLevel->setDirectionDelayed(d);
393 }
394 
395 void TraceItemView::doUpdate(int, bool)
396 {
397 }
398 
399 void TraceItemView::selected(CostItem* i)
400 {
401 #if TRACE_UPDATES
402  qDebug("%s::selected( item %s )",
403  widget() ? qPrintable(widget()->objectName()) : "TraceItemView",
404  i ? qPrintable( i->name() ): "(none)" );
405 #endif
406 
407  if (_parentView)
408  _parentView->selected(this, i);
409 
410 }
411 
412 void TraceItemView::partsSelected(const TracePartList& l)
413 {
414  if (_parentView)
415  _parentView->partsSelected(this, l);
416  else
417  if (_topLevel) _topLevel->activePartsChangedSlot(l);
418 }
419 
420 void TraceItemView::activated(CostItem* i)
421 {
422 #if TRACE_UPDATES
423  qDebug("%s::activated( item %s )",
424  widget() ? qPrintable(widget()->objectName()) : "TraceItemView",
425  i ? qPrintable( i->name() ): "(none)" );
426 #endif
427 
428  if (_parentView)
429  _parentView->activated(this, i);
430  else
431  if (_topLevel) _topLevel->setTraceItemDelayed(i);
432 }
433 
434 void TraceItemView::selectedEventType(EventType* t)
435 {
436  if (_parentView)
437  _parentView->selectedEventType(this, t);
438  else
439  if (_topLevel) _topLevel->setEventTypeDelayed(t);
440 }
441 
442 void TraceItemView::selectedEventType2(EventType* t)
443 {
444  if (_parentView)
445  _parentView->selectedEventType2(this, t);
446  else
447  if (_topLevel) _topLevel->setEventType2Delayed(t);
448 }
449 
450 void TraceItemView::selectedGroupType(ProfileContext::Type t)
451 {
452  if (_parentView)
453  _parentView->selectedGroupType(this, t);
454  else
455  if (_topLevel) _topLevel->setGroupTypeDelayed(t);
456 }
457 
458 void TraceItemView::directionActivated(TraceItemView::Direction d)
459 {
460  if (_parentView)
461  _parentView->directionActivated(this, d);
462  else
463  if (_topLevel) _topLevel->setDirectionDelayed(d);
464 }
465 
466 void TraceItemView::addEventTypeMenu(QMenu* p, bool withCost2)
467 {
468  if (_topLevel) _topLevel->addEventTypeMenu(p, withCost2);
469 }
470 
471 void TraceItemView::addGoMenu(QMenu* p)
472 {
473  if (_topLevel) _topLevel->addGoMenu(p);
474 }
475 
476 #include "traceitemview.moc"
TraceItemView::TraceItemView
TraceItemView(TraceItemView *parentView, TopLevelBase *top=0)
Definition: traceitemview.cpp:49
TraceItemView::selectedItemChanged
Definition: traceitemview.h:86
QList::clear
void clear()
TraceItemView::_topLevel
TopLevelBase * _topLevel
Definition: traceitemview.h:207
QWidget
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:370
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:331
TraceItemView::directionActivated
virtual void directionActivated(TraceItemView *sender, Direction)
Definition: traceitemview.cpp:387
ProfileContext::typeName
static QString typeName(Type)
Definition: context.cpp:62
TraceItemView::addEventTypeMenu
void addEventTypeMenu(QMenu *, bool withCost2=true)
Definition: traceitemview.cpp:466
CostItem::type
ProfileContext::Type type() const
Definition: costitem.h:45
TraceItemView::configChanged
Definition: traceitemview.h:88
TraceFunction
A traced function.
Definition: tracedata.h:1122
TraceItemView::_data
TraceData * _data
Definition: traceitemview.h:209
TraceItemView::addGoMenu
void addGoMenu(QMenu *)
Definition: traceitemview.cpp:471
QWidget::isVisible
bool isVisible() const
TraceItemView::restoreLayout
virtual void restoreLayout(const QString &prefix, const QString &postfix)
Definition: traceitemview.cpp:104
CostItem
Base class for cost items.
Definition: costitem.h:37
TraceItemView::updateView
void updateView(bool force=false)
Definition: traceitemview.cpp:189
traceitemview.h
TraceItemView::activeFunction
TraceFunction * activeFunction()
Definition: traceitemview.cpp:123
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
TraceItemView::_groupType
ProfileContext::Type _groupType
Definition: traceitemview.h:213
TraceItemView::whatsThis
virtual QString whatsThis() const
Definition: traceitemview.cpp:75
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:169
QTimer::timeout
void timeout()
TraceItemView::_eventType
EventType * _eventType
Definition: traceitemview.h:212
QObject::name
const char * name() const
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)
Called when a new item is about to 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:111
QString
QList< TracePart * >
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:319
QMenu
TopLevelBase::addGoMenu
virtual void addGoMenu(QMenu *)=0
TraceItemView::activated
virtual void activated(TraceItemView *sender, CostItem *)
Definition: traceitemview.cpp:347
TraceItemView::TraceItemViewUpdateTimer
friend class TraceItemViewUpdateTimer
Definition: traceitemview.h:72
TraceItemView::isViewVisible
virtual bool isViewVisible()
Definition: traceitemview.cpp:161
QTimer::stop
void stop()
TraceItemView::saveLayout
virtual void saveLayout(const QString &prefix, const QString &postfix)
Definition: traceitemview.cpp:88
TopLevelBase::setDirectionDelayed
virtual void setDirectionDelayed(TraceItemView::Direction)=0
TraceItemView::~TraceItemView
virtual ~TraceItemView()
Definition: traceitemview.cpp:70
TraceItemView::saveOptions
virtual void saveOptions(const QString &prefix, const QString &postfix)
Definition: traceitemview.cpp:96
TraceItemView::restoreOptions
virtual void restoreOptions(const QString &prefix, const QString &postfix)
Definition: traceitemview.cpp:107
TraceItemView::doUpdate
virtual void doUpdate(int changeType, bool force)
Definition: traceitemview.cpp:395
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:35
TraceItemView::Hidden
Definition: traceitemview.h:93
TraceItemView::groupTypeChanged
Definition: traceitemview.h:83
QTimer::start
void start(int msec)
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:80
TraceItemView::selectedGroupType
virtual void selectedGroupType(TraceItemView *sender, ProfileContext::Type)
Definition: traceitemview.cpp:378
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
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:362
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
QTimer::setSingleShot
void setSingleShot(bool singleShot)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:39:50 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
  • 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