mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-18 12:05:14 -04:00
Allow the elements within a StringsBuffer to be reordered
This commit is contained in:
parent
132d83b9aa
commit
c2112c4b94
@ -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() {
|
||||
|
@ -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) {
|
||||
|
@ -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++) {
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
@ -86,16 +86,16 @@ bool Convert_TryParseBool(STRING_PURE String* str, bool* value);
|
||||
#define STRINGSBUFFER_FLAGS_EXPAND_ELEMS 512
|
||||
typedef struct StringsBuffer_ {
|
||||
UInt8* TextBuffer;
|
||||
UInt32 TextBufferSize;
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user