diff --git a/css/style.css b/css/style.css
index f6656b7..6674f17 100644
--- a/css/style.css
+++ b/css/style.css
@@ -126,6 +126,7 @@ html, body {
display: flex;
flex-direction: column;
flex: 1;
+ overflow-y: auto;
}
.edit .item-form {
@@ -141,7 +142,6 @@ html, body {
.edit .apps-list ul.desktop-apps {
list-style: none;
padding: 0;
- overflow-y: auto;
height: 100%;
margin: 10px 0 0 0;
padding: 0 10px 0 0;
diff --git a/js/components/edit/desktop-app-list.jsx b/js/components/edit/desktop-app-list.jsx
index 3557c0f..f8c2ce1 100644
--- a/js/components/edit/desktop-app-list.jsx
+++ b/js/components/edit/desktop-app-list.jsx
@@ -11,7 +11,7 @@ var DesktopAppList = React.createClass({
var items = this.props.desktopApps.map(function(desktopApp, i) {
var desktopEntry = desktopApp.content['Desktop Entry'];
return (
-
diff --git a/js/components/edit/edit-view.jsx b/js/components/edit/edit-view.jsx
index a525d59..5ad5b7f 100644
--- a/js/components/edit/edit-view.jsx
+++ b/js/components/edit/edit-view.jsx
@@ -24,21 +24,21 @@ var EditView = React.createClass({
+
{appIcon}
{data.label}
@@ -31,6 +35,11 @@ var TreeItem = React.createClass({
},
+ handleClick: function(evt) {
+ evt.preventDefault();
+ this.props.onItemClicked(this.props.data);
+ }
+
});
var dragSourceSpec = {
@@ -76,7 +85,8 @@ function dragSourceCollect(connect, monitor) {
function dropTargetCollect(connect, monitor) {
return {
connectDropTarget: connect.dropTarget(),
- isOver: monitor.isOver()
+ isOver: monitor.isOver(),
+ canDrop: monitor.canDrop()
};
}
diff --git a/js/store/actions/edit.js b/js/store/actions/edit.js
index 0636527..4e97312 100644
--- a/js/store/actions/edit.js
+++ b/js/store/actions/edit.js
@@ -7,6 +7,9 @@ var LOAD_DESKTOP_APPS_SUCCESS = exports.LOAD_DESKTOP_APPS_SUCCESS = 'LOAD_DESKTO
var LOAD_DESKTOP_APPS_FAILED = exports.LOAD_DESKTOP_APPS_FAILED = 'LOAD_DESKTOP_APPS_FAILED';
var MOVE_PROFILE_ITEM = exports.MOVE_PROFILE_ITEM = 'MOVE_PROFILE_ITEM';
var ADD_PROFILE_ITEM = exports.ADD_PROFILE_ITEM = 'ADD_PROFILE_ITEM';
+var USE_ICON_THEME = exports.USE_ICON_THEME = 'USE_ICON_THEME';
+var SELECT_PROFILE_ITEM = exports.SELECT_PROFILE_ITEM = 'SELECT_PROFILE_ITEM';
+var UPDATE_PROFILE_ITEM = exports.UPDATE_PROFILE_ITEM = 'UPDATE_PROFILE_ITEM';
// Actions creators
@@ -31,10 +34,16 @@ exports.loadDesktopApps = function() {
};
};
+exports.useIconTheme = function(theme) {
+ return {
+ type: USE_ICON_THEME,
+ theme: theme
+ };
+};
exports.moveProfileItem = function(movedItem, targetItem) {
return {
- type: 'MOVE_PROFILE_ITEM',
+ type: MOVE_PROFILE_ITEM,
movedItem: movedItem,
targetItem: targetItem
};
@@ -42,8 +51,24 @@ exports.moveProfileItem = function(movedItem, targetItem) {
exports.addProfileItem = function(newItem, targetItem) {
return {
- type: 'ADD_PROFILE_ITEM',
+ type: ADD_PROFILE_ITEM,
newItem: newItem,
targetItem: targetItem
};
};
+
+exports.selectProfileItem = function(item) {
+ return {
+ type: SELECT_PROFILE_ITEM,
+ item: item
+ };
+};
+
+exports.updateProfileItem = function(item, key, value) {
+ return {
+ type: UPDATE_PROFILE_ITEM,
+ item: item,
+ key: key,
+ value: value
+ };
+};
diff --git a/js/store/index.js b/js/store/index.js
index 0223dfa..87b7fd6 100644
--- a/js/store/index.js
+++ b/js/store/index.js
@@ -12,7 +12,8 @@ var createStore = redux.applyMiddleware(
var appReducer = redux.combineReducers({
profile: reducers.profile,
processOpts: reducers.processOpts,
- desktopApps: reducers.desktopApps
+ desktopApps: reducers.desktopApps,
+ theme: reducers.theme
});
module.exports = createStore(appReducer);
diff --git a/js/store/reducers/index.js b/js/store/reducers/index.js
index 4927732..7a61a24 100644
--- a/js/store/reducers/index.js
+++ b/js/store/reducers/index.js
@@ -1,3 +1,4 @@
exports.desktopApps = require('./desktop-apps');
exports.profile = require('./profile');
exports.processOpts = require('./process-opts');
+exports.theme = require('./theme');
diff --git a/js/store/reducers/profile.js b/js/store/reducers/profile.js
index 0c6374f..d1713df 100644
--- a/js/store/reducers/profile.js
+++ b/js/store/reducers/profile.js
@@ -14,6 +14,12 @@ module.exports = function(oldProfile, action) {
case actions.edit.ADD_PROFILE_ITEM:
return addProfileItem(oldProfile, action.newItem, action.targetItem);
+ case actions.edit.UPDATE_PROFILE_ITEM:
+ return updateProfileItem(oldProfile, action.item, action.key, action.value);
+
+ case actions.edit.SELECT_PROFILE_ITEM:
+ return selectProfileItem(oldProfile, action.item);
+
default:
return oldProfile || null;
@@ -21,6 +27,19 @@ module.exports = function(oldProfile, action) {
};
+function selectProfileItem(oldProfile, item) {
+ var newProfile = _.cloneDeep(oldProfile);
+
+ return newProfile;
+}
+
+function updateProfileItem(oldProfile, targetItem, key, value) {
+ var newProfile = _.cloneDeep(oldProfile);
+ var result = treeFind(newProfile, targetItem);
+ result.item[key] = value;
+ return newProfile;
+}
+
function moveProfileItem(oldProfile, movedItem, targetItem) {
@@ -50,6 +69,29 @@ function addProfileItem(oldProfile, newItem, targetItem) {
return newProfile;
}
+// Tree manipulation helpers
+
+function treeWalk(branch, func) {
+
+ var items = branch.items;
+
+ if(!items) return;
+
+ for( var i = 0, item = items[i]; (item = items[i]); i++ ) {
+
+ var breakHere = func(item, parent);
+
+ if(breakHere) return breakHere;
+
+ if(item.items) {
+ breakHere = treeWalk(item, func);
+ if(breakHere) return breakHere;
+ }
+
+ }
+
+}
+
function treeFind(branch, obj) {
var items = branch.items;
diff --git a/js/store/reducers/theme.js b/js/store/reducers/theme.js
new file mode 100644
index 0000000..32f39ac
--- /dev/null
+++ b/js/store/reducers/theme.js
@@ -0,0 +1,14 @@
+var actions = require('../actions');
+
+module.exports = function(currentTheme, action) {
+
+ switch(action.type) {
+
+ case actions.edit.USE_ICON_THEME:
+ return action.theme;
+
+ default:
+ return currentTheme || null;
+ }
+
+};