DML editor samples

This commit is contained in:
Vadim Lopatin 2015-04-02 15:42:44 +03:00
parent bd56d0084b
commit c895b3f03a
7 changed files with 117 additions and 33 deletions

View File

@ -0,0 +1,11 @@
VerticalLayout {
TextWidget { text: "TableLayout example" }
TableLayout {
padding: 10
colCount: 2
TextWidget { text: "Param 1 name" }
EditLine { id: edit1; text: "Edit text for param 1" }
TextWidget { text: "Param 2 name" }
EditLine { id: edit2; text: "Text for param 2" }
}
}

View File

@ -53,7 +53,11 @@ class DMLSourceEdit : SourceEdit {
setTokenHightlightColor(TokenCategory.Comment, 0x008000); // green setTokenHightlightColor(TokenCategory.Comment, 0x008000); // green
setTokenHightlightColor(TokenCategory.Keyword, 0x0000FF); // blue setTokenHightlightColor(TokenCategory.Keyword, 0x0000FF); // blue
setTokenHightlightColor(TokenCategory.String, 0xa31515); // brown setTokenHightlightColor(TokenCategory.String, 0xa31515); // brown
setTokenHightlightColor(TokenCategory.Integer, 0xa315C0); //
setTokenHightlightColor(TokenCategory.Float, 0xa315C0); //
setTokenHightlightColor(TokenCategory.Error, 0xFF0000); // red setTokenHightlightColor(TokenCategory.Error, 0xFF0000); // red
setTokenHightlightColor(TokenCategory.Op, 0x503000);
setTokenHightlightColor(TokenCategory.Identifier_Class, 0x000080); // blue
} }
this() { this() {
@ -61,6 +65,32 @@ class DMLSourceEdit : SourceEdit {
} }
} }
immutable dstring SAMPLE_SOURCE_CODE =
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" }
}
}
};
class EditFrame : AppFrame { class EditFrame : AppFrame {
@ -106,8 +136,14 @@ class EditFrame : AppFrame {
string _filename; string _filename;
void openSourceFile(string filename) { void openSourceFile(string filename) {
import std.file;
// TODO // TODO
_filename = filename; if (exists(filename)) {
_filename = filename;
window.windowCaption = toUTF32(filename);
_editor.load(filename);
updatePreview();
}
} }
bool onCanClose() { bool onCanClose() {
@ -167,11 +203,17 @@ class EditFrame : AppFrame {
Widget w = parseML(source); Widget w = parseML(source);
if (statusLine) if (statusLine)
statusLine.setStatusText("No errors"d); statusLine.setStatusText("No errors"d);
if (_fillHorizontal)
w.layoutWidth = FILL_PARENT;
if (_fillVertical)
w.layoutHeight = FILL_PARENT;
if (_highlightBackground)
w.backgroundColor = 0xC0C0C0C0;
_preview.contentWidget = w; _preview.contentWidget = w;
} catch (ParserException e) { } catch (ParserException e) {
if (statusLine) if (statusLine)
statusLine.setStatusText(toUTF32("ERROR: " ~ e.msg)); statusLine.setStatusText(toUTF32("ERROR: " ~ e.msg));
_editor.setCaretPos(e.line + 1, e.pos); _editor.setCaretPos(e.line, e.pos);
string msg = "\n" ~ e.msg ~ "\n"; string msg = "\n" ~ e.msg ~ "\n";
msg = replaceFirst(msg, " near `", "\nnear `"); msg = replaceFirst(msg, " near `", "\nnear `");
TextWidget w = new MultilineTextWidget(null, toUTF32(msg)); TextWidget w = new MultilineTextWidget(null, toUTF32(msg));
@ -183,6 +225,9 @@ class EditFrame : AppFrame {
} }
} }
protected bool _fillHorizontal;
protected bool _fillVertical;
protected bool _highlightBackground;
protected DMLSourceEdit _editor; protected DMLSourceEdit _editor;
protected ScrollWidget _preview; protected ScrollWidget _preview;
/// create app body widget /// create app body widget
@ -195,36 +240,40 @@ class EditFrame : AppFrame {
hlayout.layoutHeight = FILL_PARENT; hlayout.layoutHeight = FILL_PARENT;
_editor = new DMLSourceEdit(); _editor = new DMLSourceEdit();
hlayout.addChild(_editor); hlayout.addChild(_editor);
_editor.text = q{ _editor.text = SAMPLE_SOURCE_CODE;
VerticalLayout { VerticalLayout previewLayout = new VerticalLayout();
id: vlayout previewLayout.layoutWidth = makePercentSize(50);
margins: Rect { left: 5; right: 3; top: 2; bottom: 4 } previewLayout.layoutHeight = FILL_PARENT;
padding: Rect { 5, 4, 3, 2 } // same as Rect { left: 5; top: 4; right: 3; bottom: 2 } auto previewControls = new HorizontalLayout();
TextWidget { auto cbFillHorizontal = new CheckBox(null, "Fill Horizontal"d);
/* this widget can be accessed via id myLabel1 auto cbFillVertical = new CheckBox(null, "Fill Vertical"d);
e.g. w.childById!TextWidget("myLabel1") auto cbHighlightBackground = new CheckBox(null, "Background"d);
*/ cbFillHorizontal.onCheckChangeListener = delegate(Widget source, bool checked) {
id: myLabel1 _fillHorizontal = checked;
text: "Some text"; padding: 5 updatePreview();
enabled: false return true;
}
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" }
}
}
}; };
cbFillVertical.onCheckChangeListener = delegate(Widget source, bool checked) {
_fillVertical = checked;
updatePreview();
return true;
};
cbHighlightBackground.onCheckChangeListener = delegate(Widget source, bool checked) {
_highlightBackground = checked;
updatePreview();
return true;
};
previewControls.addChild(cbFillHorizontal);
previewControls.addChild(cbFillVertical);
previewControls.addChild(cbHighlightBackground);
_preview = new ScrollWidget(); _preview = new ScrollWidget();
_preview.layoutWidth = makePercentSize(50); _preview.layoutWidth = FILL_PARENT;
_preview.layoutHeight = FILL_PARENT; _preview.layoutHeight = FILL_PARENT;
_preview.backgroundImageId = "tx_fabric.tiled"; _preview.backgroundImageId = "tx_fabric.tiled";
hlayout.addChild(_preview); previewLayout.addChild(previewControls);
previewLayout.addChild(_preview);
hlayout.addChild(previewLayout);
bodyWidget.addChild(hlayout); bodyWidget.addChild(hlayout);
return bodyWidget; return bodyWidget;
} }
@ -237,6 +286,10 @@ extern (C) int UIAppMain(string[] args) {
// embed non-standard resources listed in views/resources.list into executable // embed non-standard resources listed in views/resources.list into executable
embeddedResourceList.addResources(embedResourcesFromList!("resources.list")()); embeddedResourceList.addResources(embedResourcesFromList!("resources.list")());
/// set font gamma (1.0 is neutral, < 1.0 makes glyphs lighter, >1.0 makes glyphs bolder)
FontManager.fontGamma = 0.8;
FontManager.hintingMode = HintingMode.Normal;
// create window // create window
Window window = Platform.instance.createWindow("DlangUI ML editor"d, null, WindowFlag.Resizable, 700, 470); Window window = Platform.instance.createWindow("DlangUI ML editor"d, null, WindowFlag.Resizable, 700, 470);

View File

@ -5,6 +5,7 @@ import dlangui.core.editable;
import dlangui.core.linestream; import dlangui.core.linestream;
import dlangui.core.textsource; import dlangui.core.textsource;
import dlangui.core.logger; import dlangui.core.logger;
import dlangui.widgets.metadata;
class DMLSyntaxSupport : SyntaxSupport { class DMLSyntaxSupport : SyntaxSupport {
@ -546,7 +547,10 @@ class DMLSyntaxSupport : SyntaxSupport {
category = TokenCategory.Comment; category = TokenCategory.Comment;
break; break;
case TokenType.ident: case TokenType.ident:
category = TokenCategory.Identifier; if (isWidgetClassName(token.token.text))
category = TokenCategory.Identifier_Class;
else
category = TokenCategory.Identifier;
break; break;
case TokenType.str: case TokenType.str:
category = TokenCategory.String; category = TokenCategory.String;

View File

@ -525,8 +525,15 @@ class AbstractSlider : WidgetGroup {
} }
/// returns slider range min value /// returns slider range min value
@property int minValue() const { return _minValue; } @property int minValue() const { return _minValue; }
/// sets slider range min value
@property AbstractSlider minValue(int v) { _minValue = v; return this; }
/// returns slider range max value /// returns slider range max value
@property int maxValue() const { return _maxValue; } @property int maxValue() const { return _maxValue; }
/// sets slider range max value
@property AbstractSlider maxValue(int v) { _maxValue = v; return this; }
/// page size (visible area size) /// page size (visible area size)
@property int pageSize() const { return _pageSize; } @property int pageSize() const { return _pageSize; }
/// set page size (visible area size) /// set page size (visible area size)

View File

@ -655,6 +655,10 @@ class TableLayout : WidgetGroupDefaultDrawing {
super(ID); super(ID);
} }
this() {
this(null);
}
protected static struct TableLayoutCell { protected static struct TableLayoutCell {
int col; int col;
int row; int row;

View File

@ -50,3 +50,8 @@ string registerWidgets(T...)() {
} }
return classDefs ~ "\n__gshared static this() {\n" ~ registerDefs ~ "}"; return classDefs ~ "\n__gshared static this() {\n" ~ registerDefs ~ "}";
} }
/// returns true if passed name is identifier of registered widget class
bool isWidgetClassName(string name) {
return (name in _registeredWidgets) !is null;
}

View File

@ -1734,12 +1734,12 @@ string generatePropertySetters(string[] propNames...) {
/// use in mixin for method override to set this object properties with names from parameter list with value of variable value if variable name matches propName /// use in mixin for method override to set this object properties with names from parameter list with value of variable value if variable name matches propName
string generatePropertySettersMethodOverride(string methodName, string typeName, string[] propNames...) { string generatePropertySettersMethodOverride(string methodName, string typeName, string[] propNames...) {
return " override bool " ~ methodName ~ "(string name, " ~ typeName ~ " value) {\n" ~ string res = " override bool " ~ methodName ~ "(string name, " ~ typeName ~ " value) {\n" ~
" return super." ~ methodName ~ "(name, value);\n" ~ " import std.algorithm : equal;\n";
" }\n";
string res;
foreach(propName; propNames) foreach(propName; propNames)
res ~= generatePropertySetter(propName); res ~= generatePropertySetter(propName);
res ~= " return super." ~ methodName ~ "(name, value);\n" ~
" }\n";
return res; return res;
} }