198 size_t base_display_addr = 0x0000) {
202 ImU8* mem_data = (ImU8*)mem_data_void;
204 CalcSizes(s, mem_size, base_display_addr);
205 ImGuiStyle& style = ImGui::GetStyle();
211 const float height_separator = style.ItemSpacing.y;
215 height_separator + ImGui::GetFrameHeightWithSpacing() * 1;
217 footer_height += height_separator +
218 ImGui::GetFrameHeightWithSpacing() * 1 +
219 ImGui::GetTextLineHeightWithSpacing() * 3;
220 ImGui::BeginChild(
"##scrolling", ImVec2(0, -footer_height),
false,
221 ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav);
222 ImDrawList* draw_list = ImGui::GetWindowDrawList();
224 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
225 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
229 const int line_total_count = (int)((mem_size +
Cols - 1) /
Cols);
230 ImGuiListClipper clipper;
231 clipper.Begin(line_total_count, s.
LineHeight);
233 bool data_next =
false;
240 size_t preview_data_type_size =
243 size_t data_editing_addr_next = (size_t)-1;
248 if (ImGui::IsKeyPressed(ImGuiKey_UpArrow) &&
251 }
else if (ImGui::IsKeyPressed(ImGuiKey_DownArrow) &&
254 }
else if (ImGui::IsKeyPressed(ImGuiKey_LeftArrow) &&
257 }
else if (ImGui::IsKeyPressed(ImGuiKey_RightArrow) &&
264 ImVec2 window_pos = ImGui::GetWindowPos();
269 window_pos.y + 9999),
270 ImGui::GetColorU32(ImGuiCol_Border));
272 const ImU32 color_text = ImGui::GetColorU32(ImGuiCol_Text);
274 ? ImGui::GetColorU32(ImGuiCol_TextDisabled)
277 const char* format_address =
279 const char* format_data =
284 while (clipper.Step())
285 for (
int line_i = clipper.DisplayStart; line_i < clipper.DisplayEnd;
288 size_t addr = (size_t)(line_i *
Cols);
290 base_display_addr + addr);
293 for (
int n = 0; n <
Cols && addr < mem_size; n++, addr++) {
298 ImGui::SameLine(byte_pos_x);
301 bool is_highlight_from_user_range =
303 bool is_highlight_from_user_func =
305 bool is_highlight_from_preview =
308 if (is_highlight_from_user_range || is_highlight_from_user_func ||
309 is_highlight_from_preview) {
310 ImVec2 pos = ImGui::GetCursorScreenPos();
312 bool is_next_byte_highlighted =
313 (addr + 1 < mem_size) &&
316 if (is_next_byte_highlighted || (n + 1 ==
Cols)) {
322 draw_list->AddRectFilled(
323 pos, ImVec2(pos.x + highlight_width, pos.y + s.
LineHeight),
327 bool comparison_rom_diff =
false;
329 int a = mem_data[addr];
332 ImVec2 pos = ImGui::GetCursorScreenPos();
334 bool is_next_byte_highlighted =
335 (addr + 1 < mem_size) &&
338 if (is_next_byte_highlighted || (n + 1 ==
Cols)) {
344 draw_list->AddRectFilled(
345 pos, ImVec2(pos.x + highlight_width, pos.y + s.
LineHeight),
346 IM_COL32(255, 0, 0, 50));
352 bool data_write =
false;
353 ImGui::PushID((
void*)addr);
355 ImGui::SetKeyboardFocusHere(0);
357 base_display_addr + addr);
366 static int Callback(ImGuiInputTextCallbackData* data) {
367 UserData* user_data = (UserData*)data->UserData;
368 if (!data->HasSelection())
369 user_data->CursorPos = data->CursorPos;
370 if (data->SelectionStart == 0 &&
371 data->SelectionEnd == data->BufTextLen) {
376 data->DeleteChars(0, data->BufTextLen);
377 data->InsertChars(0, user_data->CurrentBufOverwrite);
378 data->SelectionStart = 0;
379 data->SelectionEnd = 2;
384 char CurrentBufOverwrite[3];
388 user_data.CursorPos = -1;
389 sprintf(user_data.CurrentBufOverwrite, format_byte,
391 ImGuiInputTextFlags flags = ImGuiInputTextFlags_CharsHexadecimal |
392 ImGuiInputTextFlags_EnterReturnsTrue |
393 ImGuiInputTextFlags_AutoSelectAll |
394 ImGuiInputTextFlags_NoHorizontalScroll |
395 ImGuiInputTextFlags_CallbackAlways;
396#if IMGUI_VERSION_NUM >= 18104
397 flags |= ImGuiInputTextFlags_AlwaysOverwrite;
399 flags |= ImGuiInputTextFlags_AlwaysInsertMode;
404 UserData::Callback, &user_data))
405 data_write = data_next =
true;
409 if (user_data.CursorPos >= 2)
410 data_write = data_next =
true;
411 if (data_editing_addr_next != (
size_t)-1)
412 data_write = data_next =
false;
413 unsigned int data_input_value = 0;
417 WriteFn(mem_data, addr, (ImU8)data_input_value);
419 mem_data[addr] = (ImU8)data_input_value;
425 ImU8 b =
ReadFn ?
ReadFn(mem_data, addr) : mem_data[addr];
428 if ((b >= 32 && b < 128))
429 ImGui::Text(
".%c ", b);
431 ImGui::TextDisabled(
"## ");
435 ImGui::Text(format_byte_space, b);
438 ImGui::TextDisabled(
"00 ");
440 ImGui::Text(format_byte_space, b);
442 if (!
ReadOnly && ImGui::IsItemHovered() &&
443 ImGui::IsMouseClicked(0)) {
445 data_editing_addr_next = addr;
453 ImVec2 pos = ImGui::GetCursorScreenPos();
454 addr = line_i *
Cols;
455 ImGui::PushID(line_i);
456 if (ImGui::InvisibleButton(
461 (size_t)((ImGui::GetIO().MousePos.x - pos.x) / s.
GlyphWidth);
465 for (
int n = 0; n <
Cols && addr < mem_size; n++, addr++) {
467 draw_list->AddRectFilled(
469 ImGui::GetColorU32(ImGuiCol_FrameBg));
470 draw_list->AddRectFilled(
472 ImGui::GetColorU32(ImGuiCol_TextSelectedBg));
474 unsigned char c =
ReadFn ?
ReadFn(mem_data, addr) : mem_data[addr];
475 char display_c = (c < 32 || c >= 128) ?
'.' : c;
476 draw_list->AddText(pos,
477 (display_c == c) ? color_text : color_disabled,
478 &display_c, &display_c + 1);
483 ImGui::PopStyleVar(2);
493 }
else if (data_editing_addr_next != (
size_t)-1) {
504 if (lock_show_data_preview) {