Landscape keyboard UI

This commit is contained in:
serso 2016-01-23 13:48:25 +01:00
parent a10075d6f5
commit 9c73c5df23
4 changed files with 125 additions and 29 deletions

View File

@ -62,7 +62,50 @@ public class KeyboardUi {
buttonBackground = App.getTheme().light ? R.drawable.material_button_light : R.drawable.material_button_dark; buttonBackground = App.getTheme().light ? R.drawable.material_button_light : R.drawable.material_button_dark;
} }
public void makeView() { public void makeView(boolean landscape) {
if (landscape) {
makeViewLand();
} else {
makeViewPort();
}
}
private void makeViewLand() {
final int parametersCount = parameterNames.size();
LinearLayout row = makeRow();
addImageButton(row, R.id.cpp_kb_button_keyboard, R.drawable.ic_keyboard_white_24dp);
addButton(row, 0, parametersCount > 0 ? parameterNames.get(0) : "x");
addButton(row, 0, "7");
addButton(row, 0, "8");
addButton(row, 0, "9").setText("π", up).setText("e", down);
addOperationButton(row, R.id.cpp_kb_button_multiply, Locator.getInstance().getEngine().getMultiplicationSign()).setText("^n", up).setText("^2", down);
addOperationButton(row, R.id.cpp_kb_button_plus, "+");
addButton(row, R.id.cpp_kb_button_clear, "C");
row = makeRow();
addButton(row, R.id.cpp_kb_button_brackets, "( )").setText("(", up).setText(")", down);
addButton(row, 0, parametersCount > 1 ? parameterNames.get(1) : "y");
addButton(row, 0, "4");
addButton(row, 0, "5");
addButton(row, 0, "6");
addOperationButton(row, R.id.cpp_kb_button_divide, "/").setText("%", up).setText("sqrt", down);
addOperationButton(row, R.id.cpp_kb_button_minus, "");
final View backspace = addImageButton(row, R.id.cpp_kb_button_backspace, R.drawable.ic_backspace_white_24dp);
EditTextLongClickEraser.attachTo(backspace, user.getEditor());
row = makeRow();
addButton(row, R.id.cpp_kb_button_functions_constants, "f/π");
addButton(row, 0, ".").setText(",", up);
addButton(row, 0, "1");
addButton(row, 0, "2");
addButton(row, 0, "3");
addButton(row, 0, "0").setText("00", up).setText("000", down);
addImageButton(row, R.id.cpp_kb_button_space, R.drawable.ic_space_bar_white_24dp);
addImageButton(row, R.id.cpp_kb_button_close, R.drawable.ic_done_white_24dp);
}
private void makeViewPort() {
LinearLayout row = makeRow(); LinearLayout row = makeRow();
addButton(row, 0, "7"); addButton(row, 0, "7");
addButton(row, 0, "8"); addButton(row, 0, "8");
@ -96,7 +139,7 @@ public class KeyboardUi {
final int parametersCount = parameterNames.size(); final int parametersCount = parameterNames.size();
addButton(row, 0, parametersCount > 0 ? parameterNames.get(0) : "x"); addButton(row, 0, parametersCount > 0 ? parameterNames.get(0) : "x");
addButton(row, 0, parametersCount > 1 ? parameterNames.get(1) : "y"); addButton(row, 0, parametersCount > 1 ? parameterNames.get(1) : "y");
addButton(row, R.id.cpp_kb_button_functions, "f(x)"); addButton(row, R.id.cpp_kb_button_functions, "f");
addButton(row, R.id.cpp_kb_button_constants, "π"); addButton(row, R.id.cpp_kb_button_constants, "π");
addImageButton(row, R.id.cpp_kb_button_close, R.drawable.ic_done_white_24dp); addImageButton(row, R.id.cpp_kb_button_close, R.drawable.ic_done_white_24dp);
} }
@ -169,6 +212,14 @@ public class KeyboardUi {
return button; return button;
} }
public int getRowsCount(boolean landscape) {
return landscape ? 3 : 5;
}
public int getColumnsCount(boolean landscape) {
return landscape ? 8 : 5;
}
public interface User { public interface User {
@NonNull @NonNull
Context getContext(); Context getContext();
@ -195,6 +246,8 @@ public class KeyboardUi {
void done(); void done();
void showIme(); void showIme();
void showFunctionsConstants(@NonNull View v);
} }
private class ButtonHandler implements View.OnClickListener, SimpleDragListener.DragProcessor { private class ButtonHandler implements View.OnClickListener, SimpleDragListener.DragProcessor {
@ -213,6 +266,9 @@ public class KeyboardUi {
case R.id.cpp_kb_button_multiply: case R.id.cpp_kb_button_multiply:
user.insertOperator('*'); user.insertOperator('*');
break; break;
case R.id.cpp_kb_button_functions_constants:
user.showFunctionsConstants(v);
break;
case R.id.cpp_kb_button_functions: case R.id.cpp_kb_button_functions:
user.showFunctions(v); user.showFunctions(v);
break; break;

View File

@ -2,6 +2,8 @@ package org.solovyev.android.calculator;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.IBinder; import android.os.IBinder;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@ -53,9 +55,15 @@ public class KeyboardWindow {
final Context context = editor.getContext(); final Context context = editor.getContext();
final LinearLayout view = new LinearLayout(context); final LinearLayout view = new LinearLayout(context);
view.setOrientation(LinearLayout.VERTICAL); view.setOrientation(LinearLayout.VERTICAL);
final int buttonSize = context.getResources().getDimensionPixelSize(R.dimen.cpp_clickable_area_size);
final int keyboardSize = 5 * buttonSize; final Resources resources = context.getResources();
window = new PopupWindow(view, keyboardSize, keyboardSize); final int buttonSize = resources.getDimensionPixelSize(R.dimen.cpp_clickable_area_size);
final KeyboardUi keyboardUi = new KeyboardUi(user, parameterNames);
final boolean landscape = resources.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
final int keyboardWidth = keyboardUi.getColumnsCount(landscape) * buttonSize;
final int keyboardHeight = keyboardUi.getRowsCount(landscape) * buttonSize;
window = new PopupWindow(view, keyboardWidth, keyboardHeight);
window.setClippingEnabled(false); window.setClippingEnabled(false);
window.setOnDismissListener(new PopupWindow.OnDismissListener() { window.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override @Override
@ -73,15 +81,15 @@ public class KeyboardWindow {
if (editor.getWindowToken() != null) { if (editor.getWindowToken() != null) {
hideIme(editor); hideIme(editor);
final int inputWidth = editor.getWidth(); final int inputWidth = editor.getWidth();
final int xOff = (inputWidth - keyboardSize) / 2; final int xOff = (inputWidth - keyboardWidth) / 2;
window.setWidth(keyboardSize); window.setWidth(keyboardWidth);
window.showAsDropDown(editor, xOff, 0); window.showAsDropDown(editor, xOff, 0);
} else { } else {
editor.postDelayed(this, 50); editor.postDelayed(this, 50);
} }
} }
}); });
new KeyboardUi(user, parameterNames).makeView(); keyboardUi.makeView(landscape);
} }
public boolean isShown() { public boolean isShown() {

View File

@ -64,6 +64,7 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
private static final String ARG_FUNCTION = "function"; private static final String ARG_FUNCTION = "function";
private static final int MENU_FUNCTION = Menu.FIRST; private static final int MENU_FUNCTION = Menu.FIRST;
private static final int MENU_CONSTANT = Menu.FIRST + 1; private static final int MENU_CONSTANT = Menu.FIRST + 1;
private static final int MENU_CATEGORY = Menu.FIRST + 2;
@NonNull @NonNull
private final MathRegistry<Function> functionsRegistry = Locator.getInstance().getEngine().getFunctionsRegistry(); private final MathRegistry<Function> functionsRegistry = Locator.getInstance().getEngine().getFunctionsRegistry();
@ -456,10 +457,7 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
final int id = v.getId(); final int id = v.getId();
if (id == R.id.function_body) { if (id == R.id.function_body) {
menu.clear(); addEntities(menu, getNamesSorted(constantsRegistry), MENU_CONSTANT);
for (String constant : getNamesSorted(constantsRegistry)) {
menu.add(MENU_CONSTANT, Menu.NONE, Menu.NONE, constant).setOnMenuItemClickListener(KeyboardUser.this);
}
unregisterForContextMenu(bodyView); unregisterForContextMenu(bodyView);
} }
} }
@ -481,10 +479,30 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
final int id = v.getId(); final int id = v.getId();
if (id == R.id.function_body) { if (id == R.id.function_body) {
menu.clear(); addEntities(menu, getNamesSorted(functionsRegistry), MENU_FUNCTION);
for (String function : getNamesSorted(functionsRegistry)) { unregisterForContextMenu(bodyView);
menu.add(MENU_FUNCTION, Menu.NONE, Menu.NONE, function).setOnMenuItemClickListener(KeyboardUser.this); }
} }
});
bodyView.showContextMenu();
}
private void addEntities(@NonNull Menu menu, @NonNull List<String> entities, int groupId) {
for (String entity : entities) {
menu.add(groupId, Menu.NONE, Menu.NONE, entity).setOnMenuItemClickListener(KeyboardUser.this);
}
}
@Override
public void showFunctionsConstants(@NonNull View v) {
bodyView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
final int id = v.getId();
if (id == R.id.function_body) {
// can't use sub-menus as AlertDialog doesn't support them
menu.add(MENU_CATEGORY, MENU_CONSTANT, Menu.NONE, R.string.c_vars_and_constants).setOnMenuItemClickListener(KeyboardUser.this);
menu.add(MENU_CATEGORY, MENU_FUNCTION, Menu.NONE, R.string.c_functions).setOnMenuItemClickListener(KeyboardUser.this);
unregisterForContextMenu(bodyView); unregisterForContextMenu(bodyView);
} }
} }
@ -522,22 +540,35 @@ public class EditFunctionFragment extends BaseDialogFragment implements View.OnC
} }
@Override @Override
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(final MenuItem item) {
final int groupId = item.getGroupId(); final int groupId = item.getGroupId();
final CharSequence title = item.getTitle(); final CharSequence title = item.getTitle();
if (groupId == MENU_FUNCTION) { switch (groupId) {
final int argsListIndex = title.toString().indexOf("("); case MENU_FUNCTION:
if (argsListIndex < 0) { final int argsListIndex = title.toString().indexOf("(");
keyboardUser.insertText(title + "()", -1); if (argsListIndex < 0) {
} else { keyboardUser.insertText(title + "()", -1);
keyboardUser.insertText(title.subSequence(0, argsListIndex) + "()", -1); } else {
} keyboardUser.insertText(title.subSequence(0, argsListIndex) + "()", -1);
} else if (groupId == MENU_CONSTANT) { }
keyboardUser.insertText(title.toString(), 0); return true;
} else { case MENU_CONSTANT:
return false; keyboardUser.insertText(title.toString(), 0);
return true;
case MENU_CATEGORY:
bodyView.post(new Runnable() {
@Override
public void run() {
if (item.getItemId() == MENU_FUNCTION) {
showFunctions(bodyView);
} else {
showConstants(bodyView);
}
}
});
return true;
} }
return true; return false;
} }
} }
} }

View File

@ -70,6 +70,7 @@
<item name="cpp_kb_button_minus" type="id" /> <item name="cpp_kb_button_minus" type="id" />
<item name="cpp_kb_button_keyboard" type="id" /> <item name="cpp_kb_button_keyboard" type="id" />
<item name="cpp_kb_button_functions" type="id" /> <item name="cpp_kb_button_functions" type="id" />
<item name="cpp_kb_button_functions_constants" type="id" />
<item name="cpp_kb_button_constants" type="id" /> <item name="cpp_kb_button_constants" type="id" />
<item name="cpp_kb_button_close" type="id" /> <item name="cpp_kb_button_close" type="id" />