All Classes Namespaces Files Functions Variables Enumerations Enumerator
programs/MultiUrgViewer/DrawWidget.cpp
Go to the documentation of this file.
00001 
00010 #include "DrawWidget.h"
00011 #include "UrgDrawWidget.h"
00012 #include <QHBoxLayout>
00013 #include <QSettings>
00014 #include <QShortcut>
00015 
00016 
00017 namespace
00018 {
00019   const char* Organization = "Hokuyo LTD.";
00020   const char* Application = "Multi URG Viewer";
00021 }
00022 
00023 
00024 struct DrawWidget::pImpl
00025 {
00026   DrawWidget* widget_;
00027   QHBoxLayout layout_;
00028   UrgDrawWidget urg_draw_widget_;
00029   UrgStateWidget* urg_state_widget_;
00030 
00031 
00032   pImpl(DrawWidget* widget)
00033     : widget_(widget), layout_(widget_), urg_state_widget_(NULL)
00034   {
00035     layout_.addWidget(&urg_draw_widget_);
00036   }
00037 
00038 
00039   void initializeForm(void)
00040   {
00041     // 位置と大きさを読み出す
00042     loadSettings();
00043 
00044     enum {
00045       MinimumWidth = 200,
00046       MinimumHeight = 200,
00047     };
00048     widget_->setMinimumSize(MinimumWidth, MinimumHeight);
00049 
00050     // キー操作によるウィンドウ操作
00051     (void) new QShortcut(Qt::Key_Return, widget_, SLOT(initializeView()));
00052     (void) new QShortcut(Qt::Key_Less, widget_, SLOT(zoomSmaller()));
00053     (void) new QShortcut(Qt::Key_Comma, widget_, SLOT(zoomSmaller()));
00054     (void) new QShortcut(Qt::Key_Greater, widget_, SLOT(zoomLarger()));
00055     (void) new QShortcut(Qt::Key_Period, widget_, SLOT(zoomLarger()));
00056 
00057     // Ctrl-w でウィンドウを閉じ、Ctrl-q で終了
00058     (void) new QShortcut(Qt::CTRL + Qt::Key_Q, widget_, SLOT(quitPressed()));
00059     (void) new QShortcut(Qt::ALT + Qt::Key_F4, widget_, SLOT(quitPressed()));
00060     (void) new QShortcut(Qt::CTRL + Qt::Key_W, widget_, SLOT(close()));
00061   }
00062 
00063 
00064   void loadSettings(void)
00065   {
00066     QSettings settings(Organization, Application);
00067     widget_->restoreGeometry(settings.value("geometry").toByteArray());
00068   }
00069 
00070 
00071   void saveSettings(void)
00072   {
00073     QSettings settings(Organization, Application);
00074     settings.setValue("geometry", widget_->saveGeometry());
00075   }
00076 
00077 
00078   void setUrgData(std::vector<long>& data,
00079                   const qrk::RangeSensor* sensor, int timestamp)
00080   {
00081     urg_draw_widget_.setUrgData(data, sensor, timestamp);
00082     urg_draw_widget_.redraw();
00083   }
00084 };
00085 
00086 
00087 DrawWidget::DrawWidget(QWidget* parent)
00088   : QWidget(parent), pimpl(new pImpl(this))
00089 {
00090   pimpl->initializeForm();
00091 }
00092 
00093 
00094 DrawWidget::~DrawWidget(void)
00095 {
00096 }
00097 
00098 
00099 void DrawWidget::closeEvent(QCloseEvent* event)
00100 {
00101   static_cast<void>(event);
00102 
00103   pimpl->saveSettings();
00104 }
00105 
00106 
00107 void DrawWidget::quitPressed(void)
00108 {
00109   close();
00110   emit quit();
00111 }
00112 
00113 
00114 void DrawWidget::initializeView(void)
00115 {
00116   pimpl->urg_draw_widget_.initializeView();
00117 }
00118 
00119 
00120 void DrawWidget::zoomSmaller(void)
00121 {
00122   pimpl->urg_draw_widget_.updateZoomRatio(+1);
00123 }
00124 
00125 
00126 void DrawWidget::zoomLarger(void)
00127 {
00128   pimpl->urg_draw_widget_.updateZoomRatio(-1);
00129 }
00130 
00131 
00132 void DrawWidget::setTitle(const QString& title,
00133                           UrgStateWidget* urg_state_widget)
00134 {
00135   pimpl->widget_->setWindowTitle(title);
00136   pimpl->urg_state_widget_ = urg_state_widget;
00137   pimpl->urg_draw_widget_.clear();
00138 }
00139 
00140 
00141 void DrawWidget::setUrgData(std::vector<long>& data,
00142                             const qrk::RangeSensor* sensor, int timestamp,
00143                             UrgStateWidget* urg_state_widget)
00144 {
00145   if (urg_state_widget != pimpl->urg_state_widget_) {
00146     return;
00147   }
00148 
00149   pimpl->setUrgData(data, sensor, timestamp);
00150 }
00151 
00152 
00153 void DrawWidget::disconnected(UrgStateWidget* urg_state_widget)
00154 {
00155   if (urg_state_widget == pimpl->urg_state_widget_) {
00156     hide();
00157     pimpl->urg_state_widget_ = NULL;
00158   }
00159 }