2020-03-19 15:55:25 -03:00
/*
* Copyright ( c ) 2019 - 2020 , Ryan Grieb < ryan . m . grieb @ gmail . com >
*
2021-04-22 05:24:48 -03:00
* SPDX - License - Identifier : BSD - 2 - Clause
2020-03-19 15:55:25 -03:00
*/
2020-08-19 10:29:43 -03:00
# include "AddEventDialog.h"
2021-03-29 21:43:40 -03:00
# include <Applications/Calendar/CalendarWindowGML.h>
2020-03-10 18:41:48 -03:00
# include <LibGUI/Action.h>
2021-03-29 21:43:40 -03:00
# include <LibGUI/ActionGroup.h>
2020-03-10 18:41:48 -03:00
# include <LibGUI/Application.h>
2020-08-19 10:29:43 -03:00
# include <LibGUI/BoxLayout.h>
# include <LibGUI/Button.h>
# include <LibGUI/Calendar.h>
# include <LibGUI/Icon.h>
2020-03-10 18:41:48 -03:00
# include <LibGUI/Menu.h>
2021-04-13 11:18:20 -03:00
# include <LibGUI/Menubar.h>
# include <LibGUI/Toolbar.h>
2020-03-10 18:41:48 -03:00
# include <LibGUI/Window.h>
2021-03-12 13:29:37 -03:00
# include <unistd.h>
2020-03-10 18:41:48 -03:00
int main ( int argc , char * * argv )
{
2021-05-13 18:20:26 -03:00
if ( pledge ( " stdio recvfd sendfd rpath unix " , nullptr ) < 0 ) {
2020-03-10 18:41:48 -03:00
perror ( " pledge " ) ;
return 1 ;
}
2020-07-04 09:05:19 -03:00
auto app = GUI : : Application : : construct ( argc , argv ) ;
2020-03-10 18:41:48 -03:00
2021-05-13 18:20:26 -03:00
if ( pledge ( " stdio recvfd sendfd rpath " , nullptr ) < 0 ) {
2020-03-10 18:41:48 -03:00
perror ( " pledge " ) ;
return 1 ;
}
if ( unveil ( " /res " , " r " ) < 0 ) {
perror ( " unveil " ) ;
return 1 ;
}
unveil ( nullptr , nullptr ) ;
2020-08-19 10:29:43 -03:00
auto app_icon = GUI : : Icon : : default_icon ( " app-calendar " ) ;
2020-03-10 18:41:48 -03:00
auto window = GUI : : Window : : construct ( ) ;
window - > set_title ( " Calendar " ) ;
2020-08-19 10:29:43 -03:00
window - > resize ( 600 , 480 ) ;
2021-03-29 21:43:40 -03:00
window - > set_minimum_size ( 171 , 141 ) ;
2020-08-19 10:29:43 -03:00
window - > set_icon ( app_icon . bitmap_for_size ( 16 ) ) ;
2020-03-10 18:41:48 -03:00
2021-03-29 21:43:40 -03:00
auto & main_widget = window - > set_main_widget < GUI : : Widget > ( ) ;
main_widget . load_from_gml ( calendar_window_gml ) ;
2020-08-19 10:29:43 -03:00
2021-04-13 11:18:20 -03:00
auto toolbar = main_widget . find_descendant_of_type_named < GUI : : Toolbar > ( " toolbar " ) ;
2021-03-29 21:43:40 -03:00
auto calendar = main_widget . find_descendant_of_type_named < GUI : : Calendar > ( " calendar " ) ;
2020-08-19 10:29:43 -03:00
2021-07-21 13:02:15 -03:00
auto prev_date_action = GUI : : Action : : create ( { } , Gfx : : Bitmap : : try_load_from_file ( " /res/icons/16x16/go-back.png " ) , [ & ] ( const GUI : : Action & ) {
2021-03-29 21:43:40 -03:00
unsigned view_month = calendar - > view_month ( ) ;
unsigned view_year = calendar - > view_year ( ) ;
if ( calendar - > mode ( ) = = GUI : : Calendar : : Month ) {
view_month - - ;
if ( calendar - > view_month ( ) = = 1 ) {
view_month = 12 ;
view_year - - ;
2020-08-19 10:29:43 -03:00
}
} else {
2021-03-29 21:43:40 -03:00
view_year - - ;
2020-08-19 10:29:43 -03:00
}
2021-03-29 21:43:40 -03:00
calendar - > update_tiles ( view_year , view_month ) ;
2020-08-19 10:29:43 -03:00
} ) ;
2021-07-21 13:02:15 -03:00
auto next_date_action = GUI : : Action : : create ( { } , Gfx : : Bitmap : : try_load_from_file ( " /res/icons/16x16/go-forward.png " ) , [ & ] ( const GUI : : Action & ) {
2021-03-29 21:43:40 -03:00
unsigned view_month = calendar - > view_month ( ) ;
unsigned view_year = calendar - > view_year ( ) ;
if ( calendar - > mode ( ) = = GUI : : Calendar : : Month ) {
view_month + + ;
if ( calendar - > view_month ( ) = = 12 ) {
view_month = 1 ;
view_year + + ;
2020-08-19 10:29:43 -03:00
}
} else {
2021-03-29 21:43:40 -03:00
view_year + + ;
2020-08-19 10:29:43 -03:00
}
2021-03-29 21:43:40 -03:00
calendar - > update_tiles ( view_year , view_month ) ;
2020-08-19 10:29:43 -03:00
} ) ;
2021-07-21 13:02:15 -03:00
auto add_event_action = GUI : : Action : : create ( " &Add Event " , { } , Gfx : : Bitmap : : try_load_from_file ( " /res/icons/16x16/add-event.png " ) , [ & ] ( const GUI : : Action & ) {
2021-03-29 21:43:40 -03:00
AddEventDialog : : show ( calendar - > selected_date ( ) , window ) ;
2020-08-19 10:29:43 -03:00
} ) ;
2021-07-21 13:02:15 -03:00
auto jump_to_action = GUI : : Action : : create ( " Jump to &Today " , { } , Gfx : : Bitmap : : try_load_from_file ( " /res/icons/16x16/calendar-date.png " ) , [ & ] ( const GUI : : Action & ) {
2021-03-29 21:43:40 -03:00
calendar - > set_selected_date ( Core : : DateTime : : now ( ) ) ;
calendar - > update_tiles ( Core : : DateTime : : now ( ) . year ( ) , Core : : DateTime : : now ( ) . month ( ) ) ;
2020-08-19 10:29:43 -03:00
} ) ;
2021-07-21 13:02:15 -03:00
auto view_month_action = GUI : : Action : : create_checkable ( " &Month View " , { Mod_Ctrl , KeyCode : : Key_1 } , Gfx : : Bitmap : : try_load_from_file ( " /res/icons/16x16/calendar-month-view.png " ) , [ & ] ( const GUI : : Action & ) {
2021-03-29 21:43:40 -03:00
if ( calendar - > mode ( ) = = GUI : : Calendar : : Year )
calendar - > toggle_mode ( ) ;
} ) ;
view_month_action - > set_checked ( true ) ;
2020-08-19 10:29:43 -03:00
2021-07-21 13:02:15 -03:00
auto view_year_action = GUI : : Action : : create_checkable ( " &Year View " , { Mod_Ctrl , KeyCode : : Key_2 } , Gfx : : Bitmap : : try_load_from_file ( " /res/icons/16x16/icon-view.png " ) , [ & ] ( const GUI : : Action & ) {
2021-03-29 21:43:40 -03:00
if ( calendar - > mode ( ) = = GUI : : Calendar : : Month )
calendar - > toggle_mode ( ) ;
} ) ;
2020-08-19 10:29:43 -03:00
2021-03-29 21:43:40 -03:00
auto view_type_action_group = make < GUI : : ActionGroup > ( ) ;
view_type_action_group - > set_exclusive ( true ) ;
view_type_action_group - > add_action ( * view_month_action ) ;
view_type_action_group - > add_action ( * view_year_action ) ;
toolbar - > add_action ( prev_date_action ) ;
toolbar - > add_action ( next_date_action ) ;
toolbar - > add_separator ( ) ;
toolbar - > add_action ( jump_to_action ) ;
toolbar - > add_action ( add_event_action ) ;
toolbar - > add_separator ( ) ;
toolbar - > add_action ( view_month_action ) ;
toolbar - > add_action ( view_year_action ) ;
calendar - > on_tile_doubleclick = [ & ] {
AddEventDialog : : show ( calendar - > selected_date ( ) , window ) ;
2020-08-19 10:29:43 -03:00
} ;
2021-03-29 21:43:40 -03:00
calendar - > on_month_click = [ & ] {
view_month_action - > set_checked ( true ) ;
2020-08-19 10:29:43 -03:00
} ;
2020-03-10 18:41:48 -03:00
2021-07-21 16:21:03 -03:00
auto & file_menu = window - > add_menu ( " &File " ) ;
2021-07-21 13:02:15 -03:00
file_menu . add_action ( GUI : : Action : : create ( " &Add Event " , { Mod_Ctrl | Mod_Shift , Key_E } , Gfx : : Bitmap : : try_load_from_file ( " /res/icons/16x16/add-event.png " ) ,
2020-04-09 19:05:48 -03:00
[ & ] ( const GUI : : Action & ) {
2021-03-29 21:43:40 -03:00
AddEventDialog : : show ( calendar - > selected_date ( ) , window ) ;
2020-04-09 19:05:48 -03:00
} ) ) ;
2021-05-01 05:45:39 -03:00
file_menu . add_separator ( ) ;
2020-08-19 10:29:43 -03:00
2021-05-01 05:45:39 -03:00
file_menu . add_action ( GUI : : CommonActions : : make_quit_action ( [ ] ( auto & ) {
2020-07-04 11:52:01 -03:00
GUI : : Application : : the ( ) - > quit ( ) ;
2020-03-10 18:41:48 -03:00
} ) ) ;
2020-04-09 19:05:48 -03:00
2021-07-21 16:21:03 -03:00
auto & view_menu = window - > add_menu ( " &View " ) ;
2021-03-29 21:43:40 -03:00
view_menu . add_action ( * view_month_action ) ;
view_menu . add_action ( * view_year_action ) ;
2021-07-21 16:21:03 -03:00
auto & help_menu = window - > add_menu ( " &Help " ) ;
2021-01-30 09:38:19 -03:00
help_menu . add_action ( GUI : : CommonActions : : make_about_action ( " Calendar " , app_icon , window ) ) ;
2020-08-18 12:08:54 -03:00
2020-08-19 10:29:43 -03:00
window - > show ( ) ;
2020-07-04 09:05:19 -03:00
app - > exec ( ) ;
2020-03-10 18:41:48 -03:00
}