kde-workspace/plasma/applets/system-monitor/applet.cpp
Ivailo Monev efbde9e504 plasma: organize sub-directories
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2015-12-24 22:48:47 +02:00

428 lines
11 KiB
C++

/*
* Copyright (C) 2007 Petri Damsten <damu@iki.fi>
* Copyright (C) 2010 Michel Lafon-Puyo <michel.lafonpuyo@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License version 2 as
* published by the Free Software Foundation
*
* 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 Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "applet.h"
#include <math.h>
#include <Plasma/DataEngine>
#include <Plasma/Containment>
#include <Plasma/Frame>
#include <Plasma/IconWidget>
#include <Plasma/ToolTipManager>
#include <KIcon>
#include <KDebug>
#include <QGraphicsLinearLayout>
namespace SM {
Applet::Applet(QObject *parent, const QVariantList &args)
: Plasma::Applet(parent, args),
m_interval(10000),
m_preferredItemHeight(42),
m_header(0),
m_engine(0),
m_orientation(Qt::Vertical),
m_noSourcesIcon(0),
m_mode(Desktop),
m_mainLayout(0),
m_configSource(0)
{
if (args.count() > 0 && args[0].toString() == "SM") {
m_mode = Monitor;
}
Plasma::ToolTipManager::self()->registerWidget(this);
}
Applet::~Applet()
{
removeLayout();
}
void Applet::constraintsEvent(Plasma::Constraints constraints)
{
if (constraints & Plasma::FormFactorConstraint) {
if (m_mode == Monitor) {
setBackgroundHints(NoBackground);
m_orientation = Qt::Vertical;
} else {
SM::Applet::Mode mode = m_mode;
switch (formFactor()) {
case Plasma::Planar:
case Plasma::MediaCenter:
mode = Desktop;
m_orientation = Qt::Vertical;
break;
case Plasma::Horizontal:
mode = Panel;
m_orientation = Qt::Horizontal;
break;
case Plasma::Vertical:
mode = Panel;
m_orientation = Qt::Vertical;
break;
}
if (mode != m_mode) {
m_mode = mode;
connectToEngine();
}
}
} else if (constraints & Plasma::SizeConstraint) {
checkGeometry();
}
}
void Applet::setTitle(const QString& title)
{
m_title = title;
if (m_header) {
m_header->setText(m_title);
}
}
QGraphicsLinearLayout* Applet::mainLayout()
{
if (!m_mainLayout) {
m_mainLayout = new QGraphicsLinearLayout(m_orientation);
m_mainLayout->setContentsMargins(0, 0, 0, 0);
m_mainLayout->setSpacing(5);
setLayout(m_mainLayout);
}
return m_mainLayout;
}
void Applet::removeLayout()
{
if (!m_mainLayout) {
return;
}
deleteVisualizations();
// reset it to no configuration
// assumes that this only gets called when there's
// > 0 sources.
setConfigurationRequired(false);
delete(m_noSourcesIcon);
m_noSourcesIcon = 0;
delete(m_header);
m_header = 0;
// We delete the layout since it seems to be only way to remove stretch set for some applets.
setLayout(0);
m_mainLayout = 0;
}
void Applet::configureLayout()
{
mainLayout()->setOrientation(m_orientation);
if (m_mode != Panel && !m_header) {
m_header = new Plasma::Frame(this);
m_header->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
m_header->setText(m_title);
mainLayout()->addItem(m_header);
}
}
void Applet::connectToEngine()
{
removeLayout();
configureLayout();
disconnectSources();
if (m_sources.isEmpty()){
displayNoAvailableSources();
constraintsEvent(Plasma::SizeConstraint);
return;
}
foreach (const QString &source, m_sources) {
if (addVisualization(source)) {
connectSource(source);
}
}
mainLayout()->activate();
constraintsEvent(Plasma::SizeConstraint);
}
void Applet::checkGeometry()
{
QSizeF min;
QSizeF pref;
QSizeF max;
int nb_items = 0;
nb_items = m_visualizations.count();
if (nb_items == 0)
nb_items = 1;
if (m_mode != Panel) {
qreal height = 0;
qreal width = MINIMUM;
if (m_header) {
height = m_header->minimumSize().height();
width = m_header->minimumSize().width();
}
min.setHeight(qMax(height + nb_items * MINIMUM,
mainLayout()->minimumSize().height()));
min.setWidth(width + MINIMUM);
pref.setHeight(height + nb_items * m_preferredItemHeight);
pref.setWidth(PREFERRED);
max = QSizeF();
if (m_mode != Monitor) {
min += size() - contentsRect().size();
pref += size() - contentsRect().size();
} else {
// Reset margins
setBackgroundHints(NoBackground);
}
//kDebug() << minSize << m_preferredItemHeight << height
// << m_minimumHeight << metaObject()->className();
setAspectRatioMode(Plasma::IgnoreAspectRatio);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
update();
} else {
int x = 1;
int y = 1;
QSizeF size = containment()->size();
qreal s;
if (m_orientation == Qt::Horizontal) {
x = nb_items;
s = size.height();
} else {
y = nb_items;
s = size.width();
}
min = QSizeF(16 * x, 16 * y);
max = pref = QSizeF(s * x, s * y);
setAspectRatioMode(Plasma::KeepAspectRatio);
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
}
setMinimumSize(min);
setPreferredSize(pref);
setMaximumSize(max);
//kDebug() << min << pref << max << metaObject()->className();
emit geometryChecked();
}
void Applet::connectSource(const QString& source)
{
if (m_engine) {
m_engine->connectSource(source, this, m_interval);
m_connectedSources << source;
}
}
void Applet::disconnectSources()
{
if (m_engine) {
foreach (const QString &source, m_connectedSources) {
m_engine->disconnectSource(source, this);
}
}
m_connectedSources.clear();
}
void Applet::deleteVisualizations()
{
if (!m_mainLayout) {
return;
}
foreach (QWeakPointer<QGraphicsWidget> visualization, m_visualizations) {
delete visualization.data();
}
m_visualizations.clear();
m_toolTips.clear();
}
void Applet::clear()
{
disconnectSources();
removeLayout();
clearSources();
}
void Applet::displayNoAvailableSources()
{
KIcon appletIcon(icon());
m_noSourcesIcon = new Plasma::IconWidget(appletIcon, QString(), this);
mainLayout()->addItem(m_noSourcesIcon);
m_preferredItemHeight = MINIMUM;
setConfigurationRequired(true, i18n("No data sources being displayed"));
}
KConfigGroup Applet::config()
{
if (m_configSource) {
return m_configSource->config();
}
return Plasma::Applet::config();
}
void Applet::save(KConfigGroup &config) const
{
// work around for saveState being protected
if (m_mode != Monitor) {
Plasma::Applet::save(config);
}
}
void Applet::saveConfig(KConfigGroup &config)
{
// work around for saveState being protected
saveState(config);
}
QVariant Applet::itemChange(GraphicsItemChange change, const QVariant &value)
{
if (m_mode == Monitor && change == ItemParentHasChanged) {
QGraphicsWidget *parent = parentWidget();
Plasma::Applet *container = 0;
while (parent) {
container = qobject_cast<Plasma::Applet *>(parent);
if (container) {
break;
}
parent = parent->parentWidget();
}
if (container && container != containment()) {
m_configSource = container;
}
}
// We must be able to change position when in monitor even if not mutable
if (m_mode == Monitor && change == ItemPositionChange) {
return QGraphicsWidget::itemChange(change, value);
} else {
return Plasma::Applet::itemChange(change, value);
}
}
void Applet::toolTipAboutToShow()
{
if (mode() == SM::Applet::Panel) {
if (!m_toolTips.isEmpty()) {
QString html = "<table>";
foreach (const QString& s, m_toolTips.values()) {
if (!s.isEmpty()) {
html += s;
}
}
html += "</table>";
Plasma::ToolTipContent data(title(), html);
Plasma::ToolTipManager::self()->setContent(this, data);
} else {
Plasma::ToolTipManager::self()->clearContent(this);
}
}
}
void Applet::appendVisualization(const QString& source, QGraphicsWidget *visualization)
{
if (m_visualizations.contains(source) && m_visualizations.value(source)) {
delete(m_visualizations[source].data());
}
m_visualizations[source] = visualization;
mainLayout()->addItem(visualization);
connect(visualization, SIGNAL(destroyed(QObject*)), this, SLOT(visualizationDestroyed(QObject*)));
}
QGraphicsWidget * Applet::visualization(const QString& source)
{
return m_visualizations[source].data();
}
void Applet::visualizationDestroyed(QObject *visualization)
{
QString key;
QHash<QString, QWeakPointer<QGraphicsWidget> >::const_iterator i;
for (i = m_visualizations.constBegin(); i != m_visualizations.constEnd(); ++i) {
if (i.value().data() == static_cast<QGraphicsWidget *>(visualization)) {
key = i.key();
break;
}
}
if (!key.isEmpty()) {
m_visualizations.remove(key);
}
}
uint Applet::interval()
{
return m_interval;
}
void Applet::setInterval(uint interval)
{
m_interval = interval;
}
QString Applet::title()
{
return m_title;
}
SM::Applet::Mode Applet::mode()
{
return m_mode;
}
void Applet::setToolTip(const QString &source, const QString &tipContent)
{
m_toolTips.insert(source, tipContent);
if (Plasma::ToolTipManager::self()->isVisible(this)) {
toolTipAboutToShow();
}
}
void Applet::setEngine(Plasma::DataEngine* engine)
{
m_engine = engine;
}
Plasma::DataEngine* Applet::engine()
{
return m_engine;
}
bool Applet::addVisualization(const QString&)
{
return false;
}
QStringList Applet::connectedSources()
{
return m_connectedSources;
}
}