Commit 94dafbb2 authored by Andy Stewart's avatar Andy Stewart
Browse files

Pdf viewer now can save/restore read position and scale detail.

parent 813809f8
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -53,6 +53,16 @@ class AppBuffer(Buffer):
            else:
                self.buffer_widget.scroll_down()

    def save_session_data(self):
        return "{0}:{1}:{2}".format(self.buffer_widget.scroll_offset, self.buffer_widget.scale, self.buffer_widget.read_mode)

    def restore_session_data(self, session_data):
        (scroll_offset, scale, read_mode) = session_data.split(":")
        self.buffer_widget.scroll_offset = float(scroll_offset)
        self.buffer_widget.scale = float(scale)
        self.buffer_widget.read_mode = read_mode
        self.buffer_widget.update()

class PdfViewerWidget(QWidget):

    send_jump_page_message = QtCore.pyqtSignal()
@@ -191,9 +201,11 @@ class PdfViewerWidget(QWidget):
        return self.scale * self.page_height * self.page_total_number - self.rect().height()

    def switch_to_read_mode(self):
        if self.read_mode == "fit_to_width":
        if self.read_mode == "fit_to_customize":
            self.read_mode = "fit_to_width"
        elif self.read_mode == "fit_to_width":
            self.read_mode = "fit_to_height"
        else:
        elif self.read_mode == "fit_to_height":
            self.read_mode = "fit_to_width"

        self.update_scale()
@@ -226,14 +238,17 @@ class PdfViewerWidget(QWidget):
        self.update()

    def zoom_in(self):
        self.read_mode = "fit_to_customize"
        self.scale = min(10, self.scale + 0.2)
        self.update()

    def zoom_out(self):
        self.read_mode = "fit_to_customize"
        self.scale = max(1, self.scale - 0.2)
        self.update()

    def zoom_reset(self):
        self.read_mode = "fit_to_width"
        self.update_scale()
        self.update()

+5 −0
Original line number Diff line number Diff line
@@ -74,3 +74,8 @@ class Buffer(QGraphicsScene):
    def scroll(self, scroll_direction, scroll_type):
        pass

    def save_session_data(self):
        pass

    def restore_session_data(self, session_data):
        pass
+5 −1
Original line number Diff line number Diff line
@@ -163,7 +163,11 @@
        (kill-buffer buffer)))
    ;; Just report to me when eaf buffer exists.
    (if (> count 1)
        (message "Killed EAF %s buffer%s" count (if (> count 1) "s" "")))))
        (message "Killed EAF %s buffer%s" count (if (> count 1) "s" "")))
    ;; Clean cache url and app name, avoid next start process to open buffer.
    (setq eaf-first-start-url nil)
    (setq eaf-first-start-app-name nil)
    ))

(defun eaf-restart-process ()
  (interactive)
+67 −1
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import importlib
import dbus
import dbus.service
import os
import json

EAF_DBUS_NAME = "com.lazycat.eaf"
EAF_OBJECT_NAME = "/com/lazycat/eaf"
@@ -47,6 +48,8 @@ class EAF(dbus.service.Object):

        self.start_finish()

        self.session_file_path = os.path.expanduser("~/.emacs.d/eaf/session.json")

    @dbus.service.method(EAF_DBUS_NAME, in_signature="sss", out_signature="s")
    def new_buffer(self, buffer_id, url, app_name):
        # NOTE: We need use function str convert dbus.String to String,
@@ -62,7 +65,9 @@ class EAF(dbus.service.Object):
    def create_app(self, buffer_id, url, module_path):
        try:
            module = importlib.import_module(module_path)
            self.create_buffer(buffer_id, module.AppBuffer(buffer_id, url))
            buf = module.AppBuffer(buffer_id, url)
            buf.module_path = module_path
            self.create_buffer(buffer_id, buf)

            return ""
        except ImportError:
@@ -85,6 +90,9 @@ class EAF(dbus.service.Object):
        # Send message to emacs.
        app_buffer.input_message.connect(self.input_message)

        # Restore buffer session.
        self.restore_buffer_session(app_buffer)

    @dbus.service.method(EAF_DBUS_NAME, in_signature="s", out_signature="")
    def update_views(self, args):
        global emacs_xid
@@ -153,6 +161,9 @@ class EAF(dbus.service.Object):

        # Clean buffer from buffer dict.
        if buffer_id in self.buffer_dict:
            # Save buffer session.
            self.save_buffer_session(self.buffer_dict[buffer_id])

            self.buffer_dict[buffer_id].handle_destroy()
            self.buffer_dict.pop(buffer_id, None)

@@ -191,6 +202,61 @@ class EAF(dbus.service.Object):
    def input_message(self, buffer_id, message, callback_type):
        pass

    def save_buffer_session(self, buf):
        # Create config file it not exist.
        if not os.path.exists(self.session_file_path):
            basedir = os.path.dirname(self.session_file_path)
            if not os.path.exists(basedir):
                os.makedirs(basedir)

            with open(self.session_file_path, 'a'):
                os.utime(self.session_file_path, None)

            print("Create session file %s" % (self.session_file_path))

        with open(self.session_file_path, "r+") as session_file:
            session_dict = {}
            try:
                session_dict = json.load(session_file)
            except ValueError:
                pass

            if buf.module_path not in session_dict:
                session_dict[buf.module_path] = {}

            if buf.url in session_dict[buf.module_path]:
                session_dict[buf.module_path].update({buf.url: buf.save_session_data()})
            else:
                session_dict.update({buf.module_path: {buf.url: buf.save_session_data()}})

            session_file.seek(0)
            session_file.truncate(0)
            json.dump(session_dict, session_file)

            print("Save session: ", buf.module_path, buf.url, buf.save_session_data())

    def restore_buffer_session(self, buf):
        if os.path.exists(self.session_file_path):
            with open(self.session_file_path, "r+") as session_file:
                session_dict = {}
                try:
                    session_dict = json.load(session_file)
                except ValueError:
                    import traceback
                    traceback.print_exc()

                if buf.module_path in session_dict:
                    if buf.url in session_dict[buf.module_path]:
                        buf.restore_session_data(session_dict[buf.module_path][buf.url])

                        print("Restore session: ", buf.buffer_id, buf.module_path, self.session_file_path)
                    else:
                        print("No session data about %s, no need restore session." % (buf.url))
                else:
                    print("No data in session file, no need restore session.")
        else:
            print("Not found %s, no need restore session." % (self.session_file_path))

if __name__ == "__main__":
    import sys
    import signal