Blender V4.5
interface_template_recent_files.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <fmt/format.h>
10
11#include "BLI_fileops.h"
12#include "BLI_listbase.h"
13#include "BLI_path_utils.hh"
14#include "BLI_string.h"
15
16#include "BLO_readfile.hh"
17
18#include "BLT_translation.hh"
19
20#include "BKE_blendfile.hh"
21#include "BKE_global.hh"
22#include "BKE_main.hh"
23
24#include "IMB_imbuf.hh"
25#include "IMB_metadata.hh"
26#include "IMB_thumbs.hh"
27
28#include "RNA_access.hh"
29
30#include "UI_interface.hh"
31#include "interface_intern.hh"
32
33static void uiTemplateRecentFiles_tooltip_func(bContext & /*C*/, uiTooltipData &tip, void *argN)
34{
35 char *path = (char *)argN;
36
37 /* File name and path. */
38 char dirname[FILE_MAX];
39 char filename[FILE_MAX];
40 BLI_path_split_dir_file(path, dirname, sizeof(dirname), filename, sizeof(filename));
43
45
46 if (!BLI_exists(path)) {
48 return;
49 }
50
51 /* Blender version. */
52 char version_str[128] = {0};
53 /* Load the thumbnail from cache if existing, but don't create if not. */
54 ImBuf *thumb = IMB_thumb_read(path, THB_LARGE);
55 if (thumb) {
56 /* Look for version in existing thumbnail if available. */
58 thumb->metadata, "Thumb::Blender::Version", version_str, sizeof(version_str));
59 }
60
61 eFileAttributes attributes = BLI_file_attributes(path);
62 if (!version_str[0] && !(attributes & FILE_ATTR_OFFLINE)) {
63 /* Load Blender version directly from the file. */
64 short version = BLO_version_from_file(path);
65 if (version != 0) {
66 SNPRINTF(version_str, "%d.%01d", version / 100, version % 100);
67 }
68 }
69
70 if (version_str[0]) {
72 tip, fmt::format("Blender {}", version_str), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_NORMAL);
74 }
75
76 BLI_stat_t status;
77 if (BLI_stat(path, &status) != -1) {
79 bool is_today, is_yesterday;
80 std::string day_string;
82 nullptr, int64_t(status.st_mtime), false, time_st, date_str, &is_today, &is_yesterday);
83 if (is_today || is_yesterday) {
84 day_string = (is_today ? N_("Today") : N_("Yesterday")) + std::string(" ");
85 }
87 fmt::format("{}: {}{}{}",
88 N_("Modified"),
89 day_string,
90 (is_today || is_yesterday) ? "" : date_str,
91 (is_today || is_yesterday) ? time_st : ""),
92 {},
95
96 if (status.st_size > 0) {
97 char size[16];
98 BLI_filelist_entry_size_to_string(nullptr, status.st_size, false, size);
100 tip, fmt::format("{}: {}", N_("Size"), size), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_NORMAL);
101 }
102 }
103
104 if (!thumb) {
105 /* try to load from the blend file itself. */
107 thumb = BKE_main_thumbnail_to_imbuf(nullptr, data);
108 if (data) {
110 }
111 }
112
113 if (thumb) {
116
117 uiTooltipImage image_data;
118 float scale = (72.0f * UI_SCALE_FAC) / float(std::max(thumb->x, thumb->y));
119 image_data.ibuf = thumb;
120 image_data.width = short(float(thumb->x) * scale);
121 image_data.height = short(float(thumb->y) * scale);
122 image_data.border = true;
123 image_data.background = uiTooltipImageBackground::Checkerboard_Themed;
124 image_data.premultiplied = true;
125 UI_tooltip_image_field_add(tip, image_data);
126 IMB_freeImBuf(thumb);
127 }
128}
129
130int uiTemplateRecentFiles(uiLayout *layout, int rows)
131{
132 int i = 0;
133 LISTBASE_FOREACH_INDEX (RecentFile *, recent, &G.recent_files, i) {
134 if (i >= rows) {
135 break;
136 }
137
138 const char *filename = BLI_path_basename(recent->filepath);
139 PointerRNA ptr = layout->op("WM_OT_open_mainfile",
140 filename,
141 BKE_blendfile_extension_check(filename) ? ICON_FILE_BLEND :
142 ICON_FILE_BACKUP,
145 RNA_string_set(&ptr, "filepath", recent->filepath);
146 RNA_boolean_set(&ptr, "display_file_selector", false);
147
148 uiBlock *block = uiLayoutGetBlock(layout);
149 uiBut *but = ui_but_last(block);
152 }
153
154 return i;
155}
bool BKE_blendfile_extension_check(const char *str)
Definition blendfile.cc:84
ImBuf * BKE_main_thumbnail_to_imbuf(Main *bmain, BlendThumbnail *data)
Definition main.cc:846
File and directory operations.
eFileAttributes BLI_file_attributes(const char *path)
Definition storage.cc:250
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition storage.cc:373
int BLI_stat(const char *path, BLI_stat_t *buffer) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_filelist_entry_size_to_string(const struct stat *st, uint64_t st_size_fallback, bool compact, char r_size[FILELIST_DIRENTRY_SIZE_LEN])
struct stat BLI_stat_t
void BLI_filelist_entry_datetime_to_string(const struct stat *st, int64_t ts, bool compact, char r_time[FILELIST_DIRENTRY_TIME_LEN], char r_date[FILELIST_DIRENTRY_DATE_LEN], bool *r_is_today, bool *r_is_yesterday)
eFileAttributes
@ FILE_ATTR_OFFLINE
#define FILELIST_DIRENTRY_DATE_LEN
#define FILELIST_DIRENTRY_TIME_LEN
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void void void const char * BLI_path_basename(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
#define FILE_MAX
void BLI_path_split_dir_file(const char *filepath, char *dir, size_t dir_maxncpy, char *file, size_t file_maxncpy) ATTR_NONNULL(1
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
Definition string.cc:41
#define SNPRINTF(dst, format,...)
Definition BLI_string.h:599
const char * dirname(char *path)
external readfile function prototypes.
BlendThumbnail * BLO_thumbnail_from_file(const char *filepath)
Definition readfile.cc:1467
short BLO_version_from_file(const char *filepath)
Definition readfile.cc:1494
#define UI_SCALE_FAC
void IMB_freeImBuf(ImBuf *ibuf)
bool IMB_metadata_get_field(const IDProperty *metadata, const char *key, char *value, size_t value_maxncpy)
Definition metadata.cc:41
ImBuf * IMB_thumb_read(const char *file_or_lib_path, ThumbSize size)
Definition thumbs.cc:500
@ THB_LARGE
Definition IMB_thumbs.hh:23
void UI_but_func_tooltip_custom_set(uiBut *but, uiButToolTipCustomFunc func, void *arg, uiFreeArgFunc free_arg)
void UI_tooltip_image_field_add(uiTooltipData &data, const uiTooltipImage &image_data)
void UI_tooltip_text_field_add(uiTooltipData &data, std::string text, std::string suffix, const uiTooltipStyle style, const uiTooltipColorID color_id, const bool is_pad=false)
@ UI_TIP_STYLE_NORMAL
@ UI_TIP_STYLE_SPACER
@ UI_TIP_STYLE_HEADER
@ UI_TIP_LC_ALERT
@ UI_TIP_LC_NORMAL
uiBlock * uiLayoutGetBlock(uiLayout *layout)
#define UI_ITEM_NONE
@ WM_OP_INVOKE_DEFAULT
Definition WM_types.hh:238
BMesh const char void * data
long long int int64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
uiBut * ui_but_last(uiBlock *block) ATTR_WARN_UNUSED_RESULT
int uiTemplateRecentFiles(uiLayout *layout, int rows)
static void uiTemplateRecentFiles_tooltip_func(bContext &, uiTooltipData &tip, void *argN)
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
#define G(x, y, z)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
IDProperty * metadata
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, wmOperatorCallContext context, eUI_Item_Flag flag)
i
Definition text_draw.cc:230
#define N_(msgid)
PointerRNA * ptr
Definition wm_files.cc:4226