diff --git a/src/pygwin2/ui.py b/src/pygwin2/ui.py deleted file mode 100644 index 4720f02..0000000 --- a/src/pygwin2/ui.py +++ /dev/null @@ -1,734 +0,0 @@ -from pygwin._pg import pg as _pg -from pygwin.surface import surface as _s -from pygwin.font import defaultFont as _df -from pygwin.image import load as _l -from pygwin.rect import rect as _r -import pygwin.mouse as _m -import pygwin.keyboard as _k -import ctypes as _ct -import copy as _copy - -class widget: - power = True - destroyed = False - def _args(self, locals): - args = _copy.copy(locals) - for i in args.items(): - if i[0] != 'self': - exec(f'self.{i[0]} = args["{i[0]}"]') - self._args = args - def __init__(self, surface): - self._args(locals()) - def draw(self, win, pos): - win.blit(self.surface,pos) - def on(self): - self.power = True - def off(self): - self.power = False - def destroy(self): - self.destroyed = True - def config(self, **parameters): - if parameters != {}: - for i in parameters.items(): - if i[0] in list(self.__dict__.keys()): - exec(f'self.{i[0]} = parameters["{i[0]}"]') - self._args[i[0]] = i[1] - else: - return self._args - self.__init__(**self._args) -class button(widget): - def __init__(self,text, - func=lambda:None, - fontSize=30,font=_df, - width=None,height=None, - bg=(70,70,70),fg=(180,180,200), - afg=(50,50,50),abg=(200,200,200), - borderColor=(50,50,50),borderWidth=5): - super()._args(locals()) - self.cl0 = False - self.cl1 = False - self.nc0 = True - self._generate() - def _generate(self, position=None): - if self.width == None or self.height == None: - textSize = self.font.size(self.text,self.fontSize) - if self.width != None: - self.surface = _s((self.width,textSize[1]+10)) - elif self.height != None: - self.surface = _s((textSize[0]+50,self.height)) - else: - self.surface = _s((textSize[0]+50,textSize[1]+10)) - else: - self.surface = _s((self.width,self.height)) - if position != None: - contains = self.surface.rect(position[0], position[1]).contains( - _m.getPosition()[0], _m.getPosition()[1]) - cacm = contains and _m.isPressed('left') - else: - contains = False - cacm = False - if contains and not self.cl0: - _m.setCursor(_pg.SYSTEM_CURSOR_HAND) - self.cl0 = True - self.nc0 = True - elif not contains: - if self.nc0: - _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) - self.nc0 = False - self.cl0 = False - if cacm and not self.cl1: - self.func() - self.cl1 = True - elif not cacm: - self.cl1 = False - self.surface.fill(self.borderColor) - if cacm: - self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, - self.surface.size[0]-self.borderWidth*2, - self.surface.size[1]-self.borderWidth*2)) - else: - self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, - self.surface.size[0]-self.borderWidth*2, - self.surface.size[1]-self.borderWidth*2)) - if cacm: - text = self.font.render(self.text,self.fontSize,self.afg) - else: - text = self.font.render(self.text,self.fontSize,self.fg) - pos = text.rect(center=( - self.surface.size[0]/2, - self.surface.size[1]/2)) - pos = [pos.x, pos.y] - self.surface.blit(text,pos) - def draw(self, win, pos): - self._generate(pos) - win.blit(self.surface,pos) -class label(widget): - def __init__(self,text,size=30, - color=(0,0,0),font=_df): - self.surface = font.render(text,size,color) -class entry(widget): - def __init__(self,hint='',fontSize=30,font=_df, - width=None,height=None,hide=False, - bg=(70,70,70),fg=(180,180,200), - afg=(200,200,200),abg=(50,50,50), - hintColor=(100,100,100), - lineColor=(200,200,200), - borderColor=(50,50,50), - borderWidth=5,maxSymbols=None, - whitelist=None,blacklist=[]): - super()._args(locals()) - self.text = '' - self.focus = False - self.tick = 0 - self.wcl = False - self.startHint = self.hint - self.ws = False - if self.width == None or self.height == None: - if self.hint != '': - hintSize = self.font.size(self.hint,self.fontSize) - else: - hintSize = (150,self.font.size('X',self.fontSize)[1]) - if self.height == None: - self.height = hintSize[1]+10 - if self.width == None: - self.width = hintSize[0]+50 - self.surface = _s((self.width,self.height)) - self.wclk = [] - self.wsnr = False - def _generate(self,position=None): - self.surface.fill(self.borderColor) - if self.focus: - self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, - self.surface.size[0]-self.borderWidth*2, - self.surface.size[1]-self.borderWidth*2)) - if self.text == '': - if not self.hide: - text = self.font.render(self.hint,self.fontSize,self.hintColor) - else: - text = self.font.render('*'*len(self.hint),self.fontSize,self.hintColor) - else: - if not self.hide: - text = self.font.render(self.text,self.fontSize,self.afg) - else: - text = self.font.render('*'*len(self.text),self.fontSize,self.afg) - x = 10 - if text.size[0] >= self.surface.size[0]-20: - x = self.surface.size[0]-text.size[0]-10 - self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) - for i in _k.getPressed().items(): - if i[1]: - if i[0] not in self.wclk: - if len(i[0]) == 1: - self.insert(i[0]) - elif i[0] == 'backspace': - self.delete() - elif i[0] == 'return': - self.focus = False - elif i[0] == 'space': - self.insert(' ') - self.wclk.append(i[0]) - else: - if i[0] in self.wclk: - self.wclk.remove(i[0]) - self.tick += 1 - if self.tick >= 60: - if self.text != '': - points = [[x+text.size[0],self.surface.size[1]/2-text.size[1]/2], - [x+text.size[0],self.surface.size[1]/2-text.size[1]/2+self.surface.size[1]-10]] - self.surface.draw.line(self.lineColor,points[0],points[1],3) - if self.tick == 120: - self.tick = 0 - else: - self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, - self.surface.size[0]-self.borderWidth*2, - self.surface.size[1]-self.borderWidth*2)) - if self.text == '': - if not self.hide: - text = self.font.render(self.hint,self.fontSize,self.hintColor) - else: - text = self.font.render('*'*len(self.hint),self.fontSize,self.hintColor) - else: - if self.hide: - text = self.font.render(self.text,self.fontSize,self.fg) - else: - text = self.font.render('*'*len(self.text),self.fontSize,self.fg) - x = self.surface.size[0]/2-text.size[0]/2 - if text.size[0] >= self.surface.size[0]-20: - x = self.surface.size[0]-text.size[0]-10 - self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) - - if position != None: - if self.surface.rect(position[0], - position[1]).contains(_m.getPosition()[0], - _m.getPosition()[1]): - if not self.wcl: - _m.setCursor(_pg.SYSTEM_CURSOR_HAND) - else: - if not self.ws: - _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) - self.ws = True - if _m.isPressed('left'): - if not self.wcl: - self.focus=self.focus==0 - self.wcl = True - else: - self.wcl = False - self.wsnr = False - else: - if not self.wsnr: - _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) - self.wsnr = True - if _m.isPressed('left'): - self.focus = False - def insert(self,text): - if _ct.WinDLL("User32.dll").GetKeyState(0x14): - text = text.upper() - if hex(getattr(_ct.windll.LoadLibrary("user32.dll"), "GetKeyboardLayout")(0))=='0x4190419': - text = text.translate(dict(zip(map(ord, - '''qwertyuiop[]asdfghjkl;'zxcvbnm,./`QWERTYUIOPASDFGHJKLZXCVBNM'''), - '''йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗФЫВАПРОЛДЯЧСМИТЬ'''))) - if _pg.key.get_pressed()[_pg.K_LSHIFT] or _pg.key.get_pressed()[_pg.K_RSHIFT]: - text = text.translate(dict(zip(map(ord, - u'''1234567890-=[]\;',./`'''), - u'''!@#$%^&*()_+{}|:"<>?~'''))) - if text in self.blacklist: - return - if self.whitelist != None: - if text not in self.whitelist: - return - if self.maxSymbols != None: - if len(self.text) > self.maxSymbols: - return - self.text += text - def delete(self,symbols=1): - self.text = self.text[:0-symbols] - def draw(self, win, pos): - self._generate(pos) - win.blit(self.surface,pos) - def get(self): - return self.text -class textarea(widget): - def __init__(self,hint='',fontSize=30, - font=_df,width=None,bg=(70,70,70), - fg=(180,180,200),afg=(200,200,200), - abg=(50,50,50),hintColor=(100,100,100), - lineColor=(200,200,200), - borderColor=(50,50,50), - borderWidth=5,maxSymbols=None, - whitelist=None,blacklist=[]): - super()._args(locals()) - self.text = '' - self.focus = False - self.tick = 0 - self.wcl = False - self.startHint = self.hint - self.ws = False - if self.hint != '': - hintSize = self.font.size(self.hint,self.fontSize) - else: - hintSize = (150,self.font.size('X',self.fontSize)[1]) - self.height = hintSize[1]+10 - if self.width == None: - self.width = hintSize[0]+50 - self.surface = _s((self.width,self.height)) - self.wclk = [] - self.wsnr = False - def _generate(self,position=None): - self.surface.fill(self.borderColor) - if self.focus: - if self.text != '': - self.height = self.font.size(self.text,self.fontSize)[1]+10 - else: - self.height = self.font.size('X',self.fontSize)[1]+10 - self.surface = _s((self.width,self.height)) - self.surface.fill(self.borderColor) - self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, - self.surface.size[0]-self.borderWidth*2, - self.surface.size[1]-self.borderWidth*2)) - if self.text == '': - text = self.font.render(self.hint,self.fontSize,self.hintColor) - else: - text = self.font.render(self.text,self.fontSize,self.afg) - try: - last = self.text.split('\n')[-1] - except: - last = self.text - x = 10 - if self.font.size(last,self.fontSize)[0] >= self.surface.size[0]-20: - x = self.surface.size[0]-self.font.size(last,self.fontSize)[0] - self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) - for i in _k.getPressed().items(): - if i[1]: - if i[0] not in self.wclk: - if len(i[0]) == 1: - self.insert(i[0]) - elif i[0] == 'backspace': - self.delete() - elif i[0] == 'return': - if self.maxSymbols != None: - if len(self.text) > self.maxSymbols: - continue - self.text += '\n' - elif i[0] == 'space': - self.insert(' ') - self.wclk.append(i[0]) - else: - if i[0] in self.wclk: - self.wclk.remove(i[0]) - self.tick += 1 - if self.tick >= 60: - if self.text != '': - points = [[x+self.font.size(last,self.fontSize)[0], - self.surface.size[1]-(self.font.size('X',self.fontSize)[1])], - [x+self.font.size(last,self.fontSize)[0], - self.surface.size[1]/2-text.size[1]/2+self.surface.size[1]-10]] - self.surface.draw.line(self.lineColor,points[0],points[1],3) - if self.tick == 120: - self.tick = 0 - else: - self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, - self.surface.size[0]-self.borderWidth*2, - self.surface.size[1]-self.borderWidth*2)) - if self.text == '': - text = self.font.render(self.hint,self.fontSize,self.hintColor) - else: - text = self.font.render(self.text,self.fontSize,self.fg) - try: - last = self.text.split('\n')[-1] - except: - last = self.text - x = self.surface.size[0]/2-text.size[0]/2 - if self.font.size(last,self.fontSize)[0] >= self.surface.size[0]-20: - x = self.surface.size[0]-self.font.size(last,self.fontSize)[0] - self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) - - if position != None: - if self.surface.rect(position[0], - position[1]).contains(_m.getPosition()[0], - _m.getPosition()[1]): - if not self.wcl: - _m.setCursor(_pg.SYSTEM_CURSOR_HAND) - else: - if not self.ws: - _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) - self.ws = True - if _m.isPressed('left'): - if not self.wcl: - self.focus=self.focus==0 - self.wcl = True - else: - self.wcl = False - self.wsnr = False - else: - if not self.wsnr: - _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) - self.wsnr = True - if _m.isPressed('left'): - self.focus = False - def insert(self,text): - if _ct.WinDLL("User32.dll").GetKeyState(0x14): - text = text.upper() - if _pg.key.get_pressed()[_pg.K_LSHIFT] or _pg.key.get_pressed()[_pg.K_RSHIFT]: - text = text.translate(dict(zip(map(ord, '''1234567890-=[]\\;'''+"',./`"), - '''!@#$%^&*()_+{}|:"<>?~'''))) - if hex(getattr(_ct.windll.LoadLibrary("user32.dll"), - "GetKeyboardLayout")(0))=='0x4190419': - text = text.translate(dict(zip(map(ord, - '''qwertyuiop[]asdfghjkl;'zxcvbnm,./`QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?~'''), - '''йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё'''))) - if text in self.blacklist: - return - if self.whitelist != None: - if text not in self.whitelist: - return - if self.maxSymbols != None: - if len(self.text) > self.maxSymbols: - return - self.text += text - def delete(self,symbols=1): - self.text = self.text[:0-symbols] - def draw(self, win, pos): - self._generate(pos) - win.blit(self.surface,pos) - def get(self): - return self.text -class keySelect(entry): - def __init__(self,keyBefore='', - fontSize=30,font=_df, - width=None,height=None, - bg=(70,70,70),fg=(180,180,200), - afg=(200,200,200),abg=(50,50,50), - hintColor=(100,100,100), - lineColor=(200,200,200), - borderColor=(50,50,50), - borderWidth=5,maxSymbols=None, - whitelist=None,blacklist=[]): - super()._args(locals()) - self.hint = '' - self.text = keyBefore - self.focus = False - self.tick = 0 - self.wcl = False - self.startHint = self.hint - self.ws = False - if self.width == None or self.height == None: - if self.hint != '': - hintSize = self.font.size(self.hint,self.fontSize) - else: - hintSize = (150,self.font.size('X',self.fontSize)[1]) - if self.height == None: - self.height = hintSize[1]+10 - if self.width == None: - self.width = hintSize[0]+50 - self.surface = _s((self.width,self.height)) - self.wclk = [] - self.wsnr = False - def _generate(self,position=None): - self.surface.fill(self.borderColor) - if self.focus: - self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, - self.surface.size[0]-self.borderWidth*2, - self.surface.size[1]-self.borderWidth*2)) - if self.text == '': - text = self.font.render(self.hint,self.fontSize,self.hintColor) - else: - text = self.font.render(self.text,self.fontSize,self.afg) - x = self.surface.size[0]/2-text.size[0]/2 - if text.size[0] >= self.surface.size[0]-20: - x = self.surface.size[0]-text.size[0]-10 - self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) - for i in _k.getPressed().items(): - if i[1] and self.focus: - if i[0] in self.blacklist: - continue - if self.whitelist != None: - if i[0] not in self.whitelist: - continue - if self.maxSymbols != None: - if len(self.text) > self.maxSymbols: - continue - self.text = i[0] - break - self.tick += 1 - if self.tick >= 60: - if self.text != '': - points = [[x+text.size[0],self.surface.size[1]/2-text.size[1]/2], - [x+text.size[0],self.surface.size[1]/2-text.size[1]/2+self.surface.size[1]-10]] - self.surface.draw.line(self.lineColor,points[0],points[1],3) - if self.tick == 120: - self.tick = 0 - else: - self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, - self.surface.size[0]-self.borderWidth*2, - self.surface.size[1]-self.borderWidth*2)) - if self.text == '': - text = self.font.render(self.hint,self.fontSize,self.hintColor) - else: - text = self.font.render(self.text,self.fontSize,self.fg) - x = self.surface.size[0]/2-text.size[0]/2 - if text.size[0] >= self.surface.size[0]-20: - x = self.surface.size[0]-text.size[0]-10 - self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) - - if position != None: - if self.surface.rect(position[0], - position[1]).contains(_m.getPosition()[0], - _m.getPosition()[1]): - if not self.wcl: - _m.setCursor(_pg.SYSTEM_CURSOR_HAND) - else: - if not self.ws: - _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) - self.ws = True - if _m.isPressed('left'): - if not self.wcl: - self.focus=self.focus==0 - self.wcl = True - else: - self.wcl = False - self.wsnr = False - else: - if not self.wsnr: - _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) - self.wsnr = True - if _m.isPressed('left'): - self.focus = False - def draw(self, win, pos): - self._generate(pos) - win.blit(self.surface,pos) - def get(self): - return self.text -class image(widget): - def __init__(self, path): - self.surface = _l(path) -class loadingBar(widget): - def __init__(self,width, - height=50, - length=100, - bg=(70,70,70), - loadedColor=(50,200,50), - borderColor=(50,50,50), - borderWidth=5): - super()._args(locals()) - self.loaded = 0 - def step(self,count=1): - self.loaded += 1 - if self.loaded > self.length: - self.loaded = self.length - def set(self, x): - self.loaded = x - if self.loaded > self.length: - self.loaded = self.length - def reset(self): - self.loaded = 0 - def get(self): - return self.loaded - def draw(self, win, pos): - self.surface = _s((self.width,self.height)) - self.surface.fill(self.borderColor) - self.surface.draw.rect(self.bg,_r(5,5, - self.surface.size[0]-10, - self.surface.size[1]-10)) - self.surface.draw.rect(self.loadedColor,_r(self.borderWidth,self.borderWidth, - (self.surface.size[0]/self.length*self.loaded)-self.borderWidth*2, - self.surface.size[1]-self.borderWidth*2)) - win.blit(self.surface, pos) -class slider(widget): - def __init__(self,width, - bg=(70,70,70), - fg=(200,200,200), - horizontal=True): - super()._args(locals()) - self.s = False - self.x = 12.5 - self._generate(None) - def _generate(self, pos): - if self.horizontal: - self.surface = _s((self.width,50)) - self.surface.draw.line(self.bg,[12.5,25],[self.width-12.5,25],10) - self.surface.draw.circle(self.bg,[12.5,26],5) - self.surface.draw.circle(self.bg,[self.width-12.5,26],5) - self.surface.draw.circle(self.fg,[self.x,25],12.5) - else: - self.surface = _s((50,self.width)) - self.surface.draw.line(self.bg,[25,12.5],[25,self.width-12.5],10) - self.surface.draw.circle(self.bg,[26,12.5],5) - self.surface.draw.circle(self.bg,[26,self.width-12.5],5) - self.surface.draw.circle(self.fg,[25,self.x],12.5) - if pos != None: - if _m.isPressed('left'): - if self.horizontal: - rect = _r(pos[0]+5,pos[1], - self.surface.size[0]-10, - self.surface.size[1]) - if rect.contains(_m.getPosition()[0], - _m.getPosition()[1]) or self.s: - self.x = _m.getPosition()[0]-pos[0] - if self.x < 12.5: self.x = 12.5 - if self.x > self.width-12.5: self.x = self.width-12.5 - self.s = True - else: - rect = _r(pos[0],pos[1]+5, - self.surface.size[0], - self.surface.size[1]-10) - if rect.contains(_m.getPosition()[0], - _m.getPosition()[1]) or self.s: - self.x = _m.getPosition()[1]-pos[1] - if self.x < 12.5: self.x = 12.5 - if self.x > self.width-12.5: self.x = self.width-12.5 - self.s = True - else: - self.s = False - def get(self): - return int(self.x/(self.width-10)*101) - def set(self, x): - self.x = x/101*(self.width-10) - def draw(self, win, pos): - self._generate(pos) - win.blit(self.surface, pos) -class checkBox(widget): - def __init__(self,width=50,bg=(180,180,180), - fg=(50,180,50),afg=(70,200,70), - abg=(120,120,120),borderColor=(220,220,220), - borderWidth=5): - super()._args(locals()) - self.cl0 = False - self.cl1 = False - self.nc0 = True - self.x = False - self._generate() - def set(self, x): - self.x = x - def get(self): - return self.x - def _generate(self, position=None): - self.surface = _s((self.width,self.width)) - if position != None: - contains = self.surface.rect(position[0], position[1]).contains( - _m.getPosition()[0], _m.getPosition()[1]) - cacm = contains and _m.isPressed('left') - else: - contains = False - cacm = False - if contains and not self.cl0: - _m.setCursor(_pg.SYSTEM_CURSOR_HAND) - self.cl0 = True - self.nc0 = True - elif not contains: - if self.nc0: - _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) - self.nc0 = False - self.cl0 = False - if cacm and not self.cl1: - self.x=self.x==0 - self.cl1 = True - elif not cacm: - self.cl1 = False - self.surface.fill(self.borderColor) - if cacm: - self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, - self.surface.size[0]-self.borderWidth*2, - self.surface.size[1]-self.borderWidth*2)) - if self.x: - self.surface.draw.line(self.afg,[self.borderWidth,self.width/2+self.borderWidth], - [self.width/2,self.width-self.borderWidth],self.borderWidth) - self.surface.draw.line(self.afg,[self.width/2,self.width-self.borderWidth], - [self.width-self.borderWidth,self.borderWidth],self.borderWidth) - else: - self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, - self.surface.size[0]-self.borderWidth*2, - self.surface.size[1]-self.borderWidth*2)) - if self.x: - self.surface.draw.line(self.fg,[self.borderWidth,self.width/2+self.borderWidth], - [self.width/2,self.width-self.borderWidth],self.borderWidth) - self.surface.draw.line(self.fg,[self.width/2,self.width-self.borderWidth], - [self.width-self.borderWidth,self.borderWidth],self.borderWidth) - def draw(self, win, pos): - self._generate(pos) - win.blit(self.surface,pos) -class comboBox(widget): - def __init__(self,text,values=[], -fontSize=30,font=_df,width=None,height=None, -bg=(70,70,70),fg=(180,180,200),afg=(50,50,50), -abg=(200,200,200),borderColor=(50,50,50),borderWidth=5): - super()._args(locals()) - self._generate() - - def _generate(self, position=None): - self.surface = _s((255,self.width)) - - def draw(self, win, pos): - self._generate(pos) - win.blit(self.surface,pos) -class tip(widget): - def __init__(self,text,responceWidth,responceHeight,fontSize=15,font=_df, - borderColor=(180,180,50),borderWidth=2,bg=(255,255,128), - fg=(35,35,5),waitBeforeShowing=0, - tipPosRelativeCursor=(10,10)): - super()._args(locals()) - self.tick = -1 - self.lcp = (0,0) - self.tprc = self.tipPosRelativeCursor - self._generate() - def _generate(self, position=None): - self.surface = _s((self.responceWidth, - self.responceHeight)) - if position != None: - self.tick += 1 - if self.lcp != _m.getPosition(): - self.tick = 0 - self.lcp = _m.getPosition() - if self.tick >= self.waitBeforeShowing: - mp = _m.getPosition() - mp = [mp[0]+self.tprc[0]-position[0], - mp[1]+self.tprc[1]-position[1]] - rect = _r(mp[0],mp[1], - self.font.size(self.text,self.fontSize)[0]+4, - self.font.size(self.text,self.fontSize)[1]+6) - if mp[0]<0 or mp[1]<0:return - if mp[0]>self.responceWidth:return - if mp[1]>self.responceHeight:return - if mp[0]>self.responceWidth-rect.w: - mp[0]=self.responceWidth-rect.w - if mp[1]>self.responceHeight-rect.h: - mp[1]=self.responceHeight-rect.h - rect = _r(mp[0],mp[1], - self.font.size(self.text,self.fontSize)[0]+4, - self.font.size(self.text,self.fontSize)[1]+6) - self.surface.draw.rect(self.bg,rect) - self.surface.draw.rect( - self.borderColor,rect,self.borderWidth) - ts = self.font.render( - self.text,self.fontSize,self.fg) - self.surface.blit(ts,(mp[0]+2,mp[1]+3)) - def draw(self, win, pos): - self._generate(pos) - win.blit(self.surface,pos) - -class base: - def __init__(self, win, bg=(128,128,128)): - self._widgets = {} - self._bg = bg - self._win = win - self._page = 0 - def draw(self): - self._win.fill(self._bg) - for i in self._widgets[self._page]: - if i[0].power: - i[0].draw(self._win, i[1]) - if i[0].destroyed: - self._widgets[self._page].remove(i) - def put(self, widget, pos, page=0): - if page not in self._widgets: - self.blankPage(page) - self._widgets[page].append([widget, pos]) - def selectPage(self, page): - self._page = page - def getPage(self): - return self._page - def getWidgets(self, page=0): - return self._widgets[page] - def setWidgetPos(self,index,pos,page=0): - self._widgets[page][index] = [self._widgets[page][index][0], pos] - def blankPage(self,page): - self._widgets.update({page:[]}) diff --git a/src/pygwin2/ui/__init__.py b/src/pygwin2/ui/__init__.py new file mode 100644 index 0000000..370a986 --- /dev/null +++ b/src/pygwin2/ui/__init__.py @@ -0,0 +1,2 @@ +from . import widget +from . import base diff --git a/src/pygwin2/ui/base.py b/src/pygwin2/ui/base.py new file mode 100644 index 0000000..35d0d00 --- /dev/null +++ b/src/pygwin2/ui/base.py @@ -0,0 +1,66 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class widget: + power = True + destroyed = False + def _args(self, locals): + args = _copy.copy(locals) + for i in args.items(): + if i[0] != 'self': + exec(f'self.{i[0]} = args["{i[0]}"]') + self._args = args + def __init__(self, surface): + self._args(locals()) + def draw(self, win, pos): + win.blit(self.surface,pos) + def on(self): + self.power = True + def off(self): + self.power = False + def destroy(self): + self.destroyed = True + def config(self, **parameters): + if parameters != {}: + for i in parameters.items(): + if i[0] in list(self.__dict__.keys()): + exec(f'self.{i[0]} = parameters["{i[0]}"]') + self._args[i[0]] = i[1] + else: + return self._args + self.__init__(**self._args) + +class base: + def __init__(self, win, bg=(128,128,128)): + self._widgets = {} + self._bg = bg + self._win = win + self._page = 0 + def draw(self): + self._win.fill(self._bg) + for i in self._widgets[self._page]: + if i[0].power: + i[0].draw(self._win, i[1]) + if i[0].destroyed: + self._widgets[self._page].remove(i) + def put(self, widget, pos, page=0): + if page not in self._widgets: + self.blankPage(page) + self._widgets[page].append([widget, pos]) + def selectPage(self, page): + self._page = page + def getPage(self): + return self._page + def getWidgets(self, page=0): + return self._widgets[page] + def setWidgetPos(self,index,pos,page=0): + self._widgets[page][index] = [self._widgets[page][index][0], pos] + def blankPage(self,page): + self._widgets.update({page:[]}) diff --git a/src/pygwin2/ui/widget/__init__.py b/src/pygwin2/ui/widget/__init__.py new file mode 100644 index 0000000..ceace21 --- /dev/null +++ b/src/pygwin2/ui/widget/__init__.py @@ -0,0 +1,11 @@ +from . import checkbox +from . import entry +from . import keyselect +from . import button +from . import combobox +from . import image +from . import label +from . import loadingbar +from . import textarea +from . import tip +from . import slider diff --git a/src/pygwin2/ui/widget/button.py b/src/pygwin2/ui/widget/button.py new file mode 100644 index 0000000..58f49e2 --- /dev/null +++ b/src/pygwin2/ui/widget/button.py @@ -0,0 +1,77 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class button(widget): + def __init__(self,text, + func=lambda:None, + fontSize=30,font=_df, + width=None,height=None, + bg=(70,70,70),fg=(180,180,200), + afg=(50,50,50),abg=(200,200,200), + borderColor=(50,50,50),borderWidth=5): + super()._args(locals()) + self.cl0 = False + self.cl1 = False + self.nc0 = True + self._generate() + def _generate(self, position=None): + if self.width == None or self.height == None: + textSize = self.font.size(self.text,self.fontSize) + if self.width != None: + self.surface = _s((self.width,textSize[1]+10)) + elif self.height != None: + self.surface = _s((textSize[0]+50,self.height)) + else: + self.surface = _s((textSize[0]+50,textSize[1]+10)) + else: + self.surface = _s((self.width,self.height)) + if position != None: + contains = self.surface.rect(position[0], position[1]).contains( + _m.getPosition()[0], _m.getPosition()[1]) + cacm = contains and _m.isPressed('left') + else: + contains = False + cacm = False + if contains and not self.cl0: + _m.setCursor(_pg.SYSTEM_CURSOR_HAND) + self.cl0 = True + self.nc0 = True + elif not contains: + if self.nc0: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.nc0 = False + self.cl0 = False + if cacm and not self.cl1: + self.func() + self.cl1 = True + elif not cacm: + self.cl1 = False + self.surface.fill(self.borderColor) + if cacm: + self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + else: + self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if cacm: + text = self.font.render(self.text,self.fontSize,self.afg) + else: + text = self.font.render(self.text,self.fontSize,self.fg) + pos = text.rect(center=( + self.surface.size[0]/2, + self.surface.size[1]/2)) + pos = [pos.x, pos.y] + self.surface.blit(text,pos) + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) + diff --git a/src/pygwin2/ui/widget/checkbox.py b/src/pygwin2/ui/widget/checkbox.py new file mode 100644 index 0000000..e8cb608 --- /dev/null +++ b/src/pygwin2/ui/widget/checkbox.py @@ -0,0 +1,71 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class checkBox(widget): + def __init__(self,width=50,bg=(180,180,180), + fg=(50,180,50),afg=(70,200,70), + abg=(120,120,120),borderColor=(220,220,220), + borderWidth=5): + super()._args(locals()) + self.cl0 = False + self.cl1 = False + self.nc0 = True + self.x = False + self._generate() + def set(self, x): + self.x = x + def get(self): + return self.x + def _generate(self, position=None): + self.surface = _s((self.width,self.width)) + if position != None: + contains = self.surface.rect(position[0], position[1]).contains( + _m.getPosition()[0], _m.getPosition()[1]) + cacm = contains and _m.isPressed('left') + else: + contains = False + cacm = False + if contains and not self.cl0: + _m.setCursor(_pg.SYSTEM_CURSOR_HAND) + self.cl0 = True + self.nc0 = True + elif not contains: + if self.nc0: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.nc0 = False + self.cl0 = False + if cacm and not self.cl1: + self.x=self.x==0 + self.cl1 = True + elif not cacm: + self.cl1 = False + self.surface.fill(self.borderColor) + if cacm: + self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.x: + self.surface.draw.line(self.afg,[self.borderWidth,self.width/2+self.borderWidth], + [self.width/2,self.width-self.borderWidth],self.borderWidth) + self.surface.draw.line(self.afg,[self.width/2,self.width-self.borderWidth], + [self.width-self.borderWidth,self.borderWidth],self.borderWidth) + else: + self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.x: + self.surface.draw.line(self.fg,[self.borderWidth,self.width/2+self.borderWidth], + [self.width/2,self.width-self.borderWidth],self.borderWidth) + self.surface.draw.line(self.fg,[self.width/2,self.width-self.borderWidth], + [self.width-self.borderWidth,self.borderWidth],self.borderWidth) + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) + diff --git a/src/pygwin2/ui/widget/combobox.py b/src/pygwin2/ui/widget/combobox.py new file mode 100644 index 0000000..3e5e26d --- /dev/null +++ b/src/pygwin2/ui/widget/combobox.py @@ -0,0 +1,25 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class comboBox(widget): + def __init__(self,text,values=[], +fontSize=30,font=_df,width=None,height=None, +bg=(70,70,70),fg=(180,180,200),afg=(50,50,50), +abg=(200,200,200),borderColor=(50,50,50),borderWidth=5): + super()._args(locals()) + self._generate() + + def _generate(self, position=None): + self.surface = _s((255,self.width)) + + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) + diff --git a/src/pygwin2/ui/widget/entry.py b/src/pygwin2/ui/widget/entry.py new file mode 100644 index 0000000..2031784 --- /dev/null +++ b/src/pygwin2/ui/widget/entry.py @@ -0,0 +1,152 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class entry(widget): + def __init__(self,hint='',fontSize=30,font=_df, + width=None,height=None,hide=False, + bg=(70,70,70),fg=(180,180,200), + afg=(200,200,200),abg=(50,50,50), + hintColor=(100,100,100), + lineColor=(200,200,200), + borderColor=(50,50,50), + borderWidth=5,maxSymbols=None, + whitelist=None,blacklist=[]): + super()._args(locals()) + self.text = '' + self.focus = False + self.tick = 0 + self.wcl = False + self.startHint = self.hint + self.ws = False + if self.width == None or self.height == None: + if self.hint != '': + hintSize = self.font.size(self.hint,self.fontSize) + else: + hintSize = (150,self.font.size('X',self.fontSize)[1]) + if self.height == None: + self.height = hintSize[1]+10 + if self.width == None: + self.width = hintSize[0]+50 + self.surface = _s((self.width,self.height)) + self.wclk = [] + self.wsnr = False + def _generate(self,position=None): + self.surface.fill(self.borderColor) + if self.focus: + self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + if not self.hide: + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render('*'*len(self.hint),self.fontSize,self.hintColor) + else: + if not self.hide: + text = self.font.render(self.text,self.fontSize,self.afg) + else: + text = self.font.render('*'*len(self.text),self.fontSize,self.afg) + x = 10 + if text.size[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-text.size[0]-10 + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + for i in _k.getPressed().items(): + if i[1]: + if i[0] not in self.wclk: + if len(i[0]) == 1: + self.insert(i[0]) + elif i[0] == 'backspace': + self.delete() + elif i[0] == 'return': + self.focus = False + elif i[0] == 'space': + self.insert(' ') + self.wclk.append(i[0]) + else: + if i[0] in self.wclk: + self.wclk.remove(i[0]) + self.tick += 1 + if self.tick >= 60: + if self.text != '': + points = [[x+text.size[0],self.surface.size[1]/2-text.size[1]/2], + [x+text.size[0],self.surface.size[1]/2-text.size[1]/2+self.surface.size[1]-10]] + self.surface.draw.line(self.lineColor,points[0],points[1],3) + if self.tick == 120: + self.tick = 0 + else: + self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + if not self.hide: + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render('*'*len(self.hint),self.fontSize,self.hintColor) + else: + if self.hide: + text = self.font.render(self.text,self.fontSize,self.fg) + else: + text = self.font.render('*'*len(self.text),self.fontSize,self.fg) + x = self.surface.size[0]/2-text.size[0]/2 + if text.size[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-text.size[0]-10 + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + + if position != None: + if self.surface.rect(position[0], + position[1]).contains(_m.getPosition()[0], + _m.getPosition()[1]): + if not self.wcl: + _m.setCursor(_pg.SYSTEM_CURSOR_HAND) + else: + if not self.ws: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.ws = True + if _m.isPressed('left'): + if not self.wcl: + self.focus=self.focus==0 + self.wcl = True + else: + self.wcl = False + self.wsnr = False + else: + if not self.wsnr: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.wsnr = True + if _m.isPressed('left'): + self.focus = False + def insert(self,text): + if _ct.WinDLL("User32.dll").GetKeyState(0x14): + text = text.upper() + if hex(getattr(_ct.windll.LoadLibrary("user32.dll"), "GetKeyboardLayout")(0))=='0x4190419': + text = text.translate(dict(zip(map(ord, + '''qwertyuiop[]asdfghjkl;'zxcvbnm,./`QWERTYUIOPASDFGHJKLZXCVBNM'''), + '''йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗФЫВАПРОЛДЯЧСМИТЬ'''))) + if _pg.key.get_pressed()[_pg.K_LSHIFT] or _pg.key.get_pressed()[_pg.K_RSHIFT]: + text = text.translate(dict(zip(map(ord, + u'''1234567890-=[]\;',./`'''), + u'''!@#$%^&*()_+{}|:"<>?~'''))) + if text in self.blacklist: + return + if self.whitelist != None: + if text not in self.whitelist: + return + if self.maxSymbols != None: + if len(self.text) > self.maxSymbols: + return + self.text += text + def delete(self,symbols=1): + self.text = self.text[:0-symbols] + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) + def get(self): + return self.text + diff --git a/src/pygwin2/ui/widget/image.py b/src/pygwin2/ui/widget/image.py new file mode 100644 index 0000000..f3c7058 --- /dev/null +++ b/src/pygwin2/ui/widget/image.py @@ -0,0 +1,13 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class image(widget): + def __init__(self, path): + self.surface = _l(path) diff --git a/src/pygwin2/ui/widget/keyselect.py b/src/pygwin2/ui/widget/keyselect.py new file mode 100644 index 0000000..40570f3 --- /dev/null +++ b/src/pygwin2/ui/widget/keyselect.py @@ -0,0 +1,116 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class keySelect(entry): + def __init__(self,keyBefore='', + fontSize=30,font=_df, + width=None,height=None, + bg=(70,70,70),fg=(180,180,200), + afg=(200,200,200),abg=(50,50,50), + hintColor=(100,100,100), + lineColor=(200,200,200), + borderColor=(50,50,50), + borderWidth=5,maxSymbols=None, + whitelist=None,blacklist=[]): + super()._args(locals()) + self.hint = '' + self.text = keyBefore + self.focus = False + self.tick = 0 + self.wcl = False + self.startHint = self.hint + self.ws = False + if self.width == None or self.height == None: + if self.hint != '': + hintSize = self.font.size(self.hint,self.fontSize) + else: + hintSize = (150,self.font.size('X',self.fontSize)[1]) + if self.height == None: + self.height = hintSize[1]+10 + if self.width == None: + self.width = hintSize[0]+50 + self.surface = _s((self.width,self.height)) + self.wclk = [] + self.wsnr = False + def _generate(self,position=None): + self.surface.fill(self.borderColor) + if self.focus: + self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render(self.text,self.fontSize,self.afg) + x = self.surface.size[0]/2-text.size[0]/2 + if text.size[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-text.size[0]-10 + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + for i in _k.getPressed().items(): + if i[1] and self.focus: + if i[0] in self.blacklist: + continue + if self.whitelist != None: + if i[0] not in self.whitelist: + continue + if self.maxSymbols != None: + if len(self.text) > self.maxSymbols: + continue + self.text = i[0] + break + self.tick += 1 + if self.tick >= 60: + if self.text != '': + points = [[x+text.size[0],self.surface.size[1]/2-text.size[1]/2], + [x+text.size[0],self.surface.size[1]/2-text.size[1]/2+self.surface.size[1]-10]] + self.surface.draw.line(self.lineColor,points[0],points[1],3) + if self.tick == 120: + self.tick = 0 + else: + self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render(self.text,self.fontSize,self.fg) + x = self.surface.size[0]/2-text.size[0]/2 + if text.size[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-text.size[0]-10 + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + + if position != None: + if self.surface.rect(position[0], + position[1]).contains(_m.getPosition()[0], + _m.getPosition()[1]): + if not self.wcl: + _m.setCursor(_pg.SYSTEM_CURSOR_HAND) + else: + if not self.ws: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.ws = True + if _m.isPressed('left'): + if not self.wcl: + self.focus=self.focus==0 + self.wcl = True + else: + self.wcl = False + self.wsnr = False + else: + if not self.wsnr: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.wsnr = True + if _m.isPressed('left'): + self.focus = False + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) + def get(self): + return self.text diff --git a/src/pygwin2/ui/widget/label.py b/src/pygwin2/ui/widget/label.py new file mode 100644 index 0000000..d07d908 --- /dev/null +++ b/src/pygwin2/ui/widget/label.py @@ -0,0 +1,15 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class label(widget): + def __init__(self,text,size=30, + color=(0,0,0),font=_df): + self.surface = font.render(text,size,color) + diff --git a/src/pygwin2/ui/widget/loadingbar.py b/src/pygwin2/ui/widget/loadingbar.py new file mode 100644 index 0000000..68a2674 --- /dev/null +++ b/src/pygwin2/ui/widget/loadingbar.py @@ -0,0 +1,43 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class loadingBar(widget): + def __init__(self,width, + height=50, + length=100, + bg=(70,70,70), + loadedColor=(50,200,50), + borderColor=(50,50,50), + borderWidth=5): + super()._args(locals()) + self.loaded = 0 + def step(self,count=1): + self.loaded += 1 + if self.loaded > self.length: + self.loaded = self.length + def set(self, x): + self.loaded = x + if self.loaded > self.length: + self.loaded = self.length + def reset(self): + self.loaded = 0 + def get(self): + return self.loaded + def draw(self, win, pos): + self.surface = _s((self.width,self.height)) + self.surface.fill(self.borderColor) + self.surface.draw.rect(self.bg,_r(5,5, + self.surface.size[0]-10, + self.surface.size[1]-10)) + self.surface.draw.rect(self.loadedColor,_r(self.borderWidth,self.borderWidth, + (self.surface.size[0]/self.length*self.loaded)-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + win.blit(self.surface, pos) + diff --git a/src/pygwin2/ui/widget/slider.py b/src/pygwin2/ui/widget/slider.py new file mode 100644 index 0000000..75c201d --- /dev/null +++ b/src/pygwin2/ui/widget/slider.py @@ -0,0 +1,64 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class slider(widget): + def __init__(self,width, + bg=(70,70,70), + fg=(200,200,200), + horizontal=True): + super()._args(locals()) + self.s = False + self.x = 12.5 + self._generate(None) + def _generate(self, pos): + if self.horizontal: + self.surface = _s((self.width,50)) + self.surface.draw.line(self.bg,[12.5,25],[self.width-12.5,25],10) + self.surface.draw.circle(self.bg,[12.5,26],5) + self.surface.draw.circle(self.bg,[self.width-12.5,26],5) + self.surface.draw.circle(self.fg,[self.x,25],12.5) + else: + self.surface = _s((50,self.width)) + self.surface.draw.line(self.bg,[25,12.5],[25,self.width-12.5],10) + self.surface.draw.circle(self.bg,[26,12.5],5) + self.surface.draw.circle(self.bg,[26,self.width-12.5],5) + self.surface.draw.circle(self.fg,[25,self.x],12.5) + if pos != None: + if _m.isPressed('left'): + if self.horizontal: + rect = _r(pos[0]+5,pos[1], + self.surface.size[0]-10, + self.surface.size[1]) + if rect.contains(_m.getPosition()[0], + _m.getPosition()[1]) or self.s: + self.x = _m.getPosition()[0]-pos[0] + if self.x < 12.5: self.x = 12.5 + if self.x > self.width-12.5: self.x = self.width-12.5 + self.s = True + else: + rect = _r(pos[0],pos[1]+5, + self.surface.size[0], + self.surface.size[1]-10) + if rect.contains(_m.getPosition()[0], + _m.getPosition()[1]) or self.s: + self.x = _m.getPosition()[1]-pos[1] + if self.x < 12.5: self.x = 12.5 + if self.x > self.width-12.5: self.x = self.width-12.5 + self.s = True + else: + self.s = False + def get(self): + return int(self.x/(self.width-10)*101) + def set(self, x): + self.x = x/101*(self.width-10) + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface, pos) + diff --git a/src/pygwin2/ui/widget/textarea.py b/src/pygwin2/ui/widget/textarea.py new file mode 100644 index 0000000..76a59eb --- /dev/null +++ b/src/pygwin2/ui/widget/textarea.py @@ -0,0 +1,156 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class textarea(widget): + def __init__(self,hint='',fontSize=30, + font=_df,width=None,bg=(70,70,70), + fg=(180,180,200),afg=(200,200,200), + abg=(50,50,50),hintColor=(100,100,100), + lineColor=(200,200,200), + borderColor=(50,50,50), + borderWidth=5,maxSymbols=None, + whitelist=None,blacklist=[]): + super()._args(locals()) + self.text = '' + self.focus = False + self.tick = 0 + self.wcl = False + self.startHint = self.hint + self.ws = False + if self.hint != '': + hintSize = self.font.size(self.hint,self.fontSize) + else: + hintSize = (150,self.font.size('X',self.fontSize)[1]) + self.height = hintSize[1]+10 + if self.width == None: + self.width = hintSize[0]+50 + self.surface = _s((self.width,self.height)) + self.wclk = [] + self.wsnr = False + def _generate(self,position=None): + self.surface.fill(self.borderColor) + if self.focus: + if self.text != '': + self.height = self.font.size(self.text,self.fontSize)[1]+10 + else: + self.height = self.font.size('X',self.fontSize)[1]+10 + self.surface = _s((self.width,self.height)) + self.surface.fill(self.borderColor) + self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render(self.text,self.fontSize,self.afg) + try: + last = self.text.split('\n')[-1] + except: + last = self.text + x = 10 + if self.font.size(last,self.fontSize)[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-self.font.size(last,self.fontSize)[0] + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + for i in _k.getPressed().items(): + if i[1]: + if i[0] not in self.wclk: + if len(i[0]) == 1: + self.insert(i[0]) + elif i[0] == 'backspace': + self.delete() + elif i[0] == 'return': + if self.maxSymbols != None: + if len(self.text) > self.maxSymbols: + continue + self.text += '\n' + elif i[0] == 'space': + self.insert(' ') + self.wclk.append(i[0]) + else: + if i[0] in self.wclk: + self.wclk.remove(i[0]) + self.tick += 1 + if self.tick >= 60: + if self.text != '': + points = [[x+self.font.size(last,self.fontSize)[0], + self.surface.size[1]-(self.font.size('X',self.fontSize)[1])], + [x+self.font.size(last,self.fontSize)[0], + self.surface.size[1]/2-text.size[1]/2+self.surface.size[1]-10]] + self.surface.draw.line(self.lineColor,points[0],points[1],3) + if self.tick == 120: + self.tick = 0 + else: + self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render(self.text,self.fontSize,self.fg) + try: + last = self.text.split('\n')[-1] + except: + last = self.text + x = self.surface.size[0]/2-text.size[0]/2 + if self.font.size(last,self.fontSize)[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-self.font.size(last,self.fontSize)[0] + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + + if position != None: + if self.surface.rect(position[0], + position[1]).contains(_m.getPosition()[0], + _m.getPosition()[1]): + if not self.wcl: + _m.setCursor(_pg.SYSTEM_CURSOR_HAND) + else: + if not self.ws: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.ws = True + if _m.isPressed('left'): + if not self.wcl: + self.focus=self.focus==0 + self.wcl = True + else: + self.wcl = False + self.wsnr = False + else: + if not self.wsnr: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.wsnr = True + if _m.isPressed('left'): + self.focus = False + def insert(self,text): + if _ct.WinDLL("User32.dll").GetKeyState(0x14): + text = text.upper() + if _pg.key.get_pressed()[_pg.K_LSHIFT] or _pg.key.get_pressed()[_pg.K_RSHIFT]: + text = text.translate(dict(zip(map(ord, '''1234567890-=[]\\;'''+"',./`"), + '''!@#$%^&*()_+{}|:"<>?~'''))) + if hex(getattr(_ct.windll.LoadLibrary("user32.dll"), + "GetKeyboardLayout")(0))=='0x4190419': + text = text.translate(dict(zip(map(ord, + '''qwertyuiop[]asdfghjkl;'zxcvbnm,./`QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?~'''), + '''йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё'''))) + if text in self.blacklist: + return + if self.whitelist != None: + if text not in self.whitelist: + return + if self.maxSymbols != None: + if len(self.text) > self.maxSymbols: + return + self.text += text + def delete(self,symbols=1): + self.text = self.text[:0-symbols] + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) + def get(self): + return self.text + diff --git a/src/pygwin2/ui/widget/tip.py b/src/pygwin2/ui/widget/tip.py new file mode 100644 index 0000000..e1084d9 --- /dev/null +++ b/src/pygwin2/ui/widget/tip.py @@ -0,0 +1,55 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class tip(widget): + def __init__(self,text,responceWidth,responceHeight,fontSize=15,font=_df, + borderColor=(180,180,50),borderWidth=2,bg=(255,255,128), + fg=(35,35,5),waitBeforeShowing=0, + tipPosRelativeCursor=(10,10)): + super()._args(locals()) + self.tick = -1 + self.lcp = (0,0) + self.tprc = self.tipPosRelativeCursor + self._generate() + def _generate(self, position=None): + self.surface = _s((self.responceWidth, + self.responceHeight)) + if position != None: + self.tick += 1 + if self.lcp != _m.getPosition(): + self.tick = 0 + self.lcp = _m.getPosition() + if self.tick >= self.waitBeforeShowing: + mp = _m.getPosition() + mp = [mp[0]+self.tprc[0]-position[0], + mp[1]+self.tprc[1]-position[1]] + rect = _r(mp[0],mp[1], + self.font.size(self.text,self.fontSize)[0]+4, + self.font.size(self.text,self.fontSize)[1]+6) + if mp[0]<0 or mp[1]<0:return + if mp[0]>self.responceWidth:return + if mp[1]>self.responceHeight:return + if mp[0]>self.responceWidth-rect.w: + mp[0]=self.responceWidth-rect.w + if mp[1]>self.responceHeight-rect.h: + mp[1]=self.responceHeight-rect.h + rect = _r(mp[0],mp[1], + self.font.size(self.text,self.fontSize)[0]+4, + self.font.size(self.text,self.fontSize)[1]+6) + self.surface.draw.rect(self.bg,rect) + self.surface.draw.rect( + self.borderColor,rect,self.borderWidth) + ts = self.font.render( + self.text,self.fontSize,self.fg) + self.surface.blit(ts,(mp[0]+2,mp[1]+3)) + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) +