TachyonUI 0.1.0
High-performance UI for building tools.
Loading...
Searching...
No Matches
gui_file_thumbnails.h
Go to the documentation of this file.
1#pragma once
2
3// Pictures of what's in files, as the OS shows them in its file views: a photo's, a frame of
4// a video, a document's first page. Read off the UI thread.
5
8
9#include <chrono>
10#include <condition_variable>
11#include <cstdint>
12#include <filesystem>
13#include <functional>
14#include <list>
15#include <mutex>
16#include <string>
17#include <thread>
18#include <unordered_map>
19#include <vector>
20
21namespace tachyon
22{
23 class ITextSystem;
24
27
40 {
41 public:
43 struct Picture
44 {
46 std::vector<uint8_t> rgba;
47 };
48
50 using Reader = std::function<bool(const std::filesystem::path& file, uint32_t pixels, Picture& picture)>;
51
52 explicit FileThumbnails(ITextSystem& textSystem, size_t capacity = 512, Reader reader = ShellReader(),
53 std::chrono::milliseconds inUse = std::chrono::milliseconds(500));
57
62 IconID Get(const std::filesystem::path& file, std::filesystem::file_time_type modified, uint32_t pixels);
63
65 size_t Count() const { return m_entries.size(); }
67 size_t Reading();
68
70 static std::string Key(const std::filesystem::path& file, std::filesystem::file_time_type modified, uint32_t pixels);
74
75 private:
76 struct Entry
77 {
79 bool pending = true;
80 std::list<std::string>::iterator used;
81 std::chrono::steady_clock::time_point asked;
82 };
83 struct Job
84 {
85 std::string key;
86 std::filesystem::path file;
87 uint32_t pixels = 0;
88 };
89 struct Done
90 {
91 std::string key;
92 bool ok = false;
93 Picture picture;
94 };
95
96 void Collect();
97 void Forget(const std::string& key);
98 void Work();
99
100 ITextSystem& m_textSystem;
101 size_t m_capacity;
102 Reader m_reader;
103 std::chrono::milliseconds m_inUse;
104 std::unordered_map<std::string, Entry> m_entries;
105 std::list<std::string> m_used;
106
107 // Shared with the reading thread.
108 std::mutex m_mutex;
109 std::condition_variable m_wake;
110 std::vector<Job> m_jobs;
111 std::vector<Done> m_done;
112 bool m_stop = false;
113 std::thread m_thread;
114 };
115
116#ifdef _WIN32
117 namespace detail
118 {
121 bool BitmapPixels(void* bitmap, uint32_t& width, uint32_t& height, std::vector<uint8_t>& rgba);
122 }
123#endif
124
126}
FileThumbnails & operator=(const FileThumbnails &)=delete
static std::string Key(const std::filesystem::path &file, std::filesystem::file_time_type modified, uint32_t pixels)
What a thumbnail is kept by: the same for the same file, time and size.
FileThumbnails(ITextSystem &textSystem, size_t capacity=512, Reader reader=ShellReader(), std::chrono::milliseconds inUse=std::chrono::milliseconds(500))
size_t Reading()
How many of those are still being read.
FileThumbnails(const FileThumbnails &)=delete
std::function< bool(const std::filesystem::path &file, uint32_t pixels, Picture &picture)> Reader
Reads file's thumbnail, at most pixels square, keeping its shape.
Definition gui_file_thumbnails.h:50
IconID Get(const std::filesystem::path &file, std::filesystem::file_time_type modified, uint32_t pixels)
The thumbnail of the file file on the disk, last written at modified, at most pixels square (the icon...
static Reader ShellReader()
The Windows shell's thumbnails (IShellItemImageFactory, thumbnails only, never the type's icon); an e...
size_t Count() const
How many are kept, read or still being read.
Definition gui_file_thumbnails.h:65
Text and icon registration, measurement, rendering and editing.
Definition gui_text_system.h:178
IconID
Handle for an icon registered with ITextSystem::RegisterIconFromSVG / RegisterIconFromSVGFile.
Definition gui_style_text.h:15
@ Invalid
Definition gui_style_text.h:15
Definition gui_logging.h:24
RGBA pixels, rows from the top, straight alpha.
Definition gui_file_thumbnails.h:44
uint2 size
Definition gui_file_thumbnails.h:45
std::vector< uint8_t > rgba
Definition gui_file_thumbnails.h:46
Definition gui_base_types.h:75