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.
260 lines
9.2 KiB
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"
|