mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 09:12:45 +00:00 
			
		
		
		
	 d8bac4dbda
			
		
	
	
		d8bac4dbda
		
	
	
	
	
		
			
			Previously, all the code to add menus and actions was in main(). This was messy and didn't allow us to reference the actions from SpreadsheetWidget, which is needed in order to add a toolbar. This commit moves the menu and action adding code to method on SpreadsheetWidget called initialize_menubar() which is based upon applications such as TextEditor which have identically named methods doing the same thing. In additon, clipboard_action(), previouly a lambda in main(), has also been made into a method on SpreadsheetWidget since it would otherwise be destroyed when it goes out of scope. (This was previously avoided by declaring the lambda in main() so it's always in scope.)
		
			
				
	
	
		
			99 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020-2021, the SerenityOS developers.
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include "HelpWindow.h"
 | |
| #include "Spreadsheet.h"
 | |
| #include "SpreadsheetWidget.h"
 | |
| #include <AK/ScopeGuard.h>
 | |
| #include <LibCore/ArgsParser.h>
 | |
| #include <LibCore/File.h>
 | |
| #include <LibGUI/Application.h>
 | |
| #include <LibGUI/Clipboard.h>
 | |
| #include <LibGUI/FilePicker.h>
 | |
| #include <LibGUI/Icon.h>
 | |
| #include <LibGUI/Menu.h>
 | |
| #include <LibGUI/Menubar.h>
 | |
| #include <LibGUI/MessageBox.h>
 | |
| #include <LibGUI/Window.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| int main(int argc, char* argv[])
 | |
| {
 | |
|     if (pledge("stdio recvfd sendfd rpath fattr unix cpath wpath thread", nullptr) < 0) {
 | |
|         perror("pledge");
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     auto app = GUI::Application::construct(argc, argv);
 | |
| 
 | |
|     const char* filename = nullptr;
 | |
| 
 | |
|     Core::ArgsParser args_parser;
 | |
|     args_parser.add_positional_argument(filename, "File to read from", "file", Core::ArgsParser::Required::No);
 | |
| 
 | |
|     args_parser.parse(argc, argv);
 | |
| 
 | |
|     if (filename) {
 | |
|         if (!Core::File::exists(filename) || Core::File::is_directory(filename)) {
 | |
|             warnln("File does not exist or is a directory: {}", filename);
 | |
|             return 1;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (unveil("/tmp/portal/webcontent", "rw") < 0) {
 | |
|         perror("unveil");
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     // For writing temporary files when exporting.
 | |
|     if (unveil("/tmp", "crw") < 0) {
 | |
|         perror("unveil");
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     if (unveil("/etc", "r") < 0) {
 | |
|         perror("unveil");
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     if (unveil(Core::StandardPaths::home_directory().characters(), "rwc") < 0) {
 | |
|         perror("unveil");
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     if (unveil("/res", "r") < 0) {
 | |
|         perror("unveil");
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     if (unveil(nullptr, nullptr) < 0) {
 | |
|         perror("unveil");
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     auto app_icon = GUI::Icon::default_icon("app-spreadsheet");
 | |
|     auto window = GUI::Window::construct();
 | |
|     window->set_title("Spreadsheet");
 | |
|     window->resize(640, 480);
 | |
|     window->set_icon(app_icon.bitmap_for_size(16));
 | |
| 
 | |
|     auto& spreadsheet_widget = window->set_main_widget<Spreadsheet::SpreadsheetWidget>(NonnullRefPtrVector<Spreadsheet::Sheet> {}, filename == nullptr);
 | |
| 
 | |
|     if (filename)
 | |
|         spreadsheet_widget.load(filename);
 | |
| 
 | |
|     spreadsheet_widget.initialize_menubar(*window);
 | |
| 
 | |
|     window->on_close_request = [&]() -> GUI::Window::CloseRequestDecision {
 | |
|         if (spreadsheet_widget.request_close())
 | |
|             return GUI::Window::CloseRequestDecision::Close;
 | |
|         return GUI::Window::CloseRequestDecision::StayOpen;
 | |
|     };
 | |
| 
 | |
|     window->show();
 | |
| 
 | |
|     return app->exec();
 | |
| }
 |