From 538d5f82c141536c3517ff8321be8ed7316fbd3a Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 5 Nov 2019 20:55:50 +0100 Subject: [PATCH] HackStudio: Allow switching between editors with Ctrl+E / Ctrl+Shift+E --- DevTools/HackStudio/EditorWrapper.h | 6 +++++ DevTools/HackStudio/main.cpp | 34 ++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/DevTools/HackStudio/EditorWrapper.h b/DevTools/HackStudio/EditorWrapper.h index 2180d8da736..c84c5e4e98b 100644 --- a/DevTools/HackStudio/EditorWrapper.h +++ b/DevTools/HackStudio/EditorWrapper.h @@ -24,3 +24,9 @@ private: RefPtr m_cursor_label; RefPtr m_editor; }; + +template<> +inline bool is(const CObject& object) +{ + return !strcmp(object.class_name(), "EditorWrapper"); +} diff --git a/DevTools/HackStudio/main.cpp b/DevTools/HackStudio/main.cpp index 47a8b043c64..a53a921479b 100644 --- a/DevTools/HackStudio/main.cpp +++ b/DevTools/HackStudio/main.cpp @@ -133,12 +133,36 @@ int main(int argc, char** argv) auto switch_to_next_editor = GAction::create("Switch to next editor", { Mod_Ctrl, Key_E }, [&](auto&) { if (g_all_editor_wrappers.size() <= 1) return; - // FIXME: This will only work correctly when there are 2 editors. Make it work for any editor count. - for (auto& wrapper : g_all_editor_wrappers) { - if (&wrapper == ¤t_editor_wrapper()) - continue; - wrapper.editor().set_focus(true); + Vector wrappers; + inner_splitter->for_each_child_of_type([&](auto& child) { + wrappers.append(&child); + return IterationDecision::Continue; + }); + for (int i = 0; i < wrappers.size(); ++i) { + if (g_current_editor_wrapper.ptr() == wrappers[i]) { + if (i == wrappers.size() - 1) + wrappers[0]->editor().set_focus(true); + else + wrappers[i + 1]->editor().set_focus(true); + } + } + }); + + auto switch_to_previous_editor = GAction::create("Switch to previous editor", { Mod_Ctrl | Mod_Shift, Key_E }, [&](auto&) { + if (g_all_editor_wrappers.size() <= 1) return; + Vector wrappers; + inner_splitter->for_each_child_of_type([&](auto& child) { + wrappers.append(&child); + return IterationDecision::Continue; + }); + for (int i = wrappers.size() - 1; i >= 0; --i) { + if (g_current_editor_wrapper.ptr() == wrappers[i]) { + if (i == 0) + wrappers.last()->editor().set_focus(true); + else + wrappers[i - 1]->editor().set_focus(true); + } } });