2026-01-04 12:54:34 -06:00
|
|
|
|
2026-01-05 08:23:33 -06:00
|
|
|
/** \file
|
2026-01-17 15:24:43 -06:00
|
|
|
* @brief member function of the UI_Constructor class
|
2026-01-05 08:23:33 -06:00
|
|
|
* builds the callsign query menu
|
|
|
|
|
*/
|
|
|
|
|
|
2026-01-18 12:53:55 -06:00
|
|
|
#include "JS8_UI/mainwindow.h"
|
|
|
|
|
|
2026-01-17 15:24:43 -06:00
|
|
|
void UI_Constructor::buildQueryMenu(QMenu *menu, QString call) {
|
2026-01-04 12:54:34 -06:00
|
|
|
bool isAllCall = isAllCallIncluded(call);
|
|
|
|
|
|
|
|
|
|
// for now, we're going to omit displaying the call...delete this if we want
|
|
|
|
|
// the other functionality
|
|
|
|
|
call = "";
|
|
|
|
|
|
|
|
|
|
auto grid = m_config.my_grid();
|
|
|
|
|
|
|
|
|
|
bool emptyInfo = m_config.my_info().isEmpty();
|
|
|
|
|
bool emptyGrid = m_config.my_grid().isEmpty();
|
|
|
|
|
|
|
|
|
|
auto callAction = menu->addAction(
|
|
|
|
|
QString("Send a directed message to selected callsign"));
|
|
|
|
|
connect(callAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 ").arg(selectedCall), true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
menu->addSeparator();
|
|
|
|
|
|
|
|
|
|
auto sendReplyAction = menu->addAction(
|
|
|
|
|
QString("%1 Reply - Send reply message to selected callsign")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
connect(sendReplyAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto message = m_config.reply_message();
|
|
|
|
|
message = replaceMacros(message, buildMacroValues(), true);
|
|
|
|
|
addMessageText(QString("%1 %2").arg(selectedCall).arg(message), true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto sendSNRAction = menu->addAction(
|
|
|
|
|
QString("%1 SNR - Send a signal report to the selected callsign")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
sendSNRAction->setEnabled(m_callActivity.contains(callsignSelected()));
|
|
|
|
|
connect(sendSNRAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!m_callActivity.contains(selectedCall)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto d = m_callActivity[selectedCall];
|
|
|
|
|
addMessageText(QString("%1 SNR %2")
|
|
|
|
|
.arg(selectedCall)
|
|
|
|
|
.arg(Varicode::formatSNR(d.snr)),
|
|
|
|
|
true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto infoAction = menu->addAction(
|
|
|
|
|
QString("%1 INFO - Send my station information").arg(call).trimmed());
|
|
|
|
|
infoAction->setDisabled(emptyInfo);
|
|
|
|
|
connect(infoAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(
|
|
|
|
|
QString("%1 INFO %2").arg(selectedCall).arg(m_config.my_info()),
|
|
|
|
|
true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto gridAction = menu->addAction(
|
|
|
|
|
QString("%1 GRID %2 - Send my current station Maidenhead grid locator")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.arg(grid)
|
|
|
|
|
.trimmed());
|
|
|
|
|
gridAction->setDisabled(emptyGrid);
|
|
|
|
|
connect(gridAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(
|
|
|
|
|
QString("%1 GRID %2").arg(selectedCall).arg(m_config.my_grid()),
|
|
|
|
|
true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
menu->addSeparator();
|
|
|
|
|
|
|
|
|
|
auto snrQueryAction = menu->addAction(
|
|
|
|
|
QString("%1 SNR? - What is my signal report?").arg(call).trimmed());
|
|
|
|
|
snrQueryAction->setDisabled(isAllCall);
|
|
|
|
|
connect(snrQueryAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 SNR?").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto infoQueryAction =
|
|
|
|
|
menu->addAction(QString("%1 INFO? - What is your station information?")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
infoQueryAction->setDisabled(isAllCall);
|
|
|
|
|
connect(infoQueryAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 INFO?").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto gridQueryAction =
|
|
|
|
|
menu->addAction(QString("%1 GRID? - What is your current grid locator?")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
gridQueryAction->setDisabled(isAllCall);
|
|
|
|
|
connect(gridQueryAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 GRID?").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto stationIdleQueryAction = menu->addAction(
|
|
|
|
|
QString("%1 STATUS? - What is your station status message?")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
stationIdleQueryAction->setDisabled(isAllCall);
|
|
|
|
|
connect(stationIdleQueryAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 STATUS?").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto heardQueryAction = menu->addAction(
|
|
|
|
|
QString("%1 HEARING? - What are the stations are you hearing? (Top 4 "
|
|
|
|
|
"ranked by most recently heard)")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
heardQueryAction->setDisabled(isAllCall);
|
|
|
|
|
connect(heardQueryAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 HEARING?").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
auto retransmitAction = menu->addAction(QString("%1|[MESSAGE] - Please ACK and retransmit the following message").arg(call).trimmed());
|
|
|
|
|
retransmitAction->setDisabled(isAllCall);
|
|
|
|
|
connect(retransmitAction, &QAction::triggered, this, [this](){
|
|
|
|
|
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if(selectedCall.isEmpty()){
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1|[MESSAGE]").arg(selectedCall), true, true);
|
|
|
|
|
});
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
auto alertAction = menu->addAction(
|
|
|
|
|
QString("%1>[MESSAGE] - Please relay this message to its destination")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
alertAction->setDisabled(isAllCall);
|
|
|
|
|
connect(alertAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1>[MESSAGE]").arg(selectedCall), true, true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto msgAction = menu->addAction(
|
|
|
|
|
QString("%1 MSG [MESSAGE] - Please store this message in your inbox")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
msgAction->setDisabled(isAllCall);
|
|
|
|
|
connect(msgAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 MSG [MESSAGE]").arg(selectedCall), true,
|
|
|
|
|
true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto msgToAction = menu->addAction(
|
|
|
|
|
QString("%1 MSG TO:[CALLSIGN] [MESSAGE] - Please store this message at "
|
|
|
|
|
"your station for later retreival by [CALLSIGN]")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
msgToAction->setDisabled(isAllCall);
|
|
|
|
|
connect(msgToAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(
|
|
|
|
|
QString("%1 MSG TO:[CALLSIGN] [MESSAGE]").arg(selectedCall), true,
|
|
|
|
|
true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto qsoQueryAction = menu->addAction(
|
|
|
|
|
QString("%1 QUERY CALL [CALLSIGN]? - Please acknowledge you can "
|
|
|
|
|
"communicate directly with [CALLSIGN]")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
connect(qsoQueryAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 QUERY CALL [CALLSIGN]?").arg(selectedCall),
|
|
|
|
|
true, true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto qsoQueryMsgsAction = menu->addAction(
|
|
|
|
|
QString("%1 QUERY MSGS - Do you have any messages for me?")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
connect(qsoQueryMsgsAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 QUERY MSGS").arg(selectedCall), true, true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto qsoQueryMsgAction =
|
|
|
|
|
menu->addAction(QString("%1 QUERY MSG [ID] - Please deliver the "
|
|
|
|
|
"complete message identified by ID")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
connect(qsoQueryMsgAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 QUERY MSG [ID]").arg(selectedCall), true,
|
|
|
|
|
true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
menu->addSeparator();
|
|
|
|
|
|
|
|
|
|
auto agnAction = menu->addAction(
|
|
|
|
|
QString("%1 AGN? - Please repeat your last transmission")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
connect(agnAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 AGN?").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto qslQueryAction = menu->addAction(
|
|
|
|
|
QString("%1 QSL? - Did you receive my last transmission?")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
connect(qslQueryAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 QSL?").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto qslAction = menu->addAction(
|
|
|
|
|
QString("%1 QSL - I confirm I received your last transmission")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
connect(qslAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 QSL").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto yesAction = menu->addAction(
|
|
|
|
|
QString("%1 YES - I confirm your last inquiry").arg(call).trimmed());
|
|
|
|
|
connect(yesAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 YES").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto noAction =
|
|
|
|
|
menu->addAction(QString("%1 NO - I do not confirm your last inquiry")
|
|
|
|
|
.arg(call)
|
|
|
|
|
.trimmed());
|
|
|
|
|
connect(noAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 NO").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto hwAction = menu->addAction(
|
|
|
|
|
QString("%1 HW CPY? - How do you copy?").arg(call).trimmed());
|
|
|
|
|
connect(hwAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 HW CPY?").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto rrAction = menu->addAction(
|
|
|
|
|
QString("%1 RR - Roger. Received. I copy.").arg(call).trimmed());
|
|
|
|
|
connect(rrAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 RR").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto fbAction =
|
|
|
|
|
menu->addAction(QString("%1 FB - Fine Business").arg(call).trimmed());
|
|
|
|
|
connect(fbAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 FB").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto sevenThreeAction = menu->addAction(
|
|
|
|
|
QString("%1 73 - I send my best regards").arg(call).trimmed());
|
|
|
|
|
connect(sevenThreeAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 73").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto skAction =
|
|
|
|
|
menu->addAction(QString("%1 SK - End of contact").arg(call).trimmed());
|
|
|
|
|
connect(skAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 SK").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto ditDitAction = menu->addAction(
|
|
|
|
|
QString("%1 DIT DIT - End of contact / Two bits").arg(call).trimmed());
|
|
|
|
|
connect(ditDitAction, &QAction::triggered, this, [this]() {
|
|
|
|
|
QString selectedCall = callsignSelected();
|
|
|
|
|
if (selectedCall.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addMessageText(QString("%1 DIT DIT").arg(selectedCall), true);
|
|
|
|
|
|
|
|
|
|
if (m_config.transmit_directed())
|
|
|
|
|
toggleTx(true);
|
|
|
|
|
});
|
|
|
|
|
}
|