Skip to content

Commit c45f0ed

Browse files
authored
Merge pull request #318 from icerockdev/develop
Release 0.2.4
2 parents 4017a8f + 1af37df commit c45f0ed

19 files changed

+173
-107
lines changed

README.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -209,15 +209,15 @@ allprojects {
209209
project build.gradle
210210
```groovy
211211
dependencies {
212-
commonMainApi("dev.icerock.moko:widgets:0.2.2")
213-
214-
commonMainApi("dev.icerock.moko:widgets-bottomsheet:0.2.2") // show bottom sheets
215-
commonMainApi("dev.icerock.moko:widgets-collection:0.2.2") // collection widget
216-
commonMainApi("dev.icerock.moko:widgets-datetime-picker:0.2.2") // show datepicker
217-
commonMainApi("dev.icerock.moko:widgets-image-network:0.2.2") // images with load from url
218-
commonMainApi("dev.icerock.moko:widgets-sms:0.2.2") // input with sms autofill
219-
commonMainApi("dev.icerock.moko:widgets-media:0.2.2") // moko-media integration
220-
commonMainApi("dev.icerock.moko:widgets-permissions:0.2.2") // moko-permissions integration
212+
commonMainApi("dev.icerock.moko:widgets:0.2.4")
213+
214+
commonMainApi("dev.icerock.moko:widgets-bottomsheet:0.2.4") // show bottom sheets
215+
commonMainApi("dev.icerock.moko:widgets-collection:0.2.4") // collection widget
216+
commonMainApi("dev.icerock.moko:widgets-datetime-picker:0.2.4") // show datepicker
217+
commonMainApi("dev.icerock.moko:widgets-image-network:0.2.4") // images with load from url
218+
commonMainApi("dev.icerock.moko:widgets-sms:0.2.4") // input with sms autofill
219+
commonMainApi("dev.icerock.moko:widgets-media:0.2.4") // moko-media integration
220+
commonMainApi("dev.icerock.moko:widgets-permissions:0.2.4") // moko-permissions integration
221221
}
222222
```
223223

@@ -230,7 +230,7 @@ buildscript {
230230
}
231231
232232
dependencies {
233-
classpath "dev.icerock.moko.widgets:gradle-plugin:0.2.2"
233+
classpath "dev.icerock.moko.widgets:gradle-plugin:0.2.4"
234234
}
235235
}
236236
```

gradle/libs.versions.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[versions]
22
kotlinVersion = "1.8.10"
33

4-
mokoWidgetsVersion = "0.2.3"
4+
mokoWidgetsVersion = "0.2.4"
55
mokoResourcesVersion = "0.21.2"
66
mokoMvvmVersion = "0.16.0"
77
mokoFieldsVersion = "0.12.0"

moko-widgets-bottomsheet.podspec

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |spec|
22
spec.name = 'moko-widgets-bottomsheet'
3-
spec.version = '0.2.2'
3+
spec.version = '0.2.4'
44
spec.homepage = 'https://github.com/icerockdev/moko-widgets'
55
spec.source = { :git => "https://github.com/icerockdev/moko-widgets.git", :tag => "release/#{spec.version}" }
66
spec.authors = 'IceRock Development'

moko-widgets-collection.podspec

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |spec|
22
spec.name = 'moko-widgets-collection'
3-
spec.version = '0.2.2'
3+
spec.version = '0.2.4'
44
spec.homepage = 'https://github.com/icerockdev/moko-widgets'
55
spec.source = { :git => "https://github.com/icerockdev/moko-widgets.git", :tag => "release/#{spec.version}" }
66
spec.authors = 'IceRock Development'

moko-widgets-datetime-picker.podspec

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |spec|
22
spec.name = 'moko-widgets-datetime-picker'
3-
spec.version = '0.2.2'
3+
spec.version = '0.2.4'
44
spec.homepage = 'https://github.com/icerockdev/moko-widgets'
55
spec.source = { :git => "https://github.com/icerockdev/moko-widgets.git", :tag => "release/#{spec.version}" }
66
spec.authors = 'IceRock Development'

moko-widgets-image-network.podspec

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |spec|
22
spec.name = 'moko-widgets-image-network'
3-
spec.version = '0.2.2'
3+
spec.version = '0.2.4'
44
spec.homepage = 'https://github.com/icerockdev/moko-widgets'
55
spec.source = { :git => "https://github.com/icerockdev/moko-widgets.git", :tag => "release/#{spec.version}" }
66
spec.authors = 'IceRock Development'

widgets/build.gradle.kts

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ kotlin {
3838
this as org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
3939

4040
compilations.getByName("main") {
41-
val pluralizedString by cinterops.creating {
42-
defFile(project.file("src/iosMain/def/objcAddtition.def"))
41+
val objcAddition by cinterops.creating {
42+
defFile(project.file("src/iosMain/def/objcAddition.def"))
4343
}
4444
}
4545
}

widgets/src/iosMain/def/objcAddtition.def renamed to widgets/src/iosMain/def/objcAddition.def

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ void setAssociatedObject(id object, id value) {
2020
return objc_setAssociatedObject(object, &kAssociatedObjectKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
2121
}
2222

23+
void setAssociatedObjectWithKey(id object, NSValue* key, id value) {
24+
return objc_setAssociatedObject(object, key.pointerValue, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
25+
}
26+
2327
NSArray* cgColors(NSArray<UIColor*>* uiColors) {
2428
NSMutableArray* result = [NSMutableArray arrayWithCapacity: uiColors.count];
2529
for(int i = 0;i < uiColors.count;i++) {

widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/CardViewFactory.kt

+8-5
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ import dev.icerock.moko.widgets.core.style.view.MarginValues
1313
import dev.icerock.moko.widgets.core.style.view.PaddingValues
1414
import dev.icerock.moko.widgets.core.style.view.WidgetSize
1515
import dev.icerock.moko.widgets.core.utils.Edges
16-
import dev.icerock.moko.widgets.core.utils.UIViewWithIdentifier
1716
import dev.icerock.moko.widgets.core.utils.applyBackgroundIfNeeded
1817
import dev.icerock.moko.widgets.core.utils.applySizeToChild
19-
import dev.icerock.moko.widgets.core.utils.identifier
2018
import dev.icerock.moko.widgets.core.widget.CardWidget
19+
import kotlinx.cinterop.ExportObjCClass
20+
import kotlinx.cinterop.readValue
2121
import platform.CoreGraphics.CGFloat
22+
import platform.CoreGraphics.CGRectZero
2223
import platform.CoreGraphics.CGSizeMake
2324
import platform.UIKit.UIColor
2425
import platform.UIKit.UIView
@@ -31,6 +32,10 @@ import platform.UIKit.leadingAnchor
3132
import platform.UIKit.topAnchor
3233
import platform.UIKit.trailingAnchor
3334
import platform.UIKit.translatesAutoresizingMaskIntoConstraints
35+
36+
@ExportObjCClass
37+
private class CardViewContainer : UIView(frame = CGRectZero.readValue())
38+
3439
@Suppress("MagicNumber")
3540
actual class CardViewFactory actual constructor(
3641
private val padding: PaddingValues?,
@@ -46,15 +51,13 @@ actual class CardViewFactory actual constructor(
4651

4752
val viewController: UIViewController = viewFactoryContext
4853

49-
val root = UIViewWithIdentifier().apply {
54+
val root = CardViewContainer().apply {
5055
translatesAutoresizingMaskIntoConstraints = false
5156
applyBackgroundIfNeeded(background)
5257

5358
layer.cornerRadius = background?.cornerRadius?.toDouble() ?: 0.0
5459
clipsToBounds = true
5560
backgroundColor = UIColor.whiteColor
56-
57-
accessibilityIdentifier = widget.identifier()
5861
}
5962

6063
val childViewBundle = widget.child.buildView(viewController)

widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/ConstraintViewFactory.kt

+9-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import dev.icerock.moko.widgets.core.widget.Constraint
1919
import dev.icerock.moko.widgets.core.widget.ConstraintItem
2020
import dev.icerock.moko.widgets.core.widget.ConstraintWidget
2121
import dev.icerock.moko.widgets.core.widget.ConstraintsApi
22+
import kotlinx.cinterop.ExportObjCClass
2223
import kotlinx.cinterop.readValue
2324
import platform.CoreGraphics.CGFloat
2425
import platform.CoreGraphics.CGRectZero
@@ -37,6 +38,9 @@ import platform.UIKit.safeAreaLayoutGuide
3738
import platform.UIKit.topAnchor
3839
import platform.UIKit.translatesAutoresizingMaskIntoConstraints
3940

41+
@ExportObjCClass
42+
private class ConstraintViewContainer : UIView(frame = CGRectZero.readValue())
43+
4044
actual class ConstraintViewFactory actual constructor(
4145
private val background: Background<out Fill>?,
4246
private val padding: PaddingValues?,
@@ -48,7 +52,7 @@ actual class ConstraintViewFactory actual constructor(
4852
size: WS,
4953
viewFactoryContext: ViewFactoryContext,
5054
): ViewBundle<WS> {
51-
val container = UIView(frame = CGRectZero.readValue()).apply {
55+
val container = ConstraintViewContainer().apply {
5256
translatesAutoresizingMaskIntoConstraints = false
5357

5458
applyBackgroundIfNeeded(background)
@@ -205,9 +209,11 @@ class AutoLayoutConstraintsApi(
205209
override fun offset(points: Int) {
206210
it.constant = const + points
207211
if (applyExtraMargins != null) {
208-
applyAdditionalMargins(firstItem.widget,
212+
applyAdditionalMargins(
213+
firstItem.widget,
209214
points.toFloat(),
210-
applyExtraMargins)
215+
applyExtraMargins
216+
)
211217
}
212218
}
213219
}

widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/ContainerViewFactory.kt

+12-5
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ import dev.icerock.moko.widgets.core.style.view.MarginValues
1414
import dev.icerock.moko.widgets.core.style.view.PaddingValues
1515
import dev.icerock.moko.widgets.core.style.view.WidgetSize
1616
import dev.icerock.moko.widgets.core.utils.Edges
17-
import dev.icerock.moko.widgets.core.utils.UIViewWithIdentifier
1817
import dev.icerock.moko.widgets.core.utils.applyBackgroundIfNeeded
1918
import dev.icerock.moko.widgets.core.utils.applySizeToChild
20-
import dev.icerock.moko.widgets.core.utils.identifier
2119
import dev.icerock.moko.widgets.core.widget.ContainerWidget
20+
import kotlinx.cinterop.ExportObjCClass
21+
import kotlinx.cinterop.readValue
2222
import platform.CoreGraphics.CGFloat
23+
import platform.CoreGraphics.CGRectZero
24+
import platform.UIKit.UIView
2325
import platform.UIKit.UIViewController
2426
import platform.UIKit.addSubview
2527
import platform.UIKit.bottomAnchor
@@ -30,6 +32,9 @@ import platform.UIKit.topAnchor
3032
import platform.UIKit.trailingAnchor
3133
import platform.UIKit.translatesAutoresizingMaskIntoConstraints
3234

35+
@ExportObjCClass
36+
private class ContainerView : UIView(frame = CGRectZero.readValue())
37+
3338
actual class ContainerViewFactory actual constructor(
3439
private val padding: PaddingValues?,
3540
private val margins: MarginValues?,
@@ -43,11 +48,9 @@ actual class ContainerViewFactory actual constructor(
4348
): ViewBundle<WS> {
4449
val viewController: UIViewController = viewFactoryContext
4550

46-
val root = UIViewWithIdentifier().apply {
51+
val root = ContainerView().apply {
4752
translatesAutoresizingMaskIntoConstraints = false
4853
applyBackgroundIfNeeded(background)
49-
50-
accessibilityIdentifier = widget.identifier()
5154
}
5255

5356
widget.children.forEach { (childWidget, childAlignment) ->
@@ -73,6 +76,7 @@ actual class ContainerViewFactory actual constructor(
7376
childView.centerYAnchor.constraintEqualToAnchor(root.centerYAnchor).active =
7477
true
7578
}
79+
7680
Alignment.LEFT -> {
7781
childView.leadingAnchor.constraintEqualToAnchor(
7882
anchor = root.leadingAnchor,
@@ -81,6 +85,7 @@ actual class ContainerViewFactory actual constructor(
8185
childView.centerYAnchor.constraintEqualToAnchor(root.centerYAnchor).active =
8286
true
8387
}
88+
8489
Alignment.RIGHT -> {
8590
childView.trailingAnchor.constraintEqualToAnchor(
8691
anchor = root.trailingAnchor,
@@ -89,6 +94,7 @@ actual class ContainerViewFactory actual constructor(
8994
childView.centerYAnchor.constraintEqualToAnchor(root.centerYAnchor).active =
9095
true
9196
}
97+
9298
Alignment.TOP -> {
9399
childView.topAnchor.constraintEqualToAnchor(
94100
anchor = root.topAnchor,
@@ -97,6 +103,7 @@ actual class ContainerViewFactory actual constructor(
97103
childView.centerXAnchor.constraintEqualToAnchor(root.centerXAnchor).active =
98104
true
99105
}
106+
100107
Alignment.BOTTOM -> {
101108
childView.bottomAnchor.constraintEqualToAnchor(
102109
anchor = root.bottomAnchor,

widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/LinearViewFactory.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import dev.icerock.moko.widgets.core.utils.Edges
1919
import dev.icerock.moko.widgets.core.utils.applyBackgroundIfNeeded
2020
import dev.icerock.moko.widgets.core.utils.applySize
2121
import dev.icerock.moko.widgets.core.widget.LinearWidget
22+
import kotlinx.cinterop.ExportObjCClass
2223
import kotlinx.cinterop.readValue
2324
import platform.CoreGraphics.CGFloat
2425
import platform.CoreGraphics.CGRectZero
@@ -36,6 +37,9 @@ import platform.UIKit.trailingAnchor
3637
import platform.UIKit.translatesAutoresizingMaskIntoConstraints
3738
import platform.UIKit.widthAnchor
3839

40+
@ExportObjCClass
41+
private class LinearViewContainer : UIView(frame = CGRectZero.readValue())
42+
3943
actual class LinearViewFactory actual constructor(
4044
private val padding: PaddingValues?,
4145
private val margins: MarginValues?,
@@ -49,7 +53,7 @@ actual class LinearViewFactory actual constructor(
4953
): ViewBundle<WS> {
5054
val viewController: UIViewController = viewFactoryContext
5155

52-
val container = UIView(frame = CGRectZero.readValue()).apply {
56+
val container = LinearViewContainer().apply {
5357
translatesAutoresizingMaskIntoConstraints = false
5458
applyBackgroundIfNeeded(background)
5559
}
@@ -61,6 +65,7 @@ actual class LinearViewFactory actual constructor(
6165
viewController = viewController,
6266
size = size
6367
)
68+
6469
Orientation.VERTICAL -> layoutVertical(
6570
root = container,
6671
children = widget.children,

widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/MultilineInputViewFactory.kt

+5-9
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@ import dev.icerock.moko.widgets.core.style.view.TextStyle
2121
import dev.icerock.moko.widgets.core.style.view.WidgetSize
2222
import dev.icerock.moko.widgets.core.utils.applyBackgroundIfNeeded
2323
import dev.icerock.moko.widgets.core.utils.applyTextStyleIfNeeded
24-
import dev.icerock.moko.widgets.core.utils.bind
24+
import dev.icerock.moko.widgets.core.utils.setAssociatedObject
2525
import dev.icerock.moko.widgets.core.widget.InputWidget
2626
import kotlinx.cinterop.ObjCAction
27-
import kotlinx.cinterop.cstr
2827
import kotlinx.cinterop.readValue
2928
import platform.CoreGraphics.CGRectZero
3029
import platform.Foundation.NSNotification
@@ -42,8 +41,6 @@ import platform.UIKit.UITextViewTextDidEndEditingNotification
4241
import platform.UIKit.clipsToBounds
4342
import platform.UIKit.translatesAutoresizingMaskIntoConstraints
4443
import platform.darwin.NSObject
45-
import platform.objc.OBJC_ASSOCIATION_RETAIN_NONATOMIC
46-
import platform.objc.objc_setAssociatedObject
4744

4845
actual class MultilineInputViewFactory actual constructor(
4946
private val background: Background<Fill.Solid>?,
@@ -138,11 +135,10 @@ actual class MultilineInputViewFactory actual constructor(
138135
}
139136
}
140137

141-
objc_setAssociatedObject(
142-
`object` = textView,
143-
key = "textViewObserver".cstr,
144-
value = observer,
145-
policy = OBJC_ASSOCIATION_RETAIN_NONATOMIC
138+
setAssociatedObject(
139+
obj = textView,
140+
key = "textViewObserver",
141+
target = observer
146142
)
147143

148144
return ViewBundle(

widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/StatefulViewFactory.kt

+15-13
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import dev.icerock.moko.mvvm.ResourceState
88
import dev.icerock.moko.widgets.core.ViewBundle
99
import dev.icerock.moko.widgets.core.ViewFactory
1010
import dev.icerock.moko.widgets.core.ViewFactoryContext
11+
import dev.icerock.moko.widgets.core.Widget
1112
import dev.icerock.moko.widgets.core.style.background.Background
1213
import dev.icerock.moko.widgets.core.style.background.Fill
1314
import dev.icerock.moko.widgets.core.style.view.MarginValues
@@ -18,6 +19,7 @@ import dev.icerock.moko.widgets.core.utils.applyBackgroundIfNeeded
1819
import dev.icerock.moko.widgets.core.utils.applySizeToChild
1920
import dev.icerock.moko.widgets.core.utils.fillChildView
2021
import dev.icerock.moko.widgets.core.widget.StatefulWidget
22+
import kotlinx.cinterop.ExportObjCClass
2123
import kotlinx.cinterop.readValue
2224
import platform.CoreGraphics.CGFloat
2325
import platform.CoreGraphics.CGRectZero
@@ -27,6 +29,9 @@ import platform.UIKit.addSubview
2729
import platform.UIKit.hidden
2830
import platform.UIKit.translatesAutoresizingMaskIntoConstraints
2931

32+
@ExportObjCClass
33+
private class StatefulViewContainer : UIView(frame = CGRectZero.readValue())
34+
3035
actual class StatefulViewFactory actual constructor(
3136
private val margins: MarginValues?,
3237
private val padding: PaddingValues?,
@@ -40,18 +45,20 @@ actual class StatefulViewFactory actual constructor(
4045
): ViewBundle<WS> {
4146
val viewController: UIViewController = viewFactoryContext
4247

43-
val container = UIView(frame = CGRectZero.readValue()).apply {
48+
val container = StatefulViewContainer().apply {
4449
translatesAutoresizingMaskIntoConstraints = false
4550

4651
applyBackgroundIfNeeded(background)
4752
}
4853

49-
listOf(
50-
widget.dataWidget,
51-
widget.emptyWidget,
52-
widget.loadingWidget,
53-
widget.errorWidget
54-
).forEach { childWidget ->
54+
val widgetStateMap: Map<Widget<*>, (ResourceState<*, *>) -> Boolean> = mapOf(
55+
widget.dataWidget to { it is ResourceState.Success },
56+
widget.emptyWidget to { it is ResourceState.Empty },
57+
widget.loadingWidget to { it is ResourceState.Loading },
58+
widget.errorWidget to { it is ResourceState.Failed }
59+
)
60+
61+
widgetStateMap.forEach { (childWidget, isRelatedState) ->
5562
val childViewBundle = childWidget.buildView(viewController)
5663
val childView = childViewBundle.view
5764
childView.translatesAutoresizingMaskIntoConstraints = false
@@ -72,12 +79,7 @@ actual class StatefulViewFactory actual constructor(
7279
}
7380

7481
fun updateState(state: ResourceState<*, *>) {
75-
childView.hidden = when (state) {
76-
is ResourceState.Success -> childWidget == widget.dataWidget
77-
is ResourceState.Empty -> childWidget == widget.emptyWidget
78-
is ResourceState.Failed -> childWidget == widget.errorWidget
79-
is ResourceState.Loading -> childWidget == widget.loadingWidget
80-
}.not()
82+
childView.hidden = isRelatedState(state).not()
8183
}
8284

8385
updateState(widget.state.value)

0 commit comments

Comments
 (0)