diff --git a/src/chatmodel.cpp b/src/chatmodel.cpp index c6dd75d..7ca3090 100644 --- a/src/chatmodel.cpp +++ b/src/chatmodel.cpp @@ -10,6 +10,7 @@ #include #include #include +#include using namespace std; using namespace boost; @@ -80,11 +81,11 @@ void ChatModel::showMessages() { for(auto &c : this->chatItems) { - qDebug() << "[" << c.second.getTimestamp() << "] " << "<" << c.second.getAddress() << "> :" << c.second.getMemo(); + qDebug() << c.second.toChatLine(); } } -void ChatModel::renderChatBox(Ui::MainWindow* ui, QListWidget &view) +void ChatModel::renderChatBox(Ui::MainWindow* ui, QListView &view) { /*for(auto &c : this->chatItems) { @@ -94,66 +95,68 @@ void ChatModel::renderChatBox(Ui::MainWindow* ui, QListWidget &view) //todo render items to view } -void ChatModel::renderChatBox(Ui::MainWindow* ui, QListWidget *view) +void ChatModel::renderChatBox(Ui::MainWindow* ui, QListView *view) { - - while(view->count() > 0) + // QStandardItemModel mymodel; + // QStandardItem* Items = new QStandardItem(myString); + QStandardItemModel* myModel = new QStandardItemModel(); + for(auto &c : this->chatItems) { - view->takeItem(0); - } - - QString line = ""; - - for(auto &c : this->chatItems){ - - QDateTime myDateTime; - - myDateTime.setTime_t(c.second.getTimestamp()); - //////Render only Memos for selected contacts. Do not render empty Memos //// Render only memos where cid=cid /// - if ((ui->ContactZaddr->text().trimmed() == c.second.getAddress()) && (c.second.getMemo().startsWith("{") == false) && (c.second.getMemo().isEmpty() == false)) { - // if (c.second.getMemo.find()) - line += QString("[") + myDateTime.toString("dd.MM.yyyy hh:mm:ss ") + QString("] "); - line += QString("<") + QString("Outgoing") + QString("> :\n"); - line += QString(c.second.getMemo()) + QString("\n"); - view->addItem(line); - line =""; + if ( + (ui->ContactZaddr->text().trimmed() == c.second.getAddress()) && + (c.second.getMemo().startsWith("{") == false) && + (c.second.getMemo().isEmpty() == false) + ) + { + + QStandardItem* Items = new QStandardItem(c.second.toChatLine()); + Items->setData("Incoming", Qt::UserRole +1); + myModel->appendRow(Items); + qDebug()<text(); + ui->listChat->setModel(myModel); + ui->listChat->setMinimumSize(200,350); + ui->listChat->setItemDelegate(new ListViewDelegate()); + ui->listChat->show(); + } - ////////////////////////////////// Todo : Render green checkmark for contacts if cid = cid - We have to search for cid in txid/cid list - // QString cid = c.second.getCid(); - } - - if ((ui->MyZaddr->text().trimmed() == c.second.getAddress()) && (c.second.getMemo().startsWith("{") == false) && (c.second.getMemo().isEmpty() == false)){ - for(auto &p : AddressBook::getInstance()->getAllAddressLabels()){ - - if ((ui->checkBox->isChecked() == true) && (p.getCid() != c.second.getCid())) - { + if ( + (ui->MyZaddr->text().trimmed() == c.second.getAddress()) && + (c.second.getMemo().startsWith("{") == false) && + (c.second.getMemo().isEmpty() == false) + ) + { - }else{ - - // line+= QString("[") + "Warning. Not verified!" + QString("]"); - + QStandardItem* Items1 = new QStandardItem(c.second.toChatLine()); + Items1->setData("Outgoing", Qt::UserRole +1); + myModel->appendRow(Items1); + qDebug()<text(); + } + ui->listChat->setModel(myModel); + ui->listChat->setMinimumSize(200,350); + ui->listChat->setItemDelegate(new ListViewDelegate()); + ui->listChat->show(); + } - line += QString("[") + myDateTime.toString("dd.MM.yyyy hh:mm:ss ") + QString("] "); - line += QString("<") + QString("incoming") + QString("> :\n"); - line += QString(c.second.getMemo()) + QString("\n"); - view->addItem(line); - line =""; - } + + /////////////////////////Render only when CID=CID? + + // for(auto &p : AddressBook::getInstance()->getAllAddressLabels()) + // { + + // if ((ui->checkBox->isChecked() == true) && (p.getCid() != c.second.getCid())) + // { - } + //} + // - } - - } - } @@ -247,6 +250,9 @@ Tx MainWindow::createTxFromChatPage() { } void MainWindow::sendChatButton() { + + + ////////////////////////////Todo: Check if a Contact is selected////////// // Create a Tx from the values on the send tab. Note that this Tx object @@ -420,6 +426,9 @@ Tx MainWindow::createTxForSafeContactRequest() { //////////////////De-activated for now/////////////////// void MainWindow::safeContactRequest() { + + + ////////////////////////////Todo: Check if its a zaddr////////// // Create a Tx from the values on the send tab. Note that this Tx object diff --git a/src/chatmodel.h b/src/chatmodel.h index fcc68bf..a060530 100644 --- a/src/chatmodel.h +++ b/src/chatmodel.h @@ -1,15 +1,161 @@ #ifndef CHATMODEL_H #define CHATMODEL_H #include +#include +#include +#include #include #include -#include +#include #include "precompiled.h" #include "mainwindow.h" #include "controller.h" #include "settings.h" #include "camount.h" +class ListViewDelegate : public QAbstractItemDelegate +{ + int d_radius; + int d_toppadding; + int d_bottompadding; + int d_leftpadding; + int d_rightpadding; + int d_verticalmargin; + int d_horizontalmargin; + int d_pointerwidth; + int d_pointerheight; + float d_widthfraction; + public: + inline ListViewDelegate(QObject *parent = nullptr); + + protected: + inline void paint(QPainter *painter, QStyleOptionViewItem const &option, QModelIndex const &index) const; + inline QSize sizeHint(QStyleOptionViewItem const &option, QModelIndex const &index) const; +}; + +inline ListViewDelegate::ListViewDelegate(QObject *parent): QAbstractItemDelegate(parent), d_radius(5), d_toppadding(5), d_bottompadding(3), d_leftpadding(5), d_rightpadding(5), d_verticalmargin(15), d_horizontalmargin(10), d_pointerwidth(10), d_pointerheight(17), d_widthfraction(.7) +{ + +} + +inline void ListViewDelegate::paint(QPainter *painter, QStyleOptionViewItem const &option, QModelIndex const &index) const +{ + QTextDocument bodydoc; + QTextOption textOption(bodydoc.defaultTextOption()); + textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); + bodydoc.setDefaultTextOption(textOption); + bodydoc.setDefaultFont(QFont("Roboto", 12)); + QString bodytext(index.data(Qt::DisplayRole).toString()); + bodydoc.setHtml(bodytext); + qreal contentswidth = option.rect.width() * d_widthfraction - d_horizontalmargin - d_pointerwidth - d_leftpadding - d_rightpadding; + bodydoc.setTextWidth(contentswidth); + qreal bodyheight = bodydoc.size().height(); + bool outgoing = index.data(Qt::UserRole + 1).toString() == "Outgoing"; + painter->save(); + painter->setRenderHint(QPainter::Antialiasing); + + // uncomment to see the area provided to paint this item + + //painter->drawRect(option.rect); + + painter->translate(option.rect.left() + d_horizontalmargin, option.rect.top() + ((index.row() == 0) ? d_verticalmargin : 0)); + + // background color for chat bubble + QColor bgcolor("fbffff"); + if (outgoing) + bgcolor = "#fffcfb"; + + // create chat bubble + QPainterPath pointie; + + // left bottom + pointie.moveTo(0, bodyheight + d_toppadding + d_bottompadding); + + // right bottom + pointie.lineTo(0 + contentswidth + d_pointerwidth + d_leftpadding + d_rightpadding - d_radius, + bodyheight + d_toppadding + d_bottompadding); + pointie.arcTo(0 + contentswidth + d_pointerwidth + d_leftpadding + d_rightpadding - 2 * d_radius, + bodyheight + d_toppadding + d_bottompadding - 2 * d_radius, + 2 * d_radius, 2 * d_radius, 270, 90); + + // right top + pointie.lineTo(0 + contentswidth + d_pointerwidth + d_leftpadding + d_rightpadding, 0 + d_radius); + pointie.arcTo(0 + contentswidth + d_pointerwidth + d_leftpadding + d_rightpadding - 2 * d_radius, 0, + 2 * d_radius, 2 * d_radius, 0, 90); + + // left top + pointie.lineTo(0 + d_pointerwidth + d_radius, 0); + pointie.arcTo(0 + d_pointerwidth, 0, 2 * d_radius, 2 * d_radius, 90, 90); + + // left bottom almost (here is the pointie) + pointie.lineTo(0 + d_pointerwidth, bodyheight + d_toppadding + d_bottompadding - d_pointerheight); + pointie.closeSubpath(); + + // rotate bubble for outgoing messages + if (outgoing) + { + painter->translate(option.rect.width() - pointie.boundingRect().width() - d_horizontalmargin - d_pointerwidth, 0); + painter->translate(pointie.boundingRect().center()); + painter->rotate(180); + painter->translate(-pointie.boundingRect().center()); + } + + // now paint it! + painter->setPen(QPen(bgcolor)); + painter->drawPath(pointie); + painter->fillPath(pointie, QBrush(bgcolor)); + + // rotate back or painter is going to paint the text rotated... + if (outgoing) + { + painter->translate(pointie.boundingRect().center()); + painter->rotate(-180); + painter->translate(-pointie.boundingRect().center()); + } + + // set text color used to draw message body + QAbstractTextDocumentLayout::PaintContext ctx; + if (outgoing) + ctx.palette.setColor(QPalette::Text, QColor("black")); + else + ctx.palette.setColor(QPalette::Text, QColor("white")); + + // draw body text + painter->translate((outgoing ? 0 : d_pointerwidth) + d_leftpadding, 0); + bodydoc.documentLayout()->draw(painter, ctx); + + painter->restore(); +} + +inline QSize ListViewDelegate::sizeHint(QStyleOptionViewItem const &option, QModelIndex const &index) const +{ + QTextDocument bodydoc; + QTextOption textOption(bodydoc.defaultTextOption()); + textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); + bodydoc.setDefaultTextOption(textOption); + bodydoc.setDefaultFont(QFont("Roboto", 12)); + QString bodytext(index.data(Qt::DisplayRole).toString()); + bodydoc.setHtml(bodytext); + + // the width of the contents are the (a fraction of the window width) minus (margins + padding + width of the bubble's tail) + qreal contentswidth = option.rect.width() * d_widthfraction - d_horizontalmargin - d_pointerwidth - d_leftpadding - d_rightpadding; + + // set this available width on the text document + bodydoc.setTextWidth(contentswidth); + + QSize size(bodydoc.idealWidth() + d_horizontalmargin + d_pointerwidth + d_leftpadding + d_rightpadding, + bodydoc.size().height() + d_bottompadding + d_toppadding + d_verticalmargin + 1); // I dont remember why +1, haha, might not be necessary + + if (index.row() == 0) // have extra margin at top of first item + size += QSize(0, d_verticalmargin); + + return size; +} + + + + + class ChatItem { private: @@ -117,6 +263,15 @@ class ChatItem _outgoing = true; } + QString toChatLine() + { + QDateTime myDateTime; + myDateTime.setTime_t(_timestamp); + QString line = QString("[") + myDateTime.toString("dd.MM.yyyy hh:mm:ss ") + QString("] "); + line += QString(_memo) + QString("\n"); + return line; + } + ~ChatItem() { /*delete timestamp; @@ -145,8 +300,8 @@ class ChatModel void setItems(std::map items); QString zaddr(); void setItems(std::vector items); - void renderChatBox(Ui::MainWindow* ui, QListWidget &view); - void renderChatBox(Ui::MainWindow* ui, QListWidget *view); + void renderChatBox(Ui::MainWindow* ui, QListView &view); + void renderChatBox(Ui::MainWindow* ui, QListView *view); void showMessages(); void clear(); void addMessage(ChatItem item); diff --git a/src/controller.cpp b/src/controller.cpp index 2fe9b52..50db859 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -893,8 +893,8 @@ void Controller::refreshTransactions() { QString(""), memo, cid, // we have to set the cid here, its included in our Addressbook for this contact - txid - // true // is an outgoing message + txid, + true // is an outgoing message ); chatModel->addMessage(item); } @@ -964,7 +964,8 @@ void Controller::refreshTransactions() { QString(""), memo, cid, // we have to set the cid here, its included in the headermemo - txid + txid, + false ); // qDebug()<< "Message CID: " << cid; chatModel->addMessage(item); @@ -990,7 +991,7 @@ void Controller::refreshTransactions() { // Update model data, which updates the table view transactionsTableModel->replaceData(txdata); - chatModel->renderChatBox(ui, ui->listChatMemo); + chatModel->renderChatBox(ui, ui->listChat); refreshContacts( ui->listContactWidget @@ -998,7 +999,7 @@ void Controller::refreshTransactions() { }); } -void Controller::refreshChat(QListWidget *listWidget) +void Controller::refreshChat(QListView *listWidget) { chatModel->renderChatBox(ui, listWidget); diff --git a/src/controller.h b/src/controller.h index 4a0835f..59cfa40 100644 --- a/src/controller.h +++ b/src/controller.h @@ -72,7 +72,7 @@ public: void refreshGBPCAP(); void refreshAUDCAP(); - void refreshChat(QListWidget *listWidget); + void refreshChat(QListView *listWidget); void refreshContacts(QListWidget *listWidget); void executeStandardUITransaction(Tx tx); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index f17bfc9..254798f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -993,6 +993,92 @@ void MainWindow::setupchatTab() { ///////// Set selected Zaddr for Chat with Doubleklick QObject::connect(ui->listContactWidget, &QTableView::clicked, [=] () { + + QStandardItemModel mymodel; + + // for(auto &c : this->chatItems) + //{ + //////Render only Memos for selected contacts. Do not render empty Memos //// Render only memos where cid=cid + + /// + // if ( + // (ui->ContactZaddr->text().trimmed() == c.second.getAddress()) && + // (c.second.getMemo().startsWith("{") == false) && + // (c.second.getMemo().isEmpty() == false) + // ) + // { + // if (c.second.getMemo.find()) + + //view->addItem(line); + + // QStandardItem *item1 = new QStandardItem(c.second.toChatLine()); + // item1->setData("Incoming", Qt::UserRole + 1); + // model.appendRow(item1); + + QStandardItem *item1 = new QStandardItem("Kacke Hier"); + item1->setData("Incoming", Qt::UserRole +1); + mymodel.appendRow(item1); + qDebug()<text(); + + + QStandardItem *item2 = new QStandardItem("This is item one"); + item2->setData("Outgoing", Qt::UserRole +1); + mymodel.appendRow(item2); + qDebug()<text(); + + QStandardItem *item3 = new QStandardItem("This is item one"); + item3->setData("Outgoing", Qt::UserRole +1); + mymodel.appendRow(item3); + qDebug()<text(); + + // QStandardItem *item2 = new QStandardItem("Hallo"); + // item1->setData("Outgoing", Qt::UserRole + 1); + // mymodel.appendRow(item2); + // qDebug()<text(); + + ////////////////////////////////// Todo : Render green checkmark for contacts if cid = cid - We have to search for cid in txid/cid list + // QString cid = c.second.getCid(); + + // } + + // if ( + // (ui->MyZaddr->text().trimmed() == c.second.getAddress()) && + // (c.second.getMemo().startsWith("{") == false) && + // (c.second.getMemo().isEmpty() == false) + // ) + // { + + + // for(auto &p : AddressBook::getInstance()->getAllAddressLabels()) + // { + + // if ((ui->checkBox->isChecked() == true) && (p.getCid() != c.second.getCid())) + // { + + + //} + // else + // { + // line+= QString("[") + "Warning. Not verified!" + QString("]"); + // QStandardItem *item = new QStandardItem(c.second.toChatLine()); + //view->addItem(line); + // model.appendRow(item); + // } + +// } + + //} + + // } + + + + + ui->listChat->setModel(&mymodel); + ui->listChat->setItemDelegate(new ListViewDelegate()); + ui->listChat->show(); + //ui->listChat->update(); + QModelIndex index = ui->listContactWidget->currentIndex(); QString label_contact = index.data(Qt::DisplayRole).toString(); @@ -1005,8 +1091,12 @@ void MainWindow::setupchatTab() { ui->contactCid->setText(p.getCid()); rpc->refresh(true); + updateChat(); } }); + + + } ChatMemoEdit::ChatMemoEdit(QWidget* parent) : QPlainTextEdit(parent) { @@ -1052,12 +1142,13 @@ void ChatMemoEdit::setSendChatButton(QPushButton* button) { void MainWindow::updateChat() { - rpc->refreshChat(ui->listChatMemo); + rpc->refreshChat(ui->listChat); + rpc->refresh(true); + } void MainWindow::updateContacts() { - qDebug() << "Called MainWindow::updateContacts()"; rpc->refreshContacts(ui->listContactWidget); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 7114eda..1110f67 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -54,6 +54,7 @@ public: bool isWebsocketListening(); void createWebsocket(QString wormholecode); void stopWebsocket(); + void balancesReady(); void payhushURI(QString uri = "", QString myAddr = ""); @@ -92,8 +93,9 @@ private: void setupBalancesTab(); void setuphushdTab(); void setupchatTab(); - void updateChat(); + void updateContacts(); + void updateChat(); void setupSettingsModal(); void setupStatusBar(); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 3196dff..fb02214 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1390,31 +1390,6 @@ <html><head/><body><p align="center"><br/></p></body></html> - - - true - - - - 340 - 40 - 921 - 371 - - - - QAbstractItemView::NoEditTriggers - - - false - - - Qt::IgnoreAction - - - QAbstractItemView::NoSelection - - @@ -1563,6 +1538,40 @@ <html><head/><body><p align="center">Contact Name:</p></body></html> + + + + 340 + 40 + 921 + 371 + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + QAbstractScrollArea::AdjustToContents + + + QAbstractItemView::NoEditTriggers + + + QListView::Adjust + + + 0 + + + false + + + true + +