This commit is contained in:
Thomas Peterson 2024-10-17 10:59:52 +02:00
parent a6afd7d601
commit d0f7b8fbf7
4 changed files with 191 additions and 29 deletions

View File

@ -44,11 +44,13 @@ final readonly class Gui implements Application
$lifeCycle->run(); $lifeCycle->run();
} catch (ArgumentCountError $e) { } catch (ArgumentCountError $e) {
var_dump($e->getMessage()); var_dump($e->getMessage());
var_dump($e->getLine());
var_dump($e->getFile()); var_dump($e->getFile());
var_dump($e->getTraceAsString()); var_dump($e->getTraceAsString());
} }
} catch (Throwable $throwable) { } catch (Throwable $throwable) {
var_dump($throwable->getMessage()); var_dump($throwable->getMessage());
var_dump($throwable->getLine());
var_dump($throwable->getFile()); var_dump($throwable->getFile());
var_dump($throwable->getTraceAsString()); var_dump($throwable->getTraceAsString());
} }

View File

@ -5,26 +5,18 @@ namespace PHPNative\Renderer\Widgets;
use PHPNative\Debug\Debug; use PHPNative\Debug\Debug;
use PHPNative\Event\EventType; use PHPNative\Event\EventType;
use PHPNative\Renderer\Cache\Styles; use PHPNative\Renderer\Cache\Styles;
use PHPNative\Renderer\Item;
use PHPNative\Renderer\Thread; use PHPNative\Renderer\Thread;
use PHPNative\Renderer\Viewport; use PHPNative\Renderer\Viewport;
use PHPNative\Renderer\Widget;
use PHPNative\Renderer\Widgets\Container\Column; use PHPNative\Renderer\Widgets\Container\Column;
use PHPNative\Renderer\Widgets\Container\Row;
use PHPNative\Tailwind\LayoutParser; use PHPNative\Tailwind\LayoutParser;
use PHPNative\Tailwind\Style\Background;
use PHPNative\Tailwind\Style\Basis;
use PHPNative\Tailwind\Style\DirectionEnum; use PHPNative\Tailwind\Style\DirectionEnum;
use PHPNative\Tailwind\Style\Flex; use PHPNative\Tailwind\Style\Flex;
use PHPNative\Tailwind\Style\FlexTypeEnum;
use PHPNative\Tailwind\Style\Height;
use PHPNative\Tailwind\Style\Margin; use PHPNative\Tailwind\Style\Margin;
use PHPNative\Tailwind\Style\Overflow; use PHPNative\Tailwind\Style\Overflow;
use PHPNative\Tailwind\Style\OverflowEnum; use PHPNative\Tailwind\Style\OverflowEnum;
use PHPNative\Tailwind\Style\Padding; use PHPNative\Tailwind\Style\Padding;
use PHPNative\Tailwind\Style\StateEnum; use PHPNative\Tailwind\Style\StateEnum;
use PHPNative\Tailwind\Style\Unit;
use PHPNative\Tailwind\Style\Width;
use PHPNative\Tailwind\StyleParser;
class Container class Container
{ {
@ -32,6 +24,7 @@ class Container
{ {
$styles = $stylesCache->getStyle($view->getId(), $viewport->windowMediaQuery, $view->state, $view->style); $styles = $stylesCache->getStyle($view->getId(), $viewport->windowMediaQuery, $view->state, $view->style);
$myViewport = clone $viewport;
if(isset($styles[Margin::class]) && $m = $styles[Margin::class]) { if(isset($styles[Margin::class]) && $m = $styles[Margin::class]) {
$viewport->x += $m->left; $viewport->x += $m->left;
@ -40,7 +33,6 @@ class Container
$viewport->height -= ($m->bottom + $m->top); $viewport->height -= ($m->bottom + $m->top);
} }
$targetViewport = clone $viewport;
\PHPNative\Renderer\Visuals\Visuals::render($view->getId(), $thread, $styles, $viewport, $index); \PHPNative\Renderer\Visuals\Visuals::render($view->getId(), $thread, $styles, $viewport, $index);
\PHPNative\Renderer\Visuals\Visuals::changeViewport($view->getId(), $thread, $styles, $viewport); \PHPNative\Renderer\Visuals\Visuals::changeViewport($view->getId(), $thread, $styles, $viewport);
@ -52,14 +44,83 @@ class Container
$viewport->height -= ($m->bottom + $m->top); $viewport->height -= ($m->bottom + $m->top);
} }
$view = LayoutParser::sortByStyles($stylesCache, $view, $viewport); if($thread->getEvent() && $thread->getEvent()->getType() === EventType::MOUSEMOVE) {
if( $viewport->x <= $thread->getEvent()->x &&
$thread->getEvent()->x <= $viewport->x + $viewport->width &&
$viewport->y <= $thread->getEvent()->y &&
$thread->getEvent()->y <= $viewport->y + $viewport->height ) {
$view->state = StateEnum::hover;
}else{
$view->state = StateEnum::normal;
}
}
if($view instanceof \PHPNative\UI\Widget\Button && $thread->getEvent() && $thread->getEvent()->getType() === EventType::MOUSEBUTTON_UP) {
if( $viewport->x <= $thread->getEvent()->x &&
$thread->getEvent()->x <= $viewport->x + $viewport->width &&
$viewport->y <= $thread->getEvent()->y && $thread->getEvent()->y <=
$viewport->y + $viewport->height ) {
$view->onClick($thread->worker);
}
}
if($view->getViews() != null) { if($view->getViews() != null) {
$view = LayoutParser::sortByStyles($stylesCache, $view, $viewport);
if (isset($styles[Flex::class]) && $styles[Flex::class]->direction == DirectionEnum::column) { if (isset($styles[Flex::class]) && $styles[Flex::class]->direction == DirectionEnum::column) {
//Debug::resolve()->log(['Styles' => $styles]); $resultViewPort = Column::render($stylesCache, $thread, clone $viewport, $view, $index);
Column::render($stylesCache, $thread, $viewport, $view->getViews(), $index);
if (isset($styles[Overflow::class]) && $f = $styles[Overflow::class] && (
$styles[Overflow::class]->y == OverflowEnum::scroll ||
($styles[Overflow::class]->y == OverflowEnum::auto && $viewport->height < $resultViewPort->height)
)) {
\PHPNative\Renderer\Visuals\Scrollbar::renderBackground($view->getId(), $thread, $styles, $viewport);
$sliderViewport = clone $viewport;
$sliderViewport->width = 10;
$sliderViewport->x = $viewport->x + $viewport->width - 10;
$ohP = ($viewport->height / 100);
$ratio = ($resultViewPort->height / ($viewport->height+$resultViewPort->height));
$sliderViewport->y = $viewport->y + (int)($view->getMoveToY()*$ratio);
$sliderViewport->height = (int)($ratio*100 * $ohP);
\PHPNative\Renderer\Visuals\Scrollbar::renderSlider($view->getId(), $thread, $styles, $sliderViewport);
if ($thread->getEvent() && $thread->getEvent()->getType() === EventType::MOUSEBUTTON_DOWN) {
if ($sliderViewport->x <= $thread->getEvent()->x &&
$thread->getEvent()->x <= $sliderViewport->x + $sliderViewport->width &&
$sliderViewport->y <= $thread->getEvent()->y &&
$thread->getEvent()->y <= $sliderViewport->y + $sliderViewport->height) {
$view->setDragMode(true);
//$view->setMoveStartX($thread->getEvent()->x);
$view->setMoveStartY($thread->getEvent()->y);
}
}
if ($view->isDragMode() && $thread->getEvent() && $thread->getEvent()->getType() === EventType::MOUSEMOVE) {
//$view->setMoveToX($view->getMoveEndX() + $thread->getEvent()->x - $view->getMoveStartX());
$view->setMoveToY($view->getMoveEndY() + $thread->getEvent()->y - $view->getMoveStartY());
if($view->getMoveToY() <= 0) {
$view->setMoveStartY($thread->getEvent()->y);
// $view->setMoveToX($view->getMoveEndX() + $thread->getEvent()->x - $view->getMoveStartX());
$view->setMoveToY($view->getMoveEndY() + $thread->getEvent()->y - $view->getMoveStartY());
}
if($view->getMoveToY() + ($sliderViewport->height*$ratio) > ($viewport->height)) {
//$view->setMoveToX($view->getMoveEndX() + $thread->getEvent()->x - $view->getMoveStartX());
$view->setMoveToY($viewport->height - (int)($sliderViewport->height*$ratio) );
}
}
if ($thread->getEvent() && $thread->getEvent()->getType() === EventType::MOUSEBUTTON_UP) {
$view->setDragMode(false);
//$view->setMoveEndX($view->getMoveToX());
$view->setMoveEndY($view->getMoveToY());
}
}
} }
if (isset($styles[Flex::class]) && $styles[Flex::class]->direction == DirectionEnum::row) { if (isset($styles[Flex::class]) && $styles[Flex::class]->direction == DirectionEnum::row) {
$resultViewPort = Row::render($stylesCache, $thread, clone $viewport, $view, $index);
} }
} }
@ -220,15 +281,11 @@ class Container
} }
} }
if (isset($styles[Overflow::class]) && $f = $styles[Overflow::class] && ( if($view->getViews() != null) {
$styles[Overflow::class]->y == OverflowEnum::scroll ||
($styles[Overflow::class]->y == OverflowEnum::auto && $viewport->height < 0)
)) {
\PHPNative\Renderer\Visuals\Scrollbar::renderBackground($view->getId(), $thread, $styles, $targetViewport, $index); /*
* if ($thread->getEvent() && $thread->getEvent()->getType() === EventType::MOUSEBUTTON_DOWN) {
if ($thread->getEvent() && $thread->getEvent()->getType() === EventType::MOUSEBUTTON_DOWN) { if ($viewport->x + $targetViewport->width - 10 <= $thread->getEvent()->x &&
if ($targetViewport->x + $targetViewport->width - 10 <= $thread->getEvent()->x &&
$thread->getEvent()->x <= $targetViewport->x + $targetViewport->width && $thread->getEvent()->x <= $targetViewport->x + $targetViewport->width &&
$targetViewport->y <= $thread->getEvent()->y && $targetViewport->y <= $thread->getEvent()->y &&
$thread->getEvent()->y <= $targetViewport->y + $targetViewport->height) { $thread->getEvent()->y <= $targetViewport->y + $targetViewport->height) {
@ -268,9 +325,9 @@ class Container
\PHPNative\Renderer\Visuals\Scrollbar::renderSlider($view->getId(), $thread, $styles, $sliderViewport, $index); \PHPNative\Renderer\Visuals\Scrollbar::renderSlider($view->getId(), $thread, $styles, $sliderViewport, $index);
} }
} }*/
*/
return $viewport;
return $myViewport;
} }
} }

View File

@ -2,20 +2,71 @@
namespace PHPNative\Renderer\Widgets\Container; namespace PHPNative\Renderer\Widgets\Container;
use PHPNative\Debug\Debug;
use PHPNative\Event\EventType;
use PHPNative\Renderer\Cache\Styles; use PHPNative\Renderer\Cache\Styles;
use PHPNative\Renderer\Thread; use PHPNative\Renderer\Thread;
use PHPNative\Renderer\Viewport; use PHPNative\Renderer\Viewport;
use PHPNative\UI\Collection\Views; use PHPNative\Renderer\Widget;
use PHPNative\Tailwind\LayoutParser;
use PHPNative\Tailwind\Style\Flex;
use PHPNative\Tailwind\Style\FlexTypeEnum;
use PHPNative\Tailwind\Style\Height;
use PHPNative\Tailwind\Style\Overflow;
use PHPNative\Tailwind\Style\OverflowEnum;
use PHPNative\Tailwind\Style\Unit;
use PHPNative\UI\View;
class Column class Column
{ {
public static function render(Styles $stylesCache, Thread $thread, Viewport $viewport, Views $views, int $index = 0): Viewport public static function render(Styles $stylesCache, Thread $thread, Viewport $viewport, View $view, int $index = 0): Viewport
{ {
foreach($views as $view) { $styles = $stylesCache->getStyle($view->getId(), $viewport->windowMediaQuery, $view->state, $view->style);
$flexStyles = [];
$viewportHeight = $viewport->height;
foreach($view->getViews() as $subView) {
$found = false;
$stylesSubView = $stylesCache->getStyle($subView->getId(), $viewport->windowMediaQuery, $subView->state, $subView->style);
if (isset($stylesSubView[Height::class]) && $h = $stylesSubView[Height::class]) {
if ($h->unit == Unit::Percent) {
$height = round($viewportHeight / 100 * $h->value);
} else {
$height = $h->value;
$viewportHeight -= $h->value;
}
$found = true;
}
if (isset($stylesSubView[Flex::class]) && $stylesSubView[Flex::class]->type == FlexTypeEnum::one
) {
$height = round($viewportHeight / $view->getViews()->countOne);
$found = true;
}
if ($found) {
$vp = new Viewport($viewport->windowId, $viewport->windowPtr, $viewport->renderPtr, $viewport->x, $viewport->y, $viewport->width, $height, $viewport->windowWidth, $viewport->windowHeight, $viewport->windowMediaQuery);
$flexStyles[$subView->getRenderSort()] = $vp;
}
} }
LayoutParser::sortByRenderSort($view);
$viewportY = 0;
$viewportHeight = $viewport->height;
foreach($view->getViews() as $subView) {
if(isset($flexStyles[$subView->getRenderSort()])) {
$subViewPort = $flexStyles[$subView->getRenderSort()];
$subViewPort->y += $viewportY+($view->getMoveToY()*-1);
}else{
$subViewPort = clone $viewport;
$subViewPort->y += $viewportY+($view->getMoveToY()*-1);
$subViewPort->height = $viewportHeight;
}
echo sprintf("%s %d %d", $subView->getId(), $subViewPort->y, $subViewPort->height).PHP_EOL;
$vp = Widget::render($stylesCache, $thread, clone $subViewPort, $subView, $index+1);
$viewportY += $vp->height;
$viewportHeight -= $vp->height;
}
echo sprintf("%s %d", $view->getId(), $viewportY).PHP_EOL;
$viewport->height = $viewportY;
return $viewport; return $viewport;
} }
} }

View File

@ -2,7 +2,59 @@
namespace PHPNative\Renderer\Widgets\Container; namespace PHPNative\Renderer\Widgets\Container;
use PHPNative\Debug\Debug;
use PHPNative\Renderer\Cache\Styles;
use PHPNative\Renderer\Thread;
use PHPNative\Renderer\Viewport;
use PHPNative\Renderer\Widget;
use PHPNative\Tailwind\LayoutParser;
use PHPNative\Tailwind\Style\Flex;
use PHPNative\Tailwind\Style\FlexTypeEnum;
use PHPNative\Tailwind\Style\Height;
use PHPNative\Tailwind\Style\Unit;
use PHPNative\Tailwind\Style\Width;
use PHPNative\UI\View;
class Row class Row
{ {
public static function render(Styles $stylesCache, Thread $thread, Viewport $viewport, View $view, int $index = 0): Viewport
{
$flexStyles = [];
$viewportWidth = $viewport->width;
foreach($view->getViews() as $subView) {
$found = false;
$stylesSubView = $stylesCache->getStyle($subView->getId(), $viewport->windowMediaQuery, $subView->state, $subView->style);
if (isset($stylesSubView[Width::class]) && $h = $stylesSubView[Width::class]) {
if ($h->unit == Unit::Percent) {
$width = round($viewportWidth / 100 * $h->value);
} else {
$width = $h->value;
$viewportWidth -= $h->value;
}
$found = true;
}
if (isset($stylesSubView[Flex::class]) && $stylesSubView[Flex::class]->type == FlexTypeEnum::one
) {
$width = round($viewportWidth / $view->getViews()->countOne);
$found = true;
}
if ($found) {
$vp = new Viewport($viewport->windowId, $viewport->windowPtr, $viewport->renderPtr, $viewport->x, $viewport->y, $width, $viewport->height, $viewport->windowWidth, $viewport->windowHeight, $viewport->windowMediaQuery);
$flexStyles[$subView->getRenderSort()] = $vp;
} else {
$flexStyles[$subView->getRenderSort()] = clone $viewport;
}
}
LayoutParser::sortByRenderSort($view);
$viewportX = 0;
foreach($view->getViews() as $subView) {
$subViewPort = $flexStyles[$subView->getRenderSort()];
$subViewPort->x += $viewportX;
$vp = Widget::render($stylesCache, $thread, clone $subViewPort, $subView, $index+1);
$viewportX += $vp->width;
}
return $viewport;
}
} }