Επιλογή προσφάτων (RecentChooser)
RecentChooser is an interface that can be implemented by widgets displaying the list of recently used files. gtkmm provides four built-in implementations for choosing recent files: RecentChooserWidget, RecentChooserDialog, RecentChooserMenu, and the deprecated RecentAction.
Η RecentChooserWidget είναι ένα απλό γραφικό συστατικό για εμφάνιση ενός καταλόγου των πρόσφατα χρησιμοποιημένων αρχείων. Η RecentChooserWidget είναι η βασική ομάδα δόμησης για την RecentChooserDialog, αλλά μπορείτε να την ενσωματώσετε στη διεπαφή χρήστη αν θέλετε.
RecentChooserMenu allows you to list recently used files as a menu.
21.2.1. Απλό παράδειγμα διαλόγου επιλογής προσφάτων (RecentChooserDialog)
Shown below is a simple example of how to use the RecentChooserDialog class in a program. This simple program has a menubar with a menu item. When you select this menu item, a dialog pops up showing the list of recently used files.
Αν αυτή είναι η πρώτη φορά που χρησιμοποιείτε ένα πρόγραμμα που χρησιμοποιεί τον σκελετό πρόσφατων αρχείων, ο διάλογος μπορεί να είναι κενός στην αρχή. Αλλιώς πρέπει να εμφανίσει έναν κατάλογο των πρόσφατα χρησιμοποιημένων καταχωρισμένων εγγράφων από άλλες εφαρμογές.
Μετά την επιλογή του στοιχείου μενού
, θα πρέπει να δείτε κάτι παρόμοιο με το παρακάτω παράθυρο.
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(const Glib::RefPtr<Gtk::Application>& app); 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::Builder> m_refBuilder; Glib::RefPtr<Gio::SimpleActionGroup> m_refActionGroup; Glib::RefPtr<Gtk::RecentManager> m_refRecentManager; }; #endif //GTKMM_EXAMPLEWINDOW_H
File: main.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" #include <gtkmm/application.h> int main(int argc, char *argv[]) { auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example"); ExampleWindow window(app); //Shows the window and returns when it is closed. return app->run(window); }
File: examplewindow.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" #include <iostream> ExampleWindow::ExampleWindow(const Glib::RefPtr<Gtk::Application>& app) : 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 = Gio::SimpleActionGroup::create(); //File menu: m_refActionGroup->add_action("new", sigc::mem_fun(*this, &ExampleWindow::on_menu_file_new)); //A menu item to open the recent-files dialog: m_refActionGroup->add_action("recent-files-dialog", sigc::mem_fun(*this, &ExampleWindow::on_menu_file_recent_files_dialog) ); m_refActionGroup->add_action("quit", sigc::mem_fun(*this, &ExampleWindow::on_menu_file_quit) ); insert_action_group("example", m_refActionGroup); m_refBuilder = Gtk::Builder::create(); // When the menubar is a child of a Gtk::Window, keyboard accelerators are not // automatically fetched from the Gio::Menu. // See the examples/book/menus/main_menu example for an alternative way of // adding the menubar when using Gtk::ApplicationWindow. app->set_accel_for_action("example.new", "<Primary>n"); app->set_accel_for_action("example.recent-files-dialog", "<Primary>o"); app->set_accel_for_action("example.quit", "<Primary>q"); //Layout the actions in a menubar and a toolbar: const char* ui_info = "<interface>" " <menu id='menubar'>" " <submenu>" " <attribute name='label' translatable='yes'>_File</attribute>" " <item>" " <attribute name='label' translatable='yes'>_New</attribute>" " <attribute name='action'>example.new</attribute>" " <attribute name='accel'><Primary>n</attribute>" " </item>" " <item>" " <attribute name='label' translatable='yes'>Recent Files _Dialog</attribute>" " <attribute name='action'>example.recent-files-dialog</attribute>" " <attribute name='accel'><Primary>o</attribute>" " </item>" " <item>" " <attribute name='label' translatable='yes'>_Quit</attribute>" " <attribute name='action'>example.quit</attribute>" " <attribute name='accel'><Primary>q</attribute>" " </item>" " </submenu>" " </menu>" " <object class='GtkToolbar' id='toolbar'>" " <property name='visible'>True</property>" " <property name='can_focus'>False</property>" " <child>" " <object class='GtkToolButton' id='toolbutton_new'>" " <property name='visible'>True</property>" " <property name='can_focus'>False</property>" " <property name='tooltip_text' translatable='yes'>New</property>" " <property name='action_name'>example.new</property>" " <property name='icon_name'>document-new</property>" " </object>" " <packing>" " <property name='expand'>False</property>" " <property name='homogeneous'>True</property>" " </packing>" " </child>" " <child>" " <object class='GtkToolButton' id='toolbutton_quit'>" " <property name='visible'>True</property>" " <property name='can_focus'>False</property>" " <property name='tooltip_text' translatable='yes'>Quit</property>" " <property name='action_name'>example.quit</property>" " <property name='icon_name'>application-exit</property>" " </object>" " <packing>" " <property name='expand'>False</property>" " <property name='homogeneous'>True</property>" " </packing>" " </child>" " </object>" "</interface>"; try { m_refBuilder->add_from_string(ui_info); } catch(const Glib::Error& ex) { std::cerr << "building menubar and toolbar failed: " << ex.what(); } //Get the menubar and toolbar widgets, and add them to a container widget: auto object = m_refBuilder->get_object("menubar"); auto gmenu = Glib::RefPtr<Gio::Menu>::cast_dynamic(object); if (gmenu) { //Menubar: auto pMenubar = Gtk::manage(new Gtk::MenuBar(gmenu)); m_Box.pack_start(*pMenubar, Gtk::PACK_SHRINK); } else g_warning("GMenu not found"); Gtk::Toolbar* pToolbar = nullptr; m_refBuilder->get_widget("toolbar", pToolbar); if (pToolbar) //Toolbar: m_Box.pack_start(*pToolbar, Gtk::PACK_SHRINK); else g_warning("GtkToolbar not found"); 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_dialog() { Gtk::RecentChooserDialog dialog(*this, "Recent Files", m_refRecentManager); dialog.add_button("Select File", Gtk::RESPONSE_OK); dialog.add_button("_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; } }
The constructor for ExampleWindow creates the menu and the toolbar using Builder (see Κεφάλαιο 12 ― Μενού και Εργαλειοθήκες for more information). It then adds the menu and the toolbar to the window.
21.2.2. Φιλτράρισμα πρόσφατων αρχείων
Για οποιαδήποτε κλάση RecentChooser, αν δεν θέλετε να εμφανίσετε όλα τα στοιχεία στον κατάλογο των πρόσφατων αρχείων, μπορείτε να φιλτράρετε τον κατάλογο για να εμφανίσετε μόνο αυτά που θέλετε. Μπορείτε να φιλτράρετε τον κατάλογο με τη βοήθεια της κλάσης RecentFilter. Αυτή η κλάση επιτρέπει το φιλτράρισμα πρόσφατων αρχείων με το όνομά τους (add_pattern()), τον mime τύπο τους, (add_mime_type()), την εφαρμογή που τις καταχωρίζει (add_application()), ή με μια συνάρτηση προσαρμοσμένου φίλτρου (add_custom()). Παρέχει επίσης τη δυνατότητα φιλτραρίσματος με βάση τον χρόνο τροποποίησης και τις ομάδες που ανήκει.
Αφού έχετε δημιουργήσει και ρυθμίσει το φίλτρο να ταιριάζει μόνο τα στοιχεία που θέλετε, μπορείτε να εφαρμόσετε ένα φίλτρο σε ένα γραφικό συστατικό επιλογής με τη συνάρτηση RecentChooser::add_filter().