imgui_markdown_wrapper.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * =====================================================================================
  3. *
  4. * Filename: imgui_markdown_wrapper.cpp
  5. *
  6. * Description: wrapper for imgui_markdown.h
  7. *
  8. * =====================================================================================
  9. */
  10. #include <WrapperConverter.h>
  11. #include <imgui.h>
  12. #include <imgui_markdown.h>
  13. #include <imgui_markdown_wrapper.h>
  14. iggMarkdownLinkCallbackData iggMarkdownLink;
  15. static void markdownLinkCallback(ImGui::MarkdownLinkCallbackData);
  16. static ImGui::MarkdownImageData markdownImageCallback(ImGui::MarkdownLinkCallbackData);
  17. iggMarkdownLinkCallbackData iggMarkdown(char *markdown_, iggMarkdownHeaderData headers_[], int numHeaderLevels) {
  18. // clean up link cache.
  19. iggMarkdownLink.link = NULL;
  20. iggMarkdownLink.link_len = 0;
  21. // create imgui markdown config:
  22. // TODO: implement all these methods
  23. ImGui::MarkdownConfig mdConfig;
  24. mdConfig.linkCallback = markdownLinkCallback;
  25. for (int i = 0; i < numHeaderLevels; i++) {
  26. ImFont *font = reinterpret_cast<ImFont *>(headers_[i].font);
  27. mdConfig.headingFormats[i] = {font, (bool)(headers_[i].separator)};
  28. }
  29. // mdConfig.tooltipCallback = NULL;
  30. mdConfig.imageCallback = markdownImageCallback;
  31. // mdConfig.linkIcon = ICON_FA_LINK;
  32. // mdConfig.userData = NULL;
  33. // mdConfig.formatCallback = ExampleMarkdownFormatCallback;
  34. // run ImGui Markdown
  35. ImGui::Markdown(markdown_, strlen(markdown_), mdConfig);
  36. return iggMarkdownLink;
  37. }
  38. void markdownLinkCallback(ImGui::MarkdownLinkCallbackData data_) {
  39. iggMarkdownLink.link = (char *)(data_.link);
  40. iggMarkdownLink.link_len = data_.linkLength;
  41. }
  42. ImGui::MarkdownImageData markdownImageCallback(ImGui::MarkdownLinkCallbackData data_) {
  43. iggMarkdownLinkCallbackData dataWrapped;
  44. dataWrapped.link = (char *)(data_.link);
  45. dataWrapped.link_len = data_.linkLength;
  46. iggMarkdownImageData src = goMarkdownImageCallback(dataWrapped);
  47. ImGui::MarkdownImageData result;
  48. result.useLinkCallback = src.useLinkCallback;
  49. ImTextureID texture = reinterpret_cast<ImTextureID>(src.texture);
  50. if (texture == 0) {
  51. return result;
  52. }
  53. result.user_texture_id = texture;
  54. // scale image size to avoid situation, when image is larger than available region
  55. int availableW = ImGui::GetContentRegionAvail().x;
  56. if (src.shouldScale && src.size.x > availableW) {
  57. src.size.y = src.size.y * availableW / src.size.x;
  58. src.size.x = availableW;
  59. }
  60. Vec2Wrapper size(&src.size);
  61. Vec2Wrapper uv0(&src.uv0);
  62. Vec2Wrapper uv1(&src.uv1);
  63. Vec4Wrapper tintColor(&src.tintColor);
  64. Vec4Wrapper borderColor(&src.borderColor);
  65. result.size = *size;
  66. result.uv0 = *uv0;
  67. result.uv1 = *uv1;
  68. result.tint_col = *tintColor;
  69. result.border_col = *borderColor;
  70. result.isValid = true;
  71. return result;
  72. }