[Fix] Make sure file saving works in all contexts.
This commit is contained in:
parent
5c52afe1f4
commit
beae5c45a4
@ -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));
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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 "";
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user