Merge branch 'feature/dev' into 'master'
Feature/dev See merge request !27
This commit is contained in:
		| @@ -4,7 +4,9 @@ | |||||||
|     <uses-permission android:name="android.permission.CAMERA" /> |     <uses-permission android:name="android.permission.CAMERA" /> | ||||||
|  |  | ||||||
|     <application> |     <application> | ||||||
|         <activity android:name="pub.doric.DoricActivity"> |         <activity | ||||||
|  |             android:name="pub.doric.DoricActivity" | ||||||
|  |             android:theme="@style/Theme.Design.Light.NoActionBar"> | ||||||
|             <intent-filter> |             <intent-filter> | ||||||
|                 <action android:name="android.intent.action.VIEW" /> |                 <action android:name="android.intent.action.VIEW" /> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ import java.util.HashMap; | |||||||
| import java.util.Map; | import java.util.Map; | ||||||
|  |  | ||||||
| import pub.doric.async.AsyncResult; | import pub.doric.async.AsyncResult; | ||||||
|  | import pub.doric.navbar.IDoricNavBar; | ||||||
| import pub.doric.navigator.IDoricNavigator; | import pub.doric.navigator.IDoricNavigator; | ||||||
| import pub.doric.plugin.DoricJavaPlugin; | import pub.doric.plugin.DoricJavaPlugin; | ||||||
| import pub.doric.shader.RootNode; | import pub.doric.shader.RootNode; | ||||||
| @@ -159,4 +160,14 @@ public class DoricContext { | |||||||
|     public IDoricNavigator getDoricNavigator() { |     public IDoricNavigator getDoricNavigator() { | ||||||
|         return this.doricNavigator; |         return this.doricNavigator; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private IDoricNavBar doricNavBar; | ||||||
|  |  | ||||||
|  |     public void setDoricNavBar(IDoricNavBar navBar) { | ||||||
|  |         this.doricNavBar = navBar; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public IDoricNavBar getDoricNavBar() { | ||||||
|  |         return this.doricNavBar; | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ import androidx.fragment.app.Fragment; | |||||||
|  |  | ||||||
| import pub.doric.async.AsyncResult; | import pub.doric.async.AsyncResult; | ||||||
| import pub.doric.loader.DoricJSLoaderManager; | import pub.doric.loader.DoricJSLoaderManager; | ||||||
|  | import pub.doric.navbar.BaseDoricNavBar; | ||||||
| import pub.doric.navigator.IDoricNavigator; | import pub.doric.navigator.IDoricNavigator; | ||||||
| import pub.doric.utils.DoricLog; | import pub.doric.utils.DoricLog; | ||||||
|  |  | ||||||
| @@ -36,6 +37,7 @@ import pub.doric.utils.DoricLog; | |||||||
|  */ |  */ | ||||||
| public class DoricPanelFragment extends Fragment { | public class DoricPanelFragment extends Fragment { | ||||||
|     private DoricPanel doricPanel; |     private DoricPanel doricPanel; | ||||||
|  |     private BaseDoricNavBar navBar; | ||||||
|  |  | ||||||
|     public static DoricPanelFragment newInstance(String scheme, String alias) { |     public static DoricPanelFragment newInstance(String scheme, String alias) { | ||||||
|         Bundle args = new Bundle(); |         Bundle args = new Bundle(); | ||||||
| @@ -48,14 +50,15 @@ public class DoricPanelFragment extends Fragment { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { |     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { | ||||||
|         doricPanel = (DoricPanel) inflater.inflate(R.layout.doric_framgent_panel, container, false); |         return inflater.inflate(R.layout.doric_framgent_panel, container, false); | ||||||
|         return doricPanel; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { |     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { | ||||||
|         super.onViewCreated(view, savedInstanceState); |         super.onViewCreated(view, savedInstanceState); | ||||||
|  |         doricPanel = view.findViewById(R.id.doric_panel); | ||||||
|  |         navBar = view.findViewById(R.id.doric_nav_bar); | ||||||
|         Bundle argument = getArguments(); |         Bundle argument = getArguments(); | ||||||
|         if (argument == null) { |         if (argument == null) { | ||||||
|             DoricLog.e("DoricPanelFragment argument is null"); |             DoricLog.e("DoricPanelFragment argument is null"); | ||||||
| @@ -72,6 +75,7 @@ public class DoricPanelFragment extends Fragment { | |||||||
|                 if (fragment instanceof IDoricNavigator) { |                 if (fragment instanceof IDoricNavigator) { | ||||||
|                     context.setDoricNavigator((IDoricNavigator) fragment); |                     context.setDoricNavigator((IDoricNavigator) fragment); | ||||||
|                 } |                 } | ||||||
|  |                 context.setDoricNavBar(navBar); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             @Override |             @Override | ||||||
|   | |||||||
| @@ -20,6 +20,7 @@ import android.text.TextUtils; | |||||||
| import pub.doric.loader.DoricAssetJSLoader; | import pub.doric.loader.DoricAssetJSLoader; | ||||||
| import pub.doric.loader.DoricHttpJSLoader; | import pub.doric.loader.DoricHttpJSLoader; | ||||||
| import pub.doric.loader.IDoricJSLoader; | import pub.doric.loader.IDoricJSLoader; | ||||||
|  | import pub.doric.plugin.NavBarPlugin; | ||||||
| import pub.doric.plugin.NavigatorPlugin; | import pub.doric.plugin.NavigatorPlugin; | ||||||
| import pub.doric.plugin.NetworkPlugin; | import pub.doric.plugin.NetworkPlugin; | ||||||
| import pub.doric.plugin.ShaderPlugin; | import pub.doric.plugin.ShaderPlugin; | ||||||
| @@ -82,6 +83,8 @@ public class DoricRegistry { | |||||||
|         this.registerNativePlugin(NetworkPlugin.class); |         this.registerNativePlugin(NetworkPlugin.class); | ||||||
|         this.registerNativePlugin(StoragePlugin.class); |         this.registerNativePlugin(StoragePlugin.class); | ||||||
|         this.registerNativePlugin(NavigatorPlugin.class); |         this.registerNativePlugin(NavigatorPlugin.class); | ||||||
|  |         this.registerNativePlugin(NavBarPlugin.class); | ||||||
|  |  | ||||||
|         this.registerViewNode(RootNode.class); |         this.registerViewNode(RootNode.class); | ||||||
|         this.registerViewNode(TextNode.class); |         this.registerViewNode(TextNode.class); | ||||||
|         this.registerViewNode(ImageNode.class); |         this.registerViewNode(ImageNode.class); | ||||||
|   | |||||||
| @@ -0,0 +1,105 @@ | |||||||
|  | package pub.doric.navbar; | ||||||
|  |  | ||||||
|  | import android.app.Activity; | ||||||
|  | import android.content.Context; | ||||||
|  | import android.text.Layout; | ||||||
|  | import android.text.StaticLayout; | ||||||
|  | import android.util.AttributeSet; | ||||||
|  | import android.view.LayoutInflater; | ||||||
|  | import android.view.View; | ||||||
|  | import android.view.ViewGroup; | ||||||
|  | import android.widget.FrameLayout; | ||||||
|  | import android.widget.TextView; | ||||||
|  |  | ||||||
|  | import androidx.annotation.AttrRes; | ||||||
|  | import androidx.annotation.NonNull; | ||||||
|  | import androidx.annotation.Nullable; | ||||||
|  |  | ||||||
|  | import pub.doric.R; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @Description: pub.doric.navbar | ||||||
|  |  * @Author: pengfei.zhou | ||||||
|  |  * @CreateDate: 2019-11-25 | ||||||
|  |  */ | ||||||
|  | public class BaseDoricNavBar extends FrameLayout implements IDoricNavBar { | ||||||
|  |     private ViewGroup mTitleContainer; | ||||||
|  |     private ViewGroup mRightContainer; | ||||||
|  |     private ViewGroup mLeftContainer; | ||||||
|  |     private TextView mTvTitle; | ||||||
|  |  | ||||||
|  |     public BaseDoricNavBar(@NonNull Context context) { | ||||||
|  |         this(context, null); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public BaseDoricNavBar(@NonNull Context context, @Nullable AttributeSet attrs) { | ||||||
|  |         this(context, attrs, 0); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public BaseDoricNavBar(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { | ||||||
|  |         super(context, attrs, defStyleAttr); | ||||||
|  |         setup(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void setup() { | ||||||
|  |         LayoutInflater.from(getContext()).inflate(R.layout.doric_navigator, this); | ||||||
|  |         mTitleContainer = findViewById(R.id.container_title); | ||||||
|  |         mLeftContainer = findViewById(R.id.container_left); | ||||||
|  |         mRightContainer = findViewById(R.id.container_right); | ||||||
|  |         mTvTitle = findViewById(R.id.tv_title); | ||||||
|  |         findViewById(R.id.tv_back).setOnClickListener(new OnClickListener() { | ||||||
|  |             @Override | ||||||
|  |             public void onClick(View v) { | ||||||
|  |                 if (getContext() instanceof Activity) { | ||||||
|  |                     ((Activity) getContext()).onBackPressed(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public boolean isHidden() { | ||||||
|  |         return getVisibility() != VISIBLE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void setHidden(boolean b) { | ||||||
|  |         setVisibility(b ? GONE : VISIBLE); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void setTitle(String title) { | ||||||
|  |         mTvTitle.setText(title); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void updateTitleMargins() { | ||||||
|  |         try { | ||||||
|  |             int width = mRightContainer.getRight() - mLeftContainer.getLeft(); | ||||||
|  |             int leftWidth = mLeftContainer.getWidth(); | ||||||
|  |             int rightWidth = mRightContainer.getWidth(); | ||||||
|  |             int margin = Math.max(leftWidth, rightWidth); | ||||||
|  |             if (leftWidth + rightWidth > width) { | ||||||
|  |                 mTitleContainer.setVisibility(GONE); | ||||||
|  |             } else { | ||||||
|  |                 mTitleContainer.setVisibility(VISIBLE); | ||||||
|  |                 StaticLayout staticLayout = new StaticLayout(mTvTitle.getText(), | ||||||
|  |                         mTvTitle.getPaint(), Integer.MAX_VALUE, Layout.Alignment.ALIGN_NORMAL, | ||||||
|  |                         1.0f, 0.0f, false); | ||||||
|  |                 float textWidth = (staticLayout.getLineCount() > 0 ? staticLayout.getLineWidth(0) : 0.0f); | ||||||
|  |                 if (width - 2 * margin >= textWidth) { | ||||||
|  |                     mTitleContainer.setPadding(margin, 0, margin, 0); | ||||||
|  |                 } else { | ||||||
|  |                     mTitleContainer.setPadding(leftWidth, 0, rightWidth, 0); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             e.printStackTrace(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     protected void onLayout(boolean changed, int left, int top, int right, int bottom) { | ||||||
|  |         super.onLayout(changed, left, top, right, bottom); | ||||||
|  |         updateTitleMargins(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,31 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright [2019] [Doric.Pub] | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  * http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | package pub.doric.navbar; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @Description: pub.doric.navbar | ||||||
|  |  * @Author: pengfei.zhou | ||||||
|  |  * @CreateDate: 2019-11-25 | ||||||
|  |  */ | ||||||
|  | public interface IDoricNavBar { | ||||||
|  |     boolean isHidden(); | ||||||
|  |  | ||||||
|  |     void setHidden(boolean hidden); | ||||||
|  |  | ||||||
|  |     void setTitle(String title); | ||||||
|  |  | ||||||
|  |     void setBackgroundColor(int color); | ||||||
|  | } | ||||||
							
								
								
									
										115
									
								
								Android/doric/src/main/java/pub/doric/plugin/NavBarPlugin.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								Android/doric/src/main/java/pub/doric/plugin/NavBarPlugin.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright [2019] [Doric.Pub] | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  * http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | package pub.doric.plugin; | ||||||
|  |  | ||||||
|  | import android.view.View; | ||||||
|  | import android.view.ViewGroup; | ||||||
|  |  | ||||||
|  | import com.github.pengfeizhou.jscore.ArchiveException; | ||||||
|  | import com.github.pengfeizhou.jscore.JSDecoder; | ||||||
|  | import com.github.pengfeizhou.jscore.JSObject; | ||||||
|  | import com.github.pengfeizhou.jscore.JavaValue; | ||||||
|  |  | ||||||
|  | import pub.doric.DoricContext; | ||||||
|  | import pub.doric.extension.bridge.DoricMethod; | ||||||
|  | import pub.doric.extension.bridge.DoricPlugin; | ||||||
|  | import pub.doric.extension.bridge.DoricPromise; | ||||||
|  | import pub.doric.navbar.IDoricNavBar; | ||||||
|  | import pub.doric.utils.DoricUtils; | ||||||
|  | import pub.doric.utils.ThreadMode; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @Description: pub.doric.plugin | ||||||
|  |  * @Author: pengfei.zhou | ||||||
|  |  * @CreateDate: 2019-11-25 | ||||||
|  |  */ | ||||||
|  | @DoricPlugin(name = "navbar") | ||||||
|  | public class NavBarPlugin extends DoricJavaPlugin { | ||||||
|  |     public NavBarPlugin(DoricContext doricContext) { | ||||||
|  |         super(doricContext); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @DoricMethod(thread = ThreadMode.UI) | ||||||
|  |     public void isHidden(DoricPromise promise) { | ||||||
|  |         IDoricNavBar navBar = getDoricContext().getDoricNavBar(); | ||||||
|  |         if (navBar == null) { | ||||||
|  |             promise.reject(new JavaValue("Not implement NavBar")); | ||||||
|  |         } else { | ||||||
|  |             promise.resolve(new JavaValue(navBar.isHidden())); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @DoricMethod(thread = ThreadMode.UI) | ||||||
|  |     public void setHidden(JSDecoder jsDecoder, DoricPromise promise) { | ||||||
|  |         IDoricNavBar navBar = getDoricContext().getDoricNavBar(); | ||||||
|  |         if (navBar == null) { | ||||||
|  |             promise.reject(new JavaValue("Not implement NavBar")); | ||||||
|  |         } else { | ||||||
|  |             try { | ||||||
|  |                 JSObject jsObject = jsDecoder.decode().asObject(); | ||||||
|  |                 boolean hidden = jsObject.getProperty("hidden").asBoolean().value(); | ||||||
|  |                 navBar.setHidden(hidden); | ||||||
|  |                 View v = getDoricContext().getRootNode().getDoricLayer(); | ||||||
|  |                 ViewGroup.LayoutParams params = v.getLayoutParams(); | ||||||
|  |                 if (params instanceof ViewGroup.MarginLayoutParams) { | ||||||
|  |                     ((ViewGroup.MarginLayoutParams) params).topMargin = | ||||||
|  |                             hidden ? 0 | ||||||
|  |                                     : ((View) navBar).getMeasuredHeight(); | ||||||
|  |                 } | ||||||
|  |                 promise.resolve(); | ||||||
|  |             } catch (ArchiveException e) { | ||||||
|  |                 e.printStackTrace(); | ||||||
|  |                 promise.reject(new JavaValue(e.getLocalizedMessage())); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @DoricMethod(thread = ThreadMode.UI) | ||||||
|  |     public void setTitle(JSDecoder jsDecoder, DoricPromise promise) { | ||||||
|  |         IDoricNavBar navBar = getDoricContext().getDoricNavBar(); | ||||||
|  |         if (navBar == null) { | ||||||
|  |             promise.reject(new JavaValue("Not implement NavBar")); | ||||||
|  |         } else { | ||||||
|  |             try { | ||||||
|  |                 JSObject jsObject = jsDecoder.decode().asObject(); | ||||||
|  |                 String title = jsObject.getProperty("title").asString().value(); | ||||||
|  |                 navBar.setTitle(title); | ||||||
|  |                 promise.resolve(); | ||||||
|  |             } catch (ArchiveException e) { | ||||||
|  |                 e.printStackTrace(); | ||||||
|  |                 promise.reject(new JavaValue(e.getLocalizedMessage())); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @DoricMethod(thread = ThreadMode.UI) | ||||||
|  |     public void setBgColor(JSDecoder jsDecoder, DoricPromise promise) { | ||||||
|  |         IDoricNavBar navBar = getDoricContext().getDoricNavBar(); | ||||||
|  |         if (navBar == null) { | ||||||
|  |             promise.reject(new JavaValue("Not implement NavBar")); | ||||||
|  |         } else { | ||||||
|  |             try { | ||||||
|  |                 JSObject jsObject = jsDecoder.decode().asObject(); | ||||||
|  |                 int color = jsObject.getProperty("color").asNumber().toInt(); | ||||||
|  |                 navBar.setBackgroundColor(color); | ||||||
|  |                 promise.resolve(); | ||||||
|  |             } catch (ArchiveException e) { | ||||||
|  |                 e.printStackTrace(); | ||||||
|  |                 promise.reject(new JavaValue(e.getLocalizedMessage())); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -56,6 +56,7 @@ public class ShaderPlugin extends DoricJavaPlugin { | |||||||
|                 @Override |                 @Override | ||||||
|                 public Object call() throws Exception { |                 public Object call() throws Exception { | ||||||
|                     RootNode rootNode = getDoricContext().getRootNode(); |                     RootNode rootNode = getDoricContext().getRootNode(); | ||||||
|  |                     rootNode.setId(jsObject.getProperty("id").asString().value()); | ||||||
|                     rootNode.render(jsObject.getProperty("props").asObject()); |                     rootNode.render(jsObject.getProperty("props").asObject()); | ||||||
|                     return null; |                     return null; | ||||||
|                 } |                 } | ||||||
|   | |||||||
| @@ -187,7 +187,7 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder { | |||||||
|         do { |         do { | ||||||
|             ids.push(viewNode.mId); |             ids.push(viewNode.mId); | ||||||
|             viewNode = viewNode.mSuperNode; |             viewNode = viewNode.mSuperNode; | ||||||
|         } while (viewNode != null && !(viewNode instanceof RootNode)); |         } while (viewNode != null); | ||||||
|  |  | ||||||
|         return ids.toArray(new String[0]); |         return ids.toArray(new String[0]); | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								Android/doric/src/main/res/drawable-xhdpi/doric_icon_back.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Android/doric/src/main/res/drawable-xhdpi/doric_icon_back.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.1 KiB | 
| @@ -1,5 +1,18 @@ | |||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <pub.doric.DoricPanel xmlns:android="http://schemas.android.com/apk/res/android" | <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|     android:layout_width="match_parent" |     android:layout_width="match_parent" | ||||||
|     android:layout_height="match_parent" |     android:layout_height="match_parent"> | ||||||
|     android:background="#ffffff" /> |  | ||||||
|  |     <pub.doric.DoricPanel | ||||||
|  |         android:id="@+id/doric_panel" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="match_parent" | ||||||
|  |         android:background="#ffffff" | ||||||
|  |         android:layout_marginTop="44dp" /> | ||||||
|  |  | ||||||
|  |     <pub.doric.navbar.BaseDoricNavBar | ||||||
|  |         android:id="@+id/doric_nav_bar" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="wrap_content" /> | ||||||
|  |  | ||||||
|  | </FrameLayout> | ||||||
							
								
								
									
										63
									
								
								Android/doric/src/main/res/layout/doric_navigator.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								Android/doric/src/main/res/layout/doric_navigator.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <merge xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="wrap_content"> | ||||||
|  |  | ||||||
|  |     <FrameLayout | ||||||
|  |         android:id="@+id/nav_layout" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="44dp" | ||||||
|  |         android:gravity="center_vertical" | ||||||
|  |         android:orientation="horizontal" | ||||||
|  |         android:paddingLeft="15dp" | ||||||
|  |         android:paddingRight="15dp"> | ||||||
|  |  | ||||||
|  |         <FrameLayout | ||||||
|  |             android:id="@+id/container_title" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:layout_gravity="center" | ||||||
|  |             android:gravity="center"> | ||||||
|  |  | ||||||
|  |             <TextView | ||||||
|  |                 android:id="@+id/tv_title" | ||||||
|  |                 android:layout_width="wrap_content" | ||||||
|  |                 android:layout_height="wrap_content" | ||||||
|  |                 android:layout_gravity="center" | ||||||
|  |                 android:ellipsize="end" | ||||||
|  |                 android:singleLine="true" | ||||||
|  |                 android:textSize="16sp"> | ||||||
|  |  | ||||||
|  |             </TextView> | ||||||
|  |         </FrameLayout> | ||||||
|  |  | ||||||
|  |         <LinearLayout | ||||||
|  |             android:id="@+id/container_left" | ||||||
|  |             android:layout_width="wrap_content" | ||||||
|  |             android:layout_height="match_parent" | ||||||
|  |             android:layout_gravity="center_vertical|left" | ||||||
|  |             android:gravity="center" | ||||||
|  |             android:orientation="horizontal"> | ||||||
|  |  | ||||||
|  |             <TextView | ||||||
|  |                 android:id="@+id/tv_back" | ||||||
|  |                 android:layout_width="wrap_content" | ||||||
|  |                 android:layout_height="match_parent" | ||||||
|  |                 android:drawableLeft="@drawable/doric_icon_back" | ||||||
|  |                 android:minWidth="30dp" | ||||||
|  |                 android:textColor="#000" | ||||||
|  |                 android:textSize="16sp" /> | ||||||
|  |  | ||||||
|  |         </LinearLayout> | ||||||
|  |  | ||||||
|  |         <LinearLayout | ||||||
|  |             android:id="@+id/container_right" | ||||||
|  |             android:layout_width="wrap_content" | ||||||
|  |             android:layout_height="match_parent" | ||||||
|  |             android:layout_gravity="center_vertical|right" | ||||||
|  |             android:gravity="center" | ||||||
|  |             android:orientation="horizontal" /> | ||||||
|  |  | ||||||
|  |     </FrameLayout> | ||||||
|  |  | ||||||
|  | </merge> | ||||||
| @@ -11,4 +11,5 @@ export default [ | |||||||
|     'src/NetworkDemo', |     'src/NetworkDemo', | ||||||
|     'src/StorageDemo', |     'src/StorageDemo', | ||||||
|     'src/NavigatorDemo', |     'src/NavigatorDemo', | ||||||
|  |     'src/NavbarDemo', | ||||||
| ] | ] | ||||||
							
								
								
									
										84
									
								
								demo/src/NavbarDemo.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								demo/src/NavbarDemo.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | |||||||
|  | import { Group, Panel, navbar, text, gravity, Color, Stack, LayoutSpec, list, NativeCall, listItem, log, vlayout, Gravity, hlayout, Text, scroller, layoutConfig, image, IView, IVLayout, ScaleType, modal, IText, network, navigator } from "doric"; | ||||||
|  | import { title, label, colors } from "./utils"; | ||||||
|  |  | ||||||
|  | @Entry | ||||||
|  | class NavbarDemo extends Panel { | ||||||
|  |     build(rootView: Group): void { | ||||||
|  |         scroller(vlayout([ | ||||||
|  |             title("Navbar Demo"), | ||||||
|  |             label('isHidden').apply({ | ||||||
|  |                 width: 200, | ||||||
|  |                 height: 50, | ||||||
|  |                 bgColor: colors[0], | ||||||
|  |                 textSize: 30, | ||||||
|  |                 textColor: Color.WHITE, | ||||||
|  |                 layoutConfig: layoutConfig().exactly(), | ||||||
|  |                 onClick: () => { | ||||||
|  |                     navbar(context).isHidden().then(e => modal(context).alert(`Navbar isHidden:${e}`)).catch(e => { | ||||||
|  |                         modal(context).alert(e) | ||||||
|  |                     }) | ||||||
|  |                 } | ||||||
|  |             } as IText), | ||||||
|  |             label('setHidden').apply({ | ||||||
|  |                 width: 200, | ||||||
|  |                 height: 50, | ||||||
|  |                 bgColor: colors[0], | ||||||
|  |                 textSize: 30, | ||||||
|  |                 textColor: Color.WHITE, | ||||||
|  |                 layoutConfig: layoutConfig().exactly(), | ||||||
|  |                 onClick: () => { | ||||||
|  |                     navbar(context).isHidden() | ||||||
|  |                         .then(e => navbar(context).setHidden(!e)) | ||||||
|  |                         .catch(e => { | ||||||
|  |                             modal(context).alert(e) | ||||||
|  |                         }) | ||||||
|  |                 } | ||||||
|  |             } as IText), | ||||||
|  |             label('setTitle').apply({ | ||||||
|  |                 width: 200, | ||||||
|  |                 height: 50, | ||||||
|  |                 bgColor: colors[0], | ||||||
|  |                 textSize: 30, | ||||||
|  |                 textColor: Color.WHITE, | ||||||
|  |                 layoutConfig: layoutConfig().exactly(), | ||||||
|  |                 onClick: () => { | ||||||
|  |                     navbar(context).setTitle('Setted Title') | ||||||
|  |                         .catch(e => { | ||||||
|  |                             modal(context).alert(e) | ||||||
|  |                         }) | ||||||
|  |                 } | ||||||
|  |             } as IText), | ||||||
|  |             label('setBgColor').apply({ | ||||||
|  |                 width: 200, | ||||||
|  |                 height: 50, | ||||||
|  |                 bgColor: colors[0], | ||||||
|  |                 textSize: 30, | ||||||
|  |                 textColor: Color.WHITE, | ||||||
|  |                 layoutConfig: layoutConfig().exactly(), | ||||||
|  |                 onClick: () => { | ||||||
|  |                     navbar(context).setBgColor(Color.YELLOW) | ||||||
|  |                         .catch(e => { | ||||||
|  |                             modal(context).alert(e) | ||||||
|  |                         }) | ||||||
|  |                 } | ||||||
|  |             } as IText), | ||||||
|  |             label('Pop').apply({ | ||||||
|  |                 width: 200, | ||||||
|  |                 height: 50, | ||||||
|  |                 bgColor: colors[0], | ||||||
|  |                 textSize: 30, | ||||||
|  |                 textColor: Color.WHITE, | ||||||
|  |                 layoutConfig: layoutConfig().exactly(), | ||||||
|  |                 onClick: () => { | ||||||
|  |                     navigator(context).pop() | ||||||
|  |                 } | ||||||
|  |             } as IText), | ||||||
|  |         ]).apply({ | ||||||
|  |             layoutConfig: layoutConfig().atmost().h(LayoutSpec.WRAP_CONTENT), | ||||||
|  |             gravity: gravity().center(), | ||||||
|  |             space: 10, | ||||||
|  |         } as IVLayout)).apply({ | ||||||
|  |             layoutConfig: layoutConfig().atmost(), | ||||||
|  |         }).in(rootView) | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -13,7 +13,9 @@ class NaivgatorDemo extends Panel { | |||||||
|                 textAlignment: gravity().center(), |                 textAlignment: gravity().center(), | ||||||
|                 height: 50, |                 height: 50, | ||||||
|             }), |             }), | ||||||
|             ...['Counter', 'EffectsDemo', 'ImageDemo', 'LayoutDemo', |             ...[ | ||||||
|  |                 'NavbarDemo', | ||||||
|  |                 'Counter', 'EffectsDemo', 'ImageDemo', 'LayoutDemo', | ||||||
|                 'ListDemo', 'ModalDemo', 'NavigatorDemo', |                 'ListDemo', 'ModalDemo', 'NavigatorDemo', | ||||||
|                 'NetworkDemo', 'ScrollerDemo', 'SliderDemo', 'Snake', 'StorageDemo'].map(e => |                 'NetworkDemo', 'ScrollerDemo', 'SliderDemo', 'Snake', 'StorageDemo'].map(e => | ||||||
|                     label(e).apply({ |                     label(e).apply({ | ||||||
|   | |||||||
| @@ -86,7 +86,7 @@ - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects: | |||||||
|         NSString *result = qrObject.stringValue; |         NSString *result = qrObject.stringValue; | ||||||
|         NSLog(@"Scan result is %@", result); |         NSLog(@"Scan result is %@", result); | ||||||
|         [[DoricDriver instance] connectDevKit:[NSString stringWithFormat:@"ws://%@:7777", result]]; |         [[DoricDriver instance] connectDevKit:[NSString stringWithFormat:@"ws://%@:7777", result]]; | ||||||
|         showToast([NSString stringWithFormat:@"Connected to %@", result], BOTTOM); |         ShowToast([NSString stringWithFormat:@"Connected to %@", result], BOTTOM); | ||||||
|         [self.navigationController popViewControllerAnimated:NO]; |         [self.navigationController popViewControllerAnimated:NO]; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -22,6 +22,6 @@ | |||||||
| #import "DoricUtil.h" | #import "DoricUtil.h" | ||||||
| #import "DoricPanel.h" | #import "DoricPanel.h" | ||||||
| #import "DoricJSLoaderManager.h" | #import "DoricJSLoaderManager.h" | ||||||
| #import "DoricNavigatorProtocol.h" | #import "DoricNavigatorDelegate.h" | ||||||
|  | #import "DoricNavBarDelegate.h" | ||||||
| #import "DoricViewController.h" | #import "DoricViewController.h" | ||||||
| #import "DoricDefaultNavigator.h" |  | ||||||
| @@ -22,14 +22,16 @@ | |||||||
|  |  | ||||||
| #import <Foundation/Foundation.h> | #import <Foundation/Foundation.h> | ||||||
| #import "DoricDriver.h" | #import "DoricDriver.h" | ||||||
| #import "DoricNavigatorProtocol.h" | #import "DoricNavigatorDelegate.h" | ||||||
|  | #import "DoricNavBarDelegate.h" | ||||||
|  |  | ||||||
| NS_ASSUME_NONNULL_BEGIN | NS_ASSUME_NONNULL_BEGIN | ||||||
|  |  | ||||||
| @class DoricRootNode; | @class DoricRootNode; | ||||||
|  |  | ||||||
| @interface DoricContext : NSObject | @interface DoricContext : NSObject | ||||||
| @property(nonatomic, strong) id <DoricNavigatorProtocol> navigator; | @property(nonatomic, weak) id <DoricNavigatorDelegate> navigator; | ||||||
|  | @property(nonatomic, weak) id <DoricNavBarDelegate> navBar; | ||||||
| @property(nonatomic, strong) NSString *contextId; | @property(nonatomic, strong) NSString *contextId; | ||||||
| @property(nonatomic, strong) DoricDriver *driver; | @property(nonatomic, strong) DoricDriver *driver; | ||||||
| @property(nonatomic, strong) NSMutableDictionary *pluginInstanceMap; | @property(nonatomic, strong) NSMutableDictionary *pluginInstanceMap; | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ | |||||||
| #import <Foundation/Foundation.h> | #import <Foundation/Foundation.h> | ||||||
|  |  | ||||||
| #import "DoricContext.h" | #import "DoricContext.h" | ||||||
| #import "DoricNavigatorProtocol.h" | #import "DoricNavigatorDelegate.h" | ||||||
|  |  | ||||||
| @interface DoricPanel : UIViewController | @interface DoricPanel : UIViewController | ||||||
| @property(nonatomic, strong) DoricContext *doricContext; | @property(nonatomic, strong) DoricContext *doricContext; | ||||||
|   | |||||||
| @@ -24,13 +24,20 @@ @implementation DoricPanel | |||||||
| 
 | 
 | ||||||
| - (void)config:(NSString *)script alias:(NSString *)alias { | - (void)config:(NSString *)script alias:(NSString *)alias { | ||||||
|     self.doricContext = [[[DoricContext alloc] initWithScript:script source:alias] also:^(DoricContext *it) { |     self.doricContext = [[[DoricContext alloc] initWithScript:script source:alias] also:^(DoricContext *it) { | ||||||
|         it.navigator = [[DoricDefaultNavigator alloc] initWithNavigationController:self.navigationController]; |  | ||||||
|         [it.rootNode setupRootView:[[DoricStackView new] also:^(DoricStackView *it) { |         [it.rootNode setupRootView:[[DoricStackView new] also:^(DoricStackView *it) { | ||||||
|             it.width = self.view.width; |  | ||||||
|             it.height = self.view.height; |  | ||||||
|             [self.view addSubview:it]; |             [self.view addSubview:it]; | ||||||
|         }]]; |         }]]; | ||||||
|         [it initContextWithWidth:self.view.width height:self.view.height]; |     }]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)viewWillLayoutSubviews { | ||||||
|  |     [super viewWillLayoutSubviews]; | ||||||
|  |     [self.doricContext.rootNode.view also:^(DoricStackView *it) { | ||||||
|  |         if (it.width != self.view.width || it.height != self.view.height) { | ||||||
|  |             it.width = self.view.width; | ||||||
|  |             it.height = self.view.height; | ||||||
|  |             [self.doricContext initContextWithWidth:it.width height:it.height]; | ||||||
|  |         } | ||||||
|     }]; |     }]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -36,6 +36,7 @@ | |||||||
| #import "DoricSlideItemNode.h" | #import "DoricSlideItemNode.h" | ||||||
| #import "DoricStoragePlugin.h" | #import "DoricStoragePlugin.h" | ||||||
| #import "DoricNavigatorPlugin.h" | #import "DoricNavigatorPlugin.h" | ||||||
|  | #import "DoricNavBarPlugin.h" | ||||||
| 
 | 
 | ||||||
| @interface DoricRegistry () | @interface DoricRegistry () | ||||||
| 
 | 
 | ||||||
| @@ -63,6 +64,7 @@ - (void)innerRegister { | |||||||
|     [self registerNativePlugin:DoricNetworkPlugin.class withName:@"network"]; |     [self registerNativePlugin:DoricNetworkPlugin.class withName:@"network"]; | ||||||
|     [self registerNativePlugin:DoricStoragePlugin.class withName:@"storage"]; |     [self registerNativePlugin:DoricStoragePlugin.class withName:@"storage"]; | ||||||
|     [self registerNativePlugin:DoricNavigatorPlugin.class withName:@"navigator"]; |     [self registerNativePlugin:DoricNavigatorPlugin.class withName:@"navigator"]; | ||||||
|  |     [self registerNativePlugin:DoricNavBarPlugin.class withName:@"navbar"]; | ||||||
| 
 | 
 | ||||||
|     [self registerViewNode:DoricStackNode.class withName:@"Stack"]; |     [self registerViewNode:DoricStackNode.class withName:@"Stack"]; | ||||||
|     [self registerViewNode:DoricVLayoutNode.class withName:@"VLayout"]; |     [self registerViewNode:DoricVLayoutNode.class withName:@"VLayout"]; | ||||||
|   | |||||||
| @@ -18,8 +18,9 @@ | |||||||
| // | // | ||||||
|  |  | ||||||
| #import <Foundation/Foundation.h> | #import <Foundation/Foundation.h> | ||||||
| #import "DoricNavigatorProtocol.h" | #import "DoricNavigatorDelegate.h" | ||||||
|  | #import "DoricNavBarDelegate.h" | ||||||
|  |  | ||||||
| @interface DoricViewController : UIViewController | @interface DoricViewController : UIViewController <DoricNavigatorDelegate, DoricNavBarDelegate> | ||||||
| - (instancetype)initWithScheme:(NSString *)scheme alias:(NSString *)alias; | - (instancetype)initWithScheme:(NSString *)scheme alias:(NSString *)alias; | ||||||
| @end | @end | ||||||
| @@ -23,10 +23,18 @@ | |||||||
| #import "DoricPanel.h" | #import "DoricPanel.h" | ||||||
| #import "UIView+Doric.h" | #import "UIView+Doric.h" | ||||||
| #import "DoricExtensions.h" | #import "DoricExtensions.h" | ||||||
|  | #import "DoricUtil.h" | ||||||
|  | 
 | ||||||
|  | @interface DoricViewController () | ||||||
|  | @property(nonatomic, strong) DoricPanel *doricPanel; | ||||||
|  | @property(nonatomic) BOOL navBarHidden; | ||||||
|  | @property(nonatomic, strong) UIImage *navBarImage; | ||||||
|  | @end | ||||||
| 
 | 
 | ||||||
| @implementation DoricViewController | @implementation DoricViewController | ||||||
| - (instancetype)initWithScheme:(NSString *)scheme alias:(NSString *)alias { | - (instancetype)initWithScheme:(NSString *)scheme alias:(NSString *)alias { | ||||||
|     if (self = [super init]) { |     if (self = [super init]) { | ||||||
|  |         self.edgesForExtendedLayout = UIRectEdgeNone; | ||||||
|         DoricAsyncResult <NSString *> *result = [DoricJSLoaderManager.instance request:scheme]; |         DoricAsyncResult <NSString *> *result = [DoricJSLoaderManager.instance request:scheme]; | ||||||
|         result.resultCallback = ^(NSString *result) { |         result.resultCallback = ^(NSString *result) { | ||||||
|             dispatch_async(dispatch_get_main_queue(), ^{ |             dispatch_async(dispatch_get_main_queue(), ^{ | ||||||
| @@ -34,16 +42,66 @@ - (instancetype)initWithScheme:(NSString *)scheme alias:(NSString *)alias { | |||||||
|                 [panel.view also:^(UIView *it) { |                 [panel.view also:^(UIView *it) { | ||||||
|                     it.backgroundColor = [UIColor whiteColor]; |                     it.backgroundColor = [UIColor whiteColor]; | ||||||
|                     it.width = self.view.width; |                     it.width = self.view.width; | ||||||
|                     it.height = self.view.height - 88; |                     it.height = self.view.height; | ||||||
|                     it.top = 88; |  | ||||||
|                 }]; |                 }]; | ||||||
|                 [self.view addSubview:panel.view]; |                 [self.view addSubview:panel.view]; | ||||||
|                 [self addChildViewController:panel]; |                 [self addChildViewController:panel]; | ||||||
|                 [panel config:result alias:alias]; |                 [panel config:result alias:alias]; | ||||||
| 
 |                 panel.doricContext.navigator = self; | ||||||
|  |                 panel.doricContext.navBar = self; | ||||||
|  |                 self.doricPanel = panel; | ||||||
|             }); |             }); | ||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
|     return self; |     return self; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | - (void)viewWillAppear:(BOOL)animated { | ||||||
|  |     [super viewWillAppear:animated]; | ||||||
|  |     self.navBarHidden = self.navigationController.navigationBarHidden; | ||||||
|  |     self.navBarImage = [self.navigationController.navigationBar backgroundImageForBarMetrics:UIBarMetricsDefault]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)viewWillDisappear:(BOOL)animated { | ||||||
|  |     [super viewWillDisappear:animated]; | ||||||
|  |     if (self.navigationController.navigationBarHidden != self.navBarHidden) { | ||||||
|  |         [self.navigationController setNavigationBarHidden:self.navBarHidden]; | ||||||
|  |     } | ||||||
|  |     if (self.navBarImage != [self.navigationController.navigationBar backgroundImageForBarMetrics:UIBarMetricsDefault]) { | ||||||
|  |         [self.navigationController.navigationBar setBackgroundImage:self.navBarImage forBarMetrics:UIBarMetricsDefault]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)viewWillLayoutSubviews { | ||||||
|  |     [super viewWillLayoutSubviews]; | ||||||
|  |     self.doricPanel.view.width = self.view.width; | ||||||
|  |     self.doricPanel.view.height = self.view.height; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)doric_navigator_push:(NSString *)scheme alias:(NSString *)alias animated:(BOOL)animated { | ||||||
|  |     DoricViewController *viewController = [[DoricViewController alloc] initWithScheme:scheme alias:alias]; | ||||||
|  |     [self.navigationController pushViewController:viewController animated:animated]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)doric_navigator_pop:(BOOL)animated { | ||||||
|  |     [self.navigationController popViewControllerAnimated:animated]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (BOOL)doric_navBar_isHidden { | ||||||
|  |     return self.navigationController.navigationBarHidden; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)doric_navBar_setHidden:(BOOL)hidden { | ||||||
|  |     [self.navigationController setNavigationBarHidden:hidden]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)doric_navBar_setTitle:(NSString *)title { | ||||||
|  |     self.title = title; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)doric_navBar_setBackgroundColor:(UIColor *)color { | ||||||
|  |     [self.navigationController.navigationBar setBackgroundImage:UIImageWithColor(color) forBarMetrics:UIBarMetricsDefault]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| @end | @end | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								iOS/Pod/Classes/NavBar/DoricNavBarDelegate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								iOS/Pod/Classes/NavBar/DoricNavBarDelegate.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright [2019] [Doric.Pub] | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  * http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | // | ||||||
|  | // Created by pengfei.zhou on 2019/11/25. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #import <Foundation/Foundation.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @protocol DoricNavBarDelegate <NSObject> | ||||||
|  | - (BOOL)doric_navBar_isHidden; | ||||||
|  |  | ||||||
|  | - (void)doric_navBar_setHidden:(BOOL)hidden; | ||||||
|  |  | ||||||
|  | - (void)doric_navBar_setTitle:(NSString *)title; | ||||||
|  |  | ||||||
|  | - (void)doric_navBar_setBackgroundColor:(UIColor *)color; | ||||||
|  | @end | ||||||
| @@ -1,10 +0,0 @@ | |||||||
| // |  | ||||||
| // Created by pengfei.zhou on 2019/11/25. |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #import <Foundation/Foundation.h> |  | ||||||
| #import "DoricNavigatorProtocol.h" |  | ||||||
|  |  | ||||||
| @interface DoricDefaultNavigator : NSObject <DoricNavigatorProtocol> |  | ||||||
| - (instancetype)initWithNavigationController:(UINavigationController *)navigationController; |  | ||||||
| @end |  | ||||||
| @@ -1,29 +0,0 @@ | |||||||
| // |  | ||||||
| // Created by pengfei.zhou on 2019/11/25. |  | ||||||
| // |  | ||||||
| 
 |  | ||||||
| #import "DoricDefaultNavigator.h" |  | ||||||
| #import "DoricViewController.h" |  | ||||||
| 
 |  | ||||||
| @interface DoricDefaultNavigator () |  | ||||||
| @property(nonatomic, weak) UINavigationController *navigationController; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation DoricDefaultNavigator |  | ||||||
| - (instancetype)initWithNavigationController:(UINavigationController *)navigationController { |  | ||||||
|     if (self = [super init]) { |  | ||||||
|         _navigationController = navigationController; |  | ||||||
|     } |  | ||||||
|     return self; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| - (void)push:(NSString *)scheme alias:(NSString *)alias animated:(BOOL)animated { |  | ||||||
|     DoricViewController *viewController = [[DoricViewController alloc] initWithScheme:scheme alias:alias]; |  | ||||||
|     [self.navigationController pushViewController:viewController animated:animated]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| - (void)pop:(BOOL)animated { |  | ||||||
|     [self.navigationController popViewControllerAnimated:animated]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @end |  | ||||||
							
								
								
									
										26
									
								
								iOS/Pod/Classes/Navigator/DoricNavigatorDelegate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								iOS/Pod/Classes/Navigator/DoricNavigatorDelegate.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright [2019] [Doric.Pub] | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  * http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | // | ||||||
|  | // Created by pengfei.zhou on 2019/11/23. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #import <Foundation/Foundation.h> | ||||||
|  |  | ||||||
|  | @protocol DoricNavigatorDelegate <NSObject> | ||||||
|  | - (void)doric_navigator_push:(NSString *)scheme alias:(NSString *)alias animated:(BOOL)animated; | ||||||
|  |  | ||||||
|  | - (void)doric_navigator_pop:(BOOL)animated; | ||||||
|  | @end | ||||||
| @@ -1,11 +0,0 @@ | |||||||
| // |  | ||||||
| // Created by pengfei.zhou on 2019/11/23. |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #import <Foundation/Foundation.h> |  | ||||||
|  |  | ||||||
| @protocol DoricNavigatorProtocol <NSObject> |  | ||||||
| - (void)push:(NSString *)scheme alias:(NSString *)alias animated:(BOOL)animated; |  | ||||||
|  |  | ||||||
| - (void)pop:(BOOL)animated; |  | ||||||
| @end |  | ||||||
| @@ -32,7 +32,7 @@ - (void)toast:(NSDictionary *)dic withPromise:(DoricPromise *)promise { | |||||||
|         [dic[@"gravity"] also:^(NSNumber *it) { |         [dic[@"gravity"] also:^(NSNumber *it) { | ||||||
|             gravity = (DoricGravity) [it integerValue]; |             gravity = (DoricGravity) [it integerValue]; | ||||||
|         }]; |         }]; | ||||||
|         showToast(dic[@"msg"], gravity); |         ShowToast(dic[@"msg"], gravity); | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|   | |||||||
							
								
								
									
										26
									
								
								iOS/Pod/Classes/Plugin/DoricNavBarPlugin.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								iOS/Pod/Classes/Plugin/DoricNavBarPlugin.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright [2019] [Doric.Pub] | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  * http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | // | ||||||
|  | // Created by pengfei.zhou on 2019/11/25. | ||||||
|  | // | ||||||
|  |  | ||||||
|  | #import <Foundation/Foundation.h> | ||||||
|  |  | ||||||
|  | #import "DoricNativePlugin.h" | ||||||
|  |  | ||||||
|  | @interface DoricNavBarPlugin : DoricNativePlugin | ||||||
|  |  | ||||||
|  | @end | ||||||
							
								
								
									
										68
									
								
								iOS/Pod/Classes/Plugin/DoricNavBarPlugin.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								iOS/Pod/Classes/Plugin/DoricNavBarPlugin.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright [2019] [Doric.Pub] | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  * http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | // | ||||||
|  | // Created by pengfei.zhou on 2019/11/25. | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | #import "DoricNavBarPlugin.h" | ||||||
|  | #import "DoricUtil.h" | ||||||
|  | 
 | ||||||
|  | @implementation DoricNavBarPlugin | ||||||
|  | - (void)isHidden:(NSDictionary *)param withPromise:(DoricPromise *)promise { | ||||||
|  |     if (self.doricContext.navBar) { | ||||||
|  |         dispatch_async(dispatch_get_main_queue(), ^{ | ||||||
|  |             [promise resolve:@([self.doricContext.navBar doric_navBar_isHidden])]; | ||||||
|  |         }); | ||||||
|  |     } else { | ||||||
|  |         [promise reject:@"Not implement NavBar"]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)setHidden:(NSDictionary *)param withPromise:(DoricPromise *)promise { | ||||||
|  |     if (self.doricContext.navBar) { | ||||||
|  |         dispatch_async(dispatch_get_main_queue(), ^{ | ||||||
|  |             [self.doricContext.navBar doric_navBar_setHidden:[param[@"hidden"] boolValue]]; | ||||||
|  |             [promise resolve:nil]; | ||||||
|  |         }); | ||||||
|  |     } else { | ||||||
|  |         [promise reject:@"Not implement NavBar"]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)setTitle:(NSDictionary *)param withPromise:(DoricPromise *)promise { | ||||||
|  |     if (self.doricContext.navBar) { | ||||||
|  |         dispatch_async(dispatch_get_main_queue(), ^{ | ||||||
|  |             [self.doricContext.navBar doric_navBar_setTitle:param[@"title"]]; | ||||||
|  |             [promise resolve:nil]; | ||||||
|  |         }); | ||||||
|  |     } else { | ||||||
|  |         [promise reject:@"Not implement NavBar"]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | - (void)setBgColor:(NSDictionary *)param withPromise:(DoricPromise *)promise { | ||||||
|  |     if (self.doricContext.navBar) { | ||||||
|  |         dispatch_async(dispatch_get_main_queue(), ^{ | ||||||
|  |             UIColor *color = DoricColor(param[@"color"]); | ||||||
|  |             [self.doricContext.navBar doric_navBar_setBackgroundColor:color]; | ||||||
|  |             [promise resolve:nil]; | ||||||
|  |         }); | ||||||
|  |     } else { | ||||||
|  |         [promise reject:@"Not implement NavBar"]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @end | ||||||
| @@ -27,7 +27,7 @@ - (void)push:(NSDictionary *)params { | |||||||
|         if (params[@"animated"]) { |         if (params[@"animated"]) { | ||||||
|             animated = [params[@"animated"] boolValue]; |             animated = [params[@"animated"] boolValue]; | ||||||
|         } |         } | ||||||
|         [self.doricContext.navigator push:params[@"scheme"] alias:params[@"alias"] animated:animated]; |         [self.doricContext.navigator doric_navigator_push:params[@"scheme"] alias:params[@"alias"] animated:animated]; | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @@ -37,7 +37,7 @@ - (void)pop:(NSDictionary *)params { | |||||||
|         if (params[@"animated"]) { |         if (params[@"animated"]) { | ||||||
|             animated = [params[@"animated"] boolValue]; |             animated = [params[@"animated"] boolValue]; | ||||||
|         } |         } | ||||||
|         [self.doricContext.navigator pop:animated]; |         [self.doricContext.navigator doric_navigator_pop:animated]; | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
| @end | @end | ||||||
| @@ -23,6 +23,7 @@ | |||||||
| #import "DoricShaderPlugin.h" | #import "DoricShaderPlugin.h" | ||||||
| #import "DoricRootNode.h" | #import "DoricRootNode.h" | ||||||
| #import "DoricUtil.h" | #import "DoricUtil.h" | ||||||
|  | #import "Doric.h" | ||||||
| 
 | 
 | ||||||
| #import <JavaScriptCore/JavaScriptCore.h> | #import <JavaScriptCore/JavaScriptCore.h> | ||||||
| 
 | 
 | ||||||
| @@ -31,13 +32,16 @@ | |||||||
| @implementation DoricShaderPlugin | @implementation DoricShaderPlugin | ||||||
| 
 | 
 | ||||||
| - (void)render:(NSDictionary *)argument { | - (void)render:(NSDictionary *)argument { | ||||||
|     if(!argument) { |     if (!argument) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     __weak typeof(self) _self = self; |     __weak typeof(self) _self = self; | ||||||
|     dispatch_async(dispatch_get_main_queue(), ^{ |     dispatch_async(dispatch_get_main_queue(), ^{ | ||||||
|         __strong typeof(_self) self = _self; |         __strong typeof(_self) self = _self; | ||||||
|         [self.doricContext.rootNode render:argument[@"props"]]; |         [self.doricContext.rootNode also:^(DoricRootNode *it) { | ||||||
|  |             it.viewId = argument[@"id"]; | ||||||
|  |             [it render:argument[@"props"]]; | ||||||
|  |         }]; | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -192,7 +192,7 @@ - (void)onClick:(UIView *)view { | |||||||
|     do { |     do { | ||||||
|         [ret addObject:node.viewId]; |         [ret addObject:node.viewId]; | ||||||
|         node = node.superNode; |         node = node.superNode; | ||||||
|     } while (node && ![node isKindOfClass:[DoricRootNode class]]); |     } while (node); | ||||||
| 
 | 
 | ||||||
|     return [[ret reverseObjectEnumerator] allObjects]; |     return [[ret reverseObjectEnumerator] allObjects]; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -37,4 +37,6 @@ NSBundle *_Nonnull DoricBundle(void); | |||||||
| #define DC_UNLOCK(lock) dispatch_semaphore_signal(lock); | #define DC_UNLOCK(lock) dispatch_semaphore_signal(lock); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| void showToast(NSString *_Nonnull text, DoricGravity gravity); | void ShowToast(NSString *_Nonnull text, DoricGravity gravity); | ||||||
|  |  | ||||||
|  | UIImage *_Nonnull UIImageWithColor(UIColor *color); | ||||||
| @@ -48,7 +48,7 @@ void DoricLog(NSString *_Nonnull format, ...) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void showToast(NSString *text, DoricGravity gravity) { | void ShowToast(NSString *text, DoricGravity gravity) { | ||||||
|     UIView *superView = [UIApplication sharedApplication].windows.lastObject; |     UIView *superView = [UIApplication sharedApplication].windows.lastObject; | ||||||
|     UILabel *label = [[UILabel alloc] init]; |     UILabel *label = [[UILabel alloc] init]; | ||||||
|     label.font = [UIFont systemFontOfSize:20.f]; |     label.font = [UIFont systemFontOfSize:20.f]; | ||||||
| @@ -75,3 +75,14 @@ void showToast(NSString *text, DoricGravity gravity) { | |||||||
|         [label removeFromSuperview]; |         [label removeFromSuperview]; | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | UIImage *UIImageWithColor(UIColor *color) { | ||||||
|  |     CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); | ||||||
|  |     UIGraphicsBeginImageContext(rect.size); | ||||||
|  |     CGContextRef context = UIGraphicsGetCurrentContext(); | ||||||
|  |     CGContextSetFillColorWithColor(context, [color CGColor]); | ||||||
|  |     CGContextFillRect(context, rect); | ||||||
|  |     UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); | ||||||
|  |     UIGraphicsEndImageContext(); | ||||||
|  |     return image; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -42,6 +42,11 @@ export abstract class Panel { | |||||||
|  |  | ||||||
|     private __data__: any |     private __data__: any | ||||||
|     private __root__ = new Root |     private __root__ = new Root | ||||||
|  |     private headviews: Map<string, View> = new Map | ||||||
|  |  | ||||||
|  |     addHeadView(v: View) { | ||||||
|  |         this.headviews.set(v.viewId, v) | ||||||
|  |     } | ||||||
|  |  | ||||||
|     getRootView() { |     getRootView() { | ||||||
|         return this.__root__ |         return this.__root__ | ||||||
| @@ -50,6 +55,9 @@ export abstract class Panel { | |||||||
|     getInitData() { |     getInitData() { | ||||||
|         return this.__data__ |         return this.__data__ | ||||||
|     } |     } | ||||||
|  |     constructor() { | ||||||
|  |         this.addHeadView(this.__root__) | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @NativeCall |     @NativeCall | ||||||
|     private __init__(frame: Frame, data: any) { |     private __init__(frame: Frame, data: any) { | ||||||
| @@ -90,21 +98,26 @@ export abstract class Panel { | |||||||
|         const v = this.retrospectView(viewIds) |         const v = this.retrospectView(viewIds) | ||||||
|         if (v === undefined) { |         if (v === undefined) { | ||||||
|             loge(`Cannot find view for ${viewIds}`) |             loge(`Cannot find view for ${viewIds}`) | ||||||
|  |         } else { | ||||||
|  |             const argumentsList: any = [callbackId] | ||||||
|  |             for (let i = 2; i < arguments.length; i++) { | ||||||
|  |                 argumentsList.push(arguments[i]) | ||||||
|  |             } | ||||||
|  |             return Reflect.apply(v.responseCallback, v, argumentsList) | ||||||
|         } |         } | ||||||
|         const argumentsList: any = [callbackId] |  | ||||||
|         for (let i = 2; i < arguments.length; i++) { |  | ||||||
|             argumentsList.push(arguments[i]) |  | ||||||
|         } |  | ||||||
|         return Reflect.apply(v.responseCallback, v, argumentsList) |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private retrospectView(ids: string[]): View { |     private retrospectView(ids: string[]): View | undefined { | ||||||
|         return ids.reduce((acc: View, cur) => { |         return ids.reduce((acc: View | undefined, cur) => { | ||||||
|             if (Reflect.has(acc, "subviewById")) { |             if (acc === undefined) { | ||||||
|                 return Reflect.apply(Reflect.get(acc, "subviewById"), acc, [cur]) |                 return this.headviews.get(cur) | ||||||
|  |             } else { | ||||||
|  |                 if (Reflect.has(acc, "subviewById")) { | ||||||
|  |                     return Reflect.apply(Reflect.get(acc, "subviewById"), acc, [cur]) | ||||||
|  |                 } | ||||||
|  |                 return acc | ||||||
|             } |             } | ||||||
|             return acc |         }, undefined) | ||||||
|         }, this.__root__) |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private nativeRender(model: Model) { |     private nativeRender(model: Model) { | ||||||
|   | |||||||
| @@ -15,6 +15,8 @@ | |||||||
|  */ |  */ | ||||||
| import { BridgeContext } from "../runtime/global"; | import { BridgeContext } from "../runtime/global"; | ||||||
| import { Gravity } from "./gravity"; | import { Gravity } from "./gravity"; | ||||||
|  | import { Panel } from "../ui/panel"; | ||||||
|  | import { Color } from "./color"; | ||||||
|  |  | ||||||
| export function modal(context: BridgeContext) { | export function modal(context: BridgeContext) { | ||||||
|     return { |     return { | ||||||
| @@ -180,3 +182,32 @@ export function navigator(context: BridgeContext) { | |||||||
|         }, |         }, | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export function navbar(context: BridgeContext) { | ||||||
|  |     const entity = context.entity | ||||||
|  |     let panel: Panel | undefined = undefined | ||||||
|  |     if (entity instanceof Panel) { | ||||||
|  |         panel = entity | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return { | ||||||
|  |         isHidden: () => { | ||||||
|  |             return context.navbar.isHidden() as Promise<boolean> | ||||||
|  |         }, | ||||||
|  |         setHidden: (hidden: boolean) => { | ||||||
|  |             return context.navbar.setHidden({ | ||||||
|  |                 hidden, | ||||||
|  |             }) | ||||||
|  |         }, | ||||||
|  |         setTitle: (title: string) => { | ||||||
|  |             return context.navbar.setTitle({ | ||||||
|  |                 title, | ||||||
|  |             }) | ||||||
|  |         }, | ||||||
|  |         setBgColor: (color: Color) => { | ||||||
|  |             return context.navbar.setBgColor({ | ||||||
|  |                 color: color.toModel(), | ||||||
|  |             }) | ||||||
|  |         }, | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user