Commit 4c70953f authored by Matthew Zeng's avatar Matthew Zeng
Browse files

Redesign build_interactive_method, generalize with build_all_methods

parent b9b18acf
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ from PyQt5.QtCore import QUrl, QTimer
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QColor
from core.browser import BrowserBuffer
from core.utils import touch, string_to_base64
from core.utils import touch, string_to_base64, interactive
import os
import base64

@@ -50,13 +50,13 @@ class AppBuffer(BrowserBuffer):
            self.build_js_method(method_name)

        for method_name in ["zoom_in", "zoom_out", "zoom_reset", "remove_node",
                            "remove_middle_node", "add_middle_node", "update_node_topic",
                            "copy_node_topic", "paste_node_topic", "refresh_page",
                            "remove_middle_node", "add_middle_node", "refresh_page",
                            "select_up_node", "select_down_node", "select_left_node", "select_right_node",
                            "toggle_node", "save_screenshot", "save_file", "save_org_file",
                            "change_node_background", "cut_node_tree", "paste_node_tree"]:
                            "toggle_node", "save_screenshot"]:
            self.build_insert_or_do(method_name)

        self.build_all_methods(self)

        QTimer.singleShot(500, self.init_file)

    def resize_view(self):
@@ -87,19 +87,13 @@ class AppBuffer(BrowserBuffer):
                self.save_file(False)
        setattr(self, method_name, _do)

    def build_insert_or_do(self, method_name):
        def _do ():
            if self.is_focus():
                self.fake_key_event(self.current_event_string)
            else:
                getattr(self, method_name)()
        setattr(self, "insert_or_{}".format(method_name), _do)

    @interactive(insert_or_do=True)
    def copy_node_topic(self):
        node_topic = self.buffer_widget.execute_js("get_node_topic();")
        self.eval_in_emacs.emit('''(kill-new "{}")'''.format(node_topic))
        self.message_to_emacs.emit("Copy: {}".format(node_topic))

    @interactive(insert_or_do=True)
    def paste_node_topic(self):
        text = QApplication.clipboard().text()
        if text.strip() != "":
@@ -110,6 +104,7 @@ class AppBuffer(BrowserBuffer):
        else:
            self.message_to_emacs.emit("Nothing in clipboard, can't paste.")

    @interactive(insert_or_do=True)
    def cut_node_tree(self):
        self.cut_node_id = self.buffer_widget.execute_js("get_selected_nodeid();")
        if self.cut_node_id:
@@ -118,15 +113,18 @@ class AppBuffer(BrowserBuffer):
            else:
                self.message_to_emacs.emit("Cut node tree: {}".format(self.cut_node_id))

    @interactive(insert_or_do=True)
    def paste_node_tree(self):
        if self.cut_node_id:
            self.buffer_widget.eval_js("paste_node_tree('{}');".format(self.cut_node_id))
            self.save_file(False)
            self.message_to_emacs.emit("Paste node tree: {}".format(self.cut_node_id))

    @interactive(insert_or_do=True)
    def change_node_background(self):
        self.send_input_message("Change node background: ", "change_node_background", "file")

    @interactive(insert_or_do=True)
    def update_node_topic(self):
        self.send_input_message(
            "Update topic: ",
@@ -176,6 +174,7 @@ class AppBuffer(BrowserBuffer):

        self.message_to_emacs.emit("Save image: " + image_path)

    @interactive(insert_or_do=True)
    def save_file(self, notify=True):
        file_path = self.get_save_path("emm")
        touch(file_path)
@@ -185,6 +184,7 @@ class AppBuffer(BrowserBuffer):
        if notify:
            self.message_to_emacs.emit("Save file: " + file_path)

    @interactive(insert_or_do=True)
    def save_org_file(self):
        file_path = self.get_save_path("org")
        touch(file_path)
+19 −9
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ from PyQt5.QtGui import QColor, QPixmap, QImage, QFont, QCursor
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QWidget
from core.buffer import Buffer
from core.utils import touch
from core.utils import touch, interactive
import fitz
import time
import random
@@ -41,13 +41,7 @@ class AppBuffer(Buffer):
        self.add_widget(PdfViewerWidget(url, config_dir, QColor(0, 0, 0, 255), buffer_id, emacs_var_dict))
        self.buffer_widget.translate_double_click_word.connect(self.translate_text)

        for method_name in ["scroll_up", "scroll_down", "scroll_up_page",
                            "scroll_down_page", "scroll_to_home", "scroll_to_end",
                            "zoom_reset", "zoom_in", "zoom_out",
                            "save_current_pos", "jump_to_saved_pos",
                            "scroll_right", "scroll_left",
                            "toggle_read_mode", "toggle_inverted_mode", "toggle_mark_link"]:
            self.build_interactive_method(method_name, self.buffer_widget)
        self.build_all_methods(self.buffer_widget)

    def destroy_buffer(self):
        if self.delete_temp_file:
@@ -276,10 +270,12 @@ class PdfViewerWidget(QWidget):
    def repeat_to_length(self, string_to_expand, length):
        return (string_to_expand * (int(length/len(string_to_expand))+1))[:length]

    @interactive()
    def save_current_pos(self):
        self.remember_offset = self.scroll_offset
        self.buffer.message_to_emacs.emit("Saved current position.")

    @interactive()
    def jump_to_saved_pos(self):
        if self.remember_offset is None:
            self.buffer.message_to_emacs.emit("Cannot jump from this position.")
@@ -489,6 +485,7 @@ class PdfViewerWidget(QWidget):
    def max_scroll_offset(self):
        return self.scale * self.page_height * self.page_total_number - self.rect().height()

    @interactive()
    def toggle_read_mode(self):
        if self.read_mode == "fit_to_customize":
            self.read_mode = "fit_to_width"
@@ -500,32 +497,41 @@ class PdfViewerWidget(QWidget):
        self.update_scale()
        self.update()

    @interactive()
    def scroll_up(self):
        self.update_vertical_offset(min(self.scroll_offset + self.scale * self.scroll_step, self.max_scroll_offset()))

    @interactive()
    def scroll_down(self):
        self.update_vertical_offset(max(self.scroll_offset - self.scale * self.scroll_step, 0))

    @interactive()
    def scroll_right(self):
        self.update_horizontal_offset(max(self.horizontal_offset - self.scale * 30, (self.rect().width() - self.page_width * self.scale) / 2))

    @interactive()
    def scroll_left(self):
        self.update_horizontal_offset(min(self.horizontal_offset + (self.scale * 30), (self.page_width * self.scale - self.rect().width()) / 2))

    @interactive()
    def scroll_up_page(self):
        # Adjust scroll step to make users continue reading fluently.
        self.update_vertical_offset(min(self.scroll_offset + self.rect().height() - self.scroll_step, self.max_scroll_offset()))

    @interactive()
    def scroll_down_page(self):
        # Adjust scroll step to make users continue reading fluently.
        self.update_vertical_offset(max(self.scroll_offset - self.rect().height() + self.scroll_step, 0))

    def scroll_to_home(self):
    @interactive()
    def scroll_to_begin(self):
        self.update_vertical_offset(0)

    @interactive()
    def scroll_to_end(self):
        self.update_vertical_offset(self.max_scroll_offset())

    @interactive()
    def zoom_in(self):
        if self.is_mark_search:
            self.cleanup_search()
@@ -533,6 +539,7 @@ class PdfViewerWidget(QWidget):
        self.scale_to(min(10, self.scale + 0.2))
        self.update()

    @interactive()
    def zoom_out(self):
        if self.is_mark_search:
            self.cleanup_search()
@@ -540,6 +547,7 @@ class PdfViewerWidget(QWidget):
        self.scale_to(max(1, self.scale - 0.2))
        self.update()

    @interactive()
    def zoom_reset(self):
        if self.is_mark_search:
            self.cleanup_search()
@@ -547,6 +555,7 @@ class PdfViewerWidget(QWidget):
        self.update_scale()
        self.update()

    @interactive()
    def toggle_inverted_mode(self):
        # Need clear page cache first, otherwise current page will not inverted until next page.
        self.page_cache_pixmap_dict.clear()
@@ -557,6 +566,7 @@ class PdfViewerWidget(QWidget):
        # Re-render page.
        self.update()

    @interactive()
    def toggle_mark_link(self): #  mark_link will add underline mark on link, using prompt link position.
        if self.is_mark_link:
            self.cleanup_mark_link()
+12 −10
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ from PyQt5.QtWidgets import QPushButton, QHBoxLayout, QWidget, QWidget, QListWid
from core.buffer import Buffer
from PyQt5 import QtCore
from core.browser import BrowserView
from core.utils import touch
from core.utils import touch, interactive
import feedparser
import json
import os
@@ -35,16 +35,10 @@ class AppBuffer(Buffer):
        Buffer.__init__(self, buffer_id, url, arguments, emacs_var_dict, module_path, True)

        self.add_widget(RSSReaderWidget(config_dir))
        self.buffer_widget.browser.buffer = self

        for method_name in ["next_subscription", "prev_subscription", "next_article", "prev_article",
                            "first_subscription", "last_subscription", "first_article", "last_article"]:
            self.build_interactive_method(method_name, self.buffer_widget)

        for method_name in ["scroll_up", "scroll_down", "scroll_up_page", "scroll_down_page", "scroll_to_begin", "scroll_to_bottom",
                         "search_text_forward", "search_text_backward"]:
            self.build_interactive_method(method_name, self.buffer_widget.browser)

        self.build_interactive_method("action_quit", self.buffer_widget.browser, "search_quit")
        self.build_all_methods(self.buffer_widget)
        self.build_all_methods(self.buffer_widget.browser)

    def add_subscription(self):
        self.send_input_message("Subscribe to RSS feed: ", "add_subscription")
@@ -372,6 +366,7 @@ class RSSReaderWidget(QWidget):
            except Exception:
                pass

    @interactive()
    def next_subscription(self):
        feed_count = self.feed_list.count()
        current_row = self.feed_list.currentRow()
@@ -383,6 +378,7 @@ class RSSReaderWidget(QWidget):
        else:
            self.buffer.message_to_emacs.emit("End of subscribed feeds")

    @interactive()
    def prev_subscription(self):
        current_row = self.feed_list.currentRow()

@@ -393,11 +389,13 @@ class RSSReaderWidget(QWidget):
        else:
            self.buffer.message_to_emacs.emit("Beginning of subscribed feeds")

    @interactive()
    def first_subscription(self):
        self.feed_list.setCurrentRow(0)
        self.feed_list.scrollToItem(self.feed_list.currentItem())
        self.handle_feed(self.feed_list.currentItem())

    @interactive()
    def last_subscription(self):
        feed_count = self.feed_list.count()

@@ -405,6 +403,7 @@ class RSSReaderWidget(QWidget):
        self.feed_list.scrollToItem(self.feed_list.currentItem())
        self.handle_feed(self.feed_list.currentItem())

    @interactive()
    def next_article(self):
        article_count = self.article_list.count()
        current_row = self.article_list.currentRow()
@@ -416,6 +415,7 @@ class RSSReaderWidget(QWidget):
        else:
            self.buffer.message_to_emacs.emit("End of articles")

    @interactive()
    def prev_article(self):
        current_row = self.article_list.currentRow()

@@ -426,11 +426,13 @@ class RSSReaderWidget(QWidget):
        else:
            self.buffer.message_to_emacs.emit("Beginning of articles")

    @interactive()
    def first_article(self):
        self.article_list.setCurrentRow(0)
        self.article_list.scrollToItem(self.article_list.currentItem())
        self.handle_article(self.article_list.currentItem())

    @interactive()
    def last_article(self):
        article_count = self.article_list.count()

+11 −3
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ from PyQt5.QtCore import QUrl, QTimer, QEvent, QPointF, Qt
from PyQt5.QtGui import QColor, QMouseEvent
from PyQt5.QtWidgets import QApplication
from core.browser import BrowserBuffer
from core.utils import PostGui, get_free_port
from core.utils import PostGui, get_free_port, interactive
import os
import subprocess
import signal
@@ -59,8 +59,7 @@ class AppBuffer(BrowserBuffer):

        QTimer.singleShot(250, self.focus_terminal)

        for method_name in ["search_text_forward", "search_text_backward", "scroll_up", "scroll_down", "scroll_up_page", "scroll_down_page", "scroll_to_begin", "scroll_to_bottom"]:
            self.build_interactive_method(method_name, self)
        self.build_all_methods(self)

    def focus_terminal(self):
        event = QMouseEvent(QEvent.MouseButtonPress, QPointF(0, 0), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier)
@@ -125,21 +124,27 @@ class AppBuffer(BrowserBuffer):
            else:
                self.scroll_down()

    @interactive()
    def scroll_up(self):
        self.buffer_widget.eval_js("scroll_line(1);")

    @interactive()
    def scroll_down(self):
        self.buffer_widget.eval_js("scroll_line(-1);")

    @interactive()
    def scroll_up_page(self):
        self.buffer_widget.eval_js("scroll_page(1);")

    @interactive()
    def scroll_down_page(self):
        self.buffer_widget.eval_js("scroll_page(-1);")

    @interactive()
    def scroll_to_begin(self):
        self.buffer_widget.eval_js("scroll_to_begin();")

    @interactive()
    def scroll_to_bottom(self):
        self.buffer_widget.eval_js("scroll_to_bottom();")

@@ -159,18 +164,21 @@ class AppBuffer(BrowserBuffer):
            # self.web_page.findText(self.search_term)
            self.buffer_widget.eval_js("find_prev('{}')".format(text))

    @interactive()
    def search_text_forward(self):
        if self.search_term == "":
            self.buffer.send_input_message("Forward Search Text: ", "search_text_forward")
        else:
            self._search_text(self.search_term)

    @interactive()
    def search_text_backward(self):
        if self.search_term == "":
            self.buffer.send_input_message("Backward Search Text: ", "search_text_backward")
        else:
            self._search_text(self.search_term, True)

    @interactive()
    def search_quit(self):
        if self.search_term != "":
            self._search_text("")
+6 −4
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QGraphicsVideoItem
from PyQt5.QtWidgets import QWidget, QGraphicsScene, QGraphicsView, QVBoxLayout
from core.buffer import Buffer
from core.utils import interactive

class AppBuffer(Buffer):
    def __init__(self, buffer_id, url, config_dir, arguments, emacs_var_dict, module_path):
@@ -33,8 +34,7 @@ class AppBuffer(Buffer):
        self.add_widget(VideoPlayerWidget())
        self.buffer_widget.play(url)

        self.build_interactive_method("play_backward", self.buffer_widget, "seek_backward")
        self.build_interactive_method("play_forward", self.buffer_widget, "seek_forward")
        self.build_all_methods(self.buffer_widget)

    def all_views_hide(self):
        # Pause video before all views hdie, otherwise will got error "Internal data stream error".
@@ -99,10 +99,12 @@ class VideoPlayerWidget(QWidget):
        self.media_player.setMedia(QMediaContent(QUrl.fromLocalFile(url)))
        self.media_player.play()

    def seek_forward(self):
    @interactive()
    def play_forward(self):
        video_position = self.media_player.position()
        self.media_player.setPosition(video_position + self.video_seek_durcation)

    def seek_backward(self):
    @interactive()
    def play_backward(self):
        video_position = self.media_player.position()
        self.media_player.setPosition(max(video_position - self.video_seek_durcation, 0))
Loading