Exemple #1
0
 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]
Exemple #2
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"))
Exemple #3
0
 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
Exemple #4
0
    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()
Exemple #5
0
 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()
Exemple #6
0
    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()
Exemple #7
0
 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()
Exemple #8
0
    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()
Exemple #9
0
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)
Exemple #10
0
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))
Exemple #11
0
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)
Exemple #12
0
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")
            )