/* * Copyright (c) 2020-2020, Hüseyin Aslıtürk * 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. */ #include "MonitorWidget.h" #include MonitorWidget::MonitorWidget() { m_monitor_bitmap = Gfx::Bitmap::load_from_file("/res/monitor.png"); m_monitor_rect = { 8, 9, 320, 180 }; } bool MonitorWidget::set_wallpaper(String path) { m_desktop_wallpaper_path = path; auto bitmap_ptr = Gfx::Bitmap::load_from_file(path); if (!bitmap_ptr) return false; m_desktop_wallpaper_bitmap = bitmap_ptr; return true; } String MonitorWidget::wallpaper() { return m_desktop_wallpaper_path; } void MonitorWidget::set_wallpaper_mode(String mode) { m_desktop_wallpaper_mode = mode; } String MonitorWidget::wallpaper_mode() { return m_desktop_wallpaper_mode; } void MonitorWidget::set_desktop_resolution(Gfx::IntSize resolution) { m_desktop_resolution = resolution; } Gfx::IntSize MonitorWidget::desktop_resolution() { return m_desktop_resolution; } void MonitorWidget::set_background_color(Gfx::Color color) { m_desktop_color = color; } Gfx::Color MonitorWidget::background_color() { return m_desktop_color; } void MonitorWidget::paint_event(GUI::PaintEvent& event) { Gfx::IntRect screen_rect = { 0, 0, m_desktop_resolution.width(), m_desktop_resolution.height() }; auto screen_bitmap = Gfx::Bitmap::create(m_monitor_bitmap->format(), m_desktop_resolution); GUI::Painter screen_painter(*screen_bitmap); screen_painter.fill_rect(screen_rect, m_desktop_color); if (!m_desktop_wallpaper_bitmap.is_null()) { if (m_desktop_wallpaper_mode == "simple") { screen_painter.blit({ 0, 0 }, *m_desktop_wallpaper_bitmap, m_desktop_wallpaper_bitmap->rect()); } else if (m_desktop_wallpaper_mode == "center") { Gfx::IntPoint offset { screen_rect.width() / 2 - m_desktop_wallpaper_bitmap->size().width() / 2, screen_rect.height() / 2 - m_desktop_wallpaper_bitmap->size().height() / 2 }; screen_painter.blit_offset(screen_rect.location(), *m_desktop_wallpaper_bitmap, screen_rect, offset); } else if (m_desktop_wallpaper_mode == "tile") { screen_painter.draw_tiled_bitmap(screen_bitmap->rect(), *m_desktop_wallpaper_bitmap); } else if (m_desktop_wallpaper_mode == "scaled") { screen_painter.draw_scaled_bitmap(screen_bitmap->rect(), *m_desktop_wallpaper_bitmap, m_desktop_wallpaper_bitmap->rect()); } else { ASSERT_NOT_REACHED(); } } GUI::Painter painter(*this); painter.add_clip_rect(event.rect()); painter.blit({ 0, 0 }, *m_monitor_bitmap, m_monitor_bitmap->rect()); painter.draw_scaled_bitmap(m_monitor_rect, *screen_bitmap, screen_bitmap->rect()); if (!m_desktop_resolution.is_null()) painter.draw_text(m_monitor_rect, m_desktop_resolution.to_string(), Gfx::TextAlignment::Center); }