diff --git a/Applications/FileManager/DirectoryView.cpp b/Applications/FileManager/DirectoryView.cpp index 4cd9393264..90485803e5 100644 --- a/Applications/FileManager/DirectoryView.cpp +++ b/Applications/FileManager/DirectoryView.cpp @@ -168,6 +168,7 @@ void DirectoryView::setup_model() bool can_write_in_path = access(model().root_path().characters(), W_OK) == 0; m_mkdir_action->set_enabled(can_write_in_path); + m_touch_action->set_enabled(can_write_in_path); if (on_path_change) on_path_change(model().root_path(), can_write_in_path); @@ -454,4 +455,33 @@ void DirectoryView::setup_actions() } } }); + + m_touch_action = GUI::Action::create("New file...", { Mod_Ctrl | Mod_Shift, Key_F }, Gfx::Bitmap::load_from_file("/res/icons/16x16/new.png"), [&](const GUI::Action&) { + String value; + if (GUI::InputBox::show(value, window(), "Enter name:", "New file") == GUI::InputBox::ExecOK && !value.is_empty()) { + auto new_file_path = LexicalPath::canonicalized_path( + String::format("%s/%s", + path().characters(), + value.characters())); + struct stat st; + int rc = stat(new_file_path.characters(), &st); + if ((rc < 0 && errno != ENOENT)) { + auto saved_errno = errno; + GUI::MessageBox::show(window(), String::format("stat(\"%s\") failed: %s", new_file_path.characters(), strerror(saved_errno)), "Error", GUI::MessageBox::Type::Error); + return; + } + if (rc == 0) { + GUI::MessageBox::show(window(), String::format("%s: Already exists", new_file_path.characters()), "Error", GUI::MessageBox::Type::Error); + return; + } + int fd = creat(new_file_path.characters(), 0666); + if (fd < 0) { + auto saved_errno = errno; + GUI::MessageBox::show(window(), String::format("creat(\"%s\") failed: %s", new_file_path.characters(), strerror(saved_errno)), "Error", GUI::MessageBox::Type::Error); + return; + } + rc = close(fd); + ASSERT(rc >= 0); + } + }); } diff --git a/Applications/FileManager/DirectoryView.h b/Applications/FileManager/DirectoryView.h index 6967f25f38..dcfc4a205c 100644 --- a/Applications/FileManager/DirectoryView.h +++ b/Applications/FileManager/DirectoryView.h @@ -135,6 +135,7 @@ public: Vector selected_file_paths() const; GUI::Action& mkdir_action() { return *m_mkdir_action; } + GUI::Action& touch_action() { return *m_touch_action; } private: explicit DirectoryView(Mode); @@ -169,4 +170,5 @@ private: RefPtr m_columns_view; RefPtr m_mkdir_action; + RefPtr m_touch_action; }; diff --git a/Applications/FileManager/main.cpp b/Applications/FileManager/main.cpp index 18c0b2f9af..4cc6db450e 100644 --- a/Applications/FileManager/main.cpp +++ b/Applications/FileManager/main.cpp @@ -176,10 +176,7 @@ int run_in_desktop_mode(RefPtr config) }); desktop_view_context_menu->add_action(directory_view.mkdir_action()); - -#if 0 - desktop_view_context_menu->add_action(touch_action); -#endif + desktop_view_context_menu->add_action(directory_view.touch_action()); desktop_view_context_menu->add_separator(); @@ -294,34 +291,6 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio directory_view.open_parent_directory(); }); - auto touch_action = GUI::Action::create("New file...", { Mod_Ctrl | Mod_Shift, Key_F }, Gfx::Bitmap::load_from_file("/res/icons/16x16/new.png"), [&](const GUI::Action&) { - String value; - if (GUI::InputBox::show(value, window, "Enter name:", "New file") == GUI::InputBox::ExecOK && !value.is_empty()) { - auto new_file_path = LexicalPath::canonicalized_path( - String::format("%s/%s", - directory_view.path().characters(), - value.characters())); - struct stat st; - int rc = stat(new_file_path.characters(), &st); - if ((rc < 0 && errno != ENOENT)) { - GUI::MessageBox::show(window, String::format("stat(\"%s\") failed: %s", new_file_path.characters(), strerror(errno)), "Error", GUI::MessageBox::Type::Error); - return; - } - if (rc == 0) { - GUI::MessageBox::show(window, String::format("%s: Already exists", new_file_path.characters()), "Error", GUI::MessageBox::Type::Error); - return; - } - int fd = creat(new_file_path.characters(), 0666); - if (fd < 0) { - GUI::MessageBox::show(window, String::format("creat(\"%s\") failed: %s", new_file_path.characters(), strerror(errno)), "Error", GUI::MessageBox::Type::Error); - return; - } - rc = close(fd); - assert(rc >= 0); - refresh_tree_view(); - } - }); - auto open_terminal_action = GUI::Action::create("Open Terminal here...", Gfx::Bitmap::load_from_file("/res/icons/16x16/app-terminal.png"), [&](const GUI::Action&) { posix_spawn_file_actions_t spawn_actions; posix_spawn_file_actions_init(&spawn_actions); @@ -587,7 +556,7 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio auto& app_menu = menubar->add_menu("File Manager"); app_menu.add_action(directory_view.mkdir_action()); - app_menu.add_action(touch_action); + app_menu.add_action(directory_view.touch_action()); app_menu.add_action(copy_action); app_menu.add_action(paste_action); app_menu.add_action(delete_action); @@ -633,7 +602,7 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio main_toolbar.add_separator(); main_toolbar.add_action(directory_view.mkdir_action()); - main_toolbar.add_action(touch_action); + main_toolbar.add_action(directory_view.touch_action()); main_toolbar.add_action(copy_action); main_toolbar.add_action(paste_action); main_toolbar.add_action(delete_action); @@ -669,7 +638,6 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio return; } - touch_action->set_enabled(can_write_in_path); paste_action->set_enabled(can_write_in_path && GUI::Clipboard::the().type() == "text/uri-list"); go_forward_action->set_enabled(directory_view.path_history_position() < directory_view.path_history_size() - 1); go_back_action->set_enabled(directory_view.path_history_position() > 0); @@ -713,7 +681,7 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio directory_context_menu->add_action(properties_action); directory_view_context_menu->add_action(directory_view.mkdir_action()); - directory_view_context_menu->add_action(touch_action); + directory_view_context_menu->add_action(directory_view.touch_action()); directory_view_context_menu->add_action(paste_action); directory_view_context_menu->add_action(open_terminal_action); directory_view_context_menu->add_separator(); @@ -726,7 +694,7 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio tree_view_directory_context_menu->add_action(properties_action); tree_view_directory_context_menu->add_separator(); tree_view_directory_context_menu->add_action(directory_view.mkdir_action()); - tree_view_directory_context_menu->add_action(touch_action); + tree_view_directory_context_menu->add_action(directory_view.touch_action()); RefPtr file_context_menu; NonnullRefPtrVector current_file_handlers;