/* UI-MANAGER.hpp - Global UI Manager Copyright (C) Lumiera.org 2008, Joel Holdsworth 2017, Hermann Vosseler This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file ui-manager.hpp ** Manager for application resources and similar global state. ** The central UiManager instance is owned by the GtkLumiera object and initialised in GTK-main. ** It offers services to provide Icons and other resources and to set and access a general UI theme. ** ** @see gtk-lumiera.hpp ** @see ui-bus.hpp */ #ifndef GUI_WORKSPACE_UI_MANAGER_H #define GUI_WORKSPACE_UI_MANAGER_H #include "gui/gtk-base.hpp" #include "gui/workspace/actions.hpp" #include "gui/workspace/window-list.hpp" #include #include #include #include namespace gui { namespace model { class Project; } ////////////////////////////////////////////////////TICKET #1048 : rectify UI lifecycle namespace controller { class Controller; } ////////////////////////////////////////////////////TICKET #1048 : rectify UI lifecycle class UiBus; namespace workspace { using std::shared_ptr; using std::string; /** * The centralised manager of all icons and resources within Lumiera's GUI. */ class UiManager : public Gtk::UIManager , boost::noncopyable { UiBus& uiBus_; WindowList windowList_; Actions actions_; string iconSearchPath_; string resourceSerachPath_; public: /** The registered icon size for giant 48x48 px icons. * @remarks This value is set to BuiltinIconSize::ICON_SIZE_INVALID * until register_giant_icon_size is called. */ static Gtk::IconSize GiantIconSize; /** The registered icon size for giant 16x16 px icons. * @remarks This value is set to BuiltinIconSize::ICON_SIZE_INVALID * until register_app_icon_sizes is called. */ static Gtk::IconSize MenuIconSize; public: /** * There is one global UiManager instance, * which is created by [the Application](\ref GtkLumiera) * and allows access to the UI-Bus backbone. The UiManager itself * is _not a ctrl::Controller,_ and thus not directly connected to the Bus. * Rather, supports the top-level windows for creating a consistent interface. */ UiManager (UiBus& bus); /** * Set up the first top-level application window. * This triggers the build-up of the user interface widgets. */ void createApplicationWindow(); /** @todo find a solution how to enable/disable menu entries according to focus * /////////////////////////////////////////////////TICKET #1076 find out how to handle this properly */ void updateWindowFocusRelatedActions(); /** * Sets the theme to use for the Lumiera GUI. * @param stylesheetName GTK CSS stylesheet to load from the resourceSearchPath_ * @throw error::Config if this stylesheet can't be resolved on the searchpath * @see #init * @see lumiera::Config */ void setTheme (string const& stylesheetName); /** * A utility function which reads a colour style from the GTK Style. * @param widget The widget to load the style out of. * @param property_name The name of the style property to load. * @param red The fallback red intensity. * @param green The fallback green intensity. * @param blue The fallback blue intensity. * @return The loaded colour. */ static Cairo::RefPtr readStyleColourProperty (Gtk::Widget &widget, const gchar *property_name, guint16 red, guint16 green, guint16 blue); void allowCloseWindow (bool yes); private: void initGlobalUI (); void registerAppIconSizes(); void registerStockItems(); /** * Adds an icon (in different sizes) to the icon factory. * @param factory The factory to add the icon to. * @param icon_name The file name of the icon to add. * @param id The id name of the icon. * @param label The user readable icon name for this icon. * @return \c true if the icon was successfully loaded, * returns \c false otherwise. */ bool addStockIconSet (Glib::RefPtr const& factory ,cuString& icon_name ,cuString& id ,cuString& label); /** * Loads an icon, searching standard icon locations, * and adds it to an icon set. * @param icon_set The icon set to add the icon to. * @param icon_name The file name of the icon to load. * @param size The size of the icon to load. * @param wildcard \c true if this icon is to be wildcarded. * @return \c true if the icon was loaded successfully. */ bool addStockIcon (Glib::RefPtr const& icon_set ,cuString& icon_name ,Gtk::IconSize size ,bool wildcard); /** * Loads an icon from a the icon theme * @param icon_set The icon set to add the icon to. * @param icon_name The name of the icon to load. * @param size The size of the icon to load. * @param wildcard \c true if this icon is to be wildcarded. * @return \c true if the icon was loaded successfully. */ bool addThemeIconSource (Glib::RefPtr const& icon_set ,cuString& icon_name ,Gtk::IconSize size ,bool wildcard); /** * Loads an icon from a non theme set. * @param icon_set The icon set to add the icon to. * @param base_dir The root icons directory to load from. * @param icon_name The file name of the icon to load. * @param size The size of the icon to load. * @param wildcard \c true if this icon is to be wildcarded. * @return \c true if the icon was loaded successfully. */ bool addNonThemeIconSource (Glib::RefPtr const& icon_set ,cuString& base_dir ,cuString& icon_name ,Gtk::IconSize size ,bool wildcard); /** * Loads an icon from a specific path and adds it to an icon set. * @param path The path to load from. * @param icon_set The icon set to add the icon to. * @param size The size of the icon to load. * @param wildcard \c true if this icon is to be wildcarded. * @return \c true if the icon was loaded successfully. */ bool addStockIconFromPath (string path ,Glib::RefPtr const& icon_set ,Gtk::IconSize size ,bool wildcard); private: }; }}// namespace gui::workspace #endif /*GUI_WORKSPACE_UI_MANAGER_H*/