diff --git a/HACKING.md b/HACKING.md index 2734661..add3c44 100644 --- a/HACKING.md +++ b/HACKING.md @@ -13,7 +13,7 @@ Python is a perfect language to develop Qt program and it can call pretty much i M-x eaf-open ``` - Then type "eaf demo" as input, will pop hello world window in emacs like below: + Then type "eaf-demo" as input, will pop hello world window in emacs like below: ![img](./screenshot/hello_world.png) @@ -34,7 +34,7 @@ from PyQt5.QtGui import QColor from PyQt5.QtWidgets import QPushButton from core.buffer import Buffer -class DemoBuffer(Buffer): +class AppBuffer(Buffer): def __init__(self, buffer_id, url): Buffer.__init__(self, buffer_id, url, True, QColor(0, 0, 0, 255)) @@ -56,11 +56,11 @@ class DemoBuffer(Buffer): ```Python @dbus.service.method(EAF_DBUS_NAME, in_signature="ss", out_signature="s") def new_buffer(self, buffer_id, url): - if url == "eaf demo": - self.create_buffer(buffer_id, DemoBuffer(buffer_id, url)) + if url == "eaf-demo": + return self.create_app(buffer_id, url, "app.demo.buffer") ``` - Replace "eaf demo" to "eaf rocks!" + Replace "eaf-demo" to "eaf rocks!" 3. Test ``` @@ -80,7 +80,9 @@ Above are all you need, happy hacking! ### Read user's input Below is code example from pdfviewer: ```Python -class PdfViewerBuffer(Buffer): +... + +class AppBuffer(Buffer): def __init__(self, buffer_id, url): Buffer.__init__(self, buffer_id, url, False, QColor(0, 0, 0, 255)) @@ -93,6 +95,8 @@ class PdfViewerBuffer(Buffer): def handle_input_message(self, result_type, result_content): if result_type == "jump_page": self.buffer_widget.jump_to_page(int(result_content)) + +... ``` If you want read input from emacs minibuffer then call back to python. diff --git a/app/browser/buffer.py b/app/browser/buffer.py index d425365..1367d02 100644 --- a/app/browser/buffer.py +++ b/app/browser/buffer.py @@ -27,7 +27,7 @@ from PyQt5.QtWidgets import QApplication from PyQt5.QtWebKit import QWebSettings from core.buffer import Buffer -class BrowserBuffer(Buffer): +class AppBuffer(Buffer): def __init__(self, buffer_id, url): Buffer.__init__(self, buffer_id, url, False, QColor(255, 255, 255, 255)) diff --git a/app/camera/buffer.py b/app/camera/buffer.py index b93ab82..aaccc84 100644 --- a/app/camera/buffer.py +++ b/app/camera/buffer.py @@ -28,7 +28,7 @@ from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView from PyQt5.QtWidgets import QWidget, QVBoxLayout from core.buffer import Buffer -class CameraBuffer(Buffer): +class AppBuffer(Buffer): def __init__(self, buffer_id, url): Buffer.__init__(self, buffer_id, url, True, QColor(0, 0, 0, 255)) diff --git a/app/demo/buffer.py b/app/demo/buffer.py index d4606c6..201ee9e 100644 --- a/app/demo/buffer.py +++ b/app/demo/buffer.py @@ -23,7 +23,7 @@ from PyQt5.QtGui import QColor from PyQt5.QtWidgets import QPushButton from core.buffer import Buffer -class DemoBuffer(Buffer): +class AppBuffer(Buffer): def __init__(self, buffer_id, url): Buffer.__init__(self, buffer_id, url, True, QColor(0, 0, 0, 255)) diff --git a/app/imageviewer/buffer.py b/app/imageviewer/buffer.py index 7d6b98e..a62781d 100644 --- a/app/imageviewer/buffer.py +++ b/app/imageviewer/buffer.py @@ -26,7 +26,7 @@ from PyQt5.QtWidgets import QWidget import os from core.buffer import Buffer -class ImageViewerBuffer(Buffer): +class AppBuffer(Buffer): def __init__(self, buffer_id, url): Buffer.__init__(self, buffer_id, url, False, QColor(0, 0, 0, 255)) diff --git a/app/pdfviewer/buffer.py b/app/pdfviewer/buffer.py index fff3d58..edcdc8a 100644 --- a/app/pdfviewer/buffer.py +++ b/app/pdfviewer/buffer.py @@ -27,7 +27,7 @@ from PyQt5.QtWidgets import QWidget import fitz from core.buffer import Buffer -class PdfViewerBuffer(Buffer): +class AppBuffer(Buffer): def __init__(self, buffer_id, url): Buffer.__init__(self, buffer_id, url, False, QColor(0, 0, 0, 255)) diff --git a/app/videoplayer/buffer.py b/app/videoplayer/buffer.py index 0532d52..addd56d 100644 --- a/app/videoplayer/buffer.py +++ b/app/videoplayer/buffer.py @@ -26,7 +26,7 @@ from PyQt5.QtMultimediaWidgets import QGraphicsVideoItem from PyQt5.QtWidgets import QWidget, QGraphicsScene, QGraphicsView, QVBoxLayout from core.buffer import Buffer -class VideoPlayerBuffer(Buffer): +class AppBuffer(Buffer): def __init__(self, buffer_id, url): Buffer.__init__(self, buffer_id, url, True, QColor(0, 0, 0, 255)) diff --git a/eaf.py b/eaf.py index 8aa926a..6b2e5ba 100755 --- a/eaf.py +++ b/eaf.py @@ -25,6 +25,7 @@ from core.utils import file_is_image, file_is_video from core.view import View from dbus.mainloop.glib import DBusGMainLoop from pymediainfo import MediaInfo +import importlib import dbus import dbus.service import os @@ -50,17 +51,9 @@ class EAF(dbus.service.Object): @dbus.service.method(EAF_DBUS_NAME, in_signature="ss", out_signature="s") def new_buffer(self, buffer_id, url): if url == "eaf-demo": - try: - from app.demo.buffer import DemoBuffer - self.create_buffer(buffer_id, DemoBuffer(buffer_id, url)) - except ImportError: - return "Something wrong when import app.demo.buffer" + return self.create_app(buffer_id, url, "app.demo.buffer") elif url == "eaf-camera": - try: - from app.camera.buffer import CameraBuffer - self.create_buffer(buffer_id, CameraBuffer(buffer_id, url)) - except ImportError: - return "Something wrong when import app.camera.buffer" + return self.create_app(buffer_id, url, "app.camera.buffer") else: url = os.path.expanduser(url) @@ -69,46 +62,39 @@ class EAF(dbus.service.Object): (_, extension) = os.path.splitext(url) if extension in [".pdf", ".xps", ".oxps", ".cbz", ".epub", ".fb2", "fbz"]: - try: - from app.pdfviewer.buffer import PdfViewerBuffer - self.create_buffer(buffer_id, PdfViewerBuffer(buffer_id, url)) - except ImportError: - return "Something wrong when import app.pdfviewer.buffer" + return self.create_app(buffer_id, url, "app.pdfviewer.buffer") else: file_info = MediaInfo.parse(url) if file_is_image(file_info): - try: - from app.imageviewer.buffer import ImageViewerBuffer - self.create_buffer(buffer_id, ImageViewerBuffer(buffer_id, url)) - except ImportError: - return "Something wrong when import app.imageviewer.buffer" + return self.create_app(buffer_id, url, "app.imageviewer.buffer") elif file_is_video(file_info): - try: - from app.videoplayer.buffer import VideoPlayerBuffer - self.create_buffer(buffer_id, VideoPlayerBuffer(buffer_id, url)) - except ImportError: - return "Something wrong when import app.videoplayer.buffer" + return self.create_app(buffer_id, url, "app.videoplayer.buffer") else: return "Don't know how to open {0}".format(url) else: return "Path {0} not exists.".format(url) else: - try: - from app.browser.buffer import BrowserBuffer - from urllib.parse import urlparse - result = urlparse(url) - if len(result.scheme) != 0: - self.create_buffer(buffer_id, BrowserBuffer(buffer_id, result.geturl())) + from urllib.parse import urlparse + result = urlparse(url) + if len(result.scheme) != 0: + return self.create_app(buffer_id, result.geturl(), "app.browser.buffer") + else: + result = urlparse("{0}:{1}".format("http", url)) + if result.scheme != "": + return self.create_app(buffer_id, result.geturl(), "app.browser.buffer") else: - result = urlparse("{0}:{1}".format("http", url)) - if result.scheme != "": - self.create_buffer(buffer_id, BrowserBuffer(buffer_id, result.geturl())) - else: - return "{0} is not valid url".format(url) - except ImportError: - return "Something wrong when import app.browser.buffer" + return "{0} is not valid url".format(url) return "" + def create_app(self, buffer_id, url, module_path): + if importlib.util.find_spec(module_path) is not None: + module = importlib.import_module(module_path) + self.create_buffer(buffer_id, module.AppBuffer(buffer_id, url)) + + return "" + else: + return "Something wrong when import {0}".format(module_path) + def create_buffer(self, buffer_id, app_buffer): global emacs_width, emacs_height