199 size_t base_display_addr = 0x0000) {
203 ImU8* mem_data = (ImU8*)mem_data_void;
205 CalcSizes(s, mem_size, base_display_addr);
206 ImGuiStyle& style = ImGui::GetStyle();
212 const float height_separator = style.ItemSpacing.y;
216 height_separator + ImGui::GetFrameHeightWithSpacing() * 1;
218 footer_height += height_separator +
219 ImGui::GetFrameHeightWithSpacing() * 1 +
220 ImGui::GetTextLineHeightWithSpacing() * 3;
221 ImGui::BeginChild(
"##scrolling", ImVec2(0, -footer_height),
false,
222 ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav);
223 ImDrawList* draw_list = ImGui::GetWindowDrawList();
225 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
226 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
230 const int line_total_count = (int)((mem_size +
Cols - 1) /
Cols);
231 ImGuiListClipper clipper;
232 clipper.Begin(line_total_count, s.
LineHeight);
234 bool data_next =
false;
241 size_t preview_data_type_size =
244 size_t data_editing_addr_next = (size_t)-1;
249 if (ImGui::IsKeyPressed(ImGuiKey_UpArrow) &&
252 }
else if (ImGui::IsKeyPressed(ImGuiKey_DownArrow) &&
255 }
else if (ImGui::IsKeyPressed(ImGuiKey_LeftArrow) &&
258 }
else if (ImGui::IsKeyPressed(ImGuiKey_RightArrow) &&
265 ImVec2 window_pos = ImGui::GetWindowPos();
268 window_pos.y, window_pos.y + 9999,
269 ImGui::GetColorU32(ImGuiCol_Border));
271 const ImU32 color_text = ImGui::GetColorU32(ImGuiCol_Text);
273 ? ImGui::GetColorU32(ImGuiCol_TextDisabled)
276 const char* format_address =
278 const char* format_data =
283 while (clipper.Step())
284 for (
int line_i = clipper.DisplayStart; line_i < clipper.DisplayEnd;
287 size_t addr = (size_t)(line_i *
Cols);
289 base_display_addr + addr);
292 for (
int n = 0; n <
Cols && addr < mem_size; n++, addr++) {
297 ImGui::SameLine(byte_pos_x);
300 bool is_highlight_from_user_range =
302 bool is_highlight_from_user_func =
304 bool is_highlight_from_preview =
307 if (is_highlight_from_user_range || is_highlight_from_user_func ||
308 is_highlight_from_preview) {
309 ImVec2 pos = ImGui::GetCursorScreenPos();
311 bool is_next_byte_highlighted =
312 (addr + 1 < mem_size) &&
315 if (is_next_byte_highlighted || (n + 1 ==
Cols)) {
321 draw_list->AddRectFilled(
322 pos, ImVec2(pos.x + highlight_width, pos.y + s.
LineHeight),
326 bool comparison_rom_diff =
false;
328 int a = mem_data[addr];
331 ImVec2 pos = ImGui::GetCursorScreenPos();
333 bool is_next_byte_highlighted =
334 (addr + 1 < mem_size) &&
337 if (is_next_byte_highlighted || (n + 1 ==
Cols)) {
343 draw_list->AddRectFilled(
344 pos, ImVec2(pos.x + highlight_width, pos.y + s.
LineHeight),
345 IM_COL32(255, 0, 0, 50));
351 bool data_write =
false;
352 ImGui::PushID((
void*)addr);
354 ImGui::SetKeyboardFocusHere(0);
356 base_display_addr + addr);
365 static int Callback(ImGuiInputTextCallbackData* data) {
366 UserData* user_data = (UserData*)data->UserData;
367 if (!data->HasSelection())
368 user_data->CursorPos = data->CursorPos;
369 if (data->SelectionStart == 0 &&
370 data->SelectionEnd == data->BufTextLen) {
375 data->DeleteChars(0, data->BufTextLen);
376 data->InsertChars(0, user_data->CurrentBufOverwrite);
377 data->SelectionStart = 0;
378 data->SelectionEnd = 2;
383 char CurrentBufOverwrite[3];
387 user_data.CursorPos = -1;
388 sprintf(user_data.CurrentBufOverwrite, format_byte,
390 ImGuiInputTextFlags flags = ImGuiInputTextFlags_CharsHexadecimal |
391 ImGuiInputTextFlags_EnterReturnsTrue |
392 ImGuiInputTextFlags_AutoSelectAll |
393 ImGuiInputTextFlags_NoHorizontalScroll |
394 ImGuiInputTextFlags_CallbackAlways;
395#if IMGUI_VERSION_NUM >= 18104
396 flags |= ImGuiInputTextFlags_AlwaysOverwrite;
398 flags |= ImGuiInputTextFlags_AlwaysInsertMode;
403 UserData::Callback, &user_data))
404 data_write = data_next =
true;
408 if (user_data.CursorPos >= 2)
409 data_write = data_next =
true;
410 if (data_editing_addr_next != (
size_t)-1)
411 data_write = data_next =
false;
412 unsigned int data_input_value = 0;
416 WriteFn(mem_data, addr, (ImU8)data_input_value);
418 mem_data[addr] = (ImU8)data_input_value;
424 ImU8 b =
ReadFn ?
ReadFn(mem_data, addr) : mem_data[addr];
427 if ((b >= 32 && b < 128))
428 ImGui::Text(
".%c ", b);
430 ImGui::TextDisabled(
"## ");
434 ImGui::Text(format_byte_space, b);
437 ImGui::TextDisabled(
"00 ");
439 ImGui::Text(format_byte_space, b);
441 if (!
ReadOnly && ImGui::IsItemHovered() &&
442 ImGui::IsMouseClicked(0)) {
444 data_editing_addr_next = addr;
452 ImVec2 pos = ImGui::GetCursorScreenPos();
453 addr = line_i *
Cols;
454 ImGui::PushID(line_i);
455 if (ImGui::InvisibleButton(
460 (size_t)((ImGui::GetIO().MousePos.x - pos.x) / s.
GlyphWidth);
464 for (
int n = 0; n <
Cols && addr < mem_size; n++, addr++) {
466 draw_list->AddRectFilled(
468 ImGui::GetColorU32(ImGuiCol_FrameBg));
469 draw_list->AddRectFilled(
471 ImGui::GetColorU32(ImGuiCol_TextSelectedBg));
473 unsigned char c =
ReadFn ?
ReadFn(mem_data, addr) : mem_data[addr];
474 char display_c = (c < 32 || c >= 128) ?
'.' : c;
475 draw_list->AddText(pos,
476 (display_c == c) ? color_text : color_disabled,
477 &display_c, &display_c + 1);
482 ImGui::PopStyleVar(2);
492 }
else if (data_editing_addr_next != (
size_t)-1) {
503 if (lock_show_data_preview) {