[nostalgia,studio] Cleanup

This commit is contained in:
Gary Talent 2023-12-10 17:03:51 -06:00
parent 8c9ebbedae
commit 3ac3b7b5e6
35 changed files with 98 additions and 102 deletions

View File

@ -30,7 +30,7 @@ ox::CStringView PaletteEditorImGui::itemDisplayName() const noexcept {
return m_itemName; return m_itemName;
} }
void PaletteEditorImGui::draw(turbine::Context*) noexcept { void PaletteEditorImGui::draw(turbine::Context&) noexcept {
static constexpr auto flags = ImGuiTableFlags_RowBg; static constexpr auto flags = ImGuiTableFlags_RowBg;
const auto paneSize = ImGui::GetContentRegionAvail(); const auto paneSize = ImGui::GetContentRegionAvail();
ImGui::BeginChild("Colors", ImVec2(paneSize.x - 208, paneSize.y), true); ImGui::BeginChild("Colors", ImVec2(paneSize.x - 208, paneSize.y), true);
@ -42,14 +42,14 @@ void PaletteEditorImGui::draw(turbine::Context*) noexcept {
if (ImGui::Button("Add", sz)) { if (ImGui::Button("Add", sz)) {
const auto colorSz = static_cast<int>(m_pal.colors.size()); const auto colorSz = static_cast<int>(m_pal.colors.size());
constexpr Color16 c = 0; constexpr Color16 c = 0;
undoStack()->push(ox::make<AddColorCommand>(&m_pal, c, colorSz)); undoStack()->push(ox::make_unique<AddColorCommand>(&m_pal, c, colorSz));
} }
ImGui::SameLine(); ImGui::SameLine();
ImGui::BeginDisabled(m_selectedRow >= m_pal.colors.size()); ImGui::BeginDisabled(m_selectedRow >= m_pal.colors.size());
{ {
if (ImGui::Button("Remove", sz)) { if (ImGui::Button("Remove", sz)) {
undoStack()->push( undoStack()->push(
ox::make<RemoveColorCommand>( ox::make_unique<RemoveColorCommand>(
&m_pal, &m_pal,
m_pal.colors[static_cast<std::size_t>(m_selectedRow)], m_pal.colors[static_cast<std::size_t>(m_selectedRow)],
static_cast<int>(m_selectedRow))); static_cast<int>(m_selectedRow)));
@ -59,7 +59,7 @@ void PaletteEditorImGui::draw(turbine::Context*) noexcept {
ImGui::BeginDisabled(m_selectedRow <= 0); ImGui::BeginDisabled(m_selectedRow <= 0);
{ {
if (ImGui::Button("Move Up", sz)) { if (ImGui::Button("Move Up", sz)) {
undoStack()->push(ox::make<MoveColorCommand>(&m_pal, m_selectedRow, -1)); undoStack()->push(ox::make_unique<MoveColorCommand>(&m_pal, m_selectedRow, -1));
--m_selectedRow; --m_selectedRow;
} }
} }
@ -68,7 +68,7 @@ void PaletteEditorImGui::draw(turbine::Context*) noexcept {
ImGui::BeginDisabled(m_selectedRow >= m_pal.colors.size() - 1); ImGui::BeginDisabled(m_selectedRow >= m_pal.colors.size() - 1);
{ {
if (ImGui::Button("Move Down", sz)) { if (ImGui::Button("Move Down", sz)) {
undoStack()->push(ox::make<MoveColorCommand>(&m_pal, m_selectedRow, 1)); undoStack()->push(ox::make_unique<MoveColorCommand>(&m_pal, m_selectedRow, 1));
++m_selectedRow; ++m_selectedRow;
} }
} }
@ -131,7 +131,7 @@ void PaletteEditorImGui::draw(turbine::Context*) noexcept {
ImGui::InputInt("Blue", &b, 1, 5); ImGui::InputInt("Blue", &b, 1, 5);
const auto newColor = color16(r, g, b, a); const auto newColor = color16(r, g, b, a);
if (c != newColor) { if (c != newColor) {
undoStack()->push(ox::make<UpdateColorCommand>(&m_pal, static_cast<int>(m_selectedRow), c, newColor)); undoStack()->push(ox::make_unique<UpdateColorCommand>(&m_pal, static_cast<int>(m_selectedRow), c, newColor));
} }
} }
ImGui::EndChild(); ImGui::EndChild();

View File

@ -30,7 +30,7 @@ class PaletteEditorImGui: public studio::Editor {
ox::CStringView itemDisplayName() const noexcept final; ox::CStringView itemDisplayName() const noexcept final;
void draw(turbine::Context*) noexcept final; void draw(turbine::Context&) noexcept final;
protected: protected:
ox::Error saveItem() noexcept final; ox::Error saveItem() noexcept final;

View File

@ -106,7 +106,7 @@ void TileSheetEditorImGui::keyStateChanged(turbine::Key key, bool down) {
} }
} }
void TileSheetEditorImGui::draw(turbine::Context*) noexcept { void TileSheetEditorImGui::draw(turbine::Context&) noexcept {
const auto paneSize = ImGui::GetContentRegionAvail(); const auto paneSize = ImGui::GetContentRegionAvail();
const auto tileSheetParentSize = ImVec2(paneSize.x - m_palViewWidth, paneSize.y); const auto tileSheetParentSize = ImVec2(paneSize.x - m_palViewWidth, paneSize.y);
const auto fbSize = ox::Vec2(tileSheetParentSize.x - 16, tileSheetParentSize.y - 16); const auto fbSize = ox::Vec2(tileSheetParentSize.x - 16, tileSheetParentSize.y - 16);

View File

@ -73,7 +73,7 @@ class TileSheetEditorImGui: public studio::BaseEditor {
void keyStateChanged(turbine::Key key, bool down) override; void keyStateChanged(turbine::Key key, bool down) override;
void draw(turbine::Context*) noexcept override; void draw(turbine::Context&) noexcept override;
void drawSubsheetSelector(TileSheet::SubSheet*, TileSheet::SubSheetIdx *path); void drawSubsheetSelector(TileSheet::SubSheet*, TileSheet::SubSheetIdx *path);

View File

@ -281,7 +281,7 @@ void TileSheetEditorModel::getFillPixels(bool *pixels, ox::Point const&pt, int o
} }
void TileSheetEditorModel::pushCommand(studio::UndoCommand *cmd) noexcept { void TileSheetEditorModel::pushCommand(studio::UndoCommand *cmd) noexcept {
m_undoStack.push(cmd); m_undoStack.push(ox::UPtr<studio::UndoCommand>(cmd));
m_ongoingDrawCommand = dynamic_cast<DrawCommand*>(cmd); m_ongoingDrawCommand = dynamic_cast<DrawCommand*>(cmd);
m_updated = true; m_updated = true;
} }

View File

@ -28,7 +28,7 @@ ox::CStringView SceneEditorImGui::itemDisplayName() const noexcept {
return m_itemName; return m_itemName;
} }
void SceneEditorImGui::draw(turbine::Context*) noexcept { void SceneEditorImGui::draw(turbine::Context&) noexcept {
auto const paneSize = ImGui::GetContentRegionAvail(); auto const paneSize = ImGui::GetContentRegionAvail();
m_view.draw(ox::Size{static_cast<int>(paneSize.x), static_cast<int>(paneSize.y)}); m_view.draw(ox::Size{static_cast<int>(paneSize.x), static_cast<int>(paneSize.y)});
auto &fb = m_view.framebuffer(); auto &fb = m_view.framebuffer();

View File

@ -32,7 +32,7 @@ class SceneEditorImGui: public studio::Editor {
ox::CStringView itemDisplayName() const noexcept final; ox::CStringView itemDisplayName() const noexcept final;
void draw(turbine::Context*) noexcept final; void draw(turbine::Context&) noexcept final;
void onActivated() noexcept override; void onActivated() noexcept override;

View File

@ -25,7 +25,7 @@ bool AboutPopup::isOpen() const noexcept {
return m_stage == Stage::Open; return m_stage == Stage::Open;
} }
void AboutPopup::draw(turbine::Context *ctx) noexcept { void AboutPopup::draw(turbine::Context &ctx) noexcept {
switch (m_stage) { switch (m_stage) {
case Stage::Closed: case Stage::Closed:
break; break;

View File

@ -35,7 +35,7 @@ class AboutPopup: public studio::Popup {
[[nodiscard]] [[nodiscard]]
bool isOpen() const noexcept override; bool isOpen() const noexcept override;
void draw(turbine::Context *ctx) noexcept override; void draw(turbine::Context &ctx) noexcept override;
}; };

View File

@ -22,7 +22,7 @@ ox::CStringView ClawEditor::itemDisplayName() const noexcept {
return m_itemDisplayName; return m_itemDisplayName;
} }
void ClawEditor::draw(turbine::Context*) noexcept { void ClawEditor::draw(turbine::Context&) noexcept {
//const auto paneSize = ImGui::GetContentRegionAvail(); //const auto paneSize = ImGui::GetContentRegionAvail();
ImGui::BeginChild("PaletteEditor"); ImGui::BeginChild("PaletteEditor");
static constexpr auto flags = ImGuiTableFlags_RowBg | ImGuiTableFlags_NoBordersInBody; static constexpr auto flags = ImGuiTableFlags_RowBg | ImGuiTableFlags_NoBordersInBody;

View File

@ -27,7 +27,7 @@ class ClawEditor: public studio::Editor {
ox::CStringView itemDisplayName() const noexcept final; ox::CStringView itemDisplayName() const noexcept final;
void draw(turbine::Context*) noexcept final; void draw(turbine::Context&) noexcept final;
private: private:
static void drawRow(const ox::ModelValue &value) noexcept; static void drawRow(const ox::ModelValue &value) noexcept;

View File

@ -8,7 +8,7 @@
namespace studio { namespace studio {
studio::TaskState FileDialogManager::update(turbine::Context *ctx) noexcept { studio::TaskState FileDialogManager::update(turbine::Context &ctx) noexcept {
switch (m_state) { switch (m_state) {
case UpdateProjectPathState::EnableSystemCursor: { case UpdateProjectPathState::EnableSystemCursor: {
// switch to system cursor in this update and open file dialog in the next // switch to system cursor in this update and open file dialog in the next
@ -20,7 +20,7 @@ studio::TaskState FileDialogManager::update(turbine::Context *ctx) noexcept {
// switch to system cursor // switch to system cursor
auto [path, err] = studio::chooseDirectory(); auto [path, err] = studio::chooseDirectory();
// Mac file dialog doesn't restore focus to main window when closed... // Mac file dialog doesn't restore focus to main window when closed...
turbine::focusWindow(*ctx); turbine::focusWindow(ctx);
if (!err) { if (!err) {
err = pathChosen.emitCheckError(path); err = pathChosen.emitCheckError(path);
oxAssert(err, "Path chosen response failed"); oxAssert(err, "Path chosen response failed");

View File

@ -33,7 +33,7 @@ class FileDialogManager : public studio::Task {
~FileDialogManager() noexcept override = default; ~FileDialogManager() noexcept override = default;
studio::TaskState update(turbine::Context *ctx) noexcept final; studio::TaskState update(turbine::Context &ctx) noexcept final;
// signals // signals
ox::Signal<ox::Error(const ox::String &)> pathChosen; ox::Signal<ox::Error(const ox::String &)> pathChosen;

View File

@ -6,7 +6,6 @@
#include <imgui.h> #include <imgui.h>
#include <studio/context.hpp>
#include <studio/imguiuitl.hpp> #include <studio/imguiuitl.hpp>
#include "newmenu.hpp" #include "newmenu.hpp"
@ -32,7 +31,7 @@ bool NewMenu::isOpen() const noexcept {
return m_open; return m_open;
} }
void NewMenu::draw(turbine::Context *ctx) noexcept { void NewMenu::draw(turbine::Context &ctx) noexcept {
switch (m_stage) { switch (m_stage) {
case Stage::Opening: case Stage::Opening:
ImGui::OpenPopup(title().c_str()); ImGui::OpenPopup(title().c_str());
@ -60,7 +59,7 @@ void NewMenu::addItemMaker(ox::UniquePtr<studio::ItemMaker> im) noexcept {
}); });
} }
void NewMenu::drawNewItemType(turbine::Context *ctx) noexcept { void NewMenu::drawNewItemType(turbine::Context &ctx) noexcept {
drawWindow(ctx, &m_open, [this] { drawWindow(ctx, &m_open, [this] {
auto items = ox_malloca(m_types.size() * sizeof(const char*), const char*, nullptr); auto items = ox_malloca(m_types.size() * sizeof(const char*), const char*, nullptr);
for (auto i = 0u; const auto &im : m_types) { for (auto i = 0u; const auto &im : m_types) {
@ -72,8 +71,8 @@ void NewMenu::drawNewItemType(turbine::Context *ctx) noexcept {
}); });
} }
void NewMenu::drawNewItemName(turbine::Context *ctx) noexcept { void NewMenu::drawNewItemName(turbine::Context &ctx) noexcept {
drawWindow(ctx, &m_open, [this, ctx] { drawWindow(ctx, &m_open, [this, &ctx] {
const auto typeIdx = static_cast<std::size_t>(m_selectedType); const auto typeIdx = static_cast<std::size_t>(m_selectedType);
if (typeIdx < m_types.size()) { if (typeIdx < m_types.size()) {
ImGui::InputText("Name", m_itemName.data(), m_itemName.cap()); ImGui::InputText("Name", m_itemName.data(), m_itemName.cap());
@ -96,7 +95,7 @@ void NewMenu::drawFirstPageButtons() noexcept {
} }
} }
void NewMenu::drawLastPageButtons(turbine::Context *ctx) noexcept { void NewMenu::drawLastPageButtons(turbine::Context &ctx) noexcept {
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetContentRegionAvail().x - 138); ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetContentRegionAvail().x - 138);
ImGui::SetCursorPosY(ImGui::GetCursorPosY() + ImGui::GetContentRegionAvail().y - 20); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + ImGui::GetContentRegionAvail().y - 20);
if (ImGui::Button("Back")) { if (ImGui::Button("Back")) {
@ -113,7 +112,7 @@ void NewMenu::drawLastPageButtons(turbine::Context *ctx) noexcept {
} }
} }
void NewMenu::finish(turbine::Context *ctx) noexcept { void NewMenu::finish(turbine::Context &ctx) noexcept {
const auto err = m_types[static_cast<std::size_t>(m_selectedType)]->write(ctx, m_itemName); const auto err = m_types[static_cast<std::size_t>(m_selectedType)]->write(ctx, m_itemName);
if (err) { if (err) {
oxLogError(err); oxLogError(err);

View File

@ -43,7 +43,7 @@ class NewMenu: public studio::Popup {
[[nodiscard]] [[nodiscard]]
bool isOpen() const noexcept override; bool isOpen() const noexcept override;
void draw(turbine::Context *ctx) noexcept override; void draw(turbine::Context &ctx) noexcept override;
template<typename T> template<typename T>
void addItemType(ox::String name, ox::String parentDir, ox::String fileExt, T itemTempl, ox::ClawFormat pFmt = ox::ClawFormat::Metal) noexcept; void addItemType(ox::String name, ox::String parentDir, ox::String fileExt, T itemTempl, ox::ClawFormat pFmt = ox::ClawFormat::Metal) noexcept;
@ -54,15 +54,15 @@ class NewMenu: public studio::Popup {
void addItemMaker(ox::UniquePtr<studio::ItemMaker> im) noexcept; void addItemMaker(ox::UniquePtr<studio::ItemMaker> im) noexcept;
private: private:
void drawNewItemType(turbine::Context *ctx) noexcept; void drawNewItemType(turbine::Context &ctx) noexcept;
void drawNewItemName(turbine::Context *ctx) noexcept; void drawNewItemName(turbine::Context &ctx) noexcept;
void drawFirstPageButtons() noexcept; void drawFirstPageButtons() noexcept;
void drawLastPageButtons(turbine::Context *ctx) noexcept; void drawLastPageButtons(turbine::Context &ctx) noexcept;
void finish(turbine::Context *ctx) noexcept; void finish(turbine::Context &ctx) noexcept;
}; };

View File

@ -31,11 +31,10 @@ buildProjectTreeModel(ProjectExplorer *explorer, ox::StringView name, ox::CRStri
return out; return out;
} }
ProjectExplorer::ProjectExplorer(turbine::Context *ctx) noexcept { ProjectExplorer::ProjectExplorer(turbine::Context &ctx) noexcept: m_ctx(ctx) {
m_ctx = ctx;
} }
void ProjectExplorer::draw(turbine::Context *ctx) noexcept { void ProjectExplorer::draw(turbine::Context &ctx) noexcept {
const auto viewport = ImGui::GetContentRegionAvail(); const auto viewport = ImGui::GetContentRegionAvail();
ImGui::BeginChild("ProjectExplorer", ImVec2(300, viewport.y), true); ImGui::BeginChild("ProjectExplorer", ImVec2(300, viewport.y), true);
ImGui::SetNextItemOpen(true); ImGui::SetNextItemOpen(true);

View File

@ -15,11 +15,11 @@ namespace studio {
class ProjectExplorer: public studio::Widget { class ProjectExplorer: public studio::Widget {
private: private:
ox::UniquePtr<ProjectTreeModel> m_treeModel; ox::UniquePtr<ProjectTreeModel> m_treeModel;
turbine::Context *m_ctx = nullptr; turbine::Context &m_ctx;
public: public:
explicit ProjectExplorer(turbine::Context *ctx) noexcept; explicit ProjectExplorer(turbine::Context &ctx) noexcept;
void draw(turbine::Context *ctx) noexcept override; void draw(turbine::Context &ctx) noexcept override;
void setModel(ox::UniquePtr<ProjectTreeModel> model) noexcept; void setModel(ox::UniquePtr<ProjectTreeModel> model) noexcept;
@ -27,7 +27,7 @@ class ProjectExplorer: public studio::Widget {
[[nodiscard]] [[nodiscard]]
inline ox::FileSystem *romFs() noexcept { inline ox::FileSystem *romFs() noexcept {
return rom(*m_ctx); return rom(m_ctx);
} }
// slots // slots

View File

@ -23,7 +23,7 @@ ProjectTreeModel::ProjectTreeModel(ProjectTreeModel &&other) noexcept:
m_children(std::move(other.m_children)) { m_children(std::move(other.m_children)) {
} }
void ProjectTreeModel::draw(turbine::Context *ctx) const noexcept { void ProjectTreeModel::draw(turbine::Context &ctx) const noexcept {
constexpr auto dirFlags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick; constexpr auto dirFlags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick;
if (!m_children.empty()) { if (!m_children.empty()) {
if (ImGui::TreeNodeEx(m_name.c_str(), dirFlags)) { if (ImGui::TreeNodeEx(m_name.c_str(), dirFlags)) {

View File

@ -23,7 +23,7 @@ class ProjectTreeModel {
ProjectTreeModel(ProjectTreeModel &&other) noexcept; ProjectTreeModel(ProjectTreeModel &&other) noexcept;
void draw(turbine::Context *ctx) const noexcept; void draw(turbine::Context &ctx) const noexcept;
void setChildren(ox::Vector<ox::UniquePtr<ProjectTreeModel>> children) noexcept; void setChildren(ox::Vector<ox::UniquePtr<ProjectTreeModel>> children) noexcept;

View File

@ -34,7 +34,7 @@ oxModelBegin(StudioConfig)
oxModelEnd() oxModelEnd()
StudioUI::StudioUI(turbine::Context *ctx, ox::StringView projectDir) noexcept: StudioUI::StudioUI(turbine::Context *ctx, ox::StringView projectDir) noexcept:
m_ctx(ctx), m_ctx(*ctx),
m_projectDir(projectDir), m_projectDir(projectDir),
m_projectExplorer(ox::make_unique<ProjectExplorer>(m_ctx)), m_projectExplorer(ox::make_unique<ProjectExplorer>(m_ctx)),
m_aboutPopup(*ctx) { m_aboutPopup(*ctx) {
@ -42,7 +42,7 @@ StudioUI::StudioUI(turbine::Context *ctx, ox::StringView projectDir) noexcept:
ImGui::GetIO().IniFilename = nullptr; ImGui::GetIO().IniFilename = nullptr;
loadModules(); loadModules();
// open project and files // open project and files
const auto [config, err] = studio::readConfig<StudioConfig>(&keelCtx(*ctx)); const auto [config, err] = studio::readConfig<StudioConfig>(keelCtx(*ctx));
m_showProjectExplorer = config.showProjectExplorer; m_showProjectExplorer = config.showProjectExplorer;
if (!err) { if (!err) {
oxIgnoreError(openProject(config.projectPath)); oxIgnoreError(openProject(config.projectPath));
@ -68,7 +68,7 @@ void StudioUI::update() noexcept {
} }
void StudioUI::handleKeyEvent(turbine::Key key, bool down) noexcept { void StudioUI::handleKeyEvent(turbine::Key key, bool down) noexcept {
const auto ctrlDown = turbine::buttonDown(*m_ctx, turbine::Key::Mod_Ctrl); const auto ctrlDown = turbine::buttonDown(m_ctx, turbine::Key::Mod_Ctrl);
for (auto p : m_popups) { for (auto p : m_popups) {
if (p->isOpen()) { if (p->isOpen()) {
if (key == turbine::Key::Escape) { if (key == turbine::Key::Escape) {
@ -89,10 +89,10 @@ void StudioUI::handleKeyEvent(turbine::Key key, bool down) noexcept {
m_newMenu.open(); m_newMenu.open();
break; break;
case turbine::Key::Alpha_O: case turbine::Key::Alpha_O:
m_taskRunner.add(ox::make<FileDialogManager>(this, &StudioUI::openProject)); m_taskRunner.add(*ox::make<FileDialogManager>(this, &StudioUI::openProject));
break; break;
case turbine::Key::Alpha_Q: case turbine::Key::Alpha_Q:
turbine::requestShutdown(*m_ctx); turbine::requestShutdown(m_ctx);
break; break;
case turbine::Key::Alpha_S: case turbine::Key::Alpha_S:
save(); save();
@ -156,13 +156,13 @@ void StudioUI::drawMenu() noexcept {
m_newMenu.open(); m_newMenu.open();
} }
if (ImGui::MenuItem("Open Project...", "Ctrl+O")) { if (ImGui::MenuItem("Open Project...", "Ctrl+O")) {
m_taskRunner.add(ox::make<FileDialogManager>(this, &StudioUI::openProject)); m_taskRunner.add(*ox::make<FileDialogManager>(this, &StudioUI::openProject));
} }
if (ImGui::MenuItem("Save", "Ctrl+S", false, m_activeEditor && m_activeEditor->unsavedChanges())) { if (ImGui::MenuItem("Save", "Ctrl+S", false, m_activeEditor && m_activeEditor->unsavedChanges())) {
m_activeEditor->save(); m_activeEditor->save();
} }
if (ImGui::MenuItem("Quit", "Ctrl+Q")) { if (ImGui::MenuItem("Quit", "Ctrl+Q")) {
turbine::requestShutdown(*m_ctx); turbine::requestShutdown(m_ctx);
} }
ImGui::EndMenu(); ImGui::EndMenu();
} }
@ -223,7 +223,7 @@ void StudioUI::drawTabs() noexcept {
if (ImGui::BeginTabItem(e->itemDisplayName().c_str(), &open, flags)) { if (ImGui::BeginTabItem(e->itemDisplayName().c_str(), &open, flags)) {
if (m_activeEditor != e.get()) { if (m_activeEditor != e.get()) {
m_activeEditor = e.get(); m_activeEditor = e.get();
studio::editConfig<StudioConfig>(&keelCtx(*m_ctx), [&](StudioConfig *config) { studio::editConfig<StudioConfig>(keelCtx(m_ctx), [&](StudioConfig *config) {
config->activeTabItemName = m_activeEditor->itemName(); config->activeTabItemName = m_activeEditor->itemName();
}); });
} }
@ -232,7 +232,7 @@ void StudioUI::drawTabs() noexcept {
} }
if (m_activeEditorOnLastDraw != e.get()) [[unlikely]] { if (m_activeEditorOnLastDraw != e.get()) [[unlikely]] {
m_activeEditor->onActivated(); m_activeEditor->onActivated();
turbine::setConstantRefresh(*m_ctx, m_activeEditor->requiresConstantRefresh()); turbine::setConstantRefresh(m_ctx, m_activeEditor->requiresConstantRefresh());
} }
e->draw(m_ctx); e->draw(m_ctx);
m_activeEditorOnLastDraw = e.get(); m_activeEditorOnLastDraw = e.get();
@ -260,10 +260,10 @@ void StudioUI::loadEditorMaker(studio::EditorMaker const&editorMaker) noexcept {
} }
void StudioUI::loadModule(const studio::Module *mod) noexcept { void StudioUI::loadModule(const studio::Module *mod) noexcept {
for (const auto &editorMaker : mod->editors(*m_ctx)) { for (const auto &editorMaker : mod->editors(m_ctx)) {
loadEditorMaker(editorMaker); loadEditorMaker(editorMaker);
} }
for (auto &im : mod->itemMakers(*m_ctx)) { for (auto &im : mod->itemMakers(m_ctx)) {
m_newMenu.addItemMaker(std::move(im)); m_newMenu.addItemMaker(std::move(im));
} }
} }
@ -276,7 +276,7 @@ void StudioUI::loadModules() noexcept {
void StudioUI::toggleProjectExplorer() noexcept { void StudioUI::toggleProjectExplorer() noexcept {
m_showProjectExplorer = !m_showProjectExplorer; m_showProjectExplorer = !m_showProjectExplorer;
studio::editConfig<StudioConfig>(&keelCtx(*m_ctx), [&](StudioConfig *config) { studio::editConfig<StudioConfig>(keelCtx(m_ctx), [&](StudioConfig *config) {
config->showProjectExplorer = m_showProjectExplorer; config->showProjectExplorer = m_showProjectExplorer;
}); });
} }
@ -303,16 +303,16 @@ void StudioUI::save() noexcept {
ox::Error StudioUI::openProject(ox::CRStringView path) noexcept { ox::Error StudioUI::openProject(ox::CRStringView path) noexcept {
oxRequireM(fs, keel::loadRomFs(path)); oxRequireM(fs, keel::loadRomFs(path));
oxReturnError(keel::setRomFs(keelCtx(*m_ctx), std::move(fs))); oxReturnError(keel::setRomFs(keelCtx(m_ctx), std::move(fs)));
turbine::setWindowTitle(*m_ctx, ox::sfmt("{} - {}", keelCtx(*m_ctx).appName, path)); turbine::setWindowTitle(m_ctx, ox::sfmt("{} - {}", keelCtx(m_ctx).appName, path));
m_project = ox::make_unique<studio::Project>(keelCtx(*m_ctx), ox::String(path), m_projectDir); m_project = ox::make_unique<studio::Project>(keelCtx(m_ctx), ox::String(path), m_projectDir);
auto sctx = applicationData<studio::StudioContext>(*m_ctx); auto sctx = applicationData<studio::StudioContext>(m_ctx);
sctx->project = m_project.get(); sctx->project = m_project.get();
m_project->fileAdded.connect(m_projectExplorer.get(), &ProjectExplorer::refreshProjectTreeModel); m_project->fileAdded.connect(m_projectExplorer.get(), &ProjectExplorer::refreshProjectTreeModel);
m_project->fileDeleted.connect(m_projectExplorer.get(), &ProjectExplorer::refreshProjectTreeModel); m_project->fileDeleted.connect(m_projectExplorer.get(), &ProjectExplorer::refreshProjectTreeModel);
m_openFiles.clear(); m_openFiles.clear();
m_editors.clear(); m_editors.clear();
studio::editConfig<StudioConfig>(&keelCtx(*m_ctx), [&](StudioConfig *config) { studio::editConfig<StudioConfig>(keelCtx(m_ctx), [&](StudioConfig *config) {
config->projectPath = ox::String(path); config->projectPath = ox::String(path);
config->openFiles.clear(); config->openFiles.clear();
}); });
@ -362,7 +362,7 @@ ox::Error StudioUI::openFileActiveTab(ox::CRStringView path, bool makeActiveTab)
m_activeEditorUpdatePending = editor; m_activeEditorUpdatePending = editor;
} }
// save to config // save to config
studio::editConfig<StudioConfig>(&keelCtx(*m_ctx), [&](StudioConfig *config) { studio::editConfig<StudioConfig>(keelCtx(m_ctx), [&](StudioConfig *config) {
if (!config->openFiles.contains(path)) { if (!config->openFiles.contains(path)) {
config->openFiles.emplace_back(path); config->openFiles.emplace_back(path);
} }
@ -376,7 +376,7 @@ ox::Error StudioUI::closeFile(ox::CRStringView path) noexcept {
} }
oxIgnoreError(m_openFiles.erase(std::remove(m_openFiles.begin(), m_openFiles.end(), path))); oxIgnoreError(m_openFiles.erase(std::remove(m_openFiles.begin(), m_openFiles.end(), path)));
// save to config // save to config
studio::editConfig<StudioConfig>(&keelCtx(*m_ctx), [&](StudioConfig *config) { studio::editConfig<StudioConfig>(keelCtx(m_ctx), [&](StudioConfig *config) {
oxIgnoreError(config->openFiles.erase(std::remove(config->openFiles.begin(), config->openFiles.end(), path))); oxIgnoreError(config->openFiles.erase(std::remove(config->openFiles.begin(), config->openFiles.end(), path)));
}); });
return OxError(0); return OxError(0);

View File

@ -23,7 +23,7 @@ class StudioUI: public ox::SignalHandler {
friend class StudioUIDrawer; friend class StudioUIDrawer;
private: private:
turbine::Context *m_ctx = nullptr; turbine::Context &m_ctx;
ox::String m_projectDir; ox::String m_projectDir;
ox::UniquePtr<studio::Project> m_project; ox::UniquePtr<studio::Project> m_project;
studio::TaskRunner m_taskRunner; studio::TaskRunner m_taskRunner;

View File

@ -18,10 +18,10 @@
namespace studio { namespace studio {
[[nodiscard]] [[nodiscard]]
ox::String configPath(const keel::Context *ctx) noexcept; ox::String configPath(keel::Context const&ctx) noexcept;
template<typename T> template<typename T>
ox::Result<T> readConfig(keel::Context *ctx, ox::CRStringView name) noexcept { ox::Result<T> readConfig(keel::Context &ctx, ox::CRStringView name) noexcept {
oxAssert(name != "", "Config type has no TypeName"); oxAssert(name != "", "Config type has no TypeName");
const auto path = ox::sfmt("/{}.json", name); const auto path = ox::sfmt("/{}.json", name);
ox::PassThroughFS fs(configPath(ctx)); ox::PassThroughFS fs(configPath(ctx));
@ -34,13 +34,13 @@ ox::Result<T> readConfig(keel::Context *ctx, ox::CRStringView name) noexcept {
} }
template<typename T> template<typename T>
ox::Result<T> readConfig(keel::Context *ctx) noexcept { ox::Result<T> readConfig(keel::Context &ctx) noexcept {
constexpr auto TypeName = ox::requireModelTypeName<T>(); constexpr auto TypeName = ox::requireModelTypeName<T>();
return readConfig<T>(ctx, TypeName); return readConfig<T>(ctx, TypeName);
} }
template<typename T> template<typename T>
ox::Error writeConfig(keel::Context *ctx, ox::CRStringView name, T *data) noexcept { ox::Error writeConfig(keel::Context &ctx, ox::CRStringView name, T *data) noexcept {
oxAssert(name != "", "Config type has no TypeName"); oxAssert(name != "", "Config type has no TypeName");
const auto path = ox::sfmt("/{}.json", name); const auto path = ox::sfmt("/{}.json", name);
ox::PassThroughFS fs(configPath(ctx)); ox::PassThroughFS fs(configPath(ctx));
@ -58,13 +58,13 @@ ox::Error writeConfig(keel::Context *ctx, ox::CRStringView name, T *data) noexce
} }
template<typename T> template<typename T>
ox::Error writeConfig(keel::Context *ctx, T *data) noexcept { ox::Error writeConfig(keel::Context &ctx, T *data) noexcept {
constexpr auto TypeName = ox::requireModelTypeName<T>(); constexpr auto TypeName = ox::requireModelTypeName<T>();
return writeConfig(ctx, TypeName, data); return writeConfig(ctx, TypeName, data);
} }
template<typename T, typename Func> template<typename T, typename Func>
void openConfig(keel::Context *ctx, ox::CRStringView name, Func f) noexcept { void openConfig(keel::Context &ctx, ox::CRStringView name, Func f) noexcept {
oxAssert(name != "", "Config type has no TypeName"); oxAssert(name != "", "Config type has no TypeName");
const auto [c, err] = readConfig<T>(ctx, name); const auto [c, err] = readConfig<T>(ctx, name);
oxLogError(err); oxLogError(err);
@ -72,13 +72,13 @@ void openConfig(keel::Context *ctx, ox::CRStringView name, Func f) noexcept {
} }
template<typename T, typename Func> template<typename T, typename Func>
void openConfig(keel::Context *ctx, Func f) noexcept { void openConfig(keel::Context &ctx, Func f) noexcept {
constexpr auto TypeName = ox::requireModelTypeName<T>(); constexpr auto TypeName = ox::requireModelTypeName<T>();
openConfig<T>(ctx, TypeName, f); openConfig<T>(ctx, TypeName, f);
} }
template<typename T, typename Func> template<typename T, typename Func>
void editConfig(keel::Context *ctx, ox::CRStringView name, Func f) noexcept { void editConfig(keel::Context &ctx, ox::CRStringView name, Func f) noexcept {
oxAssert(name != "", "Config type has no TypeName"); oxAssert(name != "", "Config type has no TypeName");
auto [c, err] = readConfig<T>(ctx, name); auto [c, err] = readConfig<T>(ctx, name);
oxLogError(err); oxLogError(err);
@ -87,7 +87,7 @@ void editConfig(keel::Context *ctx, ox::CRStringView name, Func f) noexcept {
} }
template<typename T, typename Func> template<typename T, typename Func>
void editConfig(keel::Context *ctx, Func f) noexcept { void editConfig(keel::Context &ctx, Func f) noexcept {
constexpr auto TypeName = ox::requireModelTypeName<T>(); constexpr auto TypeName = ox::requireModelTypeName<T>();
editConfig<T>(ctx, TypeName, f); editConfig<T>(ctx, TypeName, f);
} }

View File

@ -20,7 +20,7 @@ struct FDFilterItem {
FDFilterItem(ox::CRStringView pName, ox::CRStringView pSpec) noexcept; FDFilterItem(ox::CRStringView pName, ox::CRStringView pSpec) noexcept;
}; };
ox::Result<ox::String> saveFile(const ox::Vector<FDFilterItem> &exts) noexcept; ox::Result<ox::String> saveFile(ox::Vector<FDFilterItem> const&exts) noexcept;
ox::Result<ox::String> chooseDirectory() noexcept; ox::Result<ox::String> chooseDirectory() noexcept;

View File

@ -8,6 +8,6 @@
namespace studio::ig { namespace studio::ig {
void centerNextWindow(turbine::Context *ctx) noexcept; void centerNextWindow(turbine::Context &ctx) noexcept;
} }

View File

@ -24,7 +24,7 @@ class ItemMaker {
fileExt(pFileExt) { fileExt(pFileExt) {
} }
virtual ~ItemMaker() noexcept = default; virtual ~ItemMaker() noexcept = default;
virtual ox::Error write(turbine::Context *ctx, ox::CRStringView pName) const noexcept = 0; virtual ox::Error write(turbine::Context &ctx, ox::CRStringView pName) const noexcept = 0;
}; };
template<typename T> template<typename T>
@ -61,10 +61,10 @@ class ItemMakerT: public ItemMaker {
item(std::move(pItem)), item(std::move(pItem)),
fmt(pFmt) { fmt(pFmt) {
} }
ox::Error write(turbine::Context *ctx, ox::CRStringView pName) const noexcept override { ox::Error write(turbine::Context &ctx, ox::CRStringView pName) const noexcept override {
const auto path = ox::sfmt("/{}/{}.{}", parentDir, pName, fileExt); const auto path = ox::sfmt("/{}/{}.{}", parentDir, pName, fileExt);
auto sctx = turbine::applicationData<studio::StudioContext>(*ctx); auto sctx = turbine::applicationData<studio::StudioContext>(ctx);
keel::createUuidMapping(keelCtx(*ctx), path, ox::UUID::generate().unwrap()); keel::createUuidMapping(keelCtx(ctx), path, ox::UUID::generate().unwrap());
return sctx->project->writeObj(path, item, fmt); return sctx->project->writeObj(path, item, fmt);
} }
}; };

View File

@ -32,7 +32,7 @@ class Popup {
[[nodiscard]] [[nodiscard]]
virtual bool isOpen() const noexcept = 0; virtual bool isOpen() const noexcept = 0;
virtual void draw(turbine::Context *ctx) noexcept = 0; virtual void draw(turbine::Context &ctx) noexcept = 0;
protected: protected:
constexpr void setSize(ox::Size sz) noexcept { constexpr void setSize(ox::Size sz) noexcept {
@ -47,7 +47,7 @@ class Popup {
return m_title; return m_title;
} }
void drawWindow(turbine::Context *ctx, bool *open, const std::function<void()> &drawContents); void drawWindow(turbine::Context &ctx, bool *open, std::function<void()> const&drawContents);
}; };

View File

@ -19,15 +19,15 @@ class Task: public ox::SignalHandler {
public: public:
ox::Signal<ox::Error()> finished; ox::Signal<ox::Error()> finished;
~Task() noexcept override = default; ~Task() noexcept override = default;
virtual TaskState update(turbine::Context *ctx) noexcept = 0; virtual TaskState update(turbine::Context &ctx) noexcept = 0;
}; };
class TaskRunner { class TaskRunner {
private: private:
ox::Vector<ox::UniquePtr<studio::Task>> m_tasks; ox::Vector<ox::UniquePtr<studio::Task>> m_tasks;
public: public:
void update(turbine::Context *ctx) noexcept; void update(turbine::Context &ctx) noexcept;
void add(Task *task) noexcept; void add(Task &task) noexcept;
}; };
} }

View File

@ -23,11 +23,11 @@ class UndoCommand {
class UndoStack { class UndoStack {
private: private:
ox::Vector<ox::UniquePtr<UndoCommand>> m_stack; ox::Vector<ox::UPtr<UndoCommand>> m_stack;
std::size_t m_stackIdx = 0; std::size_t m_stackIdx = 0;
public: public:
void push(UndoCommand *cmd) noexcept; void push(ox::UPtr<UndoCommand> &&cmd) noexcept;
void redo() noexcept; void redo() noexcept;

View File

@ -13,7 +13,7 @@ namespace studio {
class Widget: public ox::SignalHandler { class Widget: public ox::SignalHandler {
public: public:
~Widget() noexcept override = default; ~Widget() noexcept override = default;
virtual void draw(turbine::Context*) noexcept = 0; virtual void draw(turbine::Context&) noexcept = 0;
}; };
} }

View File

@ -23,9 +23,9 @@ constexpr auto ConfigDir = [] {
} }
}(); }();
ox::String configPath(const keel::Context *ctx) noexcept { ox::String configPath(const keel::Context &ctx) noexcept {
const auto homeDir = std::getenv(ox::defines::OS == ox::OS::Windows ? "USERPROFILE" : "HOME"); const auto homeDir = std::getenv(ox::defines::OS == ox::OS::Windows ? "USERPROFILE" : "HOME");
return ox::sfmt(ConfigDir, homeDir, ctx->appName); return ox::sfmt(ConfigDir, homeDir, ctx.appName);
} }
} }

View File

@ -18,7 +18,7 @@ FDFilterItem::FDFilterItem(ox::CRStringView pName, ox::CRStringView pSpec) noexc
ox_strncpy(spec.data(), pSpec.data(), pSpec.len()); ox_strncpy(spec.data(), pSpec.data(), pSpec.len());
} }
static ox::Result<ox::String> toResult(nfdresult_t r, const NFD::UniquePathN &path) noexcept { static ox::Result<ox::String> toResult(nfdresult_t r, NFD::UniquePathN const&path) noexcept {
switch (r) { switch (r) {
case NFD_OKAY: { case NFD_OKAY: {
ox::String out; ox::String out;
@ -35,8 +35,8 @@ static ox::Result<ox::String> toResult(nfdresult_t r, const NFD::UniquePathN &pa
} }
} }
ox::Result<ox::String> saveFile(const ox::Vector<FDFilterItem> &filters) noexcept { ox::Result<ox::String> saveFile(ox::Vector<FDFilterItem> const&filters) noexcept {
const NFD::Guard guard; NFD::Guard const guard;
NFD::UniquePathN path; NFD::UniquePathN path;
ox::Vector<nfdnfilteritem_t, 5> filterItems(filters.size()); ox::Vector<nfdnfilteritem_t, 5> filterItems(filters.size());
for (auto i = 0u; const auto &f : filters) { for (auto i = 0u; const auto &f : filters) {
@ -44,7 +44,7 @@ ox::Result<ox::String> saveFile(const ox::Vector<FDFilterItem> &filters) noexcep
filterItems[i].spec = f.spec.data(); filterItems[i].spec = f.spec.data();
++i; ++i;
} }
const auto filterItemsCnt = static_cast<nfdfiltersize_t>(filterItems.size()); auto const filterItemsCnt = static_cast<nfdfiltersize_t>(filterItems.size());
return toResult(NFD::SaveDialog(path, filterItems.data(), filterItemsCnt), path); return toResult(NFD::SaveDialog(path, filterItems.data(), filterItemsCnt), path);
} }

View File

@ -8,8 +8,8 @@
namespace studio::ig { namespace studio::ig {
void centerNextWindow(turbine::Context *ctx) noexcept { void centerNextWindow(turbine::Context &ctx) noexcept {
const auto sz = turbine::getScreenSize(*ctx); const auto sz = turbine::getScreenSize(ctx);
const auto screenW = static_cast<float>(sz.width); const auto screenW = static_cast<float>(sz.width);
const auto screenH = static_cast<float>(sz.height); const auto screenH = static_cast<float>(sz.height);
const auto mod = ImGui::GetWindowDpiScale() * 2; const auto mod = ImGui::GetWindowDpiScale() * 2;

View File

@ -7,7 +7,7 @@
namespace studio { namespace studio {
void Popup::drawWindow(turbine::Context *ctx, bool *open, const std::function<void()> &drawContents) { void Popup::drawWindow(turbine::Context &ctx, bool *open, std::function<void()> const&drawContents) {
studio::ig::centerNextWindow(ctx); studio::ig::centerNextWindow(ctx);
ImGui::SetNextWindowSize(static_cast<ImVec2>(m_size)); ImGui::SetNextWindowSize(static_cast<ImVec2>(m_size));
constexpr auto modalFlags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize; constexpr auto modalFlags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize;

View File

@ -8,7 +8,7 @@
namespace studio { namespace studio {
void TaskRunner::update(turbine::Context *ctx) noexcept { void TaskRunner::update(turbine::Context &ctx) noexcept {
oxIgnoreError(m_tasks.erase(std::remove_if(m_tasks.begin(), m_tasks.end(), [&](ox::UPtr<studio::Task> &t) { oxIgnoreError(m_tasks.erase(std::remove_if(m_tasks.begin(), m_tasks.end(), [&](ox::UPtr<studio::Task> &t) {
const auto done = t->update(ctx) == TaskState::Done; const auto done = t->update(ctx) == TaskState::Done;
if (done) { if (done) {
@ -18,8 +18,8 @@ void TaskRunner::update(turbine::Context *ctx) noexcept {
}))); })));
} }
void TaskRunner::add(Task *task) noexcept { void TaskRunner::add(Task &task) noexcept {
m_tasks.emplace_back(task); m_tasks.emplace_back(&task);
} }
} }

View File

@ -10,18 +10,16 @@ bool UndoCommand::mergeWith(const UndoCommand*) noexcept {
return false; return false;
} }
void UndoStack::push(UndoCommand *cmd) noexcept { void UndoStack::push(ox::UPtr<UndoCommand> &&cmd) noexcept {
for (const auto i = m_stackIdx; i < m_stack.size();) { for (const auto i = m_stackIdx; i < m_stack.size();) {
oxIgnoreError(m_stack.erase(i)); oxIgnoreError(m_stack.erase(i));
} }
cmd->redo(); cmd->redo();
redoTriggered.emit(cmd); redoTriggered.emit(cmd.get());
changeTriggered.emit(cmd); changeTriggered.emit(cmd.get());
if (!m_stack.size() || !(*m_stack.back().value)->mergeWith(cmd)) { if (m_stack.empty() || !(*m_stack.back().value)->mergeWith(cmd.get())) {
m_stack.emplace_back(cmd); m_stack.emplace_back(std::move(cmd));
++m_stackIdx; ++m_stackIdx;
} else {
delete cmd;
} }
} }