You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
291 lines
12 KiB
291 lines
12 KiB
2 years ago
|
<?php
|
||
|
// This file is part of Moodle - http://moodle.org/
|
||
|
//
|
||
|
// Moodle 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 3 of the License, or
|
||
|
// (at your option) any later version.
|
||
|
//
|
||
|
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
/**
|
||
|
* 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);
|
||
|
}
|
||
|
}
|