def _get_raw_shadow(self): target_img = self.target.get_image(self.capture_state) r = target_img.get_rect() #the shadow will be larger in order to make free space for fadeout. r.inflate_ip(2*self.shadow_radius, 2*self.shadow_radius) img = Surface(r.size) img.fill((255, 255, 255, 255)) img.blit(target_img, (self.shadow_radius, self.shadow_radius)) if self.sun_angle <= 0.: raise Exception("Sun angle must be greater than zero.") elif self.sun_angle != 45. and self.vertical: w, h = img.get_size() new_h = h / tan(self.sun_angle * pi / 180.) screen_size = functions.get_screen().get_size() new_h = abs(int(min(new_h, max(screen_size)))) img = scale(img, (w, new_h)) if self.angle_mode == "flip": img = flip(img, self.mode_value[0], self.mode_value[1]) elif self.angle_mode == "rotate": img = rotate(img, self.mode_value) else: raise Exception("angle_mode not available: " + str(self.angle_mode)) shadow = pilgraphics.get_shadow(img, radius=self.shadow_radius, black=self.black, alpha_factor=self.alpha_factor, decay_mode=self.decay_mode, color=self.color) return shadow
def prelaunch(self): #handles func_before (unblittings, blittings, reactions deactivations) if parameters.FILL_SCREEN_AT_SUBMENUS: functions.get_screen().fill(parameters.SCREEN_FILL) pygame.display.flip() if self.func_before is None: self.default_func_before() else: self.func_before() self.activate_focus()
def center(self, x_shift=None, y_shift=None, element=None, axis=(True, True)): """Centers self's center on <element>'s center. If <element> = None, center self on self.surface's center. Optionnal shift arguments can be passed in order to shift self after centering. Optionnal axis argument can be passed, on the form (bool, bool), and is used to filter the centering. The components whose axis have False value will be unchanged. """ if not element: center = self.surface.get_rect().center elif element == "screen": center = functions.get_screen().get_rect().center else: center = element.get_storer_center() x = center[0] y = center[1] if x_shift is not None: x += x_shift if y_shift is not None: y += y_shift if not axis[0]: x = None if not axis[1]: y = None self.set_center((x, y))
def grid_store(nmax, frame, elements=None, mode="x", margin=5, gap=5, align="center"): if frame == "screen": frame = get_screen().get_rect() if isinstance(frame, Rect): rect = frame if elements is None: elements = [] else: if elements is None: elements = frame.get_elements() rect = frame.get_storer_rect() # x = margin y = margin for e in elements: counter = 0 e.set_topleft((x, y)) counter += 1 w, h = e.get_fus_rect().size if counter >= nmax: y += h + gap counter = 0 x = margin else: x += w + gap
def _get_raw_shadow(self): target_img = self.target.get_image(self.capture_state) r = target_img.get_rect() #the shadow will be larger in order to make free space for fadeout. r.inflate_ip(2 * self.shadow_radius, 2 * self.shadow_radius) img = Surface(r.size) img.fill((255, 255, 255, 255)) img.blit(target_img, (self.shadow_radius, self.shadow_radius)) if self.sun_angle <= 0.: raise Exception("Sun angle must be greater than zero.") elif self.sun_angle != 45. and self.vertical: w, h = img.get_size() new_h = h / tan(self.sun_angle * pi / 180.) screen_size = functions.get_screen().get_size() new_h = abs(int(min(new_h, max(screen_size)))) img = scale(img, (w, new_h)) if self.angle_mode == "flip": img = flip(img, self.mode_value[0], self.mode_value[1]) elif self.angle_mode == "rotate": img = rotate(img, self.mode_value) else: raise Exception("angle_mode not available: " + str(self.angle_mode)) shadow = pilgraphics.get_shadow(img, radius=self.shadow_radius, black=self.black, alpha_factor=self.alpha_factor, decay_mode=self.decay_mode, color=self.color) return shadow
def get_shadow(target_img, shadow_radius=2, black=255, color_format="RGBA", alpha_factor=0.85, decay_mode="exponential", color=(0,0,0), sun_angle=30., vertical=True, angle_mode="flip", mode_value=(False, True)): r = target_img.get_rect() #the shadow will be larger in order to make free space for fadeout. r.inflate_ip(2*shadow_radius, 2*shadow_radius) img = Surface(r.size) img.fill((255, 255, 255, 255)) img.blit(target_img, (shadow_radius, shadow_radius)) if sun_angle <= 0.: raise Exception("Sun angle must be greater than zero.") elif sun_angle != 45. and vertical: w, h = img.get_size() new_h = h / tan(sun_angle * pi / 180.) screen_size = functions.get_screen().get_size() new_h = abs(int(min(new_h, max(screen_size)))) img = scale(img, (w, new_h)) if angle_mode == "flip": img = flip(img, mode_value[0], mode_value[1]) elif self.angle_mode == "rotate": img = rotate(img, mode_value) else: raise Exception("angle_mode not available: " + str(angle_mode)) shadow = _pilshadow(img, radius=shadow_radius, black=black, alpha_factor=alpha_factor, decay_mode=decay_mode, color=color) # W, H = functions.get_screen_size() shadow.set_alpha(-1, RLEACCEL) return shadow.convert_alpha()
def save_screenshot(self, path=None, name=None, note=""): from thorpy.miscgui import functions if path is None: path = self.default_path if name is None: name = time.asctime().replace(" ", "_").replace(":", "-") + ".png" functions.debug_msg("Saving screenshot as " + path + note + name) pygame.image.save(functions.get_screen(), path+note+name)
def save_screenshot(self, path=None, name=None, note=""): from thorpy.miscgui import functions if path is None: path = self.default_path if name is None: name = time.asctime().replace(" ", "_").replace(":", "-") + ".png" functions.debug_msg("Saving screenshot as " + path + note + name) pygame.image.save(functions.get_screen(), path + note + name)
def __init__(self, hover_zone=None, elements=None, normal_params=None): Ghost.__init__(self, elements, normal_params) self._hovered = False self.set_hover(MOUSEMOTION) self._help_element = None self._waited = 0 self._help_wait_time = parameters.HELP_WAIT_TIME self._help_pos = None self._help_reaction = None self._help_blitted = False self.visible = False if hover_zone: self.set_hover_zone(hover_zone) self.surface = functions.get_screen()
def __init__(self, hover_zone=None, elements=None, normal_params=None): """Ghost element designed to react to mouse hovering - can post hover events . <hover_zone>: a pygame rect defining the hovering zone.""" Ghost.__init__(self, elements, normal_params) self._hovered = False self.set_hover(MOUSEMOTION) self._help_element = None self._waited = 0 self._help_wait_time = parameters.HELP_WAIT_TIME self._help_pos = None self._help_reaction = None self._help_blitted = False self.visible = False if hover_zone: self.set_hover_zone(hover_zone) self.surface = functions.get_screen()
def __init__(self, hover_zone=None, elements=None, normal_params=None): """Ghost element designed to react to mouse hovering - can post hover events . <hover_zone>: a pygame rect defining the hovering zone.""" Ghost.__init__(self, elements, normal_params) self._hovered = False self.set_hover(MOUSEMOTION) self._help_element = None self._waited = 0 self._help_wait_time = parameters.HELP_WAIT_TIME self._help_pos = None self._help_reaction = None self._help_blitted = False self.visible = False if hover_zone: self.set_hover_zone(hover_zone) self.surface = functions.get_screen()
def store(frame, elements=None, mode="v", x="auto", y="auto", margin=None, gap=None, align="center"): """ <frame> can be either an element, a pygame.Rect or "screen" <elements>=None, None (default) will store the children of <frame> <mode>="v", can be either "v" ("vertical") or "h" ("horizontal") <x>="auto", x coordinate begin <y>="auto", y coordinate begin <margin>=None, the margin to be used (this is a single value) <gap>=None, the gap to be used (this is a single value) <align>="center", "top" or "bottom" """ #frame argument handling if frame == "screen": frame = get_screen().get_rect() if isinstance(frame, Rect): rect = frame if elements is None: elements = [] ## elif frame.__class__.__name__ == "Box": ## raise Exception("You cannot call store on a Box instance."+\ ## "The Box element has its own store method.") else: if elements is None: elements = frame.get_elements() rect = frame.get_storer_rect() #end frame arg handling if mode == "v" or mode == "vertical": x = None if x == "auto" else x size = v_store(rect, elements, x, y, margin, gap, align) elif mode == "h" or mode == "horizontal": y = None if y == "auto" else y size = h_store(rect, elements, y, x, margin, gap, align) else: raise Exception("Store mode unknown.") return size
def reac_func_norestart(event): if event.what == constants.LAUNCH_DONE: w,h = varset.get_value("screen_w"), varset.get_value("screen_h") mdm = MetaDataManager() mdm.read_data(fn) mdm.data["screen_w"] = w mdm.data["screen_h"] = h mdm.data["fullscreen"] = varset.get_value("fullscreen") ## print("writing", mdm.data, fn) mdm.write_data(fn) #restart script flags = functions.get_screen().get_flags() if varset.get_value("fullscreen"): flags |= pygame.FULLSCREEN else: flags = 0 pygame.display.set_mode((w,h), flags) functions.get_current_menu()._elements[0].get_oldest_ancester().unblit_and_reblit() button.launched.blit() button.launched.update()
def reac_func_norestart(event): if event.what == constants.LAUNCH_DONE: w,h = varset.get_value("screen_w"), varset.get_value("screen_h") mdm = MetaDataManager() mdm.read_data(fn) mdm.data["screen_w"] = w mdm.data["screen_h"] = h mdm.data["fullscreen"] = varset.get_value("fullscreen") ## print("writing", mdm.data, fn) mdm.write_data(fn) #restart script flags = functions.get_screen().get_flags() if varset.get_value("fullscreen"): flags |= pygame.FULLSCREEN else: flags = 0 pygame.display.set_mode((w,h), flags) functions.get_current_menu()._elements[0].get_oldest_ancester().unblit_and_reblit() button.launched.blit() button.launched.update()
def get_screen(self): #wrapper from thorpy.miscgui import functions return functions.get_screen()
def get_screen(self): #wrapper from thorpy.miscgui import functions return functions.get_screen()
def __init__(self): """Object that is designed to be blitted on the screen.""" self.surface = functions.get_screen() self._old_clips = [None] # fifo
def make_display_options_setter(fn, const_text="", sliders_length=100, limvalsw=(400, None), limvalsh=(400, None), restart_app=True): from thorpy.miscgui.reaction import Reaction from thorpy.miscgui.metadata import MetaDataManager from thorpy.elements.launchers.paramsetterlauncher import ParamSetterLauncher from thorpy.miscgui.varset import VarSet import os, sys varset = VarSet() w, h = functions.get_screen_size() maxsize = functions.get_current_application().max_screen_size if limvalsw[1] is None: limvalsw = (limvalsw[0], maxsize[0]) if limvalsh[1] is None: limvalsh = (limvalsh[0], maxsize[1]) fullscreen = bool(functions.get_screen().get_flags() & pygame.FULLSCREEN) varset.add("screen_w", value=int(w), text="Screen width: ", limits=limvalsw) varset.add("screen_h", value=int(h), text="Screen height: ", limits=limvalsh) varset.add("fullscreen", value=fullscreen, text="Fullscreen") button = ParamSetterLauncher.make([varset], const_text, const_text, text_ok="Apply") def reac_func_norestart(event): if event.what == constants.LAUNCH_DONE: w, h = varset.get_value("screen_w"), varset.get_value("screen_h") mdm = MetaDataManager() mdm.read_data(fn) mdm.data["screen_w"] = w mdm.data["screen_h"] = h mdm.data["fullscreen"] = varset.get_value("fullscreen") ## print("writing", mdm.data, fn) mdm.write_data(fn) #restart script flags = functions.get_screen().get_flags() if varset.get_value("fullscreen"): flags |= pygame.FULLSCREEN else: flags = 0 pygame.display.set_mode((w, h), flags) functions.get_current_menu()._elements[0].get_oldest_ancester( ).unblit_and_reblit() button.launched.blit() button.launched.update() def reac_func_restart(event): if event.what == constants.LAUNCH_DONE: w, h = varset.get_value("screen_w"), varset.get_value("screen_h") mdm = MetaDataManager() mdm.read_data(fn) mdm.data["screen_w"] = w mdm.data["screen_h"] = h mdm.data["fullscreen"] = varset.get_value("fullscreen") ## print("writing", mdm.data, fn) mdm.write_data(fn) #restart script python = sys.executable os.execl(python, python, *sys.argv) reac_func = reac_func_restart if restart_app else reac_func_norestart reac = Reaction(constants.THORPY_EVENT, reac_func, { "id": constants.EVENT_UNLAUNCH, "launcher": button.launcher }) button.add_reaction(reac) return button
def make_display_options_setter(fn, const_text="", sliders_length=100, limvalsw=(400,None), limvalsh=(400,None), restart_app=True): from thorpy.miscgui.reaction import Reaction from thorpy.miscgui.metadata import MetaDataManager from thorpy.elements.launchers.paramsetterlauncher import ParamSetterLauncher from thorpy.miscgui.varset import VarSet import os, sys varset = VarSet() w,h = functions.get_screen_size() maxsize = functions.get_current_application().max_screen_size if limvalsw[1] is None: limvalsw = (limvalsw[0], maxsize[0]) if limvalsh[1] is None: limvalsh = (limvalsh[0], maxsize[1]) fullscreen = bool(functions.get_screen().get_flags()&pygame.FULLSCREEN) varset.add("screen_w", value=int(w), text="Screen width: ", limits=limvalsw) varset.add("screen_h", value=int(h), text="Screen height: ", limits=limvalsh) varset.add("fullscreen", value=fullscreen, text="Fullscreen") button = ParamSetterLauncher.make([varset], const_text, const_text, text_ok="Apply") def reac_func_norestart(event): if event.what == constants.LAUNCH_DONE: w,h = varset.get_value("screen_w"), varset.get_value("screen_h") mdm = MetaDataManager() mdm.read_data(fn) mdm.data["screen_w"] = w mdm.data["screen_h"] = h mdm.data["fullscreen"] = varset.get_value("fullscreen") ## print("writing", mdm.data, fn) mdm.write_data(fn) #restart script flags = functions.get_screen().get_flags() if varset.get_value("fullscreen"): flags |= pygame.FULLSCREEN else: flags = 0 pygame.display.set_mode((w,h), flags) functions.get_current_menu()._elements[0].get_oldest_ancester().unblit_and_reblit() button.launched.blit() button.launched.update() def reac_func_restart(event): if event.what == constants.LAUNCH_DONE: w,h = varset.get_value("screen_w"), varset.get_value("screen_h") mdm = MetaDataManager() mdm.read_data(fn) mdm.data["screen_w"] = w mdm.data["screen_h"] = h mdm.data["fullscreen"] = varset.get_value("fullscreen") ## print("writing", mdm.data, fn) mdm.write_data(fn) #restart script python = sys.executable os.execl(python, python, * sys.argv) reac_func=reac_func_restart if restart_app else reac_func_norestart reac = Reaction(constants.THORPY_EVENT, reac_func, {"id":constants.EVENT_UNLAUNCH, "launcher":button.launcher}) button.add_reaction(reac) return button