Files
ox/src/nostalgia/studio/studioapp.hpp
T

90 lines
2.0 KiB
C++

/*
* Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#pragma once
#include <ox/event/signal.hpp>
#include <ox/std/memory.hpp>
#include <ox/std/string.hpp>
#include "lib/editor.hpp"
#include "lib/module.hpp"
#include "lib/project.hpp"
#include "lib/task.hpp"
#include "aboutpopup.hpp"
#include "newmenu.hpp"
#include "projectexplorer.hpp"
#include "projecttreemodel.hpp"
namespace nostalgia {
class StudioUI: public ox::SignalHandler {
friend class StudioUIDrawer;
private:
ox::UniquePtr<studio::Project> m_project;
studio::TaskRunner m_taskRunner;
core::Context *m_ctx = nullptr;
ox::Vector<ox::UniquePtr<studio::BaseEditor>> m_editors;
ox::Vector<ox::UniquePtr<studio::Widget>> m_widgets;
ox::HashMap<ox::String, studio::EditorMaker::Func> m_editorMakers;
ox::UniquePtr<ProjectExplorer> m_projectExplorer;
ox::Vector<ox::String> m_openFiles;
studio::BaseEditor *m_activeEditor = nullptr;
studio::BaseEditor *m_activeEditorUpdatePending = nullptr;
NewMenu m_newMenu;
AboutPopup m_aboutPopup;
const ox::Array<studio::Popup*, 2> m_popups = {
&m_newMenu,
&m_aboutPopup
};
bool m_showProjectExplorer = true;
public:
explicit StudioUI(core::Context *ctx) noexcept;
void update() noexcept;
void handleKeyEvent(core::Key, bool down) noexcept;
[[nodiscard]]
constexpr auto project() noexcept {
return m_project.get();
}
protected:
void draw() noexcept;
private:
void drawMenu() noexcept;
void drawTabBar() noexcept;
void drawTabs() noexcept;
void loadEditorMaker(const studio::EditorMaker &editorMaker) noexcept;
void loadModule(studio::Module *module) noexcept;
void loadModules() noexcept;
void toggleProjectExplorer() noexcept;
void redo() noexcept;
void undo() noexcept;
void save() noexcept;
ox::Error openProject(ox::CRStringView path) noexcept;
ox::Error openFile(ox::CRStringView path) noexcept;
ox::Error openFileActiveTab(ox::CRStringView path, bool makeActiveTab) noexcept;
ox::Error closeFile(const ox::String &path) noexcept;
};
}