update eaf package
This commit is contained in:
@@ -20,33 +20,42 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from PyQt5 import QtCore
|
||||
from PyQt5.QtCore import QUrl, QTimer
|
||||
from PyQt5.QtCore import QUrl, QTimer, QEvent, QPointF, Qt
|
||||
from PyQt5.QtWidgets import QApplication
|
||||
from PyQt5.QtGui import QColor
|
||||
from PyQt5.QtGui import QColor, QMouseEvent
|
||||
from core.browser import BrowserBuffer
|
||||
from core.utils import touch, string_to_base64, interactive
|
||||
from html import escape, unescape
|
||||
import os
|
||||
import base64
|
||||
import time
|
||||
|
||||
class AppBuffer(BrowserBuffer):
|
||||
|
||||
get_middle_node_id = QtCore.pyqtSignal(str)
|
||||
get_brother_node_id = QtCore.pyqtSignal(str)
|
||||
get_sub_node_id = QtCore.pyqtSignal(str)
|
||||
export_org_json = QtCore.pyqtSignal(str, str)
|
||||
|
||||
def __init__(self, buffer_id, url, config_dir, arguments, emacs_var_dict, module_path):
|
||||
BrowserBuffer.__init__(self, buffer_id, url, config_dir, arguments, emacs_var_dict, module_path, False)
|
||||
|
||||
self.url = url
|
||||
index_file = "file://" + (os.path.join(os.path.dirname(__file__), "index.html"))
|
||||
self.buffer_widget.setUrl(QUrl(index_file))
|
||||
index_file = os.path.join(os.path.dirname(__file__), "index.html")
|
||||
self.buffer_widget.setUrl(QUrl.fromLocalFile(index_file))
|
||||
|
||||
self.cut_node_id = None
|
||||
|
||||
for method_name in ["add_sub_node", "add_brother_node", "remove_node", "remove_middle_node", "add_middle_node", "update_node_topic_inline"]:
|
||||
edit_mode = "true" if self.emacs_var_dict["eaf-mindmap-edit-mode"] == "true" else "false"
|
||||
for method_name in ["add_sub_node", "add_brother_node", "add_middle_node"]:
|
||||
self.build_js_method(method_name, True, js_kwargs={"inline": edit_mode})
|
||||
|
||||
for method_name in ["remove_node", "remove_middle_node", "update_node_topic_inline"]:
|
||||
self.build_js_method(method_name, True)
|
||||
|
||||
for method_name in ["zoom_in", "zoom_out", "zoom_reset",
|
||||
"select_up_node", "select_down_node", "select_left_node", "select_right_node",
|
||||
"toggle_node", "save_screenshot"]:
|
||||
"toggle_node", "toggle_node_selection", "save_screenshot"]:
|
||||
self.build_js_method(method_name)
|
||||
|
||||
for method_name in ["zoom_in", "zoom_out", "zoom_reset", "remove_node",
|
||||
@@ -57,11 +66,16 @@ class AppBuffer(BrowserBuffer):
|
||||
|
||||
self.build_all_methods(self)
|
||||
|
||||
QTimer.singleShot(500, self.init_file)
|
||||
QTimer.singleShot(500, self.initialize)
|
||||
|
||||
def resize_view(self):
|
||||
self.buffer_widget.eval_js("relayout();")
|
||||
|
||||
def initialize(self):
|
||||
self.init_file()
|
||||
|
||||
self.focus_widget(QMouseEvent(QEvent.MouseButtonPress, QPointF(0, 0), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier))
|
||||
|
||||
def init_file(self):
|
||||
self.url = os.path.expanduser(self.url)
|
||||
|
||||
@@ -73,20 +87,38 @@ class AppBuffer(BrowserBuffer):
|
||||
|
||||
color = "#FFFFFF"
|
||||
if self.emacs_var_dict["eaf-mindmap-dark-mode"] == "true" or \
|
||||
(self.emacs_var_dict["eaf-mindmap-dark-mode"] == "" and self.emacs_var_dict["eaf-emacs-theme-mode"] == "dark"):
|
||||
(self.emacs_var_dict["eaf-mindmap-dark-mode"] == "follow" and self.emacs_var_dict["eaf-emacs-theme-mode"] == "dark"):
|
||||
color = "#242525"
|
||||
self.buffer_widget.eval_js("init_background('{}');".format(color))
|
||||
|
||||
self.change_title(self.get_root_node_topic())
|
||||
|
||||
def build_js_method(self, method_name, auto_save=False):
|
||||
def build_js_method(self, method_name, auto_save=False, js_kwargs=None):
|
||||
js_kwargs = js_kwargs or {}
|
||||
js_func_args = ", ".join('{}={}'.format(k, v) for k, v in js_kwargs.items())
|
||||
def _do ():
|
||||
self.buffer_widget.eval_js("{}();".format(method_name))
|
||||
self.buffer_widget.eval_js("{}({});".format(method_name, js_func_args))
|
||||
|
||||
if auto_save:
|
||||
self.save_file(False)
|
||||
setattr(self, method_name, _do)
|
||||
|
||||
@interactive
|
||||
def refresh_page(self):
|
||||
self.url = os.path.expanduser(self.url)
|
||||
|
||||
if os.path.exists(self.url):
|
||||
with open(self.url, "r") as f:
|
||||
self.buffer_widget.execute_js("refresh('{}');".format(string_to_base64(f.read())))
|
||||
|
||||
color = "#FFFFFF"
|
||||
if self.emacs_var_dict["eaf-mindmap-dark-mode"] == "true" or \
|
||||
(self.emacs_var_dict["eaf-mindmap-dark-mode"] == "follow" and self.emacs_var_dict["eaf-emacs-theme-mode"] == "dark"):
|
||||
color = "#242525"
|
||||
self.buffer_widget.eval_js("init_background('{}');".format(color))
|
||||
|
||||
self.change_title(self.get_root_node_topic())
|
||||
|
||||
@interactive(insert_or_do=True)
|
||||
def change_background_color(self):
|
||||
self.send_input_message("Change node background color(Input color): ", "change_background_color")
|
||||
@@ -98,12 +130,12 @@ class AppBuffer(BrowserBuffer):
|
||||
@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.eval_in_emacs.emit('kill-new', [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()
|
||||
text = self.get_clipboard_text()
|
||||
if text.strip() != "":
|
||||
self.buffer_widget.eval_js("update_node_topic('{}');".format(text))
|
||||
self.message_to_emacs.emit("Paste: {}".format(text))
|
||||
@@ -138,26 +170,63 @@ class AppBuffer(BrowserBuffer):
|
||||
"Update topic: ",
|
||||
"update_node_topic",
|
||||
"string",
|
||||
self.buffer_widget.execute_js("get_node_topic();"))
|
||||
unescape(self.buffer_widget.execute_js("get_node_topic();")))
|
||||
|
||||
def handle_update_node_topic(self, topic):
|
||||
self.buffer_widget.eval_js("update_node_topic('{}');".format(topic))
|
||||
self.buffer_widget.eval_js("update_node_topic('{}');".format(escape(topic)))
|
||||
|
||||
self.change_title(self.get_root_node_topic())
|
||||
|
||||
self.save_file(False)
|
||||
|
||||
def handle_input_message(self, result_type, result_content):
|
||||
if result_type == "update_node_topic":
|
||||
def handle_input_response(self, callback_tag, result_content):
|
||||
if callback_tag == "update_node_topic":
|
||||
self.handle_update_node_topic(str(result_content))
|
||||
elif result_type == "change_node_background":
|
||||
elif callback_tag == "change_node_background":
|
||||
print(str(result_content))
|
||||
self.buffer_widget.eval_js("change_node_background('{}');".format(str(result_content)))
|
||||
elif result_type == "change_background_color":
|
||||
elif callback_tag == "change_background_color":
|
||||
self.buffer_widget.eval_js("change_background_color('{}');".format(str(result_content)))
|
||||
elif result_type == "change_text_color":
|
||||
elif callback_tag == "change_text_color":
|
||||
self.buffer_widget.eval_js("change_text_color('{}');".format(str(result_content)))
|
||||
|
||||
def add_multiple_sub_nodes(self):
|
||||
node_id = self.buffer_widget.execute_js("_jm.get_selected_node();")
|
||||
if node_id != None:
|
||||
self.get_sub_node_id.emit(self.buffer_id)
|
||||
else:
|
||||
self.message_to_emacs.emit("No selected node.")
|
||||
|
||||
def add_multiple_brother_nodes(self):
|
||||
node_id = self.buffer_widget.execute_js("_jm.get_selected_node();")
|
||||
if node_id == None:
|
||||
self.message_to_emacs.emit("No selected node.")
|
||||
elif not self.buffer_widget.execute_js("_jm.get_selected_node().parent;"):
|
||||
self.message_to_emacs.emit("No parent node for selected node.")
|
||||
else:
|
||||
self.get_brother_node_id.emit(self.buffer_id)
|
||||
|
||||
def add_multiple_middle_nodes(self):
|
||||
node_id = self.buffer_widget.execute_js("_jm.get_selected_node();")
|
||||
if node_id == None:
|
||||
self.message_to_emacs.emit("No selected node.")
|
||||
elif not self.buffer_widget.execute_js("_jm.get_selected_node().parent;"):
|
||||
self.message_to_emacs.emit("No parent node for selected node.")
|
||||
else:
|
||||
self.get_middle_node_id.emit(self.buffer_id)
|
||||
|
||||
@interactive
|
||||
def add_texted_sub_node(self,text):
|
||||
self.buffer_widget.eval_js("add_texted_sub_node('{}');".format(str(text)))
|
||||
|
||||
@interactive
|
||||
def add_texted_brother_node(self,text):
|
||||
self.buffer_widget.eval_js("add_texted_brother_node('{}');".format(str(text)))
|
||||
|
||||
@interactive
|
||||
def add_texted_middle_node(self,text):
|
||||
self.buffer_widget.eval_js("add_texted_middle_node('{}');".format(str(text)))
|
||||
|
||||
def is_focus(self):
|
||||
return self.buffer_widget.execute_js("node_is_focus();")
|
||||
|
||||
@@ -174,7 +243,7 @@ class AppBuffer(BrowserBuffer):
|
||||
|
||||
def get_save_path(self, extension_name):
|
||||
if self.url.strip() == "":
|
||||
return os.path.join(os.path.expanduser(self.emacs_var_dict["eaf-mindmap-save-path"]), self.get_root_node_topic() + "." + extension_name)
|
||||
return os.path.join(os.path.expanduser(self.emacs_var_dict["eaf-mindmap-save-path"]), self.get_root_node_topic().replace(" ", "_") + time.strftime("_%Y%m%d_%H%M%S", time.localtime(int(time.time()))) + "." + extension_name)
|
||||
else:
|
||||
return os.path.splitext(self.url)[0] + "." + extension_name
|
||||
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
;; Copyright (C) 2020, Andy Stewart, all rights reserved.
|
||||
;; Created: 2020-02-28 16:09:02
|
||||
;; Version: 0.1
|
||||
;; Last-Updated: 2020-02-28 16:09:02
|
||||
;; By: Andy Stewart
|
||||
;; Last-Updated: Tue Jan 19 01:15:47 2021 (-0500)
|
||||
;; By: Mingde (Matthew) Zeng
|
||||
;; URL: http://www.emacswiki.org/emacs/download/eaf-mindmap.el
|
||||
;; Keywords:
|
||||
;; Compatibility: GNU Emacs 26.3
|
||||
;; Compatibility: emacs-version >= 27
|
||||
;;
|
||||
;; Features that might be required by this library:
|
||||
;;
|
||||
@@ -84,11 +84,6 @@
|
||||
|
||||
;;; Code:
|
||||
|
||||
(dbus-register-signal
|
||||
:session "com.lazycat.eaf" "/com/lazycat/eaf"
|
||||
"com.lazycat.eaf" "export_org_json"
|
||||
#'eaf--export-org-json)
|
||||
|
||||
(defun eaf--export-org-json (org-json-content org-file-path)
|
||||
(let (org-parse-data)
|
||||
(with-temp-buffer
|
||||
@@ -114,8 +109,10 @@
|
||||
(end-of-line)
|
||||
(backward-char 1)
|
||||
(point)))))
|
||||
(when (> (length header-string) 2)
|
||||
(setq header-string (string-remove-prefix "*" header-string)))
|
||||
(let ((loop-times (/ (- (length header-string) 1) 2)))
|
||||
(while (> loop-times 0)
|
||||
(setq loop-times (- loop-times 1))
|
||||
(setq header-string (string-remove-prefix "*" header-string))))
|
||||
(setq org-parse-data (concat org-parse-data (format "%s%s\n" header-string content-string)))))
|
||||
|
||||
(with-temp-file org-file-path
|
||||
@@ -302,6 +299,78 @@ actural call `org-json-gen-alist1' to work."
|
||||
(concat h " " vs))
|
||||
))
|
||||
|
||||
(defun eaf--add-multiple-sub-nodes (buffer-id)
|
||||
"EAF Browser: edit FOCUS-TEXT with Emacs's BUFFER-ID."
|
||||
(split-window-below -10)
|
||||
(other-window 1)
|
||||
(let ((edit-text-buffer (generate-new-buffer (format "eaf-%s-add-multiple-sub-nodes" eaf--buffer-app-name))))
|
||||
(with-current-buffer edit-text-buffer
|
||||
(eaf-edit-mode)
|
||||
(set (make-local-variable 'eaf--buffer-id) buffer-id))
|
||||
(switch-to-buffer edit-text-buffer)
|
||||
(setq-local eaf-mindmap--current-add-mode "sub")
|
||||
(setq header-line-format
|
||||
(substitute-command-keys
|
||||
(concat
|
||||
"\\<eaf-edit-mode-map>"
|
||||
" EAF/" eaf--buffer-app-name " EDIT: "
|
||||
"Confirm with `\\[eaf-edit-buffer-confirm]', "
|
||||
"Cancel with `\\[eaf-edit-buffer-cancel]', "
|
||||
"Separate diffrent nodes with 'RET'. "
|
||||
)))
|
||||
;; When text line number above
|
||||
(when (> (line-number-at-pos) 30)
|
||||
(beginning-of-buffer))
|
||||
))
|
||||
|
||||
(defun eaf--add-multiple-brother-nodes (buffer-id)
|
||||
"EAF Browser: edit FOCUS-TEXT with Emacs's BUFFER-ID."
|
||||
(split-window-below -10)
|
||||
(other-window 1)
|
||||
(let ((edit-text-buffer (generate-new-buffer (format "eaf-%s-add-multiple-brother-nodes" eaf--buffer-app-name))))
|
||||
(with-current-buffer edit-text-buffer
|
||||
(eaf-edit-mode)
|
||||
(set (make-local-variable 'eaf--buffer-id) buffer-id))
|
||||
(switch-to-buffer edit-text-buffer)
|
||||
(setq-local eaf-mindmap--current-add-mode "brother")
|
||||
(setq header-line-format
|
||||
(substitute-command-keys
|
||||
(concat
|
||||
"\\<eaf-edit-mode-map>"
|
||||
" EAF/" eaf--buffer-app-name " EDIT: "
|
||||
"Confirm with `\\[eaf-edit-buffer-confirm]', "
|
||||
"Cancel with `\\[eaf-edit-buffer-cancel]', "
|
||||
"Separate diffrent nodes with 'RET'. "
|
||||
)))
|
||||
;; When text line number above
|
||||
(when (> (line-number-at-pos) 30)
|
||||
(beginning-of-buffer))
|
||||
))
|
||||
|
||||
(defun eaf--add-multiple-middle-nodes (buffer-id)
|
||||
"EAF Browser: edit FOCUS-TEXT with Emacs's BUFFER-ID."
|
||||
(split-window-below -10)
|
||||
(other-window 1)
|
||||
(let ((edit-text-buffer (generate-new-buffer (format "eaf-%s-add-multiple-middle-nodes" eaf--buffer-app-name))))
|
||||
(with-current-buffer edit-text-buffer
|
||||
(eaf-edit-mode)
|
||||
(set (make-local-variable 'eaf--buffer-id) buffer-id))
|
||||
(switch-to-buffer edit-text-buffer)
|
||||
(setq-local eaf-mindmap--current-add-mode "middle")
|
||||
(setq header-line-format
|
||||
(substitute-command-keys
|
||||
(concat
|
||||
"\\<eaf-edit-mode-map>"
|
||||
" EAF/" eaf--buffer-app-name " EDIT: "
|
||||
"Confirm with `\\[eaf-edit-buffer-confirm]', "
|
||||
"Cancel with `\\[eaf-edit-buffer-cancel]', "
|
||||
"Separate diffrent nodes with 'RET'. "
|
||||
)))
|
||||
;; When text line number above
|
||||
(when (> (line-number-at-pos) 30)
|
||||
(beginning-of-buffer))
|
||||
))
|
||||
|
||||
(provide 'eaf-mindmap)
|
||||
|
||||
;;; eaf-mindmap.el ends here
|
||||
|
||||
@@ -1,289 +1,369 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<link type="text/css" rel="stylesheet" href="jsmind.css" />
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<link type="text/css" rel="stylesheet" href="jsmind.css" />
|
||||
|
||||
<script type="text/javascript" src="jsmind.js"></script>
|
||||
<script type="text/javascript" src="jsmind.draggable.js"></script>
|
||||
<script type="text/javascript" src="jsmind.screenshot.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="jsmind_container"></div>
|
||||
<script type="text/javascript" src="jsmind.js"></script>
|
||||
<script type="text/javascript" src="jsmind.draggable.js"></script>
|
||||
<script type="text/javascript" src="jsmind.screenshot.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="jsmind_container"></div>
|
||||
|
||||
<script type="text/javascript">
|
||||
var _jm = null;
|
||||
<script type="text/javascript">
|
||||
var _jm = null;
|
||||
var _cur_nodeid = null;
|
||||
|
||||
var options = {
|
||||
container:'jsmind_container',
|
||||
editable:true
|
||||
}
|
||||
var options = {
|
||||
container:'jsmind_container',
|
||||
editable:true
|
||||
}
|
||||
|
||||
function change_background_color(color) {
|
||||
var selected_id = get_selected_nodeid();
|
||||
if(selected_id) {
|
||||
_jm.set_node_color(selected_id, color, null);
|
||||
}
|
||||
function change_background_color(color) {
|
||||
var selected_id = get_selected_nodeid();
|
||||
if(selected_id) {
|
||||
_jm.set_node_color(selected_id, color, null);
|
||||
}
|
||||
}
|
||||
|
||||
function change_text_color(color) {
|
||||
var selected_id = get_selected_nodeid();
|
||||
if(selected_id) {
|
||||
_jm.set_node_color(selected_id, null, color);
|
||||
}
|
||||
}
|
||||
|
||||
function select_root_node() {
|
||||
_jm.select_node("root");
|
||||
}
|
||||
|
||||
function init_root_node() {
|
||||
_jm = jsMind.show(options);
|
||||
select_root_node();
|
||||
}
|
||||
|
||||
function init_background(color) {
|
||||
document.getElementById("jsmind_container").style.backgroundColor = color;
|
||||
}
|
||||
|
||||
function get_root_node_topic() {
|
||||
return _jm.get_node("root").topic;
|
||||
}
|
||||
|
||||
function get_node_topic() {
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if (selected_node) {
|
||||
return selected_node.topic;
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
function add_sub_node(inline=false){
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if(!selected_node) {
|
||||
_jm.move_node(selected_id,'_first_');
|
||||
}
|
||||
|
||||
function change_text_color(color) {
|
||||
var selected_id = get_selected_nodeid();
|
||||
if(selected_id) {
|
||||
_jm.set_node_color(selected_id, null, color);
|
||||
}
|
||||
}
|
||||
var nodeid = jsMind.util.uuid.newid();
|
||||
var node = _jm.add_node(selected_node, nodeid, 'Topic');
|
||||
_jm.select_node(node);
|
||||
if (inline) {
|
||||
_jm.begin_edit(node);
|
||||
}
|
||||
}
|
||||
|
||||
function select_root_node() {
|
||||
_jm.select_node("root");
|
||||
}
|
||||
function add_texted_sub_node(text){
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if(!selected_node) {
|
||||
_jm.move_node(selected_id,'_first_');
|
||||
}
|
||||
|
||||
function init_root_node() {
|
||||
_jm = jsMind.show(options);
|
||||
select_root_node();
|
||||
}
|
||||
var nodeid = jsMind.util.uuid.newid();
|
||||
_jm.add_node(selected_node, nodeid, text);
|
||||
}
|
||||
|
||||
function init_background(color) {
|
||||
document.getElementById("jsmind_container").style.backgroundColor = color;
|
||||
}
|
||||
function add_brother_node(inline=false){
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if(!selected_node) {
|
||||
_jm.move_node(selected_id,'_first_');
|
||||
}
|
||||
if(_jm.view.is_editing()) {
|
||||
_jm.end_edit();
|
||||
} else {
|
||||
var nodeid = jsMind.util.uuid.newid();
|
||||
var node = _jm.insert_node_after(selected_node, nodeid, 'Topic');
|
||||
_jm.select_node(node);
|
||||
if (inline) {
|
||||
_jm.begin_edit(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function get_root_node_topic() {
|
||||
return _jm.get_node("root").topic;
|
||||
}
|
||||
function add_texted_brother_node(text){
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if(!selected_node) {
|
||||
_jm.move_node(selected_id,'_first_');
|
||||
}
|
||||
if(_jm.view.is_editing()) {
|
||||
_jm.end_edit();
|
||||
} else {
|
||||
var nodeid = jsMind.util.uuid.newid();
|
||||
_jm.insert_node_after(selected_node, nodeid, text);
|
||||
}
|
||||
}
|
||||
|
||||
function get_node_topic() {
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if (selected_node) {
|
||||
return selected_node.topic;
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
function get_selected_nodeid(){
|
||||
var selected_node = _jm.get_selected_node();
|
||||
if(!!selected_node){
|
||||
return selected_node.id;
|
||||
}else{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function add_sub_node(){
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if(!selected_node) {
|
||||
_jm.move_node(selected_id,'_first_');
|
||||
}
|
||||
function remove_node(){
|
||||
var selected_id = get_selected_nodeid();
|
||||
if(selected_id) {
|
||||
_jm.select_node(_jm.get_selected_node().parent);
|
||||
_jm.remove_node(selected_id);
|
||||
}
|
||||
}
|
||||
|
||||
var nodeid = jsMind.util.uuid.newid();
|
||||
var node = _jm.add_node(selected_node, nodeid, 'Topic');
|
||||
_jm.select_node(node);
|
||||
}
|
||||
function update_node_topic(topic) {
|
||||
var selected_id = get_selected_nodeid();
|
||||
if (selected_id) {
|
||||
_jm.update_node(selected_id, topic);
|
||||
}
|
||||
}
|
||||
|
||||
function add_brother_node(){
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if(!selected_node) {
|
||||
_jm.move_node(selected_id,'_first_');
|
||||
}
|
||||
if(_jm.view.is_editing()) {
|
||||
_jm.end_edit();
|
||||
} else {
|
||||
var nodeid = jsMind.util.uuid.newid();
|
||||
var node = _jm.insert_node_after(selected_node, nodeid, 'Topic');
|
||||
_jm.select_node(node);
|
||||
}
|
||||
}
|
||||
function update_node_topic_inline() {
|
||||
var selected_id = get_selected_nodeid();
|
||||
if (selected_id) {
|
||||
_jm.begin_edit(selected_id);
|
||||
}
|
||||
}
|
||||
|
||||
function get_selected_nodeid(){
|
||||
var selected_node = _jm.get_selected_node();
|
||||
if(!!selected_node){
|
||||
return selected_node.id;
|
||||
}else{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
function zoom_in() {
|
||||
_jm.view.zoom_in();
|
||||
};
|
||||
|
||||
function remove_node(){
|
||||
var selected_id = get_selected_nodeid();
|
||||
if(selected_id) {
|
||||
_jm.select_node(_jm.get_selected_node().parent);
|
||||
_jm.remove_node(selected_id);
|
||||
}
|
||||
}
|
||||
function zoom_out() {
|
||||
_jm.view.zoom_out();
|
||||
};
|
||||
|
||||
function update_node_topic(topic) {
|
||||
var selected_id = get_selected_nodeid();
|
||||
if (selected_id) {
|
||||
_jm.update_node(selected_id, topic);
|
||||
}
|
||||
}
|
||||
function zoom_reset() {
|
||||
_jm.view.set_zoom(1);
|
||||
}
|
||||
|
||||
function update_node_topic_inline() {
|
||||
var selected_id = get_selected_nodeid();
|
||||
if (selected_id) {
|
||||
_jm.begin_edit(selected_id);
|
||||
}
|
||||
}
|
||||
function select_up_node(){
|
||||
var selected_node = _jm.get_selected_node();
|
||||
if(!!selected_node){
|
||||
var up_node = _jm.find_node_before(selected_node);
|
||||
if(!up_node){
|
||||
var np = _jm.find_node_before(selected_node.parent);
|
||||
if(!!np && np.children.length > 0){
|
||||
up_node = np.children[np.children.length-1];
|
||||
}
|
||||
}
|
||||
if(!!up_node){
|
||||
_jm.select_node(up_node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function zoom_in() {
|
||||
_jm.view.zoom_in();
|
||||
};
|
||||
function select_down_node(){
|
||||
var selected_node = _jm.get_selected_node();
|
||||
if(!!selected_node){
|
||||
var down_node = _jm.find_node_after(selected_node);
|
||||
if(!down_node){
|
||||
var np = _jm.find_node_after(selected_node.parent);
|
||||
if(!!np && np.children.length > 0){
|
||||
down_node = np.children[0];
|
||||
}
|
||||
}
|
||||
if(!!down_node){
|
||||
_jm.select_node(down_node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function zoom_out() {
|
||||
_jm.view.zoom_out();
|
||||
};
|
||||
function select_left_node(){
|
||||
select_relative_node(-1);
|
||||
}
|
||||
|
||||
function zoom_reset() {
|
||||
_jm.view.set_zoom(1);
|
||||
}
|
||||
function select_right_node(){
|
||||
select_relative_node(1);
|
||||
}
|
||||
|
||||
function select_up_node(){
|
||||
var selected_node = _jm.get_selected_node();
|
||||
if(!!selected_node){
|
||||
var up_node = _jm.find_node_before(selected_node);
|
||||
if(!up_node){
|
||||
var np = _jm.find_node_before(selected_node.parent);
|
||||
if(!!np && np.children.length > 0){
|
||||
up_node = np.children[np.children.length-1];
|
||||
}
|
||||
}
|
||||
if(!!up_node){
|
||||
_jm.select_node(up_node);
|
||||
}
|
||||
}
|
||||
}
|
||||
function select_relative_node(d){
|
||||
var selected_node = _jm.get_selected_node();
|
||||
var node = null;
|
||||
if(!!selected_node){
|
||||
if(selected_node.isroot){
|
||||
var c = selected_node.children;
|
||||
var children = [];
|
||||
for(var i=0;i<c.length;i++){
|
||||
if(c[i].direction === d){
|
||||
children.push(i)
|
||||
}
|
||||
}
|
||||
node = c[children[Math.floor((children.length-1)/2)]];
|
||||
}
|
||||
else if(selected_node.direction === d){
|
||||
var children = selected_node.children;
|
||||
var childrencount = children.length;
|
||||
if(childrencount > 0){
|
||||
node = children[Math.floor((childrencount-1)/2)]
|
||||
}
|
||||
}else{
|
||||
node = selected_node.parent;
|
||||
}
|
||||
if(!!node){
|
||||
_jm.select_node(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function select_down_node(){
|
||||
var selected_node = _jm.get_selected_node();
|
||||
if(!!selected_node){
|
||||
var down_node = _jm.find_node_after(selected_node);
|
||||
if(!down_node){
|
||||
var np = _jm.find_node_after(selected_node.parent);
|
||||
if(!!np && np.children.length > 0){
|
||||
down_node = np.children[0];
|
||||
}
|
||||
}
|
||||
if(!!down_node){
|
||||
_jm.select_node(down_node);
|
||||
}
|
||||
}
|
||||
}
|
||||
function node_is_focus() {
|
||||
return _jm.view.is_editing();
|
||||
}
|
||||
|
||||
function select_left_node(){
|
||||
select_relative_node(-1);
|
||||
}
|
||||
function toggle_node() {
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if (selected_node) {
|
||||
_jm.toggle_node(selected_node);
|
||||
}
|
||||
}
|
||||
|
||||
function select_right_node(){
|
||||
select_relative_node(1);
|
||||
}
|
||||
function toggle_node_selection() {
|
||||
var nodeid = get_selected_nodeid();
|
||||
if (!!nodeid){
|
||||
_cur_nodeid = nodeid;
|
||||
_jm.select_clear();
|
||||
}else{
|
||||
_jm.select_node(_cur_nodeid || "root");
|
||||
_cur_nodeid = null;
|
||||
}
|
||||
}
|
||||
|
||||
function select_relative_node(d){
|
||||
var selected_node = _jm.get_selected_node();
|
||||
var node = null;
|
||||
if(!!selected_node){
|
||||
if(selected_node.isroot){
|
||||
var c = selected_node.children;
|
||||
var children = [];
|
||||
for(var i=0;i<c.length;i++){
|
||||
if(c[i].direction === d){
|
||||
children.push(i)
|
||||
}
|
||||
}
|
||||
node = c[children[Math.floor((children.length-1)/2)]];
|
||||
}
|
||||
else if(selected_node.direction === d){
|
||||
var children = selected_node.children;
|
||||
var childrencount = children.length;
|
||||
if(childrencount > 0){
|
||||
node = children[Math.floor((childrencount-1)/2)]
|
||||
}
|
||||
}else{
|
||||
node = selected_node.parent;
|
||||
}
|
||||
if(!!node){
|
||||
_jm.select_node(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
function save_screenshot() {
|
||||
_jm.screenshot.shootDownload();
|
||||
}
|
||||
|
||||
function node_is_focus() {
|
||||
return _jm.view.is_editing();
|
||||
}
|
||||
|
||||
function refresh(file_base64_content) {
|
||||
var file_data = decodeURIComponent(escape(window.atob(file_base64_content)));
|
||||
var mind = jsMind.util.json.string2json(file_data);
|
||||
|
||||
function toggle_node() {
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if (selected_node) {
|
||||
_jm.toggle_node(selected_node);
|
||||
}
|
||||
}
|
||||
if(!!mind){
|
||||
_jm.show(mind);
|
||||
|
||||
function save_screenshot() {
|
||||
_jm.screenshot.shootDownload();
|
||||
}
|
||||
select_root_node();
|
||||
}
|
||||
}
|
||||
|
||||
function open_file(file_base64_content) {
|
||||
_jm = jsMind.show(options);
|
||||
function open_file(file_base64_content) {
|
||||
_jm = jsMind.show(options);
|
||||
|
||||
var file_data = decodeURIComponent(escape(window.atob(file_base64_content)));
|
||||
var mind = jsMind.util.json.string2json(file_data);
|
||||
var file_data = decodeURIComponent(escape(window.atob(file_base64_content)));
|
||||
var mind = jsMind.util.json.string2json(file_data);
|
||||
|
||||
if(!!mind){
|
||||
_jm.show(mind);
|
||||
if(!!mind){
|
||||
_jm.show(mind);
|
||||
|
||||
select_root_node();
|
||||
}
|
||||
}
|
||||
select_root_node();
|
||||
}
|
||||
}
|
||||
|
||||
function save_file() {
|
||||
return jsMind.util.json.json2string(_jm.get_data());
|
||||
}
|
||||
function save_file() {
|
||||
return jsMind.util.json.json2string(_jm.get_data());
|
||||
}
|
||||
|
||||
function change_node_background(image) {
|
||||
var selected_id = get_selected_nodeid();
|
||||
if(selected_id) {
|
||||
_jm.set_node_background_image(selected_id, "file://" + image);
|
||||
}
|
||||
}
|
||||
function change_node_background(image) {
|
||||
var selected_id = get_selected_nodeid();
|
||||
if(selected_id) {
|
||||
_jm.set_node_background_image(selected_id, "file://" + image);
|
||||
}
|
||||
}
|
||||
|
||||
function relayout() {
|
||||
_jm.view.relayout();
|
||||
}
|
||||
function relayout() {
|
||||
_jm.view.relayout();
|
||||
}
|
||||
|
||||
function paste_node_tree(src_node_id) {
|
||||
/* var selected_node = _jm.get_selected_node();
|
||||
* if(!!selected_node){
|
||||
* var src_node = _jm.get_node(src_node_id);
|
||||
* _jm.move_node(src_node, selected_node, selected_node.direction);
|
||||
* } */
|
||||
function paste_node_tree(src_node_id) {
|
||||
/* var selected_node = _jm.get_selected_node();
|
||||
* if(!!selected_node){
|
||||
* var src_node = _jm.get_node(src_node_id);
|
||||
* _jm.move_node(src_node, selected_node, selected_node.direction);
|
||||
* } */
|
||||
|
||||
var selected_node = _jm.get_selected_node();
|
||||
if(!!selected_node){
|
||||
var src_node = _jm.get_node(src_node_id);
|
||||
_jm.move_node(src_node, src_node_id, selected_node.id, selected_node.direction);
|
||||
}
|
||||
}
|
||||
var selected_node = _jm.get_selected_node();
|
||||
if(!!selected_node){
|
||||
var src_node = _jm.get_node(src_node_id);
|
||||
_jm.move_node(src_node, src_node_id, selected_node.id, selected_node.direction);
|
||||
}
|
||||
}
|
||||
|
||||
function remove_middle_node() {
|
||||
var selected_node = _jm.get_selected_node();
|
||||
if(!!selected_node){
|
||||
var children = selected_node.children;
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
var child = children[i];
|
||||
_jm.move_node(child, child.id, selected_node.parent.id, selected_node.parent.direction);
|
||||
}
|
||||
function remove_middle_node() {
|
||||
var selected_node = _jm.get_selected_node();
|
||||
if(!!selected_node){
|
||||
var children = selected_node.children;
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
var child = children[i];
|
||||
_jm.move_node(child, child.id, selected_node.parent.id, selected_node.parent.direction);
|
||||
}
|
||||
|
||||
_jm.select_node(selected_node.parent);
|
||||
_jm.remove_node(selected_node.id);
|
||||
}
|
||||
}
|
||||
_jm.select_node(selected_node.parent);
|
||||
_jm.remove_node(selected_node.id);
|
||||
}
|
||||
}
|
||||
|
||||
function add_middle_node() {
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if(!!selected_node) {
|
||||
var topic = selected_node.topic;
|
||||
function add_middle_node(inline=false) {
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if(!!selected_node) {
|
||||
var topic = selected_node.topic;
|
||||
|
||||
add_brother_node();
|
||||
add_brother_node(false);
|
||||
|
||||
var brother_node = _jm.get_selected_node();
|
||||
_jm.update_node(brother_node.id, topic);
|
||||
_jm.update_node(selected_node.id, "Topic");
|
||||
var brother_node = _jm.get_selected_node();
|
||||
_jm.update_node(brother_node.id, topic);
|
||||
_jm.update_node(selected_node.id, "Topic");
|
||||
|
||||
_jm.move_node(selected_node, selected_node.id, brother_node.id, brother_node.direction);
|
||||
_jm.move_node(selected_node, selected_node.id, brother_node.id, brother_node.direction);
|
||||
|
||||
_jm.select_node(selected_node);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
_jm.select_node(selected_node);
|
||||
if (inline) {
|
||||
_jm.begin_edit(selected_node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function add_texted_middle_node(text){
|
||||
var selected_node = _jm.get_selected_node(); // as parent of new node
|
||||
if(!!selected_node) {
|
||||
var topic = selected_node.topic;
|
||||
|
||||
if(_jm.view.is_editing()) {
|
||||
_jm.end_edit();
|
||||
} else {
|
||||
var nodeid = jsMind.util.uuid.newid();
|
||||
var node = _jm.insert_node_after(selected_node, nodeid, text);
|
||||
_jm.select_node(node);
|
||||
}
|
||||
|
||||
var brother_node = _jm.get_selected_node();
|
||||
_jm.update_node(brother_node.id, topic);
|
||||
_jm.update_node(selected_node.id, text);
|
||||
|
||||
_jm.move_node(selected_node, selected_node.id, brother_node.id, brother_node.direction);
|
||||
|
||||
_jm.select_node(selected_node);
|
||||
}
|
||||
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -73,10 +73,10 @@
|
||||
editnode : 113,// F2
|
||||
delnode : 46, // Delete
|
||||
toggle : 32, // Space
|
||||
left : 37, // Left
|
||||
up : 38, // Up
|
||||
right : 39, // Right
|
||||
down : 40, // Down
|
||||
// left : 37, // Left
|
||||
// up : 38, // Up
|
||||
// right : 39, // Right
|
||||
// down : 40, // Down
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user