You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
5.9 KiB
225 lines
5.9 KiB
/* This file is part of KCachegrind.
|
|
Copyright (C) 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
|
|
|
|
KCachegrind is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public
|
|
License as published by the Free Software Foundation, version 2.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; see the file COPYING. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
/*
|
|
* MultiView, enclosing multiple TabView's with a user choosable
|
|
* active view (i.e. focus), separated by a splitter.
|
|
* Selection of the active view is shown in the next to the right view
|
|
* (with wrap around).
|
|
*/
|
|
|
|
#include <tqobjectlist.h>
|
|
#include <tdeconfig.h>
|
|
#include <kdebug.h>
|
|
|
|
#include "multiview.h"
|
|
#include "tabview.h"
|
|
|
|
//
|
|
// MultiView
|
|
//
|
|
|
|
MultiView::MultiView(TopLevel* top, TQWidget* parent, const char* name)
|
|
: TQSplitter(parent, name), TraceItemView(0, top)
|
|
{
|
|
// default
|
|
setOrientation(TQt::Horizontal);
|
|
|
|
appendView();
|
|
_active = _views.first();
|
|
_active->setActive(true);
|
|
}
|
|
|
|
void MultiView::setData(TraceData* d)
|
|
{
|
|
TraceItemView::setData(d);
|
|
|
|
TabView* tv;
|
|
for(tv=_views.first(); tv; tv=_views.next())
|
|
tv->setData(d);
|
|
}
|
|
|
|
void MultiView::setChildCount(int n)
|
|
{
|
|
while(n< (int)_views.count()) removeView();
|
|
while(n> (int)_views.count()) appendView();
|
|
}
|
|
|
|
void MultiView::appendView()
|
|
{
|
|
int n = _views.count()+1;
|
|
|
|
TabView* tv = new TabView(this, this,
|
|
TQString("TabView-%1").arg(n).ascii());
|
|
connect(tv, TQT_SIGNAL(activated(TabView*)),
|
|
this, TQT_SLOT(tabActivated(TabView*)) );
|
|
_views.append(tv);
|
|
tv->show();
|
|
|
|
// set same attributes as in active view
|
|
tv->set(0, _data, _costType, _costType2,
|
|
_groupType, _partList, _activeItem, 0);
|
|
tv->updateView();
|
|
|
|
if (0) kdDebug() << "MultiView::appendView, now "
|
|
<< _views.count() << endl;
|
|
}
|
|
|
|
void MultiView::removeView()
|
|
{
|
|
if (_views.count()<=1) return;
|
|
|
|
TabView* last = _views.last();
|
|
|
|
// if last tab is active, make first active
|
|
if (last == _active) {
|
|
TabView* newActive = _views.first();
|
|
newActive->setActive(true);
|
|
tabActivated(newActive);
|
|
}
|
|
|
|
_views.removeRef(last);
|
|
delete last;
|
|
|
|
if (0) kdDebug() << "MultiView::removeView, now "
|
|
<< _views.count() << endl;
|
|
}
|
|
|
|
|
|
void MultiView::tabActivated(TabView* newActiveTab)
|
|
{
|
|
if (_active == newActiveTab) return;
|
|
|
|
if (0) kdDebug() << "MultiView::tabActivated "
|
|
<< newActiveTab->name() << endl;
|
|
|
|
TraceItem* oldActiveItem = 0;
|
|
if (_active) {
|
|
oldActiveItem = _active->activeItem();
|
|
_active->setActive(false);
|
|
}
|
|
_active = newActiveTab;
|
|
|
|
// make the active item of the new TabView active
|
|
if (_active && (oldActiveItem != _active->activeItem()))
|
|
TraceItemView::activated(_active->activeItem());
|
|
}
|
|
|
|
void MultiView::selected(TraceItemView* sender, TraceItem* i)
|
|
{
|
|
if (0) kdDebug() << "MultiView::selected " << i->name()
|
|
<< ", sender " << sender->widget()->name() << endl;
|
|
|
|
// we react only on selection changes of the active TabView
|
|
if (sender != (TraceItemView*)_active) return;
|
|
|
|
_views.findRef(_active);
|
|
TabView* next = _views.next();
|
|
if (!next) next = _views.first();
|
|
|
|
// don't change item of active tab
|
|
if (next == _active) return;
|
|
|
|
next->activate(i);
|
|
next->updateView();
|
|
}
|
|
|
|
void MultiView::activated(TraceItemView* sender, TraceItem* i)
|
|
{
|
|
if (0) kdDebug() << "MultiView::activated " << i->name()
|
|
<< ", sender " << sender->widget()->name() << endl;
|
|
|
|
// we react only on selection changes of the active TabView
|
|
if (sender != (TraceItemView*)_active) return;
|
|
|
|
TraceItemView::activated(sender,i);
|
|
}
|
|
|
|
void MultiView::doUpdate(int changeType)
|
|
{
|
|
TabView* tv;
|
|
for(tv=_views.first(); tv; tv=_views.next()) {
|
|
tv->set(changeType, _data, _costType, _costType2,
|
|
_groupType, _partList,
|
|
(tv == _active) ? _activeItem : tv->activeItem(),
|
|
tv->selectedItem());
|
|
tv->notifyChange(changeType);
|
|
if (tv->isViewVisible())
|
|
tv->updateView();
|
|
}
|
|
}
|
|
|
|
|
|
void MultiView::readViewConfig(TDEConfig* c,
|
|
TQString prefix, TQString postfix,
|
|
bool withOptions)
|
|
{
|
|
if (0) tqDebug("%s::readConfig(%s%s)", name(),
|
|
prefix.ascii(), postfix.ascii());
|
|
|
|
TQString active;
|
|
TDEConfigGroup* g = configGroup(c, prefix, postfix);
|
|
int n = g->readNumEntry("Panels", 1);
|
|
setChildCount(n);
|
|
setOrientation( (g->readEntry("Orientation") == TQString("Horizontal")) ?
|
|
TQt::Horizontal : TQt::Vertical );
|
|
|
|
setSizes(g->readIntListEntry("PanelSizes"));
|
|
|
|
active = g->readEntry("ActivePanel", "");
|
|
delete g;
|
|
|
|
TabView* tv, *activeTV = 0;
|
|
for(tv=_views.first();tv;tv=_views.next()) {
|
|
if (tv->name() == active) activeTV=tv;
|
|
tv->readViewConfig(c, TQString("%1-%2").arg(prefix).arg(tv->name()),
|
|
postfix, withOptions);
|
|
}
|
|
|
|
// activate panel after restoring
|
|
if (!activeTV) activeTV = _views.first();
|
|
|
|
if (_active == activeTV)
|
|
TraceItemView::activated(_active->activeItem());
|
|
else
|
|
activeTV->setActive(true);
|
|
}
|
|
|
|
void MultiView::saveViewConfig(TDEConfig* c,
|
|
TQString prefix, TQString postfix,
|
|
bool withOptions)
|
|
{
|
|
TDEConfigGroup g(c, (prefix+postfix).ascii());
|
|
|
|
g.writeEntry("Panels", childCount());
|
|
g.writeEntry("Orientation",
|
|
(orientation() == TQt::Horizontal) ?
|
|
"Horizontal" : "Vertical");
|
|
|
|
g.writeEntry("PanelSizes", sizes());
|
|
g.writeEntry("ActivePanel", _active ? _active->name() : "none");
|
|
|
|
TabView* tv;
|
|
for(tv=_views.first();tv;tv=_views.next())
|
|
tv->saveViewConfig(c, TQString("%1-%2").arg(prefix).arg(tv->name()),
|
|
postfix, withOptions);
|
|
}
|
|
|
|
|
|
#include "multiview.moc"
|