diff --git a/js/Balance.jsx b/js/Balance.jsx
new file mode 100644
index 00000000..1ae97e10
--- /dev/null
+++ b/js/Balance.jsx
@@ -0,0 +1,55 @@
+// Single line text display that can animate and hold multiple registers
+import React from 'react';
+import {connect} from 'react-redux';
+
+
+class Balance extends React.Component {
+ constructor(props) {
+ super(props);
+ this.setBalance = this.setBalance.bind(this);
+ this.showMarquee = this.showMarquee.bind(this);
+ this.hideMarquee = this.hideMarquee.bind(this);
+ }
+
+ setBalance(e) {
+ let balance = e.target.value;
+ // The balance clips to the center
+ if (Math.abs(balance) < 25) {
+ balance = 0;
+ }
+ this.props.dispatch({type: 'SET_BALANCE', balance: balance});
+ }
+
+ showMarquee() {
+ this.props.dispatch({type: 'SHOW_MARQUEE_REGISTER', register: 'balance'});
+ }
+
+ hideMarquee() {
+ this.props.dispatch({type: 'SHOW_MARQUEE_REGISTER', register: 'songTitle'});
+ }
+
+ render() {
+ const balance = Math.abs(this.props.balance) / 100;
+ const sprite = Math.round(balance * 28);
+ const offset = (sprite - 1) * 15;
+
+ const style = {
+ backgroundPosition: '0 -' + offset + 'px'
+ };
+
+ return ;
+ }
+}
+
+module.exports = connect(state => state.media)(Balance);
diff --git a/js/main-window-dom.js b/js/main-window-dom.js
index 436bca36..cfb8c7d3 100644
--- a/js/main-window-dom.js
+++ b/js/main-window-dom.js
@@ -53,7 +53,7 @@ module.exports = el('div', {id: 'main-window', class: 'loading stop'}, [
])
]),
el('div', {id: 'volume-holder'}),
- el('input', {id: 'balance', type: 'range', min: '-100', max: '100', step: '2', value: '0'}),
+ el('div', {id: 'balance-holder'}),
el('div', {class: 'windows'}, [
el('div', {id: 'equalizer-button'}),
el('div', {id: 'playlist-button'})
diff --git a/js/main-window.js b/js/main-window.js
index 304f24cf..8da08497 100644
--- a/js/main-window.js
+++ b/js/main-window.js
@@ -6,6 +6,7 @@ import ShadeTime from './ShadeTime.jsx';
import Kbps from './Kbps.jsx';
import Khz from './Khz.jsx';
import Volume from './Volume.jsx';
+import Balance from './Balance.jsx';
import '../css/main-window.css';
@@ -23,7 +24,6 @@ module.exports = {
shuffle: document.getElementById('shuffle'),
mono: document.getElementById('mono'),
stereo: document.getElementById('stereo'),
- balance: document.getElementById('balance'),
workIndicator: document.getElementById('work-indicator'),
titleBar: document.getElementById('title-bar'),
window: document.getElementById('main-window')
@@ -39,6 +39,7 @@ module.exports = {
this.winamp.renderTo(, document.getElementById('kbps-holder'));
this.winamp.renderTo(, document.getElementById('khz-holder'));
this.winamp.renderTo(, document.getElementById('volume-holder'));
+ this.winamp.renderTo(, document.getElementById('balance-holder'));
this._registerListeners();
return this;
@@ -111,21 +112,6 @@ module.exports = {
self.winamp.toggleShuffle();
};
- this.nodes.balance.onmousedown = function() {
- self.winamp.dispatch({type: 'SHOW_MARQUEE_REGISTER', register: 'balance'});
- };
-
- this.nodes.balance.onmouseup = function() {
- self.winamp.dispatch({type: 'SHOW_MARQUEE_REGISTER', register: 'songTitle'});
- };
-
- this.nodes.balance.oninput = function() {
- if (Math.abs(this.value) < 25) {
- this.value = 0;
- }
- self.winamp.setBalance(this.value);
- };
-
this.nodes.visualizer.onclick = function() {
self.winamp.toggleVisualizer();
};
@@ -154,9 +140,6 @@ module.exports = {
window.addEventListener('channelCountUpdated', function() {
self.updateChannelCount();
});
- window.addEventListener('balanceChanged', function() {
- self.setBalance();
- });
window.addEventListener('doubledModeToggled', function() {
self.toggleDoubledMode();
});
@@ -224,23 +207,6 @@ module.exports = {
this.nodes.window.classList.remove('loading');
},
- setBalance: function() {
- var balance = this.winamp.getBalance();
- var string = '';
- if (balance === 0) {
- string = 'Balance: Center';
- } else if (balance > 0) {
- string = 'Balance: ' + balance + '% Right';
- } else {
- string = 'Balance: ' + Math.abs(balance) + '% Left';
- }
- this.winamp.dispatch({type: 'SET_MARQUEE_REGISTER', register: 'balance', text: string});
- balance = Math.abs(balance) / 100;
- var sprite = Math.round(balance * 28);
- var offset = (sprite - 1) * 15;
- this.nodes.balance.style.backgroundPosition = '0px -' + offset + 'px';
- },
-
changeState: function() {
var state = this.winamp.getState();
var stateOptions = ['play', 'stop', 'pause'];
diff --git a/js/reducers.js b/js/reducers.js
index 3e237655..ae9cf952 100644
--- a/js/reducers.js
+++ b/js/reducers.js
@@ -21,6 +21,18 @@ const register = (state, action) => {
return Object.assign({}, state, {step: 0, text: text});
}
return state;
+ case 'SET_BALANCE':
+ if (state.id === 'balance') {
+ let text = '';
+ if (action.balance === 0) {
+ text = 'Balance: Center';
+ } else {
+ const direction = action.balance > 0 ? 'Right' : 'Left';
+ text = 'Balance: ' + Math.abs(action.balance) + '% ' + direction;
+ }
+ return Object.assign({}, state, {step: 0, text: text});
+ }
+ return state;
case 'STEP_MARQUEE':
return Object.assign({}, state, {step: (state.step + 1) % state.text.length});
default:
@@ -82,7 +94,8 @@ const media = (state, action) => {
length: null,
kbps: null,
khz: null,
- volume: 50
+ volume: 50,
+ balance: 0
};
}
switch (action.type) {
@@ -99,6 +112,8 @@ const media = (state, action) => {
return Object.assign({}, state, {khz: action.khz});
case 'SET_VOLUME':
return Object.assign({}, state, {volume: action.volume});
+ case 'SET_BALANCE':
+ return Object.assign({}, state, {balance: action.balance});
default:
return state;
}
@@ -128,6 +143,9 @@ const createReducer = (winamp) => {
case 'SET_VOLUME':
winamp.setVolume(action.volume);
return state;
+ case 'SET_BALANCE':
+ winamp.setBalance(action.balance);
+ return state;
case 'CLOSE_WINAMP':
winamp.close();
return state;
diff --git a/js/winamp.js b/js/winamp.js
index 9f78dcd1..5dce56f6 100755
--- a/js/winamp.js
+++ b/js/winamp.js
@@ -29,7 +29,6 @@ module.exports = {
changeState: new Event('changeState'),
titleUpdated: new Event('titleUpdated'),
channelCountUpdated: new Event('channelCountUpdated'),
- balanceChanged: new Event('balanceChanged'),
doubledModeToggled: new Event('doubledModeToggled'),
repeatToggled: new Event('repeatToggled'),
llamaToggled: new Event('llamaToggled'),
@@ -37,7 +36,7 @@ module.exports = {
};
this.dispatch({type: 'SET_VOLUME', volume: options.volume});
- this.setBalance(options.balance);
+ this.dispatch({type: 'SET_BALANCE', balance: options.balance});
this.loadFromUrl(options.mediaFile.url, options.mediaFile.name);
var skinFile = new MyFile();
skinFile.setUrl(options.skinUrl);
@@ -155,11 +154,6 @@ module.exports = {
// From -100 to 100
setBalance: function(balance) {
this.media.setBalance(balance);
- window.dispatchEvent(this.events.balanceChanged);
- },
-
- getBalance: function() {
- return this.media.getBalance();
},
seekForwardBy: function(seconds) {