# Path to `self`
var path: String
+ # Compiler flags for this source file
+ var cflags: String = "" is writable
+
# UUID for build elements
private var build_uuid: String = sys.pbx_uuid_generator.next_uuid is lazy
end
# PBX description of this file
- private fun description: Writable do return """
+ private fun description: Writable
+ do
+ var extra = ""
+ var cflags = cflags
+ if not cflags.is_empty then extra = "\nsettings = \{COMPILER_FLAGS = \"{cflags}\"; \};"
+
+ return """
{{{ref_uuid}}} /* {{{doc}}} */ = {
isa = PBXFileReference;
fileEncoding = 4;
lastKnownFileType = {{{file_type}}};
- path = {{{path}}};
- sourceTree = "<group>";
+ path = '{{{path}}}';
+ sourceTree = "<group>";{{{extra}}}
};
"""
+ end
private fun add_to_project(project: PbxprojectTemplate)
do
# Name of the project
var name: String
+ # OTHER_CFLAGS
+ var cflags = "" is writable
+
# All body/implementation source files to be compiled
private var source_files = new Array[PbxFile]
"""
add """
+ 0F4688411FDF8748004F34D4 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 0F4688401FDF8748004F34D4 /* assets */; };
+ 0FDD07A21C6F8E0E006FF70E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0FDD07A11C6F8E0E006FF70E /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
-/* Begin PBXContainerItemProxy section */
- AF9F83EA1A5F0D21004B62C0 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = AF9F83C41A5F0D21004B62C0 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AF9F83CB1A5F0D21004B62C0;
- remoteInfo = {{{name}}};
- };
-/* End PBXContainerItemProxy section */
-
/* Begin PBXFileReference section */
/* Static generated files */
AF9F83CC1A5F0D21004B62C0 /* {{{name}}}.app */ = {
for file in files do add file.description
add """
+ 0F4688401FDF8748004F34D4 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = assets; path = {{{name}}}/assets; sourceTree = SOURCE_ROOT; };
+ 0FDD07A11C6F8E0E006FF70E /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
children = (
AF9F83CE1A5F0D21004B62C0 /* {{{name}}} */,
AF9F83CD1A5F0D21004B62C0 /* Products */,
+ 0FDD07A11C6F8E0E006FF70E /* LaunchScreen.storyboard */,
);
sourceTree = "<group>";
};
AF9F83CE1A5F0D21004B62C0 /* {{{name}}} */ = {
isa = PBXGroup;
children = (
+ 0F4688401FDF8748004F34D4 /* assets */,
"""
# Reference all known files
for file in files do add """
path = {{{name}}};
sourceTree = "<group>";
};
- AF9F83CF1A5F0D21004B62C0 /* Supporting Files */ = {
- isa = PBXGroup;
- children = (
- AF9F83D01A5F0D21004B62C0 /* Info.plist */,
- AF9F83D11A5F0D21004B62C0 /* main.m */,
- );
- name = "Supporting Files";
- sourceTree = "<group>";
- };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
"""
add """
+ 0FDD07A21C6F8E0E006FF70E /* LaunchScreen.storyboard in Resources */,
+ 0F4688411FDF8748004F34D4 /* assets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
};
/* End PBXSourcesBuildPhase section */
-/* Begin PBXVariantGroup section */
- AF9F83DD1A5F0D21004B62C0 /* Main.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- AF9F83DE1A5F0D21004B62C0 /* Base */,
- );
- name = Main.storyboard;
- sourceTree = "<group>";
- };
- AF9F83E21A5F0D21004B62C0 /* LaunchScreen.xib */ = {
- isa = PBXVariantGroup;
- children = (
- AF9F83E31A5F0D21004B62C0 /* Base */,
- );
- name = LaunchScreen.xib;
- sourceTree = "<group>";
- };
-/* End PBXVariantGroup section */
-
/* Begin XCBuildConfiguration section */
AF9F83F11A5F0D21004B62C0 /* Debug */ = {
isa = XCBuildConfiguration;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = {{{name}}}/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ OTHER_CFLAGS = "{{{cflags.escape_to_c}}}";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = {{{name}}}/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ OTHER_CFLAGS = "{{{cflags.escape_to_c}}}";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
<key>CFBundleShortVersionString</key>
<string>{{{short_version}}}</string>
<key>CFBundleSignature</key>
- <string>\\?\\?\\?\\?</string>
+ <string>????</string>
<key>CFBundleVersion</key>
<string>{{{bundle_version}}}</string>
<key>LSRequiresIPhoneOS</key>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
+ <key>UILaunchStoryboardName</key>
+ <string>LaunchScreen</string>
+
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
"""
end
end
+
+# Template for the loading screen to generate `LaunchScreen.storyboard`
+class LaunchScreenStoryboardTemplate
+ super Template
+
+ # Large text to show in the center of the loading screen
+ var title = "" is writable
+
+ # Text to show at the bottom of the loading screen
+ var subtitle = "" is writable
+
+ # TODO make this more customizable by moving the subviews block as an attribute
+ # or by allowing to pass a custom file from the ` res/` folder.
+
+ redef fun rendering
+ do
+ add """
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9531" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
+ <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="EHf-IW-A2E">
+ <objects>
+ <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+ <layoutGuides>
+ <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
+ <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
+ </layoutGuides>
+ <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+ <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="{{{subtitle}}}" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="obG-Y5-kRd">
+ <rect key="frame" x="20" y="559" width="560" height="21"/>
+ <fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="{{{title}}}" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="GJd-Yh-RWb">
+ <rect key="frame" x="20" y="176" width="560" height="43"/>
+ <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
+ <color key="textColor" red="0.0" green="0.5" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="centerX" secondItem="obG-Y5-kRd" secondAttribute="centerX" id="5cz-MP-9tL"/>
+ <constraint firstAttribute="centerX" secondItem="GJd-Yh-RWb" secondAttribute="centerX" id="Q3B-4B-g5h"/>
+ <constraint firstItem="obG-Y5-kRd" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" constant="20" symbolic="YES" id="SfN-ll-jLj"/>
+ <constraint firstAttribute="bottom" secondItem="obG-Y5-kRd" secondAttribute="bottom" constant="20" id="Y44-ml-fuU"/>
+ <constraint firstItem="GJd-Yh-RWb" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="bottom" multiplier="1/3" constant="1" id="moa-c2-u7t"/>
+ <constraint firstItem="GJd-Yh-RWb" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" constant="20" symbolic="YES" id="x7j-FC-K8j"/>
+ </constraints>
+ </view>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="53" y="375"/>
+ </scene>
+ </scenes>
+</document>"""
+ end
+end