diff --git a/containments/panel/contents/code/LayoutManager.js b/containments/panel/contents/code/LayoutManager.js index 11deeddc3..45309b313 100644 --- a/containments/panel/contents/code/LayoutManager.js +++ b/containments/panel/contents/code/LayoutManager.js @@ -1,205 +1,210 @@ /* * Copyright 2013 Marco Martin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details * * You should have received a copy of the GNU Library General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ var layout; var root; var plasmoid; var lastSpacer; function restore() { var configString = String(plasmoid.configuration.AppletOrder) //array, a cell for encoded item order var itemsArray = configString.split(";"); - var applets = plasmoid.applets - applets.sort(function (a, b) { - var aIdx = itemsArray.indexOf(String(a.id)) - var bIdx = itemsArray.indexOf(String(b.id)) - - // applets that aren't listed in the order are sorted last - if (aIdx === -1 && bIdx !== -1) { - return 1 - } else if (aIdx !== -1 && bIdx === -1) { - return -1 - } + //map applet id->order in panel + var idsOrder = new Object(); + //map order in panel -> applet pointer + var appletsOrder = new Object(); - return aIdx - bIdx - }) + for (var i = 0; i < itemsArray.length; i++) { + //property name: applet id + //property value: order + idsOrder[itemsArray[i]] = i; + } - applets.forEach(function (applet) { - root.addApplet(applet, -1, -1) - }) + for (var i = 0; i < plasmoid.applets.length; ++i) { + if (idsOrder[plasmoid.applets[i].id] !== undefined) { + appletsOrder[idsOrder[plasmoid.applets[i].id]] = plasmoid.applets[i]; + //ones that weren't saved in AppletOrder go to the end + } else { + appletsOrder["unordered"+i] = plasmoid.applets[i]; + } + } + //finally, restore the applets in the correct order + for (var i in appletsOrder) { + root.addApplet(appletsOrder[i], -1, -1) + } //rewrite, so if in the orders there were now invalid ids or if some were missing creates a correct list instead save(); } function save() { var ids = new Array(); for (var i = 0; i < layout.children.length; ++i) { var child = layout.children[i]; if (child.applet) { ids.push(child.applet.id); } } plasmoid.configuration.AppletOrder = ids.join(';'); } function removeApplet (applet) { for (var i = layout.children.length - 1; i >= 0; --i) { var child = layout.children[i]; if (child.applet === applet) { child.destroy(); } } } //insert item2 before item1 function insertBefore(item1, item2) { if (item1 === item2) { return; } var removed = new Array(); var child; var i; for (i = layout.children.length - 1; i >= 0; --i) { child = layout.children[i]; removed.push(child); child.parent = root; if (child === item1) { break; } } item2.parent = layout; for (var j = removed.length - 1; j >= 0; --j) { removed[j].parent = layout; } return i; } //insert item2 after item1 function insertAfter(item1, item2) { if (item1 === item2) { return; } var removed = new Array(); var child; var i; for (i = layout.children.length - 1; i >= 0; --i) { child = layout.children[i]; //never ever insert after lastSpacer if (child === item1) { //Already in position, do nothing if (layout.children[i+1] === item2) { return; } break; } removed.push(child); child.parent = root; } item2.parent = layout; for (var j = removed.length - 1; j >= 0; --j) { removed[j].parent = layout; } return i; } function insertAtIndex(item, position) { if (position < 0 || position >= layout.children.length) { return; } //never ever insert after lastSpacer if (layout.children[position] === lastSpacer) { --position; } var removedItems = new Array(); for (var i = position; i < layout.children.length; ++i) { var child = layout.children[position]; child.parent = root; removedItems.push(child); } item.parent = layout; for (var i in removedItems) { removedItems[i].parent = layout; } } function insertAtCoordinates(item, x, y) { if (root.isHorizontal) { y = layout.height / 2; } else { x = layout.width / 2; } var child = layout.childAt(x, y); //if we got a place inside the space between 2 applets, we have to find it manually if (!child) { if (root.isHorizontal) { for (var i = 0; i < layout.children.length; ++i) { var candidate = layout.children[i]; if (x >= candidate.x && x < candidate.x + candidate.width + layout.rowSpacing) { child = candidate; break; } } } else { for (var i = 0; i < layout.children.length; ++i) { var candidate = layout.children[i]; if (y >= candidate.x && y < candidate.y + candidate.height + layout.columnSpacing) { child = candidate; break; } } } } //already in position if (child === item) { return; } if (!child) { child = layout.children[0]; } item.parent = root; //PlasmaCore.Types.Vertical = 3 if ((plasmoid.formFactor === 3 && y < child.y + child.height/2) || (plasmoid.formFactor !== 3 && x < child.x + child.width/2)) { return insertBefore(child, item); } else { return insertAfter(child, item); } }