| 728 | } |
| 729 | |
| 730 | void MessageList::DeleteMessage(Snowflake sf) |
| 731 | { |
| 732 | std::list<MessageItem>::reverse_iterator iter; |
| 733 | |
| 734 | for (iter = m_messages.rbegin(); iter != m_messages.rend(); ++iter) |
| 735 | { |
| 736 | if (sf == iter->m_msg->m_snowflake) |
| 737 | break; |
| 738 | } |
| 739 | |
| 740 | if (iter == m_messages.rend()) |
| 741 | { |
| 742 | DbgPrintW("Message with id %lld not found to be deleted", sf); |
| 743 | return; |
| 744 | } |
| 745 | |
| 746 | // delete it |
| 747 | RECT messageRect = iter->m_rect; |
| 748 | RECT invalidateLater{}; |
| 749 | bool invalidateLaterExists = false; |
| 750 | int messageHeight = iter->m_height; |
| 751 | |
| 752 | // Adjust the message afterwards |
| 753 | std::list<MessageItem>::iterator niter = --(iter.base()), afteriter = niter, beforeiter = niter; |
| 754 | ++afteriter; |
| 755 | |
| 756 | bool wasFirstMessage = niter == m_messages.begin(); |
| 757 | |
| 758 | int afterMessageInitialHeight = 0; |
| 759 | int afterMessageNowHeight = 0; |
| 760 | |
| 761 | if (afteriter != m_messages.end()) |
| 762 | { |
| 763 | std::string nm, av; |
| 764 | Snowflake sf = Snowflake(-1); |
| 765 | time_t tm = 0; |
| 766 | int pl = 0; |
| 767 | MessageType::eType et = MessageType::DEFAULT; |
| 768 | if (beforeiter != m_messages.begin()) { |
| 769 | --beforeiter; |
| 770 | sf = beforeiter->m_msg->m_author_snowflake; |
| 771 | tm = beforeiter->m_msg->m_dateTime; |
| 772 | et = beforeiter->m_msg->m_type; |
| 773 | pl = beforeiter->m_placeInChain; |
| 774 | nm = beforeiter->m_msg->m_author; |
| 775 | av = beforeiter->m_msg->m_avatar; |
| 776 | } |
| 777 | |
| 778 | afterMessageInitialHeight = afteriter->m_height; |
| 779 | |
| 780 | bool shouldRecalc = false; |
| 781 | if (ShouldStartNewChain(sf, tm, pl, et, nm, av, *afteriter, false)) { |
| 782 | afteriter->m_placeInChain = 0; // don't care about the rest to be honest |
| 783 | shouldRecalc = true; |
| 784 | } |
| 785 | |
| 786 | if (ShouldBeDateGap(tm, afteriter->m_msg->m_dateTime)) { |
| 787 | afteriter->m_bIsDateGap = true; |