webamp/js/components/Skin.js
2017-01-17 17:51:21 -08:00

171 lines
8.2 KiB
JavaScript

// Dynamically set the css background images for all the sprites
import React from 'react';
import {connect} from 'react-redux';
import {FONT_LOOKUP, imageConstFromChar} from '../skinSprites';
const imageSelectors = {
MAIN_BALANCE_BACKGROUND: ['#balance'],
MAIN_BALANCE_THUMB: ['#balance::-webkit-slider-thumb', '#balance::-moz-range-thumb'],
MAIN_BALANCE_THUMB_ACTIVE: ['#balance::-webkit-slider-thumb:active', '#balance::-moz-range-thumb:active'],
MAIN_PREVIOUS_BUTTON: ['.actions #previous'],
MAIN_PREVIOUS_BUTTON_ACTIVE: ['.actions #previous:active'],
MAIN_PLAY_BUTTON: ['.actions #play'],
MAIN_PLAY_BUTTON_ACTIVE: ['.actions #play:active'],
MAIN_PAUSE_BUTTON: ['.actions #pause'],
MAIN_PAUSE_BUTTON_ACTIVE: ['.actions #pause:active'],
MAIN_STOP_BUTTON: ['.actions #stop'],
MAIN_STOP_BUTTON_ACTIVE: ['.actions #stop:active'],
MAIN_NEXT_BUTTON: ['.actions #next'],
MAIN_NEXT_BUTTON_ACTIVE: ['.actions #next:active'],
MAIN_EJECT_BUTTON: ['#eject'],
MAIN_EJECT_BUTTON_ACTIVE: ['#eject:active'],
MAIN_WINDOW_BACKGROUND: ['#main-window'],
MAIN_STEREO: ['.media-info #stereo', '.stop .media-info #stereo.selected'],
MAIN_STEREO_SELECTED: ['.media-info #stereo.selected'],
MAIN_MONO: ['.media-info #mono', '.stop .media-info #mono.selected'],
MAIN_MONO_SELECTED: ['.media-info #mono.selected'],
NO_MINUS_SIGN: ['#time #minus-sign'],
MINUS_SIGN: ['#time.countdown #minus-sign'],
DIGIT_0: ['.digit-0'],
DIGIT_1: ['.digit-1'],
DIGIT_2: ['.digit-2'],
DIGIT_3: ['.digit-3'],
DIGIT_4: ['.digit-4'],
DIGIT_5: ['.digit-5'],
DIGIT_6: ['.digit-6'],
DIGIT_7: ['.digit-7'],
DIGIT_8: ['.digit-8'],
DIGIT_9: ['.digit-9'],
NO_MINUS_SIGN_EX: ['#time #minus-sign'],
MINUS_SIGN_EX: ['#time.countdown #minus-sign'],
DIGIT_0_EX: ['.digit-0'],
DIGIT_1_EX: ['.digit-1'],
DIGIT_2_EX: ['.digit-2'],
DIGIT_3_EX: ['.digit-3'],
DIGIT_4_EX: ['.digit-4'],
DIGIT_5_EX: ['.digit-5'],
DIGIT_6_EX: ['.digit-6'],
DIGIT_7_EX: ['.digit-7'],
DIGIT_8_EX: ['.digit-8'],
DIGIT_9_EX: ['.digit-9'],
MAIN_PLAYING_INDICATOR: ['.play #play-pause'],
MAIN_PAUSED_INDICATOR: ['.pause #play-pause'],
MAIN_STOPPED_INDICATOR: ['.stop #play-pause'],
MAIN_NOT_WORKING_INDICATOR: ['.play #work-indicator'],
MAIN_WORKING_INDICATOR: ['.play #work-indicator.selected'],
PLAYLIST_TOP_TILE: ['.playlist-top'],
PLAYLIST_TOP_LEFT_CORNER: ['.playlist-top-left'],
PLAYLIST_TITLE_BAR: ['.playlist-top-title'],
PLAYLIST_TOP_RIGHT_CORNER: ['.playlist-top-right'],
PLAYLIST_TOP_TILE_SELECTED: ['.selected .playlist-top'],
PLAYLIST_TOP_LEFT_SELECTED: ['.selected .playlist-top-left'],
PLAYLIST_TITLE_BAR_SELECTED: ['.selected .playlist-top-title'],
PLAYLIST_TOP_RIGHT_CORNER_SELECTED: ['.selected .playlist-top-right'],
PLAYLIST_LEFT_TILE: ['.playlist-left'],
PLAYLIST_RIGHT_TILE: ['.playlist-right'],
PLAYLIST_BOTTOM_TILE: ['.playlist-bottom'],
PLAYLIST_BOTTOM_LEFT_CORNER: ['.playlist-bottom-left'],
PLAYLIST_BOTTOM_RIGHT_CORNER: ['.playlist-bottom-right'],
PLAYLIST_VISUALIZER_BACKGROUND: ['.playlist-visualizer'],
PLAYLIST_SHADE_BACKGROUND: ['#playlist.shade'],
EQ_WINDOW_BACKGROUND: ['#equalizer-window'],
EQ_TITLE_BAR: ['.equalizer-top'],
EQ_TITLE_BAR_SELECTED: ['.selected .equalizer-top'],
EQ_SLIDER_BACKGROUND: ['.band'],
EQ_SLIDER_THUMB: ['.band input::-webkit-slider-thumb', 'band input::-moz-range-thumb'],
EQ_SLIDER_THUMB_SELECTED: ['band input::-webkit-slider-thumb:active', '.band input::-moz-range-thumb:active'],
EQ_ON_BUTTON: ['#on'],
EQ_ON_BUTTON_DEPRESSED: ['#on:active'],
EQ_ON_BUTTON_SELECTED: ['#on.selected'],
EQ_ON_BUTTON_SELECTED_DEPRESSED: ['#on.selected:active'],
EQ_AUTO_BUTTON: ['#auto'],
EQ_AUTO_BUTTON_DEPRESSED: ['#auto:active'],
EQ_AUTO_BUTTON_SELECTED: ['#auto.selected'],
EQ_AUTO_BUTTON_SELECTED_DEPRESSED: ['#auto.selected:active'],
EQ_GRAPH_BACKGROUND: ['#eqGraph'],
EQ_PRESETS_BUTTON: ['#presets'],
EQ_PRESETS_BUTTON_SELECTED: ['#presets:active'],
EQ_PREAMP_LINE: ['#preamp-line'],
MAIN_POSITION_SLIDER_BACKGROUND: ['#position'],
MAIN_POSITION_SLIDER_THUMB: ['#position::-webkit-slider-thumb', '#position::-moz-range-thumb'],
MAIN_POSITION_SLIDER_THUMB_SELECTED: ['#position:active::-webkit-slider-thumb', '#position:active::-moz-range-thumb'],
MAIN_SHUFFLE_BUTTON: ['#shuffle'],
MAIN_SHUFFLE_BUTTON_DEPRESSED: ['#shuffle:active'],
MAIN_SHUFFLE_BUTTON_SELECTED: ['#shuffle.selected'],
MAIN_SHUFFLE_BUTTON_SELECTED_DEPRESSED: ['#shuffle.selected:active'],
MAIN_REPEAT_BUTTON: ['#repeat'],
MAIN_REPEAT_BUTTON_DEPRESSED: ['#repeat:active'],
MAIN_REPEAT_BUTTON_SELECTED: ['#repeat.selected'],
MAIN_REPEAT_BUTTON_SELECTED_DEPRESSED: ['#repeat.selected:active'],
MAIN_EQ_BUTTON: ['#equalizer-button'],
MAIN_EQ_BUTTON_SELECTED: ['#equalizer-button.selected'],
MAIN_EQ_BUTTON_DEPRESSED: ['#equalizer-button:active'],
MAIN_EQ_BUTTON_DEPRESSED_SELECTED: ['#equalizer-button.selected:active'],
MAIN_PLAYLIST_BUTTON: ['#playlist-button'],
MAIN_PLAYLIST_BUTTON_SELECTED: ['#playlist-button.selected'],
MAIN_PLAYLIST_BUTTON_DEPRESSED: ['#playlist-button:active'],
MAIN_PLAYLIST_BUTTON_DEPRESSED_SELECTED: ['#playlist-button.selected:active'],
MAIN_TITLE_BAR: ['#title-bar'],
MAIN_TITLE_BAR_SELECTED: ['.selected #title-bar'],
MAIN_EASTER_EGG_TITLE_BAR: ['.llama #title-bar'],
MAIN_EASTER_EGG_TITLE_BAR_SELECTED: ['.llama #title-bar.selected'],
MAIN_OPTIONS_BUTTON: ['#title-bar #option'],
MAIN_OPTIONS_BUTTON_DEPRESSED: ['#title-bar #option:active', '#title-bar #option:selected'],
MAIN_MINIMIZE_BUTTON: ['#title-bar #minimize'],
MAIN_MINIMIZE_BUTTON_DEPRESSED: ['#title-bar #minimize:active'],
MAIN_SHADE_BUTTON: ['#title-bar #shade'],
MAIN_SHADE_BUTTON_DEPRESSED: ['#title-bar #shade:active'],
MAIN_CLOSE_BUTTON: ['#title-bar #close'],
MAIN_CLOSE_BUTTON_DEPRESSED: ['#title-bar #close:active'],
MAIN_CLUTTER_BAR_BACKGROUND: ['#clutter-bar'],
MAIN_CLUTTER_BAR_BACKGROUND_DISABLED: ['#clutter-bar.disabled'],
MAIN_CLUTTER_BAR_BUTTON_O_SELECTED: ['#button-o:active', '#button-0:selected'],
MAIN_CLUTTER_BAR_BUTTON_A_SELECTED: ['#button-a:active', '#button-a.selected'],
MAIN_CLUTTER_BAR_BUTTON_I_SELECTED: ['#button-i:active', '#button-i.selected'],
MAIN_CLUTTER_BAR_BUTTON_D_SELECTED: ['#button-d:active', '#button-d.selected'],
MAIN_CLUTTER_BAR_BUTTON_V_SELECTED: ['#button-v:active', '#button-v.selected'],
MAIN_SHADE_BACKGROUND: ['.shade #title-bar'],
MAIN_SHADE_BACKGROUND_SELECTED: ['.shade #title-bar.selected'],
MAIN_SHADE_BUTTON_SELECTED: ['.shade #title-bar #shade'],
MAIN_SHADE_BUTTON_SELECTED_DEPRESSED: ['.shade #title-bar #shade:active'],
MAIN_SHADE_POSITION_BACKGROUND: ['.shade #position'],
MAIN_SHADE_POSITION_THUMB: ['.shade #position::-moz-range-thumb', '.shade #position::-webkit-slider-thumb'],
MAIN_SHADE_POSITION_THUMB_LEFT: ['.shade #position.left::-moz-range-thumb', '.shade #position.left::-webkit-slider-thumb'],
MAIN_SHADE_POSITION_THUMB_RIGHT: ['.shade #position.right::-moz-range-thumb', '.shade #position.right::-webkit-slider-thumb'],
MAIN_VOLUME_BACKGROUND: ['#volume'],
MAIN_VOLUME_THUMB: ['#volume::-webkit-slider-thumb', '#volume::-moz-range-thumb'],
MAIN_VOLUME_THUMB_SELECTED: ['#volume::-webkit-slider-thumb:active', '#volume::-moz-range-thumb:active']
};
Object.keys(FONT_LOOKUP).forEach((character) => {
const key = imageConstFromChar(character);
const code = character.charCodeAt(0);
imageSelectors[key] = [`.character-${code}`];
});
const numExIsUsed = (skinImages) => !!skinImages.DIGIT_0_EX;
const Skin = (props) => {
if (!props.skinImages) {
return null;
}
const cssRules = [];
Object.keys(imageSelectors).map((imageName) => {
const imageUrl = props.skinImages[imageName];
if (imageUrl) {
imageSelectors[imageName].forEach((selector) => {
cssRules.push(`#winamp2-js ${selector} {background-image: url(${imageUrl})}`);
});
}
});
if (numExIsUsed(props.skinImages)) {
// This alternate number file requires that the minus sign be
// formatted differently.
cssRules.push('#winamp2-js .status #time #minus-sign { top: 0px; left: -1px; width: 9px; height: 13px; }');
}
return <style type='text/css'>{cssRules.join('\n')}</style>;
};
export default connect((state) => ({skinImages: state.display.skinImages}))(Skin);