Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Option for configuring newline exemptions for attributes #408

Open
michael-hawker opened this issue Sep 26, 2022 · 4 comments
Open

Option for configuring newline exemptions for attributes #408

michael-hawker opened this issue Sep 26, 2022 · 4 comments

Comments

@michael-hawker
Copy link
Contributor

Is your feature request related to a problem? Please describe.
I like to have attributes split out, but there are some pairs that I like to keep on the same line together like Grid.Row and Grid.Column or the X1, Y1 points of a Line on one line and X2, Y2 on another.

NewlineExceptionElements only allows to completely ignore ordering on a parent element, but sometimes I really want to be more granular than that.

Describe the solution you'd like
A collection like NewlineExemptionElements, but NewlineExemptionAttributes which will ignore those attributes and leave them on the line with the previous attribute (according to the ordering rules).

For instance adding Grid.Column as an exempted attribute value, would do this:

<Button Grid.Row="1" Grid.Column="2"
        Style="{StaticResource MyCustomStyle}"/>

vs. the default behavior:

<Button Grid.Row="1"
        Grid.Column="2"
        Style="{StaticResource MyCustomStyle}"/>

Describe alternatives you've considered

Additional context
Add any other context or screenshots about the feature request here.

@grochocki
Copy link
Contributor

Interesting idea! Your example works out nicely, but I am curious what expected behavior might be under less ideal scenarios. For instance, in your example, let's say you've specified Grid.Column as an exempted attribute value, but this is the original input:

<Button
    x:Key="MyCustomButton"
    Grid.Column="2"
    Style="{StaticResource MyCustomStyle}"/>

@michael-hawker
Copy link
Contributor Author

@grochocki yeah, I was thinking about that a bit more as well. There's definitely some complications. Easy for us humans to look at and know what we want, harder to quantify to the machines. 😋

I think the common piece here with a lot of these types of attributes and scenarios is that they're really tied to groups/sets of properties, e.g. you want your canvas attached properties or grid ones together.

Since AttributeOrderingRuleGroups kind of establishes these types of groups already, maybe it'd make sense to leverage that list as well?

So, the newline exemption would only apply if the attribute is paired with another one of its partner attributes in that collection?


For example, typically we have this:

    "AttributeOrderingRuleGroups": [
        "x:Class",
        "xmlns, xmlns:x",
        "xmlns:*",
        "x:Key, Key, x:Name, Name, x:Uid, Uid, Title",
        "Grid.Row, Grid.RowSpan, Grid.Column, Grid.ColumnSpan, Canvas.Left, Canvas.Top, Canvas.Right, Canvas.Bottom",
        "Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight",
        "Margin, Padding, HorizontalAlignment, VerticalAlignment, HorizontalContentAlignment, VerticalContentAlignment, Panel.ZIndex",
        "*:*, *",
        "PageSource, PageIndex, Offset, Color, TargetName, Property, Value, StartPoint, EndPoint",
        "mc:Ignorable, d:IsDataSource, d:LayoutOverrides, d:IsStaticText",
        "Storyboard.*, From, To, Duration"
    ],

So if the NewlineExceptionElements was defined as:

    "NewlineExceptionElements": "Grid.Column, Canvas.Top, Height"

Then if one of these is encountered, say Grid.Column it looks in the AttributeOrderingRuleGroups and finds where Grid.Column is. Then only applies the exemption if one of those other properties before it is found (in this case Grid.Row or Grid.RowSpan).

So in your example:

<Button
    x:Key="MyCustomButton"
    Grid.Column="2"
    Style="{StaticResource MyCustomStyle}"/>

Since there's no Grid.Row it doesn't get the exemption. But if you were to add one, then it would apply:

<Button
    x:Key="MyCustomButton"
    Grid.Row="1" Grid.Column="2"
    Style="{StaticResource MyCustomStyle}"/>

Even if the developer put them in different spots (before formatting):

<Button
    x:Key="MyCustomButton"
    Grid.Column="2"
    Style="{StaticResource MyCustomStyle}"
    Grid.Row="1"/>

Since they'd get ordered first by the attribute ordering rules, then it should be able to flow the logic and be consistent, right?

@grochocki
Copy link
Contributor

grochocki commented Sep 30, 2022

Leveraging AttributeOrderingRuleGroups could make things really clean. What if we lean in even further into those groupings and instead of indivudal attribute-based NewlineExemptionAttributes, created attribute group index-based NewlineExemptionAttributeGroups?

So, with this (abridged) config:

    "AttributeOrderingRuleGroups": [
		...
0        "x:Key, Key, x:Name, Name, x:Uid, Uid, Title",
1        "Grid.Row, Grid.RowSpan, Grid.Column, Grid.ColumnSpan, Canvas.Left, Canvas.Top, Canvas.Right, Canvas.Bottom",
2        "Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight",
		...
    ],
	"NewlineExemptionAttributeGroups": ["1"],

You would get:

<Button
    x:Key="MyCustomButton"
    Grid.Row="1" Grid.Column="2"
    Style="{StaticResource MyCustomStyle}"/>

If you wanted to, say, only exempt Grid.*, and not Canvas.* attributes, split grouping:

    "AttributeOrderingRuleGroups": [
		...
0        "x:Key, Key, x:Name, Name, x:Uid, Uid, Title",
1        "Grid.Row, Grid.RowSpan, Grid.Column, Grid.ColumnSpan",
2        "Canvas.Left, Canvas.Top, Canvas.Right, Canvas.Bottom",
3        "Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight",
		...
    ],
	"NewlineExemptionAttributeGroups": ["1"],

Or both, but on separate lines:

    "AttributeOrderingRuleGroups": [
		...
0        "x:Key, Key, x:Name, Name, x:Uid, Uid, Title",
1        "Grid.Row, Grid.RowSpan, Grid.Column, Grid.ColumnSpan",
2        "Canvas.Left, Canvas.Top, Canvas.Right, Canvas.Bottom",
3        "Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight",
		...
    ],
	"NewlineExemptionAttributeGroups": ["1", "2"],

@michael-hawker
Copy link
Contributor Author

Yeah, that could work too. Only issue with the index-based approach is that if someone changes the order of their attribute rule groups that can have unintended/adverse effects they don't expect, if they forgot they set the other property (or weren't aware of it with multiple contributors).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants