diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2011-10-17 17:38:53 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2011-10-17 17:38:53 +0000 |
commit | 1e0dd58661c9097fb41218ee7e3515f2d8ba8dac (patch) | |
tree | a263b4ad0c1f7fba6013f5d9854db4cb4962df82 /knetworkmanager-0.8/src/knetworkmanager-device_tray.cpp | |
download | knetworkmanager8-1e0dd58661c9097fb41218ee7e3515f2d8ba8dac.tar.gz knetworkmanager8-1e0dd58661c9097fb41218ee7e3515f2d8ba8dac.zip |
Add dead-ended knetworkmanager 0.8 source
Add copy of same for knetworkmanager 0.9 starting point
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/knetworkmanager8@1259314 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'knetworkmanager-0.8/src/knetworkmanager-device_tray.cpp')
-rw-r--r-- | knetworkmanager-0.8/src/knetworkmanager-device_tray.cpp | 337 |
1 files changed, 337 insertions, 0 deletions
diff --git a/knetworkmanager-0.8/src/knetworkmanager-device_tray.cpp b/knetworkmanager-0.8/src/knetworkmanager-device_tray.cpp new file mode 100644 index 0000000..219508f --- /dev/null +++ b/knetworkmanager-0.8/src/knetworkmanager-device_tray.cpp @@ -0,0 +1,337 @@ +/*************************************************************************** + * + * knetworkmanager-device_tray.cpp - A NetworkManager frontend for KDE + * + * Copyright (C) 2005, 2006 Novell, Inc. + * + * Author: Helmut Schaa <hschaa@suse.de>, <helmut.schaa@gmx.de> + * + * This program 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; either version 2 of the License, or + * (at your option) any later version. + * + * 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + **************************************************************************/ + +class WirelessDialog; + +// TQt includes +#include <tqevent.h> +#include <tqvbox.h> +#include <tqlayout.h> +#include <tqpushbutton.h> +#include <tqbitmap.h> +#include <tqimage.h> +#include <tqpixmap.h> +#include <tqpixmapcache.h> +#include <tqpainter.h> +#include <tqstyle.h> +#include <tqtimer.h> + +// KDE includes +#include <dcopclient.h> +#include <kdebug.h> +#include <kdialogbase.h> +#include <knotifyclient.h> +#include <knotifydialog.h> +#include <kiconeffect.h> +#include <klocale.h> +#include <kstdguiitem.h> +#include <khelpmenu.h> +#include <kprocess.h> +#include <kiconloader.h> +#include <kconfig.h> +#include <kmessagebox.h> +#include <kglobalsettings.h> + +// KNM includes +#include "knetworkmanager-device_tray.h" +#include "knetworkmanager-device.h" +#include "knetworkmanager-menu_subhead.h" +#include "knetworkmanager-connection_settings_dialog.h" +#include "knetworkmanager-connection_setting_info.h" +#include "knetworkmanager-nm_proxy.h" +#include "knetworkmanager-connection.h" + +using namespace ConnectionSettings; + +class DeviceTrayPrivate +{ + public: + + DeviceTrayPrivate() + : dev(NULL) + { + tooltips[NM_DEVICE_STATE_UNKNOWN] = i18n("Unknown"); + tooltips[NM_DEVICE_STATE_UNAVAILABLE] = i18n("Down"); + tooltips[NM_DEVICE_STATE_UNMANAGED] = i18n("Unmanaged"); + tooltips[NM_DEVICE_STATE_DISCONNECTED] = i18n("Disconnected"); + tooltips[NM_DEVICE_STATE_PREPARE] = i18n("Preparing"); + tooltips[NM_DEVICE_STATE_CONFIG] = i18n("Configuration"); + tooltips[NM_DEVICE_STATE_NEED_AUTH] = i18n("Awaiting authentication"); + tooltips[NM_DEVICE_STATE_IP_CONFIG] = i18n("IP configuration"); + tooltips[NM_DEVICE_STATE_ACTIVATED] = i18n("Activated"); + tooltips[NM_DEVICE_STATE_FAILED] = i18n("Failed"); + } + + ~DeviceTrayPrivate() {} + + Device* dev; + TQMap<NMDeviceState, TQMovie> movies; + TQMap<NMDeviceState, TQPixmap> pixmaps; + TQMap<NMDeviceState, TQString> tooltips; +}; + +Device* DeviceTray::getDevice() const +{ + return d->dev; +} + +TQString DeviceTray::getTooltipText() +{ + NMDeviceState state = d->dev->getState(); + TQString tooltip = TQString(); + + if (!d->tooltips[state].isEmpty()) + tooltip += i18n("State: %1").tqarg(d->tooltips[state]); + + return tooltip; +} + +void DeviceTray::enterEvent (TQEvent* /*e*/) +{ + // show tooltip + TQToolTip::remove (this); + TQString tooltip = getTooltipText(); + + if (!tooltip.isEmpty()) + TQToolTip::add (this, tooltip); +} + + +void DeviceTray::setPixmap(const TQPixmap& pixmap) +{ + /* + int oldPixmapWidth = pixmap.size().width(); + int oldPixmapHeight = pixmap.size().height(); + + // we want to show the interface name + TQString iface = d->dev->getInterface(); + + // grab a font + TQFont iface_font = KGlobalSettings::generalFont(); +// iface_font.setBold(true); + + // resize the font to fit the icon's size + float fontSize = iface_font.pointSizeFloat(); + TQFontMetrics qfm(iface_font); + int height = qfm.height(); + int width = qfm.width(iface); + float factor = 1.0f; + float factor2 = 1.0f; + + if (height > (oldPixmapHeight / 2.0f)) + factor = float(oldPixmapHeight / 2.0f) / float(height); + + if (width > (oldPixmapWidth / 1.1f)) + factor2 = float(oldPixmapWidth / 1.1f) / float(width); + + fontSize *= (factor2 < factor) ? factor2 : factor; + + iface_font.setPointSizeFloat( fontSize); + + // draw the text to a bitmap and put is as an overlay on top of the pixmap + TQPixmap iface_pixmap(oldPixmapWidth, oldPixmapHeight); + iface_pixmap.fill(TQt::white); + TQPainter p(&iface_pixmap); + p.setFont(iface_font); + p.setPen(TQt::blue); + p.drawText(iface_pixmap.rect(), TQt::AlignHCenter | TQt::AlignBottom, iface); + iface_pixmap.setMask(iface_pixmap.createHeuristicMask()); + TQImage iface_image = iface_pixmap.convertToImage(); + + TQImage pixmap_with_overlay = pixmap.convertToImage(); + KIconEffect::overlay(pixmap_with_overlay, iface_image); + + TQPixmap new_pixmap; + new_pixmap.convertFromImage(pixmap_with_overlay); + // call base-class setPixmap + KSystemTray::setPixmap(new_pixmap); +*/ + KSystemTray::setPixmap(pixmap); +} + +void DeviceTray::contextMenuAboutToShow (KPopupMenu* menu) +{ + menu->clear(); + + // insert title + menu->insertTitle (SmallIcon ("knetworkmanager", TQIconSet::Automatic), "KNetworkManager", -1, -1); + + // let the specific device_tray add its items + addMenuItems(menu); + + // quit + menu->insertSeparator (); + KAction* quitAction = actionCollection ()->action (KStdAction::name (KStdAction::Quit)); + if (quitAction) + quitAction->plug (menu); +} + +void DeviceTray::resizeEvent ( TQResizeEvent * ) +{ + // Honor Free Desktop specifications that allow for arbitrary system tray icon sizes + loadIcons(); + updateTrayIcon(m_currentIconState); +} + +void DeviceTray::setPixmapForState(NMDeviceState state, TQMovie movie) +{ + d->movies[state] = movie; + slotUpdateDeviceState(); +} + +void DeviceTray::setPixmapForState(NMDeviceState state, TQPixmap pixmap) +{ + d->pixmaps[state] = pixmap; + slotUpdateDeviceState(); +} + +void DeviceTray::updateTrayIcon(NMDeviceState state) +{ + // stop the old movie to avoid unnecessary wakups + if (movie()) + movie()->pause(); + + if (d->movies.find(state) != d->movies.end() && !d->movies[state].isNull()) + { + if (m_currentIconState != state) { + // Clear the icon pixmap as the movie may be a different size + TQPixmap nullPixmap; + setPixmap(nullPixmap); + } + + // animation desired + int frame = -1; + if (movie()) + frame = movie()->frameNumber(); + + // set the movie + setMovie(d->movies[state]); + + // start at the same frame as the movie before + if (frame > 0) + movie()->step(frame); + + // start the animation + movie()->unpause(); + } + else if (d->pixmaps.find(state) != d->pixmaps.end() && !d->pixmaps[state].isNull()) + setPixmap(d->pixmaps[state]); + else + setPixmap(loadSizedIcon("KNetworkManager", width())); + + m_currentIconState = state; +} + +void DeviceTray::updateActions(NMDeviceState state) +{ + // allow device deactivation only when device is activated + KAction* deactivate = actionCollection()->action("deactivate_device"); + if (deactivate) + deactivate->setEnabled( (state == NM_DEVICE_STATE_ACTIVATED || + state == NM_DEVICE_STATE_IP_CONFIG || + state == NM_DEVICE_STATE_PREPARE || + state == NM_DEVICE_STATE_CONFIG || + state == NM_DEVICE_STATE_NEED_AUTH) ); +} + +void DeviceTray::updateActiveConnection(NMDeviceState state) +{ + if (state != NM_DEVICE_STATE_ACTIVATED) + return; + + NMProxy* nm = NMProxy::getInstance(); + Connection* active_conn = nm->getActiveConnection(d->dev); + if (active_conn) + { + Info* info = dynamic_cast<Info*>(active_conn->getSetting(NM_SETTING_CONNECTION_SETTING_NAME)); + if (info) + info->setTimestamp(TQDateTime::tqcurrentDateTime()); + } +} + +void DeviceTray::slotUpdateDeviceState(NMDeviceState state) +{ + updateTrayIcon(state); + updateActions(state); + updateActiveConnection(state); +} + +void DeviceTray::slotUpdateDeviceState() +{ + slotUpdateDeviceState(d->dev->getState()); +} + +void DeviceTray::loadIcons() { + d->pixmaps[NM_DEVICE_STATE_UNKNOWN] = loadSizedIcon("nm_no_connection", width()); + d->pixmaps[NM_DEVICE_STATE_UNMANAGED] = loadSizedIcon("nm_no_connection", width()); + d->pixmaps[NM_DEVICE_STATE_UNAVAILABLE] = loadSizedIcon("nm_no_connection", width()); + d->pixmaps[NM_DEVICE_STATE_DISCONNECTED] = loadSizedIcon("nm_no_connection", width()); + + d->movies[NM_DEVICE_STATE_PREPARE] = TQMovie( KGlobal::iconLoader()->moviePath("nm_stage01_connecting", KIcon::Panel)); + d->movies[NM_DEVICE_STATE_PREPARE].pause(); + + d->movies[NM_DEVICE_STATE_CONFIG] = TQMovie( KGlobal::iconLoader()->moviePath("nm_stage02_connecting", KIcon::Panel)); + d->movies[NM_DEVICE_STATE_CONFIG].pause(); + + d->movies[NM_DEVICE_STATE_IP_CONFIG] = TQMovie( KGlobal::iconLoader()->moviePath("nm_stage03_connecting", KIcon::Panel)); + d->movies[NM_DEVICE_STATE_IP_CONFIG].pause(); + + d->movies[NM_DEVICE_STATE_NEED_AUTH] = d->movies[NM_DEVICE_STATE_CONFIG]; + d->movies[NM_DEVICE_STATE_NEED_AUTH].pause(); + + d->pixmaps[NM_DEVICE_STATE_ACTIVATED] = loadSizedIcon("ok", width()); + + d->pixmaps[NM_DEVICE_STATE_FAILED] = loadSizedIcon("nm_no_connection", width()); +} + +DeviceTray::DeviceTray (Device* dev) : KSystemTray () +{ + d = new DeviceTrayPrivate(); + d->dev = dev; + + m_currentIconState = NM_DEVICE_STATE_UNKNOWN; + loadIcons(); + + // get notified when the device state changes + connect(dev, TQT_SIGNAL(StateChanged(NMDeviceState)), this, TQT_SLOT(slotUpdateDeviceState(NMDeviceState))); + + setMouseTracking (true); + + // defer the initial call to slotUpdateDeviceState as it will crash knm when called directly from here + // virtual method calls are not allowed in constructor + TQTimer::singleShot(0, this, TQT_SLOT(slotUpdateDeviceState())); + + // Actions used for plugging into the menu + new KAction (i18n ("Deactivate connection..."), + SmallIcon ("no", TQIconSet::Automatic), 0, + dev, TQT_SLOT (slotDeactivate()), actionCollection (), "deactivate_device"); +} + +DeviceTray::~DeviceTray () +{ + delete d; +} + + +#include "knetworkmanager-device_tray.moc" |