Emojis Keyboard.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import keyboard | |
import ui | |
from objc_util import * | |
import clipboard | |
import speech | |
import sys | |
import time | |
import threading | |
class MyView(ui.View): | |
def __init__(self, *args, **kwargs): | |
super().__init__(self, *args, **kwargs) | |
self.background_color = 'lightgray' | |
# bounds not yet known in init, let some delay | |
ui.delay(self.dimensions,0.1) | |
def dimensions(self): | |
w,h = self.bounds.size | |
h_icons = 40 | |
dd = 2 | |
d = (h-4*dd-h_icons)/3 | |
x0 = (w -3*d - 2*dd)/2 | |
x = x0 - d/2 | |
y = h_icons + dd | |
b_top = ui.Button() | |
b_top.frame = (x,y,d,d) | |
b_top.corner_radius = d/4 | |
b_top.title = '文頭' # begin of sentence | |
b_top.background_color = 'white' | |
b_top.border_width = 1 | |
def b_top_action(sender): | |
t = keyboard.get_input_context() # current line | |
l = len(t[0]) | |
keyboard.move_cursor(-l) | |
b_top.action = b_top_action | |
self.add_subview(b_top) | |
x = x0 + 1 * (d + dd) | |
y = h_icons + dd | |
b_up = ui.Button() | |
b_up.frame = (x,y,d,d) | |
b_up.corner_radius = d/4 | |
b_up.title = '⬆️' | |
b_up.background_color = 'white' | |
b_up.border_width = 1 | |
def b_up_action(sender): | |
t = keyboard.get_input_context() # current line | |
l0 = len(t[0]) | |
l1 = len(t[1]) | |
keyboard.move_cursor(-l0) | |
keyboard.move_cursor(-1) # end of previous line | |
t = keyboard.get_input_context() # previous line | |
l2 = len(t[0]) | |
l3 = len(t[1]) | |
#sender.title = str(l0)+' '+str(l1)+' '+str(l2)+' '+str(l3) | |
if l2 >= l0: | |
keyboard.move_cursor(-(l2-l0)) | |
else: | |
pass # line is shorter than l0, thus stay at end | |
b_up.action = b_up_action | |
self.add_subview(b_up) | |
x = x0 | |
y = h_icons + dd + 1 * (d + dd) | |
b_left = ui.Button() | |
b_left.frame = (x,y,d,d) | |
b_left.corner_radius = d/4 | |
b_left.title = '⬅️' | |
b_left.background_color = 'white' | |
b_left.border_width = 1 | |
def b_left_action(sender): | |
keyboard.move_cursor(-1) | |
b_left.action = b_left_action | |
self.add_subview(b_left) | |
x = x0 + 1 * (d + dd) | |
y = h_icons + dd + 1 * (d + dd) | |
b_bottom = ui.Button() | |
b_bottom.frame = (x,y,d,d) | |
b_bottom.corner_radius = d/4 | |
b_bottom.title = '文末' # end of sentence | |
b_bottom.background_color = 'white' | |
b_bottom.border_width = 1 | |
def b_bottom_action(sender): | |
t = keyboard.get_input_context() # current line | |
l = len(t[1]) | |
keyboard.move_cursor(+l) | |
move = my_thread(1) | |
move.start() | |
b_bottom.action = b_bottom_action | |
self.add_subview(b_bottom) | |
x = x0 + 2 * (d + dd) | |
y = h_icons + dd + 1 * (d + dd) | |
b_right = ui.Button() | |
b_right.frame = (x,y,d,d) | |
b_right.corner_radius = d/4 | |
b_right.title = '➡️' | |
b_right.background_color = 'white' | |
b_right.border_width = 1 | |
def b_right_action(sender): | |
keyboard.move_cursor(+1) | |
b_right.action = b_right_action | |
self.add_subview(b_right) | |
x = x0 - d/2 | |
y = h_icons + dd + 2 * (d + dd) | |
b_copy = ui.Button() | |
b_copy.frame = (x,y,d,d) | |
b_copy.corner_radius = d/4 | |
if keyboard.has_full_access(): | |
b_copy.title = 'copy' | |
else: | |
b_copy.title = 'no full' | |
b_copy.background_color = 'white' | |
b_copy.border_width = 1 | |
def b_copy_action(sender): | |
t = keyboard.get_selected_text() | |
clipboard.set(t) | |
b_copy.action = b_copy_action | |
self.add_subview(b_copy) | |
x = x0 + 1 * (d + dd) | |
y = h_icons + dd + 2 * (d + dd) | |
b_down = ui.Button() | |
b_down.frame = (x,y,d,d) | |
b_down.corner_radius = d/4 | |
b_down.title = '⬇️' | |
b_down.background_color = 'white' | |
b_down.border_width = 1 | |
def b_down_action(sender): | |
t = keyboard.get_input_context() # current line | |
l0 = len(t[0]) | |
l1 = len(t[1]) | |
keyboard.move_cursor(l1) | |
keyboard.move_cursor(1) # begin of next line | |
t = keyboard.get_input_context() # next line | |
l2 = len(t[0]) | |
l3 = len(t[1]) | |
if (l2+l3) >= l0: | |
keyboard.move_cursor(l0) | |
else: | |
pass | |
#keyboard.move_cursor(2)#l0-l2) | |
b_down.action = b_down_action | |
self.add_subview(b_down) | |
x = x0 + 2 * (d + dd) + dd + d/2 | |
y = h_icons + dd + 2 * (d + dd) | |
b_delete = ui.Button() | |
b_delete.frame = (x,y,d,d) | |
b_delete.corner_radius = d/4 | |
b_delete.title = '左削除' # delete | |
b_delete.background_color = 'white' | |
b_delete.border_width = 1 | |
def b_delete_action(sender): | |
keyboard.backspace(times=1) | |
b_delete.action = b_delete_action | |
self.add_subview(b_delete) | |
d = 32 | |
dd = 4 | |
w_buttons = 0 | |
#create normal keys | |
emojis = '😊😜😱💦☔️(笑)☀️☁️☃️❄️🍙🍔🚗🌈⭐️😀😃😄😁😆😅😂🤣☺️😊😇🙂🙃😉😌😍🥰😘😗😙😚😋😛😝😜🤪🤨🧐🤓😎🤩🥳😏😒😞😔😟😕🙁☹️😣😖😫😩🥺😢😭😤😠😡🤬🤯😳🥵🥶😨😰😥😓🤗🤔🤭🤫🤥😶😐😑😬😦😧😮😲😴' | |
n_emojis_in_set = 10 | |
n_sets = 1 + int((len(emojis)-1)/n_emojis_in_set) | |
self.vv_array = [] | |
for i_set in range(0,n_sets): | |
l = int(len(emojis)/n_sets) | |
i = i_set * l | |
set_emojis = emojis[i:i+l] + '⏩' | |
w, h = ui.get_screen_size() | |
vv = ui.View(name='set'+str(i_set)) | |
vv.background_color = 'lightgray' | |
h = 0 | |
x = dd | |
y = dd | |
for button_title in set_emojis: | |
b = ui.Button(title=button_title) | |
if button_title == '⏩': | |
b_action = self.nextSet | |
b.i_set = i_set | |
b.n_sets = n_sets | |
b.name = 'nextSet' | |
else: | |
b_action = self.typeChar | |
b.action=b_action | |
b.frame = (x,y,d,d) | |
b.font = ('.SFUIText', d) | |
if (y+d+dd) > h: | |
h = y + d + dd | |
vv.add_subview(b) | |
x = x + d + dd | |
if (x+d+dd) > w: | |
x = dd | |
y = y + d + dd | |
vv.frame = (w_buttons,0,w-w_buttons,h) | |
self.vv_array.append(vv) | |
self.add_subview(vv) | |
i_set = 0 | |
self.nextSet(self.vv_array[n_sets-1]['nextSet']) # display 1st set | |
def typeChar(self,sender): | |
keyboard.insert_text(sender.title) | |
def nextSet(self,sender): | |
i_set = sender.i_set + 1 | |
if i_set == sender.n_sets: | |
i_set = 0 | |
#attach our accessory to the textfield, and textview | |
ww = self.vv_array[i_set] | |
ww.bring_to_front() | |
def main(): | |
if not keyboard.is_keyboard(): | |
return | |
v = MyView() | |
keyboard.set_view(v, 'expanded') | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment