VOXEDIT: more lsystem dialog work

master
Martin Gerhardy 2016-11-16 20:35:33 +01:00
parent bc49b36214
commit d32e14a3fa
11 changed files with 212 additions and 44 deletions

View File

@ -0,0 +1,4 @@
TBLayout: axis: y, position: left, spacing: 0, size: available, position: left top
TBEditField: id: rule, text-align: left
TBTextField: id: character, text-align: left, state: disabled
TBButton: id: delete, skin: TBWindow.close

View File

@ -2,18 +2,52 @@ WindowInfo
title L-System
position 500 0
TBLayout: distribution: available, axis: y, gravity: all
TBLayout: axis: x, gravity: left right top, size: available
TBTextField: text: Axiom, gravity: left, size: gravity
lp: width: 100
TBWidget: gravity: left right, size: available
TBEditField: id: axiom, gravity: right, size: available
gravity: left right
TBLayout: axis: x, gravity: left right top, size: available
TBTextField: text: Generations, gravity: left
lp: width: 100
TBWidget: gravity: left
lp: width: 20
TBInlineSelect: id: generations, min: 1, max: 100, value: 2, gravity: left right
TBButton: text: Ok, id: ok, autofocus: 1, gravity: right, size: gravity
lp: width: 100
TBLayout: distribution: gravity, axis: y
TBContainer: gravity: all, id: maincontainer
TBLayout: distribution: gravity, axis: y
TBLayout: distribution: gravity
TBLayout: distribution: gravity, gravity: left right
TBButton: gravity: left, id: load, text: Load
TBSkinImage: skin: voxedit-load
TBButton: gravity: left, id: save, text: Save
TBSkinImage: skin: voxedit-save
TBLayout: gravity: left right
TBWidget
TBSeparator: gravity: left right, skin: separator
TBLayout: distribution: gravity, position: top
TBLayout: distribution: gravity, axis: y
TBLayout: distribution: gravity, id: editorcontainer
TBLayout: distribution: gravity, axis: y
TBLayout: axis: x, distribution: gravity
TBTextField: text: Axiom, gravity: left
lp: width: 100
TBEditField: id: axiom, gravity: left, text-align: left, multiline: 1
lp: height: 60
gravity: left right
TBLayout: gravity: left right
TBWidget
TBLayout: axis: x, distribution: gravity
TBTextField: text: Generations, gravity: left, text-align: left
lp: width: 100
TBInlineSelect: id: generations, min: 1, max: 100, value: 2, gravity: left
TBLayout: gravity: left right
TBWidget
TBSeparator: gravity: left right, skin: separator
TBTextField: text: Production rules
TBLayout: axis: x, distribution: gravity
TBLayout: axis: y, position: left top, distribution: gravity
TBSelectList: id: productionrules, gravity: left right top bottom
TBLayout: distribution: gravity
TBEditField
id add_name
gravity left right
placeholder Name
TBButton
id add_rule
text Add
TBButton: text: Ok, id: ok, autofocus: 1, gravity: right, size: gravity
lp: width: 100

View File

@ -26,6 +26,13 @@ set(SRCS
ui/palette/PaletteWidget.h ui/palette/PaletteWidget.cpp
ui/lsystem/RuleItem.h
ui/lsystem/RuleItemSource.cpp
ui/lsystem/RuleItemSource.h
ui/lsystem/RuleItemWidget.cpp
ui/lsystem/RuleItemWidget.h
ui/lsystem/SyntaxHighlighter.h
ui/VoxEditWindow.h ui/VoxEditWindow.cpp
ui/LSystemWindow.h ui/LSystemWindow.cpp

View File

@ -5,58 +5,63 @@
#include "LSystemWindow.h"
#include "voxel/generator/LSystemGenerator.h"
#include "editorscene/EditorScene.h"
#include "lsystem/RuleItem.h"
#include "lsystem/RuleItemSource.h"
#include "lsystem/RuleItemWidget.h"
#include "lsystem/SyntaxHighlighter.h"
namespace voxedit {
namespace {
class LSystemHighlighter : public tb::TBSyntaxHighlighter {
public:
void OnBeforePaintFragment(const tb::TBPaintProps *props, tb::TBTextFragment *fragment) override {
}
void OnAfterPaintFragment(const tb::TBPaintProps *props, tb::TBTextFragment *fragment) override {
}
};
RuleItemSource productionRules;
voxel::lsystem::LSystemContext ctx;
LSystemHighlighter highlighter;
}
Syntaxighlighter highlighter;
LSystemWindow::LSystemWindow(ui::Window* window, EditorScene* scene) :
Super(window), _scene(scene) {
core_assert_always(loadResourceFile("ui/window/voxedit-lsystem.tb.txt"));
_axiom = getWidgetByType<tb::TBEditField>("axiom");
_generations = getWidgetByType<tb::TBInlineSelect>("generations");
_productionRules = getWidgetByType<tb::TBSelectList>("productionrules");
core_assert_msg(_axiom != nullptr, "TBEditField with name 'axiom' wasn't found");
core_assert_msg(_generations != nullptr, "TBInlineSelect with name 'generations' wasn't found");
core_assert_msg(_productionRules != nullptr, "TBSelectList with name 'productionrules' wasn't found");
if (_axiom == nullptr || _generations == nullptr) {
if (_axiom == nullptr || _generations == nullptr || _productionRules == nullptr) {
Close();
return;
}
_productionRules->SetSource(&productionRules);
_productionRules->GetScrollContainer()->SetScrollMode(tb::SCROLL_MODE_Y_AUTO);
_axiom->GetStyleEdit()->SetSyntaxHighlighter(&highlighter);
}
bool LSystemWindow::OnEvent(const tb::TBWidgetEvent &ev) {
if (ev.type != tb::EVENT_TYPE_CLICK) {
return Super::OnEvent(ev);
if (ev.type == tb::EVENT_TYPE_CLICK) {
if (ev.target->GetID() == TBIDC("ok")) {
const tb::TBStr& axiomStr = _axiom->GetText();
ctx.axiom = axiomStr.CStr();
const int n = productionRules.GetNumItems();
for (int i = 0; i < n; ++i) {
RuleItem* item = productionRules.GetItem(i);
const char c = item->character();
const char* str = item->str.CStr();
ctx.productionRules.emplace(c, str);
}
// TODO: voxels via ui
ctx.voxels.emplace('A', voxel::createVoxel(voxel::VoxelType::Grass1));
ctx.generations = _generations->GetValue();
ctx.start = _scene->cursorPosition();
Log::info("evaluate lsystem axiom %s with %i generations", ctx.axiom.c_str(), ctx.generations);
_scene->lsystem(ctx);
return true;
} else if (ev.target->GetID() == TBIDC("add_rule")) {
productionRules.AddItem(new RuleItem("Ax", 'A'));
}
}
if (ev.target->GetID() != TBIDC("ok")) {
return Super::OnEvent(ev);
}
const tb::TBStr& axiomStr = _axiom->GetText();
ctx.axiom = axiomStr.CStr();
ctx.productionRules.emplace('A', ctx.axiom);
ctx.voxels.emplace('A', voxel::createVoxel(voxel::VoxelType::Grass1));
ctx.generations = _generations->GetValue();
ctx.start = _scene->cursorPosition();
Log::info("evaluate lsystem axiom %s with %i generations", ctx.axiom.c_str(), ctx.generations);
_scene->lsystem(ctx);
return true;
return Super::OnEvent(ev);
}
}

View File

@ -16,6 +16,7 @@ private:
EditorScene* _scene;
tb::TBEditField* _axiom = nullptr;
tb::TBInlineSelect* _generations = nullptr;
tb::TBSelectList* _productionRules = nullptr;
public:
LSystemWindow(ui::Window* window, EditorScene* scene);

View File

@ -0,0 +1,20 @@
#pragma once
#include "ui/TurboBadger.h"
namespace voxedit {
class RuleItem: public tb::TBGenericStringItem {
private:
char _character;
public:
RuleItem(const char *str, char character) :
tb::TBGenericStringItem(str, TBIDC("rule_item")), _character(character) {
}
inline char character() const {
return _character;
}
};
}

View File

@ -0,0 +1,14 @@
#include "RuleItemSource.h"
#include "RuleItemWidget.h"
namespace voxedit {
bool RuleItemSource::Filter(int index, const char *filter) {
return tb::TBSelectItemSource::Filter(index, filter);
}
tb::TBWidget* RuleItemSource::CreateItemWidget(int index, tb::TBSelectItemViewer *viewer) {
return new RuleItemWidget(GetItem(index), this, index);
}
}

View File

@ -0,0 +1,15 @@
#pragma once
#include "ui/TurboBadger.h"
#include "RuleItem.h"
namespace voxedit {
class RuleItemSource: public tb::TBSelectItemSourceList<RuleItem> {
public:
bool Filter(int index, const char *filter) override;
tb::TBWidget *CreateItemWidget(int index, tb::TBSelectItemViewer *viewer) override;
};
}

View File

@ -0,0 +1,32 @@
#include "RuleItemWidget.h"
namespace voxedit {
RuleItemWidget::RuleItemWidget(RuleItem *item, RuleItemSource *source, int index) :
Super(), _source(source), _index(index) {
SetSkinBg(TBIDC("TBSelectItem"));
SetLayoutDistribution(tb::LAYOUT_DISTRIBUTION_GRAVITY);
SetLayoutDistributionPosition(tb::LAYOUT_DISTRIBUTION_POSITION_LEFT_TOP);
SetPaintOverflowFadeout(false);
core_assert_always(tb::g_widgets_reader->LoadFile(GetContentRoot(), "ui/widget/voxedit-lsystem-item.tb.txt"));
tb::TBEditField *name = GetWidgetByIDAndType<tb::TBEditField>(TBIDC("rule"));
if (name != nullptr) {
name->SetText(item->str);
}
tb::TBTextField *character = GetWidgetByIDAndType<tb::TBTextField>(TBIDC("character"));
if (character != nullptr) {
const char buf[2] = {item->character(), '\0'};
character->SetText(buf);
}
}
bool RuleItemWidget::OnEvent(const tb::TBWidgetEvent &ev) {
if (ev.type == tb::EVENT_TYPE_CLICK && ev.target->GetID() == TBIDC("delete")) {
_source->DeleteItem(_index);
return true;
}
return Super::OnEvent(ev);
}
}

View File

@ -0,0 +1,20 @@
#pragma once
#include "ui/TurboBadger.h"
#include "core/Common.h"
#include "RuleItemSource.h"
namespace voxedit {
class RuleItemWidget: public tb::TBLayout {
private:
using Super = tb::TBLayout;
RuleItemSource *_source;
int _index;
public:
RuleItemWidget(RuleItem *item, RuleItemSource *source, int index);
bool OnEvent(const tb::TBWidgetEvent &ev) override;
};
}

View File

@ -0,0 +1,16 @@
#pragma once
#include "ui/TurboBadger.h"
namespace voxedit {
class Syntaxighlighter : public tb::TBSyntaxHighlighter {
public:
void OnBeforePaintFragment(const tb::TBPaintProps *props, tb::TBTextFragment *fragment) override {
}
void OnAfterPaintFragment(const tb::TBPaintProps *props, tb::TBTextFragment *fragment) override {
}
};
}