canvas pane: optional shadow; use cell flags

This commit is contained in:
nakst 2022-02-12 09:50:58 +00:00
parent f65c768292
commit 2fcb2878fc
4 changed files with 37 additions and 9 deletions

View File

@ -887,8 +887,8 @@ void InstanceCreate(EsMessage *message) {
EsWindowSetIcon(instance->window, ES_ICON_MULTIMEDIA_PHOTO_MANAGER);
EsCanvasPane *canvasPane = EsCanvasPaneCreate(instance->window, ES_CELL_FILL, ES_STYLE_PANEL_WINDOW_BACKGROUND);
instance->canvas = EsCustomElementCreate(canvasPane, ES_CELL_FILL | ES_ELEMENT_FOCUSABLE);
EsCanvasPane *canvasPane = EsCanvasPaneCreate(instance->window, ES_CELL_FILL | ES_CANVAS_PANE_SHOW_SHADOW, ES_STYLE_PANEL_WINDOW_BACKGROUND);
instance->canvas = EsCustomElementCreate(canvasPane, ES_CELL_CENTER | ES_ELEMENT_FOCUSABLE);
instance->canvas->messageUser = CanvasMessage;
EsElementFocus(instance->canvas, false);

View File

@ -654,6 +654,14 @@ const EsStyle styleList = {
},
};
const EsStyle styleImageViewerPane = {
.metrics = {
.mask = ES_THEME_METRICS_CLIP_ENABLED | ES_THEME_METRICS_MAXIMUM_HEIGHT,
.clipEnabled = true,
.maximumHeight = 400,
},
};
void AddREPLResult(ExecutionContext *context, EsElement *parent, Node *type, Value value) {
// TODO Truncating/scrolling/collapsing/saving/copying output.
// TODO Letting scripts register custom views for structs.
@ -688,7 +696,8 @@ void AddREPLResult(ExecutionContext *context, EsElement *parent, Node *type, Val
if ((valueBytes > sizeof(pngSignature) && 0 == EsMemoryCompare(&pngSignature, valueText, sizeof(pngSignature)))
|| (valueBytes > sizeof(jpgSignature) && 0 == EsMemoryCompare(&jpgSignature, valueText, sizeof(jpgSignature)))) {
EsImageDisplay *display = EsImageDisplayCreate(parent, ES_CELL_H_FILL);
EsCanvasPane *canvasPane = EsCanvasPaneCreate(parent, ES_CELL_H_FILL, EsStyleIntern(&styleImageViewerPane));
EsImageDisplay *display = EsImageDisplayCreate(canvasPane, ES_CELL_H_LEFT | ES_CELL_V_TOP);
EsImageDisplayLoadFromMemory(display, valueText, valueBytes);
} else if (EsUTF8IsValid(valueText, valueBytes)) {
char *buffer = EsStringAllocateAndFormat(&bytes, "\u201C%s\u201D", valueBytes, valueText);

View File

@ -3943,12 +3943,26 @@ int ProcessCanvasPaneMessage(EsElement *element, EsMessage *message) {
if (pane->panY < 0) pane->panY = 0;
if (pane->panY > height - Height(bounds) / pane->zoom) pane->panY = height - Height(bounds) / pane->zoom;
if (width * pane->zoom <= Width(bounds) || pane->center) {
bool widthFits = width * pane->zoom <= Width(bounds);
bool heightFits = height * pane->zoom <= Height(bounds);
if (pane->center) {
pane->panX = width / 2 - Width(bounds) / pane->zoom / 2;
pane->panY = height / 2 - Height(bounds) / pane->zoom / 2;
}
if (height * pane->zoom <= Height(bounds) || pane->center) {
pane->panY = height / 2 - Height(bounds) / pane->zoom / 2;
if (widthFits) {
uint64_t cellH = canvas->flags & (ES_CELL_H_LEFT | ES_CELL_H_RIGHT);
if (cellH == ES_CELL_H_LEFT) pane->panX = 0;
if (cellH == ES_CELL_H_CENTER) pane->panX = width / 2 - Width(bounds) / pane->zoom / 2;
if (cellH == ES_CELL_H_RIGHT) pane->panX = width - Width(bounds) / pane->zoom;
}
if (heightFits) {
uint64_t cellV = canvas->flags & (ES_CELL_V_TOP | ES_CELL_V_BOTTOM);
if (cellV == ES_CELL_V_TOP) pane->panY = 0;
if (cellV == ES_CELL_V_CENTER) pane->panY = height / 2 - Height(bounds) / pane->zoom / 2;
if (cellV == ES_CELL_V_BOTTOM) pane->panY = height - Height(bounds) / pane->zoom;
}
pane->scroll.position[0] = pane->panX;
@ -3964,9 +3978,12 @@ int ProcessCanvasPaneMessage(EsElement *element, EsMessage *message) {
} else if (message->type == ES_MSG_PAINT) {
EsElement *canvas = CanvasPaneGetCanvas(element);
if (!canvas) return 0;
if (element->flags & ES_CANVAS_PANE_SHOW_SHADOW) {
UIStyle *style = GetStyle(MakeStyleKey(ES_STYLE_CANVAS_SHADOW, 0), true);
EsRectangle shadow = ES_RECT_4PD(canvas->offsetX, canvas->offsetY, canvas->width, canvas->height);
style->PaintLayers(message->painter, shadow, THEME_CHILD_TYPE_ONLY, ES_FLAGS_DEFAULT);
}
} else if (message->type == ES_MSG_MOUSE_MIDDLE_DOWN) {
pane->lastPanPoint = EsMouseGetPosition(pane);
} else if (message->type == ES_MSG_MOUSE_MIDDLE_DRAG) {

View File

@ -777,6 +777,8 @@ define ES_LIST_VIEW_CHOOSE_ITEM_MIDDLE_CLICK (4)
define ES_SHUTDOWN_ACTION_POWER_OFF (1)
define ES_SHUTDOWN_ACTION_RESTART (2)
define ES_CANVAS_PANE_SHOW_SHADOW (1 << 0)
include desktop/icons.header
enum EsFatalError {