mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	Trying to find the sweet spot for completeness, usefulness, safety and, performance from the various custom item models and item delegates. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@5474 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "LiveFrequencyValidator.hpp"
 | 
						|
 | 
						|
#include <QLocale>
 | 
						|
#include <QString>
 | 
						|
#include <QComboBox>
 | 
						|
#include <QLineEdit>
 | 
						|
 | 
						|
#include "Bands.hpp"
 | 
						|
#include "FrequencyList.hpp"
 | 
						|
 | 
						|
#include "moc_LiveFrequencyValidator.cpp"
 | 
						|
 | 
						|
LiveFrequencyValidator::LiveFrequencyValidator (QComboBox * combo_box
 | 
						|
                                                , Bands const * bands
 | 
						|
                                                , FrequencyList const * frequencies
 | 
						|
                                                , QWidget * parent)
 | 
						|
  : QRegExpValidator {
 | 
						|
      QRegExp {       // frequency in MHz or band
 | 
						|
        bands->data (QModelIndex {}).toString () // out of band string
 | 
						|
          + QString {R"(|((\d{0,6}(\)"}    // or up to 6 digits
 | 
						|
          + QLocale {}.decimalPoint () // (followed by decimal separator
 | 
						|
          + R"(\d{0,2})?)([Mm]{1,2}|([Cc][Mm])))|(\d{0,4}(\)" // followed by up to 2 digits and either 'm' or 'cm' or 'mm' (case insensitive))
 | 
						|
          + QLocale {}.decimalPoint () // or a decimal separator
 | 
						|
          + R"(\d{0,6})?))"        //  followed by up to 6 digits
 | 
						|
      }
 | 
						|
      , parent
 | 
						|
    }
 | 
						|
  , bands_ {bands}
 | 
						|
  , frequencies_ {frequencies}
 | 
						|
  , combo_box_ {combo_box}
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
auto LiveFrequencyValidator::validate (QString& input, int& pos) const -> State
 | 
						|
{
 | 
						|
  auto state = QRegExpValidator::validate (input, pos);
 | 
						|
  // by never being Acceptable we force fixup calls on ENTER or
 | 
						|
  // losing focus
 | 
						|
  return Acceptable == state ? Intermediate : state;
 | 
						|
}
 | 
						|
 | 
						|
void LiveFrequencyValidator::fixup (QString& input) const
 | 
						|
{
 | 
						|
  QRegExpValidator::fixup (input);
 | 
						|
  if (!bands_->oob ().startsWith (input))
 | 
						|
    {
 | 
						|
      if (input.contains ('m', Qt::CaseInsensitive))
 | 
						|
        {
 | 
						|
          input = input.toLower ();
 | 
						|
 | 
						|
          QVector<QVariant> frequencies;
 | 
						|
          for (auto const& item : frequencies_->frequency_list ())
 | 
						|
            {
 | 
						|
              if (bands_->find (item.frequency_) == input)
 | 
						|
                {
 | 
						|
                  frequencies << item.frequency_;
 | 
						|
                }
 | 
						|
            }
 | 
						|
          if (!frequencies.isEmpty ())
 | 
						|
            {
 | 
						|
              Q_EMIT valid (frequencies.first ().value<Frequency> ());
 | 
						|
            }
 | 
						|
          else
 | 
						|
            {
 | 
						|
              input = QString {};
 | 
						|
            }
 | 
						|
        }
 | 
						|
      else
 | 
						|
        {
 | 
						|
          // frequency input
 | 
						|
          auto f = Radio::frequency (input, 6);
 | 
						|
          input = bands_->find (f);
 | 
						|
          Q_EMIT valid (f);
 | 
						|
        }
 | 
						|
 | 
						|
      if (bands_->oob () == input)
 | 
						|
        {
 | 
						|
          combo_box_->lineEdit ()->setStyleSheet ("QLineEdit {color: yellow; background-color : red;}");
 | 
						|
        }
 | 
						|
      else
 | 
						|
        {
 | 
						|
          combo_box_->lineEdit ()->setStyleSheet ({});
 | 
						|
        }
 | 
						|
      combo_box_->setCurrentText (input);
 | 
						|
    }
 | 
						|
}
 |