package com.github.bnottingham.springmenu;
import java.util.List;
import android.content.Context;
import com.github.bnottingham.springmenu.enums.SpringMenuDirection;
import com.github.bnottingham.springmenu.enums.SpringMenuType;
import com.github.bnottingham.springmenu.util.MathUtil;
/**
* @author Brett Nottingham on 5/10/2015.
* Copyright (c) 2015 Nottingham Software, Inc. All rights reserved.
*/
public class SpringMenuConfig
{
public static final String TAG = SpringMenuConfig.class.getCanonicalName();
private Context mContext;
private SpringMenuType mMenuType;
private SpringMenuDirection mDirection;
private List<SpringMenuItem> mItems;
//Used for all types
private double mTotalSize;
private double mSize;
//Used for STRAIGHT menu type
private int mAngle;
//Used for FAN_CUSTOM menu type
private int mAngleStart;
private int mAngleEnd;
public SpringMenuConfig(Context context, SpringMenuType type, SpringMenuDirection direction, int size)
{
mContext = context;
mMenuType = type;
mDirection = direction;
mSize = size;
mTotalSize = size;
}
public SpringMenuConfig(Context context, SpringMenuType type, int angle, int size)
{
mContext = context;
mMenuType = type;
mSize = size;
mTotalSize = size;
mAngle = angle;
}
public SpringMenuConfig(Context context, SpringMenuType type, int angleStart, int angleEnd, int size)
{
mContext = context;
mMenuType = type;
mSize = size;
mTotalSize = size;
mAngleStart = angleStart;
mAngleEnd = angleEnd;
}
public void setType(SpringMenuType type)
{
mMenuType = type;
initializeItems(mItems);
}
public void setMenuSize(int size)
{
mSize = size;
mTotalSize = size;
initializeItems(mItems);
}
public void setDirection(SpringMenuDirection direction)
{
mDirection = direction;
initializeItems(mItems);
}
public void setMenuAngle(int angle)
{
mAngle = angle;
initializeItems(mItems);
}
public void setFanStartAngle(int angle)
{
mAngleStart = angle;
initializeItems(mItems);
}
public void setFanEndAngle(int angle)
{
mAngleEnd = angle;
initializeItems(mItems);
}
public void initializeItems(final List<SpringMenuItem> items)
{
mItems = items;
switch (mMenuType)
{
case FAN:
case FAN_CUSTOM:
initFan();
break;
case STRAIGHT:
initStraight();
break;
case CURVE:
initCurve();
break;
}
for (SpringMenuItem item : items)
{
item.mTotalSize = mTotalSize;
item.mType = mMenuType;
item.mDirection = mDirection;
}
}
private void initFan()
{
float deltaAngle = 90f;
if (mMenuType == SpringMenuType.FAN)
{
switch (mDirection)
{
case TOP_RIGHT:
mAngleStart = 270;
break;
case TOP_LEFT:
mAngleStart = 180;
break;
case BOTTOM_LEFT:
mAngleStart = 90;
break;
case BOTTOM_RIGHT:
mAngleStart = 0;
break;
}
}
else if (mMenuType == SpringMenuType.FAN_CUSTOM)
{
deltaAngle = mAngleStart - mAngleEnd;
}
if (mItems.size() > 1)
{
deltaAngle = deltaAngle / (mItems.size() - 1);
}
float currentAngle = mAngleStart;
for (SpringMenuItem item : mItems)
{
item.mAngle = (int) currentAngle;
item.mRadius = mSize;
currentAngle += deltaAngle;
}
}
private void initStraight()
{
double count = 1;
double size = mItems.size();
for (SpringMenuItem item : mItems)
{
item.mAngle = mAngle;
item.mRatio = count / size;
item.mRadius = mSize * item.mRatio;
count++;
}
}
private void initCurve()
{
final double itemCount = mItems.size();
final double size = mSize / itemCount;
int position = 1;
for (SpringMenuItem item : mItems)
{
double itemRadius = size * position++;
item.mQuadFinalX = Math.abs(MathUtil.getCurveXGivenDistance(itemRadius, mTotalSize));
item.mQuadFinalY = MathUtil.getCurveY(item.mQuadFinalX, mTotalSize);
// Negative-Y means it will move up
// Negative-X means it will move left
switch (mDirection)
{
case TOP_LEFT:
item.mQuadFinalX = -item.mQuadFinalX;
item.mQuadFinalY = -item.mQuadFinalY;
break;
case TOP_RIGHT:
item.mQuadFinalY = -item.mQuadFinalY;
break;
case BOTTOM_LEFT:
item.mQuadFinalX = -item.mQuadFinalX;
break;
case BOTTOM_RIGHT:
break;
}
}
}
}