Skip to content

Commit

Permalink
Add attribute to change icon placement of all labels
Browse files Browse the repository at this point in the history
  • Loading branch information
mahozad committed Jun 4, 2021
1 parent cdbb69e commit f2cd015
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 7 deletions.
21 changes: 15 additions & 6 deletions piechart/src/main/kotlin/ir/mahozad/android/PieChart.kt
Expand Up @@ -17,6 +17,7 @@ import androidx.core.graphics.minus
import ir.mahozad.android.PieChart.DrawDirection.CLOCKWISE
import ir.mahozad.android.PieChart.GapPosition.MIDDLE
import ir.mahozad.android.PieChart.GradientType.RADIAL
import ir.mahozad.android.PieChart.IconPlacement.START
import ir.mahozad.android.PieChart.LabelType.*
import ir.mahozad.android.PieChart.LegendIcons.SQUARE
import ir.mahozad.android.PieChart.SlicePointer
Expand All @@ -39,6 +40,7 @@ const val DEFAULT_SHOULD_CENTER_PIE = true
val defaultGapPosition = MIDDLE
val defaultGradientType = RADIAL
val defaultDrawDirection = CLOCKWISE
val defaultLabelIconsPlacement = START
val defaultLegendsIcon = SQUARE
val defaultLabelType = INSIDE
val defaultLabelsFont: Typeface = DEFAULT
Expand Down Expand Up @@ -79,7 +81,7 @@ class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs) {
@Dimension val labelIconHeight: Float? = null,
@Dimension val labelIconMargin: Float? = null,
@ColorInt val labelIconTint: Int? = null,
val labelIconPlacement: IconPlacement = IconPlacement.START,
val labelIconPlacement: IconPlacement? = null,

/**
* Distance of the start of the outside label from the pie
Expand All @@ -88,7 +90,7 @@ class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs) {
val pointer: SlicePointer? = null,
@DrawableRes val legendIcon: Int? = null,
@ColorInt val legendIconTint: Int? = null,
val legendIconPlacement: IconPlacement = IconPlacement.START,
val legendIconPlacement: IconPlacement = START,

/**
* Can also set the default value to the slice fraction.
Expand All @@ -108,7 +110,7 @@ class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs) {
)

enum class DrawDirection { CLOCKWISE, COUNTER_CLOCKWISE }
enum class IconPlacement { LEFT, RIGHT, START, END, TOP, BOTTOM }
enum class IconPlacement { START, END, LEFT, RIGHT, TOP, BOTTOM }
enum class GradientType { RADIAL, SWEEP }
enum class GapPosition { MIDDLE, PRECEDING_SLICE, SUCCEEDING_SLICE }
/* TODO: Rename inside to internal and outside to external (?) */
Expand Down Expand Up @@ -222,7 +224,11 @@ class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs) {
field = pointer
invalidate()
}

var labelIconsPlacement = defaultLabelIconsPlacement
set(placement) {
field = placement
invalidate()
}
/**
* When using outside labels, if this is set to true,
* the pie will always be centered on its canvas which may sacrifice
Expand Down Expand Up @@ -288,6 +294,9 @@ class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs) {
val slicesPointerLength = getDimension(R.styleable.PieChart_slicesPointerLength, -1f)
val slicesPointerWidth = getDimension(R.styleable.PieChart_slicesPointerWidth, -1f)
slicesPointer = if (slicesPointerLength <= 0 || slicesPointerWidth <= 0) defaultSlicesPointer else SlicePointer(slicesPointerLength, slicesPointerWidth, 0)
labelIconsPlacement = IconPlacement.values()[
getInt(R.styleable.PieChart_labelIconsPlacement, defaultLabelIconsPlacement.ordinal)
]
labelType = LabelType.values()[
getInt(R.styleable.PieChart_labelType, defaultLabelType.ordinal)
]
Expand Down Expand Up @@ -437,9 +446,9 @@ class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs) {
slice.labelIconTint?.let { tint -> labelIcon?.setTint(tint) }
}
val outsideLabelMargin = slice.outsideLabelMargin ?: outsideLabelsMargin
val iconPlacement = slice.labelIconPlacement ?: labelIconsPlacement
val iconMargin = slice.labelIconMargin ?: labelIconsMargin
val iconHeight = slice.labelIconHeight ?: labelIconsHeight
val iconPlacement = slice.labelIconPlacement /* ?: TODO: add labelIconsPlacement property */
val labelBounds = calculateLabelBounds(slice.label, mainPaint)
val iconBounds = calculateIconBounds(labelIcon, iconHeight)
val labelAndIconCombinedBounds = calculateLabelAndIconCombinedBounds(labelBounds, iconBounds, iconMargin, iconPlacement)
Expand Down Expand Up @@ -491,10 +500,10 @@ class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs) {
labelIcon = resources.getDrawable(iconId, null)
slice.labelIconTint?.let { tint -> labelIcon?.setTint(tint) }
}
val iconPlacement = slice.labelIconPlacement ?: labelIconsPlacement
val iconMargin = slice.labelIconMargin ?: labelIconsMargin
val iconHeight = slice.labelIconHeight ?: labelIconsHeight
val labelOffset = /* TODO: add slice.LabelOffset ?:*/ labelOffset
val iconPlacement = slice.labelIconPlacement /* ?: TODO: add labelIconsPlacement property */
val labelBounds = calculateLabelBounds(slice.label, mainPaint)
val iconBounds = calculateIconBounds(labelIcon, iconHeight)
val labelAndIconCombinedBounds = calculateLabelAndIconCombinedBounds(labelBounds, iconBounds, iconMargin, iconPlacement)
Expand Down
2 changes: 1 addition & 1 deletion piechart/src/main/kotlin/ir/mahozad/android/SizeUtil.kt
Expand Up @@ -237,9 +237,9 @@ internal fun calculatePieNewBoundsForOutsideLabel(
var labelIcon : Drawable? = null
slice.labelIcon?.let { labelIcon = context.resources.getDrawable(it, null) }
val outsideLabelMargin = slice.outsideLabelMargin ?: defaults.outsideLabelsMargin
val iconPlacement = slice.labelIconPlacement ?: defaults.labelIconsPlacement
val iconMargin = slice.labelIconMargin ?: defaults.labelIconsMargin
val iconHeight = slice.labelIconHeight ?: defaults.labelIconsHeight
val iconPlacement = slice.labelIconPlacement /* ?: TODO: add labelIconsPlacement property */
val iconBounds = calculateIconBounds(labelIcon, iconHeight)
val labelBounds = calculateLabelBounds(slice.label, paint)
val combinedBounds = calculateLabelAndIconCombinedBounds(labelBounds, iconBounds, iconMargin, iconPlacement)
Expand Down
12 changes: 12 additions & 0 deletions piechart/src/main/res/values/attrs.xml
Expand Up @@ -63,6 +63,18 @@
<attr name="labelOffset" format="float"/>
<attr name="labelsColor" format="color"/>
<attr name="outsideLabelsMargin" format="dimension"/>
<attr name="labelIconsPlacement" format="enum">
<!-- Positions the icon at the start.
Start corresponds to left in LTR layouts and to right in RTL layouts. -->
<enum name="start" value="0"/>
<!-- Positions the icon at the end.
End corresponds to right in LTR layouts and to left in RTL layouts. -->
<enum name="end" value="1"/>
<enum name="left" value="2"/>
<enum name="right" value="3"/>
<enum name="top" value="4"/>
<enum name="bottom" value="5"/>
</attr>
<attr name="labelType" format="enum">
<enum name="none" value="0"/>
<enum name="inside" value="1"/>
Expand Down
1 change: 1 addition & 0 deletions piechart/src/main/res/values/public.xml
Expand Up @@ -12,6 +12,7 @@
<public name="startAngle" format="integer"/>
<public name="labelsSize" format="dimension"/>
<public name="labelsFont" format="reference"/>
<public name="labelIconsPlacement" format="enum"/>
<public name="labelIconsHeight" format="dimension"/>
<public name="labelIconsMargin" format="dimension"/>
<public name="labelOffset" format="float"/>
Expand Down

0 comments on commit f2cd015

Please sign in to comment.