diff --git a/silentdragon-lite.pro b/silentdragon-lite.pro index c09eea7..5c7dd21 100644 --- a/silentdragon-lite.pro +++ b/silentdragon-lite.pro @@ -74,7 +74,11 @@ SOURCES += \ src/contactmodel.cpp \ src/DataStore/DataStore.cpp \ src/DataStore/ChatDataStore.cpp \ - src/DataStore/SietchDataStore.cpp + src/DataStore/SietchDataStore.cpp \ + src/Model/ChatItem.cpp \ + src/Model/ContactRequestChatItem.cpp \ + src/Model/ContactItem.cpp \ + src/Chat/Helper/ChatIDGenerator.cpp HEADERS += \ src/firsttimewizard.h \ diff --git a/src/Chat/Chat.h b/src/Chat/Chat.h new file mode 100644 index 0000000..969f98c --- /dev/null +++ b/src/Chat/Chat.h @@ -0,0 +1,40 @@ +#ifndef CHAT_H +#define CHAT_H + +class Chat // Chat Controller +{ + private: + std::map chatItems; + QTableView* parent; + Ui::MainWindow* ui; + MainWindow* main; + std::map cidMap; + std::map requestZaddrMap; + public: + ChatModel() {}; + ChatModel(std::map chatItems); + ChatModel(std::vector chatItems); + QString generateChatItemID(ChatItem item); // helper + std::map getItems(); + void setItems(std::map items); + QString zaddr(); + void setItems(std::vector items); + void renderChatBox(Ui::MainWindow* ui, QListView &view); // action + void renderChatBox(Ui::MainWindow* ui, QListView *view); // action + // void renderContactRequest(); + void triggerRequest(); + void showMessages(); + void clear(); + //void renderContactRequest(Ui::MainWindow* ui, QListView *view); + void addMessage(ChatItem item); + void addMessage(QString timestamp, ChatItem item); + void addCid(QString tx, QString cid); + void addrequestZaddr(QString tx, QString requestZaddr); + QString getCidByTx(QString tx); + QString getrequestZaddrByTx(QString tx); + void killCidCache(); + void killrequestZaddrCache(); + +}; + +#endif \ No newline at end of file diff --git a/src/Chat/Helper/ChatDelegator.h b/src/Chat/Helper/ChatDelegator.h new file mode 100644 index 0000000..ef6a150 --- /dev/null +++ b/src/Chat/Helper/ChatDelegator.h @@ -0,0 +1,148 @@ +#ifndef CHATDELEGATOR_H +#define CHATDELEGATOR_H + +#include +#include +#include +#include + +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("#535353"); + if (outgoing) + bgcolor = "#eeeeee"; + + // 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; +} + +#endif \ No newline at end of file diff --git a/src/Chat/Helper/ChatIDGenerator.cpp b/src/Chat/Helper/ChatIDGenerator.cpp new file mode 100644 index 0000000..2acea1b --- /dev/null +++ b/src/Chat/Helper/ChatIDGenerator.cpp @@ -0,0 +1,28 @@ +#include "ChatIDGenerator.h" + +ChatIDGenerator* ChatIDGenerator::getInstance() +{ + if(ChatIDGenerator::instance == nullptr) + ChatIDGenerator::instance = new ChatIDGenerator(); + + return ChatIDGenerator::instance; +} + +QString ChatIDGenerator::generateID(ChatItem item) +{ + QString key = QString::number(item.getTimestamp()) + QString("-"); + key += QString( + QCryptographicHash::hash( + QString( + QString::number(item.getTimestamp()) + + item.getAddress() + + item.getContact() + + item.getMemo() + ).toUtf8(), + QCryptographicHash::Md5 + ).toHex() + ); + return key; +} + +ChatIDGenerator* ChatIDGenerator::instance = nullptr; \ No newline at end of file diff --git a/src/Chat/Helper/ChatIDGenerator.h b/src/Chat/Helper/ChatIDGenerator.h new file mode 100644 index 0000000..d9f6e4a --- /dev/null +++ b/src/Chat/Helper/ChatIDGenerator.h @@ -0,0 +1,18 @@ +#ifndef CHATIDGENERATOR_H +#define CHATIDGENERATOR_H + +#include +#include +#include "../../Model/ChatItem.h" + +class ChatIDGenerator +{ + private: + static ChatIDGenerator* instance; + + public: + static ChatIDGenerator* getInstance(); + QString generateID(ChatItem item); +}; + +#endif \ No newline at end of file diff --git a/src/Model/ChatItem.cpp b/src/Model/ChatItem.cpp new file mode 100644 index 0000000..39d4a68 --- /dev/null +++ b/src/Model/ChatItem.cpp @@ -0,0 +1,135 @@ +#include "ChatItem.h" + +ChatItem::ChatItem() {} + +ChatItem::ChatItem(long timestamp, QString address, QString contact, QString memo, QString requestZaddr, QString type, QString cid, QString txid) +{ + _timestamp = timestamp; + _address = address; + _contact = contact; + _memo = memo; + _requestZaddr = requestZaddr; + _type = type; + _cid = cid; + _txid = txid; + _outgoing = false; +} + +ChatItem::ChatItem(long timestamp, QString address, QString contact, QString memo, QString requestZaddr, QString type, QString cid, QString txid, bool outgoing) +{ + _timestamp = timestamp; + _address = address; + _contact = contact; + _memo = memo; + _requestZaddr = requestZaddr; + _type = type; + _cid = cid; + _txid = txid; + _outgoing = outgoing; +} + +long ChatItem::getTimestamp() +{ + return _timestamp; +} + +QString ChatItem::getAddress() +{ + return _address; +} + +QString ChatItem::getContact() +{ + return _contact; +} + +QString ChatItem::getMemo() +{ + return _memo; +} + +QString ChatItem::getRequestZaddr() +{ + return _requestZaddr; +} +QString ChatItem::getType() +{ + return _type; +} + +QString ChatItem::getCid() +{ + return _cid; +} + +QString ChatItem::getTxid() +{ + return _txid; +} + +bool ChatItem::isOutgoing() +{ + return _outgoing; +} + +void ChatItem::setTimestamp(long timestamp) +{ + _timestamp = timestamp; +} + +void ChatItem::setAddress(QString address) +{ + _address = address; +} + +void ChatItem::setContact(QString contact) +{ + _contact = contact; +} + +void ChatItem::setMemo(QString memo) +{ + _memo = memo; +} + +void ChatItem::setRequestZaddr(QString requestZaddr) +{ + _requestZaddr = requestZaddr; +} + +void ChatItem::setType(QString type) +{ + _type = type; +} + +void ChatItem::setCid(QString cid) +{ + _cid = cid; +} +void ChatItem::setTxid(QString txid) +{ + _txid = txid; +} + +void ChatItem::toggleOutgo() +{ + _outgoing = true; +} + +QString ChatItem::toChatLine() +{ + QDateTime myDateTime; + myDateTime.setTime_t(_timestamp); + QString line = QString("[") + myDateTime.toString("d.M.yy hh:mm") + QString("] "); + line += QString("") + QString(_memo) + QString("\n\n"); + return line; +} + +ChatItem::~ChatItem() +{ + /*delete timestamp; + delete address; + delete contact; + delete memo; + delete outgoing;*/ +} \ No newline at end of file diff --git a/src/Model/ChatItem.h b/src/Model/ChatItem.h new file mode 100644 index 0000000..467341f --- /dev/null +++ b/src/Model/ChatItem.h @@ -0,0 +1,45 @@ +#ifndef CHATITEM_H +#define CHATITEM_H + +#include + +class ChatItem +{ + private: + long _timestamp; + QString _address; + QString _contact; + QString _memo; + QString _requestZaddr; + QString _type; + QString _cid; + QString _txid; + bool _outgoing = false; + + public: + ChatItem(); + ChatItem(long timestamp, QString address, QString contact, QString memo,QString requestZaddr, QString type, QString cid, QString txid); + ChatItem(long timestamp, QString address, QString contact, QString memo, QString requestZaddr, QString type, QString cid, QString txid, bool outgoing); + long getTimestamp(); + QString getAddress(); + QString getContact(); + QString getMemo(); + QString getRequestZaddr(); + QString getType(); + QString getCid(); + QString getTxid(); + bool isOutgoing(); + void setTimestamp(long timestamp); + void setAddress(QString address); + void setContact(QString contact); + void setMemo(QString memo); + void setRequestZaddr(QString requestZaddr); + void setType(QString type); + void setCid(QString cid); + void setTxid(QString txid); + void toggleOutgo(); + QString toChatLine(); + ~ChatItem(); +}; + +#endif \ No newline at end of file diff --git a/src/Model/ContactItem.cpp b/src/Model/ContactItem.cpp new file mode 100644 index 0000000..f338552 --- /dev/null +++ b/src/Model/ContactItem.cpp @@ -0,0 +1,66 @@ +#include "ContactItem.h" + +ContactItem::ContactItem() {} + +ContactItem::ContactItem(QString name, QString partnerAddress, QString myAddress, QString cid, QString avatar) +{ + _name = name; + _myAddress = myAddress; + _partnerAddress = partnerAddress; + _cid = cid; + _avatar = avatar; +} + +QString ContactItem::getName() const +{ + return _name; +} + +QString ContactItem::getMyAddress() const +{ + return _myAddress; +} + +QString ContactItem::getPartnerAddress() const +{ + return _partnerAddress; +} + +QString ContactItem::getCid() const +{ + return _cid; +} + +QString ContactItem::getAvatar() const +{ + return _avatar; +} + +void ContactItem::setName(QString name) +{ + _name = name; +} + +void ContactItem::setMyAddress(QString myAddress) +{ + _myAddress = myAddress; +} + +void ContactItem::setPartnerAddress(QString partnerAddress) +{ + _partnerAddress = partnerAddress; +} + +void ContactItem::setcid(QString cid) +{ + _cid = cid; +} +void ContactItem::setAvatar(QString avatar) +{ + _avatar = avatar; +} + +QString ContactItem::toQTString() +{ + return _name + "|" + _partnerAddress + "|" + _myAddress + "|" + _cid + "|" + _avatar; +} \ No newline at end of file diff --git a/src/Model/ContactItem.h b/src/Model/ContactItem.h new file mode 100644 index 0000000..a18d0f7 --- /dev/null +++ b/src/Model/ContactItem.h @@ -0,0 +1,32 @@ +#ifndef CONTACTITEM_H +#define CONTACTITEM_H + +#include +#include + +class ContactItem +{ +private: + QString _myAddress; + QString _partnerAddress; + QString _name; + QString _cid; + QString _avatar; + +public: + ContactItem(); + ContactItem(QString name, QString partnerAddress, QString myAddress, QString cid, QString avatar); + QString getName() const; + QString getMyAddress() const; + QString getPartnerAddress() const; + QString getCid() const; + QString getAvatar() const; + void setName(QString name); + void setMyAddress(QString myAddress); + void setPartnerAddress(QString partnerAddress); + void setcid(QString cid); + void setAvatar(QString avatar); + QString toQTString(); +}; + +#endif \ No newline at end of file diff --git a/src/Model/ContactRequestChatItem.cpp b/src/Model/ContactRequestChatItem.cpp new file mode 100644 index 0000000..d6cd443 --- /dev/null +++ b/src/Model/ContactRequestChatItem.cpp @@ -0,0 +1 @@ +#include "ContactRequestChatItem.h" \ No newline at end of file diff --git a/src/Model/ContactRequestChatItem.h b/src/Model/ContactRequestChatItem.h new file mode 100644 index 0000000..d1720de --- /dev/null +++ b/src/Model/ContactRequestChatItem.h @@ -0,0 +1,11 @@ +#ifdef CONTACTREQUESTCHATITEM_H +#define CONTACTREQUESTCHATITEM_H + +#include "ChatItem.h" + +class ContactRequestChatItem : ChatItem +{ + +}; + +#endif \ No newline at end of file diff --git a/src/chatmodel.cpp b/src/chatmodel.cpp index 7ecbe8f..67dd432 100644 --- a/src/chatmodel.cpp +++ b/src/chatmodel.cpp @@ -27,7 +27,7 @@ ChatModel::ChatModel(std::vector chatItems) this->setItems(chatItems); } -QString ChatModel::generateChatItemID(ChatItem item) +/*QString ChatModel::generateChatItemID(ChatItem item) { QString key = QString::number(item.getTimestamp()) + QString("-"); key += QString(QCryptographicHash::hash( @@ -39,7 +39,7 @@ QString ChatModel::generateChatItemID(ChatItem item) ).toUtf8() ,QCryptographicHash::Md5).toHex()); return key; -} +}*/ std::map ChatModel::getItems() { @@ -55,8 +55,7 @@ void ChatModel::setItems(std::vector items) { for(ChatItem c : items) { - this->chatItems[this->generateChatItemID(c)] = c; - + this->chatItems[ChatIDGenerator::getInstance()->generateID(c)] = c; //this->generateChatItemID(c)] = c; } } @@ -67,14 +66,14 @@ void ChatModel::clear() void ChatModel::addMessage(ChatItem item) { - QString key = this->generateChatItemID(item); + QString key = ChatIDGenerator::getInstance()->generateID(item); //this->generateChatItemID(item); // qDebug() << "inserting chatitem with id: " << key; this->chatItems[key] = item; } void ChatModel::addMessage(QString timestamp, ChatItem item) { - QString key = this->generateChatItemID(item); + QString key = ChatIDGenerator::getInstance()->generateID(item);//this->generateChatItemID(item); timestamp = "0"; this->chatItems[key] = item; } diff --git a/src/chatmodel.h b/src/chatmodel.h index 493e744..b54c5ae 100644 --- a/src/chatmodel.h +++ b/src/chatmodel.h @@ -12,301 +12,9 @@ #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("#535353"); - if (outgoing) - bgcolor = "#eeeeee"; - - // 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: - long _timestamp; - QString _address; - QString _contact; - QString _memo; - QString _requestZaddr; - QString _type; - QString _cid; - QString _txid; - bool _outgoing = false; - - public: - ChatItem() {} - - ChatItem(long timestamp, QString address, QString contact, QString memo,QString requestZaddr, QString type, QString cid, QString txid) - { - _timestamp = timestamp; - _address = address; - _contact = contact; - _memo = memo; - _requestZaddr = requestZaddr; - _type = type; - _cid = cid; - _txid = txid; - _outgoing = false; - - } - - ChatItem(long timestamp, QString address, QString contact, QString memo, QString requestZaddr, QString type, QString cid, QString txid, bool outgoing) - { - _timestamp = timestamp; - _address = address; - _contact = contact; - _memo = memo; - _requestZaddr = requestZaddr; - _type = type; - _cid = cid; - _txid = txid; - _outgoing = outgoing; - - } - - long getTimestamp() - { - return _timestamp; - } - - QString getAddress() - { - return _address; - } - - QString getContact() - { - return _contact; - } - - QString getMemo() - { - return _memo; - } - - QString getRequestZaddr() - { - return _requestZaddr; - } - QString getType() - { - return _type; - } - - QString getCid() - { - return _cid; - } - - QString getTxid() - { - return _txid; - } - - - bool isOutgoing() - { - return _outgoing; - } - - void setTimestamp(long timestamp) - { - _timestamp = timestamp; - } - - void setAddress(QString address) - { - _address = address; - } - - void setContact(QString contact) - { - _contact = contact; - } - - void setMemo(QString memo) - { - _memo = memo; - } - - void setRequestZaddr(QString requestZaddr) - { - _requestZaddr = requestZaddr; - } - - void setType(QString type) - { - _type = type; - } - - void setCid(QString cid) - { - _cid = cid; - } - void setTxid(QString txid) - { - _txid = txid; - } - - void toggleOutgo() - { - _outgoing = true; - } - - QString toChatLine() - { - QDateTime myDateTime; - myDateTime.setTime_t(_timestamp); - QString line = QString("[") + myDateTime.toString("d.M.yy hh:mm") + QString("] ") ; - line += QString("") + QString(_memo) + QString("\n\n"); - return line; - } - - ~ChatItem() - { - /*delete timestamp; - delete address; - delete contact; - delete memo; - delete outgoing;*/ - } -}; +#include "Model/ChatItem.h" +#include "Chat/Helper/ChatDelegator.h" +#include "Chat/Helper/ChatIDGenerator.h" class ChatModel { @@ -322,7 +30,7 @@ class ChatModel ChatModel() {}; ChatModel(std::map chatItems); ChatModel(std::vector chatItems); - QString generateChatItemID(ChatItem item); + //QString generateChatItemID(ChatItem item); std::map getItems(); void setItems(std::map items); QString zaddr(); diff --git a/src/contactmodel.h b/src/contactmodel.h index b643bdb..fcdf7a3 100644 --- a/src/contactmodel.h +++ b/src/contactmodel.h @@ -3,85 +3,9 @@ #ifndef CONTACTMODEL_H #define CONTACTMODEL_H -#include -#include +#include "Model/ContactItem.h" #include -class ContactItem -{ - private: - QString _myAddress; - QString _partnerAddress; - QString _name; - QString _cid; - QString _avatar; - - public: - ContactItem(); - ContactItem(QString name, QString partnerAddress, QString myAddress, QString cid, QString avatar) - { - _name = name; - _myAddress = myAddress; - _partnerAddress = partnerAddress; - _cid = cid; - _avatar = avatar; - } - - QString getName() const - { - return _name; - } - - QString getMyAddress() const - { - return _myAddress; - } - - QString getPartnerAddress() const - { - return _partnerAddress; - } - - QString getCid() const - { - return _cid; - } - - QString getAvatar() const - { - return _avatar; - } - - void setName(QString name) - { - _name = name; - } - - void setMyAddress(QString myAddress) - { - _myAddress = myAddress; - } - - void setPartnerAddress(QString partnerAddress) - { - _partnerAddress = partnerAddress; - } - - void setcid(QString cid) - { - _cid = cid; - } - void setAvatar(QString avatar) - { - _avatar = avatar; - } - - QString toQTString() - { - return _name + "|" + _partnerAddress + "|" + _myAddress + "|" + _cid + "|"+ _avatar; - } - -}; class ContactModel { diff --git a/src/controller.cpp b/src/controller.cpp index 9a5118d..ecc487a 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -8,6 +8,7 @@ #include "version.h" #include "camount.h" #include "websockets.h" +#include "Model/ChatItem.h" #include "DataStore/DataStore.h" /*template<> @@ -825,7 +826,7 @@ void Controller::refreshBalances() }); } -void Controller::refreshTransactions() { +void Controller::refreshTransactions() { if (!zrpc->haveConnection()) return noConnection(); @@ -846,7 +847,7 @@ void Controller::refreshTransactions() { auto txid = QString::fromStdString(it["txid"]); auto datetime = it["datetime"].get(); - + // First, check if there's outgoing metadata if (!it["outgoing_metadata"].is_null()) { @@ -888,7 +889,8 @@ void Controller::refreshTransactions() { txid, true ); - DataStore::getChatDataStore()->setData(chatModel->generateChatItemID(item), item); + //DataStore::getChatDataStore()->setData(chatModel->generateChatItemID(item), item); + DataStore::getChatDataStore()->setData(ChatIDGenerator::getInstance()->generateID(item), item); } @@ -995,9 +997,8 @@ void Controller::refreshTransactions() { txid, false ); - DataStore::getChatDataStore()->setData(chatModel->generateChatItemID(item), item); - - + //DataStore::getChatDataStore()->setData(chatModel->generateChatItemID(item), item); + DataStore::getChatDataStore()->setData(ChatIDGenerator::getInstance()->generateID(item), item); } } diff --git a/src/controller.h b/src/controller.h index 9977427..05e1f97 100644 --- a/src/controller.h +++ b/src/controller.h @@ -12,6 +12,8 @@ #include "liteinterface.h" #include "connection.h" #include "chatmodel.h" +#include "Model/ContactRequestChatItem.h" +#include "Model/ContactItem.h" #include "contactmodel.h" using json = nlohmann::json;