forked from woowacourse/android-paint
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MainActivity.kt
96 lines (85 loc) · 2.97 KB
/
MainActivity.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package woowacourse.paint
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.slider.RangeSlider
import woowacourse.paint.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val viewModel by viewModels<MainViewModel>()
private val canvasView by lazy { binding.cvCanvas }
private val adapter = ColorsAdapter { model ->
viewModel.pickColor(model)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupBinding()
setupViewModel()
setupToolbar()
setupCanvas()
setupColors()
setupWidthSlider()
}
private fun setupBinding() {
binding = ActivityMainBinding.inflate(layoutInflater)
binding.lifecycleOwner = this
setContentView(binding.root)
}
private fun setupViewModel() {
binding.viewModel = viewModel
viewModel.width.observe(this) { width ->
canvasView.setupWidth(width)
}
viewModel.selectedColor.observe(this) { color ->
canvasView.setupColor(color)
viewModel.colors.value?.let { colors ->
adapter.submitList(colors)
}
}
viewModel.selectedBrush.observe(this) { brush ->
canvasView.setupBrush(brush)
}
}
private fun setupToolbar() {
setSupportActionBar(binding.tbPaint)
binding.ivRedo.setOnClickListener {
canvasView.redo()
}
binding.ivUndo.setOnClickListener {
canvasView.undo()
}
binding.ivClear.setOnClickListener {
canvasView.eraseAll()
}
}
private fun setupCanvas() {
binding.cvCanvas.initPaint(
viewModel.width.value ?: MainViewModel.DEFAULT_WIDTH,
viewModel.selectedColor.value ?: MainViewModel.DEFAULT_SELECTED_COLOR,
)
}
private fun setupColors() {
binding.rvColors.adapter = adapter
binding.rvColors.setHasFixedSize(true)
binding.rvColors.addItemDecoration(SpaceItemDecoration(getSpace()))
}
private fun getSpace(): Int {
val colorWidth = resources.getDimensionPixelSize(R.dimen.color_item_size)
val display = this.applicationContext?.resources?.displayMetrics
val deviceWidth = display?.widthPixels
deviceWidth?.let {
return (deviceWidth - (colorWidth * 5)) / 4
}
return 10
}
private fun setupWidthSlider() {
binding.rsWidthChanger.valueFrom = MainViewModel.MIN_WIDTH
binding.rsWidthChanger.valueTo = MainViewModel.MAX_WIDTH
binding.rsWidthChanger.setValues(viewModel.width.value)
binding.rsWidthChanger.addOnChangeListener(
RangeSlider.OnChangeListener { _, value, _ ->
viewModel.pickWidth(value)
},
)
}
}