diff --git a/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj b/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj index cd1a4684fa7e033975fc10fcbcd64d1eff51ca10..9947de4cdedf6a5b9299e5b48e0b7187751db611 100644 --- a/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj +++ b/contrib/mobile/iOS/Onelab.xcodeproj/project.pbxproj @@ -27,6 +27,9 @@ 9C96089D1712C7F600E1D4A0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C96089C1712C7F600E1D4A0 /* QuartzCore.framework */; }; 9C96089F1712C8EB00E1D4A0 /* emulatorFix.c in Sources */ = {isa = PBXBuildFile; fileRef = 9C96089E1712C8EB00E1D4A0 /* emulatorFix.c */; }; 9C9608AC1712EF0900E1D4A0 /* iPadStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9C9608AA1712EF0900E1D4A0 /* iPadStoryboard.storyboard */; }; + 9CB1CD9818DB2D8700110882 /* icon_rotate.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CB1CD9618DB2D8700110882 /* icon_rotate.png */; }; + 9CB1CD9B18DC36AC00110882 /* AboutViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9CB1CD9A18DC36AC00110882 /* AboutViewController.mm */; }; + 9CB1CD9D18DC57DE00110882 /* icon_translate.png in Resources */ = {isa = PBXBuildFile; fileRef = 9CB1CD9C18DC57DE00110882 /* icon_translate.png */; }; 9CC6EBB717BA0A38001CA21A /* drawGeom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9CC6EBB617BA0A38001CA21A /* drawGeom.cpp */; }; 9CC6EBB917BA1CC7001CA21A /* drawMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9CC6EBB817BA1CC7001CA21A /* drawMesh.cpp */; }; 9CC85C021790286C00F241C4 /* files in Resources */ = {isa = PBXBuildFile; fileRef = 9CC85C011790286C00F241C4 /* files */; }; @@ -76,6 +79,10 @@ 9C96089E1712C8EB00E1D4A0 /* emulatorFix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = emulatorFix.c; sourceTree = "<group>"; usesTabs = 1; }; 9C9608AB1712EF0900E1D4A0 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/iPadStoryboard.storyboard; sourceTree = "<group>"; }; 9C99754C17390DEE0036EC24 /* iosGModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iosGModel.h; sourceTree = "<group>"; usesTabs = 1; }; + 9CB1CD9618DB2D8700110882 /* icon_rotate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_rotate.png; sourceTree = "<group>"; }; + 9CB1CD9918DC36AC00110882 /* AboutViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AboutViewController.h; sourceTree = "<group>"; }; + 9CB1CD9A18DC36AC00110882 /* AboutViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AboutViewController.mm; sourceTree = "<group>"; }; + 9CB1CD9C18DC57DE00110882 /* icon_translate.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_translate.png; sourceTree = "<group>"; }; 9CC6EBB617BA0A38001CA21A /* drawGeom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = drawGeom.cpp; sourceTree = "<group>"; usesTabs = 1; }; 9CC6EBB817BA1CC7001CA21A /* drawMesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = drawMesh.cpp; sourceTree = "<group>"; }; 9CC85C011790286C00F241C4 /* files */ = {isa = PBXFileReference; lastKnownFileType = folder; path = files; sourceTree = "<group>"; }; @@ -132,6 +139,8 @@ 9C928621180D216500AAABD4 /* icons */ = { isa = PBXGroup; children = ( + 9CB1CD9C18DC57DE00110882 /* icon_translate.png */, + 9CB1CD9618DB2D8700110882 /* icon_rotate.png */, 9C928624180D217A00AAABD4 /* icon_app_ipad_retina.png */, 9C928625180D217A00AAABD4 /* icon_app_ipad.png */, 9C928628180D217B00AAABD4 /* icon_app_iphone_retina.png */, @@ -204,6 +213,8 @@ 9CE18C1F17B27EDB009BA06E /* Parameter.mm */, 9CEAECC517A91CD20014D229 /* ModelListController.h */, 9CEAECC617A91CD20014D229 /* ModelListController.mm */, + 9CB1CD9918DC36AC00110882 /* AboutViewController.h */, + 9CB1CD9A18DC36AC00110882 /* AboutViewController.mm */, 9CEAE87B17AFD5BB00813524 /* SplitViewController.h */, 9CEAE87C17AFD5BB00813524 /* SplitViewController.mm */, 9C96084F1712C16400E1D4A0 /* ParametersViewController.h */, @@ -289,7 +300,9 @@ buildActionMask = 2147483647; files = ( 9C9608AC1712EF0900E1D4A0 /* iPadStoryboard.storyboard in Resources */, + 9CB1CD9818DB2D8700110882 /* icon_rotate.png in Resources */, 9CC85C021790286C00F241C4 /* files in Resources */, + 9CB1CD9D18DC57DE00110882 /* icon_translate.png in Resources */, 9C92862F180D217B00AAABD4 /* icon_app_iphone_retina.png in Resources */, 9C92862C180D217B00AAABD4 /* icon_app_ipad.png in Resources */, 9CE1A65A17B0FB9700E5152F /* iPhoneiPodStoryboard.storyboard in Resources */, @@ -310,6 +323,7 @@ 9C9608511712C16400E1D4A0 /* ParametersViewController.mm in Sources */, 9C9608541712C16400E1D4A0 /* ModelViewController.mm in Sources */, 9C9608741712C47200E1D4A0 /* EAGLView.mm in Sources */, + 9CB1CD9B18DC36AC00110882 /* AboutViewController.mm in Sources */, 9C96089F1712C8EB00E1D4A0 /* emulatorFix.c in Sources */, 9C95B7F61726C88E00C0CCE2 /* main.mm in Sources */, 9C6A645817A7C3DB00DEDAFC /* drawString.cpp in Sources */, diff --git a/contrib/mobile/iOS/Onelab/EAGLView.mm b/contrib/mobile/iOS/Onelab/EAGLView.mm index 14a0ee9d1272075d61c3d60397bd1117eb8c762d..606e78847215542111cf2421bb1efa2bf6a1b7d0 100644 --- a/contrib/mobile/iOS/Onelab/EAGLView.mm +++ b/contrib/mobile/iOS/Onelab/EAGLView.mm @@ -85,22 +85,11 @@ NSUInteger ntouch = [[event allTouches] count]; UITouch* touch = [touches anyObject]; CGPoint position = [touch locationInView:self]; - switch(ntouch) - { - case 1: - { - mContext->eventHandler(1,position.x,position.y); - } - break; - case 3: - { - rotate = true; - mContext->eventHandler(3,position.x,position.y); - } - break; - default: - return ; - } + if(ntouch != 1) return; + if(rotate) + mContext->eventHandler(3,position.x,position.y); + else + mContext->eventHandler(1,position.x,position.y); [self drawView]; } diff --git a/contrib/mobile/iOS/Onelab/ModelListController.mm b/contrib/mobile/iOS/Onelab/ModelListController.mm index a387d6e5b86df77b06812fbe47b303bde777b510..95b5e50493aa8b2758218d5f4117475e639465c8 100644 --- a/contrib/mobile/iOS/Onelab/ModelListController.mm +++ b/contrib/mobile/iOS/Onelab/ModelListController.mm @@ -37,6 +37,14 @@ } } } + + UIBarButtonItem *about = [[UIBarButtonItem alloc] initWithTitle:@"About" style:UIBarButtonItemStyleBordered target:self action:@selector(showAbout)]; + [self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects: about, nil]]; +} + +-(void)showAbout +{ + [self performSegueWithIdentifier:@"showAboutSegue" sender:self]; } -(void)refreshList diff --git a/contrib/mobile/iOS/Onelab/ModelViewController.h b/contrib/mobile/iOS/Onelab/ModelViewController.h index 9c5d307e1ec252f19040f95e1973db8380c5f690..16eb121bdeba6835edc32045d54b6d12192c10ab 100644 --- a/contrib/mobile/iOS/Onelab/ModelViewController.h +++ b/contrib/mobile/iOS/Onelab/ModelViewController.h @@ -41,4 +41,6 @@ @property (nonatomic, retain) NSString *initialModel; +- (IBAction)startRotation:(UIButton *)sender; + @end diff --git a/contrib/mobile/iOS/Onelab/ModelViewController.mm b/contrib/mobile/iOS/Onelab/ModelViewController.mm index f73c148d714f83bb0971ea8372bee5295045f900..da88a78644b8c2b5f3a870dac8e37ba40dc0ff90 100644 --- a/contrib/mobile/iOS/Onelab/ModelViewController.mm +++ b/contrib/mobile/iOS/Onelab/ModelViewController.mm @@ -99,7 +99,7 @@ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(requestRender) name:@"requestRender" object:nil]; _runStopButton = [[UIBarButtonItem alloc] initWithTitle:@"Run" style:UIBarButtonItemStyleBordered target:self action:@selector(compute)]; - UIBarButtonItem *share = [[UIBarButtonItem alloc] initWithTitle:@"Share" style:UIBarButtonItemStyleBordered target:self action:@selector(share)]; + //UIBarButtonItem *share = [[UIBarButtonItem alloc] initWithTitle:@"Share" style:UIBarButtonItemStyleBordered target:self action:@selector(share)]; if([[UIDevice currentDevice].model isEqualToString:@"iPad"] || [[UIDevice currentDevice].model isEqualToString:@"iPad Simulator"]){ UIBarButtonItem *model = [[UIBarButtonItem alloc] initWithTitle:@"Model list" style:UIBarButtonItemStyleBordered target:self action:@selector(showModelsList)]; [self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:_runStopButton, model, /*share,*/ nil]]; @@ -218,7 +218,7 @@ -(void)prevAnimation { animation_prev(); [self requestRender]; } -(IBAction)pinch:(UIPinchGestureRecognizer *)sender { - if(!glView->rotate && [sender numberOfTouches] <= 2) { + if(!glView->rotate && [sender numberOfTouches] != 1) { float mScale = scaleFactor; if (sender.state == UIGestureRecognizerStateBegan) mScale = scaleFactor; @@ -254,7 +254,6 @@ UITouch *touch = [[event allTouches] anyObject]; CGPoint touchPoint = [touch locationInView:self.view]; glView->mContext->eventHandler(4, touchPoint.x, touchPoint.y); - glView->rotate = false; } - (IBAction)singleTap:(UITapGestureRecognizer *)sender { @@ -412,4 +411,11 @@ void getBitmap(void *self, const char *text, int textsize, unsigned char **map, *(*map+byteIndex/4) = rawData[byteIndex + 3]; free(rawData); } +- (IBAction)startRotation:(UIButton *)sender { + glView->rotate = !glView->rotate; + if(glView->rotate) + [sender setImage:[UIImage imageNamed:@"icon_translate.png"] forState:UIControlStateNormal]; + else + [sender setImage:[UIImage imageNamed:@"icon_rotate.png"] forState:UIControlStateNormal]; +} @end diff --git a/contrib/mobile/iOS/Onelab/Onelab-Info.plist b/contrib/mobile/iOS/Onelab/Onelab-Info.plist index 4a16e045277c9fbaf368dd3a8c71f4c13df269a2..3677b436e5c1dce5ea3b31d39e9a8715d6212e32 100644 --- a/contrib/mobile/iOS/Onelab/Onelab-Info.plist +++ b/contrib/mobile/iOS/Onelab/Onelab-Info.plist @@ -2,23 +2,6 @@ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> - <key>CFBundleDevelopmentRegion</key> - <string>en</string> - <key>CFBundleDisplayName</key> - <string>${PRODUCT_NAME}</string> - <key>CFBundleDocumentTypes</key> - <array> - <dict> - <key>CFBundleTypeExtensions</key> - <array> - <string>onelab</string> - </array> - <key>CFBundleTypeName</key> - <string>Onelab package</string> - <key>LSTypeIsPackage</key> - <true/> - </dict> - </array> <key>CFBundleExecutable</key> <string>${EXECUTABLE_NAME}</string> <key>CFBundleIcons</key> diff --git a/contrib/mobile/iOS/Onelab/en.lproj/iPadStoryboard.storyboard b/contrib/mobile/iOS/Onelab/en.lproj/iPadStoryboard.storyboard index 4581de2000a2d7968e501f56f5d75f3370085221..aeb1720540b7e63e93d80b74e106606cd17b56ca 100644 --- a/contrib/mobile/iOS/Onelab/en.lproj/iPadStoryboard.storyboard +++ b/contrib/mobile/iOS/Onelab/en.lproj/iPadStoryboard.storyboard @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="dwa-Pq-2vA"> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5053" systemVersion="13C64" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="dwa-Pq-2vA"> <dependencies> - <deployment defaultVersion="1536" identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/> + <deployment defaultVersion="1792" identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/> </dependencies> <scenes> <!--Navigation Controller--> @@ -46,6 +46,16 @@ <rect key="frame" x="20" y="708" width="20" height="20"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> </activityIndicatorView> + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="right" contentVerticalAlignment="bottom" lineBreakMode="middleTruncation" id="GRU-nz-BNs"> + <rect key="frame" x="652" y="722" width="30" height="30"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> + <state key="normal" image="icon_rotate.png"> + <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> + </state> + <connections> + <action selector="startRotation:" destination="4" eventType="touchUpInside" id="Ufg-Lv-KVt"/> + </connections> + </button> </subviews> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/> @@ -307,9 +317,12 @@ <point key="canvasLocation" x="336" y="340"/> </scene> </scenes> + <resources> + <image name="icon_rotate.png" width="512" height="512"/> + </resources> <simulatedMetricsContainer key="defaultSimulatedMetrics"> <simulatedStatusBarMetrics key="statusBar"/> <simulatedOrientationMetrics key="orientation"/> <simulatedScreenMetrics key="destination"/> </simulatedMetricsContainer> -</document> \ No newline at end of file +</document> diff --git a/contrib/mobile/iOS/Onelab/en.lproj/iPhoneiPodStoryboard.storyboard b/contrib/mobile/iOS/Onelab/en.lproj/iPhoneiPodStoryboard.storyboard index 84217ff7c474a75f0e0462f11b8b0be9746698e1..f9b64bf5861ad559cf53583e685c89a51fb3e9df 100644 --- a/contrib/mobile/iOS/Onelab/en.lproj/iPhoneiPodStoryboard.storyboard +++ b/contrib/mobile/iOS/Onelab/en.lproj/iPhoneiPodStoryboard.storyboard @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch" variant="6xAndEarlier" propertyAccessControl="none" useAutolayout="YES" initialViewController="vAG-uz-hfU"> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="5053" systemVersion="13C64" targetRuntime="iOS.CocoaTouch" variant="6xAndEarlier" propertyAccessControl="none" useAutolayout="YES" initialViewController="vAG-uz-hfU"> <dependencies> - <deployment defaultVersion="1536" identifier="iOS"/> + <deployment defaultVersion="1792" identifier="iOS"/> <development version="4600" identifier="xcode"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/> </dependencies> <scenes> <!--Model List Controller - Model list--> @@ -55,16 +55,33 @@ <constraint firstAttribute="width" constant="20" id="f9c-ZY-6q4"/> </constraints> </activityIndicatorView> + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="l9e-j0-zky"> + <rect key="frame" x="270" y="464" width="30" height="30"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> + <constraints> + <constraint firstAttribute="height" constant="30" id="NdA-3S-xkw"/> + <constraint firstAttribute="width" constant="30" id="hcG-Wv-rkt"/> + </constraints> + <fontDescription key="fontDescription" type="system" pointSize="18"/> + <state key="normal" title=" " image="icon_rotate.png"> + <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> + </state> + <connections> + <action selector="startRotation:" destination="NyB-7w-cP0" eventType="touchUpInside" id="Uz9-hR-WIi"/> + </connections> + </button> </subviews> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> <gestureRecognizers/> <constraints> - <constraint firstAttribute="trailing" secondItem="yT7-IR-qUJ" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="02X-Hf-QoA"/> - <constraint firstAttribute="bottom" secondItem="yT7-IR-qUJ" secondAttribute="bottom" constant="20" symbolic="YES" type="default" id="4by-pW-cH0"/> - <constraint firstItem="Fuh-zG-zVR" firstAttribute="centerY" secondItem="yT7-IR-qUJ" secondAttribute="centerY" type="default" id="BLC-3x-kRj"/> - <constraint firstItem="Fuh-zG-zVR" firstAttribute="top" secondItem="yT7-IR-qUJ" secondAttribute="top" type="default" id="REs-y3-luE"/> + <constraint firstItem="yT7-IR-qUJ" firstAttribute="bottom" secondItem="Fuh-zG-zVR" secondAttribute="bottom" type="default" id="AP1-zU-goA"/> + <constraint firstAttribute="bottom" secondItem="Fuh-zG-zVR" secondAttribute="bottom" constant="20" symbolic="YES" type="default" id="J47-7T-QdC"/> + <constraint firstItem="l9e-j0-zky" firstAttribute="top" secondItem="Fuh-zG-zVR" secondAttribute="top" type="default" id="Wag-TJ-vx5"/> + <constraint firstAttribute="trailing" secondItem="yT7-IR-qUJ" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="g9K-qJ-W8Q"/> + <constraint firstItem="l9e-j0-zky" firstAttribute="trailing" secondItem="yT7-IR-qUJ" secondAttribute="trailing" type="default" id="il1-8K-evV"/> <constraint firstItem="yT7-IR-qUJ" firstAttribute="leading" secondItem="Fuh-zG-zVR" secondAttribute="trailing" constant="8" symbolic="YES" type="default" id="oc4-6x-CF7"/> <constraint firstItem="Fuh-zG-zVR" firstAttribute="leading" secondItem="zrj-Dd-WPc" secondAttribute="leading" constant="20" symbolic="YES" type="default" id="qfh-y2-BuW"/> + <constraint firstItem="l9e-j0-zky" firstAttribute="top" secondItem="yT7-IR-qUJ" secondAttribute="top" type="default" id="wy0-ch-fl3"/> </constraints> <connections> <outletCollection property="gestureRecognizers" destination="7R3-zZ-cpa" appends="YES" id="K8X-lL-YUb"/> @@ -225,13 +242,13 @@ <textInputTraits key="textInputTraits"/> </textField> <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Raise (Z)" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Bfu-t9-dAj"> - <rect key="frame" x="-8" y="265" width="91" height="21"/> + <rect key="frame" x="-8" y="273" width="91" height="21"/> <fontDescription key="fontDescription" type="system" pointSize="17"/> <color key="textColor" cocoaTouchSystemColor="darkTextColor"/> <nil key="highlightedColor"/> </label> <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="-5" maxValue="5" translatesAutoresizingMaskIntoConstraints="NO" id="BC5-E7-rEF"> - <rect key="frame" x="89" y="264" width="185" height="23"/> + <rect key="frame" x="89" y="264" width="185" height="31"/> </slider> <pickerView contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xW0-cN-kxL"> <rect key="frame" x="0.0" y="0.0" width="292" height="216"/> @@ -292,9 +309,12 @@ <point key="canvasLocation" x="1596" y="160"/> </scene> </scenes> + <resources> + <image name="icon_rotate.png" width="512" height="512"/> + </resources> <simulatedMetricsContainer key="defaultSimulatedMetrics"> <simulatedStatusBarMetrics key="statusBar"/> <simulatedOrientationMetrics key="orientation"/> <simulatedScreenMetrics key="destination" type="retina4"/> </simulatedMetricsContainer> -</document> \ No newline at end of file +</document> diff --git a/contrib/mobile/iOS/Onelab/icon_rotate.png b/contrib/mobile/iOS/Onelab/icon_rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..0f0ec77d927c324994704e7064ac2125110060a3 Binary files /dev/null and b/contrib/mobile/iOS/Onelab/icon_rotate.png differ diff --git a/contrib/mobile/iOS/Onelab/icon_translate.png b/contrib/mobile/iOS/Onelab/icon_translate.png new file mode 100644 index 0000000000000000000000000000000000000000..2c43ceab43ff0d8214f7b41ba6e47b6566f55e36 Binary files /dev/null and b/contrib/mobile/iOS/Onelab/icon_translate.png differ