package zenproject.meditation.android.sketch;
import com.juankysoriano.rainbow.core.Rainbow;
import com.juankysoriano.rainbow.core.drawing.RainbowDrawer;
import com.juankysoriano.rainbow.core.event.RainbowInputController;
import com.novoda.notils.caster.Classes;
import zenproject.meditation.android.ContextRetriever;
import zenproject.meditation.android.R;
import zenproject.meditation.android.SketchRetriever;
import zenproject.meditation.android.sketch.actions.StepPerformer;
import zenproject.meditation.android.sketch.music.MusicPerformer;
import zenproject.meditation.android.sketch.painting.SketchInteractionListener;
import zenproject.meditation.android.sketch.painting.flowers.Flower;
import zenproject.meditation.android.sketch.painting.flowers.branch.BranchPerformer;
import zenproject.meditation.android.sketch.painting.ink.InkDrop;
import zenproject.meditation.android.sketch.painting.ink.InkPerformer;
import zenproject.meditation.android.ui.menu.dialogs.flower.FlowerSelectedListener;
/**
* Orchestration class for all the performers responsible for specific artistic (lol) operations.
*/
public class ZenSketch extends Rainbow implements FlowerSelectedListener {
private static final int DEFAULT_COLOR = ContextRetriever.INSTANCE.getResources().getColor(R.color.colorSketch);
private final RainbowDrawer rainbowDrawer;
private final StepPerformer inkPerformer;
private final StepPerformer branchPerformer;
private final StepPerformer musicPerformer;
private final SketchInteractionListener sketchInteractionListener;
protected ZenSketch(
MusicPerformer musicPerformer,
InkPerformer inkPerformer,
BranchPerformer branchPerformer,
RainbowDrawer rainbowDrawer,
RainbowInputController rainbowInputController,
SketchInteractionListener sketchInteractionListener) {
super(rainbowDrawer, rainbowInputController);
this.musicPerformer = musicPerformer;
this.inkPerformer = inkPerformer;
this.branchPerformer = branchPerformer;
this.rainbowDrawer = rainbowDrawer;
this.sketchInteractionListener = sketchInteractionListener;
}
public static ZenSketch newInstance() {
RainbowDrawer rainbowDrawer = new RainbowDrawer();
RainbowInputController rainbowInputController = RainbowInputController.newInstance();
InkDrop inkDrop = InkDrop.newInstance(rainbowInputController);
InkPerformer inkPerformer = InkPerformer.newInstance(inkDrop, rainbowInputController.getRainbowDrawer(), rainbowInputController);
BranchPerformer branchPerformer = BranchPerformer.newInstance(inkDrop, rainbowDrawer, rainbowInputController);
SketchInteractionListener sketchInteractionListener = SketchInteractionListener.newInstance(inkPerformer);
rainbowInputController.setRainbowInteractionListener(sketchInteractionListener);
ZenSketch zenSketch = new ZenSketch(MusicPerformer.newInstance(rainbowInputController),
inkPerformer,
branchPerformer,
rainbowDrawer,
rainbowInputController, sketchInteractionListener
);
SketchRetriever.INSTANCE.inject(zenSketch);
return zenSketch;
}
@Override
public void onSketchSetup() {
inkPerformer.init();
branchPerformer.init();
musicPerformer.init();
}
@Override
public void onDrawingStep() {
branchPerformer.doStep();
musicPerformer.doStep();
}
@Override
public void onDrawingPause() {
musicPerformer.disable();
}
@Override
public void onDrawingResume() {
musicPerformer.enable();
}
public void clear() {
branchPerformer.reset();
rainbowDrawer.background(DEFAULT_COLOR);
}
public void setOnPaintingListener(PaintListener paintListener) {
sketchInteractionListener.setPaintListener(paintListener);
}
@Override
public void onFlowerSelected(Flower flower) {
BranchPerformer performer = Classes.from(branchPerformer);
performer.onFlowerSelected(flower);
}
public interface PaintListener {
void onPaintingStart();
void onPaintingEnd();
}
}