def __init__(self, x, y, width, height): super(ScrollPanel, self).__init__(x, y) self.width = width self.height = height self.font = Font() self.widgets = [] self.bornes = [0, 0]
def __init__(self): self.logo = pygame.image.load( os.path.join(os.path.dirname(__file__), "..", "..", "files", "images", "logo.png")).convert() self.logo = pygame.transform.scale(self.logo, (26, 26)) self.naos = None self.font = Font(size=17, bold=True, color=Color.from_name("BLACK")) self.hour = self.font.render(datetime.now().strftime("%H:%M:%S"))
def __init__(self, title, width, height, x=100, y=100): self.title = title self.width = clamp(width, 60) self.height = clamp(height, 10) self.x = clamp(x, 0, 1920) self.y = clamp(y + 20, 0, 1080) self.font = Font(bold=True) self.naos = None self.is_dragged = False self.drag_offset = [0, 0] self.widgets = [] self.focus = False self.open = True
def __init__(self, debug=False): self.paths = { "files": os.path.join(os.getenv('APPDATA'), "NaOS"), "system": os.path.join(os.getenv('APPDATA'), "NaOS", "system"), "user": os.path.join(os.getenv('APPDATA'), "NaOS", "user"), "programs": os.path.join(os.getenv('APPDATA'), "NaOS", "programs"), } self.fs = FileSystem(self) for v in self.paths.values(): if not os.path.exists(v): os.makedirs(v) self.db = Database(os.path.join(self.paths["system"], "data.db")) self.db.createdb() self.width = 1920 self.height = 1080 pygame.display.set_caption("NaOS") self.screen = pygame.display.set_mode((self.width, self.height), pygame.FULLSCREEN | pygame.SCALED) self.clock = pygame.time.Clock() self.is_running = False self.bg_color = Color.from_name("BLACK") self.debug = debug if self.debug: self.debug_font = Font() background = self.db.executewithreturn("""SELECT background FROM parameters""")[0][0] self.bg = None self.set_background(background) self.naosbar = NaOSBar() self.startmenu = StartMenu(self) self.windows = [] self.focused_window = None self.startmenu.naos = self self.naosbar.naos = self self.program_manager = ProgramManager()
def __init__(self, x, y, text, font=Font(size=16), background=None, spacing_line=2): super().__init__(x, y) self.text = text self.font = font self.background = background self.spacing_line = spacing_line self.renders = None self.render = None self.update_render()
def __init__(self, naos): super(Parameters, self).__init__("Paramètres", 400, 500) self.naos = naos self.add_widget(Label(150, 30, "Paramètres", Font(size=20))) self.add_widget(Label(150, 120, "Fond d'écran")) self.bg_entry = Entry(70, 150, width=260) self.add_widget(self.bg_entry) self.add_widget( Button(100, 400, "Valider", self.validate, size=(200, 50))) back = self.naos.db.executewithreturn( """SELECT background FROM parameters""")[0][0] if back is not None: self.bg_entry.text = back self.bg_entry.update_render()
def __init__(self, x, y, text, command=None, font=Font(), size=(100, 40), background=Color.from_name("GRAY").darker(5)): super().__init__(x, y) self.text = text self.command = command self.font = font self.background = background self.size = size self.is_hover = False self.update_render()
def __init__(self, x, y, width=100, font=Font(color=Color.from_name("BLACK")), accepted="èàçù€ " + string.digits + string.ascii_letters + string.punctuation, image=None): super(Entry, self).__init__(x, y) self.width = width self.image = image self.label = Label(0, 0, "", font) self.text = "" self.focus = False self.accepted = accepted self.render = None self.update_render()
class ScrollPanel(Widget): def __init__(self, x, y, width, height): super(ScrollPanel, self).__init__(x, y) self.width = width self.height = height self.font = Font() self.widgets = [] self.bornes = [0, 0] def add_widget(self, widget): self.widgets.append(widget) widget.parent = self if len(self.widgets) == 0: self.bornes[0] = widget.y if isinstance(widget, Button): self.bornes[1] = widget.y + widget.size[1] elif isinstance(widget, Label): self.bornes[1] = widget.y + widget.font.rendered_size( widget.text)[1] def event(self, evt): if self.is_showed: if evt.type == pygame.MOUSEBUTTONDOWN and evt.button == pygame.BUTTON_LEFT: if pygame.Rect(self.get_real_x() + self.width - 20, self.get_real_y(), 20, 20).collidepoint(*evt.pos): if self.widgets[0].y <= -self.bornes[0]: for i in self.widgets: i.y += 10 return True if pygame.Rect(self.get_real_x() + self.width - 20, self.get_real_y() + self.height - 20, 20, 20).collidepoint(*evt.pos): if self.widgets[0].y >= -self.bornes[1] + self.height: for i in self.widgets: i.y -= 10 return True for i in self.widgets: if i.event(evt): return True return False def show(self, screen): if self.is_showed: pygame.draw.rect( screen, Color.from_name("GRAY").darker(2).get_rgba(), pygame.Rect(self.x, self.y, self.width, self.height)) pygame.draw.rect( screen, Color.from_name("GRAY").darker(4).get_rgba(), pygame.Rect(self.x + self.width - 20, self.y, 20, self.height)) pygame.draw.rect( screen, Color.from_name("GRAY").darker(6).get_rgba(), pygame.Rect(self.x + self.width - 20, self.y, 20, 20)) screen.blit(self.font.render("^"), (self.x + self.width - 14, self.y + 5)) pygame.draw.rect( screen, Color.from_name("GRAY").darker(6).get_rgba(), pygame.Rect(self.x + self.width - 20, self.y + self.height - 20, 20, 20)) screen.blit(self.font.render("v"), (self.x + self.width - 14, self.y + self.height - 20)) x = clamp(self.x, 0, self.width) y = clamp(self.y, 0, self.height) width = clamp(self.width, 0, self.width - x) height = clamp(self.height, 0, self.height - y) intra_canvas = screen.subsurface(pygame.Rect(x, y, width, height)) for i in self.widgets: i.show(intra_canvas)
class NaOSBar: def __init__(self): self.logo = pygame.image.load( os.path.join(os.path.dirname(__file__), "..", "..", "files", "images", "logo.png")).convert() self.logo = pygame.transform.scale(self.logo, (26, 26)) self.naos = None self.font = Font(size=17, bold=True, color=Color.from_name("BLACK")) self.hour = self.font.render(datetime.now().strftime("%H:%M:%S")) def update(self): self.hour = self.font.render(datetime.now().strftime("%H:%M:%S")) def event(self, evt): if evt.type == pygame.MOUSEBUTTONDOWN and evt.button == pygame.BUTTON_LEFT: if self.logo.get_rect(x=5, y=self.naos.height - 29).collidepoint(*evt.pos): self.naos.startmenu.open = not self.naos.startmenu.open return True for i, window in enumerate(self.naos.windows): if pygame.Rect(50 + 27 * i, self.naos.height - 27, 20, 20).collidepoint(*evt.pos): if window.open and window.focus: self.naos.focus_window(None) window.open = False else: self.naos.focus_window(window) window.open = True return True return False def show(self, screen): pygame.draw.rect( screen, Color.from_name("BLACK").get_rgba(), pygame.Rect(-1, self.naos.height - 33, self.naos.width + 2, 34)) pygame.draw.rect( screen, Color.from_name("GRAY").get_rgba(), pygame.Rect(0, self.naos.height - 32, self.naos.width, 32)) screen.blit(self.logo, (6, self.naos.height - 28)) pygame.draw.line(screen, Color.from_name("BLACK").get_rgba(), (38, self.naos.height - 33), (38, self.naos.height), 3) for i, window in enumerate(self.naos.windows): pygame.draw.rect( screen, Color.from_name("GRAY").darker(3).get_rgba(), pygame.Rect(50 + 27 * i, self.naos.height - 27, 22, 22)) screen.blit( self.font.render(window.title[0]), (50 + 27 * i + (11 - self.font.rendered_size(window.title[0])[0] / 2), self.naos.height - 27 + (11 - self.font.rendered_size(window.title[0])[1] / 2))) pygame.draw.line(screen, Color.from_name("BLACK").get_rgba(), (self.naos.width - self.hour.get_rect().width - 10, self.naos.height - 33), (self.naos.width - self.hour.get_rect().width - 10, self.naos.height), 3) screen.blit(self.hour, (self.naos.width - self.hour.get_rect().width - 5, self.naos.height - 16 - self.hour.get_rect().height / 2))
class Window: def __init__(self, title, width, height, x=100, y=100): self.title = title self.width = clamp(width, 60) self.height = clamp(height, 10) self.x = clamp(x, 0, 1920) self.y = clamp(y + 20, 0, 1080) self.font = Font(bold=True) self.naos = None self.is_dragged = False self.drag_offset = [0, 0] self.widgets = [] self.focus = False self.open = True def get_real_y(self): return self.y def get_real_x(self): return self.x def add_widget(self, widget): if widget.parent is None: self.widgets.append(widget) widget.parent = self def update(self): for i in self.widgets: i.update() def close(self): self.naos.windows.remove(self) self.naos.focus_window(None) def event(self, evt): if self.open: if evt.type == pygame.MOUSEBUTTONUP and evt.button == pygame.BUTTON_LEFT: if self.is_dragged: self.is_dragged = False self.drag_offset = [0, 0] if evt.type == pygame.MOUSEBUTTONDOWN and evt.button == pygame.BUTTON_LEFT: if pygame.Rect(self.x + self.width - 18, self.y - 18, 16, 16).collidepoint(*evt.pos): self.close() if pygame.Rect(self.x + self.width - 36, self.y - 18, 16, 16).collidepoint(*evt.pos): self.open = not self.open if pygame.Rect(self.x, self.y - 20, self.width, 20).collidepoint(*evt.pos): self.is_dragged = True self.drag_offset = [ evt.pos[0] - self.x, evt.pos[1] - self.y ] return True if evt.type == pygame.MOUSEMOTION and self.is_dragged: self.x = evt.pos[0] - self.drag_offset[0] self.y = evt.pos[1] - self.drag_offset[1] if self.focus: for i in self.widgets: if i.event(evt): return True if evt.type == pygame.MOUSEBUTTONDOWN and evt.button == pygame.BUTTON_LEFT and \ pygame.Rect(self.x, self.y, self.width, self.height).collidepoint(*evt.pos): return True return False def show(self, screen): if self.open: pygame.draw.rect( screen, Color.from_name("BLACK").get_rgba(), pygame.Rect(self.x - 1, self.y - 21, self.width + 2, self.height + 22)) pygame.draw.rect(screen, Color.from_name("GRAY").darker(2).get_rgba(), pygame.Rect(self.x, self.y - 20, self.width, 20)) pygame.draw.rect( screen, Color.from_name("GRAY").get_rgba(), pygame.Rect(self.x, self.y, self.width, self.height)) temp = self.title while temp != "..." and self.font.rendered_size( temp)[0] > self.width - 44: temp = temp[:-1] if temp == self.title else temp[:-4] + "..." screen.blit(self.font.render(temp), (self.x + 4, self.y - 18)) pygame.draw.rect( screen, Color.from_name("GRAY").darker(5).get_rgba(), pygame.Rect(self.x + self.width - 36, self.y - 18, 16, 16)) pygame.draw.line(screen, Color.from_name("BLACK").get_rgba(), (self.x + self.width - 32, self.y - 11), (self.x + self.width - 24, self.y - 11), 2) pygame.draw.rect( screen, Color.from_name("RED").get_rgba(), pygame.Rect(self.x + self.width - 18, self.y - 18, 16, 16)) x = clamp(self.x, 0, self.naos.width) y = clamp(self.y, 0, self.naos.height) width = clamp(self.width, 0, self.naos.width - x) height = clamp(self.height, 0, self.naos.height - y) intra_canvas = screen.subsurface(pygame.Rect(x, y, width, height)) for i in self.widgets: i.show(intra_canvas)
class NaOS: def __init__(self, debug=False): self.paths = { "files": os.path.join(os.getenv('APPDATA'), "NaOS"), "system": os.path.join(os.getenv('APPDATA'), "NaOS", "system"), "user": os.path.join(os.getenv('APPDATA'), "NaOS", "user"), "programs": os.path.join(os.getenv('APPDATA'), "NaOS", "programs"), } self.fs = FileSystem(self) for v in self.paths.values(): if not os.path.exists(v): os.makedirs(v) self.db = Database(os.path.join(self.paths["system"], "data.db")) self.db.createdb() self.width = 1920 self.height = 1080 pygame.display.set_caption("NaOS") self.screen = pygame.display.set_mode((self.width, self.height), pygame.FULLSCREEN | pygame.SCALED) self.clock = pygame.time.Clock() self.is_running = False self.bg_color = Color.from_name("BLACK") self.debug = debug if self.debug: self.debug_font = Font() background = self.db.executewithreturn("""SELECT background FROM parameters""")[0][0] self.bg = None self.set_background(background) self.naosbar = NaOSBar() self.startmenu = StartMenu(self) self.windows = [] self.focused_window = None self.startmenu.naos = self self.naosbar.naos = self self.program_manager = ProgramManager() def set_background(self, background): if background is not None: self.bg = pygame.image.load(os.path.join(self.paths["files"], background.replace("/", "\\"))).convert() self.bg = pygame.transform.scale(self.bg, (self.width, self.height)) self.db.executewithoutreturn("""UPDATE parameters SET background = ?""", (background,)) def focus_window(self, nw): if self.focused_window is not None: self.focused_window.focus = False self.focused_window = nw if nw is not None: nw.focus = True def open_window(self, nw): self.windows.append(nw) nw.naos = self self.focus_window(nw) def stop(self): self.is_running = False def run(self): self.is_running = True while self.is_running: for event in pygame.fastevent.get(): self.process_event(event) for i in self.windows: i.update() self.naosbar.update() self.screen.fill(self.bg_color.get_rgba()) if self.bg is not None: self.screen.blit(self.bg, (0, 0)) for i in self.windows: if self.focused_window is None or i != self.focused_window: i.show(self.screen) if self.focused_window is not None: self.focused_window.show(self.screen) self.startmenu.show(self.screen) self.naosbar.show(self.screen) if self.debug: try: fps_label = self.debug_font.render("FPS : " + str(round(self.clock.get_fps()))) except OverflowError: fps_label = self.debug_font.render("FPS : Infinity") self.screen.blit(fps_label, (10, 10)) self.clock.tick() pygame.display.update() pygame.quit() def process_event(self, evt): if evt.type == pygame.QUIT: self.stop() else: if self.focused_window is not None and self.focused_window.event(evt): return for i in range(len(self.windows)-1, -1, -1): nw = self.windows[i] if self.focused_window != nw and nw.event(evt): if nw in self.windows: self.focus_window(nw) return if self.naosbar.event(evt) or self.startmenu.event(evt): return if evt.type == pygame.KEYUP and evt.key == pygame.K_PRINTSCREEN: pygame.image.save( self.screen, os.path.join(self.paths["user"], "screenshot_"+datetime.now().strftime("%d-%m-%Y_%H-%M-%S")+".jpg") )