TextEditor: Pass-through scroll and click events to Rack as needed

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2022-01-24 22:59:02 +00:00
parent 362cf9b2b9
commit 1a4534bf22
No known key found for this signature in database
GPG key ID: CDBAA37ABC74FBA0
5 changed files with 95 additions and 65 deletions

View file

@ -158,6 +158,27 @@ void ImGuiTextEditor::drawImGui()
ImGui::End();
}
void ImGuiTextEditor::onButton(const ButtonEvent& e)
{
setAsCurrentContext();
// if mouse press is over the top status bar, do nothing so editor can be moved in the Rack
if (e.action == GLFW_PRESS && e.pos.y < 25)
return;
ImGuiWidget::onButton(e);
}
void ImGuiTextEditor::onHoverScroll(const HoverScrollEvent& e)
{
// use Rack view scrolling if there is no scrollbar
if (pData->editor.GetTotalLines() < 27)
return;
// if there is a scrollbar, handle the event
ImGuiWidget::onHoverScroll(e);
}
/*
void ImGuiTextEditor::onSelectKey(const SelectKeyEvent& e)
{

View file

@ -59,6 +59,8 @@ struct ImGuiTextEditor : ImGuiWidget
protected:
/** @internal */
void drawImGui() override;
void onButton(const ButtonEvent& e) override;
void onHoverScroll(const HoverScrollEvent& e) override;
/*
void onSelectKey(const SelectKeyEvent& e) override;
*/

View file

@ -165,62 +165,9 @@ void ImGuiWidget::onContextDestroy(const ContextDestroyEvent& e)
OpenGlWidget::onContextDestroy(e);
}
void ImGuiWidget::drawFramebuffer()
void ImGuiWidget::setAsCurrentContext()
{
ImGui::SetCurrentContext(imData->context);
ImGuiIO& io(ImGui::GetIO());
const math::Vec fbSize = getFramebufferSize();
const float scaleFactor = APP->window->pixelRatio;
if (d_isNotEqual(imData->scaleFactor, scaleFactor))
{
imData->scaleFactor = scaleFactor;
ImGuiStyle& style(ImGui::GetStyle());
new(&style)ImGuiStyle();
imData->resetStyle();
if (! imData->fontGenerated)
{
imData->originalScaleFactor = scaleFactor;
imData->generateFontIfNeeded();
}
else
{
io.FontGlobalScale = scaleFactor / imData->originalScaleFactor;
}
}
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, box.size.x * scaleFactor, box.size.y * scaleFactor, 0.0, -1.0, 1.0);
glViewport(0.0, 0.0, fbSize.x, fbSize.y);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
io.DisplaySize = ImVec2(box.size.x * scaleFactor, box.size.y * scaleFactor);
io.DisplayFramebufferScale = ImVec2(fbSize.x / (box.size.x * scaleFactor), fbSize.y / (box.size.y * scaleFactor));
if (!imData->created)
{
ImGui_ImplOpenGL2_Init();
imData->created = true;
}
// TODO io.DeltaTime
ImGui_ImplOpenGL2_NewFrame();
ImGui::NewFrame();
drawImGui();
ImGui::Render();
if (ImDrawData* const data = ImGui::GetDrawData())
ImGui_ImplOpenGL2_RenderDrawData(data);
}
void ImGuiWidget::onHover(const HoverEvent& e)
@ -358,3 +305,61 @@ void ImGuiWidget::onSelectText(const SelectTextEvent& e)
if (io.WantCaptureKeyboard)
e.consume(this);
}
void ImGuiWidget::drawFramebuffer()
{
ImGui::SetCurrentContext(imData->context);
ImGuiIO& io(ImGui::GetIO());
const math::Vec fbSize = getFramebufferSize();
const float scaleFactor = APP->window->pixelRatio;
if (d_isNotEqual(imData->scaleFactor, scaleFactor))
{
imData->scaleFactor = scaleFactor;
ImGuiStyle& style(ImGui::GetStyle());
new(&style)ImGuiStyle();
imData->resetStyle();
if (! imData->fontGenerated)
{
imData->originalScaleFactor = scaleFactor;
imData->generateFontIfNeeded();
}
else
{
io.FontGlobalScale = scaleFactor / imData->originalScaleFactor;
}
}
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, box.size.x * scaleFactor, box.size.y * scaleFactor, 0.0, -1.0, 1.0);
glViewport(0.0, 0.0, fbSize.x, fbSize.y);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
io.DisplaySize = ImVec2(box.size.x * scaleFactor, box.size.y * scaleFactor);
io.DisplayFramebufferScale = ImVec2(fbSize.x / (box.size.x * scaleFactor), fbSize.y / (box.size.y * scaleFactor));
if (!imData->created)
{
ImGui_ImplOpenGL2_Init();
imData->created = true;
}
// TODO io.DeltaTime
ImGui_ImplOpenGL2_NewFrame();
ImGui::NewFrame();
drawImGui();
ImGui::Render();
if (ImDrawData* const data = ImGui::GetDrawData())
ImGui_ImplOpenGL2_RenderDrawData(data);
}

View file

@ -27,21 +27,11 @@ struct ImGuiWidget : OpenGlWidget {
ImGuiWidget();
~ImGuiWidget() override;
virtual void drawImGui()
{
ImGui::SetNextWindowPos(ImVec2(0, 0));
ImGui::SetNextWindowSize(ImVec2(box.size.x, box.size.y));
ImGui::ShowDemoWindow();
}
float getScaleFactor() const noexcept;
protected:
void onContextCreate(const ContextCreateEvent& e) override;
void onContextDestroy(const ContextDestroyEvent& e) override;
private:
void drawFramebuffer() override;
void onHover(const HoverEvent& e) override;
void onDragHover(const DragHoverEvent& e) override;
void onDragLeave(const DragLeaveEvent& e) override;
@ -49,4 +39,15 @@ private:
void onButton(const ButtonEvent& e) override;
void onSelectKey(const SelectKeyEvent& e) override;
void onSelectText(const SelectTextEvent& e) override;
void setAsCurrentContext();
virtual void drawImGui()
{
ImGui::SetNextWindowPos(ImVec2(0, 0));
ImGui::SetNextWindowSize(ImVec2(box.size.x, box.size.y));
ImGui::ShowDemoWindow();
}
private:
void drawFramebuffer() override;
};

View file

@ -71,6 +71,7 @@ struct TextEditorModule : Module {
widget->setText(text);
}
#endif
return;
}
if (json_t* const widthJ = json_object_get(rootJ, "width"))
@ -202,7 +203,7 @@ struct TextEditorLoadFileItem : MenuItem {
text = "Load File";
}
void onAction(const event::Action &e) override
void onAction(const event::Action&) override
{
TextEditorModule* const module = this->module;;
WeakPtr<ImGuiTextEditor> widget = this->widget;