/* * This file is part of Oekaki Mobile. * Copyright (C) 2013 Jeremy Lam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package idv.jlchntoz.oekakimobile; import idv.jlchntoz.oekakimobile.CheckBoxedArrayAdapter.OnCheckChangedListener; import com.chibipaint.*; import com.chibipaint.engine.*; import com.chibipaint.util.CPRect; import com.mobeta.android.dslv.DragSortController; import com.mobeta.android.dslv.DragSortListView; import android.content.Context; import android.view.View; import android.widget.*; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.SeekBar.OnSeekBarChangeListener; public class LayerDrawerHandler implements CPArtwork.ICPArtworkListener, DragSortListView.DropListener, DragSortListView.RemoveListener { public final CPController controller; public final Context context; public final View drawerView; DragSortController lstLayerCtrl; CheckBoxedArrayAdapter lstLayersAdapter; DragSortListView lstLayers; CheckBox CBLockAlpha, CBSampleAll; SeekBar SBAlpha; Spinner SPMixType; public LayerDrawerHandler(Context context, CPController controller, View drawerView) { this.context = context; this.drawerView = drawerView; this.controller = controller; lstLayers = (DragSortListView) drawerView.findViewById(R.id.lstlayers); CBLockAlpha = (CheckBox) drawerView.findViewById(R.id.cblockalpha); CBSampleAll = (CheckBox) drawerView.findViewById(R.id.cbsampleall); SBAlpha = (SeekBar) drawerView.findViewById(R.id.sblayeralpha); SPMixType = (Spinner) drawerView.findViewById(R.id.spmixtype); ArrayAdapter<CharSequence> aaMixType = ArrayAdapter.createFromResource( this.context, R.array.mixModeNames, android.R.layout.simple_spinner_item); aaMixType .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); SPMixType.setAdapter(aaMixType); SPMixType.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { LayerDrawerHandler.this.controller.artwork.setBlendMode( LayerDrawerHandler.this.controller.artwork.getActiveLayerNb(), position); } @Override public void onNothingSelected(AdapterView<?> arg0) { } }); SBAlpha.setMax(100); SBAlpha.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar sb, int p, boolean u) { LayerDrawerHandler.this.controller.artwork.setLayerAlpha( LayerDrawerHandler.this.controller.artwork.getActiveLayerNb(), p); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); CBLockAlpha.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { LayerDrawerHandler.this.controller.artwork.setLockAlpha(isChecked); } }); CBSampleAll.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { LayerDrawerHandler.this.controller.artwork .setSampleAllLayers(isChecked); } }); loadLayerSettings(); lstLayerCtrl = new DragSortController(lstLayers); lstLayers.setFloatViewManager(lstLayerCtrl); lstLayers.setOnTouchListener(lstLayerCtrl); lstLayers.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); lstLayers.setDropListener(this); lstLayers.setRemoveListener(this); lstLayerCtrl.setDragHandleId(R.id.drag_handle); lstLayerCtrl.setRemoveMode(DragSortController.FLING_REMOVE); lstLayerCtrl.setDragInitMode(DragSortController.ON_DRAG); controller.artwork.addListener(this); layerChange(controller.artwork); } @Override public void updateRegion(CPArtwork artwork, CPRect region) { } @Override public void layerChange(CPArtwork artwork) { Boolean lstNull = false; Object layers[] = artwork.getLayers(); int index = 0, count = layers.length; if (lstLayersAdapter == null) { lstLayersAdapter = new CheckBoxedArrayAdapter(context, R.layout.checkablelayout, R.id.cbchecked, R.id.tvlsicontent, new CheckBoxedArrayAdapter.list()); lstLayersAdapter.setOnCheckedChangeListener(new OnCheckChangedListener() { @Override public void OnCheckedChange(CompoundButton buttonView, int position, boolean isChecked) { controller.artwork.setLayerVisibility(lstLayersAdapter.getCount() - 1 - position, isChecked); } }); lstLayersAdapter .setOnClickListener(new CheckBoxedArrayAdapter.OnItemClickListener() { @Override public void OnItemClick(View view, int pos) { int p = lstLayersAdapter.getCount() - 1 - pos; controller.artwork.setActiveLayer(p); loadLayerSettings(); controller.artwork.callListenersLayerChange(); } }); lstNull = true; } for (Object layer : layers) { CPLayer _l = (CPLayer) layer; int _index = lstLayersAdapter.getCount() - 1 - index; if (index < lstLayersAdapter.getCount()) { lstLayersAdapter.remove(lstLayersAdapter.getItem(_index)); lstLayersAdapter.insert(_l.name, _l.visible, controller.artwork.getActiveLayerNb() == index, _index); } else lstLayersAdapter.add(_l.name, _l.visible, controller.artwork.getActiveLayerNb() == index); index++; } while (index < lstLayersAdapter.getCount()) lstLayersAdapter.remove(lstLayersAdapter.getItem(0)); if (lstNull) lstLayers.setAdapter(lstLayersAdapter); else lstLayersAdapter.notifyDataSetChanged(); for (int i = 0; i < count; i++) lstLayers.setItemChecked(lstLayersAdapter.getCount() - 1 - i, ((CPLayer) layers[i]).visible); lstLayerCtrl.setRemoveEnabled(count > 1); controller.artwork.callListenersUpdateRegion(controller.artwork.getSize()); ((MainActivity)context).rePaint(); } private void loadLayerSettings() { SBAlpha.setProgress(controller.artwork.getActiveLayer().alpha); SPMixType.setSelection(controller.artwork.getActiveLayer().blendMode); } @Override public void remove(int which) { controller.artwork.setActiveLayer(lstLayersAdapter.getCount() - 1 - which); controller.artwork.removeLayer(); } @Override public void drop(int from, int to) { from = lstLayersAdapter.getCount() - 1 - from; to = lstLayersAdapter.getCount() - 1 - to; loadLayerSettings(); if (to != from) controller.artwork.moveLayer(from, to); loadLayerSettings(); } }