182 lines
6.4 KiB
C++
182 lines
6.4 KiB
C++
#include "messagewindow.h"
|
|
#include "ui_messagewindow.h"
|
|
#include "moc_messagewindow.cpp"
|
|
|
|
#include <QDateTime>
|
|
#include <QMenu>
|
|
|
|
#include "Radio.hpp"
|
|
#include "keyeater.h"
|
|
|
|
template<typename T>
|
|
QList<T> listCopyReverse(QList<T> const &list){
|
|
QList<T> newList = QList<T>();
|
|
auto iter = list.end();
|
|
while(iter != list.begin()){
|
|
newList.append(*(--iter));
|
|
}
|
|
return newList;
|
|
}
|
|
|
|
MessageWindow::MessageWindow(QWidget *parent) :
|
|
QDialog(parent),
|
|
ui(new Ui::MessageWindow)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
// connect selection model changed
|
|
connect(ui->messageTableWidget->selectionModel(), &QItemSelectionModel::selectionChanged, this, &MessageWindow::on_messageTableWidget_selectionChanged);
|
|
|
|
// reply when key pressed in the reply box
|
|
auto eke = new EnterKeyPressEater();
|
|
connect(eke, &EnterKeyPressEater::enterKeyPressed, this, [this](QObject *, QKeyEvent * e, bool *pProcessed){
|
|
if(e->modifiers() & Qt::ShiftModifier){
|
|
if(pProcessed) *pProcessed = false;
|
|
return;
|
|
}
|
|
|
|
if(pProcessed) *pProcessed = true;
|
|
ui->replyPushButton->click();
|
|
});
|
|
ui->replytextEdit->installEventFilter(eke);
|
|
|
|
ui->messageTableWidget->horizontalHeader()->setVisible(true);
|
|
ui->messageTableWidget->resizeColumnsToContents();
|
|
|
|
ui->messageTableWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
|
|
auto deleteAction = new QAction("Delete", ui->messageTableWidget);
|
|
connect(deleteAction, &QAction::triggered, this, [this](){
|
|
auto items = ui->messageTableWidget->selectedItems();
|
|
if(items.isEmpty()){
|
|
return;
|
|
}
|
|
auto item = items.first();
|
|
auto col = ui->messageTableWidget->item(item->row(), 1);
|
|
if(!col){
|
|
return;
|
|
}
|
|
bool ok = false;
|
|
auto mid = col->data(Qt::UserRole).toInt(&ok);
|
|
if(!ok){
|
|
return;
|
|
}
|
|
|
|
ui->messageTableWidget->removeRow(item->row());
|
|
|
|
emit this->deleteMessage(mid);
|
|
});
|
|
ui->messageTableWidget->addAction(deleteAction);
|
|
}
|
|
|
|
MessageWindow::~MessageWindow()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void MessageWindow::setCall(const QString &call){
|
|
setWindowTitle(QString("Messages: %1").arg(call == "%" ? "All" : call));
|
|
}
|
|
|
|
void MessageWindow::populateMessages(QList<QPair<int, Message> > msgs){
|
|
for(int i = ui->messageTableWidget->rowCount(); i >= 0; i--){
|
|
ui->messageTableWidget->removeRow(i);
|
|
}
|
|
|
|
ui->messageTableWidget->setUpdatesEnabled(false);
|
|
{
|
|
foreach(auto pair, msgs){
|
|
auto mid = pair.first;
|
|
auto msg = pair.second;
|
|
auto params = msg.params();
|
|
|
|
int row = ui->messageTableWidget->rowCount();
|
|
ui->messageTableWidget->insertRow(row);
|
|
|
|
int col = 0;
|
|
|
|
auto typeItem = new QTableWidgetItem(msg.type() == "UNREAD" ? "\u2691" : "");
|
|
typeItem->setData(Qt::UserRole, msg.type());
|
|
typeItem->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
|
ui->messageTableWidget->setItem(row, col++, typeItem);
|
|
|
|
auto midItem = new QTableWidgetItem(QString::number(mid));
|
|
midItem->setData(Qt::UserRole, mid);
|
|
midItem->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
|
ui->messageTableWidget->setItem(row, col++, midItem);
|
|
|
|
auto date = params.value("UTC").toString();
|
|
auto timestamp = QDateTime::fromString(date, "yyyy-MM-dd hh:mm:ss");
|
|
auto dateItem = new QTableWidgetItem(timestamp.toString());
|
|
dateItem->setData(Qt::UserRole, timestamp);
|
|
dateItem->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
|
ui->messageTableWidget->setItem(row, col++, dateItem);
|
|
|
|
auto dial = (quint64)params.value("DIAL").toInt();
|
|
auto dialItem = new QTableWidgetItem(QString("%1 MHz").arg(Radio::pretty_frequency_MHz_string(dial)));
|
|
dialItem->setData(Qt::UserRole, dial);
|
|
dialItem->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
|
ui->messageTableWidget->setItem(row, col++, dialItem);
|
|
|
|
auto path = params.value("PATH").toString();
|
|
auto segs = listCopyReverse(path.split(">"));
|
|
auto fromItem = new QTableWidgetItem(segs.join(" via "));
|
|
fromItem->setData(Qt::UserRole, path);
|
|
fromItem->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
|
ui->messageTableWidget->setItem(row, col++, fromItem);
|
|
|
|
auto to = params.value("TO").toString();
|
|
auto toItem = new QTableWidgetItem(to);
|
|
toItem->setData(Qt::UserRole, to);
|
|
toItem->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
|
ui->messageTableWidget->setItem(row, col++, toItem);
|
|
|
|
auto text = params.value("TEXT").toString();
|
|
auto textItem = new QTableWidgetItem(text);
|
|
textItem->setData(Qt::UserRole, text);
|
|
textItem->setTextAlignment(Qt::AlignVCenter);
|
|
ui->messageTableWidget->setItem(row, col++, textItem);
|
|
}
|
|
|
|
ui->messageTableWidget->resizeColumnToContents(0);
|
|
ui->messageTableWidget->resizeColumnToContents(1);
|
|
ui->messageTableWidget->resizeColumnToContents(2);
|
|
ui->messageTableWidget->resizeColumnToContents(3);
|
|
ui->messageTableWidget->resizeColumnToContents(4);
|
|
ui->messageTableWidget->resizeColumnToContents(5);
|
|
}
|
|
ui->messageTableWidget->setUpdatesEnabled(true);
|
|
|
|
if(ui->messageTableWidget->rowCount() > 0){
|
|
ui->messageTableWidget->selectRow(0);
|
|
}
|
|
}
|
|
|
|
QString MessageWindow::prepareReplyMessage(QString path, QString text){
|
|
return QString("%1 MSG %2").arg(path).arg(text);
|
|
}
|
|
|
|
void MessageWindow::on_messageTableWidget_selectionChanged(const QItemSelection &/*selected*/, const QItemSelection &/*deselected*/){
|
|
auto row = ui->messageTableWidget->currentRow();
|
|
auto item = ui->messageTableWidget->item(row, ui->messageTableWidget->columnCount()-1);
|
|
if(!item){
|
|
return;
|
|
}
|
|
|
|
auto text = item->data(Qt::UserRole).toString();
|
|
ui->messageTextEdit->setPlainText(text);
|
|
}
|
|
|
|
void MessageWindow::on_replyPushButton_clicked(){
|
|
auto row = ui->messageTableWidget->currentRow();
|
|
auto item = ui->messageTableWidget->item(row, ui->messageTableWidget->columnCount()-2);
|
|
if(!item){
|
|
return;
|
|
}
|
|
|
|
auto path = item->data(Qt::UserRole).toString();
|
|
auto text = "[MESSAGE]"; // ui->replytextEdit->toPlainText();
|
|
auto message = prepareReplyMessage(path, text);
|
|
|
|
emit replyMessage(message);
|
|
}
|