<NME> selection-changed-action.cocoascript
<BEF> @import 'actions/action-inventory.cocoascript'
@import 'actions/view-inventory.cocoascript'
@import 'actions/statistics-inventory.cocoascript'
@import 'run-actions.cocoascript'
@import 'lib.js'


function SelectionInventory(type) {
    this.type = type
    this.artboards = NSMutableArray.new()
}

function SelectionInventory(type, artboards) {
    this.type = type
    this.artboards = NSMutableArray.new()
    if (artboards != nil) { this.artboards = artboards}
}




var onSelectionChanged = function(context) {
    coscript.setShouldKeepAround(true);

    coscript.scheduleWithInterval_jsFunction(0.1,function() {
        var selection = NSDocumentController.sharedDocumentController().currentDocument().selectedLayers().layers();

        var currentSelectionType = SelectionInventory.analyseActionType(selection).type
        var selectionTitle = ""
        if (currentSelectionType == 0) { selectionTitle = "Select Layers" }
        else if (currentSelectionType == 1) { selectionTitle = "Layer / All States" }
        else if (currentSelectionType == 2) { selectionTitle = "Selected States" }
        else if (currentSelectionType == 3) { selectionTitle = "Layers / All States for Layers" }
        else if (currentSelectionType == 4) { selectionTitle = "Selected States for Layers" }

        ToolbarInventory.updateImportButtons(currentSelectionType)
        ToolbarInventory.updateSelectionLabelStringValue(selectionTitle + "")

        // StatisticsInventory.setStatus(2)

        coscript.setShouldKeepAround(false);
    });

      else if (localLayers.count() == 1) { ToolbarInventory.updateSelectionLabelStringValue(localLayers.firstObject().name()) }
      else if (localLayers.count() > 0) { ToolbarInventory.updateSelectionLabelStringValue(localLayers.count() + " layers") }
      else { ToolbarInventory.updateSelectionLabelStringValue(ViewInventory.placeHolderImport()) }
    }
    else if (localMode == Status.toolbarModeScene()) {
        // log("Found correct action: " + selectionInventoryInstance.type)
        ToolbarInventory.updateSceneButtons(selectionInventoryInstance.type)
    }


    // StatisticsInventory.setStatus(2)
    // log("b: " + [[NSDate date] timeIntervalSinceDate:localTime])
    if (asyncing) { coscript.setShouldKeepAround(false); }
}

// SelectionInventory.selectionChangedHandler = function() {
//
// }


// 0 – Select layers
// 1 – layer / all states
// 2 – selected states
// 3 – layers / all states for layers
// 4 – selected states for layers
// 5 – Scene
// 6 – Scene for selected artboards
// 7 – Expired

SelectionInventory.analyseActionType = function(selection) {
    if (!DemoInventory.isRegistered() && DemoInventory.actionsLeft() <= 0) { return new SelectionInventory(7) }

    if (selection == nil) {
        if (showLog) { log("Warning. Selection is nil") }
        return new SelectionInventory(0)
    }

    var localLayers = NSMutableArray.new()
    var localArtboards = NSMutableArray.new()
    var hasParentArtboard = false

    for (var i = 0; i < selection.count(); i++) {
        var currentLayerClassName = [[selection objectAtIndex:i] className]
        if (TypeInventory.isArtboardType(currentLayerClassName)) { localArtboards.addObject([selection objectAtIndex:i]) }
        else {
            localLayers.addObject([selection objectAtIndex:i])
            if (!hasParentArtboard) {
                var localParent = TypeInventory.findParentArtboard([selection objectAtIndex:i])
                if (localParent != nil && TypeInventory.isArtboardType(localParent.className())) { hasParentArtboard = true }
            }
        }
    }
    // for Keynote only
    if (StatisticsInventory.getStatus() == Status.simulateID() || (ToolbarInventory.toolbarMode() == Status.toolbarModeScene() && (StatisticsInventory.getStatus() != Status.generateID() || StatisticsInventory.getStatus() != Status.replicateID()))) {
        if (localArtboards.count() < 1) { return new SelectionInventory(5, currentDocument.currentPage().artboards()) }
        return new SelectionInventory(6, localArtboards)
    }

    if (localLayers.count() < 1 || !hasParentArtboard) { return new SelectionInventory(0) }

    var isSameName = true
    if (localLayers.count() > 0) {
        var currentLayerName = [[localLayers firstObject] name]
        for (var i = 1; i < localLayers.count(); i++) {
            var currentLayer = [localLayers objectAtIndex:i]
            if (![currentLayerName isEqualToString:[currentLayer name]]) {
                isSameName = false
                break;
            }
        }
    }

    var additionalArtboards = NSMutableArray.new()
    for (var i = 0; i < localLayers.count(); i++) {
        var currentLayer = [localLayers objectAtIndex:i]
    else if (localArtboards.count() > 1) { type = isSameName ? 2 : 4 }
    else { type = 0 }

    return new SelectionInventory(type, localArtboards)
}
        var shouldAddCurrentArtboard = true
        var currentArtboard = [additionalArtboards objectAtIndex:i]

        for (var j = 0; j < localArtboards.count(); j++) {
            var comparableArtboard = [localArtboards objectAtIndex:j]
            if ([[comparableArtboard name] isEqualToString:[currentArtboard name]] &&
                [comparableArtboard hash] == [currentArtboard hash]) {
                    shouldAddCurrentArtboard = false
                    break;
                }
        }

        if (shouldAddCurrentArtboard) { localArtboards.addObject(currentArtboard) }
    }

    // log("L: " + localLayers.count() + ", on A:" + localArtboards.count() + ". Same?" + isSameName)

    var type = -1
    if (localArtboards.count() == 1) { type = isSameName ? 1 : 3 }
    else if (localArtboards.count() > 1) { type = isSameName ? 2 : 4 }
    else { type = 0 }

    return new SelectionInventory(type, localArtboards, localLayers)
}

<MSG> Added label response to selection change

– now we show layers’ names to provide the meaning for which we gonna
generate layers/states
– added empty state

<DFF> @@ -8,36 +8,64 @@
 function SelectionInventory(type) {
     this.type = type
     this.artboards = NSMutableArray.new()
+    this.layers = NSMutableArray.new()
 }
 
 function SelectionInventory(type, artboards) {
     this.type = type
     this.artboards = NSMutableArray.new()
+    this.layers = NSMutableArray.new()
+
+    if (artboards != nil) { this.artboards = artboards}
+}
+
+function SelectionInventory(type, artboards, layers) {
+    this.type = type
+    this.artboards = NSMutableArray.new()
+    this.layers = NSMutableArray.new()
+
     if (artboards != nil) { this.artboards = artboards}
+    if (layers != nil) { this.layers = layers}
 }
 
 
 
 
+
 var onSelectionChanged = function(context) {
     coscript.setShouldKeepAround(true);
 
     coscript.scheduleWithInterval_jsFunction(0.1,function() {
+        var localTime = [NSDate date]
         var selection = NSDocumentController.sharedDocumentController().currentDocument().selectedLayers().layers();
 
-        var currentSelectionType = SelectionInventory.analyseActionType(selection).type
-        var selectionTitle = ""
-        if (currentSelectionType == 0) { selectionTitle = "Select Layers" }
-        else if (currentSelectionType == 1) { selectionTitle = "Layer / All States" }
-        else if (currentSelectionType == 2) { selectionTitle = "Selected States" }
-        else if (currentSelectionType == 3) { selectionTitle = "Layers / All States for Layers" }
-        else if (currentSelectionType == 4) { selectionTitle = "Selected States for Layers" }
-
-        ToolbarInventory.updateImportButtons(currentSelectionType)
-        ToolbarInventory.updateSelectionLabelStringValue(selectionTitle + "")
+        var selectionInventoryInstance = SelectionInventory.analyseActionType(selection)
+        // var currentSelectionType = selectionInventoryInstance.type
+        // var selectionTitle = ""
+        // if (currentSelectionType == 0) { selectionTitle = "Select Layers" }
+        // else if (currentSelectionType == 1) { selectionTitle = "Layer / All States" }
+        // else if (currentSelectionType == 2) { selectionTitle = "Selected States" }
+        // else if (currentSelectionType == 3) { selectionTitle = "Layers / All States for Layers" }
+        // else if (currentSelectionType == 4) { selectionTitle = "Selected States for Layers" }
+        log("a: " + [[NSDate date] timeIntervalSinceDate:localTime])
+        ToolbarInventory.updateImportButtons(selectionInventoryInstance.type)
+
+        var localLayers = selectionInventoryInstance.layers
+        if (selectionInventoryInstance.type == 2) {
+          ToolbarInventory.updateSelectionLabelStringValue(localLayers.firstObject().name())
+        }
+        else if (localLayers.count() == 2) {
+            ToolbarInventory.updateSelectionLabelStringValue(localLayers.firstObject().name() + ", " + localLayers.objectAtIndex(1).name())
+        }
+        else if (localLayers.count() == 1) { ToolbarInventory.updateSelectionLabelStringValue(localLayers.firstObject().name()) }
+        else if (localLayers.count() > 0) {
+          ToolbarInventory.updateSelectionLabelStringValue(localLayers.firstObject().name() + ", " + localLayers.objectAtIndex(1).name() + " and " + (localLayers.count()-2) + " more")
+          // ToolbarInventory.updateSelectionLabelStringValue(localLayers.count() + " layers")
+        }
+        else { ToolbarInventory.updateSelectionLabelStringValue("Select layers...") }
 
         // StatisticsInventory.setStatus(2)
-
+        log("b: " + [[NSDate date] timeIntervalSinceDate:localTime])
         coscript.setShouldKeepAround(false);
     });
 
@@ -119,5 +147,5 @@ SelectionInventory.analyseActionType = function(selection) {
     else if (localArtboards.count() > 1) { type = isSameName ? 2 : 4 }
     else { type = 0 }
 
-    return new SelectionInventory(type, localArtboards)
+    return new SelectionInventory(type, localArtboards, localLayers)
 }

Added label response to selection change