All Classes Namespaces Files Functions Variables Enumerations Enumerator
programs/UrgViewer/LengthViewWidget.cpp
Go to the documentation of this file.
00001 
00015 #include "LengthViewWidget.h"
00016 #include <QHeaderView>
00017 #include <QFileDialog>
00018 #include <QTextStream>
00019 #include <QShortcut>
00020 
00021 using namespace std;
00022 
00023 
00024 struct LengthViewWidget::pImpl
00025 {
00026     LengthViewWidget* widget_;
00027     size_t min_distance_;
00028 
00029     pImpl(LengthViewWidget* widget) : widget_(widget), min_distance_(0)
00030     {
00031     }
00032 
00033 
00034     void initializeForm(void)
00035     {
00036         widget_->length_table_->
00037             setEditTriggers(QAbstractItemView::NoEditTriggers);
00038 
00039         // コンテナ
00040         for (int i = 0; i < 2; ++i) {
00041             widget_->length_table_->
00042                 horizontalHeader()->setResizeMode(i, QHeaderView::Stretch);
00043         }
00044 
00045         // イベント
00046         connect(widget_->update_button_, SIGNAL(clicked()),
00047                 widget_, SLOT(updatePressed()));
00048         connect(widget_->save_button_, SIGNAL(clicked()),
00049                 widget_, SLOT(savePressed()));
00050         connect(widget_->close_button_, SIGNAL(clicked()),
00051                 widget_, SLOT(close()));
00052         connect(widget_->length_table_, SIGNAL(itemSelectionChanged()),
00053                 widget_, SLOT(itemSelectionChanged()));
00054 
00055         // キー割り付け
00056         (void) new QShortcut(Qt::CTRL + Qt::Key_Q, widget_,
00057                              SLOT(quitPressed()));
00058         (void) new QShortcut(Qt::CTRL + Qt::Key_W, widget_, SLOT(close()));
00059     }
00060 
00061 
00062     void setData(int index, const vector<long>& data)
00063     {
00064         size_t row_count = widget_->length_table_->rowCount();
00065         size_t data_size = data.size();
00066         if (data_size == 0) {
00067             return;
00068         }
00069         widget_->save_button_->setEnabled(true);
00070 
00071         if (data_size > row_count) {
00072             widget_->length_table_->setRowCount(data_size);
00073 
00074             QStringList labels;
00075             for (size_t i = 0; i < data_size; ++i) {
00076                 labels.push_back(tr("%1").arg(i));
00077             }
00078             widget_->length_table_->setVerticalHeaderLabels(labels);
00079         }
00080 
00081         const QBrush error_brush(QColor(255, 0, 0));
00082         for (size_t i = 0; i < data_size; ++i) {
00083             long length = data[i];
00084             QTableWidgetItem *new_item =
00085                 new QTableWidgetItem(tr("%1").arg(length));
00086             new_item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
00087 
00088             if ((index == 0) && (length < static_cast<long>(min_distance_))) {
00089                 // エラーデータであることを強調するために、色を変える
00090                 new_item->setForeground(error_brush);
00091             }
00092             widget_->length_table_->setItem(i, index, new_item);
00093         }
00094         widget_->length_table_->setRowCount(data_size);
00095     }
00096 };
00097 
00098 
00099 LengthViewWidget::LengthViewWidget(QWidget* parent)
00100     : QWidget(parent), pimpl(new pImpl(this))
00101 {
00102     setupUi(this);
00103     pimpl->initializeForm();
00104 }
00105 
00106 
00107 LengthViewWidget::~LengthViewWidget(void)
00108 {
00109 }
00110 
00111 
00112 void LengthViewWidget::clear(void)
00113 {
00114     length_table_->clearContents();
00115 }
00116 
00117 
00118 void LengthViewWidget::setMinDistance(size_t min_distance)
00119 {
00120     pimpl->min_distance_ = min_distance;
00121 }
00122 
00123 
00124 void LengthViewWidget::setLength(const vector<long>& length_data)
00125 {
00126     pimpl->setData(0, length_data);
00127 }
00128 
00129 
00130 void LengthViewWidget::setIntensity(const vector<long>& intensity_data)
00131 {
00132     pimpl->setData(1, intensity_data);
00133 }
00134 
00135 
00136 void LengthViewWidget::updatePressed(void)
00137 {
00138     emit lengthViewRequest();
00139 }
00140 
00141 
00142 void LengthViewWidget::savePressed(void)
00143 {
00144     // 保存処理
00145     QString default_file_name = "length_data.csv";
00146     QString file_name =
00147         QFileDialog::getSaveFileName(this, tr("Save length data."),
00148                                      default_file_name, tr("CSV (*.csv)"));
00149     if (file_name.isEmpty()) {
00150         return;
00151     }
00152 
00153     QFile save_file(file_name);
00154     if (! save_file.open(QIODevice::WriteOnly | QIODevice::Text)) {
00155         return;
00156     }
00157     QTextStream fout(&save_file);
00158 
00159     size_t row_count = length_table_->rowCount();
00160     for (size_t y = 0; y < row_count; ++y) {
00161 
00162         fout << y << ',';
00163 
00164         for (int x = 0; x < 2; ++x) {
00165             QTableWidgetItem* item = length_table_->item(y, x);
00166             if (! item) {
00167                 continue;
00168             }
00169             long value = item->text().toLong();
00170 
00171             fout << value << ',';
00172         }
00173         fout << '\n';
00174     }
00175 }
00176 
00177 
00178 void LengthViewWidget::closeEvent(QCloseEvent* event)
00179 {
00180     static_cast<void>(event);
00181 
00182     emit widgetClose("LengthViewWidget");
00183     close();
00184 }
00185 
00186 
00187 void LengthViewWidget::quitPressed(void)
00188 {
00189     emit quit();
00190 }
00191 
00192 
00193 void LengthViewWidget::itemSelectionChanged(void)
00194 {
00195     vector<int> indexes;
00196 
00197     QList<QTableWidgetItem*> selected_list = length_table_->selectedItems();
00198     for (QList<QTableWidgetItem*>::iterator it = selected_list.begin();
00199          it != selected_list.end(); ++it) {
00200         if (*it) {
00201             indexes.push_back((*it)->row());
00202         }
00203     }
00204     emit drawLineRequest(indexes);
00205 }