diff --git a/src/common/data.h b/src/common/data.h index e436224..038f165 100644 --- a/src/common/data.h +++ b/src/common/data.h @@ -1,435 +1,411 @@ /* This file is part of KNemo Copyright (C) 2004 Percy Leonhardt Copyright (C) 2009, 2010 John Stamp KNemo is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. KNemo 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef DATA_H #define DATA_H -#include #include #include #include #include #include #include #include class KCalendarSystem; /** * This file contains data structures used to store information about * an interface. It is shared between the daemon and the control center * module. * * @short Shared data structures * @author Percy Leonhardt */ namespace KNemoIface { enum Type { UnknownType, Ethernet, PPP }; enum IfaceState { UnknownState = 0, Unavailable = 1, Available = 2, Up = 4, Connected = 8, RxTraffic = 16, TxTraffic = 32, MaxState = 256 }; } namespace KNemoStats { enum TrafficUnits { UnitB = 0, UnitK, UnitM, UnitG }; enum TrafficDirection { TrafficIn = 0, TrafficOut, TrafficTotal }; enum WarnType { Peak = 0, Offpeak, PeakOffpeak }; enum PeriodUnits { Hour = 0, Day, Week, Month, BillPeriod, Year, HourArchive }; // Powers of 2 enum TrafficType { AllTraffic = 0, OffpeakTraffic = 1 }; }; static const QLatin1String NETLOAD_THEME("netloadtheme"); static const QLatin1String TEXT_THEME("texttheme"); static const QLatin1String SYSTEM_THEME("systemtheme"); static const QLatin1String ICON_ERROR("error"); static const QLatin1String ICON_OFFLINE("offline"); static const QLatin1String ICON_IDLE("idle"); static const QLatin1String ICON_RX("receive"); static const QLatin1String ICON_TX("transmit"); static const QLatin1String ICON_RX_TX("transmit-receive"); // config groups static const QLatin1String confg_general("General"); static const QLatin1String confg_interface("Interface_"); static const QLatin1String confg_plotter("Plotter_"); static const QLatin1String confg_statsRule("StatsRule_"); static const QLatin1String confg_warnRule("WarnRule_"); static const QLatin1String conf_firstStart("FirstStart"); static const QLatin1String conf_autoStart("AutoStart"); static const QLatin1String conf_interfaces("Interfaces"); // interface static const QLatin1String conf_alias("Alias"); // interface icon static const QLatin1String conf_minVisibleState("MinVisibleState"); static const QLatin1String conf_trafficThreshold("TrafficThreshold"); static const QLatin1String conf_iconTheme("IconSet"); -static const QLatin1String conf_colorIncoming("ColorIncoming"); -static const QLatin1String conf_colorOutgoing("ColorOutgoing"); -static const QLatin1String conf_colorDisabled("ColorDisabled"); -static const QLatin1String conf_colorUnavailable("ColorUnavailable"); -static const QLatin1String conf_dynamicColor("DynamicColor"); -static const QLatin1String conf_colorIncomingMax("ColorIncomingMax"); -static const QLatin1String conf_colorOutgoingMax("ColorOutgoingMax"); static const QLatin1String conf_barScale("BarScale"); static const QLatin1String conf_inMaxRate("InMaxRate"); static const QLatin1String conf_outMaxRate("OutMaxRate"); // interface statistics static const QLatin1String conf_activateStatistics("ActivateStatistics"); static const QLatin1String conf_calendarSystem("CalendarSystem"); static const QLatin1String conf_statsRules("StatsRules"); static const QLatin1String conf_warnRules("WarnRules"); // interface billing static const QLatin1String conf_statsStartDate("StartDate"); static const QLatin1String conf_statsPeriodUnits("PeriodUnits"); static const QLatin1String conf_statsPeriodCount("PeriodCount"); static const QLatin1String conf_logOffpeak("LogOffpeak"); static const QLatin1String conf_offpeakStartTime("OffpeakStartTime"); static const QLatin1String conf_offpeakEndTime("OffpeakEndTime"); static const QLatin1String conf_weekendIsOffpeak("WeekendIsOffpeak"); static const QLatin1String conf_weekendDayStart("WeekendDayStart"); static const QLatin1String conf_weekendDayEnd("WeekendDayEnd"); static const QLatin1String conf_weekendTimeStart("WeekendTimeStart"); static const QLatin1String conf_weekendTimeEnd("WeekendTimeEnd"); // warning static const QLatin1String conf_warnPeriodUnits("PeriodUnits"); static const QLatin1String conf_warnPeriodCount("PeriodCount"); static const QLatin1String conf_warnTrafficType("TrafficType"); static const QLatin1String conf_warnTrafficDirection("TrafficDirection"); static const QLatin1String conf_warnTrafficUnits("TrafficUnits"); static const QLatin1String conf_warnThreshold("Threshold"); static const QLatin1String conf_warnCustomText("CustomText"); // tooltip static const QLatin1String conf_toolTipContent("ToolTipContent"); // general static const QLatin1String conf_pollInterval("PollInterval"); static const QLatin1String conf_saveInterval("SaveInterval"); static const QLatin1String conf_useBitrate("UseBitrate"); static const QLatin1String conf_plotterPos("PlotterPos"); static const QLatin1String conf_plotterSize("PlotterSize"); static const QLatin1String conf_statisticsPos("StatisticsPos"); static const QLatin1String conf_statisticsSize("StatisticsSize"); static const QLatin1String conf_statusPos("StatusPos"); static const QLatin1String conf_statusSize("StatusSize"); static const QLatin1String conf_hourState("HourState"); static const QLatin1String conf_dayState("DayState"); static const QLatin1String conf_weekState("WeekState"); static const QLatin1String conf_monthState("MonthState"); static const QLatin1String conf_billingState("BillingState"); static const QLatin1String conf_yearState("YearState"); enum ToolTipEnums { INTERFACE = 0x00000001, ALIAS = 0x00000002, STATUS = 0x00000004, UPTIME = 0x00000008, IP_ADDRESS = 0x00000010, SCOPE = 0x00000020, HW_ADDRESS = 0x00000040, PTP_ADDRESS = 0x00000080, RX_PACKETS = 0x00000100, TX_PACKETS = 0x00000200, RX_BYTES = 0x00000400, TX_BYTES = 0x00000800, ESSID = 0x00001000, MODE = 0x00002000, FREQUENCY = 0x00004000, BIT_RATE = 0x00008000, ACCESS_POINT = 0x00010000, LINK_QUALITY = 0x00020000, BCAST_ADDRESS = 0x00040000, GATEWAY = 0x00080000, DOWNLOAD_SPEED = 0x00100000, UPLOAD_SPEED = 0x00200000, NICK_NAME = 0x00400000, ENCRYPTION = 0x00800000 }; static const int defaultTip = STATUS | IP_ADDRESS | RX_BYTES | TX_BYTES | ESSID | LINK_QUALITY | DOWNLOAD_SPEED | UPLOAD_SPEED | ENCRYPTION; struct KNemoTheme { QString name; QString comment; QString internalName; }; struct AddrData { int afType; QString broadcastAddress; int scope; QString ipv6Flags; QString label; bool hasPeer; }; struct BackendData { BackendData() : status( KNemoIface::UnknownState ), index( -1 ), interfaceType( KNemoIface::UnknownType ), isWireless( false ), prevRxPackets( 0L ), prevTxPackets( 0L ), rxPackets( 0L ), txPackets( 0L ), prevRxBytes( 0L ), prevTxBytes( 0L ), incomingBytes( 0L ), outgoingBytes( 0L ), rxBytes( 0L ), txBytes( 0L ), isEncrypted( false ) {} int status; int index; KNemoIface::Type interfaceType; bool isWireless; unsigned long prevRxPackets; unsigned long prevTxPackets; unsigned long rxPackets; unsigned long txPackets; unsigned long prevRxBytes; unsigned long prevTxBytes; unsigned long incomingBytes; unsigned long outgoingBytes; QMap addrData; QString hwAddress; QString ip4DefaultGateway; QString ip6DefaultGateway; QString rxString; QString txString; quint64 rxBytes; quint64 txBytes; QString essid; QString mode; QString frequency; QString channel; QString bitRate; QString linkQuality; QString accessPoint; QString prevAccessPoint; QString nickName; bool isEncrypted; }; struct GeneralSettings { GeneralSettings() : toolTipContent( defaultTip ), pollInterval( 1.0 ), saveInterval( 60 ), useBitrate( false ), statisticsDir( QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/knemo") ) {} int toolTipContent; double pollInterval; int saveInterval; bool useBitrate; QDir statisticsDir; }; class StatsRule { public: StatsRule() : periodCount( 1 ), periodUnits( KNemoStats::Month ), logOffpeak( false ), offpeakStartTime( QTime( 23, 0) ), offpeakEndTime( QTime( 7, 0) ), weekendIsOffpeak( false ), weekendDayStart( 5 ), weekendDayEnd( 1 ), weekendTimeStart( QTime( 23, 0) ), weekendTimeEnd( QTime( 7, 0) ) { } bool operator==( StatsRule &r ); bool isValid( KCalendarSystem *cal ); QDate startDate; int periodCount; int periodUnits; bool logOffpeak; QTime offpeakStartTime; QTime offpeakEndTime; bool weekendIsOffpeak; int weekendDayStart; int weekendDayEnd; QTime weekendTimeStart; QTime weekendTimeEnd; }; struct WarnRule { WarnRule() : periodUnits( KNemoStats::Month ), periodCount( 1 ), trafficType( KNemoStats::PeakOffpeak ), trafficDirection( KNemoStats::TrafficIn ), trafficUnits( KNemoStats::UnitG ), threshold( 5.0 ), warnDone( false ) { } bool operator==( WarnRule &r ) { if ( periodUnits == r.periodUnits && periodCount == r.periodCount && trafficType == r.trafficType && trafficDirection == r.trafficDirection && trafficUnits == r.trafficUnits && threshold == r.threshold ) return true; else return false; } int periodUnits; uint periodCount; int trafficType; int trafficDirection; int trafficUnits; double threshold; QString customText; bool warnDone; }; struct InterfaceSettings { InterfaceSettings() - : colorIncoming( 0x1889FF ), - colorOutgoing( 0xFF7F08 ), - colorDisabled( 0x888786 ), - colorUnavailable( 0x888786 ), - colorBackground( 0x888786 ), - dynamicColor( false ), - colorIncomingMax( 0x96FFFF ), - colorOutgoingMax( 0xFFC868 ), - barScale( false ), + : barScale( false ), inMaxRate( 4 ), outMaxRate( 4 ), trafficThreshold( 0 ), minVisibleState( KNemoIface::UnknownState ), activateStatistics( false ), calendarSystem( KLocale::QDateCalendar ) {} QString iconTheme; - QColor colorIncoming; - QColor colorOutgoing; - QColor colorDisabled; - QColor colorUnavailable; - QColor colorBackground; - bool dynamicColor; - QColor colorIncomingMax; - QColor colorOutgoingMax; bool barScale; unsigned int inMaxRate; unsigned int outMaxRate; unsigned int trafficThreshold; int minVisibleState; bool activateStatistics; QList statsRules; QList warnRules; KLocale::CalendarSystem calendarSystem; QString alias; }; #ifndef __linux__ enum rt_scope_t { RT_SCOPE_UNIVERSE=0, RT_SCOPE_SITE=200, RT_SCOPE_LINK=253, RT_SCOPE_HOST=254, RT_SCOPE_NOWHERE=255 }; #endif static const double pollIntervals[] = { 0.1, 0.2, 0.25, 0.5, 1.0, 2.0 }; #endif // DATA_H diff --git a/src/kcm/configdialog.cpp b/src/kcm/configdialog.cpp index fdb8bfc..c1a39ef 100644 --- a/src/kcm/configdialog.cpp +++ b/src/kcm/configdialog.cpp @@ -1,1534 +1,1442 @@ /* This file is part of KNemo Copyright (C) 2004, 2006 Percy Leonhardt Copyright (C) 2009, 2010 John Stamp KNemo is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. KNemo 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ui_configdlg.h" #include "config-knemo.h" #include "configdialog.h" #include "statsconfig.h" #include "warnconfig.h" #include "themeconfig.h" #include "utils.h" #include #include #include #include #ifdef __linux__ #include #include #include #endif K_PLUGIN_FACTORY(KNemoFactory, registerPlugin(QLatin1String("knemo"));) K_EXPORT_PLUGIN(KNemoFactory("kcm_knemo")) Q_DECLARE_METATYPE( KNemoTheme ) Q_DECLARE_METATYPE( StatsRule ) Q_DECLARE_METATYPE( WarnRule ) static bool themesLessThan( const KNemoTheme& s1, const KNemoTheme& s2 ) { if ( s1.name < s2.name ) return true; else return false; } static QString periodText( int c, int u ) { QString units; switch ( u ) { case KNemoStats::Hour: units = i18np( "%1 hour", "%1 hours", c ); break; case KNemoStats::Day: units = i18np( "%1 day", "%1 days", c ); break; case KNemoStats::Week: units = i18np( "%1 week", "%1 weeks", c ); break; case KNemoStats::Month: units = i18np( "%1 month", "%1 months", c ); break; case KNemoStats::BillPeriod: units = i18np( "%1 billing period", "%1 billing periods", c ); break; case KNemoStats::Year: units = i18np( "%1 year", "%1 years", c ); break; default: units = i18n( "Invalid period" ); ;; } return units; } void StatsRuleModel::setCalendar( const KCalendarSystem *cal ) { mCalendar = cal; } QString StatsRuleModel::dateText( const StatsRule &s ) { QString dateStr = mCalendar->formatDate( s.startDate, KLocale::LongDate ); if ( !mCalendar->isValid( s.startDate ) ) dateStr = i18n( "Invalid Date" ); return dateStr; } QList StatsRuleModel::getRules() { QList statsRules; for ( int i = 0; i < rowCount(); ++i ) { statsRules << item( i, 0 )->data( Qt::UserRole ).value(); } return statsRules; } QModelIndex StatsRuleModel::addRule( const StatsRule &s ) { QList items; QStandardItem *item = new QStandardItem( dateText( s ) ); QVariant v; v.setValue( s ); item->setData( v, Qt::UserRole ); item->setData( s.startDate, Qt::UserRole + 1 ); items << item; item = new QStandardItem( periodText( s.periodCount, s.periodUnits ) ); items << item; appendRow( items ); return indexFromItem (items[0] ); } void StatsRuleModel::modifyRule( const QModelIndex &index, const StatsRule &s ) { QVariant v; v.setValue( s ); item( index.row(), 0 )->setData( v, Qt::UserRole ); item( index.row(), 0 )->setData( s.startDate, Qt::UserRole + 1 ); item( index.row(), 0 )->setData( dateText( s ), Qt::DisplayRole ); item( index.row(), 1 )->setData( periodText( s.periodCount, s.periodUnits ), Qt::DisplayRole ); } QString WarnModel::ruleText( const WarnRule &warn ) { QString warnText; quint64 siz = warn.threshold * pow( 1024, warn.trafficUnits ); switch ( warn.trafficDirection ) { case KNemoStats::TrafficIn: if ( warn.trafficType == KNemoStats::Peak ) warnText = i18n( "peak incoming traffic > %1" ).arg( KIO::convertSize( siz ) ); else if ( warn.trafficType == KNemoStats::Offpeak ) warnText = i18n( "off-peak incoming traffic > %1" ).arg( KIO::convertSize( siz ) ); else warnText = i18n( "incoming traffic > %1" ).arg( KIO::convertSize( siz ) ); break; case KNemoStats::TrafficOut: if ( warn.trafficType == KNemoStats::Peak ) warnText = i18n( "peak outgoing traffic > %1" ).arg( KIO::convertSize( siz ) ); else if ( warn.trafficType == KNemoStats::Offpeak ) warnText = i18n( "off-peak outgoing traffic > %1" ).arg( KIO::convertSize( siz ) ); else warnText = i18n( "outgoing traffic > %1" ).arg( KIO::convertSize( siz ) ); break; case KNemoStats::TrafficTotal: if ( warn.trafficType == KNemoStats::Peak ) warnText = i18n( "peak incoming and outgoing traffic > %1" ).arg( KIO::convertSize( siz ) ); else if ( warn.trafficType == KNemoStats::Offpeak ) warnText = i18n( "off-peak incoming and outgoing traffic > %1" ).arg( KIO::convertSize( siz ) ); else warnText = i18n( "incoming and outgoing traffic > %1" ).arg( KIO::convertSize( siz ) ); } return warnText; } QList WarnModel::getRules() { QList warnRules; for ( int i = 0; i < rowCount(); ++i ) { warnRules << item( i, 0 )->data( Qt::UserRole ).value(); } return warnRules; } QModelIndex WarnModel::addWarn( const WarnRule &warn ) { QList items; QStandardItem *item = new QStandardItem( ruleText( warn ) ); QVariant v; v.setValue( warn ); item->setData( v, Qt::UserRole ); items << item; item = new QStandardItem( periodText( warn.periodCount, warn.periodUnits ) ); items << item; appendRow( items ); return indexFromItem( items[0] ); } void WarnModel::modifyWarn( const QModelIndex &index, const WarnRule &warn ) { QVariant v; v.setValue( warn ); item( index.row(), 0 )->setData( v, Qt::UserRole ); item( index.row(), 0 )->setData( ruleText( warn ), Qt::DisplayRole ); item( index.row(), 1 )->setData( periodText( warn.periodCount, warn.periodUnits ), Qt::DisplayRole ); } ConfigDialog::ConfigDialog( QWidget *parent, const QVariantList &args ) : KCModule( parent, args ), mLock( false ), mDlg( new Ui::ConfigDlg() ), mCalendar( 0 ) { migrateKde4Conf(); setupToolTipMap(); QWidget *main = new QWidget( this ); QVBoxLayout* top = new QVBoxLayout( this ); mDlg->setupUi( main ); top->addWidget( main ); statsModel = new StatsRuleModel( this ); QStringList l; l << i18n( "Start Date" ) << i18n( "Period" ); statsModel->setHorizontalHeaderLabels( l ); QSortFilterProxyModel *proxy = new QSortFilterProxyModel( mDlg->statsView ); proxy->setSourceModel( statsModel ); proxy->setSortRole( Qt::UserRole + 1 ); mDlg->statsView->setModel( proxy ); mDlg->statsView->sortByColumn( 0, Qt::AscendingOrder ); warnModel = new WarnModel( this ); l.clear(); l << i18n( "Alert" ) << i18n( "Period" ); warnModel->setHorizontalHeaderLabels( l ); mDlg->warnView->setModel( warnModel ); QList themes = findThemes(); qSort( themes.begin(), themes.end(), themesLessThan ); foreach ( KNemoTheme theme, themes ) mDlg->comboBoxIconTheme->addItem( theme.name, QVariant::fromValue( theme ) ); // We want these hardcoded and at the bottom of the list KNemoTheme systemTheme; systemTheme.name = i18n( "System Theme" ); systemTheme.comment = i18n( "Use the current icon theme's network status icons" ); systemTheme.internalName = SYSTEM_THEME; KNemoTheme textTheme; textTheme.name = i18n( "Text" ); textTheme.comment = i18n( "KNemo theme that shows the upload/download speed as text" ); textTheme.internalName = TEXT_THEME; KNemoTheme netloadTheme; netloadTheme.name = i18n( "Netload" ); netloadTheme.comment = i18n( "KNemo theme that shows the upload/download speed as bar graphs" ); netloadTheme.internalName = NETLOAD_THEME; // Leave this out for now. Looks like none of the KDE icon themes provide // status/network-* icons. //mDlg->comboBoxIconTheme->addItem( systemTheme.name, QVariant::fromValue( systemTheme ) ); mDlg->comboBoxIconTheme->addItem( netloadTheme.name, QVariant::fromValue( netloadTheme ) ); mDlg->comboBoxIconTheme->addItem( textTheme.name, QVariant::fromValue( textTheme ) ); InterfaceSettings s; int index = findIndexFromName( s.iconTheme ); if ( index < 0 ) index = findIndexFromName( TEXT_THEME ); mDlg->comboBoxIconTheme->setCurrentIndex( index ); for ( size_t i = 0; i < sizeof(pollIntervals)/sizeof(double); i++ ) mDlg->comboBoxPoll->addItem( i18n( "%1 sec", pollIntervals[i] ), pollIntervals[i] ); mDlg->pushButtonNew->setIcon( QIcon::fromTheme( QLatin1String("list-add") ) ); mDlg->pushButtonAll->setIcon( QIcon::fromTheme( QLatin1String("document-new") ) ); mDlg->pushButtonDelete->setIcon( QIcon::fromTheme( QLatin1String("list-remove") ) ); mDlg->pushButtonAddToolTip->setIcon( QIcon::fromTheme( QLatin1String("arrow-right") ) ); mDlg->pushButtonRemoveToolTip->setIcon( QIcon::fromTheme( QLatin1String("arrow-left") ) ); - mDlg->themeColorBox->setEnabled( false ); - setButtons( KCModule::Default | KCModule::Apply ); connect( mDlg->checkBoxStartKNemo, SIGNAL( toggled( bool ) ), this, SLOT( checkBoxStartKNemoToggled( bool ) ) ); // Interface connect( mDlg->listBoxInterfaces, SIGNAL( currentRowChanged( int ) ), this, SLOT( interfaceSelected( int ) ) ); connect( mDlg->pushButtonNew, SIGNAL( clicked() ), this, SLOT( buttonNewSelected() ) ); connect( mDlg->pushButtonAll, SIGNAL( clicked() ), this, SLOT( buttonAllSelected() ) ); connect( mDlg->pushButtonDelete, SIGNAL( clicked() ), this, SLOT( buttonDeleteSelected() ) ); connect( mDlg->lineEditAlias, SIGNAL( textChanged( const QString& ) ), this, SLOT( aliasChanged( const QString& ) ) ); // Interface - Icon Appearance connect( mDlg->comboHiding, SIGNAL( activated( int ) ), this, SLOT( comboHidingChanged( int ) ) ); connect( mDlg->comboBoxIconTheme, SIGNAL( activated( int ) ), this, SLOT( iconThemeChanged( int ) ) ); - connect( mDlg->colorIncoming, SIGNAL( changed( const QColor& ) ), - this, SLOT( colorButtonChanged() ) ); - connect( mDlg->colorOutgoing, SIGNAL( changed( const QColor& ) ), - this, SLOT( colorButtonChanged() ) ); - connect( mDlg->colorDisabled, SIGNAL( changed( const QColor& ) ), - this, SLOT( colorButtonChanged() ) ); - connect( mDlg->colorUnavailable, SIGNAL( changed( const QColor& ) ), - this, SLOT( colorButtonChanged() ) ); connect( mDlg->advancedButton, SIGNAL( clicked() ), this, SLOT( advancedButtonClicked() ) ); // Interface - Statistics connect( mDlg->checkBoxStatistics, SIGNAL( toggled( bool ) ), this, SLOT( checkBoxStatisticsToggled ( bool ) ) ); connect( mDlg->addStats, SIGNAL( clicked() ), this, SLOT( addStatsClicked() ) ); connect( mDlg->modifyStats, SIGNAL( clicked() ), this, SLOT( modifyStatsClicked() ) ); connect( mDlg->removeStats, SIGNAL( clicked() ), this, SLOT( removeStatsClicked() ) ); connect( mDlg->addWarn, SIGNAL( clicked() ), this, SLOT( addWarnClicked() ) ); connect( mDlg->modifyWarn, SIGNAL( clicked() ), this, SLOT( modifyWarnClicked() ) ); connect( mDlg->removeWarn, SIGNAL( clicked() ), this, SLOT( removeWarnClicked() ) ); // ToolTip connect( mDlg->pushButtonAddToolTip, SIGNAL( clicked() ), this, SLOT( buttonAddToolTipSelected() ) ); connect( mDlg->pushButtonRemoveToolTip, SIGNAL( clicked() ), this, SLOT( buttonRemoveToolTipSelected() ) ); // General connect( mDlg->pushButtonNotifications, SIGNAL( clicked() ), this, SLOT( buttonNotificationsSelected() ) ); connect( mDlg->comboBoxPoll, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changed() ) ); connect( mDlg->numInputSaveInterval, SIGNAL( valueChanged( int ) ), this, SLOT( changed() ) ); connect( mDlg->useBitrate, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) ); } ConfigDialog::~ConfigDialog() { delete mDlg; } void ConfigDialog::load() { mSettingsMap.clear(); mDlg->listBoxInterfaces->clear(); KSharedConfig::Ptr config = KSharedConfig::openConfig( QLatin1String("knemorc") ); KConfigGroup generalGroup( config, confg_general ); bool startKNemo = generalGroup.readEntry( conf_autoStart, true ); mDlg->checkBoxStartKNemo->setChecked( startKNemo ); GeneralSettings g; double pollVal = clamp(generalGroup.readEntry( conf_pollInterval, g.pollInterval ), 0.1, 2.0 ); pollVal = validatePoll( pollVal ); int index = mDlg->comboBoxPoll->findData( pollVal ); if ( index >= 0 ) mDlg->comboBoxPoll->setCurrentIndex( index ); mDlg->numInputSaveInterval->setValue( clamp(generalGroup.readEntry( conf_saveInterval, g.saveInterval ), 0, 300 ) ); mDlg->useBitrate->setChecked( generalGroup.readEntry( conf_useBitrate, g.useBitrate ) ); mToolTipContent = generalGroup.readEntry( conf_toolTipContent, g.toolTipContent ); QStringList list = generalGroup.readEntry( conf_interfaces, QStringList() ); // Get defaults from the struct InterfaceSettings s; foreach ( QString interface, list ) { QString group( confg_interface ); group += interface; InterfaceSettings* settings = new InterfaceSettings(); if ( config->hasGroup( group ) ) { KConfigGroup interfaceGroup( config, group ); settings->alias = interfaceGroup.readEntry( conf_alias ).trimmed(); settings->minVisibleState = interfaceGroup.readEntry( conf_minVisibleState, s.minVisibleState ); settings->trafficThreshold = clamp(interfaceGroup.readEntry( conf_trafficThreshold, s.trafficThreshold ), 0, 1000 ); settings->iconTheme = interfaceGroup.readEntry( conf_iconTheme, s.iconTheme ); - settings->colorIncoming = interfaceGroup.readEntry( conf_colorIncoming, s.colorIncoming ); - settings->colorOutgoing = interfaceGroup.readEntry( conf_colorOutgoing, s.colorOutgoing ); KColorScheme scheme(QPalette::Active, KColorScheme::View); - settings->colorDisabled = interfaceGroup.readEntry( conf_colorDisabled, scheme.foreground( KColorScheme::InactiveText ).color() ); - settings->colorUnavailable = interfaceGroup.readEntry( conf_colorUnavailable, scheme.foreground( KColorScheme::InactiveText ).color() ); - settings->colorBackground = scheme.foreground( KColorScheme::InactiveText ).color(); - settings->dynamicColor = interfaceGroup.readEntry( conf_dynamicColor, s.dynamicColor ); - settings->colorIncomingMax = interfaceGroup.readEntry( conf_colorIncomingMax, s.colorIncomingMax ); - settings->colorOutgoingMax = interfaceGroup.readEntry( conf_colorOutgoingMax, s.colorOutgoingMax ); settings->barScale = interfaceGroup.readEntry( conf_barScale, s.barScale ); settings->inMaxRate = interfaceGroup.readEntry( conf_inMaxRate, s.inMaxRate ); settings->outMaxRate = interfaceGroup.readEntry( conf_outMaxRate, s.outMaxRate ); settings->calendarSystem = static_cast(interfaceGroup.readEntry( conf_calendarSystem, static_cast(KLocale::QDateCalendar) )); settings->activateStatistics = interfaceGroup.readEntry( conf_activateStatistics, s.activateStatistics ); int statsRuleCount = interfaceGroup.readEntry( conf_statsRules, 0 ); for ( int i = 0; i < statsRuleCount; ++i ) { group = QString::fromLatin1( "%1%2 #%3" ).arg( confg_statsRule ).arg( interface ).arg( i ); if ( config->hasGroup( group ) ) { KConfigGroup statsGroup( config, group ); StatsRule stats; stats.startDate = statsGroup.readEntry( conf_statsStartDate, QDate() ); stats.periodUnits = clamp(statsGroup.readEntry( conf_statsPeriodUnits, stats.periodUnits ), KNemoStats::Day, KNemoStats::Year ); stats.periodCount = clamp(statsGroup.readEntry( conf_statsPeriodCount, stats.periodCount ), 1, 1000 ); stats.logOffpeak = statsGroup.readEntry( conf_logOffpeak,stats.logOffpeak ); stats.offpeakStartTime = QTime::fromString( statsGroup.readEntry( conf_offpeakStartTime, stats.offpeakStartTime.toString( Qt::ISODate ) ), Qt::ISODate ); stats.offpeakEndTime = QTime::fromString( statsGroup.readEntry( conf_offpeakEndTime, stats.offpeakEndTime.toString( Qt::ISODate ) ), Qt::ISODate ); stats.weekendIsOffpeak = statsGroup.readEntry( conf_weekendIsOffpeak, stats.weekendIsOffpeak ); stats.weekendDayStart = statsGroup.readEntry( conf_weekendDayStart, stats.weekendDayStart ); stats.weekendDayEnd = statsGroup.readEntry( conf_weekendDayEnd, stats.weekendDayEnd ); stats.weekendTimeStart = QTime::fromString( statsGroup.readEntry( conf_weekendTimeStart, stats.weekendTimeStart.toString( Qt::ISODate ) ), Qt::ISODate ); stats.weekendTimeEnd = QTime::fromString( statsGroup.readEntry( conf_weekendTimeEnd, stats.weekendTimeEnd.toString( Qt::ISODate ) ), Qt::ISODate ); settings->statsRules << stats; } } int warnRuleCount = interfaceGroup.readEntry( conf_warnRules, 0 ); for ( int i = 0; i < warnRuleCount; ++i ) { group = QString::fromLatin1( "%1%2 #%3" ).arg( confg_warnRule ).arg( interface ).arg( i ); if ( config->hasGroup( group ) ) { KConfigGroup warnGroup( config, group ); WarnRule warn; warn.periodUnits = clamp(warnGroup.readEntry( conf_warnPeriodUnits, warn.periodUnits ), KNemoStats::Hour, KNemoStats::Year ); warn.periodCount = clamp(warnGroup.readEntry( conf_warnPeriodCount, warn.periodCount ), 1, 1000 ); warn.trafficType = clamp(warnGroup.readEntry( conf_warnTrafficType, warn.trafficType ), KNemoStats::Peak, KNemoStats::PeakOffpeak ); warn.trafficDirection = clamp(warnGroup.readEntry( conf_warnTrafficDirection, warn.trafficDirection ), KNemoStats::TrafficIn, KNemoStats::TrafficTotal ); warn.trafficUnits = clamp(warnGroup.readEntry( conf_warnTrafficUnits, warn.trafficUnits ), KNemoStats::UnitB, KNemoStats::UnitG ); warn.threshold = clamp(warnGroup.readEntry( conf_warnThreshold, warn.threshold ), 0.0, 9999.0 ); warn.customText = warnGroup.readEntry( conf_warnCustomText, warn.customText ).trimmed(); settings->warnRules << warn; } } } mSettingsMap.insert( interface, settings ); mDlg->listBoxInterfaces->addItem( interface ); mDlg->pushButtonDelete->setEnabled( true ); mDlg->ifaceTab->setEnabled( true ); } // These things need to be here so that 'Reset' from the control // center is handled correctly. setupToolTipTab(); // In case the user opened the control center via the context menu // this call to the daemon will deliver the interface the menu // belongs to. This way we can preselect the appropriate entry in the list. QString selectedInterface = QString::null; QDBusMessage reply = QDBusInterface(QLatin1String("org.kde.knemo"), QLatin1String("/knemo"), QLatin1String("org.kde.knemo")).call(QLatin1String("getSelectedInterface")); if ( reply.arguments().count() ) { selectedInterface = reply.arguments().first().toString(); } if ( selectedInterface != QString::null ) { // Try to preselect the interface. int i; for ( i = 0; i < mDlg->listBoxInterfaces->count(); i++ ) { if ( mDlg->listBoxInterfaces->item( i )->text() == selectedInterface ) { // Found it. mDlg->listBoxInterfaces->setCurrentRow( i ); break; } } if ( i == mDlg->listBoxInterfaces->count() ) { // Not found. Select first entry in list. mDlg->listBoxInterfaces->setCurrentRow( 0 ); } } else if ( mDlg->listBoxInterfaces->count() ) { // No interface from KNemo. Select first entry in list. mDlg->listBoxInterfaces->setCurrentRow( 0 ); } } void ConfigDialog::save() { KSharedConfig::Ptr config = KSharedConfig::openConfig( QLatin1String("knemorc") ); QStringList list; // Remove interfaces from the config that were deleted during this session foreach ( QString delIface, mDeletedIfaces ) { if ( !mSettingsMap.contains( delIface ) ) { config->deleteGroup( confg_interface + delIface ); config->deleteGroup( confg_plotter + delIface ); } } QStringList groupList = config->groupList(); foreach ( QString tempDel, groupList ) { if ( tempDel.contains( confg_statsRule ) || tempDel.contains( confg_warnRule ) ) config->deleteGroup( tempDel ); } foreach ( QString it, mSettingsMap.keys() ) { list.append( it ); InterfaceSettings* settings = mSettingsMap.value( it ); KConfigGroup interfaceGroup( config, confg_interface + it ); // Preserve settings set by the app before delete QPoint plotterPos = interfaceGroup.readEntry( conf_plotterPos, QPoint() ); QSize plotterSize = interfaceGroup.readEntry( conf_plotterSize, QSize() ); QPoint statisticsPos = interfaceGroup.readEntry( conf_statisticsPos, QPoint() ); QSize statisticsSize = interfaceGroup.readEntry( conf_statisticsSize, QSize() ); QPoint statusPos = interfaceGroup.readEntry( conf_statusPos, QPoint() ); QSize statusSize = interfaceGroup.readEntry( conf_statusSize, QSize() ); QByteArray hourState = interfaceGroup.readEntry( conf_hourState, QByteArray() ); QByteArray dayState = interfaceGroup.readEntry( conf_dayState, QByteArray() ); QByteArray weekState = interfaceGroup.readEntry( conf_weekState, QByteArray() ); QByteArray monthState = interfaceGroup.readEntry( conf_monthState, QByteArray() ); QByteArray billingState = interfaceGroup.readEntry( conf_billingState, QByteArray() ); QByteArray yearState = interfaceGroup.readEntry( conf_yearState, QByteArray() ); // Make sure we don't get crufty commands left over interfaceGroup.deleteGroup(); if ( !plotterPos.isNull() ) interfaceGroup.writeEntry( conf_plotterPos, plotterPos ); if ( !plotterSize.isEmpty() ) interfaceGroup.writeEntry( conf_plotterSize, plotterSize ); if ( !statisticsPos.isNull() ) interfaceGroup.writeEntry( conf_statisticsPos, statisticsPos ); if ( !statisticsSize.isEmpty() ) interfaceGroup.writeEntry( conf_statisticsSize, statisticsSize ); if ( !statusPos.isNull() ) interfaceGroup.writeEntry( conf_statusPos, statusPos ); if ( !statusSize.isEmpty() ) interfaceGroup.writeEntry( conf_statusSize, statusSize ); if ( !settings->alias.trimmed().isEmpty() ) interfaceGroup.writeEntry( conf_alias, settings->alias ); if ( !hourState.isNull() ) interfaceGroup.writeEntry( conf_hourState, hourState ); if ( !dayState.isNull() ) interfaceGroup.writeEntry( conf_dayState, dayState ); if ( !weekState.isNull() ) interfaceGroup.writeEntry( conf_weekState, weekState ); if ( !monthState.isNull() ) interfaceGroup.writeEntry( conf_monthState, monthState ); if ( !billingState.isNull() ) interfaceGroup.writeEntry( conf_billingState, billingState ); if ( !yearState.isNull() ) interfaceGroup.writeEntry( conf_yearState, yearState ); interfaceGroup.writeEntry( conf_minVisibleState, settings->minVisibleState ); interfaceGroup.writeEntry( conf_trafficThreshold, settings->trafficThreshold ); interfaceGroup.writeEntry( conf_iconTheme, settings->iconTheme ); if ( settings->iconTheme == TEXT_THEME || settings->iconTheme == NETLOAD_THEME ) { - interfaceGroup.writeEntry( conf_colorIncoming, settings->colorIncoming ); - interfaceGroup.writeEntry( conf_colorOutgoing, settings->colorOutgoing ); - interfaceGroup.writeEntry( conf_colorDisabled, settings->colorDisabled ); - interfaceGroup.writeEntry( conf_colorUnavailable, settings->colorUnavailable ); - interfaceGroup.writeEntry( conf_dynamicColor, settings->dynamicColor ); - if ( settings->dynamicColor ) - { - interfaceGroup.writeEntry( conf_colorIncomingMax, settings->colorIncomingMax ); - interfaceGroup.writeEntry( conf_colorOutgoingMax, settings->colorOutgoingMax ); - } if ( settings->iconTheme == NETLOAD_THEME ) { interfaceGroup.writeEntry( conf_barScale, settings->barScale ); } - if ( settings->dynamicColor || - ( settings->iconTheme == NETLOAD_THEME && settings->barScale ) - ) + if ( settings->iconTheme == NETLOAD_THEME && settings->barScale ) { interfaceGroup.writeEntry( conf_inMaxRate, settings->inMaxRate ); interfaceGroup.writeEntry( conf_outMaxRate, settings->outMaxRate ); } } interfaceGroup.writeEntry( conf_activateStatistics, settings->activateStatistics ); interfaceGroup.writeEntry( conf_calendarSystem, static_cast(settings->calendarSystem) ); interfaceGroup.writeEntry( conf_statsRules, settings->statsRules.count() ); for ( int i = 0; i < settings->statsRules.count(); i++ ) { QString group = QString::fromLatin1( "%1%2 #%3" ).arg( confg_statsRule ).arg( it ).arg( i ); KConfigGroup statsGroup( config, group ); statsGroup.writeEntry( conf_statsStartDate, settings->statsRules[i].startDate ); statsGroup.writeEntry( conf_statsPeriodUnits, settings->statsRules[i].periodUnits ); statsGroup.writeEntry( conf_statsPeriodCount, settings->statsRules[i].periodCount ); statsGroup.writeEntry( conf_logOffpeak, settings->statsRules[i].logOffpeak ); if ( settings->statsRules[i].logOffpeak ) { statsGroup.writeEntry( conf_offpeakStartTime, settings->statsRules[i].offpeakStartTime.toString( Qt::ISODate ) ); statsGroup.writeEntry( conf_offpeakEndTime, settings->statsRules[i].offpeakEndTime.toString( Qt::ISODate ) ); statsGroup.writeEntry( conf_weekendIsOffpeak, settings->statsRules[i].weekendIsOffpeak ); if ( settings->statsRules[i].weekendIsOffpeak ) { statsGroup.writeEntry( conf_weekendDayStart, settings->statsRules[i].weekendDayStart ); statsGroup.writeEntry( conf_weekendDayEnd, settings->statsRules[i].weekendDayEnd ); statsGroup.writeEntry( conf_weekendTimeStart, settings->statsRules[i].weekendTimeStart.toString( Qt::ISODate ) ); statsGroup.writeEntry( conf_weekendTimeEnd, settings->statsRules[i].weekendTimeEnd.toString( Qt::ISODate ) ); } } } interfaceGroup.writeEntry( conf_warnRules, settings->warnRules.count() ); for ( int i = 0; i < settings->warnRules.count(); i++ ) { QString group = QString::fromLatin1( "%1%2 #%3" ).arg( confg_warnRule ).arg( it ).arg( i ); KConfigGroup warnGroup( config, group ); if ( settings->statsRules.count() == 0 && settings->warnRules[i].periodUnits == KNemoStats::BillPeriod ) { warnGroup.writeEntry( conf_warnPeriodUnits, static_cast(KNemoStats::Month) ); } else { warnGroup.writeEntry( conf_warnPeriodUnits, settings->warnRules[i].periodUnits ); } warnGroup.writeEntry( conf_warnPeriodCount, settings->warnRules[i].periodCount ); warnGroup.writeEntry( conf_warnTrafficType, settings->warnRules[i].trafficType ); warnGroup.writeEntry( conf_warnTrafficDirection, settings->warnRules[i].trafficDirection ); warnGroup.writeEntry( conf_warnTrafficUnits, settings->warnRules[i].trafficUnits ); warnGroup.writeEntry( conf_warnThreshold, settings->warnRules[i].threshold ); warnGroup.writeEntry( conf_warnCustomText, settings->warnRules[i].customText.trimmed() ); } } KConfigGroup generalGroup( config, confg_general ); generalGroup.writeEntry( conf_firstStart, false ); generalGroup.writeEntry( conf_autoStart, mDlg->checkBoxStartKNemo->isChecked() ); generalGroup.writeEntry( conf_pollInterval, mDlg->comboBoxPoll->itemData( mDlg->comboBoxPoll->currentIndex() ).value() ); generalGroup.writeEntry( conf_saveInterval, mDlg->numInputSaveInterval->value() ); generalGroup.writeEntry( conf_useBitrate, mDlg->useBitrate->isChecked() ); generalGroup.writeEntry( conf_toolTipContent, mToolTipContent ); generalGroup.writeEntry( conf_interfaces, list ); config->sync(); QDBusMessage reply = QDBusInterface(QLatin1String("org.kde.knemo"), QLatin1String("/knemo"), QLatin1String("org.kde.knemo")).call(QLatin1String("reparseConfiguration")); } void ConfigDialog::defaults() { // Set these values before we check for default interfaces mSettingsMap.clear(); mDlg->listBoxInterfaces->clear(); mDlg->pushButtonDelete->setEnabled( false ); InterfaceSettings emptySettings; updateControls( &emptySettings ); // Default interface void *cache = NULL; #ifdef __linux__ struct nl_sock *rtsock = nl_socket_alloc(); int c = nl_connect(rtsock, NETLINK_ROUTE); if ( c >= 0 ) { rtnl_route_alloc_cache( rtsock, AF_UNSPEC, 0, reinterpret_cast(&cache) ); } #endif QString interface = getDefaultRoute( AF_INET, NULL, cache ); if ( interface.isEmpty() ) interface = getDefaultRoute( AF_INET6, NULL, cache ); #ifdef __linux__ nl_cache_free( static_cast(cache) ); nl_close( rtsock ); nl_socket_free( rtsock ); #endif if ( interface.isEmpty() ) { mDlg->aliasLabel->setEnabled( false ); mDlg->lineEditAlias->setEnabled( false ); mDlg->ifaceTab->setEnabled( false ); mDlg->pixmapError->clear(); mDlg->pixmapDisconnected->clear(); mDlg->pixmapConnected->clear(); mDlg->pixmapIncoming->clear(); mDlg->pixmapOutgoing->clear(); mDlg->pixmapTraffic->clear(); } else { InterfaceSettings* settings = new InterfaceSettings(); - KColorScheme scheme(QPalette::Active, KColorScheme::View); - settings->colorDisabled = scheme.foreground( KColorScheme::InactiveText ).color(); - settings->colorUnavailable = scheme.foreground( KColorScheme::InactiveText ).color(); - settings->colorBackground = scheme.foreground( KColorScheme::InactiveText ).color(); mSettingsMap.insert( interface, settings ); mDlg->listBoxInterfaces->addItem( interface ); mDlg->listBoxInterfaces->setCurrentRow( 0 ); mDlg->pushButtonDelete->setEnabled( true ); mDlg->aliasLabel->setEnabled( true ); mDlg->lineEditAlias->setEnabled( true ); mDlg->ifaceTab->setEnabled( true ); } // Default general settings GeneralSettings g; int index = mDlg->comboBoxPoll->findData( g.pollInterval ); if ( index >= 0 ) mDlg->comboBoxPoll->setCurrentIndex( index ); mDlg->numInputSaveInterval->setValue( g.saveInterval ); mDlg->useBitrate->setChecked( g.useBitrate ); // Default tool tips mToolTipContent = g.toolTipContent; setupToolTipTab(); changed( true ); } void ConfigDialog::checkBoxStartKNemoToggled( bool on ) { if ( on ) { KSharedConfig::Ptr config = KSharedConfig::openConfig( QLatin1String("knemorc") ); KConfigGroup generalGroup( config, confg_general ); if ( generalGroup.readEntry( conf_firstStart, true ) ) { // Populate the dialog with some default values if the user starts // KNemo for the very first time. defaults(); } } if (!mLock) changed( true ); } /****************************************** * * * Interface tab * * * ******************************************/ InterfaceSettings * ConfigDialog::getItemSettings() { if ( !mDlg->listBoxInterfaces->currentItem() ) return NULL; QListWidgetItem* selected = mDlg->listBoxInterfaces->currentItem(); return mSettingsMap[selected->text()]; } QString ConfigDialog::findNameFromIndex( int index ) { KNemoTheme theme = mDlg->comboBoxIconTheme->itemData( index ).value(); return theme.internalName; } int ConfigDialog::findIndexFromName( const QString& internalName ) { for( int i = 0; i < mDlg->comboBoxIconTheme->count(); i++ ) { KNemoTheme theme = mDlg->comboBoxIconTheme->itemData( i ).value(); if ( theme.internalName == internalName ) return i; } return -1; } void ConfigDialog::updateWarnText( int oldCount ) { // If the billing periods go away, the warn period will change to months // This only changes the text displayed in the model, so it can change // back if a billing period reappears. if ( ! statsModel->rowCount() ) { QList warnRules = warnModel->getRules(); for ( int i = 0; i < warnRules.count(); ++i ) { if ( warnRules[i].periodUnits == KNemoStats::BillPeriod ) { warnModel->item( i, 1 )->setData( periodText( warnRules[i].periodCount, KNemoStats::Month ), Qt::DisplayRole ); } } } else if ( oldCount == 0 ) { QList warnRules = warnModel->getRules(); for ( int i = 0; i < warnRules.count(); ++i ) { if ( warnRules[i].periodUnits == KNemoStats::BillPeriod ) warnModel->item( i, 1 )->setData( periodText( warnRules[i].periodCount, warnRules[i].periodUnits ), Qt::DisplayRole ); } } } void ConfigDialog::updateControls( InterfaceSettings *settings ) { mLock = true; mDlg->lineEditAlias->setText( settings->alias ); int index = findIndexFromName( settings->iconTheme ); if ( index < 0 ) index = findIndexFromName( TEXT_THEME ); mDlg->comboBoxIconTheme->setCurrentIndex( index ); - mDlg->colorIncoming->setColor( settings->colorIncoming ); - mDlg->colorOutgoing->setColor( settings->colorOutgoing ); - mDlg->colorDisabled->setColor( settings->colorDisabled ); - mDlg->colorUnavailable->setColor( settings->colorUnavailable ); iconThemeChanged( index ); switch ( settings->minVisibleState ) { case KNemoIface::Connected: index = 1; break; case KNemoIface::Available: index = 2; break; case KNemoIface::MaxState: index = 3; break; default: index = 0; } mDlg->comboHiding->setCurrentIndex( index ); comboHidingChanged( index ); mDlg->checkBoxStatistics->setChecked( settings->activateStatistics ); if ( !mCalendar || mCalendar->calendarSystem() != settings->calendarSystem ) mCalendar = KCalendarSystem::create( settings->calendarSystem ); statsModel->removeRows(0, statsModel->rowCount() ); statsModel->setCalendar( mCalendar ); foreach( StatsRule s, settings->statsRules ) { statsModel->addRule( s ); } if ( statsModel->rowCount() ) { QSortFilterProxyModel* proxy = static_cast(mDlg->statsView->model()); QModelIndex index = statsModel->indexFromItem( statsModel->item( 0, 0 ) ); mDlg->statsView->setCurrentIndex( proxy->mapFromSource( index ) ); } mDlg->modifyStats->setEnabled( statsModel->rowCount() ); mDlg->removeStats->setEnabled( statsModel->rowCount() ); warnModel->removeRows(0, warnModel->rowCount() ); foreach( WarnRule warn, settings->warnRules ) { warnModel->addWarn( warn ); } updateWarnText( statsModel->rowCount() ); mDlg->modifyWarn->setEnabled( warnModel->rowCount() ); mDlg->removeWarn->setEnabled( warnModel->rowCount() ); if ( warnModel->rowCount() ) { mDlg->warnView->setCurrentIndex( warnModel->indexFromItem ( warnModel->item( 0, 0 ) ) ); } mLock = false; } void ConfigDialog::interfaceSelected( int row ) { if ( row < 0 ) return; QString interface = mDlg->listBoxInterfaces->item( row )->text(); InterfaceSettings* settings = mSettingsMap[interface]; mDlg->ifaceTab->setEnabled( true ); mDlg->aliasLabel->setEnabled( true ); mDlg->lineEditAlias->setEnabled( true ); updateControls( settings ); } void ConfigDialog::buttonNewSelected() { bool ok = false; QString ifname = QInputDialog::getText( this, i18n( "Add new interface" ), i18n( "Please enter the name of the interface to be monitored.\nIt should be something like 'eth1', 'wlan2' or 'ppp0'." ), QLineEdit::Normal, QString::null, &ok ); if ( ok ) { QListWidgetItem *item = new QListWidgetItem( ifname ); mDlg->listBoxInterfaces->addItem( item ); InterfaceSettings *settings = new InterfaceSettings(); KColorScheme scheme(QPalette::Active, KColorScheme::View); - settings->colorDisabled = scheme.foreground( KColorScheme::InactiveText ).color(); - settings->colorUnavailable = scheme.foreground( KColorScheme::InactiveText ).color(); - settings->colorBackground = scheme.foreground( KColorScheme::InactiveText ).color(); mSettingsMap.insert( ifname, settings ); mDlg->listBoxInterfaces->setCurrentRow( mDlg->listBoxInterfaces->row( item ) ); mDlg->pushButtonDelete->setEnabled( true ); changed( true ); } } void ConfigDialog::buttonAllSelected() { QStringList ifaces; #ifdef __linux__ nl_cache * linkCache = NULL; nl_sock *rtsock = nl_socket_alloc(); int c = nl_connect(rtsock, NETLINK_ROUTE); if ( c >= 0 ) { rtnl_link_alloc_cache( rtsock, AF_UNSPEC, &linkCache ); struct rtnl_link * rtlink; for ( rtlink = reinterpret_cast(nl_cache_get_first( linkCache )); rtlink != NULL; rtlink = reinterpret_cast(nl_cache_get_next( reinterpret_cast(rtlink) )) ) { QString ifname( QLatin1String(rtnl_link_get_name( rtlink )) ); ifaces << ifname; } } nl_cache_free( linkCache ); nl_close( rtsock ); nl_socket_free( rtsock ); #else struct ifaddrs *ifaddr; struct ifaddrs *ifa; getifaddrs( &ifaddr ); for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { QString ifname( ifa->ifa_name ); ifaces << ifname; } freeifaddrs( ifaddr ); #endif ifaces.removeAll( QLatin1String("lo") ); ifaces.removeAll( QLatin1String("lo0") ); const KColorScheme scheme(QPalette::Active, KColorScheme::View); foreach ( QString ifname, ifaces ) { if ( mSettingsMap.contains( ifname ) ) continue; InterfaceSettings* settings = new InterfaceSettings(); - settings->colorDisabled = scheme.foreground( KColorScheme::InactiveText ).color(); - settings->colorUnavailable = scheme.foreground( KColorScheme::InactiveText ).color(); - settings->colorBackground = scheme.foreground( KColorScheme::InactiveText ).color(); mSettingsMap.insert( ifname, settings ); mDlg->listBoxInterfaces->addItem( ifname ); } if ( mDlg->listBoxInterfaces->count() > 0 ) { mDlg->listBoxInterfaces->setCurrentRow( 0 ); mDlg->pushButtonDelete->setEnabled( true ); mDlg->ifaceTab->setEnabled( true ); QString iface = mDlg->listBoxInterfaces->item( 0 )->text(); } changed( true ); } void ConfigDialog::buttonDeleteSelected() { if ( !mDlg->listBoxInterfaces->currentItem() ) return; QListWidgetItem* selected = mDlg->listBoxInterfaces->currentItem(); // To prevent bloat when we save if ( !mDeletedIfaces.contains( selected->text() ) ) mDeletedIfaces << selected->text(); mSettingsMap.remove( selected->text() ); QListWidgetItem *taken = mDlg->listBoxInterfaces->takeItem( mDlg->listBoxInterfaces->row( selected ) ); delete taken; if ( mDlg->listBoxInterfaces->count() < 1 ) { InterfaceSettings emptySettings; updateControls( &emptySettings ); mDlg->pushButtonDelete->setEnabled( false ); mDlg->aliasLabel->setEnabled( false ); mDlg->lineEditAlias->setEnabled( false ); mDlg->ifaceTab->setEnabled( false ); mDlg->pixmapError->clear(); mDlg->pixmapDisconnected->clear(); mDlg->pixmapConnected->clear(); mDlg->pixmapIncoming->clear(); mDlg->pixmapOutgoing->clear(); mDlg->pixmapTraffic->clear(); } changed( true ); } void ConfigDialog::aliasChanged( const QString& text ) { InterfaceSettings* settings = getItemSettings(); if ( !settings ) return; settings->alias = text; if (!mLock) changed( true ); } /****************************************** * * * Interface tab - Icon Appearance * * * ******************************************/ QPixmap ConfigDialog::textIcon( QString incomingText, QString outgoingText, int status ) { QPixmap sampleIcon( 22, 22 ); sampleIcon.fill( Qt::transparent ); QRect topRect( 0, 0, 22, 11 ); QRect bottomRect( 0, 11, 22, 11 ); QPainter p( &sampleIcon ); p.setBrush( Qt::NoBrush ); p.setOpacity( 1.0 ); Plasma::Theme theme; QFont rxFont = setIconFont( incomingText, theme.smallestFont(), 22 ); QFont txFont = setIconFont( outgoingText, theme.smallestFont(), 22 ); if ( rxFont.pointSizeF() > txFont.pointSizeF() ) rxFont.setPointSizeF( txFont.pointSizeF() ); p.setFont( rxFont ); if ( status >= KNemoIface::Connected ) - p.setPen( mDlg->colorIncoming->color() ); + p.setPen( KColorScheme(QPalette::Active).foreground(KColorScheme::ActiveText).color() ); else if ( status == KNemoIface::Available ) - p.setPen( mDlg->colorDisabled->color() ); + p.setPen( KColorScheme(QPalette::Active).foreground(KColorScheme::InactiveText).color() ); else - p.setPen( mDlg->colorUnavailable->color() ); + p.setPen( KColorScheme(QPalette::Active).foreground(KColorScheme::NegativeText).color() ); p.drawText( topRect, Qt::AlignCenter | Qt::AlignRight, incomingText ); p.setFont( rxFont ); if ( status >= KNemoIface::Connected ) - p.setPen( mDlg->colorOutgoing->color() ); + p.setPen( KColorScheme(QPalette::Active).foreground(KColorScheme::NeutralText).color() ); p.drawText( bottomRect, Qt::AlignCenter | Qt::AlignRight, outgoingText ); return sampleIcon; } QPixmap ConfigDialog::barIcon( int status ) { int barIncoming = 0; int barOutgoing = 0; QPixmap barIcon( 22, 22 ); barIcon.fill( Qt::transparent ); QPainter p( &barIcon ); - - QLinearGradient inGrad( 12, 0, 19, 0 ); - QLinearGradient topInGrad( 12, 0, 19, 0 ); - QLinearGradient outGrad( 3, 0, 10, 0 ); - QLinearGradient topOutGrad( 3, 0, 10, 0 ); - - QColor topColor = getItemSettings()->colorBackground; - QColor topColorD = getItemSettings()->colorBackground.darker(); - topColor.setAlpha( 128 ); - topColorD.setAlpha( 128 ); - topInGrad.setColorAt(0, topColorD); - topInGrad.setColorAt(1, topColor ); - topOutGrad.setColorAt(0, topColorD); - topOutGrad.setColorAt(1, topColor ); + QColor rxColor; + QColor txColor; + QColor bgColor = KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::InactiveText).color(); + bgColor.setAlpha( 77 ); if ( status & KNemoIface::Connected ) { - inGrad.setColorAt(0, mDlg->colorIncoming->color() ); - inGrad.setColorAt(1, mDlg->colorIncoming->color().darker() ); - outGrad.setColorAt(0, mDlg->colorOutgoing->color() ); - outGrad.setColorAt(1, mDlg->colorOutgoing->color().darker() ); + rxColor = KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::ActiveText).color(); + txColor = KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::NeutralText).color(); } else if ( status & KNemoIface::Available ) { - inGrad.setColorAt(0, mDlg->colorDisabled->color()); - inGrad.setColorAt(1, mDlg->colorDisabled->color().darker() ); - outGrad.setColorAt(0, mDlg->colorDisabled->color() ); - outGrad.setColorAt(1, mDlg->colorDisabled->color().darker() ); + rxColor = KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::InactiveText).color(); + rxColor.setAlpha( 153 ); + txColor = rxColor; } else { - inGrad.setColorAt(0, mDlg->colorUnavailable->color() ); - inGrad.setColorAt(1, mDlg->colorUnavailable->color().darker() ); - outGrad.setColorAt(0, mDlg->colorUnavailable->color() ); - outGrad.setColorAt(1, mDlg->colorUnavailable->color().darker() ); + rxColor = KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::NegativeText).color(); + txColor = rxColor; } if ( status & KNemoIface::Available || status & KNemoIface::Unavailable ) { barIncoming = 22; barOutgoing = 22; } if ( status & KNemoIface::RxTraffic ) barIncoming = 17; if ( status & KNemoIface::TxTraffic ) barOutgoing = 17; int top = 22 - barOutgoing; QRect topLeftRect( 3, 0, 7, top ); QRect leftRect( 3, top, 7, 22 ); top = 22 - barIncoming; QRect topRightRect( 12, 0, 7, top ); QRect rightRect( 12, top, 7, 22 ); - QBrush brush( inGrad ); - p.setBrush( brush ); - p.fillRect( rightRect, inGrad ); - brush = QBrush( topInGrad ); - p.fillRect( topRightRect, topInGrad ); - brush = QBrush( outGrad ); - p.fillRect( leftRect, outGrad ); - brush = QBrush( topOutGrad ); - p.fillRect( topLeftRect, topOutGrad ); + p.fillRect( rightRect, rxColor ); + p.fillRect( leftRect, txColor ); + p.fillRect( topRightRect, bgColor ); + p.fillRect( topLeftRect, bgColor ); return barIcon; } void ConfigDialog::comboHidingChanged( int val ) { InterfaceSettings* settings = getItemSettings(); if ( !settings ) return; switch ( val ) { case 0: // Do not hide settings->minVisibleState = KNemoIface::UnknownState; break; case 1: // Hide when disconnected settings->minVisibleState = KNemoIface::Connected; break; case 2: // Hide when unavailable settings->minVisibleState = KNemoIface::Available; break; case 3: // Always hide settings->minVisibleState = KNemoIface::MaxState; break; } if (!mLock) changed( true ); } void ConfigDialog::iconThemeChanged( int set ) { InterfaceSettings* settings = getItemSettings(); if ( !settings ) return; KNemoTheme curTheme = mDlg->comboBoxIconTheme->itemData( mDlg->comboBoxIconTheme->currentIndex() ).value(); if ( curTheme.internalName == TEXT_THEME || curTheme.internalName == NETLOAD_THEME ) { if ( curTheme.internalName == TEXT_THEME ) { QString f1 = QStringLiteral("0.0K"); QString f2 = QStringLiteral("123K"); QString f3 = QStringLiteral("12K"); settings->iconTheme = TEXT_THEME; mDlg->pixmapError->setPixmap( textIcon( f1, f1, KNemoIface::Unavailable ) ); mDlg->pixmapDisconnected->setPixmap( textIcon( f1, f1, KNemoIface::Available ) ); mDlg->pixmapConnected->setPixmap( textIcon( f1, f1, KNemoIface::Connected ) ); mDlg->pixmapIncoming->setPixmap( textIcon( f2, f1, KNemoIface::Connected ) ); mDlg->pixmapOutgoing->setPixmap( textIcon( f1, f3, KNemoIface::Connected ) ); mDlg->pixmapTraffic->setPixmap( textIcon( f2, f3, KNemoIface::Connected ) ); } else { settings->iconTheme = NETLOAD_THEME; mDlg->pixmapError->setPixmap( barIcon( KNemoIface::Unavailable ) ); mDlg->pixmapDisconnected->setPixmap( barIcon( KNemoIface::Available ) ); mDlg->pixmapConnected->setPixmap( barIcon( KNemoIface::Connected ) ); mDlg->pixmapIncoming->setPixmap( barIcon( KNemoIface::Connected | KNemoIface::RxTraffic ) ); mDlg->pixmapOutgoing->setPixmap( barIcon( KNemoIface::Connected | KNemoIface::TxTraffic ) ); mDlg->pixmapTraffic->setPixmap( barIcon( KNemoIface::Connected | KNemoIface::RxTraffic | KNemoIface::TxTraffic ) ); } - - mDlg->themeColorBox->setEnabled( true ); } else { settings->iconTheme = findNameFromIndex( set ); QString iconName; if ( settings->iconTheme == SYSTEM_THEME ) iconName = QLatin1String("network-"); else iconName = QLatin1String("knemo-") + settings->iconTheme + QLatin1Char('-'); mDlg->pixmapError->setPixmap( QIcon::fromTheme( iconName + ICON_ERROR ).pixmap( 22 ) ); mDlg->pixmapDisconnected->setPixmap( QIcon::fromTheme( iconName + ICON_OFFLINE ).pixmap( 22 ) ); mDlg->pixmapConnected->setPixmap( QIcon::fromTheme( iconName + ICON_IDLE ).pixmap( 22 ) ); mDlg->pixmapIncoming->setPixmap( QIcon::fromTheme( iconName + ICON_RX ).pixmap( 22 ) ); mDlg->pixmapOutgoing->setPixmap( QIcon::fromTheme( iconName + ICON_TX ).pixmap( 22 ) ); mDlg->pixmapTraffic->setPixmap( QIcon::fromTheme( iconName + ICON_RX_TX ).pixmap( 22 ) ); - mDlg->themeColorBox->setEnabled( false ); } if (!mLock) changed( true ); } -void ConfigDialog::colorButtonChanged() -{ - InterfaceSettings* settings = getItemSettings(); - if ( !settings ) - return; - - if ( mDlg->colorIncoming->color().isValid() ) - settings->colorIncoming = mDlg->colorIncoming->color(); - if ( mDlg->colorOutgoing->color().isValid() ) - settings->colorOutgoing = mDlg->colorOutgoing->color(); - if ( mDlg->colorDisabled->color().isValid() ) - settings->colorDisabled = mDlg->colorDisabled->color(); - if ( mDlg->colorUnavailable->color().isValid() ) - settings->colorUnavailable = mDlg->colorUnavailable->color(); - - KNemoTheme curTheme = mDlg->comboBoxIconTheme->itemData( mDlg->comboBoxIconTheme->currentIndex() ).value(); - if ( curTheme.internalName == TEXT_THEME || - curTheme.internalName == NETLOAD_THEME ) - iconThemeChanged( mDlg->comboBoxIconTheme->currentIndex() ); - if ( !mLock) changed( true ); -} - void ConfigDialog::advancedButtonClicked() { InterfaceSettings* settings = getItemSettings(); if ( !settings ) return; ThemeConfig dlg( *settings ); if ( dlg.exec() ) { InterfaceSettings s = dlg.settings(); settings->trafficThreshold = s.trafficThreshold; - settings->dynamicColor = s.dynamicColor; - settings->colorIncomingMax = s.colorIncomingMax; - settings->colorOutgoingMax = s.colorOutgoingMax; settings->barScale = s.barScale; settings->inMaxRate = s.inMaxRate; settings->outMaxRate = s.outMaxRate; changed( true ); } } void ConfigDialog::addStatsClicked() { InterfaceSettings* settings = getItemSettings(); if ( !settings ) return; StatsRule rule; int oldRuleCount = statsModel->rowCount(); StatsConfig dlg( settings, mCalendar, rule, true ); if ( dlg.exec() ) { rule = dlg.settings(); QSortFilterProxyModel* proxy = static_cast(mDlg->statsView->model()); QModelIndex index = statsModel->addRule( rule ); mDlg->statsView->setCurrentIndex( proxy->mapFromSource( index ) ); settings->statsRules = statsModel->getRules(); mDlg->modifyStats->setEnabled( true ); mDlg->removeStats->setEnabled( true ); updateWarnText( oldRuleCount ); changed( true ); } } void ConfigDialog::modifyStatsClicked() { InterfaceSettings* settings = getItemSettings(); if ( !settings || mDlg->statsView->model()->rowCount() < 1 ) return; QModelIndex index = mDlg->statsView->selectionModel()->currentIndex(); if ( !index.isValid() ) return; QSortFilterProxyModel* proxy = static_cast(mDlg->statsView->model()); index = proxy->mapToSource( index ); StatsRule s = statsModel->item( index.row(), 0 )->data( Qt::UserRole ).value(); StatsConfig dlg( settings, mCalendar, s, false ); if ( dlg.exec() ) { s = dlg.settings(); statsModel->modifyRule( index, s ); settings->statsRules = statsModel->getRules(); changed( true ); } } void ConfigDialog::removeStatsClicked() { InterfaceSettings* settings = getItemSettings(); if ( !settings || mDlg->statsView->model()->rowCount() < 1 ) return; QModelIndex index = mDlg->statsView->selectionModel()->currentIndex(); if ( !index.isValid() ) return; QSortFilterProxyModel* proxy = static_cast(mDlg->statsView->model()); index = proxy->mapToSource( index ); statsModel->removeRow( index.row() ); settings->statsRules = statsModel->getRules(); mDlg->modifyStats->setEnabled( statsModel->rowCount() ); mDlg->removeStats->setEnabled( statsModel->rowCount() ); updateWarnText( statsModel->rowCount() ); changed( true ); } void ConfigDialog::addWarnClicked() { InterfaceSettings* settings = getItemSettings(); if ( !settings ) return; WarnRule warn; WarnConfig dlg( settings, warn, true ); if ( dlg.exec() ) { warn = dlg.settings(); QModelIndex index = warnModel->addWarn( warn ); mDlg->warnView->setCurrentIndex( index ); settings->warnRules = warnModel->getRules(); changed( true ); mDlg->modifyWarn->setEnabled( true ); mDlg->removeWarn->setEnabled( true ); } } void ConfigDialog::modifyWarnClicked() { InterfaceSettings* settings = getItemSettings(); if ( !settings || mDlg->warnView->model()->rowCount() < 1 ) return; const QModelIndex index = mDlg->warnView->selectionModel()->currentIndex(); if ( !index.isValid() ) return; WarnRule warn = mDlg->warnView->model()->data( index.sibling( index.row(), 0 ), Qt::UserRole ).value(); WarnConfig dlg( settings, warn, false ); if ( dlg.exec() ) { warn = dlg.settings(); warnModel->modifyWarn( index, warn ); settings->warnRules = warnModel->getRules(); changed( true ); } } void ConfigDialog::removeWarnClicked() { InterfaceSettings* settings = getItemSettings(); if ( !settings || mDlg->warnView->model()->rowCount() < 1 ) return; const QModelIndex index = mDlg->warnView->selectionModel()->currentIndex(); if ( !index.isValid() ) return; warnModel->removeRow( index.row() ); settings->warnRules = warnModel->getRules(); mDlg->modifyWarn->setEnabled( warnModel->rowCount() ); mDlg->removeWarn->setEnabled( warnModel->rowCount() ); changed( true ); } /****************************************** * * * Interface tab - Statistics * * * ******************************************/ void ConfigDialog::checkBoxStatisticsToggled( bool on ) { InterfaceSettings* settings = getItemSettings(); if ( !settings ) return; settings->activateStatistics = on; if (!mLock) changed( true ); } /****************************************** * * * ToolTip tab * * * ******************************************/ void ConfigDialog::setupToolTipMap() { // Cannot make this data static as the i18n macro doesn't seem // to work when called to early i.e. before setting the catalogue. mToolTips.insert( INTERFACE, i18n( "Interface" ) ); mToolTips.insert( STATUS, i18n( "Status" ) ); mToolTips.insert( UPTIME, i18n( "Connection Time" ) ); mToolTips.insert( IP_ADDRESS, i18n( "IP Address" ) ); mToolTips.insert( SCOPE, i18n( "Scope & Flags" ) ); mToolTips.insert( HW_ADDRESS, i18n( "MAC Address" ) ); mToolTips.insert( BCAST_ADDRESS, i18n( "Broadcast Address" ) ); mToolTips.insert( GATEWAY, i18n( "Default Gateway" ) ); mToolTips.insert( PTP_ADDRESS, i18n( "PtP Address" ) ); mToolTips.insert( RX_PACKETS, i18n( "Packets Received" ) ); mToolTips.insert( TX_PACKETS, i18n( "Packets Sent" ) ); mToolTips.insert( RX_BYTES, i18n( "Bytes Received" ) ); mToolTips.insert( TX_BYTES, i18n( "Bytes Sent" ) ); mToolTips.insert( DOWNLOAD_SPEED, i18n( "Download Speed" ) ); mToolTips.insert( UPLOAD_SPEED, i18n( "Upload Speed" ) ); mToolTips.insert( ESSID, i18n( "ESSID" ) ); mToolTips.insert( MODE, i18n( "Mode" ) ); mToolTips.insert( FREQUENCY, i18n( "Frequency" ) ); mToolTips.insert( BIT_RATE, i18n( "Bit Rate" ) ); mToolTips.insert( ACCESS_POINT, i18n( "Access Point" ) ); mToolTips.insert( LINK_QUALITY, i18n( "Link Quality" ) ); #ifndef __linux__ mToolTips.insert( NICK_NAME, i18n( "Nickname" ) ); #endif mToolTips.insert( ENCRYPTION, i18n( "Encryption" ) ); } void ConfigDialog::setupToolTipTab() { mDlg->listBoxDisplay->clear(); mDlg->listBoxAvailable->clear(); foreach ( QString tip, mToolTips ) { if ( mToolTipContent & mToolTips.key( tip ) ) mDlg->listBoxDisplay->addItem( tip ); else mDlg->listBoxAvailable->addItem( tip ); } if ( mDlg->listBoxDisplay->count() > 0 ) mDlg->listBoxDisplay->item( 0 )->setSelected( true ); if ( mDlg->listBoxAvailable->count() > 0 ) mDlg->listBoxAvailable->item( 0 )->setSelected( true ); mDlg->pushButtonRemoveToolTip->setEnabled( (mDlg->listBoxDisplay->count() > 0) ); mDlg->pushButtonAddToolTip->setEnabled( (mDlg->listBoxAvailable->count() > 0) ); } void ConfigDialog::moveTips( QListWidget *from, QListWidget* to ) { QList selectedItems = from->selectedItems(); foreach ( QListWidgetItem *selected, selectedItems ) { quint32 key = mToolTips.key( selected->text() ); int newIndex = -1; int count = to->count(); for ( int i = 0; i < count; i++ ) { QListWidgetItem *item = to->item( i ); if ( mToolTips.key( item->text() ) > key ) { newIndex = i; break; } } if ( newIndex < 0 ) newIndex = count; selected->setSelected( false ); from->takeItem( from->row( selected ) ); to->insertItem( newIndex, selected ); mDlg->pushButtonAddToolTip->setEnabled( (mDlg->listBoxAvailable->count() > 0) ); mDlg->pushButtonRemoveToolTip->setEnabled( (mDlg->listBoxDisplay->count() > 0) ); changed( true ); } mToolTipContent = 0; for ( int i = 0; i < mDlg->listBoxDisplay->count(); i++ ) mToolTipContent += mToolTips.key( mDlg->listBoxDisplay->item( i )->text() ); } void ConfigDialog::buttonAddToolTipSelected() { // Support extended selection if ( mDlg->listBoxAvailable->count() == 0 ) return; moveTips( mDlg->listBoxAvailable, mDlg->listBoxDisplay ); } void ConfigDialog::buttonRemoveToolTipSelected() { // Support extended selection if ( mDlg->listBoxDisplay->count() == 0 ) return; moveTips( mDlg->listBoxDisplay, mDlg->listBoxAvailable ); } /****************************************** * * * General tab * * * ******************************************/ void ConfigDialog::buttonNotificationsSelected() { KNotifyConfigWidget::configure( this, QLatin1String("knemo") ); } #include "configdialog.moc" diff --git a/src/kcm/configdialog.h b/src/kcm/configdialog.h index 9d25b99..a1954b4 100644 --- a/src/kcm/configdialog.h +++ b/src/kcm/configdialog.h @@ -1,137 +1,136 @@ /* This file is part of KNemo Copyright (C) 2004, 2005, 2006 Percy Leonhardt Copyright (C) 2009, 2010 John Stamp KNemo is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. KNemo 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef CONFIGDIALOG_H #define CONFIGDIALOG_H #include #include "data.h" #include "ui_configdlg.h" #include class QTreeWidgetItem; class KCalendarSystem; /** * This is the configuration dialog for KNemo * It is implemented as a control center module so that it is still * possible to configure KNemo even when there is no icon visible * in the system tray. * * @short Configuration dialog for KNemo * @author Percy Leonhardt */ class StatsRuleModel : public QStandardItemModel { Q_OBJECT public: StatsRuleModel( QObject *parent = 0 ) : QStandardItemModel( parent ) {} virtual ~StatsRuleModel() {} void setCalendar( const KCalendarSystem *cal ); QModelIndex addRule( const StatsRule &s ); void modifyRule( const QModelIndex &index, const StatsRule &s ); QList getRules(); private: QString dateText( const StatsRule &s ); const KCalendarSystem *mCalendar; }; class WarnModel : public QStandardItemModel { Q_OBJECT public: WarnModel( QObject *parent = 0 ) : QStandardItemModel( parent ) {} virtual ~WarnModel() {} QModelIndex addWarn( const WarnRule &w ); void modifyWarn( const QModelIndex &index, const WarnRule &warn ); QList getRules(); private: QString ruleText( const WarnRule &warn ); }; class ConfigDialog : public KCModule { Q_OBJECT public: /** * Default Constructor */ ConfigDialog( QWidget *parent, const QVariantList &args ); /** * Default Destructor */ virtual ~ConfigDialog(); void load(); void save(); void defaults(); private Q_SLOTS: void buttonNewSelected(); void buttonAllSelected(); void buttonDeleteSelected(); void buttonAddToolTipSelected(); void buttonRemoveToolTipSelected(); void buttonNotificationsSelected(); void interfaceSelected( int row ); void aliasChanged( const QString& text ); void iconThemeChanged( int set ); void comboHidingChanged( int val ); void checkBoxStatisticsToggled( bool on ); void checkBoxStartKNemoToggled( bool on ); - void colorButtonChanged(); void advancedButtonClicked(); void addStatsClicked(); void modifyStatsClicked(); void removeStatsClicked(); void addWarnClicked(); void modifyWarnClicked(); void removeWarnClicked(); void moveTips( QListWidget *from, QListWidget *to ); private: void setupToolTipTab(); void setupToolTipMap(); void updateControls( InterfaceSettings *settings ); InterfaceSettings * getItemSettings(); int findIndexFromName( const QString& internalName ); QString findNameFromIndex( int index ); QPixmap textIcon( QString incomingText, QString outgoingText, int status ); QPixmap barIcon( int status ); void updateWarnText( int oldCount ); int mToolTipContent; bool mLock; Ui::ConfigDlg* mDlg; const KCalendarSystem* mCalendar; int mMaxDay; StatsRuleModel *statsModel; WarnModel *warnModel; QMap mSettingsMap; QMap mToolTips; QList mDeletedIfaces; }; #endif // CONFIGDIALOG_H diff --git a/src/kcm/configdlg.ui b/src/kcm/configdlg.ui index 596dd2e..28c8f60 100644 --- a/src/kcm/configdlg.ui +++ b/src/kcm/configdlg.ui @@ -1,956 +1,888 @@ ConfigDlg 0 0 0 0 Start KNemo automatically when you login 0 Interfaces This lists the interfaces that you wish to monitor. Please use the names understood by <i>ifconfig</i> ('eth0', 'wlan0', 'ppp0', etc.), or click "Add all interfaces" below to include all of the interfaces currently found on your system. true Add a new interface Add all interfaces false Delete the selected interface Qt::Vertical 0 0 false Alias: false false You can enter an alias for the interface. KNemo will use it to differentiate interfaces when it displays tooltips, dialogs, etc. false 0 0 0 Icon Appearance Icon hiding: Do not hide Hide when disconnected Hide when unavailable Always hide Icon theme: false Unavailable false Disconnected false Connected false Incoming traffic false Outgoing traffic false Incoming and outgoing traffic false - - - - Theme Settings - - - - - - - - Incoming traffic: - - - - - - - Outgoing traffic: - - - - - - - Disconnected: - - - - - - - Unavailable: - - - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal QSizePolicy::Expanding 0 0 Advanced... Qt::Vertical 0 0 Statistics Activate statistics false Custom Billing Periods Log traffic statistics according to customized rules. When a custom billing period ends, it will automatically start a new billing period with the same rules. false false Add a new entry Add... Modify... Remove the selected entry Remove Qt::Vertical QSizePolicy::Expanding 0 0 false Traffic Notifications When interface traffic exceeds the limit set by a rule, KNemo will emit a notification. The notification will appear once per period. false false Add a new entry Add... Modify... Remove the selected entry Remove Qt::Vertical QSizePolicy::Expanding 0 0 Qt::Vertical 0 0 ToolTip 0 0 Available: false QAbstractItemView::ExtendedSelection Qt::Vertical QSizePolicy::Expanding 0 0 Qt::Horizontal QSizePolicy::Fixed 5 20 Add the selected entry to the tray icon's tooltip Remove the selected entry from the tray icon's tooltip Qt::Horizontal QSizePolicy::Fixed 5 20 Qt::Vertical QSizePolicy::Expanding 0 0 0 0 Active: false QAbstractItemView::ExtendedSelection Wireless specific information will only appear in the tooltips of wireless devices true General Notifications Configure Notifications... Update interval Update interface information every false Set how often KNemo polls interfaces for information. A lower value will speed up reaction to changes, but it will also increase CPU load. Qt::Horizontal QSizePolicy::Expanding 0 0 Report traffic rate in bit/s Statistics Autosave interval: false Save interface statistics every <i>n</i> seconds. If 0, KNemo will only save statistics when it closes. At shutdown sec 0 300 60 Qt::Horizontal QSizePolicy::Expanding 0 0 Qt::Vertical QSizePolicy::Expanding 0 0 - - - KColorButton - QPushButton -
kcolorbutton.h
-
-
checkBoxStartKNemo tabWidgetConfiguration listBoxInterfaces pushButtonNew pushButtonAll pushButtonDelete lineEditAlias ifaceTab comboHiding comboBoxIconTheme - colorIncoming - colorOutgoing - colorDisabled - colorUnavailable advancedButton checkBoxStatistics statsView addStats modifyStats removeStats warnView addWarn modifyWarn removeWarn listBoxAvailable pushButtonAddToolTip pushButtonRemoveToolTip listBoxDisplay pushButtonNotifications comboBoxPoll useBitrate numInputSaveInterval checkBoxStatistics toggled(bool) groupBox setEnabled(bool) 429 148 496 437 checkBoxStatistics toggled(bool) groupBox_2 setEnabled(bool) 431 146 426 162
diff --git a/src/kcm/themecfg.ui b/src/kcm/themecfg.ui index 4273912..ed8555e 100644 --- a/src/kcm/themecfg.ui +++ b/src/kcm/themecfg.ui @@ -1,282 +1,172 @@ ThemeCfg - + + 0 + + + 0 + + + 0 + + 0 Traffic Traffic activity threshold: If you are on a network with a lot of low-level traffic, you can increase this value so the tray icon does not constantly report activity. packets/sec 1000 Traffic Rate Visualization - - - - If checked, the transmit and receive colors will change according to the traffic rate. As the traffic rate increases, the color will change from the default color, to the max rate color. - - - Change color according to max visual rate - - - If this is checked, the Netload bar graphs will use a constant scale based on the maximum rates below. If unchecked, the bar graphs will change scale according to recent traffic rates. Always scale bar graphs to max visual rate false Max Visual Rate Incoming traffic: <p>The maximum incoming rate for this connection.</p><p>This does <b>not</b> affect the actual traffic rate, only how KNemo displays it.</p> KiB/sec 1 1048576 4 - - - - false - - - Color: - - - - - - - false - - - Outgoing traffic: <p>The maximum outgoing rate for this connection.</p><p>This does <b>not</b> affect the actual traffic rate, only how KNemo displays it.</p> KiB/sec 1 1048576 4 - - - - false - - - Color: - - - - - - - false - - - Qt::Vertical 0 0 QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults - - - KColorButton - QPushButton -
kcolorbutton.h
-
-
spinBoxTrafficThreshold checkBarScale - checkDynColor rxMaxRate - colorIncomingMax txMaxRate - colorOutgoingMax - - - checkDynColor - toggled(bool) - label - setEnabled(bool) - - - 175 - 172 - - - 204 - 201 - - - - - checkDynColor - toggled(bool) - label_2 - setEnabled(bool) - - - 136 - 172 - - - 206 - 231 - - - - - checkDynColor - toggled(bool) - colorIncomingMax - setEnabled(bool) - - - 319 - 172 - - - 335 - 201 - - - - - checkDynColor - toggled(bool) - colorOutgoingMax - setEnabled(bool) - - - 305 - 172 - - - 335 - 231 - - - - +
diff --git a/src/kcm/themeconfig.cpp b/src/kcm/themeconfig.cpp index 2af0428..bcd9d7f 100644 --- a/src/kcm/themeconfig.cpp +++ b/src/kcm/themeconfig.cpp @@ -1,95 +1,87 @@ /* This file is part of KNemo Copyright (C) 2009, 2010 John Stamp KNemo is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. KNemo 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "themeconfig.h" +#include + ThemeConfig::ThemeConfig( const InterfaceSettings s ) : QDialog(), mSettings( s ) { mDlg.setupUi( this ); if ( mSettings.iconTheme != NETLOAD_THEME ) mDlg.checkBarScale->hide(); if ( mSettings.iconTheme != NETLOAD_THEME && mSettings.iconTheme != TEXT_THEME ) { mDlg.rateGroup->hide(); mDlg.maxRateGroup->hide(); } mDlg.spinBoxTrafficThreshold->setValue( mSettings.trafficThreshold ); mDlg.txMaxRate->setValue( mSettings.outMaxRate ); mDlg.rxMaxRate->setValue( mSettings.inMaxRate ); mDlg.checkBarScale->setChecked( mSettings.barScale ); - mDlg.checkDynColor->setChecked( mSettings.dynamicColor ); - mDlg.colorIncomingMax->setColor( mSettings.colorIncomingMax ); - mDlg.colorOutgoingMax->setColor( mSettings.colorOutgoingMax ); updateRateGroup(); connect( mDlg.buttonBox, SIGNAL( accepted() ), SLOT( accept() ) ); connect( mDlg.buttonBox, SIGNAL( rejected() ), SLOT( reject() ) ); connect( mDlg.buttonBox, SIGNAL( clicked( QAbstractButton* ) ), SLOT( setDefaults( QAbstractButton* ) ) ); connect( mDlg.checkBarScale, SIGNAL( toggled( bool ) ), SLOT( updateRateGroup() ) ); - connect( mDlg.checkDynColor, SIGNAL( toggled( bool ) ), SLOT( updateRateGroup() ) ); } void ThemeConfig::setDefaults( QAbstractButton* button ) { if (static_cast(button) == mDlg.buttonBox->button(QDialogButtonBox::RestoreDefaults) ) { InterfaceSettings s; mDlg.spinBoxTrafficThreshold->setValue( s.trafficThreshold ); mDlg.txMaxRate->setValue( s.outMaxRate ); mDlg.rxMaxRate->setValue( s.inMaxRate ); mDlg.checkBarScale->setChecked( s.barScale ); - mDlg.checkDynColor->setChecked( s.dynamicColor ); - mDlg.colorIncomingMax->setColor( s.colorIncomingMax ); - mDlg.colorOutgoingMax->setColor( s.colorOutgoingMax ); } } void ThemeConfig::updateRateGroup() { - if ( mDlg.checkBarScale->isChecked() || mDlg.checkDynColor->isChecked() ) + if ( mDlg.checkBarScale->isChecked() ) mDlg.maxRateGroup->setEnabled( true ); else mDlg.maxRateGroup->setEnabled( false ); } InterfaceSettings ThemeConfig::settings() { mSettings.trafficThreshold = mDlg.spinBoxTrafficThreshold->value(); mSettings.outMaxRate = mDlg.txMaxRate->value(); mSettings.inMaxRate = mDlg.rxMaxRate->value(); mSettings.barScale = mDlg.checkBarScale->isChecked(); - mSettings.dynamicColor = mDlg.checkDynColor->isChecked(); - mSettings.colorIncomingMax = mDlg.colorIncomingMax->color(); - mSettings.colorOutgoingMax = mDlg.colorOutgoingMax->color(); return mSettings; } #include "moc_themeconfig.cpp" diff --git a/src/knemod/interface.cpp b/src/knemod/interface.cpp index 849d738..b7512ce 100644 --- a/src/knemod/interface.cpp +++ b/src/knemod/interface.cpp @@ -1,465 +1,455 @@ /* This file is part of KNemo Copyright (C) 2004, 2006 Percy Leonhardt Copyright (C) 2009, 2010 John Stamp KNemo is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. KNemo 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include -#include #include #include #include #include #include "backends/backendbase.h" #include "global.h" #include "utils.h" #include "interface.h" #include "interfaceplotterdialog.h" #include "interfacestatistics.h" #include "interfacestatusdialog.h" #include "interfacestatisticsdialog.h" Interface::Interface( const QString &ifname, const BackendData* data ) : QObject(), mIfaceState( KNemoIface::UnknownState ), mPreviousIfaceState( KNemoIface::UnknownState ), mIfaceName( ifname ), mRealSec( 0.0 ), mUptime( 0 ), mUptimeString( QStringLiteral("00:00:00") ), mRxRate( 0 ), mTxRate( 0 ), mIcon( this ), mIfaceStatistics( 0 ), mStatusDialog( 0 ), mStatisticsDialog( 0 ), mPlotterDialog( 0 ), mBackendData( data ) { mPlotterDialog = new InterfacePlotterDialog( mIfaceName ); connect( &mIcon, SIGNAL( statisticsSelected() ), this, SLOT( showStatisticsDialog() ) ); } Interface::~Interface() { delete mStatusDialog; delete mPlotterDialog; delete mStatisticsDialog; delete mIfaceStatistics; } void Interface::configChanged() { KSharedConfig::Ptr config = KSharedConfig::openConfig(); QString group( confg_interface ); group += mIfaceName; KConfigGroup interfaceGroup( config, group ); InterfaceSettings s; mSettings.alias = interfaceGroup.readEntry( conf_alias ).trimmed(); mSettings.iconTheme = interfaceGroup.readEntry( conf_iconTheme, s.iconTheme ); // If the theme is not configured, use a sensible default if (mSettings.iconTheme.isEmpty()) { if ( mBackendData->isWireless ) { mSettings.iconTheme = QLatin1String("wireless"); } else { mSettings.iconTheme = QLatin1String("network"); } } // Let's check that the theme is available QStringList themeNames; QList themes = findThemes(); foreach( KNemoTheme theme, themes ) themeNames << theme.internalName; themeNames << NETLOAD_THEME; // If that's not available, default to the text theme if ( !themeNames.contains( mSettings.iconTheme ) ) mSettings.iconTheme = TEXT_THEME; - mSettings.colorIncoming = interfaceGroup.readEntry( conf_colorIncoming, s.colorIncoming ); - mSettings.colorOutgoing = interfaceGroup.readEntry( conf_colorOutgoing, s.colorOutgoing ); - KColorScheme scheme(QPalette::Active, KColorScheme::View); - mSettings.colorDisabled = interfaceGroup.readEntry( conf_colorDisabled, scheme.foreground( KColorScheme::InactiveText ).color() ); - mSettings.colorUnavailable = interfaceGroup.readEntry( conf_colorUnavailable, scheme.foreground( KColorScheme::InactiveText ).color() ); - mSettings.colorBackground = scheme.foreground( KColorScheme::InactiveText ).color(); - mSettings.dynamicColor = interfaceGroup.readEntry( conf_dynamicColor, s.dynamicColor ); - mSettings.colorIncomingMax = interfaceGroup.readEntry( conf_colorIncomingMax, s.colorIncomingMax ); - mSettings.colorOutgoingMax = interfaceGroup.readEntry( conf_colorOutgoingMax, s.colorOutgoingMax ); mSettings.barScale = interfaceGroup.readEntry( conf_barScale, s.barScale ); mSettings.inMaxRate = interfaceGroup.readEntry( conf_inMaxRate, s.inMaxRate )*1024; mSettings.outMaxRate = interfaceGroup.readEntry( conf_outMaxRate, s.outMaxRate )*1024; mSettings.minVisibleState = interfaceGroup.readEntry( conf_minVisibleState, s.minVisibleState ); mSettings.activateStatistics = interfaceGroup.readEntry( conf_activateStatistics, s.activateStatistics ); mSettings.trafficThreshold = clamp(interfaceGroup.readEntry( conf_trafficThreshold, s.trafficThreshold ), 0, 1000 ); mSettings.warnRules.clear(); int warnRuleCount = interfaceGroup.readEntry( conf_warnRules, 0 ); for ( int i = 0; i < warnRuleCount; ++i ) { group = QString::fromLatin1( "%1%2 #%3" ).arg( confg_warnRule ).arg( mIfaceName ).arg( i ); if ( config->hasGroup( group ) ) { KConfigGroup warnGroup( config, group ); WarnRule warn; warn.periodUnits = clamp(warnGroup.readEntry( conf_warnPeriodUnits, warn.periodUnits ), KNemoStats::Hour, KNemoStats::Year ); warn.periodCount = clamp(warnGroup.readEntry( conf_warnPeriodCount, warn.periodUnits ), 1, 1000 ); warn.trafficType = clamp(warnGroup.readEntry( conf_warnTrafficType, warn.trafficType ), KNemoStats::Peak, KNemoStats::PeakOffpeak ); warn.trafficDirection = clamp(warnGroup.readEntry( conf_warnTrafficDirection, warn.trafficDirection ), KNemoStats::TrafficIn, KNemoStats::TrafficTotal ); warn.trafficUnits = clamp(warnGroup.readEntry( conf_warnTrafficUnits, warn.trafficUnits ), KNemoStats::UnitB, KNemoStats::UnitG ); warn.threshold = clamp(warnGroup.readEntry( conf_warnThreshold, warn.threshold ), 0.0, 9999.0 ); warn.customText = warnGroup.readEntry( conf_warnCustomText, warn.customText ).trimmed(); mSettings.warnRules << warn; } } mSettings.calendarSystem = static_cast(interfaceGroup.readEntry( conf_calendarSystem, static_cast(KLocale::QDateCalendar) )); mSettings.statsRules.clear(); int statsRuleCount = interfaceGroup.readEntry( conf_statsRules, 0 ); KCalendarSystem *testCal = KCalendarSystem::create( mSettings.calendarSystem ); for ( int i = 0; i < statsRuleCount; ++i ) { group = QString::fromLatin1( "%1%2 #%3" ).arg( confg_statsRule ).arg( mIfaceName ).arg( i ); if ( config->hasGroup( group ) ) { KConfigGroup statsGroup( config, group ); StatsRule rule; rule.startDate = statsGroup.readEntry( conf_statsStartDate, QDate() ); rule.periodUnits = clamp(statsGroup.readEntry( conf_statsPeriodUnits, rule.periodUnits ), KNemoStats::Day, KNemoStats::Year ); rule.periodCount = clamp(statsGroup.readEntry( conf_statsPeriodCount, rule.periodCount ), 1, 1000 ); rule.logOffpeak = statsGroup.readEntry( conf_logOffpeak,rule.logOffpeak ); rule.offpeakStartTime = QTime::fromString( statsGroup.readEntry( conf_offpeakStartTime, rule.offpeakStartTime.toString( Qt::ISODate ) ), Qt::ISODate ); rule.offpeakEndTime = QTime::fromString( statsGroup.readEntry( conf_offpeakEndTime, rule.offpeakEndTime.toString( Qt::ISODate ) ), Qt::ISODate ); rule.weekendIsOffpeak = statsGroup.readEntry( conf_weekendIsOffpeak, rule.weekendIsOffpeak ); rule.weekendDayStart = clamp(statsGroup.readEntry( conf_weekendDayStart, rule.weekendDayStart ), 1, testCal->daysInWeek( QDate::currentDate() ) ); rule.weekendDayEnd = clamp(statsGroup.readEntry( conf_weekendDayEnd, rule.weekendDayEnd ), 1, testCal->daysInWeek( QDate::currentDate() ) ); rule.weekendTimeStart = QTime::fromString( statsGroup.readEntry( conf_weekendTimeStart, rule.weekendTimeStart.toString( Qt::ISODate ) ), Qt::ISODate ); rule.weekendTimeEnd = QTime::fromString( statsGroup.readEntry( conf_weekendTimeEnd, rule.weekendTimeEnd.toString( Qt::ISODate ) ), Qt::ISODate ); if ( rule.isValid( testCal ) ) { mSettings.statsRules << rule; } } } // This prevents needless regeneration of icon when first shown in tray if ( mIfaceState == KNemoIface::UnknownState ) { mIfaceState = mBackendData->status; mPreviousIfaceState = mIfaceState; } mIcon.configChanged(); if ( mIfaceStatistics ) { mIfaceStatistics->configChanged(); if ( !mSettings.activateStatistics ) stopStatistics(); } else if ( mSettings.activateStatistics ) { startStatistics(); } if ( mStatusDialog ) mStatusDialog->configChanged(); if ( mStatisticsDialog != 0 ) mStatisticsDialog->configChanged(); if ( mPlotterDialog ) mPlotterDialog->useBitrate( generalSettings->useBitrate ); } void Interface::processUpdate() { mPreviousIfaceState = mIfaceState; unsigned int trafficThreshold = mSettings.trafficThreshold; mIfaceState = mBackendData->status; int units = 1; if ( generalSettings->useBitrate ) units = 8; mRxRate = mBackendData->incomingBytes * units / generalSettings->pollInterval; mTxRate = mBackendData->outgoingBytes * units / generalSettings->pollInterval; mRxRateStr = formattedRate( mRxRate, generalSettings->useBitrate ); mTxRateStr = formattedRate( mTxRate, generalSettings->useBitrate ); QString title = mSettings.alias; if ( title.isEmpty() ) title = mIfaceName; if ( mIfaceState & KNemoIface::Connected ) { // the interface is connected, look for traffic if ( ( mBackendData->rxPackets - mBackendData->prevRxPackets ) > trafficThreshold ) mIfaceState |= KNemoIface::RxTraffic; if ( ( mBackendData->txPackets - mBackendData->prevTxPackets ) > trafficThreshold ) mIfaceState |= KNemoIface::TxTraffic; if ( mIfaceStatistics ) { // We only check once an hour if we need to create a new stats entry. // However, the timer will be out of sync if we're resuming from suspend, // so we just check if we need to readjust when an interface becomes connected. if ( mPreviousIfaceState < KNemoIface::Connected ) mIfaceStatistics->checkValidEntry(); mIfaceStatistics->addRxBytes( mBackendData->incomingBytes ); mIfaceStatistics->addTxBytes( mBackendData->outgoingBytes ); } updateTime(); if ( mPreviousIfaceState < KNemoIface::Connected ) { QString connectedStr; if ( mBackendData->isWireless ) connectedStr = i18n( "%1 is connected to %2", title, mBackendData->essid ); else connectedStr = i18n( "%1 is connected", title ); if ( mPreviousIfaceState != KNemoIface::UnknownState ) KNotification::event( QLatin1String("connected"), connectedStr ); } } else if ( mIfaceState & KNemoIface::Available ) { if ( mPreviousIfaceState & KNemoIface::Connected ) { KNotification::event( QLatin1String("disconnected"), i18n( "%1 has disconnected", title ) ); if ( mBackendData->interfaceType == KNemoIface::PPP ) backend->clearTraffic( mIfaceName ); resetUptime(); } else if ( mPreviousIfaceState < KNemoIface::Available ) { if ( mPreviousIfaceState != KNemoIface::UnknownState ) KNotification::event( QLatin1String("available"), i18n( "%1 is available", title ) ); } } else if ( mIfaceState == KNemoIface::Unavailable && mPreviousIfaceState > KNemoIface::Unavailable ) { KNotification::event( QLatin1String("unavailable"), i18n( "%1 is unavailable", title ) ); backend->clearTraffic( mIfaceName ); resetUptime(); } if ( mPreviousIfaceState != mIfaceState ) mIcon.updateTrayStatus(); if ( mPlotterDialog ) mPlotterDialog->updatePlotter( mRxRate, mTxRate ); mIcon.updateToolTip(); if ( mStatusDialog ) mStatusDialog->updateDialog(); } void Interface::resetUptime() { mUptime = 0; mRealSec = 0.0; mUptimeString = QStringLiteral("00:00:00"); mRxRate = 0; mTxRate = 0; mRxRateStr = formattedRate( mRxRate, generalSettings->useBitrate ); mTxRateStr = formattedRate( mTxRate, generalSettings->useBitrate ); } void Interface::showStatusDialog( bool fromContextMenu ) { // Toggle the status dialog. // First click will show the status dialog, second will hide it. if ( mStatusDialog == 0L ) { mStatusDialog = new InterfaceStatusDialog( this ); if ( mIfaceStatistics != 0 ) { connect( mIfaceStatistics, SIGNAL( currentEntryChanged() ), mStatusDialog, SLOT( statisticsChanged() ) ); mStatusDialog->statisticsChanged(); } } activateOrHide( mStatusDialog, fromContextMenu ); } void Interface::showSignalPlotter( bool fromContextMenu ) { // Toggle the signal plotter. activateOrHide( mPlotterDialog, fromContextMenu ); } void Interface::showStatisticsDialog() { if ( mStatisticsDialog == 0 ) { mStatisticsDialog = new InterfaceStatisticsDialog( this ); if ( mIfaceStatistics == 0 ) { // should never happen but you never know... startStatistics(); } connect( mStatisticsDialog, SIGNAL( clearStatistics() ), mIfaceStatistics, SLOT( clearStatistics() ) ); } mStatisticsDialog->show(); } void Interface::updateTime() { mRealSec += generalSettings->pollInterval; if ( mRealSec < 1.0 ) return; mUptime += trunc( mRealSec ); mRealSec -= trunc( mRealSec ); time_t updays = mUptime / 86400; mUptimeString = i18np("1 day, ","%1 days, ",updays); mUptime -= 86400 * updays; // we only want the seconds of today int hrs = mUptime / 3600; int mins = ( mUptime - hrs * 3600 ) / 60; int secs = mUptime - hrs * 3600 - mins * 60; QString time; time.sprintf( "%02d:%02d:%02d", hrs, mins, secs ); mUptimeString += time; } void Interface::startStatistics() { mIfaceStatistics = new InterfaceStatistics( this ); connect( mIfaceStatistics, SIGNAL( warnTraffic( QString, quint64, quint64 ) ), this, SLOT( warnTraffic( QString, quint64, quint64 ) ) ); if ( mStatusDialog != 0 ) { connect( mIfaceStatistics, SIGNAL( currentEntryChanged() ), mStatusDialog, SLOT( statisticsChanged() ) ); mStatusDialog->statisticsChanged(); } } void Interface::stopStatistics() { // this will close an open statistics dialog delete mStatisticsDialog; mStatisticsDialog = 0; delete mIfaceStatistics; mIfaceStatistics = 0; } void Interface::warnTraffic( QString warnText, quint64 threshold, quint64 current ) { if ( !warnText.isEmpty() ) { warnText = warnText.replace( QRegExp(QLatin1String("%i")), mIfaceName ); warnText = warnText.replace( QRegExp(QLatin1String("%a")), mSettings.alias ); warnText = warnText.replace( QRegExp(QLatin1String("%t")), KIO::convertSize( threshold ) ); warnText = warnText.replace( QRegExp(QLatin1String("%c")), KIO::convertSize( threshold ) ); } else { warnText = i18n( "" "
%1:Exceeded traffic limit of %2\n" "(currently %3)
", mIfaceName, KIO::convertSize( threshold ), KIO::convertSize( current ) ); } KNotification::event( QLatin1String("exceededTraffic"), warnText ); } void Interface::toggleSignalPlotter( bool show ) { if ( !mPlotterDialog ) return; if ( show ) mPlotterDialog->show(); else mPlotterDialog->hide(); } bool Interface::plotterVisible() { if ( !mPlotterDialog || !mPlotterDialog->isVisible() ) return false; return true; } // taken from ksystemtray.cpp void Interface::activateOrHide( QWidget* widget, bool onlyActivate ) { if ( !widget ) return; KWindowInfo info1 = KWindowInfo( widget->winId(), NET::XAWMState | NET::WMState ); // mapped = visible (but possibly obscured) bool mapped = (info1.mappingState() == NET::Visible) && !info1.isMinimized(); // - not mapped -> show, raise, focus // - mapped // - obscured -> raise, focus // - not obscured -> hide if( !mapped ) { KWindowSystem::setOnDesktop( widget->winId(), KWindowSystem::currentDesktop() ); widget->show(); widget->raise(); } else { QListIterator< WId > it (KWindowSystem::stackingOrder()); it.toBack(); while( it.hasPrevious() ) { WId id = it.previous(); if( id == widget->winId() ) break; KWindowInfo info2 = KWindowInfo( id, NET::WMGeometry | NET::XAWMState | NET::WMState | NET::WMWindowType ); if( info2.mappingState() != NET::Visible ) continue; // not visible on current desktop -> ignore if( !info2.geometry().intersects( widget->geometry())) continue; // not obscuring the window -> ignore if( !info1.hasState( NET::KeepAbove ) && info2.hasState( NET::KeepAbove )) continue; // obscured by window kept above -> ignore NET::WindowType type = info2.windowType( NET::NormalMask | NET::DesktopMask | NET::DockMask | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask | NET::UtilityMask | NET::SplashMask ); if( type == NET::Dock || type == NET::TopMenu ) continue; // obscured by dock or topmenu -> ignore widget->raise(); KWindowSystem::activateWindow( widget->winId()); return; } if ( !onlyActivate ) { widget->hide(); } } } #include "moc_interface.cpp" diff --git a/src/knemod/interfaceicon.cpp b/src/knemod/interfaceicon.cpp index 17b15cc..5f73fd7 100644 --- a/src/knemod/interfaceicon.cpp +++ b/src/knemod/interfaceicon.cpp @@ -1,532 +1,464 @@ /* This file is part of KNemo Copyright (C) 2004, 2005 Percy Leonhardt Copyright (C) 2009, 2010 John Stamp KNemo is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. KNemo 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "global.h" #include "utils.h" #include "interface.h" #include "knemodaemon.h" #include "interfaceicon.h" #include "interfacetray.h" #define SHRINK_MAX 0.75 #define HISTSIZE_STORE 0.5 InterfaceIcon::InterfaceIcon( Interface* interface ) : QObject(), mInterface( interface ), mTray( 0L ), barIncoming( 0 ), barOutgoing( 0 ) { statusAction = new QAction( i18n( "Show &Status Dialog" ), this ); plotterAction = new QAction( QIcon::fromTheme( QLatin1String("utilities-system-monitor") ), i18n( "Show &Traffic Plotter" ), this ); statisticsAction = new QAction( QIcon::fromTheme( QLatin1String("view-statistics") ), i18n( "Show St&atistics" ), this ); configAction = new QAction( QIcon::fromTheme( QLatin1String("configure") ), i18n( "&Configure KNemo..." ), this ); connect( statusAction, SIGNAL( triggered() ), this, SLOT( showStatus() ) ); connect( plotterAction, SIGNAL( triggered() ), this, SLOT( showGraph() ) ); connect( statisticsAction, SIGNAL( triggered() ), this, SLOT( showStatistics() ) ); connect( configAction, SIGNAL( triggered() ), this, SLOT( showConfigDialog() ) ); } InterfaceIcon::~InterfaceIcon() { delete mTray; } void InterfaceIcon::configChanged() { KConfigGroup cg( KSharedConfig::openConfig(), "System Tray" ); iconWidth = cg.readEntry( "systrayIconWidth", 22 ); barWidth = iconWidth/3; int margins = iconWidth - (barWidth*2); midMargin = margins/3; int rightMargin = (margins - midMargin)/2; leftMargin = margins-midMargin - rightMargin; midMargin = leftMargin + barWidth+ midMargin; histSize = HISTSIZE_STORE/generalSettings->pollInterval; if ( histSize < 2 ) histSize = 2; for ( int i=0; i < histSize; i++ ) { inHist.append( 0 ); outHist.append( 0 ); } inMaxRate = mInterface->settings().inMaxRate; outMaxRate = mInterface->settings().outMaxRate; updateTrayStatus(); if ( mTray != 0L ) { updateMenu(); if ( mInterface->settings().iconTheme == TEXT_THEME ) updateIconText( true ); else if ( mInterface->settings().iconTheme == NETLOAD_THEME ) updateBars( true ); } } void InterfaceIcon::updateIconImage( int status ) { if ( mTray == 0L || mInterface->settings().iconTheme == TEXT_THEME ) return; QString iconName; if ( mInterface->settings().iconTheme == SYSTEM_THEME ) iconName = QStringLiteral("network-"); else iconName = QLatin1String("knemo-") + mInterface->settings().iconTheme + QLatin1Char('-'); // Now set the correct icon depending on the status of the interface. if ( ( status & KNemoIface::RxTraffic ) && ( status & KNemoIface::TxTraffic ) ) { iconName += ICON_RX_TX; } else if ( status & KNemoIface::RxTraffic ) { iconName += ICON_RX; } else if ( status & KNemoIface::TxTraffic ) { iconName += ICON_TX; } else if ( status & KNemoIface::Connected ) { iconName += ICON_IDLE; } else if ( status & KNemoIface::Available ) { iconName += ICON_OFFLINE; } else { iconName += ICON_ERROR; } mTray->setIconByName( iconName ); } int InterfaceIcon::calcHeight( QList& hist, unsigned int& net_max ) { unsigned long histcalculate = 0; unsigned long rate = 0; foreach( unsigned long j, hist ) { histcalculate += j; } rate = histcalculate / histSize; /* update maximum */ if ( !mInterface->settings().barScale ) { QListsortedMax( hist ); qSort( sortedMax ); unsigned long max = sortedMax.last(); int multiplier = 1024; if ( generalSettings->useBitrate ) multiplier = 1000; if( rate > net_max ) { net_max = rate; } else if( max < net_max * SHRINK_MAX && net_max * SHRINK_MAX >= multiplier ) { net_max *= SHRINK_MAX; } } qreal ratio = static_cast(rate)/net_max; if ( ratio > 1.0 ) ratio = 1.0; return ratio*iconWidth; } -QColor InterfaceIcon::calcColor( QList& hist, const QColor& low, const QColor& high, int hival ) +QColor InterfaceIcon::calcColor( const QColor& low ) { const BackendData * data = mInterface->backendData(); if ( data->status & KNemoIface::Connected ) - { - if ( ! mInterface->settings().dynamicColor ) - return low; - } + return low; else if ( data->status & KNemoIface::Available ) - return mInterface->settings().colorDisabled; - else if ( data->status & KNemoIface::Unavailable ) - return mInterface->settings().colorUnavailable; - - unsigned long histcalculate = 0; - unsigned long rate = 0; - if ( mInterface->settings().iconTheme == NETLOAD_THEME ) - { - foreach( unsigned long j, hist ) - { - histcalculate += j; - } - rate = histcalculate / histSize; - } + return KColorScheme(QPalette::Active).foreground(KColorScheme::InactiveText).color(); else - rate = hist[0]; - - int lowH, lowS, lowV; - int hiH, hiS, hiV; - int difH, difS, difV; - - low.getHsv( &lowH, &lowS, &lowV ); - high.getHsv( &hiH, &hiS, &hiV ); - - difH = hiH - lowH; - difS = hiS - lowS; - difV = hiV - lowV; - - qreal percentage = static_cast(rate)/hival; - if ( percentage > 1.0 ) - percentage = 1.0; - QColor retcolor; - retcolor.setHsv( lowH + ( percentage*difH ), lowS + ( percentage*difS), lowV + (percentage*difV ) ); - return retcolor; + return KColorScheme(QPalette::Active).foreground(KColorScheme::NegativeText).color(); } void InterfaceIcon::updateBars( bool doUpdate ) { // Has color changed? - QColor rxColor = calcColor( inHist, mInterface->settings().colorIncoming, mInterface->settings().colorIncomingMax, mInterface->settings().inMaxRate ); - QColor txColor = calcColor( outHist, mInterface->settings().colorOutgoing, mInterface->settings().colorOutgoingMax, mInterface->settings().outMaxRate ); + QColor rxColor = calcColor( KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::ActiveText).color() ); + QColor txColor = calcColor( KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::NeutralText).color() ); if ( rxColor != colorIncoming ) { doUpdate = true; colorIncoming = rxColor; } - if ( txColor != colorOutgoing ) - { - doUpdate = true; - colorOutgoing = txColor; - } // Has height changed? int rateIn = calcHeight( inHist, inMaxRate ); int rateOut = calcHeight( outHist, outMaxRate ); if ( rateIn != barIncoming ) { doUpdate = true; barIncoming = rateIn; } if ( rateOut != barOutgoing ) { doUpdate = true; barOutgoing = rateOut; } if ( !doUpdate ) return; QPixmap barIcon(iconWidth, iconWidth); - - QLinearGradient inGrad( midMargin, 0, midMargin+barWidth, 0 ); - QLinearGradient topInGrad( midMargin, 0, midMargin+barWidth, 0 ); - QLinearGradient outGrad( leftMargin, 0, leftMargin+barWidth, 0 ); - QLinearGradient topOutGrad( leftMargin, 0, leftMargin+barWidth, 0 ); + barIcon.fill( Qt::transparent ); + QPainter p( &barIcon ); + QColor bgColor; int top = iconWidth - barOutgoing; QRect topLeftRect( leftMargin, 0, barWidth, top ); QRect leftRect( leftMargin, top, barWidth, iconWidth ); top = iconWidth - barIncoming; QRect topRightRect( midMargin, 0, barWidth, top ); QRect rightRect( midMargin, top, barWidth, iconWidth ); - barIcon.fill( Qt::transparent ); - QPainter p( &barIcon ); - p.setOpacity( 1.0 ); - const BackendData * data = mInterface->backendData(); - QColor topColor; if ( data->status & KNemoIface::Connected ) { - topColor = mInterface->settings().colorBackground; + bgColor = KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::InactiveText).color(); + bgColor.setAlpha( 77 ); } else if ( data->status & KNemoIface::Available ) { - topColor = mInterface->settings().colorDisabled; + bgColor = KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::InactiveText).color(); + rxColor.setAlpha( 153 ); } else { - topColor = mInterface->settings().colorUnavailable; + bgColor = KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::NegativeText).color(); } - QColor topColorD = topColor.darker(); - topColor.setAlpha( 128 ); - topColorD.setAlpha( 128 ); - topInGrad.setColorAt(0, topColorD); - topInGrad.setColorAt(1, topColor ); - topOutGrad.setColorAt(0, topColorD); - topOutGrad.setColorAt(1, topColor ); - - inGrad.setColorAt(0, rxColor ); - inGrad.setColorAt(1, rxColor.darker() ); - outGrad.setColorAt(0, txColor ); - outGrad.setColorAt(1, txColor.darker() ); - - QBrush brush( inGrad ); - p.setBrush( brush ); - p.fillRect( rightRect, inGrad ); - brush = QBrush( topInGrad ); - p.fillRect( topRightRect, topInGrad ); - brush = QBrush( outGrad ); - p.fillRect( leftRect, outGrad ); - brush = QBrush( topOutGrad ); - p.fillRect( topLeftRect, topOutGrad ); + + p.fillRect( leftRect, txColor ); + p.fillRect( rightRect, rxColor ); + p.fillRect( topLeftRect, bgColor ); + p.fillRect( topRightRect, bgColor ); mTray->setIconByPixmap( barIcon ); QPixmapCache::clear(); } QString InterfaceIcon::compactTrayText(unsigned long data ) { QString dataString; // Space is tight, so no space between number and units, and the complete // string should be no more than 4 chars. /* Visually confusing to display bytes if ( bytes < 922 ) // 922B = 0.9K byteString = i18n( "%1B", bytes ); */ double multiplier = 1024; if ( generalSettings->useBitrate ) multiplier = 1000; int precision = 0; if ( data < multiplier*9.95 ) // < 9.95K { precision = 1; } if ( data < multiplier*999.5 ) // < 999.5K { if ( generalSettings->useBitrate ) dataString = i18n( "%1k", QString::number( data/multiplier, 'f', precision ) ); else dataString = i18n( "%1K", QString::number( data/multiplier, 'f', precision ) ); return dataString; } if ( data < pow(multiplier, 2)*9.95 ) // < 9.95M precision = 1; if ( data < pow(multiplier, 2)*999.5 ) // < 999.5M { dataString = i18n( "%1M", QString::number( data/pow(multiplier, 2), 'f', precision ) ); return dataString; } if ( data < pow(multiplier, 3)*9.95 ) // < 9.95G precision = 1; // xgettext: no-c-format dataString = i18n( "%1G", QString::number( data/pow(multiplier, 3), 'f', precision) ); return dataString; } void InterfaceIcon::updateIconText( bool doUpdate ) { // Has color changed? - QColor rxColor = calcColor( inHist, mInterface->settings().colorIncoming, mInterface->settings().colorIncomingMax, mInterface->settings().inMaxRate ); - QColor txColor = calcColor( outHist, mInterface->settings().colorOutgoing, mInterface->settings().colorOutgoingMax, mInterface->settings().outMaxRate ); + QColor rxColor = calcColor( KColorScheme(QPalette::Active).foreground(KColorScheme::ActiveText).color() ); + QColor txColor = calcColor( KColorScheme(QPalette::Active).foreground(KColorScheme::NeutralText).color() ); if ( rxColor != colorIncoming ) { doUpdate = true; colorIncoming = rxColor; } - if ( rxColor != colorOutgoing ) - { - doUpdate = true; - colorOutgoing = txColor; - } // Has text changed? QString byteText = compactTrayText( mInterface->rxRate() ); if ( byteText != textIncoming ) { doUpdate = true; textIncoming = byteText; } byteText = compactTrayText( mInterface->txRate() ); if ( byteText != textOutgoing ) { doUpdate = true; textOutgoing = byteText; } if ( !doUpdate ) return; QPixmap textIcon(iconWidth, iconWidth); QRect topRect( 0, 0, iconWidth, iconWidth/2 ); QRect bottomRect( 0, iconWidth/2, iconWidth, iconWidth/2 ); textIcon.fill( Qt::transparent ); QPainter p( &textIcon ); p.setBrush( Qt::NoBrush ); p.setOpacity( 1.0 ); - KColorScheme scheme(QPalette::Active, KColorScheme::View); - // rxFont and txFont should be the same size per poll period QFont rxFont = setIconFont( textIncoming, plasmaTheme->smallestFont(), iconWidth ); QFont txFont = setIconFont( textOutgoing, plasmaTheme->smallestFont(), iconWidth ); if ( rxFont.pointSizeF() > txFont.pointSizeF() ) rxFont.setPointSizeF( txFont.pointSizeF() ); p.setFont( rxFont ); p.setPen( rxColor ); p.drawText( topRect, Qt::AlignCenter | Qt::AlignRight, textIncoming ); p.setFont( rxFont ); p.setPen( txColor ); p.drawText( bottomRect, Qt::AlignCenter | Qt::AlignRight, textOutgoing ); mTray->setIconByPixmap( textIcon ); QPixmapCache::clear(); } void InterfaceIcon::updateToolTip() { if ( mTray == 0L ) return; inHist.prepend( mInterface->rxRate() ); outHist.prepend( mInterface->txRate() ); while ( inHist.count() > histSize ) { inHist.removeLast(); outHist.removeLast(); } if ( mInterface->settings().iconTheme == TEXT_THEME ) updateIconText(); else if ( mInterface->settings().iconTheme == NETLOAD_THEME ) updateBars(); mTray->updateToolTip(); } void InterfaceIcon::updateMenu() { QMenu* menu = mTray->contextMenu(); InterfaceSettings& settings = mInterface->settings(); if ( settings.activateStatistics ) menu->insertAction( configAction, statisticsAction ); else menu->removeAction( statisticsAction ); } void InterfaceIcon::updateTrayStatus() { const QString ifaceName( mInterface->ifaceName() ); const BackendData * data = mInterface->backendData(); int currentStatus = data->status; int minVisibleState = mInterface->settings().minVisibleState; QString title = mInterface->settings().alias; if ( title.isEmpty() ) title = ifaceName; if ( mTray != 0L && currentStatus < minVisibleState ) { delete mTray; mTray = 0L; } else if ( mTray == 0L && currentStatus >= minVisibleState ) { mTray = new InterfaceTray( mInterface, ifaceName ); QMenu* menu = mTray->contextMenu(); menu->removeAction( menu->actions().at( 0 ) ); // FIXME: title for QMenu? //menu->addTitle( QIcon::fromTheme( QLatin1String("knemo") ), i18n( "KNemo - %1", title ) ); menu->addAction( statusAction ); menu->addAction( plotterAction ); menu->addAction( configAction ); KHelpMenu* helpMenu( new KHelpMenu( menu, KAboutData::applicationData(), false ) ); menu->addMenu( helpMenu->menu() )->setIcon( QIcon::fromTheme( QLatin1String("help-contents") ) ); if ( mInterface->settings().iconTheme == TEXT_THEME ) updateIconText(); else if ( mInterface->settings().iconTheme == NETLOAD_THEME ) updateBars(); else updateIconImage( mInterface->ifaceState() ); updateMenu(); } else if ( mTray != 0L ) { if ( mInterface->settings().iconTheme != TEXT_THEME && mInterface->settings().iconTheme != NETLOAD_THEME ) updateIconImage( mInterface->ifaceState() ); } } void InterfaceIcon::showConfigDialog() { KNemoDaemon::sSelectedInterface = mInterface->ifaceName(); KProcess process; process << QLatin1String("kcmshell5") << QLatin1String("kcm_knemo"); process.startDetached(); } void InterfaceIcon::showStatistics() { emit statisticsSelected(); } void InterfaceIcon::showStatus() { mInterface->showStatusDialog( true ); } void InterfaceIcon::showGraph() { mInterface->showSignalPlotter( true ); } #include "moc_interfaceicon.cpp" diff --git a/src/knemod/interfaceicon.h b/src/knemod/interfaceicon.h index 29c2e41..92e4908 100644 --- a/src/knemod/interfaceicon.h +++ b/src/knemod/interfaceicon.h @@ -1,126 +1,127 @@ /* This file is part of KNemo Copyright (C) 2004, 2005 Percy Leonhardt Copyright (C) 2009, 2010 John Stamp KNemo is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. KNemo 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef INTERFACEICON_H #define INTERFACEICON_H +#include + class Interface; class InterfaceTray; class KActionCollection; class QAction; /** * This is the logical representation of the systemtray icon. It handles * creation and deletion of the real icon, setting the tooltip, setting * the correct icon image and displaying of the settings dialog. * * @short Logical representation of the systemtray icon * @author Percy Leonhardt */ class InterfaceIcon : public QObject { Q_OBJECT public: /** * Default Constructor */ InterfaceIcon( Interface* interface ); /** * Default Destructor */ virtual ~InterfaceIcon(); Q_SIGNALS: void statisticsSelected(); public Q_SLOTS: /* * Creates or deletes the tray icon */ void updateTrayStatus(); /* * Change the tooltip according to the alias of the interface */ void updateToolTip(); /* * Fill the context menu with entries if the user configured * start and stop command */ void updateMenu(); void configChanged(); private Q_SLOTS: /* * Called when the user selects 'Configure KNemo' from the context menu */ void showConfigDialog(); /* * Returns a string with a compact transfer rate * This should not be more than 4 chars, including the units */ QString compactTrayText( unsigned long ); void showStatus(); void showGraph(); void showStatistics(); private: /* * Changes the icon displayed in the tray */ void updateIconImage( int status ); - QColor calcColor( QList& hist, const QColor& low, const QColor& high, int hival ); + QColor calcColor( const QColor& low ); int calcHeight( QList& hist, unsigned int& net_max ); void updateBars( bool doUpdate = false ); void updateIconText( bool doUpdate = false ); // the interface this icon belongs to Interface* mInterface; // the real tray icon InterfaceTray* mTray; KActionCollection* commandActions; QAction* statusAction; QAction* plotterAction; QAction* statisticsAction; QAction* configAction; QString textIncoming; QString textOutgoing; QColor colorIncoming; - QColor colorOutgoing; int iconWidth; int histSize; int barIncoming; int barOutgoing; int barWidth; int leftMargin; int midMargin; QListinHist; QListoutHist; unsigned int inMaxRate; unsigned int outMaxRate; }; #endif // INTERFACEICON_H diff --git a/src/knemod/interfaceplotterdialog.cpp b/src/knemod/interfaceplotterdialog.cpp index c6f28c5..c696d0c 100644 --- a/src/knemod/interfaceplotterdialog.cpp +++ b/src/knemod/interfaceplotterdialog.cpp @@ -1,523 +1,518 @@ /* This file is part of KNemo Copyright (C) 2004, 2006 Percy Leonhardt Copyright (C) 2009, 2010 John Stamp Portions adapted from FancyPlotter.cpp in KSysGuard Copyright (c) 1999 - 2002 Chris Schlaeger KNemo is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. KNemo 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include +#include #include #include "global.h" #include "interfaceplotterdialog.h" #include "utils.h" #include #include "plotterconfigdialog.h" #include static const char plot_pixel[] = "Pixel"; static const char plot_distance[] = "Distance"; static const char plot_fontSize[] = "FontSize"; static const char plot_minimumValue[] = "MinimumValue"; static const char plot_maximumValue[] = "MaximumValue"; static const char plot_labels[] = "Labels"; static const char plot_verticalLines[] = "VerticalLines"; static const char plot_horizontalLines[] = "HorizontalLines"; static const char plot_showIncoming[] = "ShowIncoming"; static const char plot_showOutgoing[] = "ShowOutgoing"; static const char plot_automaticDetection[] = "AutomaticDetection"; static const char plot_verticalLinesScroll[] = "VerticalLinesScroll"; -static const char plot_colorIncoming[] = "ColorIncoming"; -static const char plot_colorOutgoing[] = "ColorOutgoing"; class FancyPlotterLabel : public QLabel { public: FancyPlotterLabel(QWidget *parent) : QLabel(parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); longHeadingWidth = 0; shortHeadingWidth = 0; textMargin = 0; setLayoutDirection(Qt::LeftToRight); //We do this because we organise the strings ourselves.. is this going to muck it up though for RTL languages? } ~FancyPlotterLabel() { } void setLabel(const QString &name, const QColor &color) { labelName = name; if(indicatorSymbol.isNull()) { if(fontMetrics().inFont(QChar(0x25CF))) indicatorSymbol = QChar(0x25CF); else indicatorSymbol = QLatin1Char('#'); } changeLabel(color); } void setValueText(const QString &value) { //value can have multiple strings, separated with the 0x9c character valueText = value.split(QChar(0x9c)); resizeEvent(NULL); update(); } virtual void resizeEvent( QResizeEvent * ) { QFontMetrics fm = fontMetrics(); if(valueText.isEmpty()) { if(longHeadingWidth < width()) setText(longHeadingText); else setText(shortHeadingText); return; } QString value = valueText.first(); int textWidth = fm.boundingRect(value).width(); if(textWidth + longHeadingWidth < width()) setBothText(longHeadingText, value); else if(textWidth + shortHeadingWidth < width()) setBothText(shortHeadingText, value); else { int valueTextCount = valueText.count(); int i; for(i = 1; i < valueTextCount; ++i) { textWidth = fm.boundingRect(valueText.at(i)).width(); if(textWidth + shortHeadingWidth <= width()) { break; } } if(i < valueTextCount) setBothText(shortHeadingText, valueText.at(i)); else setText(noHeadingText + valueText.last()); //This just sets the color of the text } } void changeLabel(const QColor &_color) { color = _color; if ( qApp->layoutDirection() == Qt::RightToLeft ) longHeadingText = QLatin1String(": ") + labelName + QLatin1String(" ") + indicatorSymbol + QLatin1String(""); else longHeadingText = QLatin1String("") + indicatorSymbol + QLatin1String(" ") + labelName + QLatin1String(" :"); shortHeadingText = QLatin1String("") + indicatorSymbol + QLatin1String(""); noHeadingText = QLatin1String(""); textMargin = fontMetrics().width(QLatin1Char('x')) + margin()*2 + frameWidth()*2; longHeadingWidth = fontMetrics().boundingRect(labelName + QLatin1String(" :") + indicatorSymbol + QLatin1String(" x")).width() + textMargin; shortHeadingWidth = fontMetrics().boundingRect(indicatorSymbol).width() + textMargin; setMinimumWidth(shortHeadingWidth); update(); } private: void setBothText(const QString &heading, const QString & value) { if(QApplication::layoutDirection() == Qt::LeftToRight) setText(heading + QLatin1Char(' ') + value); else setText(QLatin1String("") + value + QLatin1Char(' ') + heading); } int textMargin; QString longHeadingText; QString shortHeadingText; QString noHeadingText; int longHeadingWidth; int shortHeadingWidth; QList valueText; QString labelName; QColor color; static QChar indicatorSymbol; }; QChar FancyPlotterLabel::indicatorSymbol; InterfacePlotterDialog::InterfacePlotterDialog( QString name ) : QDialog(), mConfigDlg( 0 ), mLabelsWidget( NULL ), mSetPos( true ), mWasShown( false ), mUseBitrate( generalSettings->useBitrate ), mMultiplier( 1024 ), mOutgoingVisible( false ), mIncomingVisible( false ), mName( name ) { setWindowTitle( i18nc( "interface name", "%1 Traffic", mName ) ); setContextMenuPolicy( Qt::DefaultContextMenu ); mByteUnits << ki18n( "%1 B/s" ) << ki18n( "%1 KiB/s" ) << ki18n( "%1 MiB/s" ) << ki18n( "%1 GiB/s" ); mBitUnits << ki18n( "%1 bit/s" ) << ki18n( "%1 kbit/s" ) << ki18n( "%1 Mbit/s" ) << ki18n( "%1 Gbit/s" ); mIndicatorSymbol = QLatin1Char('#'); QFontMetrics fm(font()); if (fm.inFont(QChar(0x25CF))) mIndicatorSymbol = QChar(0x25CF); QBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0,0,0,0); layout->setSpacing(0); setLayout( layout ); mPlotter = new KSignalPlotter( this ); int axisTextWidth = fontMetrics().width(i18nc("Largest axis title", "99999 XXXX")); mPlotter->setMaxAxisTextWidth( axisTextWidth ); mPlotter->setShowAxis( true ); mPlotter->setUseAutoRange( true ); layout->addWidget(mPlotter); /* Create a set of labels underneath the graph. */ mLabelsWidget = new QWidget; layout->addWidget(mLabelsWidget); QBoxLayout *outerLabelLayout = new QHBoxLayout(mLabelsWidget); outerLabelLayout->setSpacing(0); outerLabelLayout->setContentsMargins(0,0,0,0); /* create a spacer to fill up the space up to the start of the graph */ outerLabelLayout->addItem(new QSpacerItem(axisTextWidth + 10, 0, QSizePolicy::Preferred)); mLabelLayout = new QHBoxLayout; outerLabelLayout->addLayout(mLabelLayout); mReceivedLabel = new FancyPlotterLabel( this ); mSentLabel = new FancyPlotterLabel( this ); mLabelLayout->addWidget( mSentLabel ); mLabelLayout->addWidget( mReceivedLabel ); // Restore window size and position. KSharedConfig::Ptr config = KSharedConfig::openConfig(); KConfigGroup interfaceGroup( config, confg_interface + mName ); if ( interfaceGroup.hasKey( conf_plotterPos ) ) { QPoint p = interfaceGroup.readEntry( conf_plotterPos, QPoint() ); // See comment in event() mSetPos = false; move( p ); } if ( interfaceGroup.hasKey( conf_plotterSize ) ) { QSize s = interfaceGroup.readEntry( conf_plotterSize, QSize() ); // A little hack so the plotter's data isn't chopped off the first time // the dialog appears mPlotter->resize( s ); resize( s ); } else { // HACK mPlotter->resize( 500, 350 ); // Improve the chance that we have a decent sized dialog // the first time it's shown resize( 500, 350 ); } connect( mPlotter, SIGNAL(axisScaleChanged()), this, SLOT(setPlotterUnits()) ); loadConfig(); } InterfacePlotterDialog::~InterfacePlotterDialog() { if ( mWasShown ) { // If the dialog was never shown, then the position // will be wrong KSharedConfig::Ptr config = KSharedConfig::openConfig(); KConfigGroup interfaceGroup( config, confg_interface + mName ); interfaceGroup.writeEntry( conf_plotterSize, size() ); interfaceGroup.writeEntry( conf_plotterPos, pos() ); config->sync(); } } bool InterfacePlotterDialog::event( QEvent *e ) { /* If we do not explicitly call size() and move() at least once then * hiding and showing the dialog will cause it to forget its previous * size and position. */ switch ( e->type() ) { case QEvent::Move: if ( mSetPos && !pos().isNull() ) { mSetPos = false; move( pos() ); } break; case QEvent::Show: mWasShown = true; break; case QEvent::MouseButtonPress: { QMouseEvent *m = static_cast(e); if ( m->button() == Qt::RightButton ) { showContextMenu( m->pos() ); return true; } } default: ;; } return QDialog::event( e ); } void InterfacePlotterDialog::resizeEvent( QResizeEvent* ) { bool showLabels = true;; if( this->height() <= mLabelsWidget->sizeHint().height() + mPlotter->minimumHeight() ) showLabels = false; mLabelsWidget->setVisible(showLabels); } void InterfacePlotterDialog::showContextMenu( const QPoint &pos ) { QMenu pm; QAction *action = 0; action = pm.addAction( i18n( "&Properties" ) ); action->setData( 1 ); action = pm.exec( mapToGlobal(pos) ); if ( action ) { switch ( action->data().toInt() ) { case 1: configPlotter(); break; } } } void InterfacePlotterDialog::configPlotter() { if ( mConfigDlg ) return; mConfigDlg = new PlotterConfigDialog( this, mName, &mSettings ); connect( mConfigDlg, SIGNAL( finished(int) ), this, SLOT( configFinished() ) ); connect( mConfigDlg, SIGNAL( saved() ), this, SLOT( saveConfig() ) ); mConfigDlg->show(); } void InterfacePlotterDialog::configFinished() { // FIXME mConfigDlg->close(); mConfigDlg = 0; } void InterfacePlotterDialog::setPlotterUnits() { // Prevent this being called recursively disconnect( mPlotter, SIGNAL(axisScaleChanged()), this, SLOT(setPlotterUnits()) ); qreal value = mPlotter->currentMaximumRangeValue(); int units = 0; if (value >= pow( mMultiplier, 3)*0.7) //If it's over 0.7GiB, then set the scale to gigabytes { units = 3; } else if (value > pow(mMultiplier,2)) { units = 2; } else if (value > mMultiplier) { units = 1; } mPlotter->setScaleDownBy( pow(mMultiplier, units ) ); if ( mUseBitrate ) mPlotter->setUnit( mBitUnits[units] ); else mPlotter->setUnit( mByteUnits[units] ); // reconnect connect( mPlotter, SIGNAL(axisScaleChanged()), this, SLOT(setPlotterUnits()) ); } void InterfacePlotterDialog::useBitrate( bool useBits ) { // Have to wipe the plotters if we change units if ( mUseBitrate != useBits ) { int nb = mPlotter->numBeams(); for ( int i = 0; i < nb; i++ ) { mPlotter->removeBeam(0); } mOutgoingVisible = false; mIncomingVisible = false; } mUseBitrate = useBits; if ( mUseBitrate ) mMultiplier = 1000; else mMultiplier = 1024; addBeams(); for ( int beamId = 0; beamId < mPlotter->numBeams(); beamId++ ) { QString lastValue = formattedRate( mPlotter->lastValue(beamId), mUseBitrate ); static_cast((static_cast(mLabelLayout->itemAt(beamId)))->widget())->setText(lastValue); } setPlotterUnits(); } void InterfacePlotterDialog::updatePlotter( const double incomingBytes, const double outgoingBytes ) { QList trafficList; if ( mOutgoingVisible ) trafficList.append( outgoingBytes ); if ( mIncomingVisible ) trafficList.append( incomingBytes ); mPlotter->addSample( trafficList ); for ( int beamId = 0; beamId < mPlotter->numBeams(); beamId++ ) { QString lastValue = formattedRate( mPlotter->lastValue(beamId), mUseBitrate ); static_cast((static_cast(mLabelLayout->itemAt(beamId)))->widget())->setValueText(lastValue); } } void InterfacePlotterDialog::loadConfig() { KSharedConfig::Ptr config = KSharedConfig::openConfig(); // Set the plotter widgets QString group = confg_plotter + mName; // Plotter PlotterSettings s; KConfigGroup plotterGroup( config, group ); mSettings.pixel = clamp(plotterGroup.readEntry( plot_pixel, s.pixel ), 1, 50 ); mSettings.distance = clamp(plotterGroup.readEntry( plot_distance, s.distance ), 10, 120 ); mSettings.fontSize = clamp(plotterGroup.readEntry( plot_fontSize, s.fontSize ), 5, 24 ); mSettings.minimumValue = clamp(plotterGroup.readEntry( plot_minimumValue, s.minimumValue ), 0.0, pow(1024.0, 3) - 1 ); mSettings.maximumValue = clamp(plotterGroup.readEntry( plot_maximumValue, s.maximumValue ), 0.0, pow(1024.0, 3) ); mSettings.labels = plotterGroup.readEntry( plot_labels, s.labels ); mSettings.showIncoming = plotterGroup.readEntry( plot_showIncoming, s.showIncoming ); mSettings.showOutgoing = plotterGroup.readEntry( plot_showOutgoing, s.showOutgoing ); mSettings.verticalLines = plotterGroup.readEntry( plot_verticalLines, s.verticalLines ); mSettings.horizontalLines = plotterGroup.readEntry( plot_horizontalLines, s.horizontalLines ); mSettings.automaticDetection = plotterGroup.readEntry( plot_automaticDetection, s.automaticDetection ); mSettings.verticalLinesScroll = plotterGroup.readEntry( plot_verticalLinesScroll, s.verticalLinesScroll ); - mSettings.colorIncoming = plotterGroup.readEntry( plot_colorIncoming, s.colorIncoming ); - mSettings.colorOutgoing = plotterGroup.readEntry( plot_colorOutgoing, s.colorOutgoing ); configChanged(); } void InterfacePlotterDialog::saveConfig() { KSharedConfig::Ptr config = KSharedConfig::openConfig(); // Set the plotter widgets QString group = confg_plotter + mName; // Plotter KConfigGroup plotterGroup( config, group ); plotterGroup.writeEntry( plot_pixel, mSettings.pixel ); plotterGroup.writeEntry( plot_distance, mSettings.distance ); plotterGroup.writeEntry( plot_fontSize, mSettings.fontSize ); plotterGroup.writeEntry( plot_minimumValue, mSettings.minimumValue ); plotterGroup.writeEntry( plot_maximumValue, mSettings.maximumValue ); plotterGroup.writeEntry( plot_labels, mSettings.labels ); plotterGroup.writeEntry( plot_verticalLines, mSettings.verticalLines ); plotterGroup.writeEntry( plot_horizontalLines, mSettings.horizontalLines ); plotterGroup.writeEntry( plot_showIncoming, mSettings.showIncoming ); plotterGroup.writeEntry( plot_showOutgoing, mSettings.showOutgoing ); plotterGroup.writeEntry( plot_automaticDetection, mSettings.automaticDetection ); plotterGroup.writeEntry( plot_verticalLinesScroll, mSettings.verticalLinesScroll ); - plotterGroup.writeEntry( plot_colorIncoming, mSettings.colorIncoming ); - plotterGroup.writeEntry( plot_colorOutgoing, mSettings.colorOutgoing ); config->sync(); configChanged(); } void InterfacePlotterDialog::configChanged() { QFont pfont = mPlotter->font(); pfont.setPointSize( mSettings.fontSize ); QFontMetrics fm( pfont ); int axisTextWidth = fm.width(i18nc("Largest axis title", "99999 XXXX")); mPlotter->setMaxAxisTextWidth( axisTextWidth ); mPlotter->setFont( pfont ); if ( !mSettings.automaticDetection ) { mPlotter->setMinimumValue( mSettings.minimumValue * mMultiplier ); mPlotter->setMaximumValue( mSettings.maximumValue * mMultiplier ); } else { // Don't want the disabled settings to be used as hints mPlotter->setMinimumValue( 0 ); mPlotter->setMaximumValue( 1 ); } mPlotter->setHorizontalScale( mSettings.pixel ); mPlotter->setVerticalLinesDistance( mSettings.distance ); mPlotter->setShowAxis( mSettings.labels ); mPlotter->setShowVerticalLines( mSettings.verticalLines ); mPlotter->setShowHorizontalLines( mSettings.horizontalLines ); mPlotter->setUseAutoRange( mSettings.automaticDetection ); mPlotter->setVerticalLinesScroll( mSettings.verticalLinesScroll ); - mSentLabel->setLabel( i18nc( "network traffic", "Sending" ), mSettings.colorOutgoing); - mReceivedLabel->setLabel( i18nc( "network traffic", "Receiving" ), mSettings.colorIncoming); + mSentLabel->setLabel( i18nc( "network traffic", "Sending" ), KColorScheme(QPalette::Active).foreground(KColorScheme::NeutralText).color()); + mReceivedLabel->setLabel( i18nc( "network traffic", "Receiving" ), KColorScheme(QPalette::Active).foreground(KColorScheme::ActiveText).color()); addBeams(); } void InterfacePlotterDialog::addBeams() { if ( mSettings.showOutgoing ) { if ( !mOutgoingVisible ) { - mPlotter->addBeam( mSettings.colorOutgoing ); + mPlotter->addBeam( KColorScheme(QPalette::Active).foreground(KColorScheme::NeutralText).color() ); mSentLabel->show(); mOutgoingVisible = true; if ( mIncomingVisible ) { QList newOrder; newOrder << 1 << 0; mPlotter->reorderBeams( newOrder ); } } } else if ( mOutgoingVisible == true ) { mPlotter->removeBeam( 0 ); mSentLabel->hide(); mOutgoingVisible = false; } if ( mSettings.showIncoming ) { if ( !mIncomingVisible ) { - mPlotter->addBeam( mSettings.colorIncoming ); + mPlotter->addBeam( KColorScheme(QPalette::Active).foreground(KColorScheme::ActiveText).color() ); mReceivedLabel->show(); mIncomingVisible = true; } } else if ( mIncomingVisible == true ) { mPlotter->removeBeam( mPlotter->numBeams() - 1 ); mReceivedLabel->hide(); mIncomingVisible = false; } } #include "moc_interfaceplotterdialog.cpp" diff --git a/src/knemod/plotterconfigdialog.cpp b/src/knemod/plotterconfigdialog.cpp index 326a0ff..dcb8f63 100644 --- a/src/knemod/plotterconfigdialog.cpp +++ b/src/knemod/plotterconfigdialog.cpp @@ -1,156 +1,147 @@ /* This file is part of KNemo Copyright (C) 2009, 2010 John Stamp KNemo is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. KNemo 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "plotterconfigdialog.h" #include "global.h" +#include PlotterConfigDialog::PlotterConfigDialog( QWidget * parent, const QString& iface, PlotterSettings* settings ) : QDialog( parent ), mName( iface ), mSettings( settings ) { QString suffix; if ( generalSettings->useBitrate ) { suffix = i18n( " kbit/s" ); } else { suffix = i18n( " KiB/s" ); } ui.setupUi( this ); ui.spinBoxMinValue->setSuffix( suffix ); ui.spinBoxMaxValue->setSuffix( suffix ); load(); ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); //enableButtonDefault( true ); connect( ui.buttonBox, SIGNAL( accepted() ), SLOT( save() ) ); connect( ui.buttonBox, SIGNAL( clicked( QAbstractButton* ) ), SLOT( defaults( QAbstractButton* ) ) ); // connect the plotter widgets connect( ui.checkBoxLabels, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) ); connect( ui.checkBoxVLines, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) ); connect( ui.checkBoxHLines, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) ); connect( ui.checkBoxIncoming, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) ); connect( ui.checkBoxOutgoing, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) ); connect( ui.checkBoxVLinesScroll, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) ); connect( ui.checkBoxAutoDetection, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) ); connect( ui.spinBoxPixel, SIGNAL( valueChanged( int ) ), this, SLOT( changed() ) ); connect( ui.spinBoxDistance, SIGNAL( valueChanged( int ) ), this, SLOT( changed() ) ); connect( ui.spinBoxFontSize, SIGNAL( valueChanged( int ) ), this, SLOT( changed() ) ); connect( ui.spinBoxMinValue, SIGNAL( valueChanged( double ) ), this, SLOT( changed() ) ); connect( ui.spinBoxMaxValue, SIGNAL( valueChanged( double ) ), this, SLOT( changed() ) ); - connect( ui.kColorButtonIncoming, SIGNAL( changed( const QColor& ) ), - this, SLOT( changed() ) ); - connect( ui.kColorButtonOutgoing, SIGNAL( changed( const QColor& ) ), - this, SLOT( changed() ) ); } PlotterConfigDialog::~PlotterConfigDialog() { } void PlotterConfigDialog::load() { ui.spinBoxPixel->setValue( mSettings->pixel ); ui.spinBoxDistance->setValue( mSettings->distance ); ui.spinBoxFontSize->setValue( mSettings->fontSize ); ui.spinBoxMinValue->setValue( mSettings->minimumValue ); ui.spinBoxMaxValue->setValue( mSettings->maximumValue ); ui.checkBoxLabels->setChecked( mSettings->labels ); ui.checkBoxVLines->setChecked( mSettings->verticalLines ); ui.checkBoxHLines->setChecked( mSettings->horizontalLines ); ui.checkBoxIncoming->setChecked( mSettings->showIncoming ); ui.checkBoxOutgoing->setChecked( mSettings->showOutgoing ); ui.checkBoxAutoDetection->setChecked( !mSettings->automaticDetection ); ui.checkBoxVLinesScroll->setChecked( mSettings->verticalLinesScroll ); - ui.kColorButtonIncoming->setColor( mSettings->colorIncoming ); - ui.kColorButtonOutgoing->setColor( mSettings->colorOutgoing ); } void PlotterConfigDialog::save() { mSettings->pixel = ui.spinBoxPixel->value(); mSettings->distance = ui.spinBoxDistance->value(); mSettings->fontSize = ui.spinBoxFontSize->value(); mSettings->minimumValue = ui.spinBoxMinValue->value(); mSettings->maximumValue = ui.spinBoxMaxValue->value(); mSettings->labels = ui.checkBoxLabels->isChecked(); mSettings->verticalLines = ui.checkBoxVLines->isChecked(); mSettings->horizontalLines = ui.checkBoxHLines->isChecked(); mSettings->showIncoming = ui.checkBoxIncoming->isChecked(); mSettings->showOutgoing = ui.checkBoxOutgoing->isChecked(); mSettings->automaticDetection = !ui.checkBoxAutoDetection->isChecked(); mSettings->verticalLinesScroll = ui.checkBoxVLinesScroll->isChecked(); - mSettings->colorIncoming = ui.kColorButtonIncoming->color(); - mSettings->colorOutgoing = ui.kColorButtonOutgoing->color(); ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); emit saved(); } void PlotterConfigDialog::defaults( QAbstractButton* button ) { if (static_cast(button) == ui.buttonBox->button(QDialogButtonBox::RestoreDefaults) ) { ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); PlotterSettings s; // Default plotter settings ui.spinBoxPixel->setValue( s.pixel ); ui.spinBoxDistance->setValue( s.distance ); ui.spinBoxFontSize->setValue( s.fontSize ); ui.spinBoxMinValue->setValue( s.minimumValue ); ui.spinBoxMaxValue->setValue( s.maximumValue ); ui.checkBoxLabels->setChecked( s.labels ); ui.checkBoxVLines->setChecked( s.verticalLines ); ui.checkBoxHLines->setChecked( s.horizontalLines ); ui.checkBoxIncoming->setChecked( s.showIncoming ); ui.checkBoxOutgoing->setChecked( s.showOutgoing ); ui.checkBoxAutoDetection->setChecked( !s.automaticDetection ); ui.checkBoxVLinesScroll->setChecked( s.verticalLinesScroll ); - ui.kColorButtonIncoming->setColor( s.colorIncoming ); - ui.kColorButtonOutgoing->setColor( s.colorOutgoing ); } else if (static_cast(button) == ui.buttonBox->button(QDialogButtonBox::Ok) ) { QDialog::accept(); } else if (static_cast(button) == ui.buttonBox->button(QDialogButtonBox::Apply) ) { save(); } else if (static_cast(button) == ui.buttonBox->button(QDialogButtonBox::Cancel) ) { QDialog::reject(); } } void PlotterConfigDialog::changed() { ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); } #include "moc_plotterconfigdialog.cpp" diff --git a/src/knemod/plotterconfigdialog.h b/src/knemod/plotterconfigdialog.h index 8ed60f5..7d68f7d 100644 --- a/src/knemod/plotterconfigdialog.h +++ b/src/knemod/plotterconfigdialog.h @@ -1,83 +1,78 @@ /* This file is part of KNemo Copyright (C) 2009, 2010 John Stamp KNemo is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. KNemo 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef PLOTTERCONFIGDIALOG_H #define PLOTTERCONFIGDIALOG_H #include -#include #include "ui_plotterconfigdlg.h" struct PlotterSettings { PlotterSettings() : pixel( 6 ), distance( 30 ), fontSize( 8 ), minimumValue( 0.0 ), maximumValue( 20.0 ), labels( true ), showIncoming( true ), showOutgoing( true ), verticalLines( false ), horizontalLines( true ), automaticDetection( true ), - verticalLinesScroll( false ), - colorIncoming( 0x1889FF ), - colorOutgoing( 0xFF7F08 ) + verticalLinesScroll( false ) {} int pixel; int distance; int fontSize; double minimumValue; double maximumValue; bool labels; bool showIncoming; bool showOutgoing; bool verticalLines; bool horizontalLines; bool automaticDetection; bool verticalLinesScroll; - QColor colorIncoming; - QColor colorOutgoing; }; class PlotterConfigDialog : public QDialog { Q_OBJECT public: PlotterConfigDialog( QWidget *parent, const QString& iface, PlotterSettings* settings ); virtual ~PlotterConfigDialog(); Q_SIGNALS: void saved(); private Q_SLOTS: void changed(); void defaults(QAbstractButton*); void save(); private: void load(); Ui::Form ui; QString mName; PlotterSettings *mSettings; }; #endif diff --git a/src/knemod/plotterconfigdlg.ui b/src/knemod/plotterconfigdlg.ui index 169dd87..e3c7bd3 100644 --- a/src/knemod/plotterconfigdlg.ui +++ b/src/knemod/plotterconfigdlg.ui @@ -1,551 +1,482 @@ Form 0 0 0 0 0 Scales Vertical Scale Specify graph range: false - Minimum value: + Minim&um value: false spinBoxMinValue false 49999.000000000000000 10.000000000000000 false - Maximum value: + Ma&ximum value: false spinBoxMaxValue false 1.000000000000000 50000.000000000000000 10.000000000000000 Horizontal Scale Pixels per time period: false 1 50 6 Qt::Horizontal 0 0 Qt::Vertical 0 0 Grid Lines Vertical lines Qt::Horizontal 0 0 false Distance: false spinBoxDistance false 10 120 30 false Vertical lines scroll Horizontal lines Text Show axis labels - Font size: + Font si&ze: false spinBoxFontSize 8 Qt::Vertical 0 0 Sensors - - - - - Show incoming traffic - - - - - - - false - - - - - - - + + + Show incoming traffic + + - - - - - Show outgoing traffic - - - - - - - false - - - - - - - + + + Show outgoing traffic + + Qt::Vertical 0 0 QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::RestoreDefaults - - - KColorButton - QPushButton -
kcolorbutton.h
-
-
tabWidget_2 checkBoxAutoDetection spinBoxMinValue spinBoxMaxValue spinBoxPixel checkBoxVLines spinBoxDistance checkBoxVLinesScroll checkBoxHLines checkBoxLabels spinBoxFontSize checkBoxIncoming - kColorButtonIncoming checkBoxOutgoing - kColorButtonOutgoing checkBoxAutoDetection toggled(bool) spinBoxMinValue setEnabled(bool) 207 81 197 111 checkBoxAutoDetection toggled(bool) spinBoxMaxValue setEnabled(bool) 289 80 441 107 checkBoxVLines toggled(bool) spinBoxDistance setEnabled(bool) 109 67 109 67 checkBoxVLines toggled(bool) checkBoxVLinesScroll setEnabled(bool) 103 67 109 67 checkBoxAutoDetection toggled(bool) textLabel9_3 setEnabled(bool) 111 78 94 106 checkBoxAutoDetection toggled(bool) textLabel9_2_2 setEnabled(bool) 316 93 343 123 checkBoxVLines toggled(bool) textLabel1_2_2 setEnabled(bool) 103 67 109 67 - - checkBoxIncoming - toggled(bool) - kColorButtonIncoming - setEnabled(bool) - - - 64 - 62 - - - 109 - 67 - - - - - checkBoxOutgoing - toggled(bool) - kColorButtonOutgoing - setEnabled(bool) - - - 66 - 74 - - - 109 - 74 - - -