196 size_t base_display_addr = 0x0000) {
200 ImU8* mem_data = (ImU8*)mem_data_void;
202 CalcSizes(s, mem_size, base_display_addr);
203 ImGuiStyle& style = ImGui::GetStyle();
209 const float height_separator = style.ItemSpacing.y;
213 height_separator + ImGui::GetFrameHeightWithSpacing() * 1;
215 footer_height += height_separator +
216 ImGui::GetFrameHeightWithSpacing() * 1 +
217 ImGui::GetTextLineHeightWithSpacing() * 3;
218 ImGui::BeginChild(
"##scrolling", ImVec2(0, -footer_height),
false,
219 ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav);
220 ImDrawList* draw_list = ImGui::GetWindowDrawList();
222 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0));
223 ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
227 const int line_total_count = (int)((mem_size +
Cols - 1) /
Cols);
228 ImGuiListClipper clipper;
229 clipper.Begin(line_total_count, s.
LineHeight);
231 bool data_next =
false;
238 size_t preview_data_type_size =
241 size_t data_editing_addr_next = (size_t)-1;
246 if (ImGui::IsKeyPressed(ImGuiKey_UpArrow) &&
249 }
else if (ImGui::IsKeyPressed(ImGuiKey_DownArrow) &&
252 }
else if (ImGui::IsKeyPressed(ImGuiKey_LeftArrow) &&
255 }
else if (ImGui::IsKeyPressed(ImGuiKey_RightArrow) &&
262 ImVec2 window_pos = ImGui::GetWindowPos();
267 window_pos.y + 9999),
268 ImGui::GetColorU32(ImGuiCol_Border));
270 const ImU32 color_text = ImGui::GetColorU32(ImGuiCol_Text);
272 ? ImGui::GetColorU32(ImGuiCol_TextDisabled)
275 const char* format_address =
277 const char* format_data =
282 while (clipper.Step())
283 for (
int line_i = clipper.DisplayStart; line_i < clipper.DisplayEnd;
286 size_t addr = (size_t)(line_i *
Cols);
288 base_display_addr + addr);
291 for (
int n = 0; n <
Cols && addr < mem_size; n++, addr++) {
296 ImGui::SameLine(byte_pos_x);
299 bool is_highlight_from_user_range =
301 bool is_highlight_from_user_func =
303 bool is_highlight_from_preview =
306 if (is_highlight_from_user_range || is_highlight_from_user_func ||
307 is_highlight_from_preview) {
308 ImVec2 pos = ImGui::GetCursorScreenPos();
310 bool is_next_byte_highlighted =
311 (addr + 1 < mem_size) &&
314 if (is_next_byte_highlighted || (n + 1 ==
Cols)) {
320 draw_list->AddRectFilled(
321 pos, ImVec2(pos.x + highlight_width, pos.y + s.
LineHeight),
325 bool comparison_rom_diff =
false;
327 int a = mem_data[addr];
330 ImVec2 pos = ImGui::GetCursorScreenPos();
332 bool is_next_byte_highlighted =
333 (addr + 1 < mem_size) &&
336 if (is_next_byte_highlighted || (n + 1 ==
Cols)) {
342 draw_list->AddRectFilled(
343 pos, ImVec2(pos.x + highlight_width, pos.y + s.
LineHeight),
344 IM_COL32(255, 0, 0, 50));
350 bool data_write =
false;
351 ImGui::PushID((
void*)addr);
353 ImGui::SetKeyboardFocusHere(0);
355 base_display_addr + addr);
364 static int Callback(ImGuiInputTextCallbackData* data) {
365 UserData* user_data = (UserData*)data->UserData;
366 if (!data->HasSelection())
367 user_data->CursorPos = data->CursorPos;
368 if (data->SelectionStart == 0 &&
369 data->SelectionEnd == data->BufTextLen) {
374 data->DeleteChars(0, data->BufTextLen);
375 data->InsertChars(0, user_data->CurrentBufOverwrite);
376 data->SelectionStart = 0;
377 data->SelectionEnd = 2;
382 char CurrentBufOverwrite[3];
386 user_data.CursorPos = -1;
387 sprintf(user_data.CurrentBufOverwrite, format_byte,
389 ImGuiInputTextFlags flags = ImGuiInputTextFlags_CharsHexadecimal |
390 ImGuiInputTextFlags_EnterReturnsTrue |
391 ImGuiInputTextFlags_AutoSelectAll |
392 ImGuiInputTextFlags_NoHorizontalScroll |
393 ImGuiInputTextFlags_CallbackAlways;
394#if IMGUI_VERSION_NUM >= 18104
395 flags |= ImGuiInputTextFlags_AlwaysOverwrite;
397 flags |= ImGuiInputTextFlags_AlwaysInsertMode;
402 UserData::Callback, &user_data))
403 data_write = data_next =
true;
407 if (user_data.CursorPos >= 2)
408 data_write = data_next =
true;
409 if (data_editing_addr_next != (
size_t)-1)
410 data_write = data_next =
false;
411 unsigned int data_input_value = 0;
415 WriteFn(mem_data, addr, (ImU8)data_input_value);
417 mem_data[addr] = (ImU8)data_input_value;
423 ImU8 b =
ReadFn ?
ReadFn(mem_data, addr) : mem_data[addr];
426 if ((b >= 32 && b < 128))
427 ImGui::Text(
".%c ", b);
429 ImGui::TextDisabled(
"## ");
433 ImGui::Text(format_byte_space, b);
436 ImGui::TextDisabled(
"00 ");
438 ImGui::Text(format_byte_space, b);
440 if (!
ReadOnly && ImGui::IsItemHovered() &&
441 ImGui::IsMouseClicked(0)) {
443 data_editing_addr_next = addr;
451 ImVec2 pos = ImGui::GetCursorScreenPos();
452 addr = line_i *
Cols;
453 ImGui::PushID(line_i);
454 if (ImGui::InvisibleButton(
459 (size_t)((ImGui::GetIO().MousePos.x - pos.x) / s.
GlyphWidth);
463 for (
int n = 0; n <
Cols && addr < mem_size; n++, addr++) {
465 draw_list->AddRectFilled(
467 ImGui::GetColorU32(ImGuiCol_FrameBg));
468 draw_list->AddRectFilled(
470 ImGui::GetColorU32(ImGuiCol_TextSelectedBg));
472 unsigned char c =
ReadFn ?
ReadFn(mem_data, addr) : mem_data[addr];
473 char display_c = (c < 32 || c >= 128) ?
'.' : c;
474 draw_list->AddText(pos,
475 (display_c == c) ? color_text : color_disabled,
476 &display_c, &display_c + 1);
481 ImGui::PopStyleVar(2);
491 }
else if (data_editing_addr_next != (
size_t)-1) {
502 if (lock_show_data_preview) {