VOXEDIT: more lsystem dialog work
parent
bc49b36214
commit
d32e14a3fa
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
|
@ -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 {
|
||||
}
|
||||
};
|
||||
|
||||
}
|
Loading…
Reference in New Issue