最近管理器(RecentManager)

RecentManager充当最近使用文件的数据库。你可以使用此类注册新文件、从列表中删除文件、查找最近使用文件。每个用户都拥有一个最近使用的文件列表。

你可以创建一个新的RecentManager,但你可能只想用默认的那个。你可以通过get_default()获取默认RecentManager的引用。

20.1.1. 将项目添加到最近文件列表

在最简单的情况下,要添加项目到最近文件列表只需要提供一个URI即可。例如:

auto recent_manager = Gtk::RecentManager::get_default();
recent_manager->add_item(uri);

如果你想要使用元数据注册一个文件,你可以将RecentManager::Data参数传递给add_item()。可以在特定的文件项上设置的元数据如下所示:

  • app_exec:用于启动此资源的命令行。此字符串可以包含"f"和"u"转义字符,它们将分别扩展为资源文件路径和URI
  • app_name:此资源注册的应用程序名
  • description:资源的简单描述(UTF-8编码字符串)
  • display_name:用于显示的资源名(UTF-8编码字符串)
  • groups:与该项相关联的组列表。组本质上是与特定资源相关联的任意字符串。可以将它们视为资源的类别(例如:电子邮件、图形等)或标签
  • is_private:此资源是否仅对已注册该资源的应用程序可见
  • mime_type:此资源的MIME类型

除了向列表中添加项目以外,你还可以从列表项中删除、修改、查找项目。

20.1.2. 在最近文件列表中查找项目

RecentManager提供了几个函数用以查找最近使用过的文件。你可以使用lookup_item()函数通过URI来查找特定项目,该函数将返回一个RecentInfo类对象。如果指定的URI于最近文件列表中不存在,则lookup_item()将抛出一个RecentManagerError异常。例如:

Glib::RefPtr<Gtk::RecentInfo> info;
try
{
  info = recent_manager->lookup_item(uri);
}
catch(const Gtk::RecentManagerError& ex)
{
  std::cerr << "RecentManagerError: " << ex.what() << std::endl;
}
if (info)
{
  // item was found
}

本质上,RecentInfo是个包含了一个最近使用文件的所有元数据的对象。你可以使用该对象查找这里所列出的任何属性。

如果你不想要查找一个特定的URI,而是想获取整个最近使用的项目列表,RecentManager为此提供了get_items()函数。这个函数返回值是一个std::vector,其包含了所有最近使用的文件。以下代码演示了你该如何获取最近使用文件列表:

auto info_list = recent_manager->get_items();

可以使用Gtk::Settings::property_gtk_recent_files_max_age()设置最近使用文件列表中项目的最长使用期限。默认时长是:30天。

20.1.3. 修改最近使用文件列表

有时候你会需要修改最近使用文件列表。例如,当一个文件被移动或重命名,你需要更新该文件在最近使用文件列表中的位置,以使其不会指向错误的位置。你可以使用move_item()来更新项目的位置。

除了更改文件的URI以外,你还可以从列表中删除项目或是一次性清除所有项目。前者使用remove_item(),后者使用purge_items()

move_item()remove_item()purge_items()并不影响URI所引用的真实文件,它们只是对最近文件列表进行修改。