diff --git a/Applications/FileManager/DirectoryModel.cpp b/Applications/FileManager/DirectoryModel.cpp index 8ec45ea55a..0b3bd1d50a 100644 --- a/Applications/FileManager/DirectoryModel.cpp +++ b/Applications/FileManager/DirectoryModel.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include DirectoryModel::DirectoryModel() { @@ -79,8 +81,18 @@ const GraphicsBitmap& DirectoryModel::icon_for(const Entry& entry) const return *m_socket_icon; if (entry.mode & S_IXUSR) return *m_executable_icon; - if (entry.name.ends_with(".png")) - return *m_filetype_image_icon; + if (entry.name.ends_with(".png")) { + if (!entry.thumbnail) { + if (auto png_bitmap = GraphicsBitmap::load_from_file(entry.full_path(*this))) { + entry.thumbnail = GraphicsBitmap::create(png_bitmap->format(), { 32, 32 }); + Painter painter(*entry.thumbnail); + painter.draw_scaled_bitmap(entry.thumbnail->rect(), *png_bitmap, png_bitmap->rect()); + } + } + if (!entry.thumbnail) + return *m_filetype_image_icon; + return *entry.thumbnail; + } return *m_file_icon; } diff --git a/Applications/FileManager/DirectoryModel.h b/Applications/FileManager/DirectoryModel.h index 592eac9887..6e743596e5 100644 --- a/Applications/FileManager/DirectoryModel.h +++ b/Applications/FileManager/DirectoryModel.h @@ -45,8 +45,10 @@ private: uid_t uid { 0 }; uid_t gid { 0 }; ino_t inode { 0 }; + mutable RetainPtr thumbnail; bool is_directory() const { return S_ISDIR(mode); } bool is_executable() const { return mode & S_IXUSR; } + String full_path(const DirectoryModel& model) const { return String::format("%s/%s", model.path().characters(), name.characters()); } }; const Entry& entry(int index) const diff --git a/SharedGraphics/GraphicsBitmap.h b/SharedGraphics/GraphicsBitmap.h index 26f3efa396..e48584df69 100644 --- a/SharedGraphics/GraphicsBitmap.h +++ b/SharedGraphics/GraphicsBitmap.h @@ -30,6 +30,7 @@ public: int shared_buffer_id() const { return m_shared_buffer ? m_shared_buffer->shared_buffer_id() : -1; } bool has_alpha_channel() const { return m_format == Format::RGBA32; } + Format format() const { return m_format; } private: GraphicsBitmap(Format, const Size&);