RecentChooser

RecentChooser es una interfaz que pueden implementar los widgets que muestran la lista de archivos usados recientemente. gtkmm proporciona cuatro implementaciones incorporadas para elegir archivos recientes: RecentChooserWidget, RecentChooserDialog, RecentChooserMenu, y RecentAction.

RecentChooserWidget es un widget simple para mostrar una lista de archivos usados recientemente. RecentChooserWidget es el bloque de construcción básico de RecentChooserDialog, pero puede empotrarlo en su interfaz de usuario si quiere.

RecentChooserMenu y RecentAction le permiten listar archivos usados recientemente en un menú.

21.2.1. Ejemplo de RecentChooserDialog

Se muestra a continuación un ejemplo simple de cómo usar las clases RecentChooserDialog y RecentAction en un programa. Este programa simple tiene una barra de menú con un elemento de menú Recent Files Dialog. Cuando seleccione este elemento, aparecerá un diálogo mostrando la lista de archivos recientemente usados.

Si esta es la primera vez que usa un programa que utiliza el sistema de archivos recientes, el diálogo podría estar vacío. De lo contrario, debería mostrar la lista de documentos recientemente usados registrados por otras aplicaciones.

Después de haber seleccionado el elemento del menú Recent Files Dialog, debería ver algo similar a la siguiente ventana.

Código fuente

File: examplewindow.h (For use with gtkmm 3, not gtkmm 2)

#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //Signal handlers:
  void on_menu_file_recent_files_item();
  void on_menu_file_recent_files_dialog();
  void on_menu_file_quit();
  void on_menu_file_new();

  //Child widgets:
  Gtk::Box m_Box;

  Glib::RefPtr<Gtk::UIManager> m_refUIManager;
  Glib::RefPtr<Gtk::ActionGroup> m_refActionGroup;
  Glib::RefPtr<Gtk::RecentAction> m_refRecentAction;

  Glib::RefPtr<Gtk::RecentManager> m_refRecentManager;
};

#endif //GTKMM_EXAMPLEWINDOW_H

File: examplewindow.cc (For use with gtkmm 3, not gtkmm 2)

#include "examplewindow.h"
#include <gtkmm/stock.h>
#include <iostream>

ExampleWindow::ExampleWindow()
: m_Box(Gtk::ORIENTATION_VERTICAL),
  m_refRecentManager(Gtk::RecentManager::get_default())
{
  set_title("recent files example");
  set_default_size(200, 200);

  //We can put a MenuBar at the top of the box and other stuff below it.
  add(m_Box);

  //Create actions for menus and toolbars:
  m_refActionGroup = Gtk::ActionGroup::create();

  //File menu:
  m_refActionGroup->add( Gtk::Action::create("FileMenu", "_File") );
  m_refActionGroup->add( Gtk::Action::create("FileNew", Gtk::Stock::NEW),
    sigc::mem_fun(*this, &ExampleWindow::on_menu_file_new));

  //A recent-files submenu:
  m_refRecentAction = Gtk::RecentAction::create("FileRecentFiles", "_Recent Files");
  m_refActionGroup->add(m_refRecentAction);
  //Connect to RecentChooser's item_activated signal
  //instead of Action's activate signal:
  m_refRecentAction->signal_item_activated().connect(
    sigc::mem_fun(*this, &ExampleWindow::on_menu_file_recent_files_item) );

  //A menu item to open the recent-files dialog:
  m_refActionGroup->add( Gtk::Action::create("FileRecentDialog", "Recent Files _Dialog"),
    sigc::mem_fun(*this, &ExampleWindow::on_menu_file_recent_files_dialog) );

  m_refActionGroup->add( Gtk::Action::create("FileQuit", Gtk::Stock::QUIT),
    sigc::mem_fun(*this, &ExampleWindow::on_menu_file_quit) );

  m_refUIManager = Gtk::UIManager::create();
  m_refUIManager->insert_action_group(m_refActionGroup);

  add_accel_group(m_refUIManager->get_accel_group());

  //Layout the actions in a menubar and toolbar:
  Glib::ustring ui_info =
        "<ui>"
        "  <menubar name='MenuBar'>"
        "    <menu action='FileMenu'>"
        "      <menuitem action='FileNew'/>"
        "      <menuitem action='FileRecentFiles'/>"
        "      <menuitem action='FileRecentDialog'/>"
        "      <separator/>"
        "      <menuitem action='FileQuit'/>"
        "    </menu>"
        "  </menubar>"
        "  <toolbar  name='ToolBar'>"
        "    <toolitem action='FileNew'/>"
        "    <toolitem action='FileQuit'/>"
        "  </toolbar>"
        "</ui>";

  try
  {
    m_refUIManager->add_ui_from_string(ui_info);
  }
  catch(const Glib::Error& ex)
  {
    std::cerr << "building menus failed: " <<  ex.what();
  }

  //Get the menubar and toolbar widgets, and add them to a container widget:
  Gtk::Widget* pMenubar = m_refUIManager->get_widget("/MenuBar");
  if(pMenubar)
    m_Box.pack_start(*pMenubar, Gtk::PACK_SHRINK);

  Gtk::Widget* pToolbar = m_refUIManager->get_widget("/ToolBar");
  if(pToolbar)
    m_Box.pack_start(*pToolbar, Gtk::PACK_SHRINK);

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}

void ExampleWindow::on_menu_file_new()
{
  std::cout << " New File" << std::endl;
}

void ExampleWindow::on_menu_file_quit()
{
  hide(); //Closes the main window to stop the app->run().
}

void ExampleWindow::on_menu_file_recent_files_item()
{
  std::cout << "URI selected = " << m_refRecentAction->get_current_uri() << std::endl;
}

void ExampleWindow::on_menu_file_recent_files_dialog()
{
  Gtk::RecentChooserDialog dialog(*this, "Recent Files", m_refRecentManager);
  dialog.add_button("Select File", Gtk::RESPONSE_OK);
  dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);

  const int response = dialog.run();
  dialog.hide();
  if(response == Gtk::RESPONSE_OK)
  {
    std::cout << "URI selected = " << dialog.get_current_uri() << std::endl;
  }
}

File: main.cc (For use with gtkmm 3, not gtkmm 2)

#include "examplewindow.h"
#include <gtkmm/application.h>

int main(int argc, char *argv[])
{
  Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

  ExampleWindow window;

  //Shows the window and returns when it is closed.
  return app->run(window);
}

El constructor de ExampleWindow crea el menú usando UIManager (consulte la Capítulo 12: Menús y barras de herramientas para obtener más información). Luego, añade el menú y la barra de herramientas a la ventana.

21.2.2. Filtrar los archivos recientes

Para cualquiera de las clases RecentChooser, si no quiere mostrar todos los elementos en la lista de archivos recientes, puede filtrarlos para mostrar sólo aquellos que quiere. Puede realizar esto con ayuda de la clase RecentFilter. Esta clase le permite filtrar los archivos recientes por su nombre (add_pattern()), su tipo MIME (add_mime_type()), la aplicación que los registró (add_application()), o una función de filtrado personalizada (add_custom()). También proporciona la posibilidad de filtrar de acuerdo a cuánto tiempo pasó desde que el archivo se modificó y a qué grupo pertenece.

Después de que haya creado y configurado el filtro para seleccionar sólo los elementos que quiera, podrá aplicárselo a un widget selector con la función RecentChooser::add_filter().