. /** * Icon set class for format tiles. * @package format_tiles * @copyright 2019 David Watson {@link http://evolutioncode.uk} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace format_tiles; use core\output\icon_system; defined('MOODLE_INTERNAL') || die(); /** * Icon set class for format tiles. * @package format_tiles * @copyright 2019 David Watson {@link http://evolutioncode.uk} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class icon_set { /** * Should this plugin use font awesome or not? * This variable is provided to give developers an easy way to disable FA for this plugin if they need to. * The reason is that sometimes a theme *seems* to support FA, but in reality does so with issues. * If set to false, images in pix/tileicon etc will be used instead of FA. * If you change this in code, purge all caches afterwards. * @var bool */ private $usefontawesome = true; // Change this to false if you don't want "Tiles" plugin to use font awesome. /** * These are shown on tiles. The teacher chooses which one to apply to each tile or course. * To make more icons available to a teacher, add them here using the set at https://fontawesome.com/v4.7.0/icons/. * Alternatively, if your theme does not support Font Awesome or you want to use image files, add them to pix/tileicon. * The files in pix/tileicon are only used as a fallback, if the theme does not support font awesome. * In both cases, you will then need to purge all caches to ensure that the new icon is visible. * @var array */ private $fontawesometileicons = [ 'fa-asterisk', 'fa-address-book-o', 'fa-balance-scale', 'fa-bar-chart', 'fa-bell-o', 'fa-binoculars', 'fa-bitcoin', 'fa-bookmark-o', 'fa-briefcase', 'fa-building', 'fa-bullhorn', 'fa-bullseye', 'fa-calculator', 'fa-calendar', 'fa-calendar-check-o', 'fa-check', 'fa-child', 'fa-clock-o', 'fa-clone', 'fa-cloud-download', 'fa-cloud-upload', 'fa-comment-o', 'fa-comments-o', 'fa-compass', 'fa-diamond', 'fa-dollar', 'fa-euro', 'fa-exclamation-triangle', 'fa-feed', 'fa-file-text-o', 'fa-film', 'fa-flag-checkered', 'fa-flag-o', 'fa-flash', 'fa-flask', 'fa-frown-o', 'fa-gavel', 'fa-gbp', 'fa-globe', 'fa-handshake-o', 'fa-headphones', 'fa-heartbeat', 'fa-history', 'fa-home', 'fa-id-card-o', 'fa-info', 'fa-key', 'fa-laptop', 'fa-life-buoy', 'fa-lightbulb-o', 'fa-line-chart', 'fa-list', 'fa-list-ol', 'fa-location-arrow', 'fa-map-marker', 'fa-map-o', 'fa-map-signs', 'fa-microphone', 'fa-mobile-phone', 'fa-mortar-board', 'fa-music', 'fa-newspaper-o', 'fa-pencil-square-o', 'fa-pie-chart', 'fa-podcast', 'fa-puzzle-piece', 'fa-question-circle', 'fa-random', 'fa-refresh', 'fa-road', 'fa-search', 'fa-sliders', 'fa-smile-o', 'fa-star', 'fa-star-half-o', 'fa-star-o', 'fa-tags', 'fa-tasks', 'fa-television', 'fa-thumbs-o-down', 'fa-thumbs-o-up', 'fa-trophy', 'fa-umbrella', 'fa-university', 'fa-user-o', 'fa-users', 'fa-volume-up', 'fa-wrench' ]; /** * In order to populate the option menus under course setting which allow the user to select * a tile icon from all those available, iterates through all font awesome icons and images in * the relevant directory and generates a suitable menu option for each icon. * As to the display name, for an icon in the pix directory (e.g. book.svg) then lang string 'icontitle-book" is sought. * Likewise for a font awesome icon called 'fa-tasks', a lang string 'icontitle-tasks' is sought. * If the language string is not found (e.g. it is a custom icon added to pix with no lang string), filename is used. * @param int $courseid the id of the course we are in (so we can mark the default icon for this course). * @return array of tile icons * @throws \coding_exception * @throws \dml_exception */ public function available_tile_icons($courseid = 0) { global $CFG, $PAGE, $DB; $stringmanager = get_string_manager(); $availableicons = []; // First if the theme supports font awesome, use the available font awesome tile icons. // Using $PAGE->theme->get_icon_system()==icons_system::fontawesome does not work for Moove. // However Moove does support font awesome for {{pix}}, so we add a whitelist too. if ($this->usefontawesome) { $fontawesomethemeswhitelist = ['moove']; try { $faiconsystem = $PAGE->theme->get_icon_system() == icon_system::FONTAWESOME; } catch (\Exception $ex) { $faiconsystem = false; debugging( 'Could not get theme icon system. Using fallback /pix images for tile icons. ' . $ex->getMessage(), DEBUG_DEVELOPER ); } if ($faiconsystem || array_search($PAGE->theme->name, $fontawesomethemeswhitelist) !== false) { foreach ($this->fontawesometileicons as $iconname) { $pixname = str_replace('fa-', '', $iconname); if ($stringmanager->string_exists('icontitle-' . $pixname, 'format_tiles')) { $displayname = get_string('icontitle-' . $pixname, 'format_tiles'); } else { $displayname = ucwords(str_replace('_', ' ', (str_replace('-', ' ', $pixname)))); } $availableicons[$pixname] = $displayname; } } } // Now look for any supplemental image file (i.e. non font awesome icons) which are available as tile icons. // Add them to the list. // Ideally all of the icons would be removed from the pix directorym except custom non font-awesome icons. // The reason is that those fallback images are never called if the theme is font awesome compatible (as fa is used). // However they are left in pix for now as some older themes (e.g. Clean) may need them. $iconsindirectory = get_directory_list($CFG->dirroot . '/course/format/tiles/pix/tileicon', '', false, false, true); foreach ($iconsindirectory as $icon) { $filename = explode('.', $icon)[0]; // If we don't already have it from font awesome (e.g. book, flipchart, assessment_timer), then add it here. if (!isset($availableicons[$filename])) { if ($stringmanager->string_exists('icontitle-' . $filename, 'format_tiles')) { $displayname = get_string('icontitle-' . $filename, 'format_tiles'); } else { $displayname = ucwords(str_replace('_', ' ', (str_replace('-', ' ', $filename)))); } $availableicons[$filename] = $displayname; } } asort($availableicons); if (!$courseid) { return $availableicons; } else { // Put the default course icon in first place. $defaulticon = $DB->get_field('course_format_options', 'value', array( 'courseid' => $courseid, 'format' => 'tiles', 'sectionid' => 0, 'name' => 'defaulttileicon' )); if ($defaulticon) { $removedicondescription = $availableicons[$defaulticon] . ' (' . get_string('default') . ')'; unset($availableicons[$defaulticon]); $availableicons = array_merge(array($defaulticon => $removedicondescription), $availableicons); } return $availableicons; } } /** * Lib.php calls this for example when caches are purged or plugin is updated, to get latest FA icon map. * @see format_tiles_get_fontawesome_icon_map() * @return array */ public function get_font_awesome_icon_map() { if (!$this->usefontawesome) { return []; } // First the general icons (not specific to tiles). // These are used for example to show nav buttons within tiles. $generalicons = [ 'format_tiles:camera' => 'fa-camera', 'format_tiles:check' => 'fa-check', 'format_tiles:chevron-left' => 'fa-chevron-left', 'format_tiles:chevron-right' => 'fa-chevron-right', 'format_tiles:clone' => 'fa-clone', 'format_tiles:close' => 'fa-close', 'format_tiles:cloud-download' => 'fa-cloud-download', 'format_tiles:cloud-upload' => 'fa-cloud-upload', 'format_tiles:filter' => 'fa-filter', 'format_tiles:eye-slash' => 'fa-eye-slash', 'format_tiles:home' => 'fa-home', 'format_tiles:lock' => 'fa-lock', 'format_tiles:star-o' => 'fa-star-o', 'format_tiles:pencil' => 'fa-pencil', 'format_tiles:random' => 'fa-random', 'format_tiles:star' => 'fa-star', 'format_tiles:toggle-off' => 'fa-toggle-off', 'format_tiles:toggle-on' => 'fa-toggle-on' ]; // These are used on sub-tiles (if used) e.g. to show PDF, Excel activities. $subtileicons = [ 'format_tiles:subtile/comments-o' => 'fa-comments-o', 'format_tiles:subtile/database' => 'fa-database', 'format_tiles:subtile/feedback' => 'fa-bullhorn', 'format_tiles:subtile/file-excel' => 'fa-table', 'format_tiles:subtile/file-pdf-o' => 'fa-file-pdf-o', 'format_tiles:subtile/file-powerpoint-o' => 'fa-file-powerpoint-o', 'format_tiles:subtile/file-text-o' => 'fa-file-text-o', 'format_tiles:subtile/file-word-o' => 'fa-file-word-o', 'format_tiles:subtile/file-zip-o' => 'fa-file-zip-o', 'format_tiles:subtile/film' => 'fa-film', 'format_tiles:subtile/folder-o' => 'fa-folder-o', 'format_tiles:subtile/globe' => 'fa-globe', 'format_tiles:subtile/puzzle-piece' => 'fa-puzzle-piece', 'format_tiles:subtile/question-circle' => 'fa-question-circle', 'format_tiles:subtile/star' => 'fa-star', 'format_tiles:subtile/star-o' => 'fa-star-o', 'format_tiles:subtile/survey' => 'fa-bar-chart', 'format_tiles:subtile/volume-up' => 'fa-volume-up' ]; $tileicons = []; foreach ($this->fontawesometileicons as $icon) { $pixname = str_replace('fa-', '', $icon); $tileicons['format_tiles:tileicon/' . $pixname] = $icon; } return array_merge($tileicons, $generalicons, $subtileicons); } }