You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kstars/kstars/fovdialog.cpp

260 lines
9.2 KiB

/***************************************************************************
fovdialog.cpp - description
-------------------
begin : Fri 05 Sept 2003
copyright : (C) 2003 by Jason Harris
email : kstars@30doradus.org
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <tqlayout.h>
#include <tqfile.h>
#include <tqframe.h>
#include <tqpainter.h>
#include <tqstringlist.h>
#include <klocale.h>
#include <kdebug.h>
#include <kpushbutton.h>
#include <kcolorbutton.h>
#include <kcombobox.h>
#include <knuminput.h>
#include <klineedit.h>
#include <kmessagebox.h>
#include <kstandarddirs.h>
#include "fovdialog.h"
#include "kstars.h"
#include "kstarsdata.h"
#include "fovdialogui.h"
#include "newfovui.h"
//---------FOVDialog---------------//
FOVDialog::FOVDialog( TQWidget *parent )
: KDialogBase( KDialogBase::Plain, i18n( "Set FOV Indicator" ), Ok|Cancel, Ok, parent ) {
ks = (KStars*)TQT_TQWIDGET(parent);
TQFrame *page = plainPage();
TQVBoxLayout *vlay = new TQVBoxLayout( page, 0, 0 );
fov = new FOVDialogUI( page );
vlay->addWidget( fov );
connect( fov->FOVListBox, TQT_SIGNAL( currentChanged( TQListBoxItem* ) ), TQT_SLOT( slotSelect( TQListBoxItem* ) ) );
connect( fov->NewButton, TQT_SIGNAL( clicked() ), TQT_SLOT( slotNewFOV() ) );
connect( fov->EditButton, TQT_SIGNAL( clicked() ), TQT_SLOT( slotEditFOV() ) );
connect( fov->RemoveButton, TQT_SIGNAL( clicked() ), TQT_SLOT( slotRemoveFOV() ) );
FOVList.setAutoDelete( true );
initList();
}
FOVDialog::~FOVDialog()
{}
void FOVDialog::initList() {
TQStringList fields;
TQFile f;
TQString nm, cl;
int sh(0);
float sz(0.0);
f.setName( locate( "appdata", "fov.dat" ) );
if ( f.exists() && f.open( IO_ReadOnly ) ) {
TQListBoxItem *item = 0;
TQTextStream stream( &f );
while ( !stream.eof() ) {
fields = TQStringList::split( ":", stream.readLine() );
bool ok( false );
if ( fields.count() == 4 ) {
nm = fields[0];
sz = (float)(fields[1].toDouble( &ok ));
if ( ok ) {
sh = fields[2].toInt( &ok );
if ( ok ) {
cl = fields[3];
}
}
}
if ( ok ) {
FOV *newfov = new FOV( nm, sz, sh, cl );
fov->FOVListBox->insertItem( nm );
FOVList.append( newfov );
//Tag item if its name matches the current fov symbol in the main window
if ( nm == ks->data()->fovSymbol.name() ) item = fov->FOVListBox->item( fov->FOVListBox->count()-1 );
}
}
f.close();
//preset the listbox selection to the current setting in the main window
fov->FOVListBox->setSelected( item, true );
slotSelect( item );
}
}
void FOVDialog::slotSelect(TQListBoxItem *item) {
if ( item == 0 ) { //no item selected
fov->RemoveButton->setEnabled( false );
fov->EditButton->setEnabled( false );
} else {
fov->RemoveButton->setEnabled( true );
fov->EditButton->setEnabled( true );
}
//paint dialog with selected FOV symbol
update();
}
void FOVDialog::paintEvent( TQPaintEvent * ) {
//Draw the selected target symbol in the pixmap.
TQPainter p;
p.begin( fov->ViewBox );
p.fillRect( fov->ViewBox->contentsRect(), TQColor( "black" ) );
if ( fov->FOVListBox->currentItem() >= 0 ) {
FOV *f = FOVList.at( fov->FOVListBox->currentItem() );
if ( f->size() > 0 ) {
f->draw( p, (float)( 0.3*fov->ViewBox->contentsRect().width() ) );
TQFont smallFont = p.font();
smallFont.setPointSize( p.font().pointSize() - 2 );
p.setFont( smallFont );
p.drawText( 0, fov->ViewBox->contentsRect().height(), i18n("angular size in arcminutes", "%1 arcmin").arg( TDEGlobal::locale()->formatNumber( f->size() ), 3 ) );
}
}
p.end();
}
void FOVDialog::slotNewFOV() {
NewFOV newfdlg( this );
if ( newfdlg.exec() == TQDialog::Accepted ) {
FOV *newfov = new FOV( newfdlg.ui->FOVName->text(), newfdlg.ui->FOVEdit->text().toDouble(),
newfdlg.ui->ShapeBox->currentItem(), newfdlg.ui->ColorButton->color().name() );
fov->FOVListBox->insertItem( newfdlg.ui->FOVName->text() );
fov->FOVListBox->setSelected( fov->FOVListBox->count() -1, true );
FOVList.append( newfov );
}
}
void FOVDialog::slotEditFOV() {
NewFOV newfdlg( this );
//Preload current values
FOV *f = FOVList.at( fov->FOVListBox->currentItem() );
if (!f)
return;
newfdlg.ui->FOVName->setText( f->name() );
newfdlg.ui->FOVEdit->setText( TDEGlobal::locale()->formatNumber( f->size(), 3 ) );
newfdlg.ui->ColorButton->setColor( TQColor( f->color() ) );
newfdlg.ui->ShapeBox->setCurrentItem( f->shape() );
newfdlg.slotUpdateFOV();
if ( newfdlg.exec() == TQDialog::Accepted ) {
FOV *newfov = new FOV( newfdlg.ui->FOVName->text(), newfdlg.ui->FOVEdit->text().toDouble(),
newfdlg.ui->ShapeBox->currentItem(), newfdlg.ui->ColorButton->color().name() );
fov->FOVListBox->changeItem( newfdlg.ui->FOVName->text(), fov->FOVListBox->currentItem() );
FOVList.replace( fov->FOVListBox->currentItem(), newfov );
}
}
void FOVDialog::slotRemoveFOV() {
uint i = fov->FOVListBox->currentItem();
FOVList.remove( i );
fov->FOVListBox->removeItem( i );
if ( i == fov->FOVListBox->count() ) i--; //last item was removed
fov->FOVListBox->setSelected( i, true );
fov->FOVListBox->update();
if ( FOVList.isEmpty() ) {
TQString message( i18n( "You have removed all FOV symbols. If the list remains empty when you exit this tool, the default symbols will be regenerated." ) );
KMessageBox::information( 0, message, i18n( "FOV list is empty" ), "dontShowFOVMessage" );
}
update();
}
//-------------NewFOV------------------//
NewFOV::NewFOV( TQWidget *parent )
: KDialogBase( KDialogBase::Plain, i18n( "New FOV Indicator" ), Ok|Cancel, Ok, parent ), f() {
TQFrame *page = plainPage();
TQVBoxLayout *vlay = new TQVBoxLayout( page, 0, 0 );
ui = new NewFOVUI( page );
vlay->addWidget( ui );
connect( ui->FOVName, TQT_SIGNAL( textChanged( const TQString & ) ), TQT_SLOT( slotUpdateFOV() ) );
connect( ui->FOVEdit, TQT_SIGNAL( textChanged( const TQString & ) ), TQT_SLOT( slotUpdateFOV() ) );
connect( ui->ColorButton, TQT_SIGNAL( changed( const TQColor & ) ), TQT_SLOT( slotUpdateFOV() ) );
connect( ui->ShapeBox, TQT_SIGNAL( activated( int ) ), TQT_SLOT( slotUpdateFOV() ) );
connect( ui->ComputeEyeFOV, TQT_SIGNAL( clicked() ), TQT_SLOT( slotComputeFOV() ) );
connect( ui->ComputeCameraFOV, TQT_SIGNAL( clicked() ), TQT_SLOT( slotComputeFOV() ) );
connect( ui->ComputeHPBW, TQT_SIGNAL( clicked() ), TQT_SLOT( slotComputeFOV() ) );
slotUpdateFOV();
}
void NewFOV::slotUpdateFOV() {
bool sizeOk( false );
f.setName( ui->FOVName->text() );
float size = (float)(ui->FOVEdit->text().toDouble( &sizeOk ));
if ( sizeOk ) f.setSize( size );
f.setShape( ui->ShapeBox->currentItem() );
f.setColor( ui->ColorButton->color().name() );
if ( ! f.name().isEmpty() && sizeOk )
enableButtonOK( true );
else
enableButtonOK( false );
update();
}
void NewFOV::paintEvent( TQPaintEvent * ) {
TQPainter p;
p.begin( ui->ViewBox );
p.fillRect( ui->ViewBox->contentsRect(), TQColor( "black" ) );
f.draw( p, (float)( 0.3*ui->ViewBox->contentsRect().width() ) );
p.drawText( 0, 0, i18n("angular size in arcminutes", "%1 arcmin").arg( TDEGlobal::locale()->formatNumber( f.size() ), 3 ) );
p.end();
}
void NewFOV::slotComputeFOV() {
//DEBUG
kdDebug() << ":" << TQT_TQOBJECT(const_cast<TQT_BASE_OBJECT_NAME*>(sender()))->name() << ":" << endl;
if ( TQT_TQOBJECT(const_cast<TQT_BASE_OBJECT_NAME*>(sender()))->name() == TQString( "ComputeEyeFOV" ) ) kdDebug() << "A" << endl;
if ( TQT_TQOBJECT(const_cast<TQT_BASE_OBJECT_NAME*>(sender()))->name() == TQString( "ComputeEyeFOV" ) && ui->TLength1->value() > 0.0 ) kdDebug() << "B" << endl;
if ( TQT_TQOBJECT(const_cast<TQT_BASE_OBJECT_NAME*>(sender()))->name() == TQString( "ComputeEyeFOV" ) && ui->TLength1->value() > 0.0 )
ui->FOVEdit->setText( TDEGlobal::locale()->formatNumber( ui->EyeFOV->value() * ui->EyeLength->value() / ui->TLength1->value() ) );
else if ( TQT_TQOBJECT(const_cast<TQT_BASE_OBJECT_NAME*>(sender()))->name() == TQString( "ComputeCameraFOV" ) && ui->TLength2->value() > 0.0 )
ui->FOVEdit->setText( TDEGlobal::locale()->formatNumber( ui->ChipSize->value() * 3438.0 / ui->TLength2->value() ) );
else if ( TQT_TQOBJECT(const_cast<TQT_BASE_OBJECT_NAME*>(sender()))->name() == TQString( "ComputeHPBW" ) && ui->RTDiameter->value() > 0.0 && ui->WaveLength->value() > 0.0 ) {
ui->FOVEdit->setText( TDEGlobal::locale()->formatNumber( 34.34 * 1.2 * ui->WaveLength->value() / ui->RTDiameter->value() ) );
// Beam width for an antenna is usually a circle on the sky.
ui->ShapeBox->setCurrentItem(4);
slotUpdateFOV();
}
}
unsigned int FOVDialog::currentItem() const { return fov->FOVListBox->currentItem(); }
#include "fovdialog.moc"