mirror of https://github.com/buggins/dlangui.git
Example showcasing and editline list.
This commit is contained in:
parent
089f22158e
commit
1ea520aa28
|
@ -0,0 +1,6 @@
|
|||
.dub
|
||||
docs.json
|
||||
__dummy.html
|
||||
*.o
|
||||
*.obj
|
||||
__test__*__
|
|
@ -0,0 +1,51 @@
|
|||
{
|
||||
"name": "editlinelist",
|
||||
"authors": [
|
||||
"http://lemming.life"
|
||||
],
|
||||
"description": "example of an edit line list in dlangui",
|
||||
"license": "Boost",
|
||||
|
||||
"targetPath": "bin",
|
||||
"targetType": "executable",
|
||||
"targetName": "editlinelist",
|
||||
|
||||
"stringImportPaths": ["views", "views/res", "views/res/i18n", "views/res/mdpi"],
|
||||
|
||||
"sourceFiles-windows": ["$PACKAGE_DIR/src/win_app.def"],
|
||||
|
||||
"versions": ["ForceLogs"],
|
||||
|
||||
"dependencies": {
|
||||
"dlangui": {"path": "../../"}
|
||||
},
|
||||
"configurations" : [
|
||||
{
|
||||
"name" : "default",
|
||||
},
|
||||
{
|
||||
"name" : "console",
|
||||
"subConfigurations" : {
|
||||
"dlangui" : "console"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name" : "sdl",
|
||||
"subConfigurations" : {
|
||||
"dlangui" : "sdl"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name" : "x11",
|
||||
"subConfigurations" : {
|
||||
"dlangui" : "x11"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name" : "minimal",
|
||||
"subConfigurations" : {
|
||||
"dlangui" : "minimal"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,154 @@
|
|||
module app;
|
||||
import dlangui;
|
||||
|
||||
mixin APP_ENTRY_POINT;
|
||||
|
||||
/// Entry point for dlangui based application
|
||||
extern (C) int UIAppMain(string[] args) {
|
||||
auto view = new View("EditLine List Example");
|
||||
return Platform.instance.enterMessageLoop();
|
||||
}
|
||||
|
||||
// Our View example
|
||||
class View {
|
||||
this(dstring aTitle) {
|
||||
// Prep the window
|
||||
auto window = Platform.instance.createWindow(aTitle, null, WindowFlag.Resizable, 640, 480);
|
||||
window.mainWidget = parseML(q{
|
||||
VerticalLayout {
|
||||
margins: 5pt;
|
||||
layoutWidth: fill
|
||||
layoutHeight: fill
|
||||
}
|
||||
});
|
||||
|
||||
// Prep the adapter and list
|
||||
auto listAdapter = new WidgetListAdapterKeysMouse();
|
||||
auto editLineList = new EditLineList();
|
||||
editLineList.layoutWidth(FILL_PARENT);
|
||||
editLineList.layoutHeight(FILL_PARENT);
|
||||
editLineList.ownAdapter = listAdapter;
|
||||
window.mainWidget.addChild(editLineList);
|
||||
|
||||
// Add some EditLineForList objects
|
||||
import std.conv : to;
|
||||
listAdapter.add(new EditLineForList("editLine2", "Double click me! You can select a word."d));
|
||||
listAdapter.add(new EditLineForList("editLine1", "Use left/right keys to move cursor left/right of selection."d));
|
||||
listAdapter.add(new EditLineForList("editLine0", "Use up/down keys to move to the next edit line."d));
|
||||
listAdapter.add(new EditLineForList("editLine3", "You can also do select all via keys, and do other edit line features."d));
|
||||
listAdapter.add(new EditLineForList("editLine3", "The edit line list could be used to edit data rapidly."d));
|
||||
for (int i=4; i<64; ++i) {
|
||||
listAdapter.add(new EditLineForList("editLine" ~ to!string(i), "editLine "d ~ to!dstring(i)));
|
||||
}
|
||||
|
||||
// Event handling example
|
||||
editLineList.itemSelected = delegate(Widget source, int itemIndex) {
|
||||
auto item = cast(EditLineForList) listAdapter.itemWidget(itemIndex);
|
||||
window.windowCaption = aTitle ~ " | Selected: "d ~ item.idAsDstring;
|
||||
return true;
|
||||
};
|
||||
|
||||
window.show;
|
||||
} // End this(dstring aTitle)
|
||||
|
||||
} // End class View
|
||||
|
||||
// BEGIN EditLineList, adapter, and EditLineForList
|
||||
// -------------------------------------------------------------------------
|
||||
class EditLineList : ListWidget {
|
||||
override bool onKeyEvent(KeyEvent event) {
|
||||
if (itemCount == 0 || _selectedItemIndex < 0) return false;
|
||||
|
||||
int navigationDelta = 0;
|
||||
if (event.action == KeyAction.KeyDown) {
|
||||
if (orientation == Orientation.Vertical) {
|
||||
if (event.keyCode == KeyCode.DOWN)
|
||||
navigationDelta = 1;
|
||||
else if (event.keyCode == KeyCode.UP)
|
||||
navigationDelta = -1;
|
||||
}
|
||||
}
|
||||
|
||||
auto item = cast(EditLineForList) _adapter.itemWidget(_selectedItemIndex);
|
||||
|
||||
if (navigationDelta != 0) {
|
||||
moveSelection(navigationDelta);
|
||||
item = cast(EditLineForList) _adapter.itemWidget(_selectedItemIndex); // because the item changed
|
||||
item.allAndFocus(); // Do a select all on the EditLine
|
||||
return true;
|
||||
}
|
||||
|
||||
if (item.onKeyEvent(event)) {
|
||||
invalidate();
|
||||
return true;
|
||||
}
|
||||
|
||||
return super.onKeyEvent(event);
|
||||
} // End onKeyEvent(KeyEvent event)
|
||||
|
||||
|
||||
// Modify the behavior of the mouse on the list slightly.
|
||||
override bool onMouseEvent(MouseEvent event) {
|
||||
super.onMouseEvent(event);
|
||||
if (_selectedItemIndex == -1) { return false; }
|
||||
_adapter.itemWidget(_selectedItemIndex).onMouseEvent(event);
|
||||
return true;
|
||||
}
|
||||
|
||||
} // End EditLineList
|
||||
|
||||
// Adapter that can use keys and mouse events.
|
||||
class WidgetListAdapterKeysMouse : WidgetListAdapter {
|
||||
override @property bool wantKeyEvents() { return true; }
|
||||
override @property bool wantMouseEvents() { return true; }
|
||||
}
|
||||
|
||||
// EditLine with slight modifications for list environment.
|
||||
class EditLineForList : EditLine {
|
||||
|
||||
this(string id, dstring text = null) {
|
||||
this.id = id;
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
void allAndFocus() {
|
||||
bool focused = true;
|
||||
bool receivedFocusFromKeyboard = true;
|
||||
handleFocusChange(focused, receivedFocusFromKeyboard);
|
||||
}
|
||||
|
||||
override bool onKeyEvent(KeyEvent event) {
|
||||
import std.stdio : writeln;
|
||||
bool focused = true;
|
||||
bool receivedFocusFromKeyboard = false;
|
||||
handleFocusChange(focused, receivedFocusFromKeyboard);
|
||||
|
||||
// Move the cursor to the left or right of selection.
|
||||
if (_selectionRange.end.pos - _selectionRange.start.pos > 0) {
|
||||
if (event.keyCode == KeyCode.LEFT) {
|
||||
_caretPos.pos = _selectionRange.start.pos;
|
||||
_selectionRange.start.pos = _caretPos.pos;
|
||||
_selectionRange.end.pos = _caretPos.pos;
|
||||
ensureCaretVisible();
|
||||
return true;
|
||||
} else if (event.keyCode == KeyCode.RIGHT) {
|
||||
_caretPos.pos = _selectionRange.end.pos;
|
||||
_selectionRange.start.pos = _caretPos.pos;
|
||||
_selectionRange.end.pos = _caretPos.pos;
|
||||
ensureCaretVisible();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
super.onKeyEvent(event);
|
||||
return true;
|
||||
} // End onKeyEvent(KeyEvent event)
|
||||
|
||||
|
||||
dstring idAsDstring() {
|
||||
import std.conv : to;
|
||||
return to!dstring(id);
|
||||
}
|
||||
} // End EditLineForList
|
||||
|
||||
// END EditLineList, adapter, and EditLineForList
|
Loading…
Reference in New Issue