mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-18 03:55:19 -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() {
|
void HandleFontChange() {
|
||||||
int selIndex = IndexOfWidget(selectedButton);
|
int selIndex = IndexOfWidget(selectedButton);
|
||||||
game.Events.RaiseChatFontChanged();
|
game.Events.RaiseChatFontChanged();
|
||||||
base.Dispose();
|
Recreate();
|
||||||
base.Init();
|
|
||||||
game.Gui.RefreshHud();
|
game.Gui.RefreshHud();
|
||||||
|
|
||||||
for (int i = 0; i < widgets.Length; i++) {
|
if (selIndex >= 0) {
|
||||||
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)
|
|
||||||
selectedButton = (ButtonWidget)widgets[selIndex];
|
selectedButton = (ButtonWidget)widgets[selIndex];
|
||||||
|
if (selectedButton != null) selectedButton.Active = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MakeValidators() {
|
void MakeValidators() {
|
||||||
|
@ -419,14 +419,15 @@ void TabList_Set(EntityID id, STRING_PURE String* player, STRING_PURE String* li
|
|||||||
TabList_GroupRanks[id] = rank;
|
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_Free(void) { StringsBuffer_Free(&TabList_Buffer); }
|
||||||
void TabList_Reset(void) {
|
void TabList_Reset(void) {
|
||||||
Platform_MemSet(TabList_PlayerNames, 0, sizeof(TabList_PlayerNames));
|
Platform_MemSet(TabList_PlayerNames, 0, sizeof(TabList_PlayerNames));
|
||||||
Platform_MemSet(TabList_ListNames, 0, sizeof(TabList_ListNames));
|
Platform_MemSet(TabList_ListNames, 0, sizeof(TabList_ListNames));
|
||||||
Platform_MemSet(TabList_GroupNames, 0, sizeof(TabList_GroupNames));
|
Platform_MemSet(TabList_GroupNames, 0, sizeof(TabList_GroupNames));
|
||||||
Platform_MemSet(TabList_GroupRanks, 0, sizeof(TabList_GroupRanks));
|
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) {
|
IGameComponent TabList_MakeComponent(void) {
|
||||||
|
@ -111,7 +111,7 @@ bool Hotkeys_IsHotkey(Key key, STRING_TRANSIENT String* text, bool* moreInput) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Hotkeys_Init(void) {
|
void Hotkeys_Init(void) {
|
||||||
StringBuffers_Init(&HotkeysText);
|
StringsBuffer_Init(&HotkeysText);
|
||||||
String prefix = String_FromConst("hotkey-");
|
String prefix = String_FromConst("hotkey-");
|
||||||
UInt32 i;
|
UInt32 i;
|
||||||
for (i = 0; i < Options_Keys.Count; i++) {
|
for (i = 0; i < Options_Keys.Count; i++) {
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
#define OPT_NOT_FOUND UInt32_MaxValue
|
#define OPT_NOT_FOUND UInt32_MaxValue
|
||||||
|
|
||||||
void Options_Init(void) {
|
void Options_Init(void) {
|
||||||
StringBuffers_Init(&Options_Keys);
|
StringsBuffer_Init(&Options_Keys);
|
||||||
StringBuffers_Init(&Options_Values);
|
StringsBuffer_Init(&Options_Values);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Options_Free(void) {
|
void Options_Free(void) {
|
||||||
|
@ -652,7 +652,7 @@ void FilesScreen_OnResize(Screen* elem) {
|
|||||||
Screen* FilesScreen_MakeInstance(void) {
|
Screen* FilesScreen_MakeInstance(void) {
|
||||||
FilesScreen* screen = &FilesScreen_Instance;
|
FilesScreen* screen = &FilesScreen_Instance;
|
||||||
Platform_MemSet(&screen, 0, sizeof(FilesScreen) - sizeof(StringsBuffer));
|
Platform_MemSet(&screen, 0, sizeof(FilesScreen) - sizeof(StringsBuffer));
|
||||||
screen->Entries.Count = 0;
|
StringsBuffer_UNSAFE_Reset(&screen->Entries);
|
||||||
Screen_Reset(&screen->Base);
|
Screen_Reset(&screen->Base);
|
||||||
|
|
||||||
screen->Base.Base.HandlesKeyDown = FilesScreen_HandlesKeyDown;
|
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_SHIFT 10
|
||||||
#define STRINGSBUFFER_LEN_MASK 0x3FFUL
|
#define STRINGSBUFFER_LEN_MASK 0x3FFUL
|
||||||
void StringBuffers_Init(StringsBuffer* buffer) {
|
void StringsBuffer_Init(StringsBuffer* buffer) {
|
||||||
buffer->Count = 0;
|
StringsBuffer_UNSAFE_Reset(buffer);
|
||||||
buffer->TextBuffer = buffer->DefaultBuffer;
|
buffer->TextBuffer = buffer->DefaultBuffer;
|
||||||
buffer->FlagsBuffer = buffer->DefaultFlags;
|
buffer->FlagsBuffer = buffer->DefaultFlags;
|
||||||
buffer->TextBufferSize = STRINGSBUFFER_BUFFER_DEF_SIZE;
|
buffer->TextBufferElems = STRINGSBUFFER_BUFFER_DEF_SIZE;
|
||||||
buffer->FlagsBufferElems = STRINGSBUFFER_FLAGS_DEF_ELEMS;
|
buffer->FlagsBufferElems = STRINGSBUFFER_FLAGS_DEF_ELEMS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StringsBuffer_Free(StringsBuffer* buffer) {
|
void StringsBuffer_Free(StringsBuffer* buffer) {
|
||||||
if (buffer->TextBufferSize > STRINGSBUFFER_BUFFER_DEF_SIZE) {
|
if (buffer->TextBufferElems > STRINGSBUFFER_BUFFER_DEF_SIZE) {
|
||||||
Platform_MemFree(buffer->TextBuffer);
|
Platform_MemFree(buffer->TextBuffer);
|
||||||
}
|
}
|
||||||
if (buffer->FlagsBufferElems > STRINGSBUFFER_FLAGS_DEF_ELEMS) {
|
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) {
|
void StringsBuffer_Get(StringsBuffer* buffer, UInt32 index, STRING_TRANSIENT String* text) {
|
||||||
String raw = StringsBuffer_UNSAFE_Get(buffer, index);
|
String raw = StringsBuffer_UNSAFE_Get(buffer, index);
|
||||||
String_Clear(text);
|
String_Clear(text);
|
||||||
@ -479,29 +484,25 @@ void StringsBuffer_Add(StringsBuffer* buffer, STRING_PURE String* text) {
|
|||||||
StringsBuffer_ResizeArray(&buffer->FlagsBuffer, curElemSize, newElemsSize, reallocingElems);
|
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) {
|
if (text->length > STRINGSBUFFER_LEN_MASK) {
|
||||||
ErrorHandler_Fail("String too big to insert into StringsBuffer");
|
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) {
|
if (text->length > 0) {
|
||||||
Platform_MemCpy(&buffer->TextBuffer[textOffset], text->buffer, text->length);
|
Platform_MemCpy(&buffer->TextBuffer[textOffset], text->buffer, text->length);
|
||||||
}
|
}
|
||||||
buffer->FlagsBuffer[buffer->Count] = text->length | (textOffset << STRINGSBUFFER_LEN_SHIFT);
|
buffer->FlagsBuffer[buffer->Count] = text->length | (textOffset << STRINGSBUFFER_LEN_SHIFT);
|
||||||
|
|
||||||
buffer->Count++;
|
buffer->Count++;
|
||||||
|
buffer->UsedElems += text->length;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StringsBuffer_Remove(StringsBuffer* buffer, UInt32 index) {
|
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 offset = flags >> STRINGSBUFFER_LEN_SHIFT;
|
||||||
UInt32 len = flags & STRINGSBUFFER_LEN_MASK;
|
UInt32 len = flags & STRINGSBUFFER_LEN_MASK;
|
||||||
|
|
||||||
UInt32 lastFlags = buffer->FlagsBuffer[buffer->Count - 1];
|
/* Imagine buffer is this: AAXXYYZZ, and want to delete X */
|
||||||
UInt32 lastOffset = lastFlags >> STRINGSBUFFER_LEN_SHIFT;
|
|
||||||
UInt32 lastLen = lastFlags & STRINGSBUFFER_LEN_MASK;
|
|
||||||
|
|
||||||
/* Imagine buffer is this: XXYYYYZZZ, and want to delete X */
|
|
||||||
/* Start points to first character of Y */
|
/* Start points to first character of Y */
|
||||||
/* End points to last character of Z */
|
/* End points to character past last character of Z */
|
||||||
UInt32 i, start = offset + len, end = lastOffset + lastLen;
|
UInt32 i, start = offset + len, end = buffer->UsedElems;
|
||||||
for (i = start; i < end; i++) {
|
for (i = start; i < end; i++) {
|
||||||
buffer->TextBuffer[i - len] = buffer->TextBuffer[i];
|
buffer->TextBuffer[i - len] = buffer->TextBuffer[i];
|
||||||
}
|
}
|
||||||
for (i = index; i < buffer->Count; i++) {
|
for (i = index; i < buffer->Count; i++) {
|
||||||
buffer->FlagsBuffer[i] = buffer->FlagsBuffer[i + 1];
|
buffer->FlagsBuffer[i] = buffer->FlagsBuffer[i + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer->Count--;
|
buffer->Count--;
|
||||||
|
buffer->UsedElems -= len;
|
||||||
}
|
}
|
@ -85,17 +85,17 @@ bool Convert_TryParseBool(STRING_PURE String* str, bool* value);
|
|||||||
#define STRINGSBUFFER_FLAGS_DEF_ELEMS 256
|
#define STRINGSBUFFER_FLAGS_DEF_ELEMS 256
|
||||||
#define STRINGSBUFFER_FLAGS_EXPAND_ELEMS 512
|
#define STRINGSBUFFER_FLAGS_EXPAND_ELEMS 512
|
||||||
typedef struct StringsBuffer_ {
|
typedef struct StringsBuffer_ {
|
||||||
UInt8* TextBuffer;
|
UInt8* TextBuffer;
|
||||||
UInt32 TextBufferSize;
|
|
||||||
UInt32* FlagsBuffer;
|
UInt32* FlagsBuffer;
|
||||||
UInt32 FlagsBufferElems;
|
UInt32 TextBufferElems, FlagsBufferElems;
|
||||||
UInt32 Count;
|
UInt32 Count, UsedElems;
|
||||||
UInt8 DefaultBuffer[STRINGSBUFFER_BUFFER_DEF_SIZE];
|
UInt8 DefaultBuffer[STRINGSBUFFER_BUFFER_DEF_SIZE];
|
||||||
UInt32 DefaultFlags[STRINGSBUFFER_FLAGS_DEF_ELEMS];
|
UInt32 DefaultFlags[STRINGSBUFFER_FLAGS_DEF_ELEMS];
|
||||||
} StringsBuffer;
|
} StringsBuffer;
|
||||||
|
|
||||||
void StringBuffers_Init(StringsBuffer* buffer);
|
void StringsBuffer_Init(StringsBuffer* buffer);
|
||||||
void StringsBuffer_Free(StringsBuffer* buffer);
|
void StringsBuffer_Free(StringsBuffer* buffer);
|
||||||
|
void StringsBuffer_UNSAFE_Reset(StringsBuffer* buffer);
|
||||||
void StringsBuffer_Get(StringsBuffer* buffer, UInt32 index, STRING_TRANSIENT String* text);
|
void StringsBuffer_Get(StringsBuffer* buffer, UInt32 index, STRING_TRANSIENT String* text);
|
||||||
STRING_REF String StringsBuffer_UNSAFE_Get(StringsBuffer* buffer, UInt32 index);
|
STRING_REF String StringsBuffer_UNSAFE_Get(StringsBuffer* buffer, UInt32 index);
|
||||||
void StringsBuffer_Add(StringsBuffer* buffer, STRING_PURE String* text);
|
void StringsBuffer_Add(StringsBuffer* buffer, STRING_PURE String* text);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user