diff --git a/app/browser/buffer.py b/app/browser/buffer.py index c611424..0f626e7 100644 --- a/app/browser/buffer.py +++ b/app/browser/buffer.py @@ -29,22 +29,13 @@ from buffer import Buffer class BrowserBuffer(Buffer): def __init__(self, buffer_id, url, width, height): - Buffer.__init__(self, buffer_id, url, width, height, QColor(255, 255, 255, 255)) + Buffer.__init__(self, buffer_id, url, width, height, False, QColor(255, 255, 255, 255)) self.add_widget(BrowserWidget()) - self.buffer_widget.resize(self.width, self.height) self.buffer_widget.setUrl(QUrl(url)) - self.buffer_widget.titleChanged.connect(self.change_title) self.buffer_widget.web_page.open_url_in_new_tab.connect(self.open_url) - self.fit_to_view = False - - def resize_buffer(self, width, height): - self.width = width - self.height = height - self.buffer_widget.resize(self.width, self.height) - class BrowserWidget(QWebView): def __init__(self): diff --git a/app/imageviewer/buffer.py b/app/imageviewer/buffer.py index 78f10f5..d81f922 100644 --- a/app/imageviewer/buffer.py +++ b/app/imageviewer/buffer.py @@ -28,20 +28,11 @@ from buffer import Buffer class ImageViewerBuffer(Buffer): def __init__(self, buffer_id, url, width, height): - Buffer.__init__(self, buffer_id, url, width, height, QColor(0, 0, 0, 255)) + Buffer.__init__(self, buffer_id, url, width, height, True, QColor(0, 0, 0, 255)) self.add_widget(ImageViewerWidget(url, QColor(0, 0, 0, 255))) - self.buffer_widget.resize(self.width, self.height) - self.buffer_widget.render_image.connect(self.change_title) - self.fit_to_view = True - - def resize_buffer(self, width, height): - self.width = width - self.height = height - self.buffer_widget.resize(self.width, self.height) - class ImageViewerWidget(QWidget): render_image = QtCore.pyqtSignal(str) diff --git a/app/videoplayer/buffer.py b/app/videoplayer/buffer.py index 7e1ec8a..60eaf1d 100644 --- a/app/videoplayer/buffer.py +++ b/app/videoplayer/buffer.py @@ -28,20 +28,10 @@ from buffer import Buffer class VideoPlayerBuffer(Buffer): def __init__(self, buffer_id, url, width, height): - Buffer.__init__(self, buffer_id, url, width, height, QColor(0, 0, 0, 255)) + Buffer.__init__(self, buffer_id, url, width, height, True, QColor(0, 0, 0, 255)) self.add_widget(VideoPlayer()) - self.buffer_widget.resize(self.width, self.height) self.buffer_widget.play(url) - - self.fit_to_view = True - - def resize_buffer(self, width, height): - self.width = width - self.height = height - self.buffer_widget.resize(self.width, self.height) - - def set_video_size(self, width, height): self.buffer_widget.video_item.setSize(QSizeF(width, height)) class VideoPlayer(QWidget): diff --git a/core/buffer.py b/core/buffer.py index d6611c1..4666191 100644 --- a/core/buffer.py +++ b/core/buffer.py @@ -31,28 +31,24 @@ class Buffer(QGraphicsScene): open_url = QtCore.pyqtSignal(str) before_destroy_hook = QtCore.pyqtSignal() - def __init__(self, buffer_id, url, width, height, background_color): + def __init__(self, buffer_id, url, width, height, fit_to_view, background_color): super(QGraphicsScene, self).__init__() - self.width = width - self.height = height - self.buffer_id = buffer_id self.url = url - - self.buffer_widget = None + self.width = width + self.height = height + self.fit_to_view = fit_to_view self.background_color = background_color - self.setBackgroundBrush(QBrush(self.background_color)) - self.fit_to_view = True + self.buffer_widget = None def add_widget(self, widget): self.buffer_widget = widget self.addWidget(self.buffer_widget) - def resize_buffer(self, width, height): - pass + self.buffer_widget.resize(self.width, self.height) def handle_destroy(self): self.before_destroy_hook.emit() diff --git a/core/eaf.py b/core/eaf.py index 37f8012..eb11bc2 100755 --- a/core/eaf.py +++ b/core/eaf.py @@ -23,6 +23,7 @@ from PyQt5.QtWidgets import QApplication from dbus.mainloop.glib import DBusGMainLoop from fake_key_event import fake_key_event from pymediainfo import MediaInfo +from utils import file_is_image, file_is_video from view import View import dbus import dbus.service @@ -55,18 +56,15 @@ class EAF(dbus.service.Object): @dbus.service.method(EAF_DBUS_NAME, in_signature="ss", out_signature="s") def new_buffer(self, buffer_id, url): - global emacs_width, emacs_height if url.startswith("/"): if os.path.exists(url): file_info = MediaInfo.parse(url) - if self.file_is_image(file_info): + if file_is_image(file_info): self.create_buffer(buffer_id, ImageViewerBuffer(buffer_id, url, emacs_width, emacs_height)) - elif self.file_is_video(file_info): - buffer = VideoPlayerBuffer(buffer_id, url, emacs_width, emacs_height) - buffer.set_video_size(emacs_width, emacs_height) - self.create_buffer(buffer_id, buffer) + elif file_is_video(file_info): + self.create_buffer(buffer_id, VideoPlayerBuffer(buffer_id, url, emacs_width, emacs_height)) else: return "Don't know how to open {0}".format(url) else: @@ -85,18 +83,13 @@ class EAF(dbus.service.Object): return "" - def file_is_image(self, file_info): - for track in file_info.tracks: - if track.track_type == "Image": - return True - - return False - def file_is_video(self, file_info): - for track in file_info.tracks: - if track.track_type == "Video": - return True + def create_buffer(self, buffer_id, app_buffer): + # Add buffer to buffer dict. + self.buffer_dict[buffer_id] = app_buffer - return False + # Monitor buffer signals. + app_buffer.update_title.connect(self.update_buffer_title) + app_buffer.open_url.connect(self.open_buffer_url) @dbus.service.method(EAF_DBUS_NAME, in_signature="s", out_signature="") def update_views(self, args): @@ -120,26 +113,6 @@ class EAF(dbus.service.Object): view.trigger_focus_event.connect(self.focus_emacs_buffer) - # # Update buffer size. - # for buffer in list(self.buffer_dict.values()): - # # Get match views. - # match_views = list(filter(lambda v: view.py.buffer_id == buffer.buffer_id, self.view_dict.values())) - - # # Get size list of buffer's views. - # view_sizes = list(map(lambda v: (v.width, v.height), match_views)) - - # # Init buffer size with emacs' size. - # buffer_width = emacs_width - # buffer_height = emacs_height - - # # Update buffer size with max area view's size, - # # to make each view has the same rendering area after user do split operation in emacs. - # if len(view_sizes) > 0: - # buffer_width, buffer_height = max(view_sizes, key=lambda size: size[0] * size[1]) - - # # Resize buffer. - # buffer.resize_buffer(buffer_width, buffer_height) - @dbus.service.method(EAF_DBUS_NAME, in_signature="s", out_signature="") def kill_buffer(self, buffer_id): # Kill all view base on buffer_id. @@ -153,12 +126,12 @@ class EAF(dbus.service.Object): self.buffer_dict[buffer_id].handle_destroy() self.buffer_dict.pop(buffer_id, None) - @dbus.service.method(EAF_DBUS_NAME, in_signature="s", out_signature="") def send_key(self, args): - print("Send key: %s" % args) + # Get buffer id and event string. (buffer_id, event_string) = args.split(":") + # Send event to buffer when found match buffer. if buffer_id in self.buffer_dict: QApplication.sendEvent(self.buffer_dict[buffer_id].buffer_widget, fake_key_event(event_string)) @@ -178,12 +151,6 @@ class EAF(dbus.service.Object): def open_buffer_url(self, url): pass - def create_buffer(self, buffer_id, app_buffer): - self.buffer_dict[buffer_id] = app_buffer - - app_buffer.update_title.connect(self.update_buffer_title) - app_buffer.open_url.connect(self.open_buffer_url) - if __name__ == "__main__": import sys import signal diff --git a/core/utils.py b/core/utils.py index 5af6950..e1e04aa 100644 --- a/core/utils.py +++ b/core/utils.py @@ -48,3 +48,17 @@ class PostGui(QtCore.QObject): self._func(obj, *args, **kwargs) else: self._func(*args, **kwargs) + +def file_is_image(file_info): + for track in file_info.tracks: + if track.track_type == "Image": + return True + + return False + +def file_is_video(file_info): + for track in file_info.tracks: + if track.track_type == "Video": + return True + + return False diff --git a/core/view.py b/core/view.py index fe1e92b..ae6e0e4 100644 --- a/core/view.py +++ b/core/view.py @@ -40,6 +40,7 @@ class View(QWidget): self.setWindowFlags(Qt.FramelessWindowHint) self.setAttribute(Qt.WA_X11DoNotAcceptFocus, True) self.setContentsMargins(0, 0, 0, 0) + self.installEventFilter(self) # Init attributes. self.view_info = view_info @@ -49,11 +50,9 @@ class View(QWidget): self.width = int(self.width) self.height = int(self.height) - self.installEventFilter(self) - + # Build QGraphicsView. self.layout = QVBoxLayout(self) self.layout.setContentsMargins(0, 0, 0, 0) - self.graphics_view = QGraphicsView(buffer, self) self.graphics_view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.graphics_view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) @@ -63,19 +62,21 @@ class View(QWidget): self.graphics_view.setStyleSheet("QGraphicsView {background: transparent; border: 3px; outline: none;}") self.layout.addWidget(self.graphics_view) - # Show and resize. + # NOTE: show function must start before resize to trigger *first* resizeEvent after show. self.show() # Resize after show to trigger fit view operation. self.resize(self.width, self.height) def resizeEvent(self, event): + # Fit content to view rect just when buffer fit_to_view option is enable. if self.buffer.fit_to_view: if event.oldSize().isValid(): self.graphics_view.fitInView(self.graphics_view.scene().sceneRect(), Qt.KeepAspectRatio) QWidget.resizeEvent(self, event) def eventFilter(self, obj, event): + # Focus emacs buffer when user click view. if event.type() in [QEvent.MouseButtonPress, QEvent.MouseButtonRelease, QEvent.MouseMove, QEvent.MouseButtonDblClick, QEvent.Wheel]: self.trigger_focus_event.emit("{0},{1}".format(event.globalX(), event.globalY())) @@ -103,5 +104,4 @@ class View(QWidget): def handle_destroy(self): self.destroy() - - print("Destroy view: %s" % self.view_info) +