mirror of https://gitlab.com/nakst/essence
designer2 contours
This commit is contained in:
parent
d52b727be8
commit
62d4a52e72
|
@ -9,19 +9,20 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <assert.h>
|
||||||
#endif
|
#endif
|
||||||
#include "hsluv.h"
|
#include "hsluv.h"
|
||||||
|
|
||||||
// x86_64-w64-mingw32-gcc -O3 -o bin/designer2.exe -D UI_WINDOWS util/designer2.cpp -DUNICODE -lgdi32 -luser32 -lkernel32 -Wl,--subsystem,windows -fno-exceptions -fno-rtti
|
// x86_64-w64-mingw32-gcc -O3 -o bin/designer2.exe -D UI_WINDOWS util/designer2.cpp -DUNICODE -lgdi32 -luser32 -lkernel32 -Wl,--subsystem,windows -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
// TODO Needed to replace the old designer:
|
// TODO Needed to replace the old designer:
|
||||||
// Path layers: contours and dashed contours.
|
|
||||||
// Prototyping display: previewing state transitions.
|
// Prototyping display: previewing state transitions.
|
||||||
// Import and reorganize old theming data.
|
// Import and reorganize old theming data.
|
||||||
// Export.
|
// Export.
|
||||||
|
|
||||||
// TODO Additional features:
|
// TODO Additional features:
|
||||||
// Fix moving/resizing objects when zoomed in.
|
// Fix moving/resizing objects when zoomed in.
|
||||||
|
// Path layers: dashed contours.
|
||||||
// Picking objects: only highlight objects with an applicable type.
|
// Picking objects: only highlight objects with an applicable type.
|
||||||
// Displaying radial gradients.
|
// Displaying radial gradients.
|
||||||
// Resizing graph objects?
|
// Resizing graph objects?
|
||||||
|
@ -29,6 +30,9 @@
|
||||||
// Auto-layout in the prototype display.
|
// Auto-layout in the prototype display.
|
||||||
// Importing SVGs and TTFs.
|
// Importing SVGs and TTFs.
|
||||||
// Schema-based verification of the document.
|
// Schema-based verification of the document.
|
||||||
|
// Get text rendering on non-Essence platforms.
|
||||||
|
// Proper bezier path editor.
|
||||||
|
// Path boolean operations.
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@ -264,6 +268,7 @@ enum ObjectType : uint8_t {
|
||||||
OBJ_VAR_INT,
|
OBJ_VAR_INT,
|
||||||
OBJ_VAR_TEXT_STYLE,
|
OBJ_VAR_TEXT_STYLE,
|
||||||
OBJ_VAR_ICON_STYLE,
|
OBJ_VAR_ICON_STYLE,
|
||||||
|
OBJ_VAR_CONTOUR_STYLE,
|
||||||
|
|
||||||
OBJ_PAINT_OVERWRITE = 0x60,
|
OBJ_PAINT_OVERWRITE = 0x60,
|
||||||
OBJ_PAINT_LINEAR_GRADIENT,
|
OBJ_PAINT_LINEAR_GRADIENT,
|
||||||
|
@ -1342,7 +1347,8 @@ void InspectorPopulate() {
|
||||||
|
|
||||||
bool inheritWithAnimation = object->type == OBJ_VAR_TEXT_STYLE || object->type == OBJ_VAR_ICON_STYLE
|
bool inheritWithAnimation = object->type == OBJ_VAR_TEXT_STYLE || object->type == OBJ_VAR_ICON_STYLE
|
||||||
|| object->type == OBJ_LAYER_BOX || object->type == OBJ_LAYER_TEXT || object->type == OBJ_LAYER_PATH
|
|| object->type == OBJ_LAYER_BOX || object->type == OBJ_LAYER_TEXT || object->type == OBJ_LAYER_PATH
|
||||||
|| object->type == OBJ_PAINT_OVERWRITE || object->type == OBJ_PAINT_LINEAR_GRADIENT || object->type == OBJ_PAINT_RADIAL_GRADIENT;
|
|| object->type == OBJ_PAINT_OVERWRITE || object->type == OBJ_PAINT_LINEAR_GRADIENT || object->type == OBJ_PAINT_RADIAL_GRADIENT
|
||||||
|
|| object->type == OBJ_VAR_CONTOUR_STYLE;
|
||||||
bool inheritWithoutAnimation = object->type == OBJ_STYLE || object->type == OBJ_LAYER_METRICS;
|
bool inheritWithoutAnimation = object->type == OBJ_STYLE || object->type == OBJ_LAYER_METRICS;
|
||||||
|
|
||||||
if (inheritWithAnimation || inheritWithoutAnimation) {
|
if (inheritWithAnimation || inheritWithoutAnimation) {
|
||||||
|
@ -1474,6 +1480,26 @@ void InspectorPopulate() {
|
||||||
} else if (object->type == OBJ_VAR_ICON_STYLE) {
|
} else if (object->type == OBJ_VAR_ICON_STYLE) {
|
||||||
InspectorAddLink(object, "Icon color:", "iconColor");
|
InspectorAddLink(object, "Icon color:", "iconColor");
|
||||||
InspectorAddInteger(object, "Icon size:", "iconSize");
|
InspectorAddInteger(object, "Icon size:", "iconSize");
|
||||||
|
} else if (object->type == OBJ_VAR_CONTOUR_STYLE) {
|
||||||
|
InspectorAddInteger(object, "Internal width:", "internalWidth");
|
||||||
|
InspectorAddInteger(object, "External width:", "externalWidth");
|
||||||
|
InspectorAddBooleanToggle(object, "When scaling, snap to integer widths", "integerWidthsOnly");
|
||||||
|
InspectorAddFloat(object, "Miter limit:", "miterLimit");
|
||||||
|
|
||||||
|
UILabelCreate(0, 0, "Join mode:", -1);
|
||||||
|
UIPanelCreate(0, UI_ELEMENT_PARENT_PUSH | UI_PANEL_HORIZONTAL);
|
||||||
|
InspectorAddRadioSwitch(object, "Miter", "joinMode", RAST_LINE_JOIN_MITER);
|
||||||
|
InspectorAddRadioSwitch(object, "Round", "joinMode", RAST_LINE_JOIN_ROUND);
|
||||||
|
InspectorBind(&UIButtonCreate(0, UI_BUTTON_SMALL, "X", 1)->e, object->id, "joinMode", INSPECTOR_REMOVE_BUTTON);
|
||||||
|
UIParentPop();
|
||||||
|
|
||||||
|
UILabelCreate(0, 0, "Cap mode:", -1);
|
||||||
|
UIPanelCreate(0, UI_ELEMENT_PARENT_PUSH | UI_PANEL_HORIZONTAL);
|
||||||
|
InspectorAddRadioSwitch(object, "Flat", "capMode", RAST_LINE_CAP_FLAT);
|
||||||
|
InspectorAddRadioSwitch(object, "Square", "capMode", RAST_LINE_CAP_SQUARE);
|
||||||
|
InspectorAddRadioSwitch(object, "Round", "capMode", RAST_LINE_CAP_ROUND);
|
||||||
|
InspectorBind(&UIButtonCreate(0, UI_BUTTON_SMALL, "X", 1)->e, object->id, "capMode", INSPECTOR_REMOVE_BUTTON);
|
||||||
|
UIParentPop();
|
||||||
} else if (object->type == OBJ_LAYER_BOX) {
|
} else if (object->type == OBJ_LAYER_BOX) {
|
||||||
InspectorAddFourGroup(object, "Border sizes:", "borders");
|
InspectorAddFourGroup(object, "Border sizes:", "borders");
|
||||||
InspectorAddFourGroup(object, "Corner radii:", "corners");
|
InspectorAddFourGroup(object, "Corner radii:", "corners");
|
||||||
|
@ -1884,7 +1910,7 @@ void ExportLayerPath(bool first, Object *object, EsBuffer *data) {
|
||||||
Property *property;
|
Property *property;
|
||||||
#define LAYER_PATH_WRITE_POINT(x) \
|
#define LAYER_PATH_WRITE_POINT(x) \
|
||||||
sprintf(cPropertyName, "points_%d_" #x, (int32_t) i); \
|
sprintf(cPropertyName, "points_%d_" #x, (int32_t) i); \
|
||||||
property = PropertyFind(object, cPropertyName, PROP_FLOAT); \
|
property = PropertyFindOrInherit(first, object, cPropertyName, PROP_FLOAT); \
|
||||||
EsBufferWrite(data, property ? &property->floating : &zero, sizeof(float));
|
EsBufferWrite(data, property ? &property->floating : &zero, sizeof(float));
|
||||||
LAYER_PATH_WRITE_POINT(x0);
|
LAYER_PATH_WRITE_POINT(x0);
|
||||||
LAYER_PATH_WRITE_POINT(y0);
|
LAYER_PATH_WRITE_POINT(y0);
|
||||||
|
@ -1897,12 +1923,35 @@ void ExportLayerPath(bool first, Object *object, EsBuffer *data) {
|
||||||
for (uintptr_t i = 0; i < path.fillCount; i++) {
|
for (uintptr_t i = 0; i < path.fillCount; i++) {
|
||||||
char cPropertyName[PROPERTY_NAME_SIZE];
|
char cPropertyName[PROPERTY_NAME_SIZE];
|
||||||
ThemeLayerPathFill fill = {};
|
ThemeLayerPathFill fill = {};
|
||||||
fill.paintAndFillType |= THEME_PATH_FILL_SOLID; // TODO Contours and dashed contours.
|
|
||||||
sprintf(cPropertyName, "fills_%d_paint", (int32_t) i);
|
sprintf(cPropertyName, "fills_%d_paint", (int32_t) i);
|
||||||
Property *paint = PropertyFind(object, cPropertyName, PROP_OBJECT);
|
Object *paint = PropertyFindOrInheritReadObject(first, object, cPropertyName);
|
||||||
fill.paintAndFillType |= ExportPaint(ObjectFind(paint ? paint->object : 0), nullptr);
|
fill.paintAndFillType |= ExportPaint(paint, nullptr);
|
||||||
|
|
||||||
|
sprintf(cPropertyName, "fills_%d_mode", (int32_t) i);
|
||||||
|
Object *mode = PropertyFindOrInheritReadObject(first, object, cPropertyName);
|
||||||
|
|
||||||
|
// TODO Dashed contours.
|
||||||
|
|
||||||
|
if (mode && mode->type == OBJ_VAR_CONTOUR_STYLE) {
|
||||||
|
fill.paintAndFillType |= THEME_PATH_FILL_CONTOUR;
|
||||||
|
} else {
|
||||||
|
fill.paintAndFillType |= THEME_PATH_FILL_SOLID;
|
||||||
|
}
|
||||||
|
|
||||||
EsBufferWrite(data, &fill, sizeof(fill));
|
EsBufferWrite(data, &fill, sizeof(fill));
|
||||||
ExportPaint(ObjectFind(paint ? paint->object : 0), data);
|
ExportPaint(paint, data);
|
||||||
|
|
||||||
|
if (mode && mode->type == OBJ_VAR_CONTOUR_STYLE) {
|
||||||
|
ThemeLayerPathFillContour contour = {};
|
||||||
|
contour.miterLimit = PropertyFindOrInheritReadFloat(first, mode, "miterLimit");
|
||||||
|
contour.internalWidth = PropertyFindOrInheritReadInt32(first, mode, "internalWidth");
|
||||||
|
contour.externalWidth = PropertyFindOrInheritReadInt32(first, mode, "externalWidth");
|
||||||
|
contour.mode = PropertyFindOrInheritReadInt32(first, mode, "joinMode")
|
||||||
|
| (PropertyFindOrInheritReadInt32(first, mode, "capMode") << 2)
|
||||||
|
| (PropertyFindOrInheritReadInt32(first, mode, "integerWidthsOnly") ? 0x80 : 0);
|
||||||
|
EsBufferWrite(data, &contour, sizeof(contour));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2235,6 +2284,7 @@ int CanvasMessage(UIElement *element, UIMessage message, int di, void *dp) {
|
||||||
canvas->previewStateActive = false;
|
canvas->previewStateActive = false;
|
||||||
} else {
|
} else {
|
||||||
// TODO Preview for the metrics layer. Show the preferred size, insets and gaps?
|
// TODO Preview for the metrics layer. Show the preferred size, insets and gaps?
|
||||||
|
// TODO Preview for OBJ_VAR_CONTOUR_STYLE.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2515,6 +2565,7 @@ void ObjectAddCommand(void *) {
|
||||||
UIMenuAddItem(menu, 0, "Integer variable", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_VAR_INT);
|
UIMenuAddItem(menu, 0, "Integer variable", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_VAR_INT);
|
||||||
UIMenuAddItem(menu, 0, "Text style", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_VAR_TEXT_STYLE);
|
UIMenuAddItem(menu, 0, "Text style", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_VAR_TEXT_STYLE);
|
||||||
UIMenuAddItem(menu, 0, "Icon style", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_VAR_ICON_STYLE);
|
UIMenuAddItem(menu, 0, "Icon style", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_VAR_ICON_STYLE);
|
||||||
|
UIMenuAddItem(menu, 0, "Contour style", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_VAR_CONTOUR_STYLE);
|
||||||
UIMenuAddItem(menu, 0, "Metrics", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_LAYER_METRICS);
|
UIMenuAddItem(menu, 0, "Metrics", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_LAYER_METRICS);
|
||||||
UIMenuAddItem(menu, 0, "Overwrite paint", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_PAINT_OVERWRITE);
|
UIMenuAddItem(menu, 0, "Overwrite paint", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_PAINT_OVERWRITE);
|
||||||
UIMenuAddItem(menu, 0, "Linear gradient", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_PAINT_LINEAR_GRADIENT);
|
UIMenuAddItem(menu, 0, "Linear gradient", -1, ObjectAddCommandInternal, (void *) (uintptr_t) OBJ_PAINT_LINEAR_GRADIENT);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
[general]
|
[general]
|
||||||
name=Designer
|
name=Theme Designer
|
||||||
icon=icon_applications_interfacedesign
|
icon=icon_applications_interfacedesign
|
||||||
|
|
||||||
[build]
|
[build]
|
||||||
|
|
Loading…
Reference in New Issue