107 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			107 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #include "Modes.hpp" | ||
|  | 
 | ||
|  | #include <algorithm> | ||
|  | 
 | ||
|  | #include <QString> | ||
|  | #include <QVariant> | ||
|  | #include <QModelIndex> | ||
|  | 
 | ||
|  | #include "moc_Modes.cpp" | ||
|  | 
 | ||
|  | namespace | ||
|  | { | ||
|  |   // human readable strings for each Mode enumeration value | ||
|  |   char const * const mode_names[] = | ||
|  |   { | ||
|  |     "All", | ||
|  |     "JT65", | ||
|  |     "JT9", | ||
|  |     "JT4", | ||
|  |     "WSPR", | ||
|  |     "Echo", | ||
|  |     "ISCAT", | ||
|  |     "MSK144", | ||
|  |     "QRA64", | ||
|  |     "FreqCal", | ||
|  |     "FT8" | ||
|  |   }; | ||
|  |   std::size_t constexpr mode_names_size = sizeof (mode_names) / sizeof (mode_names[0]); | ||
|  | } | ||
|  | 
 | ||
|  | Modes::Modes (QObject * parent) | ||
|  |   : QAbstractListModel {parent} | ||
|  | { | ||
|  |   static_assert (mode_names_size == MODES_END_SENTINAL_AND_COUNT, | ||
|  |                  "mode_names array must match Mode enumeration"); | ||
|  | } | ||
|  | 
 | ||
|  | char const * Modes::name (Mode m) | ||
|  | { | ||
|  |   return mode_names[static_cast<int> (m)]; | ||
|  | } | ||
|  | 
 | ||
|  | auto Modes::value (QString const& s) -> Mode | ||
|  | { | ||
|  |   auto end = mode_names + mode_names_size; | ||
|  |   auto p = std::find_if (mode_names, end | ||
|  |                          , [&s] (char const * const name) { | ||
|  |                            return name == s; | ||
|  |                          }); | ||
|  |   return p != end ? static_cast<Mode> (p - mode_names) : ALL; | ||
|  | } | ||
|  | 
 | ||
|  | QVariant Modes::data (QModelIndex const& index, int role) const | ||
|  | { | ||
|  |   QVariant item; | ||
|  | 
 | ||
|  |   if (index.isValid ()) | ||
|  |     { | ||
|  |       auto const& row = index.row (); | ||
|  |       switch (role) | ||
|  |         { | ||
|  |         case Qt::ToolTipRole: | ||
|  |         case Qt::AccessibleDescriptionRole: | ||
|  |           item = tr ("Mode"); | ||
|  |           break; | ||
|  | 
 | ||
|  |         case Qt::EditRole: | ||
|  |           item = static_cast<Mode> (row); | ||
|  |           break; | ||
|  | 
 | ||
|  |         case Qt::DisplayRole: | ||
|  |         case Qt::AccessibleTextRole: | ||
|  |           item = mode_names[row]; | ||
|  |           break; | ||
|  | 
 | ||
|  |         case Qt::TextAlignmentRole: | ||
|  |           item = Qt::AlignHCenter + Qt::AlignVCenter; | ||
|  |           break; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |   return item; | ||
|  | } | ||
|  | 
 | ||
|  | QVariant Modes::headerData (int section, Qt::Orientation orientation, int role) const | ||
|  | { | ||
|  |   QVariant result; | ||
|  | 
 | ||
|  |   if (Qt::DisplayRole == role && Qt::Horizontal == orientation) | ||
|  |     { | ||
|  |       result = tr ("Mode"); | ||
|  |     } | ||
|  |   else | ||
|  |     { | ||
|  |       result = QAbstractListModel::headerData (section, orientation, role); | ||
|  |     } | ||
|  | 
 | ||
|  |   return result; | ||
|  | } | ||
|  | 
 | ||
|  | #if !defined (QT_NO_DEBUG_STREAM) | ||
|  | ENUM_QDEBUG_OPS_IMPL (Modes, Mode); | ||
|  | #endif | ||
|  | 
 | ||
|  | ENUM_QDATASTREAM_OPS_IMPL (Modes, Mode); | ||
|  | ENUM_CONVERSION_OPS_IMPL (Modes, Mode); |