diff --git a/code/th_13_panel_ui.js b/code/th_13_panel_ui.js index 4e330e2..6f1e651 100644 --- a/code/th_13_panel_ui.js +++ b/code/th_13_panel_ui.js @@ -364,7 +364,7 @@ FloatBallAppWM.prototype.createSettingItemView = function(item, parent, needDivi row.addView(rg); parent.addView(row); } else if (item.type === "ball_shortx_icon") { - // === 悬浮球 ShortX 图标选择器 === + // === 悬浮球 ShortX 图标选择器(内嵌式,无 AlertDialog)=== row.setOrientation(android.widget.LinearLayout.VERTICAL); var tv = new android.widget.TextView(context); tv.setText(String(item.name)); @@ -383,11 +383,11 @@ FloatBallAppWM.prototype.createSettingItemView = function(item, parent, needDivi previewIv.setLayoutParams(previewIvLp); previewIv.setScaleType(android.widget.ImageView.ScaleType.FIT_CENTER); try { - var curIconName = String(self.getPendingValue(item.key) || ""); - var curTint = String(self.getPendingValue("BALL_ICON_TINT_HEX") || ""); - if (curIconName) { - var dr = self.resolveShortXDrawable(curIconName, curTint); - if (dr) previewIv.setImageDrawable(dr); + var curIconName0 = String(self.getPendingValue(item.key) || ""); + var curTint0 = String(self.getPendingValue("BALL_ICON_TINT_HEX") || ""); + if (curIconName0) { + var dr0 = self.resolveShortXDrawable(curIconName0, curTint0); + if (dr0) previewIv.setImageDrawable(dr0); } } catch(ePreview) {} iconRow.addView(previewIv); @@ -400,96 +400,106 @@ FloatBallAppWM.prototype.createSettingItemView = function(item, parent, needDivi nameTv.setLayoutParams(nameTvLp); iconRow.addView(nameTv); - var btnPick = self.ui.createFlatButton(self, "选择", primary, function() { - self.touchActivity(); - try { - var catalog = self.getShortXIconCatalog(); - if (!catalog || catalog.length === 0) { - self.toast("图标库未加载,请检查 ShortX 是否安装"); - return; - } + // 展开/收起状态 + var iconPickerExpanded = false; - var dialogView = new android.widget.LinearLayout(context); - dialogView.setOrientation(android.widget.LinearLayout.VERTICAL); - dialogView.setPadding(self.dp(16), self.dp(16), self.dp(16), self.dp(16)); - - var searchEt = new android.widget.EditText(context); - searchEt.setHint("搜索图标..."); - searchEt.setTextColor(textColor); - searchEt.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 14); - searchEt.setBackground(self.ui.createRoundDrawable(isDark ? C.inputBgDark : C.inputBgLight, self.dp(6))); - searchEt.setPadding(self.dp(8), self.dp(8), self.dp(8), self.dp(8)); - searchEt.setSingleLine(true); - dialogView.addView(searchEt); - - var listView = new android.widget.ListView(context); - var listLp = new android.widget.LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.MATCH_PARENT, self.dp(360)); - listLp.topMargin = self.dp(8); - listView.setLayoutParams(listLp); - dialogView.addView(listView); - - var adapterData = []; - var i; - for (i = 0; i < catalog.length; i++) { - adapterData.push(String(catalog[i].shortName || catalog[i].name)); - } - - var adapter = new android.widget.ArrayAdapter(context, android.R.layout.simple_list_item_1, adapterData); - listView.setAdapter(adapter); - - var dialog = new android.app.AlertDialog.Builder(context) - .setTitle("选择 ShortX 图标") - .setView(dialogView) - .setNegativeButton("取消", null) - .create(); - - listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener({ - onItemClick: function(parent, view, position, id) { - try { - var selectedName = String(adapter.getItem(position)); - self.setPendingValue(item.key, selectedName); - nameTv.setText(selectedName); - try { - var tint = String(self.getPendingValue("BALL_ICON_TINT_HEX") || ""); - var dr = self.resolveShortXDrawable(selectedName, tint); - if (dr) previewIv.setImageDrawable(dr); - else previewIv.setImageDrawable(null); - } catch(eDr) {} - dialog.dismiss(); - if (self.state.previewMode) self.rebuildBallForNewSize(true); - } catch(eClick) {} + var btnPick = self.ui.createFlatButton(self, "展开图标库", primary, function() { + iconPickerExpanded = !iconPickerExpanded; + btnPick.setText(iconPickerExpanded ? "收起图标库" : "展开图标库"); + iconPickerWrap.setVisibility(iconPickerExpanded ? android.view.View.VISIBLE : android.view.View.GONE); + if (iconPickerExpanded) { + try { + if (!iconListView.getAdapter() || iconListView.getAdapter().getCount() === 0) { + var catalog0 = self.getShortXIconCatalog(); + if (!catalog0 || catalog0.length === 0) { + self.toast("图标库未加载,请检查 ShortX 是否安装"); + iconPickerExpanded = false; + btnPick.setText("展开图标库"); + iconPickerWrap.setVisibility(android.view.View.GONE); + return; + } + var adapterData0 = []; + var ii; + for (ii = 0; ii < catalog0.length; ii++) { + adapterData0.push(String(catalog0[ii].shortName || catalog0[ii].name)); + } + var adapter0 = new android.widget.ArrayAdapter(context, android.R.layout.simple_list_item_1, adapterData0); + iconListView.setAdapter(adapter0); } - })); - - searchEt.addTextChangedListener(new android.text.TextWatcher({ - beforeTextChanged: function(s, start, count, after) {}, - onTextChanged: function(s, start, before, count) {}, - afterTextChanged: function(s) { - try { - var q = String(s).toLowerCase(); - var filtered = []; - var j; - for (j = 0; j < catalog.length; j++) { - var n = String(catalog[j].shortName || catalog[j].name).toLowerCase(); - if (n.indexOf(q) >= 0) filtered.push(String(catalog[j].shortName || catalog[j].name)); - } - var newAdapter = new android.widget.ArrayAdapter(context, android.R.layout.simple_list_item_1, filtered); - listView.setAdapter(newAdapter); - } catch(eFilter) {} - } - })); - - dialog.show(); - } catch(eDialog) { - self.toast("打开图标选择器失败: " + String(eDialog)); + } catch(eLoad) { + self.toast("加载图标库失败: " + String(eLoad)); + } } }); iconRow.addView(btnPick); row.addView(iconRow); + + // 内嵌图标选择区域 + var iconPickerWrap = new android.widget.LinearLayout(context); + iconPickerWrap.setOrientation(android.widget.LinearLayout.VERTICAL); + iconPickerWrap.setVisibility(android.view.View.GONE); + iconPickerWrap.setPadding(0, self.dp(8), 0, 0); + + var searchEt = new android.widget.EditText(context); + searchEt.setHint("搜索图标..."); + searchEt.setTextColor(textColor); + searchEt.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 13); + searchEt.setBackground(self.ui.createRoundDrawable(isDark ? C.inputBgDark : C.inputBgLight, self.dp(6))); + searchEt.setPadding(self.dp(8), self.dp(6), self.dp(8), self.dp(6)); + searchEt.setSingleLine(true); + iconPickerWrap.addView(searchEt); + + var iconListView = new android.widget.ListView(context); + var listLp = new android.widget.LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.MATCH_PARENT, self.dp(280)); + listLp.topMargin = self.dp(6); + iconListView.setLayoutParams(listLp); + iconPickerWrap.addView(iconListView); + + iconListView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener({ + onItemClick: function(parent, view, position, id) { + try { + var adapter1 = iconListView.getAdapter(); + var selectedName = String(adapter1.getItem(position)); + self.setPendingValue(item.key, selectedName); + nameTv.setText(selectedName); + try { + var tint1 = String(self.getPendingValue("BALL_ICON_TINT_HEX") || ""); + var dr1 = self.resolveShortXDrawable(selectedName, tint1); + if (dr1) previewIv.setImageDrawable(dr1); + else previewIv.setImageDrawable(null); + } catch(eDr) {} + iconPickerExpanded = false; + btnPick.setText("展开图标库"); + iconPickerWrap.setVisibility(android.view.View.GONE); + if (self.state.previewMode) self.rebuildBallForNewSize(true); + } catch(eClick) {} + } + })); + + searchEt.addTextChangedListener(new android.text.TextWatcher({ + beforeTextChanged: function(s, start, count, after) {}, + onTextChanged: function(s, start, before, count) {}, + afterTextChanged: function(s) { + try { + var catalog1 = self.getShortXIconCatalog(); + var q = String(s).toLowerCase(); + var filtered = []; + var j; + for (j = 0; j < catalog1.length; j++) { + var n = String(catalog1[j].shortName || catalog1[j].name).toLowerCase(); + if (n.indexOf(q) >= 0) filtered.push(String(catalog1[j].shortName || catalog1[j].name)); + } + var newAdapter = new android.widget.ArrayAdapter(context, android.R.layout.simple_list_item_1, filtered); + iconListView.setAdapter(newAdapter); + } catch(eFilter) {} + } + })); + + row.addView(iconPickerWrap); parent.addView(row); } else if (item.type === "ball_color") { - // === 悬浮球图标颜色选择器 === + // === 悬浮球图标颜色选择器(内嵌式,无 AlertDialog)=== row.setOrientation(android.widget.LinearLayout.VERTICAL); var tv = new android.widget.TextView(context); tv.setText(String(item.name)); @@ -507,9 +517,9 @@ FloatBallAppWM.prototype.createSettingItemView = function(item, parent, needDivi colorDotLp.rightMargin = self.dp(10); colorDot.setLayoutParams(colorDotLp); try { - var curHex = String(self.getPendingValue(item.key) || ""); - if (curHex) { - colorDot.setBackground(self.ui.createRoundDrawable(android.graphics.Color.parseColor(curHex), self.dp(14))); + var curHex0 = String(self.getPendingValue(item.key) || ""); + if (curHex0) { + colorDot.setBackground(self.ui.createRoundDrawable(android.graphics.Color.parseColor(curHex0), self.dp(14))); } else { colorDot.setBackground(self.ui.createRoundDrawable(0xFFCCCCCC | 0, self.dp(14))); } @@ -526,6 +536,33 @@ FloatBallAppWM.prototype.createSettingItemView = function(item, parent, needDivi colorValueTv.setLayoutParams(colorValueLp); colorRow.addView(colorValueTv); + var paletteExpanded = false; + + var btnColor = self.ui.createFlatButton(self, "展开调色板", primary, function() { + paletteExpanded = !paletteExpanded; + btnColor.setText(paletteExpanded ? "收起调色板" : "展开调色板"); + paletteWrap.setVisibility(paletteExpanded ? android.view.View.VISIBLE : android.view.View.GONE); + }); + colorRow.addView(btnColor); + row.addView(colorRow); + + var paletteWrap = new android.widget.LinearLayout(context); + paletteWrap.setOrientation(android.widget.LinearLayout.VERTICAL); + paletteWrap.setVisibility(android.view.View.GONE); + paletteWrap.setPadding(0, self.dp(8), 0, 0); + + var scroll = new android.widget.ScrollView(context); + var scrollBox = new android.widget.LinearLayout(context); + scrollBox.setOrientation(android.widget.LinearLayout.VERTICAL); + scroll.addView(scrollBox); + paletteWrap.addView(scroll); + + var grid = new android.widget.GridLayout(context); + try { grid.setColumnCount(5); } catch(e){} + var gridLp = new android.widget.LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.MATCH_PARENT, android.widget.LinearLayout.LayoutParams.WRAP_CONTENT); + grid.setLayoutParams(gridLp); + scrollBox.addView(grid); + var commonColors = [ "#F44336", "#E91E63", "#9C27B0", "#673AB7", "#3F51B5", "#2196F3", "#03A9F4", "#00BCD4", "#009688", "#4CAF50", @@ -533,93 +570,84 @@ FloatBallAppWM.prototype.createSettingItemView = function(item, parent, needDivi "#FF5722", "#795548", "#9E9E9E", "#607D8B", "#000000", "#FFFFFF" ]; - var btnColor = self.ui.createFlatButton(self, "调色板", primary, function() { - self.touchActivity(); - try { - var dialogView = new android.widget.LinearLayout(context); - dialogView.setOrientation(android.widget.LinearLayout.VERTICAL); - dialogView.setPadding(self.dp(16), self.dp(16), self.dp(16), self.dp(16)); - - var scroll = new android.widget.ScrollView(context); - var scrollBox = new android.widget.LinearLayout(context); - scrollBox.setOrientation(android.widget.LinearLayout.VERTICAL); - scroll.addView(scrollBox); - dialogView.addView(scroll); - - var grid = new android.widget.GridLayout(context); - try { grid.setColumnCount(5); } catch(e){} - var gridLp = new android.widget.LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.MATCH_PARENT, android.widget.LinearLayout.LayoutParams.WRAP_CONTENT); - grid.setLayoutParams(gridLp); - scrollBox.addView(grid); - - var ci; - for (ci = 0; ci < commonColors.length; ci++) { - (function(hex) { - var colorBtn = new android.widget.TextView(context); - colorBtn.setLayoutParams(new android.widget.GridLayout.LayoutParams(self.dp(44), self.dp(44))); + var ci; + for (ci = 0; ci < commonColors.length; ci++) { + (function(hex) { + var colorBtn = new android.widget.TextView(context); + colorBtn.setLayoutParams(new android.widget.GridLayout.LayoutParams(self.dp(44), self.dp(44))); + try { + colorBtn.setBackground(self.ui.createRoundDrawable(android.graphics.Color.parseColor(hex), self.dp(8))); + } catch(eBg) {} + colorBtn.setOnClickListener(new android.view.View.OnClickListener({ + onClick: function(v) { try { - colorBtn.setBackground(self.ui.createRoundDrawable(android.graphics.Color.parseColor(hex), self.dp(8))); - } catch(eBg) {} - colorBtn.setOnClickListener(new android.view.View.OnClickListener({ - onClick: function(v) { - try { - self.setPendingValue(item.key, hex); - colorValueTv.setText(hex); - try { colorDot.setBackground(self.ui.createRoundDrawable(android.graphics.Color.parseColor(hex), self.dp(14))); } catch(eDot2) {} - if (self.state.previewMode) self.rebuildBallForNewSize(true); - } catch(eSet) {} - } - })); - grid.addView(colorBtn); - })(commonColors[ci]); + self.setPendingValue(item.key, hex); + colorValueTv.setText(hex); + try { colorDot.setBackground(self.ui.createRoundDrawable(android.graphics.Color.parseColor(hex), self.dp(14))); } catch(eDot2) {} + if (self.state.previewMode) self.rebuildBallForNewSize(true); + } catch(eSet) {} + } + })); + grid.addView(colorBtn); + })(commonColors[ci]); + } + + var inputEt = new android.widget.EditText(context); + inputEt.setHint("手动输入 #RRGGBB"); + inputEt.setTextColor(textColor); + inputEt.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 13); + inputEt.setBackground(self.ui.createRoundDrawable(isDark ? C.inputBgDark : C.inputBgLight, self.dp(6))); + inputEt.setPadding(self.dp(8), self.dp(6), self.dp(8), self.dp(6)); + inputEt.setSingleLine(true); + inputEt.setText(String(self.getPendingValue(item.key) || "")); + var inputLp = new android.widget.LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.MATCH_PARENT, android.widget.LinearLayout.LayoutParams.WRAP_CONTENT); + inputLp.topMargin = self.dp(10); + inputEt.setLayoutParams(inputLp); + scrollBox.addView(inputEt); + + var btnRow = new android.widget.LinearLayout(context); + btnRow.setOrientation(android.widget.LinearLayout.HORIZONTAL); + btnRow.setGravity(android.view.Gravity.END); + btnRow.setPadding(0, self.dp(8), 0, 0); + + var btnConfirm = self.ui.createFlatButton(self, "确定", primary, function() { + try { + var val = String(inputEt.getText() || "").replace(/^\s+|\s+$/g, ""); + if (val) { + if (val.indexOf("#") !== 0) val = "#" + val; + android.graphics.Color.parseColor(val); + self.setPendingValue(item.key, val); + colorValueTv.setText(val); + try { colorDot.setBackground(self.ui.createRoundDrawable(android.graphics.Color.parseColor(val), self.dp(14))); } catch(eDot3) {} + } else { + self.setPendingValue(item.key, ""); + colorValueTv.setText("默认"); + try { colorDot.setBackground(self.ui.createRoundDrawable(0xFFCCCCCC | 0, self.dp(14))); } catch(eDot4) {} } - - var inputEt = new android.widget.EditText(context); - inputEt.setHint("手动输入 #RRGGBB"); - inputEt.setTextColor(textColor); - inputEt.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 14); - inputEt.setBackground(self.ui.createRoundDrawable(isDark ? C.inputBgDark : C.inputBgLight, self.dp(6))); - inputEt.setPadding(self.dp(8), self.dp(8), self.dp(8), self.dp(8)); - inputEt.setSingleLine(true); - inputEt.setText(String(self.getPendingValue(item.key) || "")); - var inputLp = new android.widget.LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams.MATCH_PARENT, android.widget.LinearLayout.LayoutParams.WRAP_CONTENT); - inputLp.topMargin = self.dp(12); - inputEt.setLayoutParams(inputLp); - scrollBox.addView(inputEt); - - var dialog = new android.app.AlertDialog.Builder(context) - .setTitle("选择图标颜色") - .setView(dialogView) - .setPositiveButton("确定", new android.content.DialogInterface.OnClickListener({ - onClick: function(dlg, which) { - try { - var val = String(inputEt.getText() || "").replace(/^\s+|\s+$/g, ""); - if (val) { - if (val.indexOf("#") !== 0) val = "#" + val; - android.graphics.Color.parseColor(val); - self.setPendingValue(item.key, val); - colorValueTv.setText(val); - try { colorDot.setBackground(self.ui.createRoundDrawable(android.graphics.Color.parseColor(val), self.dp(14))); } catch(eDot3) {} - } else { - self.setPendingValue(item.key, ""); - colorValueTv.setText("默认"); - try { colorDot.setBackground(self.ui.createRoundDrawable(0xFFCCCCCC | 0, self.dp(14))); } catch(eDot4) {} - } - if (self.state.previewMode) self.rebuildBallForNewSize(true); - } catch(eOk) { - self.toast("颜色格式无效"); - } - } - })) - .setNegativeButton("取消", null) - .create(); - dialog.show(); - } catch(eDialog) { - self.toast("打开调色板失败: " + String(eDialog)); + paletteExpanded = false; + btnColor.setText("展开调色板"); + paletteWrap.setVisibility(android.view.View.GONE); + if (self.state.previewMode) self.rebuildBallForNewSize(true); + } catch(eOk) { + self.toast("颜色格式无效"); } }); - colorRow.addView(btnColor); - row.addView(colorRow); + btnRow.addView(btnConfirm); + + var btnClear = self.ui.createFlatButton(self, "清空", secColor, function() { + self.setPendingValue(item.key, ""); + colorValueTv.setText("默认"); + try { colorDot.setBackground(self.ui.createRoundDrawable(0xFFCCCCCC | 0, self.dp(14))); } catch(eDot5) {} + inputEt.setText(""); + paletteExpanded = false; + btnColor.setText("展开调色板"); + paletteWrap.setVisibility(android.view.View.GONE); + if (self.state.previewMode) self.rebuildBallForNewSize(true); + }); + btnRow.addView(btnClear); + + scrollBox.addView(btnRow); + row.addView(paletteWrap); parent.addView(row); } else {