changeset 2428:9c5b95d66fc8

iOS: Make spin buttons actually function. Fix layout and autosizing issues.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 05 Apr 2021 00:12:20 +0000
parents 4f078d24fe83
children 89f4aba2e387
files ios/dw.m
diffstat 1 files changed, 32 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/ios/dw.m	Sun Apr 04 22:24:13 2021 +0000
+++ b/ios/dw.m	Mon Apr 05 00:12:20 2021 +0000
@@ -2186,7 +2186,7 @@
 -(void)setUserdata:(void *)input;
 -(UITextField *)textfield;
 -(UIStepper *)stepper;
--(void)controlTextDidChange:(NSNotification *)aNotification;
+-(void)textFieldDidEndEditing:(UITextField *)textField;
 -(void)setClickDefault:(id)input;
 @end
 
@@ -2205,6 +2205,7 @@
         [stepper setTextfield:textfield];
         [textfield setText:[NSString stringWithFormat:@"%ld",(long)[stepper value]]];
         [textfield setDelegate:self];
+        [stepper addTarget:self action:@selector(stepperChanged:) forControlEvents:UIControlEventValueChanged];
     }
     return self;
 }
@@ -2212,11 +2213,16 @@
 -(void)setUserdata:(void *)input { userdata = input; }
 -(UITextField *)textfield { return textfield; }
 -(UIStepper *)stepper { return stepper; }
--(void)controlTextDidChange:(NSNotification *)aNotification
+-(void)textFieldDidEndEditing:(UITextField *)textField
 {
     long val = [[textfield text] intValue];
     [stepper setValue:(float)val];
-    _dw_event_handler(self, DW_INT_TO_POINTER(val), 14);
+    [textfield setText:[NSString stringWithFormat:@"%d", (int)[stepper value]]];
+    _dw_event_handler(self, DW_INT_TO_POINTER((int)[stepper value]), 14);
+}
+-(void)stepperChanged:(UIStepper*)theStepper
+{
+    [textfield setText:[NSString stringWithFormat:@"%d", (int)[theStepper value]]];
 }
 -(void)setClickDefault:(id)input { clickDefault = input; }
 -(void)dealloc { UserData *root = userdata; _dw_remove_userdata(&root, NULL, TRUE); dw_signal_disconnect_by_window(self); [super dealloc]; }
@@ -2643,8 +2649,9 @@
                     DWSpinButton *spinbutton = (DWSpinButton *)handle;
                     UITextField *textfield = [spinbutton textfield];
                     UIStepper *stepper = [spinbutton stepper];
-                    [textfield setFrame:CGRectMake(0,0,rect.size.width-20,rect.size.height)];
-                    [stepper setFrame:CGRectMake(rect.size.width-20,0,20,rect.size.height)];
+                    NSInteger stepperwidth = [stepper intrinsicContentSize].width;
+                    [textfield setFrame:CGRectMake(0,0,rect.size.width-stepperwidth,rect.size.height)];
+                    [stepper setFrame:CGRectMake(rect.size.width-stepperwidth,0,stepperwidth,rect.size.height)];
                 }
                 else if([handle isMemberOfClass:[DWSplitBar class]])
                 {
@@ -3205,9 +3212,9 @@
     id object = _dw_text_handle(handle);
 
     /* Handle all the different button types */
-    if([ object isMemberOfClass:[ DWButton class ] ])
-    {
-        UIImage *image = (UIImage *)[object imageForState:UIControlStateNormal];
+    if([handle isMemberOfClass:[DWButton class]])
+    {
+        UIImage *image = [handle imageForState:UIControlStateNormal];
 
         if(image)
         {
@@ -3218,7 +3225,7 @@
             thisheight = (int)size.height + 1;
         }
         /* Text button */
-        nsstr = [[object titleLabel] text];
+        nsstr = [[handle titleLabel] text];
 
         if(nsstr && [nsstr length] > 0)
         {
@@ -3233,33 +3240,32 @@
         }
     }
     /* If the control is an entryfield set width to 150 */
-    else if([object isKindOfClass:[ UITextField class ]])
+    else if([object isKindOfClass:[UITextField class]])
     {
         UIFont *font = [object font];
 
         if([object isEditable])
         {
             /* Spinbuttons don't need to be as wide */
-            if([object isMemberOfClass:[ DWSpinButton class]])
-                thiswidth = 50;
+            if([handle isMemberOfClass:[DWSpinButton class]])
+                thiswidth = 100;
             else
                 thiswidth = 150;
         }
-        else
-            nsstr = [object text];
+        nsstr = [object text];
 
         if(font)
             thisheight = (int)[font lineHeight];
     }
     /* Handle the ranged widgets */
-    else if([ object isMemberOfClass:[DWPercent class] ] ||
-            [ object isMemberOfClass:[DWSlider class] ])
+    else if([object isMemberOfClass:[DWPercent class]] ||
+            [object isMemberOfClass:[DWSlider class]])
     {
         thiswidth = 100;
-        thisheight = 20;
+        thisheight = 25;
     }
     /* Handle bitmap size */
-    else if([ object isMemberOfClass:[UIImageView class] ])
+    else if([object isMemberOfClass:[UIImageView class]])
     {
         UIImage *image = (UIImage *)[object image];
 
@@ -3271,7 +3277,7 @@
         }
     }
     /* Handle calendar */
-    else if([ object isMemberOfClass:[DWCalendar class] ])
+    else if([object isMemberOfClass:[DWCalendar class]])
     {
             CGSize size = [object intrinsicContentSize];
 
@@ -3279,12 +3285,12 @@
             thisheight = size.height;
     }
     /* MLE and Container */
-    else if([ object isMemberOfClass:[DWMLE class] ] ||
-            [ object isMemberOfClass:[DWContainer class] ])
+    else if([object isMemberOfClass:[DWMLE class]] ||
+            [object isMemberOfClass:[DWContainer class]])
     {
         CGSize size;
 
-        if([ object isMemberOfClass:[DWMLE class] ])
+        if([object isMemberOfClass:[DWMLE class]])
             size = [object contentSize];
         else
             size = [object getsize];
@@ -3301,14 +3307,16 @@
         if(thisheight > _DW_SCROLLED_MAX_HEIGHT)
             thisheight = _DW_SCROLLED_MAX_HEIGHT;
     }
-    else if([ object isKindOfClass:[UILabel class] ])
+    else if([object isKindOfClass:[UILabel class]])
     {
         nsstr = [object text];
         extrawidth = extraheight = 2;
     }
+#ifdef DW_INCLUDE_DEPRECATED
     /* Any other control type */
-    else if([ object isKindOfClass:[ UIControl class ] ])
+    else if([object isKindOfClass:[UIControl class]])
         nsstr = [object text];
+#endif
 
     /* If we have a string...
      * calculate the size with the current font.
@@ -3325,12 +3333,6 @@
             thiswidth = textwidth;
     }
 
-    /* Handle static text fields */
-    if([object isKindOfClass:[ UITextField class ]] && ![object isEditable])
-    {
-        extrawidth = 10;
-    }
-
     /* Set the requested sizes */
     if(width)
         *width = thiswidth + extrawidth;