aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2024-01-28 23:46:18 -0500
committerbobzel <zzzman@gmail.com>2024-01-28 23:46:18 -0500
commit1a32884f5084d9c39190e44bd9331e94590322e5 (patch)
treecb01f5028d696664cbae66567bfe9fb550f423ff /src
parentb8288a83669f1c6690082a18c7f4d14a76e31586 (diff)
fixed inking when in panToScroll mode. fixed text templates to restore default text when all text is deleted. changed code blocks to stay in code black mode after a carriage return (unless its a hard break, e.g. shift+carriage return). added a ^@paint input rule to turn text documents into paint func docs.
Diffstat (limited to 'src')
-rw-r--r--src/client/views/collections/collectionFreeForm/MarqueeView.tsx2
-rw-r--r--src/client/views/nodes/formattedText/FormattedTextBox.tsx2
-rw-r--r--src/client/views/nodes/formattedText/ProsemirrorExampleTransfer.ts2
-rw-r--r--src/client/views/nodes/formattedText/RichTextRules.ts19
-rw-r--r--src/fields/Doc.ts2
5 files changed, 24 insertions, 3 deletions
diff --git a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
index a9910c2a8..a417d777a 100644
--- a/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
+++ b/src/client/views/collections/collectionFreeForm/MarqueeView.tsx
@@ -219,7 +219,7 @@ export class MarqueeView extends ObservableReactComponent<SubCollectionViewProps
const scrollMode = e.altKey ? (Doc.UserDoc().freeformScrollMode === freeformScrollMode.Pan ? freeformScrollMode.Zoom : freeformScrollMode.Pan) : Doc.UserDoc().freeformScrollMode;
// allow marquee if right drag/meta drag, or pan mode
- if (e.button === 2 || e.metaKey || (this._props.isContentActive() && scrollMode === freeformScrollMode.Pan)) {
+ if (e.button === 2 || e.metaKey || (this._props.isContentActive() && scrollMode === freeformScrollMode.Pan && Doc.ActiveTool === InkTool.None)) {
this.setPreviewCursor(e.clientX, e.clientY, true, false, this._props.Document);
e.preventDefault();
} else PreviewCursor.Instance.Visible = false;
diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
index 6f9c2893e..0b857794b 100644
--- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx
+++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx
@@ -368,7 +368,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<FieldViewProps
this._applyingChange = this.fieldKey;
const textChange = newText !== prevData?.Text;
textChange && (dataDoc[this.fieldKey + '_modificationDate'] = new DateField(new Date(Date.now())));
- if ((!prevData && !protoData) || newText || (!newText && !templateData)) {
+ if ((!prevData && !protoData) || newText || (!newText && !protoData)) {
// if no template, or there's text that didn't come from the layout template, write it to the document. (if this is driven by a template, then this overwrites the template text which is intended)
if (force || ((this._finishingLink || this._props.isContentActive() || this._inDrop) && removeSelection(newJson) !== removeSelection(prevData?.Data))) {
const numstring = NumCast(dataDoc[this.fieldKey], null);
diff --git a/src/client/views/nodes/formattedText/ProsemirrorExampleTransfer.ts b/src/client/views/nodes/formattedText/ProsemirrorExampleTransfer.ts
index 08bad2d57..47527847b 100644
--- a/src/client/views/nodes/formattedText/ProsemirrorExampleTransfer.ts
+++ b/src/client/views/nodes/formattedText/ProsemirrorExampleTransfer.ts
@@ -303,7 +303,7 @@ export function buildKeymap<S extends Schema<any>>(schema: S, props: any, mapKey
const marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());
const cr = state.selection.$from.node().textContent.endsWith('\n');
- if (cr || !newlineInCode(state, dispatch as any)) {
+ if (/*cr ||*/ !newlineInCode(state, dispatch as any)) {
if (
!splitListItem(schema.nodes.list_item)(state as any, (tx2: Transaction) => {
const tx3 = updateBullets(tx2, schema);
diff --git a/src/client/views/nodes/formattedText/RichTextRules.ts b/src/client/views/nodes/formattedText/RichTextRules.ts
index 456ed4732..be32a2c4a 100644
--- a/src/client/views/nodes/formattedText/RichTextRules.ts
+++ b/src/client/views/nodes/formattedText/RichTextRules.ts
@@ -13,6 +13,8 @@ import { FormattedTextBox } from './FormattedTextBox';
import { wrappingInputRule } from './prosemirrorPatches';
import { RichTextMenu } from './RichTextMenu';
import { schema } from './schema_rts';
+import { CollectionView } from '../../collections/CollectionView';
+import { CollectionViewType } from '../../../documents/DocumentTypes';
export class RichTextRules {
public Document: Doc;
@@ -68,6 +70,23 @@ export class RichTextRules {
// ``` create code block
textblockTypeInputRule(/^```$/, schema.nodes.code_block),
+ new InputRule(new RegExp(/^\^@paint/), (state, match, start, end) => {
+ const { dataDoc, layoutDoc, fieldKey } = this.TextBox;
+ layoutDoc.type_collection = CollectionViewType.Freeform;
+ dataDoc.layout_painted = CollectionView.LayoutString('painted');
+ const layoutFieldKey = layoutDoc.layout_fieldKey;
+ layoutDoc.layout_fieldKey = 'layout_painted';
+ this.TextBox.DocumentView?.().setToggleDetail();
+ layoutDoc.layout_fieldKey = layoutFieldKey;
+ dataDoc.paintFunc = ComputedField.MakeFunction(`toJavascriptString(this['${fieldKey}']?.Text)`);
+ const comment = '/* this is now a paint func */';
+ const tr = state.tr
+ .deleteRange(start, end)
+ .insertText(comment)
+ .insert(start + comment.length, schema.nodes.code_block.create());
+ return tr.setSelection(new TextSelection(tr.doc.resolve(start + comment.length + 2)));
+ }),
+
// %<font-size> set the font size
new InputRule(new RegExp(/%([0-9]+)\s$/), (state, match, start, end) => {
const size = Number(match[1]);
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index f4141cf46..67f09f37b 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -63,6 +63,8 @@ export namespace Field {
default: rawjava = field?.[ToJavascriptString]?.() ?? 'null';
} // prettier-ignore
var script = rawjava;
+ // this is a bit hacky, but we treat '^@' references to a published document
+ // as a kind of macro to include the content of those documents
Doc.MyPublishedDocs.forEach(doc => {
const regex = new RegExp(`^\\^${doc.title}\\s`, 'm');
script = script.replace(regex, Cast(doc.text, RichTextField, null)?.Text ?? '');