Exemplo n.º 1
0
class AddSource(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)

        container = tk.Frame(self)
        container.pack(fill='both', expand=1, padx=5, pady=5)

        tk.Grid.columnconfigure(container, 0, weight=1)
        tk.Grid.rowconfigure(container, 0, weight=1)

        self.sourceview = SourceView(container)
        self.sourceview.grid(row=0, column=0, sticky='nesw')

        tk.Button(container, text='Add source',
                  command=self.add_source).grid(row=1,
                                                column=0,
                                                sticky='nesw',
                                                pady=(2, 0))

    def add_source(self):
        source = db.Source()
        self.sourceview.update_source(source)

        if db.contains(source):
            dialog.duplicate(self)
            return

        db.session.add(source)
        db.session.commit()
Exemplo n.º 2
0
    def __init__(self, parent, source):
        super().__init__(parent)
        self.geometry(settings.get('view_window_geometry'))

        container = tk.Frame(self)
        container.pack(fill='both', expand=1, padx=5, pady=5)

        tk.Grid.columnconfigure(container, 0, weight=1)
        tk.Grid.rowconfigure(container, 0, weight=1)

        self.sourceview = SourceView(container)
        self.sourceview.grid(row=0, column=0, sticky='nesw')

        button_frame = tk.Frame(container)
        button_frame.grid(row=1, column=0, sticky='nesw')
        for x in range(0, 4):
            tk.Grid.columnconfigure(button_frame, x, weight=1, uniform='equal')

        tk.Button(button_frame, text='Save changes',
                  command=self.save_changes).grid(row=0,
                                                  column=0,
                                                  sticky='nesw')
        tk.Button(button_frame, text='View PDF',
                  command=self.view_pdf).grid(row=0, column=1, sticky='nesw')
        tk.Button(button_frame, text='Remove entry',
                  command=self.delete).grid(row=0, column=2, sticky='nesw')
        tk.Button(button_frame, text='Close',
                  command=self.destroy).grid(row=0, column=3, sticky='nesw')

        self.source = source
        self.load_values()
Exemplo n.º 3
0
    def __init__(self, exc_info, parent=None):
        QWidget.__init__(self, parent)

        etype, value, tb = exc_info

        self.tb = tb
        self.entries = traceback.extract_tb(tb)

        self.setWindowTitle('Python Error')

        msg = unicode(value).replace("\n", "<br>").replace(" ", "&nbsp;")
        self.error = QLabel("<h1>" + etype.__name__ + "</h1><b>" + msg +
                            "</b>")
        self.error.setTextInteractionFlags(Qt.TextSelectableByMouse)

        self.frames = FramesView()
        self.frames.setTraceback(tb)
        self.frames.selectionModel().currentChanged.connect(
            self.current_frame_changed)

        self.source = SourceView()

        self.splitterSrc = QSplitter(Qt.Horizontal)
        self.splitterSrc.addWidget(self.frames)
        self.splitterSrc.addWidget(self.source)
        self.splitterSrc.setStretchFactor(0, 1)
        self.splitterSrc.setStretchFactor(1, 2)

        self.variables = VariablesView()

        self.console = ConsoleWidget(exc_info)

        self.splitterMain = QSplitter(Qt.Vertical)
        self.splitterMain.addWidget(self.splitterSrc)
        self.splitterMain.addWidget(self.variables)
        self.splitterMain.addWidget(self.console)

        l = QVBoxLayout()
        l.addWidget(self.error)
        l.addWidget(self.splitterMain)
        self.setLayout(l)

        self.resize(800, 600)

        s = QSettings()
        self.splitterSrc.restoreState(s.value("/FirstAid/splitterSrc", ""))
        self.splitterMain.restoreState(s.value("/FirstAid/splitterMain", ""))
        self.restoreGeometry(s.value("/FirstAid/geometry", ""))

        # select the last frame
        self.frames.setCurrentIndex(
            self.frames.model().index(len(self.entries) - 1))
Exemplo n.º 4
0
    def __init__(self, parent):
        super().__init__(parent)

        container = tk.Frame(self)
        container.pack(fill='both', expand=1, padx=5, pady=5)

        tk.Grid.columnconfigure(container, 0, weight=1)
        tk.Grid.rowconfigure(container, 0, weight=1)

        self.sourceview = SourceView(container)
        self.sourceview.grid(row=0, column=0, sticky='nesw')

        tk.Button(container, text='Add source',
                  command=self.add_source).grid(row=1,
                                                column=0,
                                                sticky='nesw',
                                                pady=(2, 0))
    def __init__(self, exc_info, parent=None):
        QWidget.__init__(self, parent)

        etype, value, tb = exc_info

        self.tb = tb
        self.entries = traceback.extract_tb(tb)

        self.setWindowTitle('Python Error')

        msg = unicode(value).replace("\n", "<br>").replace(" ", "&nbsp;")
        self.error = QLabel("<h1>"+etype.__name__+"</h1><b>"+msg+"</b>")
        self.error.setTextInteractionFlags(Qt.TextSelectableByMouse)

        self.frames = FramesView()
        self.frames.setTraceback(tb)
        self.frames.selectionModel().currentChanged.connect(self.current_frame_changed)

        self.source = SourceView()

        self.splitterSrc = QSplitter(Qt.Horizontal)
        self.splitterSrc.addWidget(self.frames)
        self.splitterSrc.addWidget(self.source)
        self.splitterSrc.setStretchFactor(0, 1)
        self.splitterSrc.setStretchFactor(1, 2)

        self.variables = VariablesView()

        self.console = ConsoleWidget(exc_info)

        self.splitterMain = QSplitter(Qt.Vertical)
        self.splitterMain.addWidget(self.splitterSrc)
        self.splitterMain.addWidget(self.variables)
        self.splitterMain.addWidget(self.console)

        l = QVBoxLayout()
        l.addWidget(self.error)
        l.addWidget(self.splitterMain)
        self.setLayout(l)

        self.resize(800,600)

        s = QSettings()
        self.splitterSrc.restoreState(s.value("/FirstAid/splitterSrc", ""))
        self.splitterMain.restoreState(s.value("/FirstAid/splitterMain", ""))
        self.restoreGeometry(s.value("/FirstAid/geometry", ""))

        # select the last frame
        self.frames.setCurrentIndex(self.frames.model().index(len(self.entries)-1))
Exemplo n.º 6
0
    def build_editor(self):
        self.h = gtk.HPaned()
        self.tree = FileViewer(".") 
        self.tree.connect("file-selected", self.open_file)
        self.tree.show()
        self.h.pack1(self.tree)

        self.editor = SourceView()

        scroller = gtk.ScrolledWindow()
        scroller.set_policy(gtk.POLICY_AUTOMATIC,
                      gtk.POLICY_AUTOMATIC)
        scroller.add(self.editor)
        self.h.pack2(scroller)

        self.h.show_all()
Exemplo n.º 7
0
class ViewSource(tk.Toplevel):
    def __init__(self, parent, source):
        super().__init__(parent)
        self.geometry(settings.get('view_window_geometry'))

        container = tk.Frame(self)
        container.pack(fill='both', expand=1, padx=5, pady=5)

        tk.Grid.columnconfigure(container, 0, weight=1)
        tk.Grid.rowconfigure(container, 0, weight=1)

        self.sourceview = SourceView(container)
        self.sourceview.grid(row=0, column=0, sticky='nesw')

        button_frame = tk.Frame(container)
        button_frame.grid(row=1, column=0, sticky='nesw')
        for x in range(0, 4):
            tk.Grid.columnconfigure(button_frame, x, weight=1, uniform='equal')

        tk.Button(button_frame, text='Save changes',
                  command=self.save_changes).grid(row=0,
                                                  column=0,
                                                  sticky='nesw')
        tk.Button(button_frame, text='View PDF',
                  command=self.view_pdf).grid(row=0, column=1, sticky='nesw')
        tk.Button(button_frame, text='Remove entry',
                  command=self.delete).grid(row=0, column=2, sticky='nesw')
        tk.Button(button_frame, text='Close',
                  command=self.destroy).grid(row=0, column=3, sticky='nesw')

        self.source = source
        self.load_values()

    def load_values(self):
        self.title(self.source.list_entry())
        self.pdf_path = os.path.abspath(
            os.path.join('pdfs', self.source.pdf_file_name()))
        self.sourceview.clear()
        self.sourceview.fill(self.pdf_path, self.source.bibtex(),
                             self.source.summary, self.source.keywords)

    def save_changes(self):
        if self.sourceview.update_source(self.source) == -1:
            return
        db.session.commit()
        self.load_values()

    def view_pdf(self):
        system = platform.system()
        if system == 'Linux':
            subprocess.call(['xdg-open', self.pdf_path],
                            stdout=subprocess.DEVNULL,
                            stderr=subprocess.DEVNULL)
        elif system == 'Windows':
            os.startfile(self.pdf_path)
        elif system == 'Darwin':
            subprocess.call(['open', self.pdf_path])

    def delete(self):
        confirmed = dialog.confirm_deletion(self, 1)
        if confirmed == 'no':
            return

        db.session.delete(self.source)
        db.session.commit()
        self.destroy()

    def destroy(self):
        settings.set('view_window_geometry', super().geometry())
        settings.save()
        super().destroy()
Exemplo n.º 8
0
class Activity(sugar.activity.activity.Activity):
    def __init__(self, handle):
        super(Activity, self).__init__(handle)

        self.build_toolbar()
        self.build_editor()

        self.p = gtk.VPaned()
        self.set_canvas(self.p)
        self.p.pack2(self.h)
        
        self.console = gtk.Notebook()
        self.init_interpreter()
        self.console.append_page(self.interpreter)
        self.p.pack1(self.console)

        self.fugit = Fugit(".")
        self.console.append_page(self.fugit.widget)
        self.show_all()


    def alert(self, title=None, text=None, delay=5):
        alert = NotifyAlert(delay)
        alert.props.title = title
        alert.props.msg = text
        self.add_alert(alert)
        alert.connect('response', self._alert_ok)
        alert.show()

    def _alert_ok(self, alert, *args):
        self.remove_alert(alert)

    def init_interpreter(self):
        frame = self.get_frame()
        self.interpreter = GTKInterpreterConsole(frame)
        self.interpreter.text.connect('button-press-event', self.focus_interpreter)
        return False

    def focus_interpreter(self, widget, event):
        self.interpreter.text.grab_focus()
        return True

    def get_frame(self):
        # esto es necesario para que la consola funcione
        try:
            raise None
        except:
            frame = sys.exc_info()[2].tb_frame
        return frame

    def open_file(self, widget, path):
        if path:
            if not os.path.isdir(path):
                self.editor.open_file(widget, path)

    def save_file(self, widget):
        if self.editor.modificado():
            self.editor.save_file()
            filename = self.editor.current_file()
            self.alert(filename, "Archivo guardado.")

    def build_editor(self):
        self.h = gtk.HPaned()
        self.tree = FileViewer(".") 
        self.tree.connect("file-selected", self.open_file)
        self.tree.show()
        self.h.pack1(self.tree)

        self.editor = SourceView()

        scroller = gtk.ScrolledWindow()
        scroller.set_policy(gtk.POLICY_AUTOMATIC,
                      gtk.POLICY_AUTOMATIC)
        scroller.add(self.editor)
        self.h.pack2(scroller)

        self.h.show_all()

    def build_reader(self):
        self.reader = webkit.WebView()
        curdir = os.getcwd()
        self.reader.load_uri("file://%s/docs/index.html" % curdir)
        self.box.append_page(self.reader, gtk.Label("Lector"))
        self.reader.show()

    def build_toolbar(self):
        toolbar_box = ToolbarBox()
        self.set_toolbar_box(toolbar_box)
        toolbar_box.show()

        activity_button = ActivityToolbarButton(self)
        toolbar_box.toolbar.insert(activity_button, -1)
        activity_button.show()

        tool_group = None

        self.game_button = RadioToolButton()
        self.game_button.props.icon_name = 'gamecanvas'
        self.game_button.set_tooltip(_('Juego'))
        self.game_button.accelerator = "<Ctrl>1"
        self.game_button.props.group = tool_group
        #self.game_button.connect('clicked', self.show_game)
        toolbar_box.toolbar.insert(self.game_button, -1)
        self.game_button.show()
        tool_group = self.game_button

        button = RadioToolButton()
        button.props.icon_name = 'view-source'
        button.set_tooltip(_('Editor'))
        button.accelerator = "<Ctrl>2"
        button.props.group = tool_group
        #button.connect('clicked', self.show_editor)
        toolbar_box.toolbar.insert(button, -1)
        button.show()

        self.save_button = ToolButton('dialog-ok')
        self.save_button.set_tooltip(_('Guardar'))
        self.save_button.accelerator = "<Ctrl>s"
        self.save_button.connect('clicked', self.save_file)
        toolbar_box.toolbar.insert(self.save_button, -1)
        self.save_button.show()

        separator = gtk.SeparatorToolItem()
        toolbar_box.toolbar.insert(separator, -1)
        separator.show()

        self.editor_button = ToolButton('sources')
        self.editor_button.set_tooltip(_('Consola'))
        self.editor_button.accelerator = "<Ctrl>grave"
        self.editor_button.connect('clicked', self.toggle_console)
        toolbar_box.toolbar.insert(self.editor_button, -1)
        self.editor_button.show()

        separator = gtk.SeparatorToolItem()
        toolbar_box.toolbar.insert(separator, -1)
        separator.show()

        button = helpbutton.HelpButton(self)
        toolbar_box.toolbar.insert(button, -1)
        button.show()

        # Blank space (separator) and Stop button at the end:

        separator = gtk.SeparatorToolItem()
        separator.props.draw = False
        separator.set_expand(True)
        toolbar_box.toolbar.insert(separator, -1)
        separator.show()

        stop_button = StopButton(self)
        toolbar_box.toolbar.insert(stop_button, -1)
        stop_button.show()

    def read_file(self, file_path):
        pass

    def write_file(self, file_path):
        pass

    def can_close(self):
        if self.editor:
            self.editor.close()
        return True

    def toggle_console(self, e):
        if self.console.props.visible:
            self.console.hide()
        else:
            self.p.set_position(160)
            self.console.show()
            self.console.text.grab_focus()
Exemplo n.º 9
0
class DebugWidget(QWidget):
    def __init__(self, exc_info, parent=None):
        QWidget.__init__(self, parent)

        etype, value, tb = exc_info

        self.tb = tb
        self.entries = traceback.extract_tb(tb)

        self.setWindowTitle('Python Error')

        msg = unicode(value).replace("\n", "<br>").replace(" ", "&nbsp;")
        self.error = QLabel("<h1>" + etype.__name__ + "</h1><b>" + msg +
                            "</b>")
        self.error.setTextInteractionFlags(Qt.TextSelectableByMouse)

        self.frames = FramesView()
        self.frames.setTraceback(tb)
        self.frames.selectionModel().currentChanged.connect(
            self.current_frame_changed)

        self.source = SourceView()

        self.splitterSrc = QSplitter(Qt.Horizontal)
        self.splitterSrc.addWidget(self.frames)
        self.splitterSrc.addWidget(self.source)
        self.splitterSrc.setStretchFactor(0, 1)
        self.splitterSrc.setStretchFactor(1, 2)

        self.variables = VariablesView()

        self.console = ConsoleWidget(exc_info)

        self.splitterMain = QSplitter(Qt.Vertical)
        self.splitterMain.addWidget(self.splitterSrc)
        self.splitterMain.addWidget(self.variables)
        self.splitterMain.addWidget(self.console)

        l = QVBoxLayout()
        l.addWidget(self.error)
        l.addWidget(self.splitterMain)
        self.setLayout(l)

        self.resize(800, 600)

        s = QSettings()
        self.splitterSrc.restoreState(s.value("/FirstAid/splitterSrc", ""))
        self.splitterMain.restoreState(s.value("/FirstAid/splitterMain", ""))
        self.restoreGeometry(s.value("/FirstAid/geometry", ""))

        # select the last frame
        self.frames.setCurrentIndex(
            self.frames.model().index(len(self.entries) - 1))

    def closeEvent(self, event):
        s = QSettings()
        s.setValue("/FirstAid/splitterSrc", self.splitterSrc.saveState())
        s.setValue("/FirstAid/splitterMain", self.splitterMain.saveState())
        s.setValue("/FirstAid/geometry", self.saveGeometry())
        QWidget.closeEvent(self, event)

    def current_frame_changed(self, current, previous):
        row = current.row()
        if row >= 0 and row < len(self.entries):
            self.go_to_frame(row)

    def go_to_frame(self, index):

        filename = self.entries[index][0]
        lineno = self.entries[index][1]

        self.source.openFile(filename)
        self.source.jumpToLine(lineno)

        local_vars = frame_from_traceback(self.tb, index).f_locals
        self.variables.setVariables(local_vars)

        self.console.go_to_frame(index)
Exemplo n.º 10
0
class DebugWidget(QWidget):
    def __init__(self, exc_info, parent=None):
        QWidget.__init__(self, parent)

        etype, value, tb = exc_info

        self.tb = tb
        self.entries = traceback.extract_tb(tb)

        self.setWindowTitle('Python Error')

        msg = unicode(value).replace("\n", "<br>").replace(" ", "&nbsp;")
        self.error = QLabel("<h1>"+etype.__name__+"</h1><b>"+msg+"</b>")
        self.error.setTextInteractionFlags(Qt.TextSelectableByMouse)

        self.frames = FramesView()
        self.frames.setTraceback(tb)
        self.frames.selectionModel().currentChanged.connect(self.current_frame_changed)

        self.source = SourceView()

        self.splitterSrc = QSplitter(Qt.Horizontal)
        self.splitterSrc.addWidget(self.frames)
        self.splitterSrc.addWidget(self.source)
        self.splitterSrc.setStretchFactor(0, 1)
        self.splitterSrc.setStretchFactor(1, 2)

        self.variables = VariablesView()

        self.console = ConsoleWidget(exc_info)

        self.splitterMain = QSplitter(Qt.Vertical)
        self.splitterMain.addWidget(self.splitterSrc)
        self.splitterMain.addWidget(self.variables)
        self.splitterMain.addWidget(self.console)

        l = QVBoxLayout()
        l.addWidget(self.error)
        l.addWidget(self.splitterMain)
        self.setLayout(l)

        self.resize(800,600)

        s = QSettings()
        self.splitterSrc.restoreState(s.value("/FirstAid/splitterSrc", ""))
        self.splitterMain.restoreState(s.value("/FirstAid/splitterMain", ""))
        self.restoreGeometry(s.value("/FirstAid/geometry", ""))

        # select the last frame
        self.frames.setCurrentIndex(self.frames.model().index(len(self.entries)-1))

    def closeEvent(self, event):
        s = QSettings()
        s.setValue("/FirstAid/splitterSrc", self.splitterSrc.saveState())
        s.setValue("/FirstAid/splitterMain", self.splitterMain.saveState())
        s.setValue("/FirstAid/geometry", self.saveGeometry())
        QWidget.closeEvent(self, event)

    def current_frame_changed(self, current, previous):
        row = current.row()
        if row >= 0 and row < len(self.entries):
            self.go_to_frame(row)

    def go_to_frame(self, index):

        filename = self.entries[index][0]
        lineno = self.entries[index][1]

        self.source.openFile(filename)
        self.source.jumpToLine(lineno)

        local_vars = frame_from_traceback(self.tb, index).f_locals
        self.variables.setVariables(local_vars)

        self.console.go_to_frame(index)