From 1a21b39dc8cc8f8c2b5606509d32526be437357f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Beauchamp?= Date: Tue, 6 Dec 2016 11:30:08 -0500 Subject: [PATCH 1/4] fixed documentation link --- UserFlows.sketchplugin/Contents/Sketch/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UserFlows.sketchplugin/Contents/Sketch/manifest.json b/UserFlows.sketchplugin/Contents/Sketch/manifest.json index c8f126e..0748358 100644 --- a/UserFlows.sketchplugin/Contents/Sketch/manifest.json +++ b/UserFlows.sketchplugin/Contents/Sketch/manifest.json @@ -168,7 +168,7 @@ "identifier" : "com.abynim.sketchplugins.userflows", "version" : "2.0", "description" : "Generate user-flow diagrams from artboards in Sketch", - "homepage" : "https:\/\/github.com\/abynim\/UserFlow.sketchplugin", + "homepage" : "https:\/\/github.com\/abynim\/UserFlows", "authorEmail" : "abynimbalkar@gmail.com", "name" : "User Flows" } \ No newline at end of file From 5f42f0181392bbeef228ab95320a98144f4eb4f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Beauchamp?= Date: Fri, 9 Dec 2016 11:54:29 -0500 Subject: [PATCH 2/4] Added lock by default config --- .../Contents/Sketch/script.js | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/UserFlows.sketchplugin/Contents/Sketch/script.js b/UserFlows.sketchplugin/Contents/Sketch/script.js index a0d8cf5..0631ed7 100644 --- a/UserFlows.sketchplugin/Contents/Sketch/script.js +++ b/UserFlows.sketchplugin/Contents/Sketch/script.js @@ -3,6 +3,7 @@ var kKeepOrganizedKey = "com.abynim.userflows.keepOrganized"; var kExportScaleKey = "com.abynim.userflows.exportScale"; var kExportFormatKey = "com.abynim.userflows.exportFormat"; var kShowModifiedDateKey = "com.abynim.userflows.showModifiedDate"; +var kLockDefaultKey = "com.abynim.userflows.lockDefault"; var kFlowIndicatorColorKey = "com.abynim.userflows.flowIndicatorColor"; var kFlowBackgroundKey = "com.abynim.userflows.backgroundColor"; var kMinTapAreaKey = "com.abynim.userflows.minTapArea"; @@ -447,6 +448,7 @@ var generateFlow = function(context) { exportFormat = NSUserDefaults.standardUserDefaults().objectForKey(kExportFormatKey) || "pdf", modifiedBy = NSUserDefaults.standardUserDefaults().objectForKey(kFullNameKey), showModifiedDate = NSUserDefaults.standardUserDefaults().objectForKey(kShowModifiedDateKey) || false, + lockDefault = NSUserDefaults.standardUserDefaults().objectForKey(kLockDefaultKey) || true, flowBackground = NSUserDefaults.standardUserDefaults().objectForKey(kFlowBackgroundKey) || "Light", flowName = nameField.stringValue(), flowDescription = descriptionField.stringValue(), @@ -571,7 +573,7 @@ var generateFlow = function(context) { var connectionsGroup = MSLayerGroup.groupFromLayers(connectionLayers); connectionsGroup.setName("Connections"); artboardBitmapLayers.push(connectionsGroup); - connectionsGroup.setIsLocked(1); + connectionsGroup.setIsLocked(lockDefault); var groupBounds = CGRectZero; for (var i = 0; i < artboardBitmapLayers.length; i++) { @@ -597,7 +599,7 @@ var generateFlow = function(context) { flowNameLabel.addAttribute_value(NSFontAttributeName, NSFont.fontWithName_size("HelveticaNeue", 18*exportScale)); flowNameLabel.setTextColor(primaryTextColor); flowNameLabel.adjustFrameToFit(); - flowNameLabel.setIsLocked(1); + flowNameLabel.setIsLocked(lockDefault); flowBoard.addLayers([flowNameLabel]); var yPos = outerPadding + flowNameLabel.frame().height() + 14; @@ -613,7 +615,7 @@ var generateFlow = function(context) { flowDescriptionLabel.addAttribute_value(NSFontAttributeName, NSFont.fontWithName_size("HelveticaNeue", 12*exportScale)); flowDescriptionLabel.setTextColor(secondaryTextColor); flowDescriptionLabel.adjustFrameToFit(); - flowDescriptionLabel.setIsLocked(1); + flowDescriptionLabel.setIsLocked(lockDefault); flowBoard.addLayers([flowDescriptionLabel]); yPos = flowDescriptionLabel.frame().y() + flowDescriptionLabel.frame().height(); } @@ -638,7 +640,7 @@ var generateFlow = function(context) { modifiedDateLabel.addAttribute_value(NSFontAttributeName, NSFont.fontWithName_size("HelveticaNeue", 12*exportScale)); modifiedDateLabel.setTextColor(secondaryTextColor); modifiedDateLabel.adjustFrameToFit(); - modifiedDateLabel.setIsLocked(1); + modifiedDateLabel.setIsLocked(lockDefault); flowBoard.addLayers([modifiedDateLabel]); } @@ -767,7 +769,7 @@ var redrawConnections = function(context) { var connectionLayers = MSLayerArray.arrayWithLayers(drawConnections(connections, doc.currentPage(), 1)); connectionsGroup = MSLayerGroup.groupFromLayers(connectionLayers); connectionsGroup.setName("Connections"); - connectionsGroup.setIsLocked(1); + connectionsGroup.setIsLocked(lockDefault); context.command.setValue_forKey_onLayer_forPluginIdentifier(true, "isConnectionsContainer", connectionsGroup, kPluginDomain); doc.currentPage().deselectAllLayers(); @@ -972,6 +974,14 @@ var editSettings = function(context) { showNameCheckbox.setState(showName); settingsWindow.addAccessoryView(showNameCheckbox); + var lockDefault = NSUserDefaults.standardUserDefaults().objectForKey(kLockDefaultKey) || 1; + var lockDefaultCheckbox = NSButton.alloc().initWithFrame(NSMakeRect(0,0,400,22)); + lockDefaultCheckbox.setButtonType(NSSwitchButton); + lockDefaultCheckbox.setBezelStyle(0); + lockDefaultCheckbox.setTitle("Lock flows by default"); + lockDefaultCheckbox.setState(lockDefault); + settingsWindow.addAccessoryView(lockDefaultCheckbox); + // ------------ var separator = NSBox.alloc().initWithFrame(NSMakeRect(0,0,300,10)); separator.setBoxType(2); @@ -991,6 +1001,7 @@ var editSettings = function(context) { NSUserDefaults.standardUserDefaults().setObject_forKey(parseInt(tapAreaField.stringValue()), kMinTapAreaKey); NSUserDefaults.standardUserDefaults().setObject_forKey(userNameField.stringValue(), kFullNameKey); NSUserDefaults.standardUserDefaults().setObject_forKey(showNameCheckbox.state(), kShowModifiedDateKey); + NSUserDefaults.standardUserDefaults().setObject_forKey(lockDefaultCheckbox.state(), kLockDefaultKey); applySettings(context); logEvent("settingsChanged", { exportScale : exportScale, @@ -1009,6 +1020,7 @@ var editSettings = function(context) { NSUserDefaults.standardUserDefaults().removeObjectForKey(kMinTapAreaKey); NSUserDefaults.standardUserDefaults().removeObjectForKey(kFullNameKey); NSUserDefaults.standardUserDefaults().removeObjectForKey(kShowModifiedDateKey); + NSUserDefaults.standardUserDefaults().removeObjectForKey(kLockDefaultKey); applySettings(context); logEvent("settingsReset", nil); From 7a1aafc4bae5560c8d067de79db65cfd2b719ff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Beauchamp?= Date: Mon, 12 Dec 2016 10:32:03 -0500 Subject: [PATCH 3/4] fixed merge conflict --- UserFlows.sketchplugin/Contents/Sketch/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UserFlows.sketchplugin/Contents/Sketch/manifest.json b/UserFlows.sketchplugin/Contents/Sketch/manifest.json index 618d67e..57c240f 100644 --- a/UserFlows.sketchplugin/Contents/Sketch/manifest.json +++ b/UserFlows.sketchplugin/Contents/Sketch/manifest.json @@ -168,7 +168,7 @@ "identifier" : "com.abynim.sketchplugins.userflows", "version" : "2.0.1", "description" : "Generate user-flow diagrams from artboards in Sketch", - "homepage" : "https:\/\/github.com\/abynim\/UserFlows", + "homepage" : "https:\/\/abynim.github.io\/UserFlows", "authorEmail" : "abynimbalkar@gmail.com", "name" : "User Flows" } \ No newline at end of file From b24be155dd1580a6a8a3149d956cd4c4cf513969 Mon Sep 17 00:00:00 2001 From: Aby N Date: Sun, 11 Dec 2016 13:08:40 +0800 Subject: [PATCH 4/4] - Updated documentation URL to the github.io homepage - Added setting for flow indicator stroke thickness - Added setting to hide borders around link layers - Added the ability to link to artboards setup as Symbol masters - Fixed a bug caused when generating flow diagrams with multiple artboards having the same name --- .../Contents/Sketch/manifest.json | 4 +- .../Contents/Sketch/script.js | 52 ++++++++++++++----- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/UserFlows.sketchplugin/Contents/Sketch/manifest.json b/UserFlows.sketchplugin/Contents/Sketch/manifest.json index 0748358..57c240f 100644 --- a/UserFlows.sketchplugin/Contents/Sketch/manifest.json +++ b/UserFlows.sketchplugin/Contents/Sketch/manifest.json @@ -166,9 +166,9 @@ "compatibleVersion" : 4.1, "disableCocoaScriptPreprocessor" : true, "identifier" : "com.abynim.sketchplugins.userflows", - "version" : "2.0", + "version" : "2.0.1", "description" : "Generate user-flow diagrams from artboards in Sketch", - "homepage" : "https:\/\/github.com\/abynim\/UserFlows", + "homepage" : "https:\/\/abynim.github.io\/UserFlows", "authorEmail" : "abynimbalkar@gmail.com", "name" : "User Flows" } \ No newline at end of file diff --git a/UserFlows.sketchplugin/Contents/Sketch/script.js b/UserFlows.sketchplugin/Contents/Sketch/script.js index 0631ed7..4e8f2d5 100644 --- a/UserFlows.sketchplugin/Contents/Sketch/script.js +++ b/UserFlows.sketchplugin/Contents/Sketch/script.js @@ -10,6 +10,8 @@ var kMinTapAreaKey = "com.abynim.userflows.minTapArea"; var kFullNameKey = "com.abynim.userflows.fullName"; var kUUIDKey = "com.abynim.userflows.uuid"; var kShowConnectionsKey = "com.abynim.userflows.showConnections"; +var kShowsLinkRectsKey = "com.abynim.userflows.showsLinkRects"; +var kStrokeWidthKey = "com.abynim.userflows.strokeWidth"; var kConditionalArtboardKey = "com.abynim.userflows.conditionalArtboard"; var linkLayerPredicate; var iconImage; @@ -25,16 +27,16 @@ var defineLink = function(context) { if (selection.count() != 2) { validSelection = false; } else { - if (selection.firstObject().className() == "MSArtboardGroup") { + if (selection.firstObject().className() == "MSArtboardGroup" || selection.firstObject().className() == "MSSymbolMaster") { destArtboard = selection.firstObject(); linkLayer = selection.lastObject(); } - else if(selection.lastObject().className() == "MSArtboardGroup") { + else if(selection.lastObject().className() == "MSArtboardGroup" || selection.lastObject().className() == "MSSymbolMaster") { destArtboard = selection.lastObject(); linkLayer = selection.firstObject(); } - if (!destArtboard || linkLayer.className() == "MSArtboardGroup" || linkLayer.parentArtboard() == destArtboard) { + if (!destArtboard || linkLayer.className() == "MSArtboardGroup" || linkLayer.className() == "MSSymbolMaster" || linkLayer.parentArtboard() == destArtboard) { validSelection = false; } } @@ -287,7 +289,6 @@ var addCondition = function(context) { redrawConnections(context); } } - } @@ -384,9 +385,12 @@ var generateFlow = function(context) { } var artboardsWithLinks = linkLayers.valueForKeyPath("@distinctUnionOfObjects.parentArtboard"); - var artboardNames = artboardsWithLinks.valueForKeyPath("@unionOfObjects.name"); var artboardsDropdown = NSPopUpButton.alloc().initWithFrame(NSMakeRect(0,0,300,25)); - artboardsDropdown.addItemsWithTitles(artboardNames); + var loop = artboardsWithLinks.objectEnumerator(), artboardWithLinks, menuItem; + while (artboardWithLinks = loop.nextObject()) { + menuItem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent(artboardWithLinks.name(), nil, ""); + artboardsDropdown.menu().addItem(menuItem); + } var homeScreenID = context.command.valueForKey_onLayer_forPluginIdentifier("homeScreenID", doc.currentPage(), kPluginDomain); if (homeScreenID) { @@ -785,6 +789,8 @@ var drawConnections = function(connections, parent, exportScale) { var connectionsCount = connections.length, flowIndicatorColor = NSUserDefaults.standardUserDefaults().objectForKey(kFlowIndicatorColorKey) || "#F5A623", minimumTapArea = NSUserDefaults.standardUserDefaults().objectForKey(kMinTapAreaKey) || 44, + showLinkRects = NSUserDefaults.standardUserDefaults().objectForKey(kShowsLinkRectsKey) || 1, + strokeWidth = NSUserDefaults.standardUserDefaults().objectForKey(kStrokeWidthKey) || 3, connectionLayers = [], hitAreaColor = MSImmutableColor.colorWithSVGString("#000000").newMutableCounterpart(), hitAreaBorderColor = MSImmutableColor.colorWithSVGString(flowIndicatorColor).newMutableCounterpart(), @@ -804,7 +810,7 @@ var drawConnections = function(connections, parent, exportScale) { linkRect = NSInsetRect(linkRect, 0, (linkRect.size.height-minimumTapArea)/2); } - if (connection.linkIsCondition != 1) { + if (showLinkRects == 1 && connection.linkIsCondition != 1) { path = NSBezierPath.bezierPathWithRect(linkRect); hitAreaLayer = MSShapeGroup.shapeWithBezierPath(path); hitAreaLayer.style().addStylePartOfType(0).setColor(hitAreaColor); @@ -857,12 +863,12 @@ var drawConnections = function(connections, parent, exportScale) { lineLayer.setName("Flow arrow"); hitAreaBorder = lineLayer.style().addStylePartOfType(1); hitAreaBorder.setColor(hitAreaBorderColor); - hitAreaBorder.setThickness(3*exportScale); + hitAreaBorder.setThickness(strokeWidth*exportScale); hitAreaBorder.setPosition(0); parent.addLayers([lineLayer]); connectionLayers.push(lineLayer); - var arrowSize = 12; + var arrowSize = Math.max(12, strokeWidth*3); path = NSBezierPath.bezierPath(); path.moveToPoint(NSMakePoint(dropPoint.x+(arrowSize*0.6), dropPoint.y)); path.lineToPoint(NSMakePoint(dropPoint.x-arrowSize, dropPoint.y+(arrowSize*0.6))); @@ -941,19 +947,35 @@ var editSettings = function(context) { bgDropdown.selectItemAtIndex(selectedIndex); settingsWindow.addAccessoryView(bgDropdown); - settingsWindow.addTextLabelWithValue("Flow Indicators"); - var flowIndicatorColorWell = NSColorWell.alloc().initWithFrame(NSMakeRect(0,0,44,23)); + settingsWindow.addTextLabelWithValue("Flow Indicator Stroke"); + var flowIndicatorColorWell = NSColorWell.alloc().initWithFrame(NSMakeRect(56,0,44,23)); var flowIndicatorColorHex = NSUserDefaults.standardUserDefaults().objectForKey(kFlowIndicatorColorKey) || "#F5A623" var flowIndicatorColor = MSImmutableColor.colorWithSVGString(flowIndicatorColorHex).NSColorWithColorSpace(NSColorSpace.deviceRGBColorSpace()) flowIndicatorColorWell.setColor(flowIndicatorColor); - settingsWindow.addAccessoryView(flowIndicatorColorWell); - settingsWindow.addTextLabelWithValue("Minimum Tap Area"); + var strokeWidth = NSUserDefaults.standardUserDefaults().objectForKey(kStrokeWidthKey) || 3; + var strokeWidthField = NSTextField.alloc().initWithFrame(NSMakeRect(0,0,50,23)); + strokeWidthField.setStringValue(strokeWidth + "px"); + + var flowIndicatorOptionsView = NSView.alloc().initWithFrame(NSMakeRect(0,0,300,23)); + flowIndicatorOptionsView.addSubview(flowIndicatorColorWell); + flowIndicatorOptionsView.addSubview(strokeWidthField); + settingsWindow.addAccessoryView(flowIndicatorOptionsView); + + settingsWindow.addTextLabelWithValue("Minimum Link Area"); var tapAreaField = NSTextField.alloc().initWithFrame(NSMakeRect(0,0,50,23)); var minimumTapArea = NSUserDefaults.standardUserDefaults().objectForKey(kMinTapAreaKey) || 44; tapAreaField.setStringValue(minimumTapArea + "pt"); settingsWindow.addAccessoryView(tapAreaField); + var showLinkRects = NSUserDefaults.standardUserDefaults().objectForKey(kShowsLinkRectsKey) || 1; + var showLinksCheckbox = NSButton.alloc().initWithFrame(NSMakeRect(0,0,300,22)); + showLinksCheckbox.setButtonType(NSSwitchButton); + showLinksCheckbox.setBezelStyle(0); + showLinksCheckbox.setTitle("Draw borders around link layers"); + showLinksCheckbox.setState(showLinkRects); + settingsWindow.addAccessoryView(showLinksCheckbox); + // ------------ var separator = NSBox.alloc().initWithFrame(NSMakeRect(0,0,300,10)); separator.setBoxType(2); @@ -998,7 +1020,9 @@ var editSettings = function(context) { NSUserDefaults.standardUserDefaults().setObject_forKey(formatDropdown.titleOfSelectedItem(), kExportFormatKey); NSUserDefaults.standardUserDefaults().setObject_forKey(bgDropdown.titleOfSelectedItem(), kFlowBackgroundKey); NSUserDefaults.standardUserDefaults().setObject_forKey(flowIndicatorColor, kFlowIndicatorColorKey); + NSUserDefaults.standardUserDefaults().setObject_forKey(parseInt(strokeWidthField.stringValue()), kStrokeWidthKey); NSUserDefaults.standardUserDefaults().setObject_forKey(parseInt(tapAreaField.stringValue()), kMinTapAreaKey); + NSUserDefaults.standardUserDefaults().setObject_forKey(showLinksCheckbox.state(), kShowsLinkRectsKey); NSUserDefaults.standardUserDefaults().setObject_forKey(userNameField.stringValue(), kFullNameKey); NSUserDefaults.standardUserDefaults().setObject_forKey(showNameCheckbox.state(), kShowModifiedDateKey); NSUserDefaults.standardUserDefaults().setObject_forKey(lockDefaultCheckbox.state(), kLockDefaultKey); @@ -1017,7 +1041,9 @@ var editSettings = function(context) { NSUserDefaults.standardUserDefaults().removeObjectForKey(kExportFormatKey); NSUserDefaults.standardUserDefaults().removeObjectForKey(kFlowBackgroundKey); NSUserDefaults.standardUserDefaults().removeObjectForKey(kFlowIndicatorColorKey); + NSUserDefaults.standardUserDefaults().removeObjectForKey(kStrokeWidthKey); NSUserDefaults.standardUserDefaults().removeObjectForKey(kMinTapAreaKey); + NSUserDefaults.standardUserDefaults().removeObjectForKey(kShowsLinkRectsKey); NSUserDefaults.standardUserDefaults().removeObjectForKey(kFullNameKey); NSUserDefaults.standardUserDefaults().removeObjectForKey(kShowModifiedDateKey); NSUserDefaults.standardUserDefaults().removeObjectForKey(kLockDefaultKey);