From 833511a005dce0a0dffdb27cb9286e7635a18c4a Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Mon, 17 Mar 2014 14:43:23 +0800 Subject: [PATCH] MDL-44357 theme_more: New customizable theme AMOS BEGIN CPY [choosereadme,theme_clean],[choosereadme,theme_more] CPY [configtitle,theme_clean],[configtitle,theme_more] CPY [customcss,theme_clean],[customcss,theme_more] CPY [customcssdesc,theme_clean],[customcssdesc,theme_more] CPY [footnote,theme_clean],[footnote,theme_more] CPY [footnotedesc,theme_clean],[footnotedesc,theme_more] CPY [invert,theme_clean],[invert,theme_more] CPY [invertdesc,theme_clean],[invertdesc,theme_more] CPY [logo,theme_clean],[logo,theme_more] CPY [logodesc,theme_clean],[logodesc,theme_more] CPY [pluginname,theme_clean],[pluginname,theme_more] CPY [region-side-post,theme_clean],[region-side-post,theme_more] CPY [region-side-pre,theme_clean],[region-side-pre,theme_more] AMOS END --- lib/classes/plugin_manager.php | 2 +- theme/clean/config.php | 4 +- theme/clean/lib.php | 3 + theme/more/config.php | 43 ++++++++++ theme/more/lang/en/theme_more.php | 47 +++++++++++ theme/{clean => more}/less/moodle.less | 0 theme/more/lib.php | 108 +++++++++++++++++++++++++ theme/more/pix/favicon.ico | Bin 0 -> 1150 bytes theme/more/pix/screenshot.jpg | Bin 0 -> 24452 bytes theme/more/settings.php | 71 ++++++++++++++++ theme/more/style/custom.css | 21 +++++ theme/more/version.php | 33 ++++++++ 12 files changed, 328 insertions(+), 4 deletions(-) create mode 100644 theme/more/config.php create mode 100644 theme/more/lang/en/theme_more.php rename theme/{clean => more}/less/moodle.less (100%) create mode 100644 theme/more/lib.php create mode 100644 theme/more/pix/favicon.ico create mode 100644 theme/more/pix/screenshot.jpg create mode 100644 theme/more/settings.php create mode 100644 theme/more/style/custom.css create mode 100644 theme/more/version.php diff --git a/lib/classes/plugin_manager.php b/lib/classes/plugin_manager.php index 802642c85d2..1cd5b50bc34 100644 --- a/lib/classes/plugin_manager.php +++ b/lib/classes/plugin_manager.php @@ -1113,7 +1113,7 @@ class core_plugin_manager { 'theme' => array( 'afterburner', 'anomaly', 'arialist', 'base', 'binarius', 'bootstrapbase', 'boxxie', 'brick', 'canvas', 'clean', 'formal_white', 'formfactor', - 'fusion', 'leatherbound', 'magazine', 'nimble', + 'fusion', 'leatherbound', 'magazine', 'more', 'nimble', 'nonzero', 'overlay', 'serenity', 'sky_high', 'splash', 'standard', 'standardold' ), diff --git a/theme/clean/config.php b/theme/clean/config.php index cf1605cf6f5..84bdfd7832d 100644 --- a/theme/clean/config.php +++ b/theme/clean/config.php @@ -39,8 +39,6 @@ $THEME->name = 'clean'; $THEME->doctype = 'html5'; $THEME->parents = array('bootstrapbase'); $THEME->sheets = array('custom'); -$THEME->lessfile = 'moodle'; -$THEME->parents_exclude_sheets = array('bootstrapbase' => array('moodle')); $THEME->supportscssoptimisation = false; $THEME->yuicssmodules = array(); $THEME->enable_dock = true; @@ -52,4 +50,4 @@ $THEME->csspostprocess = 'theme_clean_process_css'; $THEME->blockrtlmanipulations = array( 'side-pre' => 'side-post', 'side-post' => 'side-pre' -); \ No newline at end of file +); diff --git a/theme/clean/lib.php b/theme/clean/lib.php index 45554dfea8a..e31a51bdfcd 100644 --- a/theme/clean/lib.php +++ b/theme/clean/lib.php @@ -116,6 +116,9 @@ function theme_clean_set_customcss($css, $customcss) { /** * Returns an object containing HTML for the areas affected by settings. * + * Do not add Clean specific logic in here, child themes should be able to + * rely on that function just by declaring settings with similar names. + * * @param renderer_base $output Pass in $OUTPUT. * @param moodle_page $page Pass in $PAGE. * @return stdClass An object with the following properties: diff --git a/theme/more/config.php b/theme/more/config.php new file mode 100644 index 00000000000..0c23e91ca91 --- /dev/null +++ b/theme/more/config.php @@ -0,0 +1,43 @@ +. + +/** + * Theme More config file. + * + * @package theme_more + * @copyright 2014 Frédéric Massart + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +$THEME->name = 'more'; +$THEME->parents = array('clean', 'bootstrapbase'); + +$THEME->doctype = 'html5'; +$THEME->sheets = array('custom'); +$THEME->lessfile = 'moodle'; +$THEME->parents_exclude_sheets = array('bootstrapbase' => array('moodle'), 'clean' => array('custom')); +$THEME->supportscssoptimisation = false; +$THEME->yuicssmodules = array(); +$THEME->enable_dock = true; +$THEME->editor_sheets = array(); + +$THEME->rendererfactory = 'theme_overridden_renderer_factory'; +$THEME->csspostprocess = 'theme_more_process_css'; + +$THEME->blockrtlmanipulations = array( + 'side-pre' => 'side-post', + 'side-post' => 'side-pre' +); diff --git a/theme/more/lang/en/theme_more.php b/theme/more/lang/en/theme_more.php new file mode 100644 index 00000000000..80b2fb301c7 --- /dev/null +++ b/theme/more/lang/en/theme_more.php @@ -0,0 +1,47 @@ +. + +/** + * Theme More lang file. + * + * @package theme_more + * @copyright 2014 Frédéric Massart + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +$string['choosereadme'] = 'More is a theme that allows you to easily customize Moodle\'s look and feel.'; + +$string['configtitle'] = 'More'; + +$string['customcss'] = 'Custom CSS'; +$string['customcssdesc'] = 'Whatever CSS rules you add to this textarea will be reflected in every page, making for easier customization of this theme.'; + +$string['footnote'] = 'Footnote'; +$string['footnotedesc'] = 'Whatever you add to this textarea will be displayed in the footer throughout your Moodle site.'; + +$string['invert'] = 'Invert navbar'; +$string['invertdesc'] = 'Swaps text and background for the navbar at the top of the page between black and white.'; + +$string['logo'] = 'Logo'; +$string['logodesc'] = 'Please upload your custom logo here if you want to add it to the header.
+If the height of your logo is more than 75px add the following CSS rule to the Custom CSS box below.
+a.logo {height: 100px;} or whatever height in pixels the logo is.'; + +$string['pluginname'] = 'More'; + +$string['region-side-post'] = 'Right'; +$string['region-side-pre'] = 'Left'; + diff --git a/theme/clean/less/moodle.less b/theme/more/less/moodle.less similarity index 100% rename from theme/clean/less/moodle.less rename to theme/more/less/moodle.less diff --git a/theme/more/lib.php b/theme/more/lib.php new file mode 100644 index 00000000000..6f70e6f4891 --- /dev/null +++ b/theme/more/lib.php @@ -0,0 +1,108 @@ +. + +/** + * Theme More lib. + * + * @package theme_more + * @copyright 2014 Frédéric Massart + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +/** + * Parses CSS before it is cached. + * + * This function can make alterations and replace patterns within the CSS. + * + * @param string $css The CSS + * @param theme_config $theme The theme config object. + * @return string The parsed CSS The parsed CSS. + */ +function theme_more_process_css($css, $theme) { + + // Set the background image for the logo. + $logo = $theme->setting_file_url('logo', 'logo'); + $css = theme_more_set_logo($css, $logo); + + // Set custom CSS. + if (!empty($theme->settings->customcss)) { + $customcss = $theme->settings->customcss; + } else { + $customcss = null; + } + $css = theme_more_set_customcss($css, $customcss); + + return $css; +} + +/** + * Adds the logo to CSS. + * + * @param string $css The CSS. + * @param string $logo The URL of the logo. + * @return string The parsed CSS + */ +function theme_more_set_logo($css, $logo) { + $tag = '[[setting:logo]]'; + $replacement = $logo; + if (is_null($replacement)) { + $replacement = ''; + } + + $css = str_replace($tag, $replacement, $css); + + return $css; +} + +/** + * Serves any files associated with the theme settings. + * + * @param stdClass $course + * @param stdClass $cm + * @param context $context + * @param string $filearea + * @param array $args + * @param bool $forcedownload + * @param array $options + * @return bool + */ +function theme_more_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options = array()) { + if ($context->contextlevel == CONTEXT_SYSTEM and $filearea === 'logo') { + $theme = theme_config::load('more'); + return $theme->setting_file_serve('logo', $args, $forcedownload, $options); + } else { + send_file_not_found(); + } +} + +/** + * Adds any custom CSS to the CSS before it is cached. + * + * @param string $css The original CSS. + * @param string $customcss The custom CSS to add. + * @return string The CSS which now contains our custom CSS. + */ +function theme_more_set_customcss($css, $customcss) { + $tag = '[[setting:customcss]]'; + $replacement = $customcss; + if (is_null($replacement)) { + $replacement = ''; + } + + $css = str_replace($tag, $replacement, $css); + + return $css; +} diff --git a/theme/more/pix/favicon.ico b/theme/more/pix/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..eea02482c3702d68518faecf6021610628fc1b62 GIT binary patch literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYI*xFHzKA4G&k&1VMn>d%rI zwV%y(8owCW_kLwpuK&WI*Zx&OyZx($Ue{M`t4ZIOI}iL~G@1NOU8nz>h4JL?IxsIl z_2&Wge*@~j0@N?7+yK_!2h{%)sDB?&KQB-}tLfx#Yk>N{1N9$Cnf8?_dFod-tvaCn zHJ?j>`u_vM4%K5*#!2DJYx16+Ui*OS(h;qHg)2ik7~#QJ(w zpBR8)P@-A;;lEzPyGKslZxy90--Gne0K32Y>uH^*^_p`pwZ{#&>;#3E!?k_3umTy&+fD zvt4geZ-;zhTLj7ze%3jbHFrxBc^9olamF_I!P%*Z1w2PT#lx z`V+o=v7YfgbHe<6(v>aqYO?ZcFGR(pe)aYa`0wc8{NL2X{J(~}=6@|iyUUi1H;avW zzpvHr`Fcmc@7q0~{rfGZeoG8r_JgCOrk|mmxwH`f|DS;YgdYM82Vq4ttN`T0Km#KK!vlE+hCe_I(+2=Z CziV^= literal 0 HcmV?d00001 diff --git a/theme/more/pix/screenshot.jpg b/theme/more/pix/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e31f69fb0511554afb06c49615469b8846e4c4b2 GIT binary patch literal 24452 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 A1poj5 literal 0 HcmV?d00001 diff --git a/theme/more/settings.php b/theme/more/settings.php new file mode 100644 index 00000000000..c60ece6e90f --- /dev/null +++ b/theme/more/settings.php @@ -0,0 +1,71 @@ +. + +/** + * Theme More settings. + * + * Each setting that is defined in the parent theme Clean should be + * defined here too, and use the exact same config name. The reason + * is that theme_more does not define any layout files to re-use the + * ones from theme_clean. But as those layout files use the function + * {@link theme_clean_get_html_for_settings} that belong to Clean, + * we have to make sure it works as expected by having the same settings + * in our theme. + * + * @see theme_clean_get_html_for_settings + * @package theme_more + * @copyright 2014 Frédéric Massart + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die; + +if ($ADMIN->fulltree) { + + // Invert Navbar to dark background. + $name = 'theme_more/invert'; + $title = get_string('invert', 'theme_more'); + $description = get_string('invertdesc', 'theme_more'); + $setting = new admin_setting_configcheckbox($name, $title, $description, 0); + $setting->set_updatedcallback('theme_reset_all_caches'); + $settings->add($setting); + + // Logo file setting. + $name = 'theme_more/logo'; + $title = get_string('logo','theme_more'); + $description = get_string('logodesc', 'theme_more'); + $setting = new admin_setting_configstoredfile($name, $title, $description, 'logo'); + $setting->set_updatedcallback('theme_reset_all_caches'); + $settings->add($setting); + + // Custom CSS file. + $name = 'theme_more/customcss'; + $title = get_string('customcss', 'theme_more'); + $description = get_string('customcssdesc', 'theme_more'); + $default = ''; + $setting = new admin_setting_configtextarea($name, $title, $description, $default); + $setting->set_updatedcallback('theme_reset_all_caches'); + $settings->add($setting); + + // Footnote setting. + $name = 'theme_more/footnote'; + $title = get_string('footnote', 'theme_more'); + $description = get_string('footnotedesc', 'theme_more'); + $default = ''; + $setting = new admin_setting_confightmleditor($name, $title, $description, $default); + $setting->set_updatedcallback('theme_reset_all_caches'); + $settings->add($setting); +} diff --git a/theme/more/style/custom.css b/theme/more/style/custom.css new file mode 100644 index 00000000000..81208d60551 --- /dev/null +++ b/theme/more/style/custom.css @@ -0,0 +1,21 @@ +/* Custom CSS +-------------------------*/ +a.logo { + background: url([[setting:logo]]) no-repeat 0 0; + display: block; + float: left; + height: 75px; + margin: 0; + padding: 0; + width: 100%; +} + +.dir-rtl a.logo { + background: url([[setting:logo]]) no-repeat 100% 0; + display: block; + float: right; +} + +/* Custom CSS Settings +-------------------------*/ +[[setting:customcss]] diff --git a/theme/more/version.php b/theme/more/version.php new file mode 100644 index 00000000000..7204646eead --- /dev/null +++ b/theme/more/version.php @@ -0,0 +1,33 @@ +. + +/** + * Theme More version file. + * + * @package theme_more + * @copyright 2014 Frédéric Massart + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die; + +$plugin->version = 2013110500; +$plugin->requires = 2013110500; +$plugin->component = 'theme_more'; +$plugin->dependencies = array( + 'theme_bootstrapbase' => 2013110500, + 'theme_clean' => 2013110500, +);