Refacotry code to simple plugin code

master
Andy Stewart 8 years ago
parent f36aba51e0
commit 4addec34aa
  1. 11
      app/browser/buffer.py
  2. 11
      app/imageviewer/buffer.py
  3. 12
      app/videoplayer/buffer.py
  4. 16
      core/buffer.py
  5. 57
      core/eaf.py
  6. 14
      core/utils.py
  7. 12
      core/view.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):

@ -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)

@ -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):

@ -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()

@ -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

@ -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

@ -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)

Loading…
Cancel
Save