2020-01-18 09:38:21 +01:00
/*
* Copyright ( c ) 2018 - 2020 , Andreas Kling < kling @ serenityos . org >
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
*
* 1. Redistributions of source code must retain the above copyright notice , this
* list of conditions and the following disclaimer .
*
* 2. Redistributions in binary form must reproduce the above copyright notice ,
* this list of conditions and the following disclaimer in the documentation
* and / or other materials provided with the distribution .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS "
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
* DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY ,
* OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
2019-06-10 19:29:33 +02:00
# include "PaintableWidget.h"
2019-06-10 19:54:09 +02:00
# include "PaletteWidget.h"
2019-06-12 05:58:31 +02:00
# include "ToolboxWidget.h"
2020-02-06 20:33:02 +01:00
# include <LibGUI/AboutDialog.h>
# include <LibGUI/Action.h>
# include <LibGUI/Application.h>
# include <LibGUI/BoxLayout.h>
# include <LibGUI/FilePicker.h>
# include <LibGUI/Menu.h>
# include <LibGUI/MenuBar.h>
# include <LibGUI/MessageBox.h>
# include <LibGUI/Window.h>
2020-02-16 09:17:49 +01:00
# include <LibGfx/Bitmap.h>
2020-01-13 12:22:49 +01:00
# include <stdio.h>
2019-06-10 19:29:33 +02:00
int main ( int argc , char * * argv )
{
2020-02-28 19:48:29 +01:00
if ( pledge ( " stdio thread shared_buffer accept rpath unix wpath cpath fattr " , nullptr ) < 0 ) {
2020-01-13 12:22:49 +01:00
perror ( " pledge " ) ;
return 1 ;
}
2020-02-02 15:07:41 +01:00
GUI : : Application app ( argc , argv ) ;
2019-06-10 19:29:33 +02:00
2020-02-28 19:48:29 +01:00
if ( pledge ( " stdio thread shared_buffer accept rpath wpath cpath " , nullptr ) < 0 ) {
2020-01-13 12:22:49 +01:00
perror ( " pledge " ) ;
return 1 ;
}
2020-02-02 15:07:41 +01:00
auto window = GUI : : Window : : construct ( ) ;
2019-06-10 19:29:33 +02:00
window - > set_title ( " PaintBrush " ) ;
2019-06-12 05:58:31 +02:00
window - > set_rect ( 100 , 100 , 640 , 480 ) ;
2020-02-06 13:39:17 +01:00
window - > set_icon ( Gfx : : Bitmap : : load_from_file ( " /res/icons/16x16/app-paintbrush.png " ) ) ;
2019-06-10 19:29:33 +02:00
2020-03-04 09:46:23 +01:00
auto & horizontal_container = window - > set_main_widget < GUI : : Widget > ( ) ;
horizontal_container . set_layout < GUI : : HorizontalBoxLayout > ( ) ;
horizontal_container . layout ( ) - > set_spacing ( 0 ) ;
2019-06-10 19:54:09 +02:00
2020-03-04 09:46:23 +01:00
horizontal_container . add < ToolboxWidget > ( ) ;
2019-06-12 05:58:31 +02:00
2020-03-04 19:07:55 +01:00
auto & vertical_container = horizontal_container . add < GUI : : Widget > ( ) ;
vertical_container . set_layout < GUI : : VerticalBoxLayout > ( ) ;
vertical_container . layout ( ) - > set_spacing ( 0 ) ;
2019-06-12 05:58:31 +02:00
2020-03-04 19:07:55 +01:00
auto & paintable_widget = vertical_container . add < PaintableWidget > ( ) ;
paintable_widget . set_focus ( true ) ;
vertical_container . add < PaletteWidget > ( paintable_widget ) ;
2019-06-10 19:29:33 +02:00
window - > show ( ) ;
2019-06-10 21:05:20 +02:00
2020-02-02 15:07:41 +01:00
auto menubar = make < GUI : : MenuBar > ( ) ;
2020-04-04 12:18:40 +02:00
auto & app_menu = menubar - > add_menu ( " PaintBrush " ) ;
2019-10-01 00:18:20 -05:00
2020-04-04 12:18:40 +02:00
app_menu . add_action ( GUI : : CommonActions : : make_open_action ( [ & ] ( auto & ) {
2020-02-02 15:07:41 +01:00
Optional < String > open_path = GUI : : FilePicker : : get_open_filepath ( ) ;
2019-10-01 00:18:20 -05:00
if ( ! open_path . has_value ( ) )
return ;
2020-02-06 13:39:17 +01:00
auto bitmap = Gfx : : Bitmap : : load_from_file ( open_path . value ( ) ) ;
2019-10-01 00:18:20 -05:00
if ( ! bitmap ) {
2020-02-02 15:07:41 +01:00
GUI : : MessageBox : : show ( String : : format ( " Failed to load '%s' " , open_path . value ( ) . characters ( ) ) , " Open failed " , GUI : : MessageBox : : Type : : Error , GUI : : MessageBox : : InputType : : OK , window ) ;
2019-10-01 00:18:20 -05:00
return ;
}
2020-03-04 19:07:55 +01:00
paintable_widget . set_bitmap ( * bitmap ) ;
2019-10-01 00:18:20 -05:00
} ) ) ;
2020-04-04 12:18:40 +02:00
app_menu . add_separator ( ) ;
app_menu . add_action ( GUI : : CommonActions : : make_quit_action ( [ ] ( auto & ) {
2020-02-02 15:07:41 +01:00
GUI : : Application : : the ( ) . quit ( 0 ) ;
2019-06-10 21:05:20 +02:00
return ;
} ) ) ;
2020-04-04 12:18:40 +02:00
menubar - > add_menu ( " Edit " ) ;
2019-06-10 21:05:20 +02:00
2020-04-04 12:18:40 +02:00
auto & help_menu = menubar - > add_menu ( " Help " ) ;
help_menu . add_action ( GUI : : Action : : create ( " About " , [ & ] ( auto & ) {
2020-02-06 13:39:17 +01:00
GUI : : AboutDialog : : show ( " PaintBrush " , Gfx : : Bitmap : : load_from_file ( " /res/icons/32x32/app-paintbrush.png " ) , window ) ;
2019-06-10 21:05:20 +02:00
} ) ) ;
app . set_menubar ( move ( menubar ) ) ;
2019-06-10 19:29:33 +02:00
return app . exec ( ) ;
}