From b8de54d9bcff261bdae98b7f75ba72b4089e94df Mon Sep 17 00:00:00 2001 From: Jaidyn Ann Date: Tue, 17 Aug 2021 22:19:28 -0500 Subject: [PATCH] Single Append() for sections with unchanged format Also removes the newly-unused AppendMessage() of RenderView --- application/views/ConversationView.cpp | 75 ++++++++++++++++++-------- application/views/ConversationView.h | 6 +-- application/views/RenderView.cpp | 14 ----- application/views/RenderView.h | 2 - 4 files changed, 56 insertions(+), 41 deletions(-) diff --git a/application/views/ConversationView.cpp b/application/views/ConversationView.cpp index 7ca860a..3741c07 100644 --- a/application/views/ConversationView.cpp +++ b/application/views/ConversationView.cpp @@ -466,11 +466,13 @@ ConversationView::_AppendMessage(BMessage* msg) UInt16IntMap face_indices; rgb_color color = ui_color(B_PANEL_TEXT_COLOR); int32 colorIndice = -1; + int32 next = body.CountChars(); BFont font; for (int i = 0; i < body.CountChars(); i++) { - _EnableStartingFaces(msg, i, &face, &face_indices); - _EnableStartingColor(msg, i, &color, &colorIndice); + _DisableEndingFaces(msg, i, &face, &face_indices); + _EnableStartingFaces(msg, i, &face, &face_indices, &next); + _EnableStartingColor(msg, i, &color, &colorIndice, &next); if (face == B_REGULAR_FACE) { font = BFont(); @@ -480,20 +482,34 @@ ConversationView::_AppendMessage(BMessage* msg) font.SetFace(face); } - if (colorIndice <= 0) + if (colorIndice > 0 && colorIndice <= i) { color = ui_color(B_PANEL_TEXT_COLOR); + colorIndice == -1; + } - int32 bytes; - const char* curChar = body.CharAt(i, &bytes); - char append[bytes]; + // If formatting doesn't change for a while, send text in bulk + if ((next - i) > 1) { + BString append; + body.CopyCharsInto(append, i, next - i); + fReceiveView->Append(append, color, &font); + i = next - 1; + next = body.CountChars(); + } + // Otherwise, send only current character + else { + int32 bytes; + const char* curChar = body.CharAt(i, &bytes); + char append[bytes]; - for (int i = 0; i < bytes; i++) - append[i] = curChar[i]; - append[bytes] = '\0'; - fReceiveView->Append(append, color, &font); + for (int i = 0; i < bytes; i++) + append[i] = curChar[i]; + append[bytes] = '\0'; + fReceiveView->Append(append, color, &font); + } + + if (next < i) + next = body.CountChars() - 1; - _DisableEndingFaces(msg, &face, &face_indices); - colorIndice--; } fReceiveView->Append("\n"); } @@ -501,7 +517,7 @@ ConversationView::_AppendMessage(BMessage* msg) void ConversationView::_EnableStartingFaces(BMessage* msg, int32 index, uint16* face, - UInt16IntMap* indices) + UInt16IntMap* indices, int32* next) { int32 face_start; int32 face_length; @@ -509,6 +525,11 @@ ConversationView::_EnableStartingFaces(BMessage* msg, int32 index, uint16* face, int32 i = 0; while (msg->FindInt32("face_start", i, &face_start) == B_OK) { + // Change 'next' value for new fonts + if (face_start > index && face_start < *next) + *next = face_start; + + // Set face normally if (face_start == index) { if (msg->FindInt32("face_length", i, &face_length) != B_OK) continue; @@ -516,46 +537,56 @@ ConversationView::_EnableStartingFaces(BMessage* msg, int32 index, uint16* face, continue; *face |= newFace; - indices->AddItem(newFace, face_length); + indices->AddItem(newFace, index + face_length); } i++; } + + // Change 'next' for ending old fonts + for (int i = 0; i < indices->CountItems(); i++) { + int faceEnd = indices->ValueAt(i); + if (faceEnd > 0 && faceEnd > index && faceEnd < *next) + *next = faceEnd; + } } void -ConversationView::_DisableEndingFaces(BMessage* msg, uint16* face, +ConversationView::_DisableEndingFaces(BMessage* msg, int32 index, uint16* face, UInt16IntMap* indices) { for (int32 i = 0; i < indices->CountItems(); i++) { uint16 key = indices->KeyAt(i); - int32 value = indices->ValueAt(i) - 1; + int32 value = indices->ValueAt(i); - indices->RemoveItemAt(i); - if (value <= 0) { + if (value <= index) { + indices->RemoveItemAt(i); *face = *face & ~key; if (indices->CountItems() == 0) *face = B_REGULAR_FACE; } - else - indices->AddItem(key, value); } } void ConversationView::_EnableStartingColor(BMessage* msg, int32 index, - rgb_color* color, int32* indice) + rgb_color* color, int32* indice, int32* next) { rgb_color newColor; int32 color_start, color_length, i = 0; while (msg->FindInt32("color_start", i, &color_start) == B_OK) { + if (color_start > index && color_start < *next) + *next = color_start - 1; + if (color_start == index && msg->FindInt32("color_length", i, &color_length) == B_OK && msg->FindColor("color", i, &newColor) == B_OK) { - *indice = color_length; + *indice = color_length + index; *color = newColor; + if (*indice > index && (*indice < *next || *next < index)) + *next = *indice; break; } i++; diff --git a/application/views/ConversationView.h b/application/views/ConversationView.h index 6a2d481..4c92f25 100644 --- a/application/views/ConversationView.h +++ b/application/views/ConversationView.h @@ -60,11 +60,11 @@ private: // Helper functions for _AppendFormattedMessage() void _EnableStartingFaces(BMessage* msg, int32 index, + uint16* face, UInt16IntMap* indices, int32* next); + void _DisableEndingFaces(BMessage* msg, int32 index, uint16* face, UInt16IntMap* indices); - void _DisableEndingFaces(BMessage* msg, uint16* face, - UInt16IntMap* indices); void _EnableStartingColor(BMessage* msg, int32 index, - rgb_color* color, int32* indice); + rgb_color* color, int32* indice, int32* next); void _UserMessage(const char* format, const char* bodyFormat, BMessage* msg); diff --git a/application/views/RenderView.cpp b/application/views/RenderView.cpp index 026c378..e584f01 100644 --- a/application/views/RenderView.cpp +++ b/application/views/RenderView.cpp @@ -17,20 +17,6 @@ RenderView::RenderView(const char* name) } -void -RenderView::AppendMessage(const char* nick, const char* message, - rgb_color nameColor, time_t time) -{ - if (BString(message).IsEmpty() == true) return; - - AppendTimestamp(time); - AppendUserstamp(nick, nameColor); - Append(message); - - if (BString(message).EndsWith("\n") == false) Append("\n"); -} - - void RenderView::AppendGeneric(const char* message) { diff --git a/application/views/RenderView.h b/application/views/RenderView.h index 2779c22..1cc2d82 100644 --- a/application/views/RenderView.h +++ b/application/views/RenderView.h @@ -12,8 +12,6 @@ class RenderView : public RunView { public: RenderView(const char* name); - void AppendMessage(const char* nick, const char* message, - rgb_color nameColor, time_t time = 0); void AppendGeneric(const char* message); void AppendUserstamp(const char* nick, rgb_color nameColor); void AppendTimestamp(time_t time = 0);