| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  | #include "DecodesModel.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QStandardItem>
 | 
					
						
							|  |  |  | #include <QModelIndex>
 | 
					
						
							|  |  |  | #include <QTime>
 | 
					
						
							|  |  |  | #include <QString>
 | 
					
						
							|  |  |  | #include <QFont>
 | 
					
						
							|  |  |  | #include <QList>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   char const * const headings[] = { | 
					
						
							|  |  |  |     QT_TRANSLATE_NOOP ("DecodesModel", "Client"), | 
					
						
							|  |  |  |     QT_TRANSLATE_NOOP ("DecodesModel", "Time"), | 
					
						
							|  |  |  |     QT_TRANSLATE_NOOP ("DecodesModel", "Snr"), | 
					
						
							|  |  |  |     QT_TRANSLATE_NOOP ("DecodesModel", "DT"), | 
					
						
							|  |  |  |     QT_TRANSLATE_NOOP ("DecodesModel", "DF"), | 
					
						
							|  |  |  |     QT_TRANSLATE_NOOP ("DecodesModel", "Md"), | 
					
						
							| 
									
										
										
										
											2017-07-26 21:18:59 +00:00
										 |  |  |     QT_TRANSLATE_NOOP ("DecodesModel", "Confidence"), | 
					
						
							| 
									
										
										
										
											2017-09-16 22:20:59 +00:00
										 |  |  |     QT_TRANSLATE_NOOP ("DecodesModel", "Live"), | 
					
						
							| 
									
										
										
										
											2017-09-22 22:08:41 +00:00
										 |  |  |     QT_TRANSLATE_NOOP ("DecodesModel", "Message"), | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-26 21:18:59 +00:00
										 |  |  |   QString confidence_string (bool low_confidence) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return low_confidence ? QT_TRANSLATE_NOOP ("DecodesModel", "low") : QT_TRANSLATE_NOOP ("DecodesModel", "high"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-16 22:20:59 +00:00
										 |  |  |   QString live_string (bool off_air) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return off_air ? QT_TRANSLATE_NOOP ("DecodesModel", "no") : QT_TRANSLATE_NOOP ("DecodesModel", "yes"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  |   QFont text_font {"Courier", 10}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   QList<QStandardItem *> make_row (QString const& client_id, QTime time, qint32 snr, float delta_time | 
					
						
							| 
									
										
										
										
											2016-12-16 19:36:21 +00:00
										 |  |  |                                    , quint32 delta_frequency, QString const& mode, QString const& message | 
					
						
							| 
									
										
										
										
											2017-09-16 22:20:59 +00:00
										 |  |  |                                    , bool low_confidence, bool off_air, bool is_fast) | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  |   { | 
					
						
							| 
									
										
										
										
											2017-07-07 23:11:49 +00:00
										 |  |  |     auto time_item = new QStandardItem {time.toString (is_fast || "~" == mode ? "hh:mm:ss" : "hh:mm")}; | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  |     time_item->setData (time); | 
					
						
							|  |  |  |     time_item->setTextAlignment (Qt::AlignRight); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto snr_item = new QStandardItem {QString::number (snr)}; | 
					
						
							|  |  |  |     snr_item->setData (snr); | 
					
						
							|  |  |  |     snr_item->setTextAlignment (Qt::AlignRight); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto dt = new QStandardItem {QString::number (delta_time)}; | 
					
						
							|  |  |  |     dt->setData (delta_time); | 
					
						
							|  |  |  |     dt->setTextAlignment (Qt::AlignRight); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto df = new QStandardItem {QString::number (delta_frequency)}; | 
					
						
							|  |  |  |     df->setData (delta_frequency); | 
					
						
							|  |  |  |     df->setTextAlignment (Qt::AlignRight); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto md = new QStandardItem {mode}; | 
					
						
							|  |  |  |     md->setTextAlignment (Qt::AlignHCenter); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-26 21:18:59 +00:00
										 |  |  |     auto confidence = new QStandardItem {confidence_string (low_confidence)}; | 
					
						
							|  |  |  |     confidence->setTextAlignment (Qt::AlignHCenter); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-16 22:20:59 +00:00
										 |  |  |     auto live = new QStandardItem {live_string (off_air)}; | 
					
						
							|  |  |  |     live->setTextAlignment (Qt::AlignHCenter); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  |     QList<QStandardItem *> row { | 
					
						
							| 
									
										
										
										
											2017-09-22 22:08:41 +00:00
										 |  |  |       new QStandardItem {client_id}, time_item, snr_item, dt, df, md, confidence, live, new QStandardItem {message}}; | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  |     Q_FOREACH (auto& item, row) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         item->setEditable (false); | 
					
						
							|  |  |  |         item->setFont (text_font); | 
					
						
							|  |  |  |         item->setTextAlignment (item->textAlignment () | Qt::AlignVCenter); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     return row; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DecodesModel::DecodesModel (QObject * parent) | 
					
						
							| 
									
										
										
										
											2018-12-02 10:09:37 -05:00
										 |  |  |   : QStandardItemModel {0, sizeof headings / sizeof headings[0], parent} | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   int column {0}; | 
					
						
							|  |  |  |   for (auto const& heading : headings) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       setHeaderData (column++, Qt::Horizontal, tr (heading)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void DecodesModel::add_decode (bool is_new, QString const& client_id, QTime time, qint32 snr, float delta_time | 
					
						
							| 
									
										
										
										
											2016-12-16 19:36:21 +00:00
										 |  |  |                                , quint32 delta_frequency, QString const& mode, QString const& message | 
					
						
							| 
									
										
										
										
											2017-09-16 22:20:59 +00:00
										 |  |  |                                , bool low_confidence, bool off_air, bool is_fast) | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   if (!is_new) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       int target_row {-1}; | 
					
						
							|  |  |  |       for (auto row = 0; row < rowCount (); ++row) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           if (data (index (row, 0)).toString () == client_id) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               auto row_time = item (row, 1)->data ().toTime (); | 
					
						
							|  |  |  |               if (row_time == time | 
					
						
							|  |  |  |                   && item (row, 2)->data ().toInt () == snr | 
					
						
							|  |  |  |                   && item (row, 3)->data ().toFloat () == delta_time | 
					
						
							|  |  |  |                   && item (row, 4)->data ().toUInt () == delta_frequency | 
					
						
							|  |  |  |                   && data (index (row, 5)).toString () == mode | 
					
						
							| 
									
										
										
										
											2017-09-16 22:20:59 +00:00
										 |  |  |                   && data (index (row, 7)).toString () == confidence_string (low_confidence) | 
					
						
							| 
									
										
										
										
											2017-09-22 22:08:41 +00:00
										 |  |  |                   && data (index (row, 6)).toString () == live_string (off_air) | 
					
						
							|  |  |  |                   && data (index (row, 8)).toString () == message) | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  |                 { | 
					
						
							|  |  |  |                   return; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               if (time <= row_time) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                   target_row = row; // last row with same time
 | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       if (target_row >= 0) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2016-12-16 19:36:21 +00:00
										 |  |  |           insertRow (target_row + 1, make_row (client_id, time, snr, delta_time, delta_frequency, mode | 
					
						
							| 
									
										
										
										
											2017-09-16 22:20:59 +00:00
										 |  |  |                                                , message, low_confidence, off_air, is_fast)); | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  |           return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-16 22:20:59 +00:00
										 |  |  |   appendRow (make_row (client_id, time, snr, delta_time, delta_frequency, mode, message, low_confidence | 
					
						
							|  |  |  |                        , off_air, is_fast)); | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-03 00:49:35 +00:00
										 |  |  | void DecodesModel::decodes_cleared (QString const& client_id) | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   for (auto row = rowCount () - 1; row >= 0; --row) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       if (data (index (row, 0)).toString () == client_id) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           removeRow (row); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 15:36:24 +00:00
										 |  |  | void DecodesModel::do_reply (QModelIndex const& source, quint8 modifiers) | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   auto row = source.row (); | 
					
						
							|  |  |  |   Q_EMIT reply (data (index (row, 0)).toString () | 
					
						
							|  |  |  |                 , item (row, 1)->data ().toTime () | 
					
						
							|  |  |  |                 , item (row, 2)->data ().toInt () | 
					
						
							|  |  |  |                 , item (row, 3)->data ().toFloat () | 
					
						
							|  |  |  |                 , item (row, 4)->data ().toInt () | 
					
						
							|  |  |  |                 , data (index (row, 5)).toString () | 
					
						
							| 
									
										
										
										
											2017-09-22 22:08:41 +00:00
										 |  |  |                 , data (index (row, 8)).toString () | 
					
						
							| 
									
										
										
										
											2017-09-22 15:36:24 +00:00
										 |  |  |                 , confidence_string (true) == data (index (row, 7)).toString () | 
					
						
							|  |  |  |                 , modifiers); | 
					
						
							| 
									
										
										
										
											2016-05-24 10:08:35 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "moc_DecodesModel.cpp"
 |