Allow the elements within a StringsBuffer to be reordered

This commit is contained in:
UnknownShadow200 2018-02-03 15:43:11 +11:00
parent 132d83b9aa
commit c2112c4b94
7 changed files with 41 additions and 50 deletions

View File

@ -87,22 +87,13 @@ namespace ClassicalSharp.Gui.Screens {
void HandleFontChange() {
int selIndex = IndexOfWidget(selectedButton);
game.Events.RaiseChatFontChanged();
base.Dispose();
base.Init();
Recreate();
game.Gui.RefreshHud();
for (int i = 0; i < widgets.Length; i++) {
if (widgets[i] == null || !(widgets[i] is ButtonWidget)) {
widgets[i] = null; continue;
}
ButtonWidget btn = widgets[i] as ButtonWidget;
btn.font = titleFont;
btn.SetText(btn.Text);
}
if (selIndex >= 0)
if (selIndex >= 0) {
selectedButton = (ButtonWidget)widgets[selIndex];
if (selectedButton != null) selectedButton.Active = true;
}
}
void MakeValidators() {

View File

@ -419,14 +419,15 @@ void TabList_Set(EntityID id, STRING_PURE String* player, STRING_PURE String* li
TabList_GroupRanks[id] = rank;
}
void TabList_Init(void) { StringBuffers_Init(&TabList_Buffer); }
void TabList_Init(void) { StringsBuffer_Init(&TabList_Buffer); }
void TabList_Free(void) { StringsBuffer_Free(&TabList_Buffer); }
void TabList_Reset(void) {
Platform_MemSet(TabList_PlayerNames, 0, sizeof(TabList_PlayerNames));
Platform_MemSet(TabList_ListNames, 0, sizeof(TabList_ListNames));
Platform_MemSet(TabList_GroupNames, 0, sizeof(TabList_GroupNames));
Platform_MemSet(TabList_GroupRanks, 0, sizeof(TabList_GroupRanks));
TabList_Buffer.Count = 0; /* TODO: Should we be freeing the buffer here? */
/* TODO: Should we be trying to free the buffer here? */
StringsBuffer_UNSAFE_Reset(&TabList_Buffer);
}
IGameComponent TabList_MakeComponent(void) {

View File

@ -111,7 +111,7 @@ bool Hotkeys_IsHotkey(Key key, STRING_TRANSIENT String* text, bool* moreInput) {
}
void Hotkeys_Init(void) {
StringBuffers_Init(&HotkeysText);
StringsBuffer_Init(&HotkeysText);
String prefix = String_FromConst("hotkey-");
UInt32 i;
for (i = 0; i < Options_Keys.Count; i++) {

View File

@ -6,8 +6,8 @@
#define OPT_NOT_FOUND UInt32_MaxValue
void Options_Init(void) {
StringBuffers_Init(&Options_Keys);
StringBuffers_Init(&Options_Values);
StringsBuffer_Init(&Options_Keys);
StringsBuffer_Init(&Options_Values);
}
void Options_Free(void) {

View File

@ -652,7 +652,7 @@ void FilesScreen_OnResize(Screen* elem) {
Screen* FilesScreen_MakeInstance(void) {
FilesScreen* screen = &FilesScreen_Instance;
Platform_MemSet(&screen, 0, sizeof(FilesScreen) - sizeof(StringsBuffer));
screen->Entries.Count = 0;
StringsBuffer_UNSAFE_Reset(&screen->Entries);
Screen_Reset(&screen->Base);
screen->Base.Base.HandlesKeyDown = FilesScreen_HandlesKeyDown;

View File

@ -418,16 +418,16 @@ bool Convert_TryParseBool(STRING_PURE String* str, bool* value) {
#define STRINGSBUFFER_LEN_SHIFT 10
#define STRINGSBUFFER_LEN_MASK 0x3FFUL
void StringBuffers_Init(StringsBuffer* buffer) {
buffer->Count = 0;
void StringsBuffer_Init(StringsBuffer* buffer) {
StringsBuffer_UNSAFE_Reset(buffer);
buffer->TextBuffer = buffer->DefaultBuffer;
buffer->FlagsBuffer = buffer->DefaultFlags;
buffer->TextBufferSize = STRINGSBUFFER_BUFFER_DEF_SIZE;
buffer->TextBufferElems = STRINGSBUFFER_BUFFER_DEF_SIZE;
buffer->FlagsBufferElems = STRINGSBUFFER_FLAGS_DEF_ELEMS;
}
void StringsBuffer_Free(StringsBuffer* buffer) {
if (buffer->TextBufferSize > STRINGSBUFFER_BUFFER_DEF_SIZE) {
if (buffer->TextBufferElems > STRINGSBUFFER_BUFFER_DEF_SIZE) {
Platform_MemFree(buffer->TextBuffer);
}
if (buffer->FlagsBufferElems > STRINGSBUFFER_FLAGS_DEF_ELEMS) {
@ -435,6 +435,11 @@ void StringsBuffer_Free(StringsBuffer* buffer) {
}
}
void StringsBuffer_UNSAFE_Reset(StringsBuffer* buffer) {
buffer->Count = 0;
buffer->UsedElems = 0;
}
void StringsBuffer_Get(StringsBuffer* buffer, UInt32 index, STRING_TRANSIENT String* text) {
String raw = StringsBuffer_UNSAFE_Get(buffer, index);
String_Clear(text);
@ -479,29 +484,25 @@ void StringsBuffer_Add(StringsBuffer* buffer, STRING_PURE String* text) {
StringsBuffer_ResizeArray(&buffer->FlagsBuffer, curElemSize, newElemsSize, reallocingElems);
}
UInt32 textOffset = 0;
if (buffer->Count > 0) {
UInt32 lastFlags = buffer->FlagsBuffer[buffer->Count - 1];
UInt32 lastOffset = lastFlags >> STRINGSBUFFER_LEN_SHIFT;
UInt32 lastLen = lastFlags & STRINGSBUFFER_LEN_MASK;
textOffset = lastOffset + lastLen;
}
if (textOffset + text->length >= buffer->TextBufferSize) {
UInt32 curTextSize = buffer->TextBufferSize;
UInt32 newTextSize = buffer->TextBufferSize + STRINGSBUFFER_BUFFER_EXPAND_SIZE;
bool reallocingText = buffer->TextBufferSize > STRINGSBUFFER_BUFFER_DEF_SIZE;
StringsBuffer_ResizeArray(&buffer->FlagsBuffer, curTextSize, newTextSize, reallocingText);
}
if (text->length > STRINGSBUFFER_LEN_MASK) {
ErrorHandler_Fail("String too big to insert into StringsBuffer");
}
UInt32 textOffset = buffer->UsedElems;
if (textOffset + text->length >= buffer->TextBufferElems) {
UInt32 curTextSize = buffer->TextBufferElems;
UInt32 newTextSize = buffer->TextBufferElems + STRINGSBUFFER_BUFFER_EXPAND_SIZE;
bool reallocingText = buffer->TextBufferElems > STRINGSBUFFER_BUFFER_DEF_SIZE;
StringsBuffer_ResizeArray(&buffer->FlagsBuffer, curTextSize, newTextSize, reallocingText);
}
if (text->length > 0) {
Platform_MemCpy(&buffer->TextBuffer[textOffset], text->buffer, text->length);
}
buffer->FlagsBuffer[buffer->Count] = text->length | (textOffset << STRINGSBUFFER_LEN_SHIFT);
buffer->Count++;
buffer->UsedElems += text->length;
}
void StringsBuffer_Remove(StringsBuffer* buffer, UInt32 index) {
@ -511,19 +512,17 @@ void StringsBuffer_Remove(StringsBuffer* buffer, UInt32 index) {
UInt32 offset = flags >> STRINGSBUFFER_LEN_SHIFT;
UInt32 len = flags & STRINGSBUFFER_LEN_MASK;
UInt32 lastFlags = buffer->FlagsBuffer[buffer->Count - 1];
UInt32 lastOffset = lastFlags >> STRINGSBUFFER_LEN_SHIFT;
UInt32 lastLen = lastFlags & STRINGSBUFFER_LEN_MASK;
/* Imagine buffer is this: XXYYYYZZZ, and want to delete X */
/* Imagine buffer is this: AAXXYYZZ, and want to delete X */
/* Start points to first character of Y */
/* End points to last character of Z */
UInt32 i, start = offset + len, end = lastOffset + lastLen;
/* End points to character past last character of Z */
UInt32 i, start = offset + len, end = buffer->UsedElems;
for (i = start; i < end; i++) {
buffer->TextBuffer[i - len] = buffer->TextBuffer[i];
}
for (i = index; i < buffer->Count; i++) {
buffer->FlagsBuffer[i] = buffer->FlagsBuffer[i + 1];
}
buffer->Count--;
buffer->UsedElems -= len;
}

View File

@ -85,17 +85,17 @@ bool Convert_TryParseBool(STRING_PURE String* str, bool* value);
#define STRINGSBUFFER_FLAGS_DEF_ELEMS 256
#define STRINGSBUFFER_FLAGS_EXPAND_ELEMS 512
typedef struct StringsBuffer_ {
UInt8* TextBuffer;
UInt32 TextBufferSize;
UInt8* TextBuffer;
UInt32* FlagsBuffer;
UInt32 FlagsBufferElems;
UInt32 Count;
UInt32 TextBufferElems, FlagsBufferElems;
UInt32 Count, UsedElems;
UInt8 DefaultBuffer[STRINGSBUFFER_BUFFER_DEF_SIZE];
UInt32 DefaultFlags[STRINGSBUFFER_FLAGS_DEF_ELEMS];
} StringsBuffer;
void StringBuffers_Init(StringsBuffer* buffer);
void StringsBuffer_Init(StringsBuffer* buffer);
void StringsBuffer_Free(StringsBuffer* buffer);
void StringsBuffer_UNSAFE_Reset(StringsBuffer* buffer);
void StringsBuffer_Get(StringsBuffer* buffer, UInt32 index, STRING_TRANSIENT String* text);
STRING_REF String StringsBuffer_UNSAFE_Get(StringsBuffer* buffer, UInt32 index);
void StringsBuffer_Add(StringsBuffer* buffer, STRING_PURE String* text);