This commit is contained in:
jdescottes
2014-05-12 00:18:34 +02:00
9 changed files with 137 additions and 51 deletions

View File

@@ -1,6 +1,3 @@
.palettes-list-container {
}
.palettes-list-select { .palettes-list-select {
float:right; float:right;
max-width:90px; max-width:90px;
@@ -14,7 +11,8 @@
} }
.palettes-list-colors { .palettes-list-colors {
overflow:hidden; overflow: auto;
max-height: 160px;
} }
.palettes-list-color { .palettes-list-color {
@@ -35,8 +33,13 @@
height : 32px; height : 32px;
} }
.palettes-list-color.primary:before, .palettes-list-has-scrollbar .palettes-list-color,
.palettes-list-color.secondary:before { .palettes-list-has-scrollbar .palettes-list-color div{
width: 29px
}
.palettes-list-primary-color:before,
.palettes-list-secondary-color:before {
content: ""; content: "";
position: absolute; position: absolute;
bottom: 1px; bottom: 1px;
@@ -48,13 +51,13 @@
height: 0px; height: 0px;
} }
.palettes-list-color.primary:before { .palettes-list-primary-color:before {
left: 1px; left: 1px;
border-right-color: transparent; border-right-color: transparent;
} }
.palettes-list-color.secondary:before { .palettes-list-secondary-color:before {
right: 1px; right: 1px;
border-left-color: transparent; border-left-color: transparent;
} }

View File

@@ -20,6 +20,8 @@ var Constants = {
TRANSPARENT_COLOR : 'rgba(0, 0, 0, 0)', TRANSPARENT_COLOR : 'rgba(0, 0, 0, 0)',
NO_PALETTE_ID : '__no-palette', NO_PALETTE_ID : '__no-palette',
CURRENT_COLORS_PALETTE_ID : '__current-colors',
MANAGE_PALETTE_ID : '__manage-palettes',
// Used for Spectrum input // Used for Spectrum input
PREFERRED_COLOR_FORMAT : 'rgb', PREFERRED_COLOR_FORMAT : 'rgb',

View File

@@ -45,5 +45,7 @@ var Events = {
SHOW_NOTIFICATION: "SHOW_NOTIFICATION", SHOW_NOTIFICATION: "SHOW_NOTIFICATION",
HIDE_NOTIFICATION: "HIDE_NOTIFICATION", HIDE_NOTIFICATION: "HIDE_NOTIFICATION",
ZOOM_CHANGED : "ZOOM_CHANGED" ZOOM_CHANGED : "ZOOM_CHANGED",
CURRENT_COLORS_UPDATED : "CURRENT_COLORS_UPDATED"
}; };

View File

@@ -39,7 +39,10 @@
this.paletteController = new pskl.controller.PaletteController(); this.paletteController = new pskl.controller.PaletteController();
this.paletteController.init(); this.paletteController.init();
this.palettesListController = new pskl.controller.PalettesListController(); this.currentColorsService = new pskl.service.CurrentColorsService(this.piskelController);
this.currentColorsService.init();
this.palettesListController = new pskl.controller.PalettesListController(this.paletteController, this.currentColorsService);
this.palettesListController.init(); this.palettesListController.init();
this.cursorCoordinatesController = new pskl.controller.CursorCoordinatesController(this.piskelController); this.cursorCoordinatesController = new pskl.controller.CursorCoordinatesController(this.piskelController);

View File

@@ -1,8 +1,18 @@
(function () { (function () {
var ns = $.namespace('pskl.controller'); var ns = $.namespace('pskl.controller');
ns.PalettesListController = function () { var PRIMARY_COLOR_CLASSNAME = 'palettes-list-primary-color';
var SECONDARY_COLOR_CLASSNAME = 'palettes-list-secondary-color';
var HAS_SCROLL_CLASSNAME = 'palettes-list-has-scrollbar';
// well ... I know that if there are more than 20 colors, a scrollbar will be displayed
// It's linked to the max-height: 160px; defined in toolbox-palette-list.css !
// I apologize to my future self for this one.
var NO_SCROLL_MAX_COLORS = 20;
ns.PalettesListController = function (paletteController, usedColorService) {
this.usedColorService = usedColorService;
this.paletteController = paletteController;
}; };
ns.PalettesListController.prototype.init = function () { ns.PalettesListController.prototype.init = function () {
@@ -16,8 +26,9 @@
this.colorListContainer_.addEventListener('contextmenu', this.onColorContainerContextMenu.bind(this)); this.colorListContainer_.addEventListener('contextmenu', this.onColorContainerContextMenu.bind(this));
$.subscribe(Events.PALETTE_LIST_UPDATED, this.onPaletteListUpdated.bind(this)); $.subscribe(Events.PALETTE_LIST_UPDATED, this.onPaletteListUpdated.bind(this));
$.subscribe(Events.PRIMARY_COLOR_SELECTED, this.onColorUpdated.bind(this, 'primary')); $.subscribe(Events.CURRENT_COLORS_UPDATED, this.fillColorListContainer.bind(this));
$.subscribe(Events.SECONDARY_COLOR_SELECTED, this.onColorUpdated.bind(this, 'secondary')); $.subscribe(Events.PRIMARY_COLOR_SELECTED, this.highlightSelectedColors.bind(this));
$.subscribe(Events.SECONDARY_COLOR_SELECTED, this.highlightSelectedColors.bind(this));
this.fillPaletteList(); this.fillPaletteList();
this.selectPaletteFromUserSettings(); this.selectPaletteFromUserSettings();
@@ -38,23 +49,35 @@
}; };
ns.PalettesListController.prototype.fillColorListContainer = function () { ns.PalettesListController.prototype.fillColorListContainer = function () {
var html = ''; var colors = this.getSelectedPaletteColors_();
var palette = this.getSelectedPalette(); var html = colors.map(function (color) {
if (palette) {
html = palette.colors.map(function (color) {
return pskl.utils.Template.replace(this.paletteColorTemplate_, {color : color}); return pskl.utils.Template.replace(this.paletteColorTemplate_, {color : color});
}.bind(this)).join(''); }.bind(this)).join('');
}
this.colorListContainer_.innerHTML = html; this.colorListContainer_.innerHTML = html;
this.highlightSelectedColors();
var hasScrollbar = colors.length > NO_SCROLL_MAX_COLORS;
if (hasScrollbar && !pskl.utils.UserAgent.isChrome) {
this.colorListContainer_.classList.add(HAS_SCROLL_CLASSNAME);
} else {
this.colorListContainer_.classList.remove(HAS_SCROLL_CLASSNAME);
}
}; };
ns.PalettesListController.prototype.getSelectedPalette = function (evt) { ns.PalettesListController.prototype.getSelectedPaletteColors_ = function () {
var colors = [];
var paletteId = this.colorPaletteSelect_.value; var paletteId = this.colorPaletteSelect_.value;
var palettes = this.retrievePalettes(); if (paletteId === Constants.CURRENT_COLORS_PALETTE_ID) {
var palette = this.getPaletteById(paletteId, palettes); colors = this.usedColorService.getCurrentColors();
return palette; } else {
var palette = this.getPaletteById(paletteId, this.retrievePalettes());
if (palette) {
colors = palette.colors;
}
}
return colors;
}; };
ns.PalettesListController.prototype.selectPalette = function (paletteId) { ns.PalettesListController.prototype.selectPalette = function (paletteId) {
@@ -67,7 +90,7 @@
ns.PalettesListController.prototype.onPaletteSelected_ = function (evt) { ns.PalettesListController.prototype.onPaletteSelected_ = function (evt) {
var paletteId = this.colorPaletteSelect_.value; var paletteId = this.colorPaletteSelect_.value;
if (paletteId === '__manage-palettes') { if (paletteId === Constants.MANAGE_PALETTE_ID) {
$.publish(Events.DIALOG_DISPLAY, 'manage-palettes'); $.publish(Events.DIALOG_DISPLAY, 'manage-palettes');
this.selectPaletteFromUserSettings(); this.selectPaletteFromUserSettings();
} else { } else {
@@ -96,27 +119,29 @@
} }
}; };
ns.PalettesListController.prototype.onColorUpdated = function (type, event, color) { ns.PalettesListController.prototype.highlightSelectedColors = function () {
var colorContainer = this.colorListContainer_.querySelector('.palettes-list-color[data-color="'+color+'"]'); this.removeClass_(PRIMARY_COLOR_CLASSNAME);
this.removeClass_(SECONDARY_COLOR_CLASSNAME);
// Color is not in the currently selected palette var colorContainer = this.getColorContainer_(this.paletteController.getSecondaryColor());
if (!colorContainer) { if (colorContainer) {
return; colorContainer.classList.remove(PRIMARY_COLOR_CLASSNAME);
colorContainer.classList.add(SECONDARY_COLOR_CLASSNAME);
} }
if (type === 'primary') { colorContainer = this.getColorContainer_(this.paletteController.getPrimaryColor());
this.removeClass_('primary', '.palettes-list-color'); if (colorContainer) {
colorContainer.classList.add('primary'); colorContainer.classList.remove(SECONDARY_COLOR_CLASSNAME);
colorContainer.classList.remove('secondary'); colorContainer.classList.add(PRIMARY_COLOR_CLASSNAME);
} else if (type === 'secondary') {
this.removeClass_('secondary', '.palettes-list-color');
colorContainer.classList.add('secondary');
colorContainer.classList.remove('primary');
} }
}; };
ns.PalettesListController.prototype.removeClass_ = function (cssClass, selector) { ns.PalettesListController.prototype.getColorContainer_ = function (color) {
var element = document.querySelector(selector + '.' + cssClass); return this.colorListContainer_.querySelector('.palettes-list-color[data-color="'+color+'"]');
};
ns.PalettesListController.prototype.removeClass_ = function (cssClass) {
var element = document.querySelector('.' + cssClass);
if (element) { if (element) {
element.classList.remove(cssClass); element.classList.remove(cssClass);
} }

View File

@@ -0,0 +1,51 @@
(function () {
var ns = $.namespace('pskl.service');
ns.CurrentColorsService = function (piskelController) {
this.piskelController = piskelController;
this.currentColors = [];
this.framesColorsCache_ = {};
};
ns.CurrentColorsService.prototype.init = function () {
$.subscribe(Events.PISKEL_RESET, this.onPiskelUpdated_.bind(this));
$.subscribe(Events.TOOL_RELEASED, this.onPiskelUpdated_.bind(this));
};
ns.CurrentColorsService.prototype.getCurrentColors = function () {
return this.currentColors;
};
ns.CurrentColorsService.prototype.onPiskelUpdated_ = function (evt) {
var layers = this.piskelController.getLayers();
var frames = layers.map(function (l) {return l.getFrames();}).reduce(function (p, n) {return p.concat(n);});
var colors = {};
frames.forEach(function (f) {
var frameHash = f.getHash();
if (!this.framesColorsCache_[frameHash]) {
var frameColors = {};
f.forEachPixel(function (color, x, y) {
frameColors[color] = true;
});
this.framesColorsCache_[frameHash] = frameColors;
}
Object.keys(this.framesColorsCache_[frameHash]).forEach(function (color) {
colors[color] = true;
});
}.bind(this));
delete colors[Constants.TRANSPARENT_COLOR];
this.currentColors = Object.keys(colors);
this.currentColors = this.currentColors.sort(function (c1, c2) {
if (c1 < c2) {
return -1;
} else if (c1 > c2) {
return 1;
} else {
return 0;
}
});
// TODO : only fire if there was a change
$.publish(Events.CURRENT_COLORS_UPDATED, colors);
};
})();

View File

@@ -10,7 +10,7 @@
KEY_TO_DEFAULT_VALUE_MAP_ : { KEY_TO_DEFAULT_VALUE_MAP_ : {
'GRID_WIDTH' : 0, 'GRID_WIDTH' : 0,
'CANVAS_BACKGROUND' : 'lowcont-dark-canvas-background', 'CANVAS_BACKGROUND' : 'lowcont-dark-canvas-background',
'SELECTED_PALETTE' : Constants.NO_PALETTE_ID, 'SELECTED_PALETTE' : Constants.CURRENT_COLORS_PALETTE_ID,
'TILED_PREVIEW' : false 'TILED_PREVIEW' : false
}, },

View File

@@ -108,6 +108,7 @@
"js/service/keyboard/KeycodeTranslator.js", "js/service/keyboard/KeycodeTranslator.js",
"js/service/keyboard/CheatsheetService.js", "js/service/keyboard/CheatsheetService.js",
"js/service/ImageUploadService.js", "js/service/ImageUploadService.js",
"js/service/CurrentColorsService.js",
// Tools // Tools
"js/drawingtools/BaseTool.js", "js/drawingtools/BaseTool.js",

View File

@@ -2,19 +2,18 @@
<h3 class="toolbox-title palettes-title" style="overflow:hidden"> <h3 class="toolbox-title palettes-title" style="overflow:hidden">
<span style="line-height:24px ">Palettes</span> <span style="line-height:24px ">Palettes</span>
<select class="palettes-list-select"> <select class="palettes-list-select">
<optgroup class="palettes-list-select-group" label="Available palettes"> <option value="__current-colors">Current colors</option>
</optgroup> <option value="__manage-palettes">Create custom palettes</option>
<optgroup label="Admin"> <optgroup class="palettes-list-select-group" label="Custom palettes">
<option value="__manage-palettes">Create and Manage palettes</option>
</optgroup> </optgroup>
</select> </select>
</h3> </h3>
<div class="palettes-list-colors"></div> <div class="palettes-list-colors"></div>
</div>
<script type="text/template" id="palette-color-template"> <script type="text/template" id="palette-color-template">
<div class="palettes-list-color" data-color="{{color}}" title="{{color}}"> <div class="palettes-list-color" data-color="{{color}}" title="{{color}}">
<div data-color="{{color}}" style="background:{{color}}"></div> <div data-color="{{color}}" style="background:{{color}}"></div>
</div> </div>
</script> </script>
</div>