mirror of
https://github.com/Dark98/SliceBeam.git
synced 2026-07-07 16:59:05 +00:00
Display web pannel if configured
This commit is contained in:
@@ -1,13 +1,16 @@
|
|||||||
package ru.ytkab0bp.slicebeam.fragment;
|
package ru.ytkab0bp.slicebeam.fragment;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.webkit.WebView;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
@@ -33,6 +36,7 @@ import ru.ytkab0bp.slicebeam.components.bed_menu.FileMenu;
|
|||||||
import ru.ytkab0bp.slicebeam.components.bed_menu.OrientationMenu;
|
import ru.ytkab0bp.slicebeam.components.bed_menu.OrientationMenu;
|
||||||
import ru.ytkab0bp.slicebeam.components.bed_menu.SliceMenu;
|
import ru.ytkab0bp.slicebeam.components.bed_menu.SliceMenu;
|
||||||
import ru.ytkab0bp.slicebeam.components.bed_menu.TransformMenu;
|
import ru.ytkab0bp.slicebeam.components.bed_menu.TransformMenu;
|
||||||
|
import ru.ytkab0bp.slicebeam.config.ConfigObject;
|
||||||
import ru.ytkab0bp.slicebeam.events.NeedSnackbarEvent;
|
import ru.ytkab0bp.slicebeam.events.NeedSnackbarEvent;
|
||||||
import ru.ytkab0bp.slicebeam.events.SlicingProgressEvent;
|
import ru.ytkab0bp.slicebeam.events.SlicingProgressEvent;
|
||||||
import ru.ytkab0bp.slicebeam.navigation.Fragment;
|
import ru.ytkab0bp.slicebeam.navigation.Fragment;
|
||||||
@@ -43,6 +47,7 @@ import ru.ytkab0bp.slicebeam.slic3r.Slic3rRuntimeError;
|
|||||||
import ru.ytkab0bp.slicebeam.theme.ThemesRepo;
|
import ru.ytkab0bp.slicebeam.theme.ThemesRepo;
|
||||||
import ru.ytkab0bp.slicebeam.utils.Vec3d;
|
import ru.ytkab0bp.slicebeam.utils.Vec3d;
|
||||||
import ru.ytkab0bp.slicebeam.utils.ViewUtils;
|
import ru.ytkab0bp.slicebeam.utils.ViewUtils;
|
||||||
|
import ru.ytkab0bp.slicebeam.view.BedSwipeDownLayout;
|
||||||
import ru.ytkab0bp.slicebeam.view.DividerView;
|
import ru.ytkab0bp.slicebeam.view.DividerView;
|
||||||
import ru.ytkab0bp.slicebeam.view.GLView;
|
import ru.ytkab0bp.slicebeam.view.GLView;
|
||||||
import ru.ytkab0bp.slicebeam.view.ThemeBottomNavigationView;
|
import ru.ytkab0bp.slicebeam.view.ThemeBottomNavigationView;
|
||||||
@@ -97,6 +102,9 @@ public class BedFragment extends Fragment {
|
|||||||
private GCodeProcessorResult gCodeResult;
|
private GCodeProcessorResult gCodeResult;
|
||||||
private UnfoldMenu currentUnfoldMenu;
|
private UnfoldMenu currentUnfoldMenu;
|
||||||
|
|
||||||
|
private BedSwipeDownLayout swipeDownLayout;
|
||||||
|
private WebView panelWebView;
|
||||||
|
|
||||||
private static String tempFileName;
|
private static String tempFileName;
|
||||||
private static File tempExportingFile;
|
private static File tempExportingFile;
|
||||||
|
|
||||||
@@ -158,6 +166,9 @@ public class BedFragment extends Fragment {
|
|||||||
currentUnfoldMenu.dismiss();
|
currentUnfoldMenu.dismiss();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (swipeDownLayout.onBackPressed()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (currentMenuSlot != 0) {
|
if (currentMenuSlot != 0) {
|
||||||
navigationView.setSelectedItemId(0);
|
navigationView.setSelectedItemId(0);
|
||||||
return true;
|
return true;
|
||||||
@@ -191,6 +202,24 @@ public class BedFragment extends Fragment {
|
|||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
glView.onResume();
|
glView.onResume();
|
||||||
|
ConfigObject cfg = SliceBeam.CONFIG.findPrinter(SliceBeam.CONFIG.presets.get("printer"));
|
||||||
|
boolean enable = cfg != null && cfg.get("host_type") != null && !TextUtils.isEmpty(cfg.get("print_host"));
|
||||||
|
swipeDownLayout.setEnableTop(enable);
|
||||||
|
if (enable) {
|
||||||
|
String host = cfg.get("print_host");
|
||||||
|
if (host.contains(":")) {
|
||||||
|
try {
|
||||||
|
int port = Integer.parseInt(host.split(":")[1]);
|
||||||
|
if (port >= 7125 && port <= 7200) {
|
||||||
|
host = host.split(":")[0];
|
||||||
|
}
|
||||||
|
} catch (Exception ignored) {}
|
||||||
|
}
|
||||||
|
if (!host.startsWith("http://")) {
|
||||||
|
host = "http://" + host;
|
||||||
|
}
|
||||||
|
panelWebView.loadUrl(host);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -199,6 +228,7 @@ public class BedFragment extends Fragment {
|
|||||||
glView.onPause();
|
glView.onPause();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetJavaScriptEnabled")
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(Context ctx) {
|
public View onCreateView(Context ctx) {
|
||||||
glView = new GLView(ctx);
|
glView = new GLView(ctx);
|
||||||
@@ -229,7 +259,23 @@ public class BedFragment extends Fragment {
|
|||||||
ll.addView(menuView, new LinearLayout.LayoutParams(ViewUtils.dp(MENU_SIZE_DP), ViewGroup.LayoutParams.MATCH_PARENT));
|
ll.addView(menuView, new LinearLayout.LayoutParams(ViewUtils.dp(MENU_SIZE_DP), ViewGroup.LayoutParams.MATCH_PARENT));
|
||||||
}
|
}
|
||||||
|
|
||||||
ll.addView(glView, new LinearLayout.LayoutParams(portrait ? ViewGroup.LayoutParams.MATCH_PARENT : 0, portrait ? 0 : ViewGroup.LayoutParams.MATCH_PARENT, 1f));
|
swipeDownLayout = new BedSwipeDownLayout(ctx);
|
||||||
|
panelWebView = new WebView(ctx);
|
||||||
|
panelWebView.getSettings().setJavaScriptEnabled(true);
|
||||||
|
|
||||||
|
if (portrait) {
|
||||||
|
LinearLayout inner = new LinearLayout(ctx);
|
||||||
|
inner.setOrientation(LinearLayout.VERTICAL);
|
||||||
|
ll = inner;
|
||||||
|
|
||||||
|
inner.addView(glView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f));
|
||||||
|
swipeDownLayout.addView(inner);
|
||||||
|
swipeDownLayout.addView(panelWebView);
|
||||||
|
} else {
|
||||||
|
swipeDownLayout.addView(glView);
|
||||||
|
swipeDownLayout.addView(panelWebView);
|
||||||
|
ll.addView(swipeDownLayout, new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1f));
|
||||||
|
}
|
||||||
|
|
||||||
if (portrait) {
|
if (portrait) {
|
||||||
ll.addView(menuView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewUtils.dp(MENU_SIZE_DP)));
|
ll.addView(menuView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewUtils.dp(MENU_SIZE_DP)));
|
||||||
@@ -328,7 +374,11 @@ public class BedFragment extends Fragment {
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (portrait) {
|
||||||
|
overlayLayout.addView(contentView = swipeDownLayout);
|
||||||
|
} else {
|
||||||
overlayLayout.addView(contentView = ll);
|
overlayLayout.addView(contentView = ll);
|
||||||
|
}
|
||||||
overlayLayout.addView(snackbarsLayout = new CoordinatorLayout(ctx), new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) {{
|
overlayLayout.addView(snackbarsLayout = new CoordinatorLayout(ctx), new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) {{
|
||||||
if (portrait) {
|
if (portrait) {
|
||||||
bottomMargin = ViewUtils.dp(80 * 2);
|
bottomMargin = ViewUtils.dp(80 * 2);
|
||||||
|
|||||||
@@ -0,0 +1,241 @@
|
|||||||
|
package ru.ytkab0bp.slicebeam.view;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.CornerPathEffect;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.Path;
|
||||||
|
import android.view.GestureDetector;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.core.graphics.ColorUtils;
|
||||||
|
import androidx.core.math.MathUtils;
|
||||||
|
import androidx.dynamicanimation.animation.FloatValueHolder;
|
||||||
|
import androidx.dynamicanimation.animation.SpringAnimation;
|
||||||
|
import androidx.dynamicanimation.animation.SpringForce;
|
||||||
|
|
||||||
|
import ru.ytkab0bp.slicebeam.theme.IThemeView;
|
||||||
|
import ru.ytkab0bp.slicebeam.theme.ThemesRepo;
|
||||||
|
import ru.ytkab0bp.slicebeam.utils.ViewUtils;
|
||||||
|
|
||||||
|
public class BedSwipeDownLayout extends FrameLayout implements IThemeView {
|
||||||
|
private final static int TOP_MARGIN_DP = 28;
|
||||||
|
private final static int ARROW_LENGTH_DP = 11;
|
||||||
|
|
||||||
|
private Path path = new Path();
|
||||||
|
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
|
private Paint dimmPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||||
|
|
||||||
|
private float progress = 0;
|
||||||
|
private boolean openEnabled = true;
|
||||||
|
|
||||||
|
private boolean processingSwipe;
|
||||||
|
private SpringAnimation springAnimation;
|
||||||
|
private float startProgress;
|
||||||
|
private GestureDetector gestureDetector;
|
||||||
|
|
||||||
|
public BedSwipeDownLayout(@NonNull Context context) {
|
||||||
|
super(context);
|
||||||
|
|
||||||
|
paint.setStyle(Paint.Style.STROKE);
|
||||||
|
paint.setStrokeWidth(ViewUtils.dp(3));
|
||||||
|
paint.setStrokeCap(Paint.Cap.ROUND);
|
||||||
|
paint.setPathEffect(new CornerPathEffect(ViewUtils.dp(6)));
|
||||||
|
|
||||||
|
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onDown(@NonNull MotionEvent e) {
|
||||||
|
if (springAnimation != null) return false;
|
||||||
|
|
||||||
|
processingSwipe = true;
|
||||||
|
startProgress = progress;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onSingleTapUp(@NonNull MotionEvent e) {
|
||||||
|
if (springAnimation != null) return false;
|
||||||
|
|
||||||
|
animateTo(1f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onScroll(@Nullable MotionEvent e1, @NonNull MotionEvent e2, float distanceX, float distanceY) {
|
||||||
|
if (springAnimation != null) return false;
|
||||||
|
|
||||||
|
if (processingSwipe) {
|
||||||
|
progress = MathUtils.clamp(startProgress + (e2.getY() - e1.getY()) / getHeight(), 0, 1);
|
||||||
|
invalidateTranslation();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onFling(@Nullable MotionEvent e1, @NonNull MotionEvent e2, float velocityX, float velocityY) {
|
||||||
|
if (springAnimation != null) return false;
|
||||||
|
|
||||||
|
if (velocityY >= 1500) {
|
||||||
|
animateTo(1f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
setWillNotDraw(false);
|
||||||
|
onApplyTheme();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onBackPressed() {
|
||||||
|
if (springAnimation != null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (progress == 1f) {
|
||||||
|
animateTo(0f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean dispatchTouchEvent(MotionEvent ev) {
|
||||||
|
if (openEnabled) {
|
||||||
|
if (processingSwipe) {
|
||||||
|
boolean d = gestureDetector.onTouchEvent(ev);
|
||||||
|
if (ev.getActionMasked() == MotionEvent.ACTION_UP || ev.getActionMasked() == MotionEvent.ACTION_CANCEL) {
|
||||||
|
processingSwipe = false;
|
||||||
|
|
||||||
|
if (springAnimation == null && progress != 0 && progress != 1) {
|
||||||
|
animateTo(progress > 0.5f ? 1f : 0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progress != 1f && springAnimation == null) {
|
||||||
|
if (ev.getY() < ViewUtils.dp(TOP_MARGIN_DP) + getHeight() * progress) {
|
||||||
|
return gestureDetector.onTouchEvent(ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.dispatchTouchEvent(ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean drawChild(@NonNull Canvas canvas, View child, long drawingTime) {
|
||||||
|
int i = indexOfChild(child);
|
||||||
|
canvas.save();
|
||||||
|
float tY = -getHeight() * (1f - progress);
|
||||||
|
if (openEnabled && i != 0) {
|
||||||
|
int clr = ThemesRepo.getColor(android.R.attr.windowBackground);
|
||||||
|
dimmPaint.setColor(clr);
|
||||||
|
canvas.drawRect(0, child.getTop() + tY, child.getWidth(), child.getTop() + tY + child.getHeight(), dimmPaint);
|
||||||
|
canvas.clipRect(0, child.getTop() + tY, child.getWidth(), child.getTop() + tY + child.getHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean ch = super.drawChild(canvas, child, drawingTime);
|
||||||
|
if (openEnabled) {
|
||||||
|
if (i == 0) {
|
||||||
|
dimmPaint.setColor(Color.argb((int) (0x66 * progress), 0, 0, 0));
|
||||||
|
canvas.drawPaint(dimmPaint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
canvas.restore();
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(@NonNull Canvas canvas) {
|
||||||
|
super.draw(canvas);
|
||||||
|
|
||||||
|
if (openEnabled) {
|
||||||
|
path.rewind();
|
||||||
|
float cx = getWidth() * 0.5f, cy = ViewUtils.dp(TOP_MARGIN_DP) * 0.5f + getHeight() * progress;
|
||||||
|
float angle = (float) Math.toRadians(25) * (1f - Math.min(progress, 0.5f) / 0.5f);
|
||||||
|
int len = ViewUtils.dp(ARROW_LENGTH_DP);
|
||||||
|
path.moveTo(cx, cy);
|
||||||
|
path.lineTo((float) (cx - Math.cos(angle) * len), (float) (cy - Math.sin(angle) * len));
|
||||||
|
path.moveTo(cx, cy);
|
||||||
|
path.lineTo((float) (cx + Math.cos(angle) * len), (float) (cy - Math.sin(angle) * len));
|
||||||
|
canvas.drawPath(path, paint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void animateTo(float to) {
|
||||||
|
springAnimation = new SpringAnimation(new FloatValueHolder(progress))
|
||||||
|
.setMinimumVisibleChange(1 / 500f)
|
||||||
|
.setSpring(new SpringForce(to)
|
||||||
|
.setStiffness(600f)
|
||||||
|
.setDampingRatio(1f))
|
||||||
|
.addUpdateListener((animation, value, velocity) -> {
|
||||||
|
progress = value;
|
||||||
|
invalidateTranslation();
|
||||||
|
})
|
||||||
|
.addEndListener((animation, canceled, value, velocity) -> {
|
||||||
|
springAnimation = null;
|
||||||
|
processingSwipe = false;
|
||||||
|
});
|
||||||
|
springAnimation.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void invalidateTranslation() {
|
||||||
|
if (getChildCount() > 0) {
|
||||||
|
getChildAt(0).setTranslationY(getHeight() * progress * 0.25f);
|
||||||
|
for (int i = 1; i < getChildCount(); i++) {
|
||||||
|
View ch = getChildAt(i);
|
||||||
|
ch.setTranslationY(-getHeight() * (1f - progress) * 0.75f);
|
||||||
|
ch.setAlpha(progress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnableTop(boolean enable) {
|
||||||
|
if (enable == openEnabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
openEnabled = enable;
|
||||||
|
requestLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
|
int width = MeasureSpec.getSize(widthMeasureSpec), height = MeasureSpec.getSize(heightMeasureSpec);
|
||||||
|
setMeasuredDimension(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
|
||||||
|
|
||||||
|
if (getChildCount() > 0) {
|
||||||
|
getChildAt(0).measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height - ViewUtils.dp(TOP_MARGIN_DP) * (openEnabled ? 1 : 0), MeasureSpec.EXACTLY));
|
||||||
|
for (int i = 1; i < getChildCount(); i++) {
|
||||||
|
getChildAt(i).measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||||
|
super.onLayout(changed, left, top, right, bottom);
|
||||||
|
|
||||||
|
if (openEnabled && getChildCount() > 0) {
|
||||||
|
View first = getChildAt(0);
|
||||||
|
first.layout(0, ViewUtils.dp(TOP_MARGIN_DP), first.getMeasuredWidth(), ViewUtils.dp(TOP_MARGIN_DP) + first.getMeasuredHeight());
|
||||||
|
|
||||||
|
for (int i = 1; i < getChildCount(); i++) {
|
||||||
|
View ch = getChildAt(i);
|
||||||
|
ch.layout(0, 0, ch.getMeasuredWidth(), ch.getMeasuredHeight());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
invalidateTranslation();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onApplyTheme() {
|
||||||
|
paint.setColor(ColorUtils.setAlphaComponent(ThemesRepo.getColor(android.R.attr.colorControlHighlight), 0x44));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user