/* KSysGuard, the KDE System Guard Copyright (c) 2003 Tobias Koenig This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. KSysGuard is currently maintained by Chris Schlaeger . Please do not commit any changes without consulting me first. Thanks! */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "FancyPlotterSettings.h" FancyPlotterSettings::FancyPlotterSettings( TQWidget* parent, const char* name ) : KDialogBase( Tabbed, i18n( "Signal Plotter Settings" ), Ok | Apply | Cancel, Ok, parent, name, false, true ) { TQFrame *page = 0; TQGridLayout *pageLayout = 0; TQGridLayout *boxLayout = 0; TQGroupBox *groupBox = 0; TQLabel *label = 0; // Style page page = addPage( i18n( "Style" ) ); pageLayout = new TQGridLayout( page, 3, 2, 0, spacingHint() ); label = new TQLabel( i18n( "Title:" ), page ); pageLayout->addWidget( label, 0, 0 ); mTitle = new KLineEdit( page ); TQWhatsThis::add( mTitle, i18n( "Enter the title of the display here." ) ); pageLayout->addWidget( mTitle, 0, 1 ); label->setBuddy( mTitle ); TQButtonGroup *buttonBox = new TQButtonGroup( 2, Qt::Vertical, i18n( "Graph Drawing Style" ), page ); mUsePolygonStyle = new TQRadioButton( i18n( "Basic polygons" ), buttonBox ); mUsePolygonStyle->setChecked( true ); mUseOriginalStyle = new TQRadioButton( i18n( "Original - single line per data point" ), buttonBox ); pageLayout->addMultiCellWidget( buttonBox, 1, 1, 0, 1 ); // Scales page page = addPage( i18n( "Scales" ) ); pageLayout = new TQGridLayout( page, 2, 1, 0, spacingHint() ); groupBox = new TQGroupBox( 0, Qt::Vertical, i18n( "Vertical Scale" ), page ); boxLayout = new TQGridLayout( groupBox->layout(), 2, 5, spacingHint() ); boxLayout->setColStretch( 2, 1 ); mUseAutoRange = new TQCheckBox( i18n( "Automatic range detection" ), groupBox ); TQWhatsThis::add( mUseAutoRange, i18n( "Check this box if you want the display range to adapt dynamically to the currently displayed values; if you do not check this, you have to specify the range you want in the fields below." ) ); boxLayout->addMultiCellWidget( mUseAutoRange, 0, 0, 0, 4 ); label = new TQLabel( i18n( "Minimum value:" ), groupBox ); boxLayout->addWidget( label, 1, 0 ); mMinValue = new KLineEdit( groupBox ); mMinValue->setAlignment( AlignRight ); mMinValue->setEnabled( false ); TQWhatsThis::add( mMinValue, i18n( "Enter the minimum value for the display here. If both values are 0, automatic range detection is enabled." ) ); boxLayout->addWidget( mMinValue, 1, 1 ); label->setBuddy( mMinValue ); label = new TQLabel( i18n( "Maximum value:" ), groupBox ); boxLayout->addWidget( label, 1, 3 ); mMaxValue = new KLineEdit( groupBox ); mMaxValue->setAlignment( AlignRight ); mMaxValue->setEnabled( false ); TQWhatsThis::add( mMaxValue, i18n( "Enter the maximum value for the display here. If both values are 0, automatic range detection is enabled." ) ); boxLayout->addWidget( mMaxValue, 1, 4 ); label->setBuddy( mMaxValue ); pageLayout->addWidget( groupBox, 0, 0 ); groupBox = new TQGroupBox( 0, Qt::Vertical, i18n( "Horizontal Scale" ), page ); boxLayout = new TQGridLayout( groupBox->layout(), 2, 2, spacingHint() ); boxLayout->setRowStretch( 1, 1 ); mHorizontalScale = new KIntNumInput( 1, groupBox ); mHorizontalScale->setMinValue( 1 ); mHorizontalScale->setMaxValue( 50 ); boxLayout->addWidget( mHorizontalScale, 0, 0 ); label = new TQLabel( i18n( "pixel(s) per time period" ), groupBox ); boxLayout->addWidget( label, 0, 1 ); pageLayout->addWidget( groupBox, 1, 0 ); // Grid page page = addPage( i18n( "Grid" ) ); pageLayout = new TQGridLayout( page, 3, 2, 0, spacingHint() ); groupBox = new TQGroupBox( 0, Qt::Vertical, i18n( "Lines" ), page ); boxLayout = new TQGridLayout( groupBox->layout(), 2, 5, spacingHint() ); boxLayout->setColStretch( 1, 1 ); mShowVerticalLines = new TQCheckBox( i18n( "Vertical lines" ), groupBox ); TQWhatsThis::add( mShowVerticalLines, i18n( "Check this to activate the vertical lines if display is large enough." ) ); boxLayout->addWidget( mShowVerticalLines, 0, 0 ); label = new TQLabel( i18n( "Distance:" ), groupBox ); boxLayout->addWidget( label, 0, 2 ); mVerticalLinesDistance = new KIntNumInput( 0, groupBox ); mVerticalLinesDistance->setMinValue( 10 ); mVerticalLinesDistance->setMaxValue( 120 ); TQWhatsThis::add( mVerticalLinesDistance, i18n( "Enter the distance between two vertical lines here." ) ); boxLayout->addWidget( mVerticalLinesDistance , 0, 3 ); label->setBuddy( mVerticalLinesDistance ); mVerticalLinesScroll = new TQCheckBox( i18n( "Vertical lines scroll" ), groupBox ); boxLayout->addWidget( mVerticalLinesScroll, 0, 4 ); mShowHorizontalLines = new TQCheckBox( i18n( "Horizontal lines" ), groupBox ); TQWhatsThis::add( mShowHorizontalLines, i18n( "Check this to enable horizontal lines if display is large enough." ) ); boxLayout->addWidget( mShowHorizontalLines, 1, 0 ); label = new TQLabel( i18n( "Count:" ), groupBox ); boxLayout->addWidget( label, 1, 2 ); mHorizontalLinesCount = new KIntNumInput( 0, groupBox ); mHorizontalLinesCount->setMinValue( 1 ); mHorizontalLinesCount->setMaxValue( 100 ); TQWhatsThis::add( mHorizontalLinesCount, i18n( "Enter the number of horizontal lines here." ) ); boxLayout->addWidget( mHorizontalLinesCount , 1, 3 ); label->setBuddy( mHorizontalLinesCount ); boxLayout->setRowStretch( 2, 1 ); pageLayout->addMultiCellWidget( groupBox, 0, 0, 0, 1 ); groupBox = new TQGroupBox( 0, Qt::Vertical, i18n( "Text" ), page ); boxLayout = new TQGridLayout( groupBox->layout(), 3, 4, spacingHint() ); boxLayout->setColStretch( 1, 1 ); mShowLabels = new TQCheckBox( i18n( "Labels" ), groupBox ); TQWhatsThis::add( mShowLabels, i18n( "Check this box if horizontal lines should be decorated with the values they mark." ) ); boxLayout->addWidget( mShowLabels, 0, 0 ); label = new TQLabel( i18n( "Font size:" ), groupBox ); boxLayout->addWidget( label, 0, 2 ); mFontSize = new KIntNumInput( 9, groupBox ); mFontSize->setMinValue( 5 ); mFontSize->setMaxValue( 24 ); boxLayout->addWidget( mFontSize, 0, 3 ); label->setBuddy( mFontSize ); mShowTopBar = new TQCheckBox( i18n( "Top bar" ), groupBox ); TQWhatsThis::add( mShowTopBar, i18n( "Check this to active the display title bar. This is probably only useful for applet displays. The bar is only visible if the display is large enough." ) ); boxLayout->addWidget( mShowTopBar, 1, 0 ); boxLayout->setRowStretch( 2, 1 ); pageLayout->addWidget( groupBox, 1, 0 ); groupBox = new TQGroupBox( 0, Qt::Vertical, i18n( "Colors" ), page ); boxLayout = new TQGridLayout( groupBox->layout(), 4, 2, spacingHint() ); label = new TQLabel( i18n( "Vertical lines:" ), groupBox ); boxLayout->addWidget( label, 0, 0 ); mVerticalLinesColor = new KColorButton( groupBox ); boxLayout->addWidget( mVerticalLinesColor, 0, 1 ); label->setBuddy( mVerticalLinesColor ); label = new TQLabel( i18n( "Horizontal lines:" ), groupBox ); boxLayout->addWidget( label, 1, 0 ); mHorizontalLinesColor = new KColorButton( groupBox ); boxLayout->addWidget( mHorizontalLinesColor, 1, 1 ); label->setBuddy( mHorizontalLinesColor ); label = new TQLabel( i18n( "Background:" ), groupBox ); boxLayout->addWidget( label, 2, 0 ); mBackgroundColor = new KColorButton( groupBox ); boxLayout->addWidget( mBackgroundColor, 2, 1 ); label->setBuddy( mBackgroundColor ); boxLayout->setRowStretch( 3, 1 ); pageLayout->addWidget( groupBox, 1, 1 ); pageLayout->setRowStretch( 2, 1 ); // Sensors page page = addPage( i18n( "Sensors" ) ); pageLayout = new TQGridLayout( page, 6, 2, 0, spacingHint() ); pageLayout->setRowStretch( 2, 1 ); pageLayout->setRowStretch( 5, 1 ); mSensorView = new TDEListView( page ); mSensorView->addColumn("" , 0); mSensorView->addColumn( i18n( "Host" ) ); mSensorView->addColumn( i18n( "Sensor" ) ); mSensorView->addColumn( i18n( "Unit" ) ); mSensorView->addColumn( i18n( "Status" ) ); mSensorView->setResizeMode(TQListView::LastColumn); mSensorView->header()->setResizeEnabled(false, 0); mSensorView->hideColumn(0); mSensorView->header()->resizeSection(0, 0); mSensorView->setAllColumnsShowFocus( true ); pageLayout->addMultiCellWidget( mSensorView, 0, 5, 0, 0 ); mSensorView->setSortColumn ( -1 ); mEditButton = new TQPushButton( i18n( "Set Color..." ), page ); mEditButton->setEnabled( false ); TQWhatsThis::add( mEditButton, i18n( "Push this button to configure the color of the sensor in the diagram." ) ); pageLayout->addWidget( mEditButton, 0, 1 ); mRemoveButton = new TQPushButton( i18n( "Delete" ), page ); mRemoveButton->setEnabled( false ); TQWhatsThis::add( mRemoveButton, i18n( "Push this button to delete the sensor." ) ); pageLayout->addWidget( mRemoveButton, 1, 1 ); mMoveUpButton = new TQPushButton( i18n( "Move Up" ), page ); mMoveUpButton->setEnabled( false ); pageLayout->addWidget( mMoveUpButton, 3, 1 ); mMoveDownButton = new TQPushButton( i18n( "Move Down" ), page ); mMoveDownButton->setEnabled( false ); pageLayout->addWidget( mMoveDownButton, 4, 1 ); connect( mUseAutoRange, TQT_SIGNAL( toggled( bool ) ), mMinValue, TQT_SLOT( setDisabled( bool ) ) ); connect( mUseAutoRange, TQT_SIGNAL( toggled( bool ) ), mMaxValue, TQT_SLOT( setDisabled( bool ) ) ); connect( mShowVerticalLines, TQT_SIGNAL( toggled( bool ) ), mVerticalLinesDistance, TQT_SLOT( setEnabled( bool ) ) ); connect( mShowVerticalLines, TQT_SIGNAL( toggled( bool ) ), mVerticalLinesScroll, TQT_SLOT( setEnabled( bool ) ) ); connect( mShowVerticalLines, TQT_SIGNAL( toggled( bool ) ), mVerticalLinesColor, TQT_SLOT( setEnabled( bool ) ) ); connect( mShowHorizontalLines, TQT_SIGNAL( toggled( bool ) ), mHorizontalLinesCount, TQT_SLOT( setEnabled( bool ) ) ); connect( mShowHorizontalLines, TQT_SIGNAL( toggled( bool ) ), mHorizontalLinesColor, TQT_SLOT( setEnabled( bool ) ) ); connect( mShowHorizontalLines, TQT_SIGNAL( toggled( bool ) ), mShowLabels, TQT_SLOT( setEnabled( bool ) ) ); connect( mSensorView, TQT_SIGNAL( selectionChanged( TQListViewItem* ) ), TQT_SLOT( selectionChanged( TQListViewItem* ) ) ); connect( mEditButton, TQT_SIGNAL( clicked() ), TQT_SLOT( editSensor() ) ); connect( mRemoveButton, TQT_SIGNAL( clicked() ), TQT_SLOT( removeSensor() ) ); connect( mMoveUpButton, TQT_SIGNAL( clicked() ), TQT_SLOT( moveUpSensor() ) ); connect( mMoveDownButton, TQT_SIGNAL( clicked() ), TQT_SLOT( moveDownSensor() ) ); connect ( mSensorView, TQT_SIGNAL( doubleClicked( TQListViewItem *, const TQPoint &, int )), TQT_SLOT(editSensor())); TDEAcceleratorManager::manage( this ); } FancyPlotterSettings::~FancyPlotterSettings() { } void FancyPlotterSettings::setTitle( const TQString &title ) { mTitle->setText( title ); } TQString FancyPlotterSettings::title() const { return mTitle->text(); } void FancyPlotterSettings::setUseAutoRange( bool value ) { mUseAutoRange->setChecked( value ); mMinValue->setEnabled( !value ); mMaxValue->setEnabled( !value ); } bool FancyPlotterSettings::useAutoRange() const { return mUseAutoRange->isChecked(); } void FancyPlotterSettings::setMinValue( double min ) { mMinValue->setText( TQString::number( min ) ); } double FancyPlotterSettings::minValue() const { return mMinValue->text().toDouble(); } void FancyPlotterSettings::setMaxValue( double max ) { mMaxValue->setText( TQString::number( max ) ); } double FancyPlotterSettings::maxValue() const { return mMaxValue->text().toDouble(); } void FancyPlotterSettings::setUsePolygonStyle( bool value ) { if ( value ) mUsePolygonStyle->setChecked( true ); else mUseOriginalStyle->setChecked( true ); } bool FancyPlotterSettings::usePolygonStyle() const { return mUsePolygonStyle->isChecked(); } void FancyPlotterSettings::setHorizontalScale( int scale ) { mHorizontalScale->setValue( scale ); } int FancyPlotterSettings::horizontalScale() const { return mHorizontalScale->value(); } void FancyPlotterSettings::setShowVerticalLines( bool value ) { mShowVerticalLines->setChecked( value ); mVerticalLinesDistance->setEnabled( value ); mVerticalLinesScroll->setEnabled( value ); mVerticalLinesColor->setEnabled( value ); } bool FancyPlotterSettings::showVerticalLines() const { return mShowVerticalLines->isChecked(); } void FancyPlotterSettings::setVerticalLinesColor( const TQColor &color ) { mVerticalLinesColor->setColor( color ); } TQColor FancyPlotterSettings::verticalLinesColor() const { return mVerticalLinesColor->color(); } void FancyPlotterSettings::setVerticalLinesDistance( int distance ) { mVerticalLinesDistance->setValue( distance ); } int FancyPlotterSettings::verticalLinesDistance() const { return mVerticalLinesDistance->value(); } void FancyPlotterSettings::setVerticalLinesScroll( bool value ) { mVerticalLinesScroll->setChecked( value ); } bool FancyPlotterSettings::verticalLinesScroll() const { return mVerticalLinesScroll->isChecked(); } void FancyPlotterSettings::setShowHorizontalLines( bool value ) { mShowHorizontalLines->setChecked( value ); mHorizontalLinesCount->setEnabled( value ); mHorizontalLinesColor->setEnabled( value ); mShowLabels->setEnabled( value ); } bool FancyPlotterSettings::showHorizontalLines() const { return mShowHorizontalLines->isChecked(); } void FancyPlotterSettings::setHorizontalLinesColor( const TQColor &color ) { mHorizontalLinesColor->setColor( color ); } TQColor FancyPlotterSettings::horizontalLinesColor() const { return mHorizontalLinesColor->color(); } void FancyPlotterSettings::setHorizontalLinesCount( int count ) { mHorizontalLinesCount->setValue( count ); } int FancyPlotterSettings::horizontalLinesCount() const { return mHorizontalLinesCount->value(); } void FancyPlotterSettings::setShowLabels( bool value ) { mShowLabels->setChecked( value ); } bool FancyPlotterSettings::showLabels() const { return mShowLabels->isChecked(); } void FancyPlotterSettings::setShowTopBar( bool value ) { mShowTopBar->setChecked( value ); } bool FancyPlotterSettings::showTopBar() const { return mShowTopBar->isChecked(); } void FancyPlotterSettings::setFontSize( int size ) { mFontSize->setValue( size ); } int FancyPlotterSettings::fontSize() const { return mFontSize->value(); } void FancyPlotterSettings::setBackgroundColor( const TQColor &color ) { mBackgroundColor->setColor( color ); } TQColor FancyPlotterSettings::backgroundColor() const { return mBackgroundColor->color(); } void FancyPlotterSettings::clearDeleted() { mDeleted.clear(); } TQValueList FancyPlotterSettings::deleted() const { return mDeleted; } TQValueList FancyPlotterSettings::order() const { TQValueList newOrder; TQListViewItemIterator it( mSensorView ); for ( ; it.current(); ++it ) { newOrder.prepend(it.current()->text(0).toInt()); } return newOrder; } void FancyPlotterSettings::resetOrder() { int i = mSensorView->childCount()-1; TQListViewItemIterator it( mSensorView ); for ( ; it.current(); ++it, --i) { it.current()->setText(0, TQString::number(i)); } } void FancyPlotterSettings::setSensors( const TQValueList< TQStringList > &list ) { mSensorView->clear(); TQValueList< TQStringList >::ConstIterator it; for ( it = list.begin(); it != list.end(); ++it ) { TQListViewItem* lvi = new TQListViewItem( mSensorView, (*it)[ 0 ], // id (*it)[ 1 ], // host name (*it)[ 2 ], // sensor name (*it)[ 3 ], // unit (*it)[ 4 ] ); // status TQPixmap pm( 12, 12 ); pm.fill( TQColor( (*it)[ 5 ] ) ); lvi->setPixmap( 2, pm ); mSensorView->insertItem( lvi ); } } TQValueList< TQStringList > FancyPlotterSettings::sensors() const { TQValueList< TQStringList > list; TQListViewItemIterator it( mSensorView ); for ( ; it.current(); ++it ) { TQStringList entry; entry << it.current()->text( 0 ); entry << it.current()->text( 1 ); entry << it.current()->text( 2 ); entry << it.current()->text( 3 ); entry << it.current()->text( 4 ); QRgb rgb = it.current()->pixmap( 2 )->convertToImage().pixel( 1, 1 ); TQColor color( tqRed( rgb ), tqGreen( rgb ), tqBlue( rgb ) ); entry << ( color.name() ); list.prepend( entry ); } return list; } void FancyPlotterSettings::editSensor() { TQListViewItem* lvi = mSensorView->currentItem(); if ( !lvi ) return; TQColor color = lvi->pixmap( 2 )->convertToImage().pixel( 1, 1 ); int result = KColorDialog::getColor( color, parentWidget() ); if ( result == KColorDialog::Accepted ) { TQPixmap newPm( 12, 12 ); newPm.fill( color ); lvi->setPixmap( 2, newPm ); } } void FancyPlotterSettings::removeSensor() { TQListViewItem* lvi = mSensorView->currentItem(); if ( lvi ) { //Note down the id of the one we are deleting int id = lvi->text(0).toInt(); mDeleted.append(id); /* Before we delete the currently selected item, we determine a * new item to be selected. That way we can ensure that multiple * items can be deleted without forcing the user to select a new * item between the deletes. If all items are deleted, the buttons * are disabled again. */ TQListViewItem* newSelected = 0; if ( lvi->itemBelow() ) { lvi->itemBelow()->setSelected( true ); newSelected = lvi->itemBelow(); } else if ( lvi->itemAbove() ) { lvi->itemAbove()->setSelected( true ); newSelected = lvi->itemAbove(); } else selectionChanged( 0 ); delete lvi; TQListViewItemIterator it( mSensorView ); for ( ; it.current(); ++it ) { if(it.current()->text(0).toInt() > id) it.current()->setText(0, TQString::number(it.current()->text(0).toInt() -1)); } if ( newSelected ) mSensorView->ensureItemVisible( newSelected ); } } void FancyPlotterSettings::moveUpSensor() { if ( mSensorView->currentItem() != 0 ) { TQListViewItem* item = mSensorView->currentItem()->itemAbove(); if ( item ) { if ( item->itemAbove() ) { mSensorView->currentItem()->moveItem( item->itemAbove() ); } else { item->moveItem( mSensorView->currentItem() ); } } selectionChanged( mSensorView->currentItem() ); } } void FancyPlotterSettings::moveDownSensor() { if ( mSensorView->currentItem() != 0 ) { if ( mSensorView->currentItem()->itemBelow() ) mSensorView->currentItem()->moveItem( mSensorView->currentItem()->itemBelow() ); selectionChanged( mSensorView->currentItem() ); } } void FancyPlotterSettings::selectionChanged( TQListViewItem *item ) { bool state = ( item != 0 ); mEditButton->setEnabled( state ); mRemoveButton->setEnabled( state ); mMoveUpButton->setEnabled( state && item->itemAbove() ); mMoveDownButton->setEnabled( state && item->itemBelow() ); } #include "FancyPlotterSettings.moc"