TextEditor: Add undo, redo, cut, copy, paste actions
Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
parent
cd2dd92549
commit
5c3367299e
3 changed files with 81 additions and 36 deletions
|
|
@ -133,6 +133,51 @@ std::string ImGuiTextEditor::getCurrentLineText()const
|
||||||
return pData->editor.GetCurrentLineText();
|
return pData->editor.GetCurrentLineText();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ImGuiTextEditor::hasSelection() const
|
||||||
|
{
|
||||||
|
return pData->editor.HasSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGuiTextEditor::selectAll()
|
||||||
|
{
|
||||||
|
pData->editor.SelectAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGuiTextEditor::copy()
|
||||||
|
{
|
||||||
|
pData->editor.Copy();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGuiTextEditor::cut()
|
||||||
|
{
|
||||||
|
pData->editor.Cut();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGuiTextEditor::paste()
|
||||||
|
{
|
||||||
|
pData->editor.Paste();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImGuiTextEditor::canUndo() const
|
||||||
|
{
|
||||||
|
return pData->editor.CanUndo();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImGuiTextEditor::canRedo() const
|
||||||
|
{
|
||||||
|
return pData->editor.CanRedo();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGuiTextEditor::undo()
|
||||||
|
{
|
||||||
|
pData->editor.Undo();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGuiTextEditor::redo()
|
||||||
|
{
|
||||||
|
pData->editor.Redo();
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
void ImGuiTextEditor::drawImGui()
|
void ImGuiTextEditor::drawImGui()
|
||||||
|
|
@ -163,8 +208,6 @@ void ImGuiTextEditor::drawImGui()
|
||||||
|
|
||||||
void ImGuiTextEditor::onButton(const ButtonEvent& e)
|
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 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)
|
if (e.action == GLFW_PRESS && e.pos.y < 25)
|
||||||
return;
|
return;
|
||||||
|
|
@ -181,26 +224,3 @@ void ImGuiTextEditor::onHoverScroll(const HoverScrollEvent& e)
|
||||||
// if there is a scrollbar, handle the event
|
// if there is a scrollbar, handle the event
|
||||||
ImGuiWidget::onHoverScroll(e);
|
ImGuiWidget::onHoverScroll(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void ImGuiTextEditor::onSelectKey(const SelectKeyEvent& e)
|
|
||||||
{
|
|
||||||
ImGuiWidget::onSelectKey(e);
|
|
||||||
|
|
||||||
if (e.action == GLFW_PRESS && (e.mods & GLFW_MOD_CONTROL) != 0)
|
|
||||||
{
|
|
||||||
switch (e.key)
|
|
||||||
{
|
|
||||||
case GLFW_KEY_X:
|
|
||||||
pData->editor.Cut();
|
|
||||||
break;
|
|
||||||
case GLFW_KEY_C:
|
|
||||||
pData->editor.Copy();
|
|
||||||
break;
|
|
||||||
case GLFW_KEY_V:
|
|
||||||
pData->editor.Paste();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Syntax highlighting text editor (for ImGui in DPF, converted to VCV)
|
* Syntax highlighting text editor (for ImGui in DPF, converted to VCV)
|
||||||
* Copyright (C) 2021 Filipe Coelho <falktx@falktx.com>
|
* Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com>
|
||||||
* Copyright (c) 2017 BalazsJako
|
* Copyright (c) 2017 BalazsJako
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
|
@ -56,12 +56,21 @@ struct ImGuiTextEditor : ImGuiWidget
|
||||||
std::string getSelectedText() const;
|
std::string getSelectedText() const;
|
||||||
std::string getCurrentLineText()const;
|
std::string getCurrentLineText()const;
|
||||||
|
|
||||||
|
bool hasSelection() const;
|
||||||
|
void selectAll();
|
||||||
|
|
||||||
|
void copy();
|
||||||
|
void cut();
|
||||||
|
void paste();
|
||||||
|
|
||||||
|
bool canUndo() const;
|
||||||
|
bool canRedo() const;
|
||||||
|
void undo();
|
||||||
|
void redo();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** @internal */
|
/** @internal */
|
||||||
void drawImGui() override;
|
void drawImGui() override;
|
||||||
void onButton(const ButtonEvent& e) override;
|
void onButton(const ButtonEvent& e) override;
|
||||||
void onHoverScroll(const HoverScrollEvent& e) override;
|
void onHoverScroll(const HoverScrollEvent& e) override;
|
||||||
/*
|
|
||||||
void onSelectKey(const SelectKeyEvent& e) override;
|
|
||||||
*/
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -364,13 +364,6 @@ struct TextEditorModuleWidget : ModuleWidget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void appendContextMenu(Menu *menu) override
|
|
||||||
{
|
|
||||||
menu->addChild(new MenuSeparator);
|
|
||||||
menu->addChild(new TextEditorLoadFileItem(textEditorModule, textEditorWidget));
|
|
||||||
menu->addChild(new TextEditorLangSelectMenuItem(textEditorModule, textEditorWidget));
|
|
||||||
}
|
|
||||||
|
|
||||||
void step() override
|
void step() override
|
||||||
{
|
{
|
||||||
if (textEditorModule)
|
if (textEditorModule)
|
||||||
|
|
@ -394,6 +387,29 @@ struct TextEditorModuleWidget : ModuleWidget {
|
||||||
ModuleWidget::draw(args);
|
ModuleWidget::draw(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void appendContextMenu(Menu* const menu) override
|
||||||
|
{
|
||||||
|
menu->addChild(new MenuSeparator);
|
||||||
|
menu->addChild(new TextEditorLoadFileItem(textEditorModule, textEditorWidget));
|
||||||
|
menu->addChild(new TextEditorLangSelectMenuItem(textEditorModule, textEditorWidget));
|
||||||
|
|
||||||
|
menu->addChild(new ui::MenuSeparator);
|
||||||
|
menu->addChild(createMenuItem("Undo", RACK_MOD_CTRL_NAME "+Z", [=]{ textEditorWidget->undo(); },
|
||||||
|
!textEditorWidget->canUndo()));
|
||||||
|
menu->addChild(createMenuItem("Redo", RACK_MOD_CTRL_NAME "+Y", [=]{ textEditorWidget->redo(); },
|
||||||
|
!textEditorWidget->canRedo()));
|
||||||
|
|
||||||
|
menu->addChild(new ui::MenuSeparator);
|
||||||
|
menu->addChild(createMenuItem("Cut", RACK_MOD_CTRL_NAME "+X", [=]{ textEditorWidget->cut(); },
|
||||||
|
!textEditorWidget->hasSelection()));
|
||||||
|
menu->addChild(createMenuItem("Copy", RACK_MOD_CTRL_NAME "+C", [=]{ textEditorWidget->copy(); },
|
||||||
|
!textEditorWidget->hasSelection()));
|
||||||
|
menu->addChild(createMenuItem("Paste", RACK_MOD_CTRL_NAME "+V", [=]{ textEditorWidget->paste(); }));
|
||||||
|
|
||||||
|
menu->addChild(new ui::MenuSeparator);
|
||||||
|
menu->addChild(createMenuItem("Select all", RACK_MOD_CTRL_NAME "+A", [=]{ textEditorWidget->selectAll(); }));
|
||||||
|
}
|
||||||
|
|
||||||
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(TextEditorModuleWidget)
|
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(TextEditorModuleWidget)
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue