From 5b67dbde81f5ea5d43dc9860092a8306213021a8 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Thu, 2 Apr 2015 11:53:28 +0300 Subject: [PATCH] DML editor sample --- examples/dmledit/src/dmledit.d | 124 ++++++++++++++++-- examples/dmledit/views/res/i18n/en.ini | 3 + examples/dmledit/views/res/mdpi/debug-run.png | Bin 0 -> 383 bytes examples/dmledit/views/res/mdpi/text-dml.png | Bin 0 -> 684 bytes examples/dmledit/views/res/mdpi/tx_fabric.jpg | Bin 0 -> 9061 bytes examples/dmledit/views/resources.list | 3 + src/dlangui/core/parser.d | 12 +- src/dlangui/widgets/editors.d | 13 ++ src/dlangui/widgets/widget.d | 4 +- 9 files changed, 141 insertions(+), 18 deletions(-) create mode 100644 examples/dmledit/views/res/mdpi/debug-run.png create mode 100644 examples/dmledit/views/res/mdpi/text-dml.png create mode 100644 examples/dmledit/views/res/mdpi/tx_fabric.jpg diff --git a/examples/dmledit/src/dmledit.d b/examples/dmledit/src/dmledit.d index bb52f93e..7165385b 100644 --- a/examples/dmledit/src/dmledit.d +++ b/examples/dmledit/src/dmledit.d @@ -1,6 +1,8 @@ module dmledit; import dlangui; +import dlangui.dialogs.filedlg; +import dlangui.dialogs.dialog; mixin APP_ENTRY_POINT; @@ -15,6 +17,8 @@ enum IDEActions : int { FileClose, FileExit, EditPreferences, + DebugStart, + HelpAbout, } // actions @@ -33,6 +37,8 @@ const Action ACTION_EDIT_UNINDENT = (new Action(EditorActions.Unindent, "MENU_ED const Action ACTION_EDIT_TOGGLE_LINE_COMMENT = (new Action(EditorActions.ToggleLineComment, "MENU_EDIT_TOGGLE_LINE_COMMENT"c, null, KeyCode.KEY_DIVIDE, KeyFlag.Control)).disableByDefault(); const Action ACTION_EDIT_TOGGLE_BLOCK_COMMENT = (new Action(EditorActions.ToggleBlockComment, "MENU_EDIT_TOGGLE_BLOCK_COMMENT"c, null, KeyCode.KEY_DIVIDE, KeyFlag.Control|KeyFlag.Shift)).disableByDefault(); const Action ACTION_EDIT_PREFERENCES = (new Action(IDEActions.EditPreferences, "MENU_EDIT_PREFERENCES"c, null)).disableByDefault(); +const Action ACTION_DEBUG_START = new Action(IDEActions.DebugStart, "MENU_DEBUG_START_DEBUGGING"c, "debug-run"c, KeyCode.F5, 0); +const Action ACTION_HELP_ABOUT = new Action(IDEActions.HelpAbout, "MENU_HELP_ABOUT"c); class EditFrame : AppFrame { @@ -44,19 +50,18 @@ class EditFrame : AppFrame { } /// create main menu override protected MainMenu createMainMenu() { - return new MainMenu(new MenuItem()); mainMenuItems = new MenuItem(); MenuItem fileItem = new MenuItem(new Action(1, "MENU_FILE")); fileItem.add(ACTION_FILE_NEW, ACTION_FILE_OPEN, ACTION_FILE_EXIT); - + mainMenuItems.add(fileItem); MenuItem editItem = new MenuItem(new Action(2, "MENU_EDIT")); editItem.add(ACTION_EDIT_COPY, ACTION_EDIT_PASTE, ACTION_EDIT_CUT, ACTION_EDIT_UNDO, ACTION_EDIT_REDO, ACTION_EDIT_INDENT, ACTION_EDIT_UNINDENT, ACTION_EDIT_TOGGLE_LINE_COMMENT, ACTION_EDIT_TOGGLE_BLOCK_COMMENT); editItem.add(ACTION_EDIT_PREFERENCES); - + mainMenuItems.add(editItem); MainMenu mainMenu = new MainMenu(mainMenuItems); return mainMenu; } @@ -67,7 +72,7 @@ class EditFrame : AppFrame { ToolBarHost res = new ToolBarHost(); ToolBar tb; tb = res.getOrAddToolbar("Standard"); - tb.addButtons(ACTION_FILE_NEW, ACTION_FILE_OPEN, ACTION_FILE_SAVE); + tb.addButtons(ACTION_FILE_NEW, ACTION_FILE_OPEN, ACTION_FILE_SAVE, ACTION_SEPARATOR, ACTION_DEBUG_START); tb = res.getOrAddToolbar("Edit"); tb.addButtons(ACTION_EDIT_COPY, ACTION_EDIT_PASTE, ACTION_EDIT_CUT, ACTION_SEPARATOR, @@ -75,20 +80,117 @@ class EditFrame : AppFrame { return res; } + string _filename; + void openSourceFile(string filename) { + // TODO + _filename = filename; + } + + bool onCanClose() { + // todo + return true; + } + + FileDialog createFileDialog(UIString caption) { + FileDialog dlg = new FileDialog(caption, window, null); + dlg.filetypeIcons[".d"] = "text-dml"; + return dlg; + } + + /// override to handle specific actions + override bool handleAction(const Action a) { + if (a) { + switch (a.id) { + case IDEActions.FileExit: + if (onCanClose()) + window.close(); + return true; + case IDEActions.HelpAbout: + window.showMessageBox(UIString("About DlangUI ML Editor"d), + UIString("DLangIDE\n(C) Vadim Lopatin, 2015\nhttp://github.com/buggins/dlangui\nSimple editor for DML code"d)); + return true; + case IDEActions.FileOpen: + UIString caption; + caption = "Open DML File"d; + FileDialog dlg = createFileDialog(caption); + dlg.addFilter(FileFilterEntry(UIString("DML files"d), "*.dml")); + dlg.addFilter(FileFilterEntry(UIString("All files"d), "*.*")); + dlg.onDialogResult = delegate(Dialog dlg, const Action result) { + if (result.id == ACTION_OPEN.id) { + string filename = result.stringParam; + openSourceFile(filename); + } + }; + dlg.show(); + return true; + case IDEActions.DebugStart: + updatePreview(); + return true; + case IDEActions.EditPreferences: + //showPreferences(); + return true; + default: + return super.handleAction(a); + } + } + return false; + } + + void updatePreview() { + dstring dsource = _editor.text; + string source = toUTF8(dsource); + try { + Widget w = parseML(source); + statusLine.setStatusText("No errors"d); + _preview.contentWidget = w; + } catch (ParserException e) { + statusLine.setStatusText(toUTF32("ERROR: " ~ e.msg)); + _editor.setCaretPos(e.line, e.pos); + } + } + + protected SourceEdit _editor; + protected ScrollWidget _preview; /// create app body widget override protected Widget createBody() { VerticalLayout bodyWidget = new VerticalLayout(); bodyWidget.layoutWidth = FILL_PARENT; bodyWidget.layoutHeight = FILL_PARENT; HorizontalLayout hlayout = new HorizontalLayout(); - hlayout.layoutWidth = makePercentSize(50); + hlayout.layoutWidth = FILL_PARENT; hlayout.layoutHeight = FILL_PARENT; - SourceEdit editor = new SourceEdit(); - hlayout.addChild(editor); - ScrollWidget preview = new ScrollWidget(); - preview.layoutWidth = FILL_PARENT; - preview.layoutHeight = FILL_PARENT; - hlayout.addChild(preview); + _editor = new SourceEdit(); + hlayout.addChild(_editor); + _editor.text = q{ +VerticalLayout { + id: vlayout + margins: Rect { left: 5; right: 3; top: 2; bottom: 4 } + padding: Rect { 5, 4, 3, 2 } // same as Rect { left: 5; top: 4; right: 3; bottom: 2 } + TextWidget { + /* this widget can be accessed via id myLabel1 + e.g. w.childById!TextWidget("myLabel1") + */ + id: myLabel1 + text: "Some text"; padding: 5 + enabled: false + } + TextWidget { + id: myLabel2 + text: "More text"; margins: 5 + enabled: true + } + CheckBox{ id: cb1; text: "Some checkbox" } + HorizontalLayout { + RadioButton{ id: rb1; text: "Radio Button 1" } + RadioButton{ id: rb1; text: "Radio Button 2" } + } +} + }; + _preview = new ScrollWidget(); + _preview.layoutWidth = makePercentSize(50); + _preview.layoutHeight = FILL_PARENT; + _preview.backgroundImageId = "tx_fabric.tiled"; + hlayout.addChild(_preview); bodyWidget.addChild(hlayout); return bodyWidget; } diff --git a/examples/dmledit/views/res/i18n/en.ini b/examples/dmledit/views/res/i18n/en.ini index f71127d3..55e3afdc 100644 --- a/examples/dmledit/views/res/i18n/en.ini +++ b/examples/dmledit/views/res/i18n/en.ini @@ -1,5 +1,6 @@ EXIT=Exit MENU_FILE=&File +MENU_FILE_NEW=&New MENU_FILE_OPEN=&Open MENU_FILE_OPEN_RECENT=Open recent MENU_FILE_SAVE=&Save @@ -12,6 +13,8 @@ MENU_EDIT_UNDO=&Undo MENU_EDIT_REDO=&Redo MENU_EDIT_INDENT=Indent block MENU_EDIT_UNINDENT=Unindent block +MENU_EDIT_TOGGLE_LINE_COMMENT=Toggle line comment +MENU_EDIT_TOGGLE_BLOCK_COMMENT=Toggle block comment MENU_EDIT_PREFERENCES=&Preferences MENU_VIEW=&View MENU_VIEW_LANGUAGE=Interface &Language diff --git a/examples/dmledit/views/res/mdpi/debug-run.png b/examples/dmledit/views/res/mdpi/debug-run.png new file mode 100644 index 0000000000000000000000000000000000000000..eee3e90552fdba432ad7314fae36137beb627473 GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4w)f((Lt7nXJcMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`+Y`HK26z(qapPS42(RUE{-75)v%x-)b_i zJP_bLs}Te^XR8P+D_>+wl(?`(H~IMO`tQR3jQ^;gZ(x5fx9j>^y?OQT&Yla~!~@is z@Z;BO>BCoKg_Wnrz1`V-+WY_i|HpF~L^R&n?hjv;8GX#WCN4?ofzvsl)}m``_0HLU zPkUZf#M4lDGT~KUC!_cJZ*LsF3kho${{Q;jT(rbcEXky3bD^Qj4YzHP-fbbq1_lOy ze*d4J!F*4fh6@|#$R!6voIQM^JxQCHnb|qk*EElL zf#12!(|Bg~yi1XoVNs}5#w^nEBwWSvsm_FF7w&ob{4hv5-RslS6OpTGWiE87hliof XB6*U>^N95Ja!c2V$K&mu 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/dmledit/views/resources.list b/examples/dmledit/views/resources.list index d7e0641a..d8a1b540 100644 --- a/examples/dmledit/views/resources.list +++ b/examples/dmledit/views/resources.list @@ -1,6 +1,7 @@ res/i18n/en.ini res/i18n/ru.ini res/mdpi/cr3_logo.png +res/mdpi/debug-run.png res/mdpi/document-close.png res/mdpi/document-new.png res/mdpi/document-open-recent.png @@ -15,3 +16,5 @@ res/mdpi/edit-paste.png res/mdpi/edit-redo.png res/mdpi/edit-undo.png res/mdpi/edit-unindent.png +res/mdpi/text-dml.png +res/mdpi/tx_fabric.jpg diff --git a/src/dlangui/core/parser.d b/src/dlangui/core/parser.d index 3a81982b..5765ffa0 100644 --- a/src/dlangui/core/parser.d +++ b/src/dlangui/core/parser.d @@ -584,19 +584,21 @@ class MLParser { } protected void setStringProperty(string propName, string value) { - if (propName.equal("id")) { + if (propName.equal("id") || propName.equal("styleId") || propName.equal("backgroundImageId")) { if (!_currentWidget.setStringProperty(propName, value)) - error("cannot set id property for widget"); + error("cannot set " ~ propName ~ " property for widget"); return; } dstring v = toUTF32(value); - if (!_currentWidget.setDstringProperty(propName, v)) - error("unknown string property " ~ propName); + if (!_currentWidget.setDstringProperty(propName, v)) { + if (!_currentWidget.setStringProperty(propName, value)) + error("unknown string property " ~ propName); + } } protected void setIdentProperty(string propName, string value) { - if (propName.equal("id")) { + if (propName.equal("id") || propName.equal("styleId") || propName.equal("backgroundImageId")) { if (!_currentWidget.setStringProperty(propName, value)) error("cannot set id property for widget"); return; diff --git a/src/dlangui/widgets/editors.d b/src/dlangui/widgets/editors.d index 025aa163..c1527894 100644 --- a/src/dlangui/widgets/editors.d +++ b/src/dlangui/widgets/editors.d @@ -1475,7 +1475,20 @@ class EditWidgetBase : ScrollWidgetBase, EditableContentListener, MenuItemAction return super.onMouseEvent(event); } + /// returns caret position + @property TextPosition caretPos() { + return _caretPos; + } + /// change caret position and ensure it is visible + void setCaretPos(int line, int column, bool makeVisible = true) + { + _caretPos = TextPosition(line,column); + correctCaretPos(); + invalidate(); + if (makeVisible) + ensureCaretVisible(); + } } interface EditorActionHandler { diff --git a/src/dlangui/widgets/widget.d b/src/dlangui/widgets/widget.d index f2dab4cd..d508a76b 100644 --- a/src/dlangui/widgets/widget.d +++ b/src/dlangui/widgets/widget.d @@ -1228,7 +1228,7 @@ class Widget { else if (!isSpecialSize(lh)) dy = lh; if (isPercentSize(lw) && parentWidth != SIZE_UNSPECIFIED) - dy = fromPercentSize(lw, parentWidth); + dx = fromPercentSize(lw, parentWidth); else if (!isSpecialSize(lw)) dx = lw; // apply min/max width and height constraints @@ -1479,7 +1479,7 @@ class Widget { /// set string property value, for ML loaders bool setStringProperty(string name, string value) { - mixin(generatePropertySetters("id")); + mixin(generatePropertySetters("id", "styleId", "backgroundImageId")); if (name.equal("text")) { text = UIString(value); return true;