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