/* * Copyright (c) 2021-2022, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ #include "WelcomeWidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include WelcomeWidget::WelcomeWidget() { load_from_gml(welcome_window_gml); auto& tip_frame = *find_descendant_of_type_named("tip_frame"); tip_frame.set_background_role(Gfx::ColorRole::Base); tip_frame.set_fill_with_background_color(true); auto& light_bulb_label = *find_descendant_of_type_named("light_bulb_label"); light_bulb_label.set_icon(Gfx::Bitmap::try_load_from_file("/res/icons/32x32/app-welcome.png"sv).release_value_but_fixme_should_propagate_errors()); m_web_view = *find_descendant_of_type_named("web_view"); m_tip_label = *find_descendant_of_type_named("tip_label"); m_next_button = *find_descendant_of_type_named("next_button"); m_next_button->set_icon(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/go-forward.png"sv).release_value_but_fixme_should_propagate_errors()); m_next_button->on_click = [&](auto) { if (!tip_frame.is_visible()) { m_web_view->set_visible(false); tip_frame.set_visible(true); } if (m_tips.is_empty()) return; m_initial_tip_index++; if (m_initial_tip_index >= m_tips.size()) m_initial_tip_index = 0; m_tip_label->set_text(m_tips[m_initial_tip_index]); }; m_help_button = *find_descendant_of_type_named("help_button"); m_help_button->set_icon(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/book-open.png"sv).release_value_but_fixme_should_propagate_errors()); m_help_button->on_click = [&](auto) { GUI::Process::spawn_or_show_error(window(), "/bin/Help"sv); }; m_new_button = *find_descendant_of_type_named("new_button"); m_new_button->on_click = [&](auto) { m_web_view->set_visible(!m_web_view->is_visible()); tip_frame.set_visible(!tip_frame.is_visible()); }; m_close_button = *find_descendant_of_type_named("close_button"); m_close_button->on_click = [](auto) { GUI::Application::the()->quit(); }; auto welcome = Config::list_groups("SystemServer"sv).first_matching([](auto& group) { return group == "Welcome"sv; }); m_startup_checkbox = find_descendant_of_type_named("startup_checkbox"); m_startup_checkbox->set_checked(welcome.has_value()); m_startup_checkbox->on_checked = [](bool is_checked) { if (is_checked) Config::add_group("SystemServer"sv, "Welcome"sv); else Config::remove_group("SystemServer"sv, "Welcome"sv); }; open_and_parse_readme_file(); if (auto result = open_and_parse_tips_file(); result.is_error()) { auto error = String::formatted("Opening \"{}/tips.txt\" failed: {}", Core::StandardPaths::documents_directory(), result.error()); m_tip_label->set_text(error); warnln(error); } set_random_tip(); } ErrorOr WelcomeWidget::open_and_parse_tips_file() { auto path = String::formatted("{}/tips.txt", Core::StandardPaths::documents_directory()); auto file = TRY(Core::Stream::File::open(path, Core::Stream::OpenMode::Read)); auto buffered_file = TRY(Core::Stream::BufferedFile::create(move(file))); Array buffer; while (TRY(buffered_file->can_read_line())) { auto line = TRY(buffered_file->read_line(buffer)); if (line.starts_with('#') || line.is_empty()) continue; m_tips.append(line); } return {}; } void WelcomeWidget::open_and_parse_readme_file() { m_web_view->load(URL::create_with_file_scheme("/home/anon/README.md")); } void WelcomeWidget::set_random_tip() { if (m_tips.is_empty()) return; m_initial_tip_index = get_random_uniform(m_tips.size()); m_tip_label->set_text(m_tips[m_initial_tip_index]); } void WelcomeWidget::paint_event(GUI::PaintEvent& event) { GUI::Painter painter(*this); painter.add_clip_rect(event.rect()); static auto font = Gfx::BitmapFont::load_from_file("/res/fonts/MarietaRegular24.font"sv); painter.draw_text({ 12, 4, 1, 30 }, "Welcome to "sv, *font, Gfx::TextAlignment::CenterLeft, palette().base_text()); painter.draw_text({ 12 + font->width("Welcome to "sv), 4, 1, 30 }, "Serenity"sv, font->bold_variant(), Gfx::TextAlignment::CenterLeft, palette().base_text()); painter.draw_text({ 12 + font->width("Welcome to "sv) + font->bold_variant().width("Serenity"sv), 4, 1, 30 }, "OS"sv, font->bold_variant(), Gfx::TextAlignment::CenterLeft, palette().base() == palette().window() ? palette().base_text() : palette().base()); }