diff options
Diffstat (limited to 'framework/src/onos/web/gui/src/main/webapp/app/fw/util/theme.js')
-rw-r--r-- | framework/src/onos/web/gui/src/main/webapp/app/fw/util/theme.js | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/util/theme.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/theme.js new file mode 100644 index 00000000..0e0ee649 --- /dev/null +++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/theme.js @@ -0,0 +1,121 @@ +/* + * Copyright 2014,2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + ONOS GUI -- Util -- Theme Service + */ +(function () { + 'use strict'; + + var $log, fs; + + var themes = ['light', 'dark'], + themeStr = themes.join(' '), + thidx, + listeners = {}, + nextListenerId = 1; + + function init() { + thidx = 0; + updateBodyClass(); + } + + function getTheme() { + return themes[thidx]; + } + + function setTheme(t) { + var idx = themes.indexOf(t); + if (idx > -1 && idx !== thidx) { + thidx = idx; + updateBodyClass(); + themeEvent('set'); + } + } + + function toggleTheme() { + var i = thidx + 1; + thidx = (i===themes.length) ? 0 : i; + updateBodyClass(); + themeEvent('toggle'); + return getTheme(); + } + + function updateBodyClass() { + var body = d3.select('body'); + body.classed(themeStr, false); + body.classed(getTheme(), true); + } + + function themeEvent(w) { + var t = getTheme(), + m = 'Theme-Change-('+w+'): ' + t; + $log.debug(m); + angular.forEach(listeners, function(value) { + value.cb( + { + event: 'themeChange', + value: t + } + ); + }); + } + + function addListener(callback) { + var id = nextListenerId++, + cb = fs.isF(callback), + o = { id: id, cb: cb }; + + if (cb) { + listeners[id] = o; + } else { + $log.error('ThemeService.addListener(): callback not a function'); + o.error = 'No callback defined'; + } + return o; + } + + function removeListener(lsnr) { + var id = lsnr && lsnr.id, + o = listeners[id]; + if (o) { + delete listeners[id]; + } + } + + angular.module('onosUtil') + .factory('ThemeService', ['$log', 'FnService', + function (_$log_, _fs_) { + $log = _$log_; + fs = _fs_; + thidx = 0; + + return { + init: init, + theme: function (x) { + if (x === undefined) { + return getTheme(); + } else { + setTheme(x); + } + }, + toggleTheme: toggleTheme, + addListener: addListener, + removeListener: removeListener + }; + }]); + +}()); |