diff --git a/OSN.asd b/OSN.asd index 493b183..df8935e 100644 --- a/OSN.asd +++ b/OSN.asd @@ -44,6 +44,7 @@ (:file "ui-utils" :depends-on ("pkgdef" "globals" "conditions")) (:file "debugger-ui" :depends-on ("pkgdef" "globals" "conditions" "ui-utils")) (:file "osn-viewer" :depends-on ("pkgdef" "globals" "conditions" "osn" "osn-parser" "osn-writer" "osn-to-os10" "ui-utils")) - (:file "win-ui" :depends-on ("pkgdef" "globals" "conditions" "ui-utils" "debugger-ui" "osn-viewer"))) + (:file "xosc-viewer" :depends-on ("pkgdef" "globals" "conditions" "ui-utils")) + (:file "win-ui" :depends-on ("pkgdef" "globals" "conditions" "ui-utils" "debugger-ui" "osn-viewer" "xosc-viewer"))) :depends-on ("lib"))) :depends-on ("cl-ppcre" "yacc" "cxml")) diff --git a/src/osn-viewer.lisp b/src/osn-viewer.lisp index 629b521..7aa0a8f 100644 --- a/src/osn-viewer.lisp +++ b/src/osn-viewer.lisp @@ -103,6 +103,9 @@ ((:menu (("OSN File" :callback 'application-interface-new-osn + :callback-type :interface) + ("XOSC File" + :callback 'application-interface-new-xosc :callback-type :interface)) :title "New") ("Open ..." @@ -184,15 +187,8 @@ (defmethod export-osn-to-xosc ((viewer osn-viewer)) (let ((osn (first (capi:graph-pane-roots (slot-value viewer 'osn-graph-pane))))) (when osn - (multiple-value-bind (pathname ok) - (capi:prompt-for-file "Export OSN To XOSC" - :operation :save - :filters '("XOSC Files" "*.XOSC") - :filter "*.XOSC") - (when ok - (capi:with-busy-interface (viewer) - (with-open-file (stream pathname #+(or) (ensure-pathname-type pathname "xosc") - :external-format :utf-8 - :element-type :default - :direction :output :if-exists :supersede) - (osn-os10:write-os10-stream osn stream)))))))) + (application-interface-new-xosc + viewer + :content + (with-output-to-string (stream) + (osn-os10:write-os10-stream osn stream)))))) diff --git a/src/win-ui.lisp b/src/win-ui.lisp index 2ba04e8..10c5ff3 100644 --- a/src/win-ui.lisp +++ b/src/win-ui.lisp @@ -19,6 +19,9 @@ ((:menu (("OSN File" :callback 'application-interface-new-osn + :callback-type :interface) + ("XOSC File" + :callback 'application-interface-new-xosc :callback-type :interface)) :title "New") ("Open ..." @@ -155,6 +158,13 @@ (make-instance 'osn-viewer :source (pathname pathname) :osn-buffer osn)) #'editor:find-file-buffer)) + ((string-equal (pathname-type pathname) "xosc") + (values "OpenScenario 1.0" + (lambda (xosc warnings pathname) + (declare (ignore warnings)) + (make-instance 'xosc-viewer :source (pathname pathname) + :xosc-buffer xosc)) + #'editor:find-file-buffer)) (t nil))) @@ -167,7 +177,8 @@ :operation :open :if-does-not-exist :error :filters '("OSN Files" "*.osn" - "Known Files" "*.osn" + "XOSC Files" "*.xosc" + "Known Files" "*.osn;*.xosc" "All Files" "*.*") :filter "*.osn" :ok-check 'probe-file diff --git a/src/xosc-viewer.lisp b/src/xosc-viewer.lisp new file mode 100644 index 0000000..fb1bd11 --- /dev/null +++ b/src/xosc-viewer.lisp @@ -0,0 +1,169 @@ +;;;; OpenScenarioNext --- OpenScenario Language Design +;;;; This is copyrighted software. See documentation for terms. +;;;; +;;;; xosc-viewer.lisp --- Generic XOSC Viewer User Interface + +(cl:in-package #:openscenarionext-bench) + +;;;; %File Description: +;;;; +;;;; XOSC Viewer/Editor +;;;; + +(defun application-interface-new-xosc (interface &key content) + (capi:display + (make-instance 'xosc-viewer + :source nil + :xosc-buffer + (editor:make-buffer "Unknown" :temporary t + :contents content)) + :screen + (derive-main-interface-screen interface))) + +;;; +;;; XOSC Viewer +;;; + +(defun xosc-maybe-parse-buffer (buffer) + nil) + +(capi:define-interface xosc-viewer (document-interface) + ((document-kind :initform "XOSC Viewer") + (document-icon :initform "FMIBenchFMD.ico") + (xosc-buffer :initarg :xosc-buffer :initform nil + :accessor xosc-viewer-xosc-buffer)) + (:panes + (xosc-editor-pane + capi:editor-pane + :echo-area t + :change-callback + (lambda (pane point old-len new-len) + (declare (ignore point old-len new-len)) + (setf (capi:graph-pane-roots xosc-graph-pane) + (xosc-maybe-parse-buffer + (capi:editor-pane-buffer pane)))) + :buffer xosc-buffer) + (xosc-graph-pane + capi:graph-pane + :roots (xosc-maybe-parse-buffer xosc-buffer) + :print-function + (lambda (object) + (typecase object + (t (princ-to-string object)))) + :children-function + (lambda (root) + (typecase root + (t nil))))) + (:layouts + (xosc-editor-layout + capi:column-layout + '(xosc-editor-pane)) + (xosc-graph-layout + capi:column-layout + '(xosc-graph-pane)) + (switchable-layout + capi:switchable-layout + '(xosc-editor-layout xosc-graph-layout)) + (tab-layout + capi:tab-layout + '(switchable-layout) + :items (list + '("Editor" . xosc-editor-layout) + '("Graph" . xosc-graph-layout)) + :print-function #'car + :callback-type :interface-data + :selection-callback + (lambda (interface item) + (let ((view (slot-value interface (cdr item)))) + (setf (capi:switchable-layout-visible-child switchable-layout) view)))) + (main-layout + capi:column-layout + '(tab-layout))) + (:menus + (file-menu + "File" + ((:component + ((:menu + (("OSN File" + :callback 'application-interface-new-osn + :callback-type :interface) + ("XOSC File" + :callback 'application-interface-new-xosc + :callback-type :interface)) + :title "New") + ("Open ..." + :accelerator "accelerator-o" + :callback 'application-interface-open + :callback-type :interface) + ("Close" + :accelerator "accelerator-w" + :callback 'capi:quit-interface + :callback-type :interface))) + (:component + (("Save" + :callback 'document-interface-save + :callback-type :interface + :enabled-function 'document-interface-save-p) + ("Save As ..." + :callback 'document-interface-save-as + :callback-type :interface))) + (:component + (("Refresh From File" + :callback 'document-interface-refresh + :callback-type :interface + :enabled-function #'document-interface-source))) + (:component + (("Quit OSN Bench" + :accelerator "accelerator-q" + :callback 'quit-osn-bench + :callback-type :interface))))) + #+(or) + (xosc-menu + "XOSC" + ( + #+(or) + (:component + (("Export Import Warnings to CSV ..." + :callback 'export-viewer-warnings-to-csv + :callback-type :interface + :enabled-function 'viewer-warnings))) + (:component + (("Export to XOSC ..." + :callback 'export-osn-to-xosc + :callback-type :interface + :enabled-function + (lambda (x) + (declare (ignore x)) + (capi:graph-pane-roots osn-graph-pane)))))))) + (:menu-bar file-menu #+(or) xosc-menu) + (:default-initargs + :layout 'main-layout + :best-width 900 + :best-height 600)) + +(defmethod document-interface-title-details ((interface xosc-viewer)) + "") + +(defmethod document-interface-save-as-dialog ((interface xosc-viewer)) + (capi:prompt-for-file "XOSC File" + :pathname (document-interface-source interface) + :operation :save + :if-exists :prompt + :if-does-not-exist :ok + :filters '("XOSC Files" "*.xosc" + "All Files" "*.*") + :filter "*.xosc" + :owner interface) + "osn") + +(defmethod document-interface-save-internal ((interface xosc-viewer) pathname) + #+(or) + (csv-io:write-csv-file (csv-viewer-csv interface) pathname)) + +(defmethod document-interface-refresh-reader ((interface xosc-viewer) pathname) + #+(or) + (csv-io:read-csv-file pathname)) + +(defmethod document-interface-refresh-internal ((interface xosc-viewer) entity warnings) + (declare (ignore warnings)) + (untouch-document-interface interface))