1 #ifndef WSJTX_UDP_CLIENT_WIDGET_MODEL_HPP__ 2 #define WSJTX_UDP_CLIENT_WIDGET_MODEL_HPP__ 3 4 #include <QDockWidget> 5 #include <QObject> 6 #include <QSortFilterProxyModel> 7 #include <QString> 8 #include <QRegularExpression> 9 10 #include "MessageServer.hpp" 11 12 class QAbstractItemModel; 13 class QModelIndex; 14 class QColor; 15 class QAction; 16 class QListWidget; 17 class QFormLayout; 18 class QVBoxLayout; 19 class QHBoxLayout; 20 class QStackedLayout; 21 class QTableView; 22 class QLineEdit; 23 class QAbstractButton; 24 class QLabel; 25 class QCheckBox; 26 class QSpinBox; 27 class QFrame; 28 class QStatusBar; 29 class QDialogButtonBox; 30 31 using Frequency = MessageServer::Frequency; 32 33 class ClientWidget 34 : public QDockWidget 35 { 36 Q_OBJECT; 37 38 using ClientKey = MessageServer::ClientKey; 39 40 public: 41 explicit ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemModel * beacons_model 42 , ClientKey const& key, QString const& version, QString const& revision 43 , QListWidget const * calls_of_interest, QWidget * parent = nullptr); 44 void dispose (); 45 ~ClientWidget (); 46 47 bool fast_mode () const; 48 49 Q_SLOT void update_status (ClientKey const& key, Frequency f, QString const& mode, QString const& dx_call 50 , QString const& report, QString const& tx_mode, bool tx_enabled 51 , bool transmitting, bool decoding, quint32 rx_df, quint32 tx_df 52 , QString const& de_call, QString const& de_grid, QString const& dx_grid 53 , bool watchdog_timeout, QString const& sub_mode, bool fast_mode 54 , quint8 special_op_mode, quint32 frequency_tolerance, quint32 tr_period 55 , QString const& configuration_name, QString const& tx_message); 56 Q_SLOT void decode_added (bool is_new, ClientKey const& key, QTime, qint32 snr 57 , float delta_time, quint32 delta_frequency, QString const& mode 58 , QString const& message, bool low_confidence, bool off_air); 59 Q_SLOT void beacon_spot_added (bool is_new, ClientKey const& key, QTime, qint32 snr 60 , float delta_time, Frequency delta_frequency, qint32 drift 61 , QString const& callsign, QString const& grid, qint32 power 62 , bool off_air); 63 Q_SLOT void decodes_cleared (ClientKey const& key); 64 65 Q_SIGNAL void do_clear_decodes (ClientKey const& key, quint8 window = 0); 66 Q_SIGNAL void do_close (ClientKey const& key); 67 Q_SIGNAL void do_reply (QModelIndex const&, quint8 modifier); 68 Q_SIGNAL void do_halt_tx (ClientKey const& key, bool auto_only); 69 Q_SIGNAL void do_free_text (ClientKey const& key, QString const& text, bool); 70 Q_SIGNAL void location (ClientKey const& key, QString const& text); 71 Q_SIGNAL void highlight_callsign (ClientKey const& key, QString const& call 72 , QColor const& bg = QColor {}, QColor const& fg = QColor {} 73 , bool last_only = false); 74 Q_SIGNAL void switch_configuration (ClientKey const& key, QString const& configuration_name); 75 Q_SIGNAL void configure (ClientKey const& key, QString const& mode, quint32 frequency_tolerance 76 , QString const& submode, bool fast_mode, quint32 tr_period, quint32 rx_df 77 , QString const& dx_call, QString const& dx_grid, bool generate_messages); 78 79 private: 80 class IdFilterModel final 81 : public QSortFilterProxyModel 82 { 83 public: 84 IdFilterModel (ClientKey const& key, QObject * = nullptr); 85 86 void de_call (QString const&); 87 void rx_df (quint32); 88 89 QVariant data (QModelIndex const& proxy_index, int role = Qt::DisplayRole) const override; 90 private: 91 bool filterAcceptsRow (int source_row, QModelIndex const& source_parent) const override; 92 93 ClientKey key_; 94 QString call_; 95 QRegularExpression base_call_re_; 96 quint32 rx_df_; 97 }; 98 99 void closeEvent (QCloseEvent *) override; 100 101 ClientKey key_; 102 bool done_; 103 QListWidget const * calls_of_interest_; 104 IdFilterModel decodes_proxy_model_; 105 IdFilterModel beacons_proxy_model_; 106 107 QAction * erase_action_; 108 QAction * erase_rx_frequency_action_; 109 QAction * erase_both_action_; 110 QTableView * decodes_table_view_; 111 QTableView * beacons_table_view_; 112 QLineEdit * message_line_edit_; 113 QLineEdit * grid_line_edit_; 114 QAbstractButton * generate_messages_push_button_; 115 QAbstractButton * auto_off_button_; 116 QAbstractButton * halt_tx_button_; 117 QLabel * de_label_; 118 QLabel * frequency_label_; 119 QLabel * tx_df_label_; 120 QLabel * report_label_; 121 QLineEdit * configuration_line_edit_; 122 QLineEdit * mode_line_edit_; 123 QSpinBox * frequency_tolerance_spin_box_; 124 QLabel * tx_mode_label_; 125 QLabel * tx_message_label_; 126 QLineEdit * submode_line_edit_; 127 QCheckBox * fast_mode_check_box_; 128 QSpinBox * tr_period_spin_box_; 129 QSpinBox * rx_df_spin_box_; 130 QLineEdit * dx_call_line_edit_; 131 QLineEdit * dx_grid_line_edit_; 132 QWidget * decodes_page_; 133 QWidget * beacons_page_; 134 QFrame * content_widget_; 135 QStatusBar * status_bar_; 136 QDialogButtonBox * control_button_box_; 137 138 QFormLayout * form_layout_; 139 QHBoxLayout * horizontal_layout_; 140 QFormLayout * subform1_layout_; 141 QFormLayout * subform2_layout_; 142 QFormLayout * subform3_layout_; 143 QVBoxLayout * decodes_layout_; 144 QVBoxLayout * beacons_layout_; 145 QVBoxLayout * content_layout_; 146 QStackedLayout * decodes_stack_; 147 148 bool columns_resized_; 149 }; 150 151 #endif 152