[Fix] Make sure file saving works in all contexts.

This commit is contained in:
Ritchie Cunningham 2025-10-26 16:41:02 +00:00
parent 5c52afe1f4
commit beae5c45a4
6 changed files with 53 additions and 17 deletions

View File

@ -13,7 +13,6 @@
#include "game_state.h"
#include "terminal.h"
#include "ui/desktop.h"
#include "ui/i_window_content.h"
#include "ui/ui_window.h"
#include "ui/editor.h"
#include "ui/login_screen.h"
@ -23,12 +22,13 @@
#include "debug/debug_overlay.h"
void GameState::_init_desktop(void) {
_desktop = std::make_unique<Desktop>(_screen_width, _screen_height, this);
_desktop = std::make_unique<Desktop>(_screen_width, _screen_height, this, _initial_session_id);
auto term = std::make_unique<Terminal>(this);
term->set_session_id(_initial_session_id);
auto term_window = std::make_unique<UIWindow>("Terminal", 100, 100, 800, 500);
term_window->set_session_id(_initial_session_id);
UIWindow* window_ptr = term_window.get();
term_window->set_content(std::move(term));
_desktop->add_window(std::move(term_window));
@ -229,6 +229,7 @@ void GameState::update(float dt, int draw_calls, int shape_verts, int text_verts
if(new_term) {
Terminal* term = dynamic_cast<Terminal*>(new_term->get_content());
if(term) {
new_term->set_session_id(session_id);
term->set_session_id(session_id);
_desktop->register_session(session_id, new_term);
}
@ -242,6 +243,7 @@ void GameState::update(float dt, int draw_calls, int shape_verts, int text_verts
editor->set_buffer_content(args[2]);
auto editor_window = std::make_unique<UIWindow>(args[1].c_str(),
200, 200, 600, 400);
editor_window->set_session_id(session_id);
editor_window->set_content(std::move(editor));
_desktop->add_window(std::move(editor_window));
}

View File

@ -26,8 +26,10 @@ static const std::string& get_random_snippet(const std::vector<std::string>& sni
return snippets[rand() % snippets.size()];
}
Desktop::Desktop(int screen_width, int screen_height, GameState* game_state) {
Desktop::Desktop(int screen_width, int screen_height, GameState* game_state,
uint32_t initial_session_id) {
_taskbar = std::make_unique<Taskbar>(screen_width, screen_height);
_initial_session_id = initial_session_id;
_game_state= game_state;
_focused_window = nullptr;
_window_awaiting_session_id = nullptr;
@ -144,6 +146,7 @@ void Desktop::handle_event(SDL_Event* event, int screen_width, int screen_height
} else if(app_to_launch == "Editor") {
auto editor = std::make_unique<Editor>();
auto editor_window = std::make_unique<UIWindow>("Editor", 200, 200, 600, 400);
editor_window->set_session_id(_initial_session_id);
editor_window->set_content(std::move(editor));
add_window(std::move(editor_window));
_launcher_is_open = false;
@ -183,10 +186,7 @@ void Desktop::update(float dt, int screen_width, int screen_height) {
IWindowContent* content = _focused_window->get_content();
if(content) {
WindowAction action = content->get_pending_action();
uint32_t session_id = 0;
if(auto term = dynamic_cast<Terminal*>(content)) {
session_id = term->get_session_id();
}
uint32_t session_id = _focused_window->get_session_id();
switch(action.type) {
case ActionType::WRITE_FILE: {
if(session_id != 0) {

View File

@ -24,7 +24,8 @@ struct ScrollingText {
class Desktop {
public:
Desktop(int screen_width, int screen_height, GameState* game_state);
Desktop(int screen_width, int screen_height, GameState* game_state,
uint32_t initial_session_id);
~Desktop(void);
void add_window(std::unique_ptr<UIWindow> window);
@ -52,4 +53,5 @@ private:
std::vector<ScrollingText> _background_text;
std::vector<std::string> _snippets;
bool _launcher_is_open;
uint32_t _initial_session_id;
};

View File

@ -45,6 +45,8 @@ public:
bool is_mouse_over_resize_handle(int mouse_x, int mouse_y) const;
const std::string& get_title(void) const;
Rect get_rect(void) const;
void set_session_id(uint32_t id) { _session_id = id; }
uint32_t get_session_id(void) const { return _session_id; }
private:
friend class Taskbar; /* Allow taskbar to access private members. */
@ -64,4 +66,6 @@ private:
bool _is_resizing;
int _resize_margin;
uint32_t _session_id;
};

View File

@ -30,22 +30,50 @@ std::string rm(Session& context, const std::string& filename) {
return "";
}
std::string write_file(Session& context, const std::string& filename,
std::string write_file(Session& context, const std::string& path,
const std::string& content) {
vfs_node* current_dir = context.get_current_dir();
auto it = current_dir->children.find(filename);
vfs_node* parent_dir = nullptr;
std::string filename;
if(it != current_dir->children.end()) {
/* File exists, update content. */
if(path[0] == '/') {
Machine* session_machine = context.get_session_machine();
vfs_node* root = session_machine->vfs_root;
size_t last_slash = path.find_last_of('/');
if(last_slash == 0) {
/* File in root. */
parent_dir = root;
filename = path.substr(1);
} else {
std::string parent_path = path.substr(0, last_slash);
parent_dir = find_node_by_path(root, parent_path);
filename = path.substr(last_slash+1);
}
} else {
/* Relative path. */
parent_dir = context.get_current_dir();
filename = path;
}
if(!parent_dir) {
return "write: cannot create file '" + path + "': No such file or directory";
}
if(parent_dir->type != DIR_NODE) {
return "write: cannot create file in '" + get_full_path(parent_dir) + "': Not a directory";
}
auto it = parent_dir->children.find(filename);
if(it != parent_dir->children.end()) {
if(it->second->type == DIR_NODE) {
return "write: " + filename + ": Is a directory.";
return "write: " + path + ": Is a directory";
}
it->second->content = content;
} else {
/* File does not exist, create it. */
vfs_node* new_file = new_node(filename, FILE_NODE, current_dir);
vfs_node* new_file = new_node(filename, FILE_NODE, parent_dir);
new_file->content = content;
current_dir->children[filename] = new_file;
parent_dir->children[filename] = new_file;
}
return "";
}

View File

@ -11,7 +11,7 @@ namespace api {
/* FILESYSTEM ACTIONS. */
vfs_node* get_current_dir(Session& context);
std::string rm(Session& context, const std::string& filename);
std::string write_file(Session& context, const std::string& filename,
std::string write_file(Session& context, const std::string& path,
const std::string& content);
std::string ls(Session& context);
std::string cd(Session& context, const std::string& path);