Blender V5.0
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#include "BLI_string_utf8.h"
16
17#include "BLO_readfile.hh"
18
19#include "BLT_translation.hh"
20
21#include "BKE_blendfile.hh"
22#include "BKE_global.hh"
23#include "BKE_main.hh"
24
25#include "IMB_imbuf.hh"
26#include "IMB_metadata.hh"
27#include "IMB_thumbs.hh"
28
29#include "RNA_access.hh"
30
32#include "interface_intern.hh"
33
35 uiTooltipData &tip,
36 uiBut * /*but*/,
37 void *argN)
38{
39 char *path = (char *)argN;
40
41 /* File name and path. */
42 char dirname[FILE_MAX];
43 char filename[FILE_MAX];
44 BLI_path_split_dir_file(path, dirname, sizeof(dirname), filename, sizeof(filename));
47
49
50 if (!BLI_exists(path)) {
52 return;
53 }
54
55 /* Blender version. */
56 char version_str[128] = {0};
57 /* Load the thumbnail from cache if existing, but don't create if not. */
58 ImBuf *thumb = IMB_thumb_read(path, THB_LARGE);
59 if (thumb) {
60 /* Look for version in existing thumbnail if available. */
62 thumb->metadata, "Thumb::Blender::Version", version_str, sizeof(version_str));
63 }
64
65 eFileAttributes attributes = BLI_file_attributes(path);
66 if (!version_str[0] && !(attributes & FILE_ATTR_OFFLINE)) {
67 /* Load Blender version directly from the file. */
68 short version = BLO_version_from_file(path);
69 if (version != 0) {
70 SNPRINTF_UTF8(version_str, "%d.%01d", version / 100, version % 100);
71 }
72 }
73
74 if (version_str[0]) {
76 tip, fmt::format("Blender {}", version_str), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_NORMAL);
78 }
79
81 if (BLI_stat(path, &status) != -1) {
83 bool is_today, is_yesterday;
84 std::string day_string;
86 nullptr, int64_t(status.st_mtime), false, time_st, date_str, &is_today, &is_yesterday);
87 if (is_today || is_yesterday) {
88 day_string = (is_today ? N_("Today") : N_("Yesterday")) + std::string(" ");
89 }
91 fmt::format("{}: {}{}{}",
92 N_("Modified"),
93 day_string,
94 (is_today || is_yesterday) ? "" : date_str,
95 (is_today || is_yesterday) ? time_st : ""),
96 {},
99
100 if (status.st_size > 0) {
101 char size[16];
102 BLI_filelist_entry_size_to_string(nullptr, status.st_size, false, size);
104 tip, fmt::format("{}: {}", N_("Size"), size), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_NORMAL);
105 }
106 }
107
108 if (!thumb) {
109 /* try to load from the blend file itself. */
111 thumb = BKE_main_thumbnail_to_imbuf(nullptr, data);
112 if (data) {
114 }
115 }
116
117 if (thumb) {
120
121 uiTooltipImage image_data;
122 float scale = (72.0f * UI_SCALE_FAC) / float(std::max(thumb->x, thumb->y));
123 image_data.ibuf = thumb;
124 image_data.width = short(float(thumb->x) * scale);
125 image_data.height = short(float(thumb->y) * scale);
126 image_data.border = true;
127 image_data.background = uiTooltipImageBackground::Checkerboard_Themed;
128 image_data.premultiplied = true;
129 UI_tooltip_image_field_add(tip, image_data);
130 IMB_freeImBuf(thumb);
131 }
132}
133
134int uiTemplateRecentFiles(uiLayout *layout, int rows)
135{
136 int i = 0;
137 LISTBASE_FOREACH_INDEX (RecentFile *, recent, &G.recent_files, i) {
138 if (i >= rows) {
139 break;
140 }
141
142 const char *filename = BLI_path_basename(recent->filepath);
143 PointerRNA ptr = layout->op("WM_OT_open_mainfile",
144 filename,
145 BKE_blendfile_extension_check(filename) ? ICON_FILE_BLEND :
146 ICON_FILE_BACKUP,
149 RNA_string_set(&ptr, "filepath", recent->filepath);
150 RNA_boolean_set(&ptr, "display_file_selector", false);
151
152 uiBlock *block = layout->block();
153 uiBut *but = ui_but_last(block);
156 }
157
158 return i;
159}
bool BKE_blendfile_extension_check(const char *str)
Definition blendfile.cc:86
ImBuf * BKE_main_thumbnail_to_imbuf(Main *bmain, BlendThumbnail *data)
Definition main.cc:861
File and directory operations.
eFileAttributes BLI_file_attributes(const char *path)
Definition storage.cc:237
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition storage.cc:360
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_UTF8(dst, format,...)
const char * dirname(char *path)
external readfile function prototypes.
BlendThumbnail * BLO_thumbnail_from_file(const char *filepath)
Definition readfile.cc:1456
short BLO_version_from_file(const char *filepath)
Definition readfile.cc:1483
#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:504
@ 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
#define UI_ITEM_NONE
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
static void uiTemplateRecentFiles_tooltip_func(bContext &, uiTooltipData &tip, uiBut *, void *argN)
int uiTemplateRecentFiles(uiLayout *layout, int rows)
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
#define G(x, y, z)
const int status
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
uiBlock * block() const
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, blender::wm::OpCallContext context, eUI_Item_Flag flag)
i
Definition text_draw.cc:230
#define N_(msgid)
PointerRNA * ptr
Definition wm_files.cc:4238