Use a new architecture for internal separators

--the old architecture that was trying to keep
an internal separators record couldnt catch up
and at the same time could create issues with
internal separators at different activities.
pull/2/head
Michail Vourlakos 7 years ago
parent 76af94b59d
commit e9b3cf2ed7

@ -272,43 +272,4 @@ void LaunchersSignals::moveTask(QString layoutName, int senderId, int launcherGr
}
}
void LaunchersSignals::internalSeparators(QString layoutName, int senderId, int launcherGroup,
QStringList separators, QStringList indexes)
{
Dock::LaunchersGroup group = static_cast<Dock::LaunchersGroup>(launcherGroup);
if ((Dock::LaunchersGroup)group == Dock::UniqueLaunchers) {
return;
}
QString lName = (group == Dock::LayoutLaunchers) ? layoutName : "";
foreach (auto applet, lattePlasmoids(lName)) {
if (applet->id() != senderId) {
if (QQuickItem *appletInterface = applet->property("_plasma_graphicObject").value<QQuickItem *>()) {
const auto &childItems = appletInterface->childItems();
if (childItems.isEmpty()) {
continue;
}
for (QQuickItem *item : childItems) {
if (auto *metaObject = item->metaObject()) {
int methodIndex = metaObject->indexOfMethod("extSignalInternalSeparators(QVariant,QVariant,QVariant)");
if (methodIndex == -1) {
continue;
}
QMetaMethod method = metaObject->method(methodIndex);
method.invoke(item, Q_ARG(QVariant, launcherGroup), Q_ARG(QVariant, separators), Q_ARG(QVariant, indexes));
}
}
}
}
}
}
} //end of namespace

@ -56,8 +56,6 @@ public slots:
Q_INVOKABLE void removeLauncherFromActivity(QString layoutName, int launcherGroup, QString launcher, QString activity);
Q_INVOKABLE void urlsDropped(QString layoutName, int launcherGroup, QStringList urls);
Q_INVOKABLE void moveTask(QString layoutName, int senderId, int launcherGroup, int from, int to);
Q_INVOKABLE void internalSeparators(QString layoutName, int senderId, int launcherGroup,
QStringList separators, QStringList indexes);
private:
QList<Plasma::Applet *> lattePlasmoids(QString layoutName);

@ -43,10 +43,6 @@ Item {
//(id, mScale)
property variant frozenTasks: []
//the internal separators in the form
//(launcherUrl, index)
property variant separators: []
//new launchers in order to be moved in correct place
//(launcher, pos)
property variant launchersToBeMoved: []
@ -54,61 +50,16 @@ Item {
Connections{
target: root
onTasksCountChanged:parManager.updateTasksEdgesIndexes();
onDragSourceChanged: {
if (!root.dragSource && parManager.hasInternalSeparator) {
//! Send the internal separators to other docks
var tasks = icList.contentItem.children;
var size = icList.contentItem.children.length;
var tempSeparatorsArray = [];
var tempSeparatorsIndexes = [];
for(var i=0; i<size; ++i){
if (i>=icList.contentItem.children.length) {
break;
}
if (tasks[i] && tasks[i].isSeparator) {
tempSeparatorsArray.push(tasks[i].launcherUrl);
tempSeparatorsIndexes.push(tasks[i].itemIndex);
}
}
if (tempSeparatorsArray.length > 0) {
if (latteDock && latteDock.launchersGroup >= Latte.Dock.LayoutLaunchers) {
//reorder to lowest
for(var i=0; i<tempSeparatorsIndexes.length; ++i) {
var lowIndex = i;
for(var j=i; j<tempSeparatorsIndexes.length; ++j) {
if (tempSeparatorsIndexes[j]<tempSeparatorsIndexes[lowIndex]) {
lowIndex = j;
}
}
if (lowIndex !== i) {
//moving
var tempInd = tempSeparatorsIndexes[lowIndex];
tempSeparatorsIndexes.splice(lowIndex, 1);
tempSeparatorsIndexes.splice(i, 0, tempInd);
var tempName = tempSeparatorsArray[lowIndex];
tempSeparatorsArray.splice(lowIndex, 1);
tempSeparatorsArray.splice(i, 0, tempName);
}
}
latteDock.universalLayoutManager.launchersSignals.internalSeparators(root.managedLayoutName,
plasmoid.id,
latteDock.launchersGroup,
tempSeparatorsArray,
tempSeparatorsIndexes);
}
}
}
}
}
Component.onCompleted: {
updateHasInternalSeparator();
updateTasksEdgesIndexes();
root.separatorsUpdated.connect(updateHasInternalSeparator);
}
Component.onDestruction: {
root.separatorsUpdated.disconnect(updateHasInternalSeparator);
}
function updateTasksEdgesIndexes() {
@ -125,6 +76,20 @@ Item {
countRealTasks = realTasks();
}
function updateHasInternalSeparator() {
var count = icList.contentItem.children.length;
for (var i=0; i<count; ++i) {
var task = icList.childAtIndex(i);
if (task && task.isSeparator){
hasInternalSeparator = true;
return;
}
}
hasInternalSeparator = false;
}
//!this is used in order to update the index when the signal is for applets
//!outside the latte plasmoid
function updateIdSendScale(index, zScale, zStep){
@ -310,63 +275,6 @@ Item {
}
}
//! SEPARATORS functions
// update the registered separators
// launcherUrl, no = add/update separator
// launcherUrl, -1 = remove separator
function setSeparator(launcher, taskIndex) {
var currentPos = separatorArrayPos(launcher);
var updated = false;
if (currentPos === -1 && taskIndex >=0){
//add that separator
//console.log("add separator:"+launcher+" at:"+taskIndex);
separators.push({launcherUrl: launcher, index: taskIndex});
updated = true;
} else if (currentPos>-1 && taskIndex === -1) {
//remove that separator
//console.log("remove separator:"+launcher);
separators.splice(currentPos,1);
updated = true;
} else if (currentPos>-1 && taskIndex>-1 && separators[currentPos].index !== taskIndex) {
//update that separator
//console.log("update separator:"+launcher+" from:"+separators[currentPos].index+" -> "+taskIndex);
separators[currentPos].index = taskIndex;
updated = true;
}
//if (separators.length > 0)
// console.log(separators[0].launcherUrl+ " _________ " + separators[0].index);
if (updated) {
//console.log("message sent...");
hasInternalSeparator = separators.length > 0;
updateTasksEdgesIndexes();
root.separatorsUpdated();
}
}
function separatorArrayPos(launcher) {
var res = -1;
var sLength = separators.length;
for (var i=0; i<sLength; ++i) {
//!safety checker
if (i>=separators.length)
return false;
if (separators[i].launcherUrl === launcher)
return i;
}
return res;
}
function availableLowerIndex(from) {
var next = from;
@ -393,18 +301,9 @@ Item {
}
function taskIsSeparator(taskIndex){
var sLength = separators.length;
for (var i=0; i<sLength; ++i) {
//!safety checker
if (i>=separators.length)
return false;
if (separators[i].index === taskIndex)
return true;
}
var task = icList.childAtIndex(taskIndex);
return false;
return (task && !task.isForcedHidden && task.isSeparator);
}
function taskIsForcedHidden(taskIndex) {
@ -412,7 +311,7 @@ Item {
//!tasks that become hidden there is a chance to have index===-1 and to not be
//!able to be tracked down
return ((!task && (taskIndex>=0 && taskIndex<root.tasksCount)) || task.isForcedHidden);
return ((!task && (taskIndex>=0 && taskIndex<tasksModel.count)) || task.isForcedHidden);
}
function separatorExists(separator){
@ -496,14 +395,14 @@ Item {
var space = lastRealTaskIndex - firstRealTaskIndex;
if (space >= 0) {
var internseparators = 0;
var ignored = 0;
for(var i=firstRealTaskIndex; i<lastRealTaskIndex; ++i) {
if (taskIsSeparator(i)) {
internseparators = internseparators + 1;
if (taskIsSeparator(i) || taskIsForcedHidden(i)) {
ignored = ignored + 1;
}
}
return space + 1 - internseparators;
return space + 1 - ignored;
}
return 0;
@ -642,10 +541,6 @@ Item {
plasmoid.id, latteDock.launchersGroup, from, to);
}
if (isSeparator(launcherUrl)) {
setSeparator(launcherUrl,to);
}
tasksModel.syncLaunchers();
}
}

@ -1556,37 +1556,6 @@ Item {
}
}
function extSignalInternalSeparators(group, separators, indexes) {
if (group === latteDock.launchersGroup && !root.dragSource) {
var tasks = icList.contentItem.children;
var size = icList.contentItem.children.length;
for(var i=0; i<separators.length; ++i) {
var curIndex = -1;
var toIndex = Number(indexes[i]);
for(var j=0; j<size; ++j) {
if (j>=icList.contentItem.children.length){
break;
}
if (tasks[j] && tasks[j].launcherUrl === separators[i]) {
curIndex = tasks[j].itemIndex;
}
}
if ((curIndex !== -1) && (curIndex!==toIndex)) {
if (toIndex>=icList.contentItem.children.length) {
toIndex = icList.contentItem.children.length-1;
}
console.log("Fix internal separator pos, from :: " +curIndex + " to :: " + toIndex);
tasksModel.move(curIndex, toIndex);
}
}
}
}
//! END ::: external launchers signals in order to update the tasks model

@ -334,13 +334,7 @@ MouseArea{
Connections{
target: root
onEditModeChanged: separatorItem.updateForceHiddenState();
onDragSourceChanged: {
separatorItem.updateForceHiddenState();
if (isSeparator && !root.dragSource) {
parabolicManager.setSeparator(launcherUrl, itemIndex);
}
}
onDragSourceChanged: separatorItem.updateForceHiddenState();
onSeparatorsUpdated: separatorItem.updateForceHiddenState();
onGlobalDirectRenderChanged:{
@ -480,11 +474,19 @@ MouseArea{
}
onItemIndexChanged: {
if (isSeparator) {
root.separatorsUpdated();
}
if (itemIndex>=0)
lastValidTimer.start();
}
if (isSeparator){
parabolicManager.setSeparator(launcherUrl, itemIndex);
onLastValidIndexChanged: {
if (lastValidIndex>=0 && lastValidIndex<root.tasksCount){
if (!isForcedHidden && (lastValidIndex < parabolicManager.firstRealTaskIndex || lastValidIndex > parabolicManager.lastRealTaskIndex)) {
parabolicManager.updateTasksEdgesIndexes();
}
}
}
@ -516,13 +518,13 @@ MouseArea{
onIsSeparatorChanged: {
if (isSeparator) {
parabolicManager.setSeparator(launcherUrl, itemIndex);
root.separatorsUpdated();
if (parabolicManager.isLauncherToBeMoved(launcherUrl) && itemIndex>=0) {
parabolicManager.moveLauncherToCorrectPos(launcherUrl, itemIndex);
}
} else {
parabolicManager.setSeparator(launcherUrl, -1);
root.separatorsUpdated();
}
}

@ -100,6 +100,12 @@ Item{
onLatteAppletPosChanged: hiddenSpacer.updateNeighbour();
}
Connections{
target: parabolicManager
onFirstRealTaskIndexChanged: hiddenSpacer.updateNeighbour();
onLastRealTaskIndexChanged: hiddenSpacer.updateNeighbour();
}
Connections{
target: mainItemContainer
onItemIndexChanged: hiddenSpacer.updateNeighbour();

Loading…
Cancel
Save