GNU Radio 3.7.0 C++ API
form_menus.h
Go to the documentation of this file.
00001 /* -*- c++ -*- */
00002 /*
00003  * Copyright 2012 Free Software Foundation, Inc.
00004  *
00005  * This file is part of GNU Radio
00006  *
00007  * GNU Radio is free software; you can redistribute it and/or modify
00008  * it under the terms of the GNU General Public License as published by
00009  * the Free Software Foundation; either version 3, or (at your option)
00010  * any later version.
00011  *
00012  * GNU Radio is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  * GNU General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU General Public License
00018  * along with GNU Radio; see the file COPYING.  If not, write to
00019  * the Free Software Foundation, Inc., 51 Franklin Street,
00020  * Boston, MA 02110-1301, USA.
00021  */
00022 
00023 #ifndef FORM_MENUS_H
00024 #define FORM_MENUS_H
00025 
00026 #include <stdexcept>
00027 #include <vector>
00028 #include <QtGui/QtGui>
00029 #include <qwt_symbol.h>
00030 #include <gnuradio/filter/firdes.h>
00031 #include <gnuradio/qtgui/qtgui_types.h>
00032 
00033 class LineColorMenu: public QMenu
00034 {
00035   Q_OBJECT
00036 
00037 public:
00038   LineColorMenu(int which, QWidget *parent)
00039     : QMenu("Line Color", parent), d_which(which)
00040   {
00041     d_act.push_back(new QAction("Blue", this));
00042     d_act.push_back(new QAction("Red", this));
00043     d_act.push_back(new QAction("Green", this));
00044     d_act.push_back(new QAction("Black", this));
00045     d_act.push_back(new QAction("Cyan", this));
00046     d_act.push_back(new QAction("Magenta", this));
00047     d_act.push_back(new QAction("Yellow", this));
00048     d_act.push_back(new QAction("Gray", this));
00049     d_act.push_back(new QAction("Dark Red", this));
00050     d_act.push_back(new QAction("Dark Green", this));
00051     d_act.push_back(new QAction("Dark Blue", this));
00052     d_act.push_back(new QAction("Dark Gray", this));
00053 
00054     connect(d_act[0], SIGNAL(triggered()), this, SLOT(getBlue()));
00055     connect(d_act[1], SIGNAL(triggered()), this, SLOT(getRed()));
00056     connect(d_act[2], SIGNAL(triggered()), this, SLOT(getGreen()));
00057     connect(d_act[3], SIGNAL(triggered()), this, SLOT(getBlack()));
00058     connect(d_act[4], SIGNAL(triggered()), this, SLOT(getCyan()));
00059     connect(d_act[5], SIGNAL(triggered()), this, SLOT(getMagenta()));
00060     connect(d_act[6], SIGNAL(triggered()), this, SLOT(getYellow()));
00061     connect(d_act[7], SIGNAL(triggered()), this, SLOT(getGray()));
00062     connect(d_act[8], SIGNAL(triggered()), this, SLOT(getDarkRed()));
00063     connect(d_act[9], SIGNAL(triggered()), this, SLOT(getDarkGreen()));
00064     connect(d_act[10], SIGNAL(triggered()), this, SLOT(getDarkBlue()));
00065     connect(d_act[11], SIGNAL(triggered()), this, SLOT(getDarkGray()));
00066 
00067     QListIterator<QAction*> i(d_act);
00068     while(i.hasNext()) {
00069       QAction *a = i.next();
00070       addAction(a);
00071     }
00072   }
00073 
00074   ~LineColorMenu()
00075   {}
00076 
00077   int getNumActions() const
00078   {
00079     return d_act.size();
00080   }
00081   
00082   QAction * getAction(int which)
00083   {
00084     if(which < d_act.size())
00085       return d_act[which];
00086     else
00087       throw std::runtime_error("LineColorMenu::getAction: which out of range.\n");
00088   }
00089 
00090 signals:
00091   void whichTrigger(int which, const QString &name);
00092 
00093 public slots:
00094   void getBlue() { emit whichTrigger(d_which, "blue"); }
00095   void getRed() { emit whichTrigger(d_which, "red"); }
00096   void getGreen() { emit whichTrigger(d_which, "green"); }
00097   void getBlack() { emit whichTrigger(d_which, "black"); }
00098   void getCyan() { emit whichTrigger(d_which, "cyan"); }
00099   void getMagenta() { emit whichTrigger(d_which, "magenta"); }
00100   void getYellow() { emit whichTrigger(d_which, "yellow"); }
00101   void getGray() { emit whichTrigger(d_which, "gray"); }
00102   void getDarkRed() { emit whichTrigger(d_which, "darkred"); }
00103   void getDarkGreen() { emit whichTrigger(d_which, "darkgreen"); }
00104   void getDarkBlue() { emit whichTrigger(d_which, "darkblue"); }
00105   void getDarkGray() { emit whichTrigger(d_which, "darkgray"); }
00106 
00107 private:
00108   QList<QAction *> d_act;
00109   int d_which;
00110 };
00111 
00112 
00113 /********************************************************************/
00114 
00115 
00116 class LineWidthMenu: public QMenu
00117 {
00118   Q_OBJECT
00119 
00120 public:
00121   LineWidthMenu(int which, QWidget *parent)
00122     : QMenu("Line Width", parent), d_which(which)
00123   {
00124     d_act.push_back(new QAction("1", this));
00125     d_act.push_back(new QAction("2", this));
00126     d_act.push_back(new QAction("3", this));
00127     d_act.push_back(new QAction("4", this));
00128     d_act.push_back(new QAction("5", this));
00129     d_act.push_back(new QAction("6", this));
00130     d_act.push_back(new QAction("7", this));
00131     d_act.push_back(new QAction("8", this));
00132     d_act.push_back(new QAction("9", this));
00133     d_act.push_back(new QAction("10", this));
00134 
00135     connect(d_act[0], SIGNAL(triggered()), this, SLOT(getOne()));
00136     connect(d_act[1], SIGNAL(triggered()), this, SLOT(getTwo()));
00137     connect(d_act[2], SIGNAL(triggered()), this, SLOT(getThree()));
00138     connect(d_act[3], SIGNAL(triggered()), this, SLOT(getFour()));
00139     connect(d_act[4], SIGNAL(triggered()), this, SLOT(getFive()));
00140     connect(d_act[5], SIGNAL(triggered()), this, SLOT(getSix()));
00141     connect(d_act[6], SIGNAL(triggered()), this, SLOT(getSeven()));
00142     connect(d_act[7], SIGNAL(triggered()), this, SLOT(getEight()));
00143     connect(d_act[8], SIGNAL(triggered()), this, SLOT(getNine()));
00144     connect(d_act[9], SIGNAL(triggered()), this, SLOT(getTen()));
00145 
00146     QListIterator<QAction*> i(d_act);
00147     while(i.hasNext()) {
00148       QAction *a = i.next();
00149       addAction(a);
00150     }
00151   }
00152 
00153   ~LineWidthMenu()
00154   {}
00155 
00156   int getNumActions() const
00157   {
00158     return d_act.size();
00159   }
00160   
00161   QAction * getAction(int which)
00162   {
00163     if(which < d_act.size())
00164       return d_act[which];
00165     else
00166       throw std::runtime_error("LineWidthMenu::getAction: which out of range.\n");
00167   }
00168 
00169 signals:
00170   void whichTrigger(int which, int width);
00171 
00172 public slots:
00173   void getOne()   { emit whichTrigger(d_which, 1); }
00174   void getTwo()   { emit whichTrigger(d_which, 2); }
00175   void getThree() { emit whichTrigger(d_which, 3); }
00176   void getFour()  { emit whichTrigger(d_which, 4); }
00177   void getFive()  { emit whichTrigger(d_which, 5); }
00178   void getSix()   { emit whichTrigger(d_which, 6); }
00179   void getSeven() { emit whichTrigger(d_which, 7); }
00180   void getEight() { emit whichTrigger(d_which, 8); }
00181   void getNine()  { emit whichTrigger(d_which, 9); }
00182   void getTen()   { emit whichTrigger(d_which, 10); }
00183 
00184 private:
00185   QList<QAction *> d_act;
00186   int d_which;
00187 };
00188 
00189 
00190 /********************************************************************/
00191 
00192 
00193 class LineStyleMenu: public QMenu
00194 {
00195   Q_OBJECT
00196 
00197 public:
00198   LineStyleMenu(int which, QWidget *parent)
00199     : QMenu("Line Style", parent), d_which(which)
00200   {
00201     d_act.push_back(new QAction("None", this));
00202     d_act.push_back(new QAction("Solid", this));
00203     d_act.push_back(new QAction("Dash", this));
00204     d_act.push_back(new QAction("Dots", this));
00205     d_act.push_back(new QAction("Dash-Dot", this));
00206     d_act.push_back(new QAction("Dash-Dot-Dot", this));
00207 
00208     connect(d_act[0], SIGNAL(triggered()), this, SLOT(getNone()));
00209     connect(d_act[1], SIGNAL(triggered()), this, SLOT(getSolid()));
00210     connect(d_act[2], SIGNAL(triggered()), this, SLOT(getDash()));
00211     connect(d_act[3], SIGNAL(triggered()), this, SLOT(getDots()));
00212     connect(d_act[4], SIGNAL(triggered()), this, SLOT(getDashDot()));
00213     connect(d_act[5], SIGNAL(triggered()), this, SLOT(getDashDotDot()));
00214 
00215     QListIterator<QAction*> i(d_act);
00216     while(i.hasNext()) {
00217       QAction *a = i.next();
00218       addAction(a);
00219     }
00220   }
00221 
00222   ~LineStyleMenu()
00223   {}
00224 
00225   int getNumActions() const
00226   {
00227     return d_act.size();
00228   }
00229   
00230   QAction * getAction(int which)
00231   {
00232     if(which < d_act.size())
00233       return d_act[which];
00234     else
00235       throw std::runtime_error("LineStyleMenu::getAction: which out of range.\n");
00236   }
00237 
00238 signals:
00239   void whichTrigger(int which, Qt::PenStyle);
00240 
00241 public slots:
00242   void getNone()      { emit whichTrigger(d_which, Qt::NoPen); }
00243   void getSolid()      { emit whichTrigger(d_which, Qt::SolidLine); }
00244   void getDash()       { emit whichTrigger(d_which, Qt::DashLine); }
00245   void getDots()       { emit whichTrigger(d_which, Qt::DotLine); }
00246   void getDashDot()    { emit whichTrigger(d_which, Qt::DashDotLine); }
00247   void getDashDotDot() { emit whichTrigger(d_which, Qt::DashDotDotLine); }
00248 
00249 private:
00250   QList<QAction *> d_act;
00251   int d_which;
00252 };
00253 
00254 
00255 /********************************************************************/
00256 
00257 
00258 class LineMarkerMenu: public QMenu
00259 {
00260   Q_OBJECT
00261 
00262 public:
00263   LineMarkerMenu(int which, QWidget *parent)
00264     : QMenu("Line Marker", parent), d_which(which)
00265   {
00266     d_act.push_back(new QAction("None", this));
00267     d_act.push_back(new QAction("Circle", this));
00268     d_act.push_back(new QAction("Rectangle", this));
00269     d_act.push_back(new QAction("Diamond", this));
00270     d_act.push_back(new QAction("Triangle", this));
00271     d_act.push_back(new QAction("Down Triangle", this));
00272     d_act.push_back(new QAction("Left Triangle", this));
00273     d_act.push_back(new QAction("Right Triangle", this));
00274     d_act.push_back(new QAction("Cross", this));
00275     d_act.push_back(new QAction("X-Cross", this));
00276     d_act.push_back(new QAction("Horiz. Line", this));
00277     d_act.push_back(new QAction("Vert. Line", this));
00278     d_act.push_back(new QAction("Star 1", this));
00279     d_act.push_back(new QAction("Star 2", this));
00280     d_act.push_back(new QAction("Hexagon", this));
00281 
00282     connect(d_act[0], SIGNAL(triggered()), this, SLOT(getNone()));
00283     connect(d_act[1], SIGNAL(triggered()), this, SLOT(getCircle()));
00284     connect(d_act[2], SIGNAL(triggered()), this, SLOT(getRect()));
00285     connect(d_act[3], SIGNAL(triggered()), this, SLOT(getDiamond()));
00286     connect(d_act[4], SIGNAL(triggered()), this, SLOT(getTriangle()));
00287     connect(d_act[5], SIGNAL(triggered()), this, SLOT(getDTriangle()));
00288     connect(d_act[6], SIGNAL(triggered()), this, SLOT(getLTriangle()));
00289     connect(d_act[7], SIGNAL(triggered()), this, SLOT(getRTriangle()));
00290     connect(d_act[8], SIGNAL(triggered()), this, SLOT(getCross()));
00291     connect(d_act[9], SIGNAL(triggered()), this, SLOT(getXCross()));
00292     connect(d_act[10], SIGNAL(triggered()), this, SLOT(getHLine()));
00293     connect(d_act[11], SIGNAL(triggered()), this, SLOT(getVLine()));
00294     connect(d_act[12], SIGNAL(triggered()), this, SLOT(getStar1()));
00295     connect(d_act[13], SIGNAL(triggered()), this, SLOT(getStar2()));
00296     connect(d_act[14], SIGNAL(triggered()), this, SLOT(getHexagon()));
00297 
00298     QListIterator<QAction*> i(d_act);
00299     while(i.hasNext()) {
00300       QAction *a = i.next();
00301       addAction(a);
00302     }
00303   }
00304 
00305   ~LineMarkerMenu()
00306   {}
00307 
00308   int getNumActions() const
00309   {
00310     return d_act.size();
00311   }
00312   
00313   QAction * getAction(int which)
00314   {
00315     if(which < d_act.size())
00316       return d_act[which];
00317     else
00318       throw std::runtime_error("LineMarkerMenu::getAction: which out of range.\n");
00319   }
00320 
00321 signals:
00322   void whichTrigger(int which, QwtSymbol::Style);
00323 
00324 public slots:
00325   void getNone()      { emit whichTrigger(d_which, QwtSymbol::NoSymbol); }
00326   void getCircle()    { emit whichTrigger(d_which, QwtSymbol::Ellipse); }
00327   void getRect()      { emit whichTrigger(d_which, QwtSymbol::Rect); }
00328   void getDiamond()   { emit whichTrigger(d_which, QwtSymbol::Diamond); }
00329   void getTriangle()  { emit whichTrigger(d_which, QwtSymbol::Triangle); }
00330   void getDTriangle() { emit whichTrigger(d_which, QwtSymbol::DTriangle); }
00331   void getLTriangle() { emit whichTrigger(d_which, QwtSymbol::LTriangle); }
00332   void getRTriangle() { emit whichTrigger(d_which, QwtSymbol::RTriangle); }
00333   void getCross()     { emit whichTrigger(d_which, QwtSymbol::Cross); }
00334   void getXCross()    { emit whichTrigger(d_which, QwtSymbol::XCross); }
00335   void getHLine()     { emit whichTrigger(d_which, QwtSymbol::HLine); }
00336   void getVLine()     { emit whichTrigger(d_which, QwtSymbol::VLine); }
00337   void getStar1()     { emit whichTrigger(d_which, QwtSymbol::Star1); }
00338   void getStar2()     { emit whichTrigger(d_which, QwtSymbol::Star2); }
00339   void getHexagon()   { emit whichTrigger(d_which, QwtSymbol::Hexagon); }
00340 
00341 private:
00342   QList<QAction *> d_act;
00343   int d_which;
00344 };
00345 
00346 
00347 /********************************************************************/
00348 
00349 
00350 class MarkerAlphaMenu: public QMenu
00351 {
00352   Q_OBJECT
00353 
00354 public:
00355   MarkerAlphaMenu(int which, QWidget *parent)
00356     : QMenu("Line Transparency", parent), d_which(which)
00357   {
00358     d_act.push_back(new QAction("None", this));
00359     d_act.push_back(new QAction("Low", this));
00360     d_act.push_back(new QAction("Medium", this));
00361     d_act.push_back(new QAction("High", this));
00362     d_act.push_back(new QAction("Off", this));
00363 
00364     connect(d_act[0], SIGNAL(triggered()), this, SLOT(getNone()));
00365     connect(d_act[1], SIGNAL(triggered()), this, SLOT(getLow()));
00366     connect(d_act[2], SIGNAL(triggered()), this, SLOT(getMedium()));
00367     connect(d_act[3], SIGNAL(triggered()), this, SLOT(getHigh()));
00368     connect(d_act[4], SIGNAL(triggered()), this, SLOT(getOff()));
00369 
00370     QListIterator<QAction*> i(d_act);
00371     while(i.hasNext()) {
00372       QAction *a = i.next();
00373       addAction(a);
00374     }
00375   }
00376 
00377   ~MarkerAlphaMenu()
00378   {}
00379 
00380   int getNumActions() const
00381   {
00382     return d_act.size();
00383   }
00384   
00385   QAction * getAction(int which)
00386   {
00387     if(which < d_act.size())
00388       return d_act[which];
00389     else
00390       throw std::runtime_error("MarkerAlphaMenu::getAction: which out of range.\n");
00391   }
00392 
00393 signals:
00394   void whichTrigger(int which, int);
00395 
00396 public slots:
00397   void getNone()   { emit whichTrigger(d_which, 255); }
00398   void getLow()    { emit whichTrigger(d_which, 200); }
00399   void getMedium() { emit whichTrigger(d_which, 125); }
00400   void getHigh()   { emit whichTrigger(d_which, 50); }
00401   void getOff()    { emit whichTrigger(d_which, 0); }
00402 
00403 private:
00404   QList<QAction *> d_act;
00405   int d_which;
00406 };
00407 
00408 
00409 /********************************************************************/
00410 
00411 
00412 class LineTitleAction: public QAction
00413 {
00414   Q_OBJECT
00415 
00416 public:
00417   LineTitleAction(int which, QWidget *parent)
00418     : QAction("Line Title", parent), d_which(which)
00419   {
00420     d_diag = new QDialog(parent);
00421     d_diag->setModal(true);
00422 
00423     d_text = new QLineEdit();
00424 
00425     QGridLayout *layout = new QGridLayout(d_diag);
00426     QPushButton *btn_ok = new QPushButton(tr("OK"));
00427     QPushButton *btn_cancel = new QPushButton(tr("Cancel"));
00428 
00429     layout->addWidget(d_text, 0, 0, 1, 2);
00430     layout->addWidget(btn_ok, 1, 0);
00431     layout->addWidget(btn_cancel, 1, 1);
00432 
00433     connect(btn_ok, SIGNAL(clicked()), this, SLOT(getText()));
00434     connect(btn_cancel, SIGNAL(clicked()), d_diag, SLOT(close()));
00435 
00436     connect(this, SIGNAL(triggered()), this, SLOT(getTextDiag()));
00437   }
00438 
00439   ~LineTitleAction()
00440   {}
00441   
00442 signals:
00443   void whichTrigger(int which, const QString &text);
00444 
00445 public slots:
00446   void getTextDiag()
00447   {
00448     d_diag->exec();
00449   }
00450 
00451 private slots:
00452   void getText()
00453   { 
00454     emit whichTrigger(d_which, d_text->text());
00455     d_diag->accept();
00456   }
00457 
00458 private:
00459   int d_which;
00460 
00461   QDialog *d_diag;
00462   QLineEdit *d_text;
00463 };
00464 
00465 
00466 /********************************************************************/
00467 
00468 
00469 class OtherAction: public QAction
00470 {
00471   Q_OBJECT
00472 
00473 public:
00474   OtherAction(QWidget *parent)
00475     : QAction("Other", parent)
00476   {
00477     d_diag = new QDialog(parent);
00478     d_diag->setModal(true);
00479 
00480     d_text = new QLineEdit();
00481 
00482     QGridLayout *layout = new QGridLayout(d_diag);
00483     QPushButton *btn_ok = new QPushButton(tr("OK"));
00484     QPushButton *btn_cancel = new QPushButton(tr("Cancel"));
00485 
00486     layout->addWidget(d_text, 0, 0, 1, 2);
00487     layout->addWidget(btn_ok, 1, 0);
00488     layout->addWidget(btn_cancel, 1, 1);
00489 
00490     connect(btn_ok, SIGNAL(clicked()), this, SLOT(getText()));
00491     connect(btn_cancel, SIGNAL(clicked()), d_diag, SLOT(close()));
00492 
00493     connect(this, SIGNAL(triggered()), this, SLOT(getTextDiag()));
00494   }
00495 
00496   ~OtherAction()
00497   {}
00498 
00499 signals:
00500   void whichTrigger(const QString &text);
00501 
00502 public slots:
00503   void getTextDiag()
00504   {
00505     d_diag->exec();
00506   }
00507 
00508 private slots:
00509   void getText()
00510   { 
00511     emit whichTrigger(d_text->text());
00512     d_diag->accept();
00513   }
00514 
00515 private:
00516   QDialog *d_diag;
00517   QLineEdit *d_text;
00518 };
00519 
00520 /********************************************************************/
00521 
00522 
00523 class OtherDualAction: public QAction
00524 {
00525   Q_OBJECT
00526 
00527 public:
00528   OtherDualAction(QString label0, QString label1, QWidget *parent)
00529     : QAction("Other", parent)
00530   {
00531     d_diag = new QDialog(parent);
00532     d_diag->setModal(true);
00533 
00534     d_text0 = new QLineEdit();
00535     d_text1 = new QLineEdit();
00536     
00537     QLabel *_label0 = new QLabel(label0);
00538     QLabel *_label1 = new QLabel(label1);
00539 
00540     QGridLayout *layout = new QGridLayout(d_diag);
00541     QPushButton *btn_ok = new QPushButton(tr("OK"));
00542     QPushButton *btn_cancel = new QPushButton(tr("Cancel"));
00543 
00544     layout->addWidget(_label0, 0, 0, 1, 2);
00545     layout->addWidget(_label1, 1, 0, 1, 2);
00546 
00547     layout->addWidget(d_text0, 0, 1, 1, 2);
00548     layout->addWidget(d_text1, 1, 1, 1, 2);
00549     layout->addWidget(btn_ok, 2, 0);
00550     layout->addWidget(btn_cancel, 2, 1);
00551 
00552     connect(btn_ok, SIGNAL(clicked()), this, SLOT(getText()));
00553     connect(btn_cancel, SIGNAL(clicked()), d_diag, SLOT(close()));
00554 
00555     connect(this, SIGNAL(triggered()), this, SLOT(getTextDiag()));
00556   }
00557 
00558   ~OtherDualAction()
00559   {}
00560 
00561 signals:
00562   void whichTrigger(const QString &text0, const QString &text1);
00563 
00564 public slots:
00565   void getTextDiag()
00566   {
00567     d_diag->exec();
00568   }
00569 
00570 private slots:
00571   void getText()
00572   { 
00573     emit whichTrigger(d_text0->text(), d_text1->text());
00574     d_diag->accept();
00575   }
00576 
00577 private:
00578   QDialog *d_diag;
00579   QLineEdit *d_text0;
00580   QLineEdit *d_text1;
00581 };
00582 
00583 
00584 /********************************************************************/
00585 
00586 
00587 class FFTSizeMenu: public QMenu
00588 {
00589   Q_OBJECT
00590 
00591 public:
00592   FFTSizeMenu(QWidget *parent)
00593     : QMenu("FFT Size", parent)
00594   {
00595     d_act.push_back(new QAction("32", this));
00596     d_act.push_back(new QAction("64", this));
00597     d_act.push_back(new QAction("128", this));
00598     d_act.push_back(new QAction("256", this));
00599     d_act.push_back(new QAction("512", this));
00600     d_act.push_back(new QAction("1024", this));
00601     d_act.push_back(new QAction("2048", this));
00602     d_act.push_back(new QAction("4096", this));
00603     d_act.push_back(new QAction("8192", this));
00604     d_act.push_back(new QAction("16384", this));
00605     d_act.push_back(new QAction("32768", this));
00606     d_act.push_back(new OtherAction(this));
00607 
00608     connect(d_act[0], SIGNAL(triggered()), this, SLOT(get05()));
00609     connect(d_act[1], SIGNAL(triggered()), this, SLOT(get06()));
00610     connect(d_act[2], SIGNAL(triggered()), this, SLOT(get07()));
00611     connect(d_act[3], SIGNAL(triggered()), this, SLOT(get08()));
00612     connect(d_act[4], SIGNAL(triggered()), this, SLOT(get09()));
00613     connect(d_act[5], SIGNAL(triggered()), this, SLOT(get10()));
00614     connect(d_act[6], SIGNAL(triggered()), this, SLOT(get11()));
00615     connect(d_act[7], SIGNAL(triggered()), this, SLOT(get12()));
00616     connect(d_act[8], SIGNAL(triggered()), this, SLOT(get13()));
00617     connect(d_act[9], SIGNAL(triggered()), this, SLOT(get14()));
00618     connect(d_act[10], SIGNAL(triggered()), this, SLOT(get15()));
00619     connect(d_act[11], SIGNAL(whichTrigger(const QString&)),
00620              this, SLOT(getOther(const QString&)));
00621 
00622      QListIterator<QAction*> i(d_act);
00623      while(i.hasNext()) {
00624        QAction *a = i.next();
00625        addAction(a);
00626      }
00627    }
00628 
00629    ~FFTSizeMenu()
00630    {}
00631 
00632    int getNumActions() const
00633    {
00634      return d_act.size();
00635    }
00636 
00637    QAction * getAction(int which)
00638    {
00639      if(which < d_act.size())
00640        return d_act[which];
00641      else
00642        throw std::runtime_error("FFTSizeMenu::getAction: which out of range.\n");
00643    }
00644 
00645  signals:
00646    void whichTrigger(int size);
00647 
00648  public slots:
00649    void get05() { emit whichTrigger(32); }
00650    void get06() { emit whichTrigger(64); }
00651    void get07() { emit whichTrigger(128); }
00652    void get08() { emit whichTrigger(256); }
00653    void get09() { emit whichTrigger(512); }
00654    void get10() { emit whichTrigger(1024); }
00655    void get11() { emit whichTrigger(2048); }
00656    void get12() { emit whichTrigger(4096); }
00657    void get13() { emit whichTrigger(8192); }
00658    void get14() { emit whichTrigger(16384); }
00659    void get15() { emit whichTrigger(32768); }
00660    void getOther(const QString &str) 
00661    {
00662      int value = str.toInt();
00663      emit whichTrigger(value);
00664    }
00665 
00666 private:
00667   QList<QAction *> d_act;
00668   OtherAction *d_other;
00669 };
00670 
00671 
00672 /********************************************************************/
00673 
00674 
00675 class FFTAverageMenu: public QMenu
00676 {
00677   Q_OBJECT
00678 
00679 public:
00680   FFTAverageMenu(QWidget *parent)
00681     : QMenu("FFT Average", parent)
00682   {
00683     d_act.push_back(new QAction("Off", this));
00684     d_act.push_back(new QAction("High", this));
00685     d_act.push_back(new QAction("Medium", this));
00686     d_act.push_back(new QAction("Low", this));
00687     d_act.push_back(new OtherAction(this));
00688 
00689     connect(d_act[0], SIGNAL(triggered()), this, SLOT(getOff()));
00690     connect(d_act[1], SIGNAL(triggered()), this, SLOT(getHigh()));
00691     connect(d_act[2], SIGNAL(triggered()), this, SLOT(getMedium()));
00692     connect(d_act[3], SIGNAL(triggered()), this, SLOT(getLow()));
00693     connect(d_act[4], SIGNAL(whichTrigger(const QString&)),
00694              this, SLOT(getOther(const QString&)));
00695 
00696      QListIterator<QAction*> i(d_act);
00697      while(i.hasNext()) {
00698        QAction *a = i.next();
00699        addAction(a);
00700      }
00701    }
00702 
00703    ~FFTAverageMenu()
00704    {}
00705 
00706    int getNumActions() const
00707    {
00708      return d_act.size();
00709    }
00710 
00711    QAction * getAction(int which)
00712    {
00713      if(which < d_act.size())
00714        return d_act[which];
00715      else
00716        throw std::runtime_error("FFTSizeMenu::getAction: which out of range.\n");
00717    }
00718 
00719  signals:
00720    void whichTrigger(float alpha);
00721 
00722  public slots:
00723    void getOff() { emit whichTrigger(1.0); }
00724    void getHigh() { emit whichTrigger(0.05); }
00725    void getMedium() { emit whichTrigger(0.1); }
00726    void getLow() { emit whichTrigger(0.2); }
00727    void getOther(const QString &str) 
00728    {
00729      float value = str.toFloat();
00730      emit whichTrigger(value);
00731    }
00732 
00733 private:
00734   QList<QAction *> d_act;
00735   OtherAction *d_other;
00736 };
00737 
00738 
00739 /********************************************************************/
00740 
00741 
00742 class FFTWindowMenu: public QMenu
00743 {
00744   Q_OBJECT
00745 
00746 public:
00747   FFTWindowMenu(QWidget *parent)
00748     : QMenu("FFT Window", parent)
00749   {
00750     d_act.push_back(new QAction("None", this));
00751     d_act.push_back(new QAction("Hamming", this));
00752     d_act.push_back(new QAction("Hann", this));
00753     d_act.push_back(new QAction("Blackman", this));
00754     d_act.push_back(new QAction("Blackman-harris", this));
00755     d_act.push_back(new QAction("Rectangular", this));
00756     d_act.push_back(new QAction("Kaiser", this));
00757 
00758     connect(d_act[0], SIGNAL(triggered()), this, SLOT(getNone()));
00759     connect(d_act[1], SIGNAL(triggered()), this, SLOT(getHamming()));
00760     connect(d_act[2], SIGNAL(triggered()), this, SLOT(getHann()));
00761     connect(d_act[3], SIGNAL(triggered()), this, SLOT(getBlackman()));
00762     connect(d_act[4], SIGNAL(triggered()), this, SLOT(getBlackmanharris()));
00763     connect(d_act[5], SIGNAL(triggered()), this, SLOT(getRectangular()));
00764     connect(d_act[6], SIGNAL(triggered()), this, SLOT(getKaiser()));
00765 
00766     QListIterator<QAction*> i(d_act);
00767     while(i.hasNext()) {
00768       QAction *a = i.next();
00769       addAction(a);
00770     }
00771   }
00772 
00773   ~FFTWindowMenu()
00774   {}
00775 
00776   int getNumActions() const
00777   {
00778     return d_act.size();
00779   }
00780   
00781   QAction * getAction(int which)
00782   {
00783     if(which < d_act.size())
00784       return d_act[which];
00785     else
00786       throw std::runtime_error("FFTWindowMenu::getAction: which out of range.\n");
00787   }
00788 
00789 signals:
00790   void whichTrigger(const gr::filter::firdes::win_type type);
00791 
00792 public slots:
00793   void getNone() { emit whichTrigger(gr::filter::firdes::WIN_NONE); }
00794   void getHamming() { emit whichTrigger(gr::filter::firdes::WIN_HAMMING); }
00795   void getHann() { emit whichTrigger(gr::filter::firdes::WIN_HANN); }
00796   void getBlackman() { emit whichTrigger(gr::filter::firdes::WIN_BLACKMAN); }
00797   void getBlackmanharris() { emit whichTrigger(gr::filter::firdes::WIN_BLACKMAN_hARRIS); }
00798   void getRectangular() { emit whichTrigger(gr::filter::firdes::WIN_RECTANGULAR); }
00799   void getKaiser() { emit whichTrigger(gr::filter::firdes::WIN_KAISER); }
00800 
00801 private:
00802   QList<QAction *> d_act;
00803   int d_which;
00804 };
00805 
00806 
00807 /********************************************************************/
00808 
00809 
00810 class NPointsMenu: public QAction
00811 {
00812   Q_OBJECT
00813 
00814 public:
00815   NPointsMenu(QWidget *parent)
00816     : QAction("Number of Points", parent)
00817   {
00818     d_diag = new QDialog(parent);
00819     d_diag->setModal(true);
00820 
00821     d_text = new QLineEdit();
00822 
00823     QGridLayout *layout = new QGridLayout(d_diag);
00824     QPushButton *btn_ok = new QPushButton(tr("OK"));
00825     QPushButton *btn_cancel = new QPushButton(tr("Cancel"));
00826 
00827     layout->addWidget(d_text, 0, 0, 1, 2);
00828     layout->addWidget(btn_ok, 1, 0);
00829     layout->addWidget(btn_cancel, 1, 1);
00830 
00831     connect(btn_ok, SIGNAL(clicked()), this, SLOT(getText()));
00832     connect(btn_cancel, SIGNAL(clicked()), d_diag, SLOT(close()));
00833 
00834     connect(this, SIGNAL(triggered()), this, SLOT(getTextDiag()));
00835   }
00836 
00837   ~NPointsMenu()
00838   {}
00839 
00840 signals:
00841   void whichTrigger(const int npts);
00842 
00843 public slots:
00844   void getTextDiag()
00845   {
00846     d_diag->show();
00847   }
00848 
00849 private slots:
00850   void getText()
00851   { 
00852     emit whichTrigger(d_text->text().toInt());
00853     d_diag->accept();
00854   }
00855 
00856 private:
00857   QDialog *d_diag;
00858   QLineEdit *d_text;
00859 };
00860 
00861 
00862 /********************************************************************/
00863 
00864 
00865 class ColorMapMenu: public QMenu
00866 {
00867   Q_OBJECT
00868 
00869 public:
00870   ColorMapMenu(int which, QWidget *parent)
00871     : QMenu("Color Map", parent), d_which(which)
00872   {
00873     d_act.push_back(new QAction("Multi-Color", this));
00874     d_act.push_back(new QAction("White Hot", this));
00875     d_act.push_back(new QAction("Black Hot", this));
00876     d_act.push_back(new QAction("Incandescent", this));
00877     d_act.push_back(new QAction("Other", this));
00878     //d_act.push_back(new OtherDualAction("Min Intensity: ", "Max Intensity: ", this));
00879 
00880     connect(d_act[0], SIGNAL(triggered()), this, SLOT(getMultiColor()));
00881     connect(d_act[1], SIGNAL(triggered()), this, SLOT(getWhiteHot()));
00882     connect(d_act[2], SIGNAL(triggered()), this, SLOT(getBlackHot()));
00883     connect(d_act[3], SIGNAL(triggered()), this, SLOT(getIncandescent()));
00884     connect(d_act[4], SIGNAL(triggered()), this, SLOT(getOther()));
00885 
00886      QListIterator<QAction*> i(d_act);
00887      while(i.hasNext()) {
00888        QAction *a = i.next();
00889        addAction(a);
00890      }
00891 
00892      d_max_value = QColor("white");
00893      d_min_value = QColor("white");
00894    }
00895 
00896    ~ColorMapMenu()
00897    {}
00898 
00899    int getNumActions() const
00900    {
00901      return d_act.size();
00902    }
00903 
00904    QAction * getAction(int which)
00905    {
00906      if(which < d_act.size())
00907        return d_act[which];
00908      else
00909        throw std::runtime_error("ColorMapMenu::getAction: which out of range.\n");
00910    }
00911 
00912  signals:
00913   void whichTrigger(int which, const int type,
00914                     const QColor &min_color=QColor(),
00915                     const QColor &max_color=QColor());
00916 
00917  public slots:
00918   void getMultiColor() { emit whichTrigger(d_which, INTENSITY_COLOR_MAP_TYPE_MULTI_COLOR); }
00919   void getWhiteHot() { emit whichTrigger(d_which, INTENSITY_COLOR_MAP_TYPE_WHITE_HOT); }
00920   void getBlackHot() { emit whichTrigger(d_which, INTENSITY_COLOR_MAP_TYPE_BLACK_HOT); }
00921   void getIncandescent() { emit whichTrigger(d_which, INTENSITY_COLOR_MAP_TYPE_INCANDESCENT); }
00922   //void getOther(d_which, const QString &min_str, const QString &max_str)
00923   void getOther()
00924   {
00925     QMessageBox::information(this, "Set low and high intensities",
00926        "In the next windows, select the low and then the high intensity colors.",
00927        QMessageBox::Ok);
00928     d_min_value = QColorDialog::getColor(d_min_value, this);
00929     d_max_value = QColorDialog::getColor(d_max_value, this);
00930 
00931     emit whichTrigger(d_which, INTENSITY_COLOR_MAP_TYPE_USER_DEFINED,
00932                       d_min_value, d_max_value);
00933   }
00934 
00935 private:
00936   QList<QAction *> d_act;
00937   OtherDualAction *d_other;
00938   QColor d_max_value, d_min_value;
00939   int d_which;
00940 };
00941 
00942 
00943 /********************************************************************/
00944 
00945 
00946 class PopupMenu: public QAction
00947 {
00948   Q_OBJECT
00949 
00950 public:
00951   PopupMenu(QString desc, QWidget *parent)
00952     : QAction(desc, parent)
00953   {
00954     d_diag = new QDialog(parent);
00955     d_diag->setModal(true);
00956 
00957     d_text = new QLineEdit();
00958 
00959     QGridLayout *layout = new QGridLayout(d_diag);
00960     QPushButton *btn_ok = new QPushButton(tr("OK"));
00961     QPushButton *btn_cancel = new QPushButton(tr("Cancel"));
00962 
00963     layout->addWidget(d_text, 0, 0, 1, 2);
00964     layout->addWidget(btn_ok, 1, 0);
00965     layout->addWidget(btn_cancel, 1, 1);
00966 
00967     connect(btn_ok, SIGNAL(clicked()), this, SLOT(getText()));
00968     connect(btn_cancel, SIGNAL(clicked()), d_diag, SLOT(close()));
00969 
00970     connect(this, SIGNAL(triggered()), this, SLOT(getTextDiag()));
00971   }
00972 
00973   ~PopupMenu()
00974   {}
00975 
00976 signals:
00977   void whichTrigger(const QString data);
00978 
00979 public slots:
00980   void getTextDiag()
00981   {
00982     d_diag->show();
00983   }
00984 
00985 private slots:
00986   void getText()
00987   { 
00988     emit whichTrigger(d_text->text());
00989     d_diag->accept();
00990   }
00991 
00992 private:
00993   QDialog *d_diag;
00994   QLineEdit *d_text;
00995 };
00996 
00997 
00998 /********************************************************************/
00999 
01000 
01001 #endif /* FORM_MENUS_H */