diff --git a/README.md b/README.md index 6930aa0..b5e46a1 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,8 @@ files.removeDir("/storage/emulated/0/Documents/SkyAutoPlayer/"); "bpm" : 320, //暂时没用 "suggested_instrument": 1, + //乐谱键位数(8键或15键) + "keyCount": 15, //乐谱音高 "pitchLevel": 0 } diff --git a/source/SkyAutoplayer.js b/source/SkyAutoplayer.js index 1baba1a..c43dee1 100644 --- a/source/SkyAutoplayer.js +++ b/source/SkyAutoplayer.js @@ -90,7 +90,7 @@ sheetmgr = { return resultList; }, - downloadAndLoad: function(file, author, listener) { + downloadAndLoad: function(file, extraData, listener) { listener({status:1}); config.fetchRepoFile("shared_sheets/" + file, null, function(body) { var sheet = files.join(sheetmgr.rootDir, files.getNameWithoutExtension(file) + (function(length) { @@ -105,7 +105,8 @@ sheetmgr = { files.write(sheet, parsed = (function() { var data = eval(body.string())[0]; listener({status:2}); - data.author = author; + data.author = extraData.author; + data.keyCount = extraData.keyCount; return "[" + JSON.stringify(data) + "]"; }()), sheetmgr.encoding); parsed = eval(parsed)[0]; @@ -220,6 +221,8 @@ sheetplayer = { currentNote: 0, playing: false, nextInterval: 0, + + keyCount: 15, speed: 1, current_speed_index: 9, @@ -261,11 +264,8 @@ sheetplayer = { run: function() { var gestureMap = []; sheetplayer.notes[sheetplayer.currentNote].keys.map(function(e, i) { - gestureMap.push([ - 0, 25, - [config.values.key_coordinates[e][0], config.values.key_coordinates[e][1]], - [config.values.key_coordinates[e][0], config.values.key_coordinates[e][1]] - ]); + var keyCoordinates = sheetplayer.keyCount == 15 ? [config.values.key_coordinates15[e][0], config.values.key_coordinates15[e][1]] : [config.values.key_coordinates8[e][0], config.values.key_coordinates8[e][1]]; + gestureMap.push([0, 25, keyCoordinates, keyCoordinates]); }); gestureMap = sheetplayer.toSource(gestureMap); eval("gestures(" + gestureMap.slice(1, gestureMap.length - 1) + ");"); @@ -319,6 +319,7 @@ sheetplayer = { this.pitch = j.pitchLevel; this.bpm = j.bpm; this.noteCount = this.notes.length; + this.keyCount = j.keyCount; }, toSource: function(obj) { @@ -344,16 +345,18 @@ config = { _global_storage: null, values: { - key_coordinates: [], + key_coordinates15: [], + key_coordinates8: [], skipRunScriptTip: false, skipOpenWindowTip: false, skipOpenPlayerPanelWindowTip: false, skipOnlineUploadTip: false, skipOnlineSharedSheetCTip: false, skipImportLocalSheetTip: false, + skipChangeKeyCountTip: false, showFailedSheets: true, tipOnAndroidR: true, - currentVersion: 14, + currentVersion: 15, gitVersion: "", }, @@ -362,13 +365,15 @@ config = { init: function() { this._global_storage = storages.create("StageGuard:SkyAutoPlayer:Config"); - this.values.key_coordinates = this._global_storage.get("key_coordinates", this.values.key_coordinates); + this.values.key_coordinates15 = this._global_storage.get("key_coordinates15", this.values.key_coordinates15); + this.values.key_coordinates8 = this._global_storage.get("key_coordinates8", this.values.key_coordinates8); this.values.skipRunScriptTip = this._global_storage.get("skip_run_script_tip", this.values.skipRunScriptTip); this.values.skipOpenWindowTip = this._global_storage.get("skip_open_window_tip", this.values.skipOpenWindowTip); this.values.skipOpenPlayerPanelWindowTip = this._global_storage.get("skip_open_player_panel_window_tip", this.values.skipOpenPlayerPanelWindowTip); this.values.skipOnlineUploadTip = this._global_storage.get("skip_online_upload_tip", this.values.skipOnlineUploadTip); this.values.skipOnlineSharedSheetCTip = this._global_storage.get("skip_shared_sheet_c_tip", this.values.skipOnlineSharedSheetCTip); this.values.skipImportLocalSheetTip = this._global_storage.get("skip_import_local_sheet_tip", this.values.skipImportLocalSheetTip); + this.values.skipChangeKeyCountTip = this._global_storage.get("skip_change_key_count_tip", this.values.skipChangeKeyCountTip); this.values.showFailedSheets = this._global_storage.get("show_failed_sheets", this.values.showFailedSheets); this.values.tipOnAndroidR = this._global_storage.get("tip_storage_on_android_r", this.values.tipOnAndroidR); @@ -755,273 +760,273 @@ gui = { dialogs: { showDialog: function(layout, width, height, onDismiss, canExit) { - var frame, trans, params; - frame = new android.widget.FrameLayout(ctx); - frame.setBackgroundColor(android.graphics.Color.argb(0x80, 0, 0, 0)); - frame.setOnTouchListener(new android.view.View.OnTouchListener({ - onTouch: function touch(v, e) { - try { - if (e.getAction() == e.ACTION_DOWN && canExit) { - frame.setEnabled(false); - frame.setClickable(false); - gui.utils.value_animation("Float", 1.0, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) { - frame.setAlpha(anim.getAnimatedValue()); - if(anim.getAnimatedValue() == 0) { - if(onDismiss != null) onDismiss(frame); - gui.winMgr.removeView(frame); - } - }); + var frame, trans, params; + frame = new android.widget.FrameLayout(ctx); + frame.setBackgroundColor(android.graphics.Color.argb(0x80, 0, 0, 0)); + frame.setOnTouchListener(new android.view.View.OnTouchListener({ + onTouch: function touch(v, e) { + try { + if (e.getAction() == e.ACTION_DOWN && canExit) { + frame.setEnabled(false); + frame.setClickable(false); + gui.utils.value_animation("Float", 1.0, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) { + frame.setAlpha(anim.getAnimatedValue()); + if(anim.getAnimatedValue() == 0) { + if(onDismiss != null) onDismiss(frame); + gui.winMgr.removeView(frame); } - return false; - } catch (e) { - error(e); - return false; - } + }); + } + return false; + } catch (e) { + error(e); + return false; + } + } + })); + layout.setLayoutParams(new android.widget.FrameLayout.LayoutParams(width, height, android.view.Gravity.CENTER)); + layout.getLayoutParams().setMargins(20 * dp, 20 * dp, 20 * dp, 20 * dp); + frame.addView(layout); + gui.utils.value_animation("Float", 0, 1, 75, new android.view.animation.DecelerateInterpolator(), function(anim) { + frame.setAlpha(anim.getAnimatedValue()); + }); + layout.setElevation(16 * dp); + params = new android.view.WindowManager.LayoutParams(); + params.type = android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + if(!canExit) params.flags = android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + params.format = android.graphics.PixelFormat.TRANSLUCENT; + params.width = -1; + params.height = -1; + gui.winMgr.addView(frame, params); + return frame; + }, + showProgressDialog: function self(f, isNoText, canExit) { + self.init = function(o) { + gui.run(function() { + try { + var layout = o.layout = new android.widget.LinearLayout(ctx); + layout.setOrientation(android.widget.LinearLayout.VERTICAL); + layout.setPadding(dp * 10, isNoText ? dp * 5 : dp * 10, dp * 10, isNoText ? dp * 5 : 0); + layout.setBackgroundColor(gui.config.colors.background); + if (!isNoText) { + var text = o.text = new android.widget.TextView(ctx); + text.setLayoutParams(new android.widget.FrameLayout.LayoutParams(-2, -2)); + text.setTextColor(gui.config.colors.text); + text.setPadding(dp * 10, dp * 10, dp * 10, dp * 10); + layout.addView(text); + } + var progress = o.progress = android.widget.ProgressBar(ctx, null, android.R.attr.progressBarStyleHorizontal); + layout.addView(progress); + o.popup = gui.dialogs.showDialog(layout, -2, -2, null, canExit); + } catch (e) { + error(e + " → " + e.lineNumber); + } + }) + }, self.controller = { + setText: function(s) { + if (isNoText) return; + var o = this; + gui.run(function() { + try { + o.text.setText(s); + } catch (e) { + error(e + " → " + e.lineNumber); } - })); - layout.setLayoutParams(new android.widget.FrameLayout.LayoutParams(width, height, android.view.Gravity.CENTER)); - layout.getLayoutParams().setMargins(20 * dp, 20 * dp, 20 * dp, 20 * dp); - frame.addView(layout); - gui.utils.value_animation("Float", 0, 1, 75, new android.view.animation.DecelerateInterpolator(), function(anim) { - frame.setAlpha(anim.getAnimatedValue()); }); - layout.setElevation(16 * dp); - params = new android.view.WindowManager.LayoutParams(); - params.type = android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; - if(!canExit) params.flags = android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - params.format = android.graphics.PixelFormat.TRANSLUCENT; - params.width = -1; - params.height = -1; - gui.winMgr.addView(frame, params); - return frame; }, - showProgressDialog: function self(f, isNoText, canExit) { - self.init = function(o) { - gui.run(function() { - try { - var layout = o.layout = new android.widget.LinearLayout(ctx); - layout.setOrientation(android.widget.LinearLayout.VERTICAL); - layout.setPadding(dp * 10, isNoText ? dp * 5 : dp * 10, dp * 10, isNoText ? dp * 5 : 0); - layout.setBackgroundColor(gui.config.colors.background); - if (!isNoText) { - var text = o.text = new android.widget.TextView(ctx); - text.setLayoutParams(new android.widget.FrameLayout.LayoutParams(-2, -2)); - text.setTextColor(gui.config.colors.text); - text.setPadding(dp * 10, dp * 10, dp * 10, dp * 10); - layout.addView(text); + setIndeterminate: function(b) { + var o = this; + gui.run(function() { + try { + o.progress.setIndeterminate(b); + } catch (e) { + error(e + " → " + e.lineNumber); + } + }); + }, + setMax: function(max) { + var o = this; + gui.run(function() { + try { + o.progress.setMax(max); + } catch (e) { + error(e + " → " + e.lineNumber); + } + }); + }, + setProgress: function(prog) { + var o = this; + gui.run(function() { + try { + if (!o.progress.isIndeterminate()) { + o.progress.setProgress(prog, true); + } + } catch (e) { + error(e + " → " + e.lineNumber); + } + }); + }, + close: function() { + var o = this; + gui.run(function() { + try { + gui.utils.value_animation("Float", 1, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) { + o.popup.setAlpha(anim.getAnimatedValue()); + if(anim.getAnimatedValue() == 1) gui.winMgr.removeView(o.popup); + }); + } catch (e) { + error(e + " → " + e.lineNumber); + } + }); + }, + async: function(f) { + var o = this; + var t = threads.start(function() { + try { + f(o); + } catch (e) { + error(e + " → " + e.lineNumber); + } + }); + } + }; + var o = Object.create(self.controller); + self.init(o); + if (f) o.async(f); + return o; + }, + showConfirmDialog: function(s) { + gui.run(function() { + try { + var scr, layout, title, text, skip, onClick, dialog; + scr = new android.widget.ScrollView(ctx); + scr.setBackgroundColor(gui.config.colors.background); + layout = new android.widget.LinearLayout(ctx); + layout.setLayoutParams(new android.widget.FrameLayout.LayoutParams(-2, -2)); + layout.setOrientation(android.widget.LinearLayout.VERTICAL); + layout.setPadding(15 * dp, 15 * dp, 15 * dp, 5 * dp); + if (s.title) { + title = new android.widget.TextView(ctx); + title.setText(s.title); + title.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2)); + title.setPadding(0, 0, 0, 10 * dp); + title.setTextColor(gui.config.colors.text); + title.setTextSize(16); + layout.addView(title); + } + if (s.text) { + text = new android.widget.TextView(ctx); + text.setText(s.text); + text.setPadding(0, 0, 0, 10 * dp); + text.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2)); + text.setTextColor(gui.config.colors.sec_text); + text.setTextSize(14); + layout.addView(text); + } + if (s.skip) { + skip = new android.widget.CheckBox(ctx); + //skip.setChecked(Boolean(s.canSkip)); + skip.setLayoutParams(android.widget.LinearLayout.LayoutParams(-2, -2, 0)); + skip.getLayoutParams().setMargins(0, 0, 0, 10 * dp) + skip.setText("不再提示"); + skip.setTextColor(gui.config.colors.sec_text) + layout.addView(skip); + } + onClick = function(i) { + if (s.skip) s.skip(skip.isChecked()); + if (s.callback && s.callback(i)) return; + } + var closed = false; + s.buttons.map(function(e, i) { + var b = android.widget.TextView(ctx); + b.setId(i); + b.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, -2)); + b.setText(String(e)); + b.setGravity(android.view.Gravity.CENTER); + b.setPadding(10 * dp, 10 * dp, 10 * dp, 10 * dp); + b.setTextColor(gui.config.colors.text); + b.setTextSize(14); + b.measure(0, 0); + b.setBackgroundDrawable(gui.utils.ripple_drawable(b.getMeasuredWidth(), b.getMeasuredHeight(), "rect")); + b.setOnClickListener(new android.view.View.OnClickListener({ + onClick: function f(v) { + try {if(closed != true) { + onClick(v.getId()); + closed = true; + gui.winMgr.removeView(dialog); + return true; + }} catch (e) { + error(e + " → " + e.lineNumber); } - var progress = o.progress = android.widget.ProgressBar(ctx, null, android.R.attr.progressBarStyleHorizontal); - layout.addView(progress); - o.popup = gui.dialogs.showDialog(layout, -2, -2, null, canExit); + } + })); + layout.addView(b); + return b; + }); + scr.addView(layout); + dialog = gui.dialogs.showDialog(scr, -2, -2, null, (s.canExit != true ? false : true)); + } catch (e) { + error(e + " → " + e.lineNumber); + } + }) + }, + showOperateDialog: function self(s, callback, canExit) { + gui.run(function() { + try { + var frame, list, dialog; + if (!self.adapter) { + self.adapter = function(e) { + e.view = new android.widget.LinearLayout(ctx); + e.view.setOrientation(android.widget.LinearLayout.VERTICAL); + e.view.setPadding(15 * dp, 15 * dp, 15 * dp, 15 * dp); + e.view.setLayoutParams(new android.widget.AbsListView.LayoutParams(-1, -2)); + e._title = new android.widget.TextView(ctx); + e._title.setText(e.text); + e._title.setGravity(android.view.Gravity.CENTER | android.view.Gravity.LEFT); + e._title.setFocusable(false); + e._title.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, -2)); + e._title.setTextSize(16); + e._title.setTextColor(gui.config.colors.text); + e.view.addView(e._title); + if (e.description) { + e._description = new android.widget.TextView(ctx); + e._description.setText(e.description); + e._description.setPadding(0, 3 * dp, 0, 0); + e._description.setLayoutParams(android.widget.LinearLayout.LayoutParams(-1, -2)); + e._description.setTextSize(14); + e._description.setTextColor(gui.config.colors.sec_text); + e.view.addView(e._description); + } + return e.view; + } + } + frame = new android.widget.FrameLayout(ctx); + frame.setPadding(5 * dp, 5 * dp, 5 * dp, 5 * dp); + frame.setBackgroundColor(gui.config.colors.background); + list = new android.widget.ListView(ctx); + list.setLayoutParams(new android.widget.FrameLayout.LayoutParams(-1, -2)); + list.setDividerHeight(0); + list.setAdapter(new RhinoListAdapter(s, self.adapter)); + list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener({ + onItemClick: function(parent, view, pos, id) { + try { + if (callback && !callback(pos, s[pos])) gui.utils.value_animation("Float", 1, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) { + dialog.setAlpha(anim.getAnimatedValue()); + if(anim.getAnimatedValue() == 1) gui.winMgr.removeView(dialog); + }); + return true; } catch (e) { error(e + " → " + e.lineNumber); } - }) - }, self.controller = { - setText: function(s) { - if (isNoText) return; - var o = this; - gui.run(function() { - try { - o.text.setText(s); - } catch (e) { - error(e + " → " + e.lineNumber); - } - }); - }, - setIndeterminate: function(b) { - var o = this; - gui.run(function() { - try { - o.progress.setIndeterminate(b); - } catch (e) { - error(e + " → " + e.lineNumber); - } - }); - }, - setMax: function(max) { - var o = this; - gui.run(function() { - try { - o.progress.setMax(max); - } catch (e) { - error(e + " → " + e.lineNumber); - } - }); - }, - setProgress: function(prog) { - var o = this; - gui.run(function() { - try { - if (!o.progress.isIndeterminate()) { - o.progress.setProgress(prog, true); - } - } catch (e) { - error(e + " → " + e.lineNumber); - } - }); - }, - close: function() { - var o = this; - gui.run(function() { - try { - gui.utils.value_animation("Float", 1, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) { - o.popup.setAlpha(anim.getAnimatedValue()); - if(anim.getAnimatedValue() == 1) gui.winMgr.removeView(o.popup); - }); - } catch (e) { - error(e + " → " + e.lineNumber); - } - }); - }, - async: function(f) { - var o = this; - var t = threads.start(function() { - try { - f(o); - } catch (e) { - error(e + " → " + e.lineNumber); - } - }); } - }; - var o = Object.create(self.controller); - self.init(o); - if (f) o.async(f); - return o; - }, - showConfirmDialog: function(s) { - gui.run(function() { - try { - var scr, layout, title, text, skip, onClick, dialog; - scr = new android.widget.ScrollView(ctx); - scr.setBackgroundColor(gui.config.colors.background); - layout = new android.widget.LinearLayout(ctx); - layout.setLayoutParams(new android.widget.FrameLayout.LayoutParams(-2, -2)); - layout.setOrientation(android.widget.LinearLayout.VERTICAL); - layout.setPadding(15 * dp, 15 * dp, 15 * dp, 5 * dp); - if (s.title) { - title = new android.widget.TextView(ctx); - title.setText(s.title); - title.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2)); - title.setPadding(0, 0, 0, 10 * dp); - title.setTextColor(gui.config.colors.text); - title.setTextSize(16); - layout.addView(title); - } - if (s.text) { - text = new android.widget.TextView(ctx); - text.setText(s.text); - text.setPadding(0, 0, 0, 10 * dp); - text.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2)); - text.setTextColor(gui.config.colors.sec_text); - text.setTextSize(14); - layout.addView(text); - } - if (s.skip) { - skip = new android.widget.CheckBox(ctx); - //skip.setChecked(Boolean(s.canSkip)); - skip.setLayoutParams(android.widget.LinearLayout.LayoutParams(-2, -2, 0)); - skip.getLayoutParams().setMargins(0, 0, 0, 10 * dp) - skip.setText("不再提示"); - skip.setTextColor(gui.config.colors.sec_text) - layout.addView(skip); - } - onClick = function(i) { - if (s.skip) s.skip(skip.isChecked()); - if (s.callback && s.callback(i)) return; - } - var closed = false; - s.buttons.map(function(e, i) { - var b = android.widget.TextView(ctx); - b.setId(i); - b.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, -2)); - b.setText(String(e)); - b.setGravity(android.view.Gravity.CENTER); - b.setPadding(10 * dp, 10 * dp, 10 * dp, 10 * dp); - b.setTextColor(gui.config.colors.text); - b.setTextSize(14); - b.measure(0, 0); - b.setBackgroundDrawable(gui.utils.ripple_drawable(b.getMeasuredWidth(), b.getMeasuredHeight(), "rect")); - b.setOnClickListener(new android.view.View.OnClickListener({ - onClick: function f(v) { - try {if(closed != true) { - onClick(v.getId()); - closed = true; - gui.winMgr.removeView(dialog); - return true; - }} catch (e) { - error(e + " → " + e.lineNumber); - } - } - })); - layout.addView(b); - return b; - }); - scr.addView(layout); - dialog = gui.dialogs.showDialog(scr, -2, -2, null, (s.canExit != true ? false : true)); - } catch (e) { - error(e + " → " + e.lineNumber); - } - }) - }, - showOperateDialog: function self(s, callback, canExit) { - gui.run(function() { - try { - var frame, list, dialog; - if (!self.adapter) { - self.adapter = function(e) { - e.view = new android.widget.LinearLayout(ctx); - e.view.setOrientation(android.widget.LinearLayout.VERTICAL); - e.view.setPadding(15 * dp, 15 * dp, 15 * dp, 15 * dp); - e.view.setLayoutParams(new android.widget.AbsListView.LayoutParams(-1, -2)); - e._title = new android.widget.TextView(ctx); - e._title.setText(e.text); - e._title.setGravity(android.view.Gravity.CENTER | android.view.Gravity.LEFT); - e._title.setFocusable(false); - e._title.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, -2)); - e._title.setTextSize(16); - e._title.setTextColor(gui.config.colors.text); - e.view.addView(e._title); - if (e.description) { - e._description = new android.widget.TextView(ctx); - e._description.setText(e.description); - e._description.setPadding(0, 3 * dp, 0, 0); - e._description.setLayoutParams(android.widget.LinearLayout.LayoutParams(-1, -2)); - e._description.setTextSize(14); - e._description.setTextColor(gui.config.colors.sec_text); - e.view.addView(e._description); - } - return e.view; - } - } - frame = new android.widget.FrameLayout(ctx); - frame.setPadding(5 * dp, 5 * dp, 5 * dp, 5 * dp); - frame.setBackgroundColor(gui.config.colors.background); - list = new android.widget.ListView(ctx); - list.setLayoutParams(new android.widget.FrameLayout.LayoutParams(-1, -2)); - list.setDividerHeight(0); - list.setAdapter(new RhinoListAdapter(s, self.adapter)); - list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener({ - onItemClick: function(parent, view, pos, id) { - try { - if (callback && !callback(pos, s[pos])) gui.utils.value_animation("Float", 1, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) { - dialog.setAlpha(anim.getAnimatedValue()); - if(anim.getAnimatedValue() == 1) gui.winMgr.removeView(dialog); - }); - return true; - } catch (e) { - error(e + " → " + e.lineNumber); - } - } - })); - frame.addView(list); - dialog = gui.dialogs.showDialog(frame, -1, -2, null, (canExit != true ? (typeof(canExit) != "boolean" ? true : false) : true)); - } catch (e) { - error(e + " → " + e.lineNumber); - } - }) - }, + })); + frame.addView(list); + dialog = gui.dialogs.showDialog(frame, -1, -2, null, (canExit != true ? (typeof(canExit) != "boolean" ? true : false) : true)); + } catch (e) { + error(e + " → " + e.lineNumber); + } + }) + }, }, @@ -1517,7 +1522,7 @@ gui = { current_index: 0, - __internal_showTargetDots: function s() { gui.run(function(){ + __internal_showTargetDots: function s(keyTargetedCbk, finishCbk) { gui.run(function(){ if(!gui.key_coordinate_navigation.isShowing) { gui.key_coordinate_navigation._global_base = new android.widget.TextView(ctx); gui.key_coordinate_navigation._global_base.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2)); @@ -1539,7 +1544,7 @@ gui = { break; case event.ACTION_UP: gui.key_coordinate_navigation._global_text.setText("键" + (gui.key_coordinate_navigation.current_index + 1) + "坐标已设置: [" + event.getRawX() + ", " + event.getRawY() + "]"); - config.values.key_coordinates.push([event.getRawX(), event.getRawY()]) + keyTargetedCbk([event.getRawX(), event.getRawY()]); gui.utils.value_animation("Float", 1, 0, 200 , new android.view.animation.DecelerateInterpolator(), function(anim) { gui.key_coordinate_navigation._global_base.setAlpha(anim.getAnimatedValue()); gui.key_coordinate_navigation._global_text.setAlpha(1 - anim.getAnimatedValue()); @@ -1548,19 +1553,16 @@ gui = { gui.key_coordinate_navigation.isShowing = false; } }); - threads.start(function() { - java.lang.Thread.currentThread().sleep(1000); - gui.run(function() { - if(++gui.key_coordinate_navigation.current_index < 15) { - gui.key_coordinate_navigation.__internal_showTargetDots(gui.key_coordinate_navigation.current_index); - } else { - config.save("key_coordinates"); - toast("坐标设置已保存至存储!\n"); - gui.key_coordinate_navigation.__internal_dismissText(); - gui.main.show(2); - } - }); - }); + var handler = new android.os.Handler(); + handler.postDelayed(function() { + if(++gui.key_coordinate_navigation.current_index < gui.key_coordinate_navigation.total) { + gui.key_coordinate_navigation.__internal_showTargetDots(keyTargetedCbk, finishCbk); + } else { + finishCbk(); + gui.key_coordinate_navigation.__internal_dismissText(); + gui.main.show(2); + } + }, 1000); default: return false; } @@ -1630,11 +1632,11 @@ gui = { } })}, - show: function() { - config.values.key_coordinates.length = 0; + show: function(keyCount, keyTargetedCbk, finishCbk) { gui.key_coordinate_navigation.current_index = 0; + gui.key_coordinate_navigation.total = keyCount ? keyCount : 15; this.__internal_showTips(); - this.__internal_showTargetDots(); + this.__internal_showTargetDots(keyTargetedCbk, finishCbk); }, }, @@ -2090,18 +2092,47 @@ gui.dialogs.showProgressDialog(function(o) { element.v_play.setBackgroundDrawable(gui.utils.ripple_drawable(element.v_play.getMeasuredWidth(), element.v_play.getMeasuredHeight(), "rect")); element.v_play.setOnClickListener(new android.view.View.OnClickListener({ onClick: function() { - if(config.values.key_coordinates.length == 15 && gui.main.isShowing) { - gui.main.__internal_dismiss(); - gui.player_panel.__internal_showPanel(element); - } else { - toast("未设置键位坐标或坐标数据错误,请前往设置页设置键位坐标"); + if(gui.main.isShowing) { + if(!element.keyCount) { + gui.dialogs.showConfirmDialog({ + title: "设置键位数", + text: "这是一个本地乐谱,请设置这个乐谱的键位数", + canExit: true, + buttons: ["8 键位", "15 键位"], + callback: function(id) { + files.write(files.join(sheetmgr.rootDir, element.fileName), (function() { + var readable = files.open(files.join(sheetmgr.rootDir, element.fileName), "r", sheetmgr.encoding); + var parsed = eval(readable.read())[0]; + readable.close(); + parsed.keyCount = id == 0 ? (element.keyCount = 8) : (element.keyCount = 15) + return "[" + JSON.stringify(parsed) + "]"; + }()), sheetmgr.encoding); + toast("已将 " + element.name + " 设置为 " + element.keyCount + " 键乐谱\n请再次点击弹奏按钮。\n长按乐谱以重新设置键位数。"); + }, + }); + } else { + switch(element.keyCount) { + case 8: { + if(config.values.key_coordinates8.length != 8) { + toast("未设置8键键位坐标或坐标数据错误,请前往设置页设置键位坐标"); + return true; + } + };break; + case 15: { + if(config.values.key_coordinates15.length != 15) { + toast("未设置15键键位坐标或坐标数据错误,请前往设置页设置键位坐标"); + return true; + } + };break; + } + gui.main.__internal_dismiss(); + gui.player_panel.__internal_showPanel(element); + } + } return true; } })); - - - element.v_relative.addView(element.v_play); } element.v_delete = new android.widget.ImageView(ctx); @@ -2144,7 +2175,8 @@ gui.dialogs.showProgressDialog(function(o) { s.ns0_listView.setAdapter(s.ns0_listAdapterController.self); s.ns0_listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener({ onItemClick: function(parent, view, pos, id) { - var item = s.ns0_listAdapterController.get(pos);if(item.type == -1) { + var item = s.ns0_listAdapterController.get(pos); + if(item.type == -1) { switch(item.index) { case 0: { gui.dialogs.showConfirmDialog({ @@ -2171,6 +2203,24 @@ gui.dialogs.showProgressDialog(function(o) { }); break; } + case 1: { + gui.dialogs.showConfirmDialog({ + title: "修改乐谱键位数", + text: "版本15增加了对不同键位乐器(8键位和15键位)乐谱的支持,它们使用不同的坐标数据。\n" + + "当前已存储在本地的乐谱(外部导入的乐谱或在版本15之前从共享乐谱下载的乐谱),它们没有键位信息,SkyAutoPlayerScript无法确认它是8键位乐谱还是15键位乐谱。\n" + + "共享乐谱信息已更新,现在下载的共享乐谱它已经包含了乐谱键位信息,不需要再设置。\n" + + "点击开始弹奏按钮时,若无键位信息,则会弹出对话框以选择乐谱键位,SkyAutoPlayerScript会保存键位信息到乐谱。\n" + + "如果因为一些原因设置了错误的键位信息,可以长按乐谱来重新设置。\n\n" + + "p.s.: 需要重新设置15键键位坐标。", + canExit: true, + skip: function(checked) { + config.values.skipChangeKeyCountTip = config.save("skip_change_key_count_tip", checked); + if(checked) s.ns0_listAdapterController.removeByIndex(pos, true); + }, + buttons: ["确认"] + }); + break; + } } return true; } @@ -2253,6 +2303,30 @@ gui.dialogs.showProgressDialog(function(o) { }()), -2, -2, null, true); } })); + s.ns0_listView.setOnItemLongClickListener(new android.widget.AdapterView.OnItemLongClickListener({ + onItemLongClick: function(parent, view, pos, id) { + var item = s.ns0_listAdapterController.get(pos); + if(!item.failed && item.type == 0) { + gui.dialogs.showConfirmDialog({ + title: "设置键位数", + text: "这是一个本地乐谱,请设置这个乐谱的键位数", + canExit: true, + buttons: ["8 键位", "15 键位"], + callback: function(id) { + files.write(files.join(sheetmgr.rootDir, item.fileName), (function() { + var readable = files.open(files.join(sheetmgr.rootDir, item.fileName), "r", sheetmgr.encoding); + var parsed = eval(readable.read())[0]; + readable.close(); + parsed.keyCount = id == 0 ? (item.keyCount = 8) : (item.keyCount = 15) + return "[" + JSON.stringify(parsed) + "]"; + }()), sheetmgr.encoding); + toast("已将 " + item.name + " 设置为 " + item.keyCount + " 键乐谱\n请再次点击弹奏按钮。\n长按乐谱以重新设置键位数。"); + }, + }); + } + return true; + }, + })); s.ns0_rl.addView(s.ns0_listView); s.ns0_progress = new android.widget.ProgressBar(ctx, null, android.R.attr.progressBarStyleHorizontal); @@ -2289,6 +2363,11 @@ gui.dialogs.showProgressDialog(function(o) { title: "如何导入本地乐谱", index: 0 });//上传乐谱提示 + if(!config.values.skipChangeKeyCountTip) s.ns0_listAdapterController.add({ + type: -1, + title: "修改乐谱键位数", + index: 1 + });//修改乐谱键位提示 s.ns0_listAdapterController.notifyChange(); threads.start(function() { sheetmgr.getLocalSheetList(isForce, function(successCount, failedCount) { @@ -2297,10 +2376,11 @@ gui.dialogs.showProgressDialog(function(o) { }); }).map(function(e, i) { gui.run(function(){ - if(!e.failed) { - s.ns0_listAdapterController.add(e); - } else if(config.values.showFailedSheets){ - s.ns0_listAdapterController.add(e); + if(!e.failed || config.values.showFailedSheets) { + s.ns0_listAdapterController.add((function(item) { + item.type = 0; + return item; + }(e))); } }); }); @@ -2435,7 +2515,7 @@ gui.dialogs.showProgressDialog(function(o) { element.download.setBackgroundDrawable(gui.utils.ripple_drawable(element.download.getMeasuredWidth(), element.download.getMeasuredHeight(), "rect")); element.download.setOnClickListener(new android.view.View.OnClickListener({ onClick: function() { threads.start(function() { - if(!element.isShowingStatusBar) sheetmgr.downloadAndLoad(element.file, element.author, function(r) { + if(!element.isShowingStatusBar) sheetmgr.downloadAndLoad(element.file, {author: element.author, keyCount: element.keyCount}, function(r) { switch(r.status) { case 1: { gui.run(function() { @@ -2797,10 +2877,29 @@ gui.dialogs.showProgressDialog(function(o) { name: "基本设置", }, { type: "default", - name: "设置键位坐标", + name: "设置8键盘键位坐标", onClick: function(v) { gui.main.__internal_dismiss(); - gui.key_coordinate_navigation.show(); + config.values.key_coordinates8.length = 0; + gui.key_coordinate_navigation.show(8, function(value) { + config.values.key_coordinates8.push(value); + }, function() { + config.save("key_coordinates8"); + toast("坐标设置已保存至存储!"); + }); + } + }, { + type: "default", + name: "设置15键盘键位坐标", + onClick: function(v) { + gui.main.__internal_dismiss(); + config.values.key_coordinates15.length = 0; + gui.key_coordinate_navigation.show(15, function(value) { + config.values.key_coordinates15.push(value); + }, function() { + config.save("key_coordinates15"); + toast("坐标设置已保存至存储!"); + }); } }, { type: "checkbox", @@ -2859,7 +2958,7 @@ gui.dialogs.showProgressDialog(function(o) { try { android.os.Build.VERSION_CODES.R } catch (e) { - sList.list.splice(3, 1); + sList.list.splice(4, 1); } return sList.list; }()), function self(element) { diff --git a/update_log.txt b/update_log.txt index 1866569..4deeabb 100644 --- a/update_log.txt +++ b/update_log.txt @@ -1,5 +1,10 @@ +版本: 15 +更新时间: 2020.10.01 00:00 +更新内容: + * 新增:8键位乐谱支持 + 版本: 14 -更新时间: 2020.09.03 20:51 +更新时间: 2020.09.13 20:51 更新内容: * 新增:共享乐谱支持搜索功能 * 改善:窗口拓展功能