TextEditor: Pass-through scroll and click events to Rack as needed
Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
parent
362cf9b2b9
commit
1a4534bf22
5 changed files with 95 additions and 65 deletions
|
|
@ -158,6 +158,27 @@ void ImGuiTextEditor::drawImGui()
|
||||||
ImGui::End();
|
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)
|
void ImGuiTextEditor::onSelectKey(const SelectKeyEvent& e)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,8 @@ struct ImGuiTextEditor : ImGuiWidget
|
||||||
protected:
|
protected:
|
||||||
/** @internal */
|
/** @internal */
|
||||||
void drawImGui() override;
|
void drawImGui() override;
|
||||||
|
void onButton(const ButtonEvent& e) override;
|
||||||
|
void onHoverScroll(const HoverScrollEvent& e) override;
|
||||||
/*
|
/*
|
||||||
void onSelectKey(const SelectKeyEvent& e) override;
|
void onSelectKey(const SelectKeyEvent& e) override;
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -165,62 +165,9 @@ void ImGuiWidget::onContextDestroy(const ContextDestroyEvent& e)
|
||||||
OpenGlWidget::onContextDestroy(e);
|
OpenGlWidget::onContextDestroy(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGuiWidget::drawFramebuffer()
|
void ImGuiWidget::setAsCurrentContext()
|
||||||
{
|
{
|
||||||
ImGui::SetCurrentContext(imData->context);
|
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)
|
void ImGuiWidget::onHover(const HoverEvent& e)
|
||||||
|
|
@ -358,3 +305,61 @@ void ImGuiWidget::onSelectText(const SelectTextEvent& e)
|
||||||
if (io.WantCaptureKeyboard)
|
if (io.WantCaptureKeyboard)
|
||||||
e.consume(this);
|
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);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,21 +27,11 @@ struct ImGuiWidget : OpenGlWidget {
|
||||||
ImGuiWidget();
|
ImGuiWidget();
|
||||||
~ImGuiWidget() override;
|
~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;
|
float getScaleFactor() const noexcept;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void onContextCreate(const ContextCreateEvent& e) override;
|
void onContextCreate(const ContextCreateEvent& e) override;
|
||||||
void onContextDestroy(const ContextDestroyEvent& e) override;
|
void onContextDestroy(const ContextDestroyEvent& e) override;
|
||||||
|
|
||||||
private:
|
|
||||||
void drawFramebuffer() override;
|
|
||||||
void onHover(const HoverEvent& e) override;
|
void onHover(const HoverEvent& e) override;
|
||||||
void onDragHover(const DragHoverEvent& e) override;
|
void onDragHover(const DragHoverEvent& e) override;
|
||||||
void onDragLeave(const DragLeaveEvent& e) override;
|
void onDragLeave(const DragLeaveEvent& e) override;
|
||||||
|
|
@ -49,4 +39,15 @@ private:
|
||||||
void onButton(const ButtonEvent& e) override;
|
void onButton(const ButtonEvent& e) override;
|
||||||
void onSelectKey(const SelectKeyEvent& e) override;
|
void onSelectKey(const SelectKeyEvent& e) override;
|
||||||
void onSelectText(const SelectTextEvent& 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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,7 @@ struct TextEditorModule : Module {
|
||||||
widget->setText(text);
|
widget->setText(text);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (json_t* const widthJ = json_object_get(rootJ, "width"))
|
if (json_t* const widthJ = json_object_get(rootJ, "width"))
|
||||||
|
|
@ -202,7 +203,7 @@ struct TextEditorLoadFileItem : MenuItem {
|
||||||
text = "Load File";
|
text = "Load File";
|
||||||
}
|
}
|
||||||
|
|
||||||
void onAction(const event::Action &e) override
|
void onAction(const event::Action&) override
|
||||||
{
|
{
|
||||||
TextEditorModule* const module = this->module;;
|
TextEditorModule* const module = this->module;;
|
||||||
WeakPtr<ImGuiTextEditor> widget = this->widget;
|
WeakPtr<ImGuiTextEditor> widget = this->widget;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue