From ac82e798b6c2f2a9d2d45bf06e9972341f14c5fb Mon Sep 17 00:00:00 2001 From: vczh Date: Sun, 25 Oct 2015 21:05:47 -0700 Subject: [PATCH] Update release --- Import/GacUI.cpp | 1258 +++++++++++------ Import/GacUI.h | 469 +++--- Import/GacUIReflection.cpp | 222 ++- Import/GacUIReflection.h | 139 +- Tools/GacGen.exe | Bin 15489536 -> 15623680 bytes Tools/ParserGen.exe | Bin 1121280 -> 1121280 bytes Tutorial/GacUI_HelloWorlds/UIRes/MVVM.bin | Bin 223268 -> 223268 bytes Tutorial/GacUI_Layout/Flow/UI/Resource.xml | 210 ++- .../Flow/UI/Source/DemoPartialClasses.h | 15 + Tutorial/GacUI_Layout/UIRes/Flow.bin | Bin 1837 -> 394481 bytes 10 files changed, 1593 insertions(+), 720 deletions(-) diff --git a/Import/GacUI.cpp b/Import/GacUI.cpp index 55b9bcf5..8d35c835 100644 --- a/Import/GacUI.cpp +++ b/Import/GacUI.cpp @@ -6541,9 +6541,9 @@ DataGridContentProvider CloseEditor(false); } - GuiListControl::IItemCoordinateTransformer* DataGridContentProvider::CreatePreferredCoordinateTransformer() + compositions::IGuiAxis* DataGridContentProvider::CreatePreferredAxis() { - return new DefaultItemCoordinateTransformer; + return new GuiDefaultAxis; } GuiListControl::IItemArranger* DataGridContentProvider::CreatePreferredArranger() @@ -8420,7 +8420,7 @@ GuiListControl::ItemCallback void GuiListControl::ItemCallback::SetViewLocation(Point value) { Rect virtualRect(value, listControl->GetViewSize()); - Rect realRect=listControl->itemCoordinateTransformer->VirtualRectToRealRect(listControl->fullSize, virtualRect); + Rect realRect=listControl->axis->VirtualRectToRealRect(listControl->fullSize, virtualRect); listControl->GetHorizontalScroll()->SetPosition(realRect.Left()); listControl->GetVerticalScroll()->SetPosition(realRect.Top()); } @@ -8428,24 +8428,24 @@ GuiListControl::ItemCallback Size GuiListControl::ItemCallback::GetStylePreferredSize(IItemStyleController* style) { Size size=style->GetBoundsComposition()->GetPreferredBounds().GetSize(); - return listControl->itemCoordinateTransformer->RealSizeToVirtualSize(size); + return listControl->axis->RealSizeToVirtualSize(size); } void GuiListControl::ItemCallback::SetStyleAlignmentToParent(IItemStyleController* style, Margin margin) { - Margin newMargin=listControl->itemCoordinateTransformer->VirtualMarginToRealMargin(margin); + Margin newMargin=listControl->axis->VirtualMarginToRealMargin(margin); style->GetBoundsComposition()->SetAlignmentToParent(newMargin); } Rect GuiListControl::ItemCallback::GetStyleBounds(IItemStyleController* style) { Rect bounds=style->GetBoundsComposition()->GetBounds(); - return listControl->itemCoordinateTransformer->RealRectToVirtualRect(listControl->GetViewSize(), bounds); + return listControl->axis->RealRectToVirtualRect(listControl->GetViewSize(), bounds); } void GuiListControl::ItemCallback::SetStyleBounds(IItemStyleController* style, Rect bounds) { - Rect newBounds=listControl->itemCoordinateTransformer->VirtualRectToRealRect(listControl->GetViewSize(), bounds); + Rect newBounds=listControl->axis->VirtualRectToRealRect(listControl->GetViewSize(), bounds); return style->GetBoundsComposition()->SetBounds(newBounds); } @@ -8492,7 +8492,7 @@ GuiListControl Size GuiListControl::QueryFullSize() { Size virtualSize=itemArranger?itemArranger->GetTotalSize():Size(0, 0); - fullSize=itemCoordinateTransformer->VirtualSizeToRealSize(virtualSize); + fullSize=axis->VirtualSizeToRealSize(virtualSize); return fullSize; } @@ -8500,7 +8500,7 @@ GuiListControl { if(itemArranger) { - Rect newBounds=itemCoordinateTransformer->RealRectToVirtualRect(fullSize, viewBounds); + Rect newBounds=axis->RealRectToVirtualRect(fullSize, viewBounds); itemArranger->OnViewChanged(newBounds); } } @@ -8656,7 +8656,7 @@ GuiListControl { StyleProviderChanged.SetAssociatedComposition(boundsComposition); ArrangerChanged.SetAssociatedComposition(boundsComposition); - CoordinateTransformerChanged.SetAssociatedComposition(boundsComposition); + AxisChanged.SetAssociatedComposition(boundsComposition); ItemLeftButtonDown.SetAssociatedComposition(boundsComposition); ItemLeftButtonUp.SetAssociatedComposition(boundsComposition); @@ -8673,7 +8673,7 @@ GuiListControl callback=new ItemCallback(this); itemProvider->AttachCallback(callback.Obj()); - itemCoordinateTransformer=new list::DefaultItemCoordinateTransformer; + axis=new GuiDefaultAxis; if(acceptFocus) { @@ -8726,17 +8726,17 @@ GuiListControl return old; } - GuiListControl::IItemCoordinateTransformer* GuiListControl::GetCoordinateTransformer() + compositions::IGuiAxis* GuiListControl::GetAxis() { - return itemCoordinateTransformer.Obj(); + return axis.Obj(); } - Ptr GuiListControl::SetCoordinateTransformer(Ptr value) + Ptr GuiListControl::SetAxis(Ptr value) { - Ptr old=itemCoordinateTransformer; - itemCoordinateTransformer=value; + Ptr old=axis; + axis=value; SetStyleProviderAndArranger(itemStyleProvider, itemArranger); - CoordinateTransformerChanged.Execute(GetNotifyEventArguments()); + AxisChanged.Execute(GetNotifyEventArguments()); return old; } @@ -9016,40 +9016,40 @@ GuiSelectableListControl if(!GetArranger()) return false; NormalizeSelectedItemIndexStartEnd(); - KeyDirection keyDirection=Up; + KeyDirection keyDirection=KeyDirection::Up; switch(code) { case VKEY_UP: - keyDirection=Up; + keyDirection=KeyDirection::Up; break; case VKEY_DOWN: - keyDirection=Down; + keyDirection=KeyDirection::Down; break; case VKEY_LEFT: - keyDirection=Left; + keyDirection=KeyDirection::Left; break; case VKEY_RIGHT: - keyDirection=Right; + keyDirection=KeyDirection::Right; break; case VKEY_HOME: - keyDirection=Home; + keyDirection=KeyDirection::Home; break; case VKEY_END: - keyDirection=End; + keyDirection=KeyDirection::End; break; case VKEY_PRIOR: - keyDirection=PageUp; + keyDirection=KeyDirection::PageUp; break; case VKEY_NEXT: - keyDirection=PageDown; + keyDirection=KeyDirection::PageDown; break; default: return false; } - if(GetCoordinateTransformer()) + if(GetAxis()) { - keyDirection=GetCoordinateTransformer()->RealKeyDirectionToVirtualKeyDirection(keyDirection); + keyDirection=GetAxis()->RealKeyDirectionToVirtualKeyDirection(keyDirection); } vint itemIndex=GetArranger()->FindItem(selectedItemIndexEnd, keyDirection); if(SelectItemsByClick(itemIndex, ctrl, shift, true)) @@ -9075,363 +9075,6 @@ GuiSelectableListControl namespace list { -/*********************************************************************** -DefaultItemCoordinateTransformer -***********************************************************************/ - - DefaultItemCoordinateTransformer::DefaultItemCoordinateTransformer() - { - } - - DefaultItemCoordinateTransformer::~DefaultItemCoordinateTransformer() - { - } - - Size DefaultItemCoordinateTransformer::RealSizeToVirtualSize(Size size) - { - return size; - } - - Size DefaultItemCoordinateTransformer::VirtualSizeToRealSize(Size size) - { - return size; - } - - Point DefaultItemCoordinateTransformer::RealPointToVirtualPoint(Size realFullSize, Point point) - { - return point; - } - - Point DefaultItemCoordinateTransformer::VirtualPointToRealPoint(Size realFullSize, Point point) - { - return point; - } - - Rect DefaultItemCoordinateTransformer::RealRectToVirtualRect(Size realFullSize, Rect rect) - { - return rect; - } - - Rect DefaultItemCoordinateTransformer::VirtualRectToRealRect(Size realFullSize, Rect rect) - { - return rect; - } - - Margin DefaultItemCoordinateTransformer::RealMarginToVirtualMargin(Margin margin) - { - return margin; - } - - Margin DefaultItemCoordinateTransformer::VirtualMarginToRealMargin(Margin margin) - { - return margin; - } - - GuiListControl::KeyDirection DefaultItemCoordinateTransformer::RealKeyDirectionToVirtualKeyDirection(GuiListControl::KeyDirection key) - { - return key; - } - -/*********************************************************************** -AxisAlignedItemCoordinateTransformer -***********************************************************************/ - - AxisAlignedItemCoordinateTransformer::AxisAlignedItemCoordinateTransformer(Alignment _alignment) - :alignment(_alignment) - { - } - - AxisAlignedItemCoordinateTransformer::~AxisAlignedItemCoordinateTransformer() - { - } - - AxisAlignedItemCoordinateTransformer::Alignment AxisAlignedItemCoordinateTransformer::GetAlignment() - { - return alignment; - } - - Size AxisAlignedItemCoordinateTransformer::RealSizeToVirtualSize(Size size) - { - switch(alignment) - { - case LeftDown: - case RightDown: - case LeftUp: - case RightUp: - return Size(size.x, size.y); - case DownLeft: - case DownRight: - case UpLeft: - case UpRight: - return Size(size.y, size.x); - } - return size; - } - - Size AxisAlignedItemCoordinateTransformer::VirtualSizeToRealSize(Size size) - { - return RealSizeToVirtualSize(size); - } - - Point AxisAlignedItemCoordinateTransformer::RealPointToVirtualPoint(Size realFullSize, Point point) - { - Rect rect(point, Size(0, 0)); - return RealRectToVirtualRect(realFullSize, rect).LeftTop(); - } - - Point AxisAlignedItemCoordinateTransformer::VirtualPointToRealPoint(Size realFullSize, Point point) - { - Rect rect(point, Size(0, 0)); - return VirtualRectToRealRect(realFullSize, rect).LeftTop(); - } - - Rect AxisAlignedItemCoordinateTransformer::RealRectToVirtualRect(Size realFullSize, Rect rect) - { - vint x1=rect.x1; - vint x2=realFullSize.x-rect.x2; - vint y1=rect.y1; - vint y2=realFullSize.y-rect.y2; - vint w=rect.Width(); - vint h=rect.Height(); - switch(alignment) - { - case LeftDown: - return Rect(Point(x2, y1), Size(w, h)); - case RightDown: - return Rect(Point(x1, y1), Size(w, h)); - case LeftUp: - return Rect(Point(x2, y2), Size(w, h)); - case RightUp: - return Rect(Point(x1, y2), Size(w, h)); - case DownLeft: - return Rect(Point(y1, x2), Size(h, w)); - case DownRight: - return Rect(Point(y1, x1), Size(h, w)); - case UpLeft: - return Rect(Point(y2, x2), Size(h, w)); - case UpRight: - return Rect(Point(y2, x1), Size(h, w)); - } - return rect; - } - - Rect AxisAlignedItemCoordinateTransformer::VirtualRectToRealRect(Size realFullSize, Rect rect) - { - realFullSize=RealSizeToVirtualSize(realFullSize); - vint x1=rect.x1; - vint x2=realFullSize.x-rect.x2; - vint y1=rect.y1; - vint y2=realFullSize.y-rect.y2; - vint w=rect.Width(); - vint h=rect.Height(); - switch(alignment) - { - case LeftDown: - return Rect(Point(x2, y1), Size(w, h)); - case RightDown: - return Rect(Point(x1, y1), Size(w, h)); - case LeftUp: - return Rect(Point(x2, y2), Size(w, h)); - case RightUp: - return Rect(Point(x1, y2), Size(w, h)); - case DownLeft: - return Rect(Point(y2, x1), Size(h, w)); - case DownRight: - return Rect(Point(y1, x1), Size(h, w)); - case UpLeft: - return Rect(Point(y2, x2), Size(h, w)); - case UpRight: - return Rect(Point(y1, x2), Size(h, w)); - } - return rect; - } - - Margin AxisAlignedItemCoordinateTransformer::RealMarginToVirtualMargin(Margin margin) - { - vint x1=margin.left; - vint x2=margin.right; - vint y1=margin.top; - vint y2=margin.bottom; - switch(alignment) - { - case LeftDown: - return Margin(x2, y1, x1, y2); - case RightDown: - return Margin(x1, y1, x2, y2); - case LeftUp: - return Margin(x2, y2, x1, y1); - case RightUp: - return Margin(x1, y2, x2, y1); - case DownLeft: - return Margin(y1, x2, y2, x1); - case DownRight: - return Margin(y1, x1, y2, x2); - case UpLeft: - return Margin(y2, x2, y1, x1); - case UpRight: - return Margin(y2, x1, y1, x2); - } - return margin; - } - - Margin AxisAlignedItemCoordinateTransformer::VirtualMarginToRealMargin(Margin margin) - { - vint x1=margin.left; - vint x2=margin.right; - vint y1=margin.top; - vint y2=margin.bottom; - switch(alignment) - { - case LeftDown: - return Margin(x2, y1, x1, y2); - case RightDown: - return Margin(x1, y1, x2, y2); - case LeftUp: - return Margin(x2, y2, x1, y1); - case RightUp: - return Margin(x1, y2, x2, y1); - case DownLeft: - return Margin(y2, x1, y1, x2); - case DownRight: - return Margin(y1, x1, y2, x2); - case UpLeft: - return Margin(y2, x2, y1, x1); - case UpRight: - return Margin(y1, x2, y2, x1); - default:; - } - return margin; - } - - GuiListControl::KeyDirection AxisAlignedItemCoordinateTransformer::RealKeyDirectionToVirtualKeyDirection(GuiListControl::KeyDirection key) - { - bool pageKey=false; - switch(key) - { - case GuiListControl::PageUp: - pageKey=true; - key=GuiListControl::Up; - break; - case GuiListControl::PageDown: - pageKey=true; - key=GuiListControl::Down; - break; - case GuiListControl::PageLeft: - pageKey=true; - key=GuiListControl::Left; - break; - case GuiListControl::PageRight: - pageKey=true; - key=GuiListControl::Right; - break; - default:; - } - - switch(key) - { - case GuiListControl::Up: - switch(alignment) - { - case LeftDown: key=GuiListControl::Up; break; - case RightDown: key=GuiListControl::Up; break; - case LeftUp: key=GuiListControl::Down; break; - case RightUp: key=GuiListControl::Down; break; - case DownLeft: key=GuiListControl::Left; break; - case DownRight: key=GuiListControl::Left; break; - case UpLeft: key=GuiListControl::Right; break; - case UpRight: key=GuiListControl::Right; break; - } - break; - case GuiListControl::Down: - switch(alignment) - { - case LeftDown: key=GuiListControl::Down; break; - case RightDown: key=GuiListControl::Down; break; - case LeftUp: key=GuiListControl::Up; break; - case RightUp: key=GuiListControl::Up; break; - case DownLeft: key=GuiListControl::Right; break; - case DownRight: key=GuiListControl::Right; break; - case UpLeft: key=GuiListControl::Left; break; - case UpRight: key=GuiListControl::Left; break; - } - break; - case GuiListControl::Left: - switch(alignment) - { - case LeftDown: key=GuiListControl::Right; break; - case RightDown: key=GuiListControl::Left; break; - case LeftUp: key=GuiListControl::Right; break; - case RightUp: key=GuiListControl::Left; break; - case DownLeft: key=GuiListControl::Down; break; - case DownRight: key=GuiListControl::Up; break; - case UpLeft: key=GuiListControl::Down; break; - case UpRight: key=GuiListControl::Up; break; - } - break; - case GuiListControl::Right: - switch(alignment) - { - case LeftDown: key=GuiListControl::Left; break; - case RightDown: key=GuiListControl::Right; break; - case LeftUp: key=GuiListControl::Left; break; - case RightUp: key=GuiListControl::Right; break; - case DownLeft: key=GuiListControl::Up; break; - case DownRight: key=GuiListControl::Down; break; - case UpLeft: key=GuiListControl::Up; break; - case UpRight: key=GuiListControl::Down; break; - } - break; - case GuiListControl::Home: - switch(alignment) - { - case LeftDown: key=GuiListControl::Home; break; - case RightDown: key=GuiListControl::Home; break; - case LeftUp: key=GuiListControl::End; break; - case RightUp: key=GuiListControl::End; break; - case DownLeft: key=GuiListControl::Home; break; - case DownRight: key=GuiListControl::Home; break; - case UpLeft: key=GuiListControl::End; break; - case UpRight: key=GuiListControl::End; break; - } - break; - case GuiListControl::End: - switch(alignment) - { - case LeftDown: key=GuiListControl::End; break; - case RightDown: key=GuiListControl::End; break; - case LeftUp: key=GuiListControl::Home; break; - case RightUp: key=GuiListControl::Home; break; - case DownLeft: key=GuiListControl::End; break; - case DownRight: key=GuiListControl::End; break; - case UpLeft: key=GuiListControl::Home; break; - case UpRight: key=GuiListControl::Home; break; - } - break; - default:; - } - - if(pageKey) - { - switch(key) - { - case GuiListControl::Up: - key=GuiListControl::PageUp; - break; - case GuiListControl::Down: - key=GuiListControl::PageDown; - break; - case GuiListControl::Left: - key=GuiListControl::PageLeft; - break; - case GuiListControl::Right: - key=GuiListControl::PageRight; - break; - default:; - } - } - return key; - } - /*********************************************************************** RangedItemArrangerBase ***********************************************************************/ @@ -9723,7 +9366,7 @@ FixedHeightItemArranger { } - vint FixedHeightItemArranger::FindItem(vint itemIndex, GuiListControl::KeyDirection key) + vint FixedHeightItemArranger::FindItem(vint itemIndex, compositions::KeyDirection key) { vint count=itemProvider->Count(); if(count==0) return -1; @@ -9731,22 +9374,22 @@ FixedHeightItemArranger if(groupCount==0) groupCount=1; switch(key) { - case GuiListControl::Up: + case KeyDirection::Up: itemIndex--; break; - case GuiListControl::Down: + case KeyDirection::Down: itemIndex++; break; - case GuiListControl::Home: + case KeyDirection::Home: itemIndex=0; break; - case GuiListControl::End: + case KeyDirection::End: itemIndex=count; break; - case GuiListControl::PageUp: + case KeyDirection::PageUp: itemIndex-=groupCount; break; - case GuiListControl::PageDown: + case KeyDirection::PageDown: itemIndex+=groupCount; break; default: @@ -9949,7 +9592,7 @@ FixedSizeMultiColumnItemArranger { } - vint FixedSizeMultiColumnItemArranger::FindItem(vint itemIndex, GuiListControl::KeyDirection key) + vint FixedSizeMultiColumnItemArranger::FindItem(vint itemIndex, compositions::KeyDirection key) { vint count=itemProvider->Count(); vint columnCount=viewBounds.Width()/itemSize.x; @@ -9959,34 +9602,34 @@ FixedSizeMultiColumnItemArranger switch(key) { - case GuiListControl::Up: + case KeyDirection::Up: itemIndex-=columnCount; break; - case GuiListControl::Down: + case KeyDirection::Down: itemIndex+=columnCount; break; - case GuiListControl::Left: + case KeyDirection::Left: itemIndex--; break; - case GuiListControl::Right: + case KeyDirection::Right: itemIndex++; break; - case GuiListControl::Home: + case KeyDirection::Home: itemIndex=0; break; - case GuiListControl::End: + case KeyDirection::End: itemIndex=count; break; - case GuiListControl::PageUp: + case KeyDirection::PageUp: itemIndex-=columnCount*rowCount; break; - case GuiListControl::PageDown: + case KeyDirection::PageDown: itemIndex+=columnCount*rowCount; break; - case GuiListControl::PageLeft: + case KeyDirection::PageLeft: itemIndex-=itemIndex%columnCount; break; - case GuiListControl::PageRight: + case KeyDirection::PageRight: itemIndex+=columnCount-itemIndex%columnCount-1; break; default: @@ -10207,35 +9850,35 @@ FixedHeightMultiColumnItemArranger { } - vint FixedHeightMultiColumnItemArranger::FindItem(vint itemIndex, GuiListControl::KeyDirection key) + vint FixedHeightMultiColumnItemArranger::FindItem(vint itemIndex, compositions::KeyDirection key) { vint count=itemProvider->Count(); vint groupCount=viewBounds.Height()/itemHeight; if(groupCount==0) groupCount=1; switch(key) { - case GuiListControl::Up: + case KeyDirection::Up: itemIndex--; break; - case GuiListControl::Down: + case KeyDirection::Down: itemIndex++; break; - case GuiListControl::Left: + case KeyDirection::Left: itemIndex-=groupCount; break; - case GuiListControl::Right: + case KeyDirection::Right: itemIndex+=groupCount; break; - case GuiListControl::Home: + case KeyDirection::Home: itemIndex=0; break; - case GuiListControl::End: + case KeyDirection::End: itemIndex=count; break; - case GuiListControl::PageUp: + case KeyDirection::PageUp: itemIndex-=itemIndex%groupCount; break; - case GuiListControl::PageDown: + case KeyDirection::PageDown: itemIndex+=groupCount-itemIndex%groupCount-1; break; default: @@ -10820,9 +10463,9 @@ ListViewBigIconContentProvider { } - GuiListControl::IItemCoordinateTransformer* ListViewBigIconContentProvider::CreatePreferredCoordinateTransformer() + compositions::IGuiAxis* ListViewBigIconContentProvider::CreatePreferredAxis() { - return new DefaultItemCoordinateTransformer; + return new GuiDefaultAxis; } GuiListControl::IItemArranger* ListViewBigIconContentProvider::CreatePreferredArranger() @@ -10934,9 +10577,9 @@ ListViewSmallIconContentProvider { } - GuiListControl::IItemCoordinateTransformer* ListViewSmallIconContentProvider::CreatePreferredCoordinateTransformer() + compositions::IGuiAxis* ListViewSmallIconContentProvider::CreatePreferredAxis() { - return new DefaultItemCoordinateTransformer; + return new GuiDefaultAxis; } GuiListControl::IItemArranger* ListViewSmallIconContentProvider::CreatePreferredArranger() @@ -11047,9 +10690,9 @@ ListViewListContentProvider { } - GuiListControl::IItemCoordinateTransformer* ListViewListContentProvider::CreatePreferredCoordinateTransformer() + compositions::IGuiAxis* ListViewListContentProvider::CreatePreferredAxis() { - return new DefaultItemCoordinateTransformer; + return new GuiDefaultAxis; } GuiListControl::IItemArranger* ListViewListContentProvider::CreatePreferredArranger() @@ -11211,9 +10854,9 @@ ListViewTileContentProvider { } - GuiListControl::IItemCoordinateTransformer* ListViewTileContentProvider::CreatePreferredCoordinateTransformer() + compositions::IGuiAxis* ListViewTileContentProvider::CreatePreferredAxis() { - return new DefaultItemCoordinateTransformer; + return new GuiDefaultAxis; } GuiListControl::IItemArranger* ListViewTileContentProvider::CreatePreferredArranger() @@ -11401,9 +11044,9 @@ ListViewInformationContentProvider { } - GuiListControl::IItemCoordinateTransformer* ListViewInformationContentProvider::CreatePreferredCoordinateTransformer() + compositions::IGuiAxis* ListViewInformationContentProvider::CreatePreferredAxis() { - return new DefaultItemCoordinateTransformer; + return new GuiDefaultAxis; } GuiListControl::IItemArranger* ListViewInformationContentProvider::CreatePreferredArranger() @@ -11839,9 +11482,9 @@ ListViewDetailContentProvider { } - GuiListControl::IItemCoordinateTransformer* ListViewDetailContentProvider::CreatePreferredCoordinateTransformer() + compositions::IGuiAxis* ListViewDetailContentProvider::CreatePreferredAxis() { - return new DefaultItemCoordinateTransformer; + return new GuiDefaultAxis; } GuiListControl::IItemArranger* ListViewDetailContentProvider::CreatePreferredArranger() @@ -12309,7 +11952,7 @@ GuiListView { SetStyleProvider(0); SetArranger(0); - SetCoordinateTransformer(contentProvider->CreatePreferredCoordinateTransformer()); + SetAxis(contentProvider->CreatePreferredAxis()); SetStyleProvider(new list::ListViewItemStyleProvider(contentProvider)); SetArranger(contentProvider->CreatePreferredArranger()); return true; @@ -32252,6 +31895,377 @@ GuiToolstripButton } } +/*********************************************************************** +GRAPHICSCOMPOSITION\GUIGRAPHICSAXIS.CPP +***********************************************************************/ + +namespace vl +{ + namespace presentation + { + namespace compositions + { + +/*********************************************************************** +GuiDefaultAxis +***********************************************************************/ + + GuiDefaultAxis::GuiDefaultAxis() + { + } + + GuiDefaultAxis::~GuiDefaultAxis() + { + } + + Size GuiDefaultAxis::RealSizeToVirtualSize(Size size) + { + return size; + } + + Size GuiDefaultAxis::VirtualSizeToRealSize(Size size) + { + return size; + } + + Point GuiDefaultAxis::RealPointToVirtualPoint(Size realFullSize, Point point) + { + return point; + } + + Point GuiDefaultAxis::VirtualPointToRealPoint(Size realFullSize, Point point) + { + return point; + } + + Rect GuiDefaultAxis::RealRectToVirtualRect(Size realFullSize, Rect rect) + { + return rect; + } + + Rect GuiDefaultAxis::VirtualRectToRealRect(Size realFullSize, Rect rect) + { + return rect; + } + + Margin GuiDefaultAxis::RealMarginToVirtualMargin(Margin margin) + { + return margin; + } + + Margin GuiDefaultAxis::VirtualMarginToRealMargin(Margin margin) + { + return margin; + } + + KeyDirection GuiDefaultAxis::RealKeyDirectionToVirtualKeyDirection(KeyDirection key) + { + return key; + } + +/*********************************************************************** +GuiAxis +***********************************************************************/ + + GuiAxis::GuiAxis(AxisDirection _axisDirection) + :axisDirection(_axisDirection) + { + } + + GuiAxis::~GuiAxis() + { + } + + AxisDirection GuiAxis::GetAlignment() + { + return axisDirection; + } + + Size GuiAxis::RealSizeToVirtualSize(Size size) + { + switch(axisDirection) + { + case AxisDirection::LeftDown: + case AxisDirection::RightDown: + case AxisDirection::LeftUp: + case AxisDirection::RightUp: + return Size(size.x, size.y); + case AxisDirection::DownLeft: + case AxisDirection::DownRight: + case AxisDirection::UpLeft: + case AxisDirection::UpRight: + return Size(size.y, size.x); + } + return size; + } + + Size GuiAxis::VirtualSizeToRealSize(Size size) + { + return RealSizeToVirtualSize(size); + } + + Point GuiAxis::RealPointToVirtualPoint(Size realFullSize, Point point) + { + Rect rect(point, Size(0, 0)); + return RealRectToVirtualRect(realFullSize, rect).LeftTop(); + } + + Point GuiAxis::VirtualPointToRealPoint(Size realFullSize, Point point) + { + Rect rect(point, Size(0, 0)); + return VirtualRectToRealRect(realFullSize, rect).LeftTop(); + } + + Rect GuiAxis::RealRectToVirtualRect(Size realFullSize, Rect rect) + { + vint x1=rect.x1; + vint x2=realFullSize.x-rect.x2; + vint y1=rect.y1; + vint y2=realFullSize.y-rect.y2; + vint w=rect.Width(); + vint h=rect.Height(); + switch(axisDirection) + { + case AxisDirection::LeftDown: + return Rect(Point(x2, y1), Size(w, h)); + case AxisDirection::RightDown: + return Rect(Point(x1, y1), Size(w, h)); + case AxisDirection::LeftUp: + return Rect(Point(x2, y2), Size(w, h)); + case AxisDirection::RightUp: + return Rect(Point(x1, y2), Size(w, h)); + case AxisDirection::DownLeft: + return Rect(Point(y1, x2), Size(h, w)); + case AxisDirection::DownRight: + return Rect(Point(y1, x1), Size(h, w)); + case AxisDirection::UpLeft: + return Rect(Point(y2, x2), Size(h, w)); + case AxisDirection::UpRight: + return Rect(Point(y2, x1), Size(h, w)); + } + return rect; + } + + Rect GuiAxis::VirtualRectToRealRect(Size realFullSize, Rect rect) + { + realFullSize=RealSizeToVirtualSize(realFullSize); + vint x1=rect.x1; + vint x2=realFullSize.x-rect.x2; + vint y1=rect.y1; + vint y2=realFullSize.y-rect.y2; + vint w=rect.Width(); + vint h=rect.Height(); + switch(axisDirection) + { + case AxisDirection::LeftDown: + return Rect(Point(x2, y1), Size(w, h)); + case AxisDirection::RightDown: + return Rect(Point(x1, y1), Size(w, h)); + case AxisDirection::LeftUp: + return Rect(Point(x2, y2), Size(w, h)); + case AxisDirection::RightUp: + return Rect(Point(x1, y2), Size(w, h)); + case AxisDirection::DownLeft: + return Rect(Point(y2, x1), Size(h, w)); + case AxisDirection::DownRight: + return Rect(Point(y1, x1), Size(h, w)); + case AxisDirection::UpLeft: + return Rect(Point(y2, x2), Size(h, w)); + case AxisDirection::UpRight: + return Rect(Point(y1, x2), Size(h, w)); + } + return rect; + } + + Margin GuiAxis::RealMarginToVirtualMargin(Margin margin) + { + vint x1=margin.left; + vint x2=margin.right; + vint y1=margin.top; + vint y2=margin.bottom; + switch(axisDirection) + { + case AxisDirection::LeftDown: + return Margin(x2, y1, x1, y2); + case AxisDirection::RightDown: + return Margin(x1, y1, x2, y2); + case AxisDirection::LeftUp: + return Margin(x2, y2, x1, y1); + case AxisDirection::RightUp: + return Margin(x1, y2, x2, y1); + case AxisDirection::DownLeft: + return Margin(y1, x2, y2, x1); + case AxisDirection::DownRight: + return Margin(y1, x1, y2, x2); + case AxisDirection::UpLeft: + return Margin(y2, x2, y1, x1); + case AxisDirection::UpRight: + return Margin(y2, x1, y1, x2); + } + return margin; + } + + Margin GuiAxis::VirtualMarginToRealMargin(Margin margin) + { + vint x1=margin.left; + vint x2=margin.right; + vint y1=margin.top; + vint y2=margin.bottom; + switch(axisDirection) + { + case AxisDirection::LeftDown: + return Margin(x2, y1, x1, y2); + case AxisDirection::RightDown: + return Margin(x1, y1, x2, y2); + case AxisDirection::LeftUp: + return Margin(x2, y2, x1, y1); + case AxisDirection::RightUp: + return Margin(x1, y2, x2, y1); + case AxisDirection::DownLeft: + return Margin(y2, x1, y1, x2); + case AxisDirection::DownRight: + return Margin(y1, x1, y2, x2); + case AxisDirection::UpLeft: + return Margin(y2, x2, y1, x1); + case AxisDirection::UpRight: + return Margin(y1, x2, y2, x1); + default:; + } + return margin; + } + + KeyDirection GuiAxis::RealKeyDirectionToVirtualKeyDirection(KeyDirection key) + { + bool pageKey=false; + switch(key) + { + case KeyDirection::PageUp: + pageKey=true; + key=KeyDirection::Up; + break; + case KeyDirection::PageDown: + pageKey=true; + key=KeyDirection::Down; + break; + case KeyDirection::PageLeft: + pageKey=true; + key=KeyDirection::Left; + break; + case KeyDirection::PageRight: + pageKey=true; + key=KeyDirection::Right; + break; + default:; + } + + switch(key) + { + case KeyDirection::Up: + switch(axisDirection) + { + case AxisDirection::LeftDown: key=KeyDirection::Up; break; + case AxisDirection::RightDown: key=KeyDirection::Up; break; + case AxisDirection::LeftUp: key=KeyDirection::Down; break; + case AxisDirection::RightUp: key=KeyDirection::Down; break; + case AxisDirection::DownLeft: key=KeyDirection::Left; break; + case AxisDirection::DownRight: key=KeyDirection::Left; break; + case AxisDirection::UpLeft: key=KeyDirection::Right; break; + case AxisDirection::UpRight: key=KeyDirection::Right; break; + } + break; + case KeyDirection::Down: + switch(axisDirection) + { + case AxisDirection::LeftDown: key=KeyDirection::Down; break; + case AxisDirection::RightDown: key=KeyDirection::Down; break; + case AxisDirection::LeftUp: key=KeyDirection::Up; break; + case AxisDirection::RightUp: key=KeyDirection::Up; break; + case AxisDirection::DownLeft: key=KeyDirection::Right; break; + case AxisDirection::DownRight: key=KeyDirection::Right; break; + case AxisDirection::UpLeft: key=KeyDirection::Left; break; + case AxisDirection::UpRight: key=KeyDirection::Left; break; + } + break; + case KeyDirection::Left: + switch(axisDirection) + { + case AxisDirection::LeftDown: key=KeyDirection::Right; break; + case AxisDirection::RightDown: key=KeyDirection::Left; break; + case AxisDirection::LeftUp: key=KeyDirection::Right; break; + case AxisDirection::RightUp: key=KeyDirection::Left; break; + case AxisDirection::DownLeft: key=KeyDirection::Down; break; + case AxisDirection::DownRight: key=KeyDirection::Up; break; + case AxisDirection::UpLeft: key=KeyDirection::Down; break; + case AxisDirection::UpRight: key=KeyDirection::Up; break; + } + break; + case KeyDirection::Right: + switch(axisDirection) + { + case AxisDirection::LeftDown: key=KeyDirection::Left; break; + case AxisDirection::RightDown: key=KeyDirection::Right; break; + case AxisDirection::LeftUp: key=KeyDirection::Left; break; + case AxisDirection::RightUp: key=KeyDirection::Right; break; + case AxisDirection::DownLeft: key=KeyDirection::Up; break; + case AxisDirection::DownRight: key=KeyDirection::Down; break; + case AxisDirection::UpLeft: key=KeyDirection::Up; break; + case AxisDirection::UpRight: key=KeyDirection::Down; break; + } + break; + case KeyDirection::Home: + switch(axisDirection) + { + case AxisDirection::LeftDown: key=KeyDirection::Home; break; + case AxisDirection::RightDown: key=KeyDirection::Home; break; + case AxisDirection::LeftUp: key=KeyDirection::End; break; + case AxisDirection::RightUp: key=KeyDirection::End; break; + case AxisDirection::DownLeft: key=KeyDirection::Home; break; + case AxisDirection::DownRight: key=KeyDirection::Home; break; + case AxisDirection::UpLeft: key=KeyDirection::End; break; + case AxisDirection::UpRight: key=KeyDirection::End; break; + } + break; + case KeyDirection::End: + switch(axisDirection) + { + case AxisDirection::LeftDown: key=KeyDirection::End; break; + case AxisDirection::RightDown: key=KeyDirection::End; break; + case AxisDirection::LeftUp: key=KeyDirection::Home; break; + case AxisDirection::RightUp: key=KeyDirection::Home; break; + case AxisDirection::DownLeft: key=KeyDirection::End; break; + case AxisDirection::DownRight: key=KeyDirection::End; break; + case AxisDirection::UpLeft: key=KeyDirection::Home; break; + case AxisDirection::UpRight: key=KeyDirection::Home; break; + } + break; + default:; + } + + if(pageKey) + { + switch(key) + { + case KeyDirection::Up: + key=KeyDirection::PageUp; + break; + case KeyDirection::Down: + key=KeyDirection::PageDown; + break; + case KeyDirection::Left: + key=KeyDirection::PageLeft; + break; + case KeyDirection::Right: + key=KeyDirection::PageRight; + break; + default:; + } + } + return key; + } + } + } +} + /*********************************************************************** GRAPHICSCOMPOSITION\GUIGRAPHICSBASICCOMPOSITION.CPP ***********************************************************************/ @@ -33282,6 +33296,384 @@ Event Receiver } } +/*********************************************************************** +GRAPHICSCOMPOSITION\GUIGRAPHICSFLOWCOMPOSITION.CPP +***********************************************************************/ + +namespace vl +{ + namespace presentation + { + namespace compositions + { + using namespace collections; + +/*********************************************************************** +GuiFlowComposition +***********************************************************************/ + + void GuiFlowComposition::UpdateFlowItemBounds(bool forceUpdate) + { + if (forceUpdate || needUpdate) + { + needUpdate = false; + auto clientMargin = axis->RealMarginToVirtualMargin(extraMargin); + if (clientMargin.left < 0) clientMargin.left = 0; + if (clientMargin.top < 0) clientMargin.top = 0; + if (clientMargin.right < 0) clientMargin.right = 0; + if (clientMargin.bottom < 0) clientMargin.bottom = 0; + + auto realFullSize = previousBounds.GetSize(); + auto clientSize = axis->RealSizeToVirtualSize(realFullSize); + clientSize.x -= (clientMargin.left + clientMargin.right); + clientSize.y -= (clientMargin.top + clientMargin.bottom); + + flowItemBounds.Resize(flowItems.Count()); + for (vint i = 0; i < flowItems.Count(); i++) + { + flowItemBounds[i] = Rect(Point(0, 0), flowItems[i]->GetMinSize()); + } + + vint currentIndex = 0; + vint rowTop = 0; + + while (currentIndex < flowItems.Count()) + { + auto itemSize = axis->RealSizeToVirtualSize(flowItemBounds[currentIndex].GetSize()); + vint rowWidth = itemSize.x; + vint rowHeight = itemSize.y; + vint rowItemCount = 1; + + for (vint i = currentIndex + 1; i < flowItems.Count(); i++) + { + itemSize = axis->RealSizeToVirtualSize(flowItemBounds[i].GetSize()); + vint itemWidth = itemSize.x + columnPadding; + if (rowWidth + itemWidth > clientSize.x) + { + break; + } + rowWidth += itemWidth; + if (rowHeight < itemSize.y) + { + rowHeight = itemSize.y; + } + rowItemCount++; + } + + vint baseLine = 0; + Array itemBaseLines(rowItemCount); + for (vint i = 0; i < rowItemCount; i++) + { + vint index = currentIndex + i; + vint itemBaseLine = 0; + itemSize = axis->RealSizeToVirtualSize(flowItemBounds[index].GetSize()); + + auto option = flowItems[index]->GetFlowOption(); + switch (option.baseline) + { + case GuiFlowOption::FromTop: + itemBaseLine = option.distance; + break; + case GuiFlowOption::FromBottom: + itemBaseLine = itemSize.y - option.distance; + break; + case GuiFlowOption::Percentage: + itemBaseLine = (vint)(itemSize.y*option.percentage); + break; + } + + itemBaseLines[i] = itemBaseLine; + if (baseLine < itemBaseLine) + { + baseLine = itemBaseLine; + } + } + + vint rowUsedWidth = 0; + for (vint i = 0; i < rowItemCount; i++) + { + vint index = currentIndex + i; + itemSize = axis->RealSizeToVirtualSize(flowItemBounds[index].GetSize()); + + vint itemLeft = 0; + vint itemTop = rowTop + baseLine - itemBaseLines[i]; + + switch (alignment) + { + case FlowAlignment::Left: + itemLeft = rowUsedWidth + i * columnPadding; + break; + case FlowAlignment::Center: + itemLeft = rowUsedWidth + i * columnPadding + (clientSize.x - rowWidth) / 2; + break; + case FlowAlignment::Extend: + if (i == 0) + { + itemLeft = rowUsedWidth; + } + else + { + itemLeft = rowUsedWidth + (vint)((double)(clientSize.x - rowWidth) * i / (rowItemCount - 1)) + i * columnPadding; + } + break; + } + + flowItemBounds[index] = axis->VirtualRectToRealRect( + realFullSize, + Rect( + Point( + itemLeft + clientMargin.left, + itemTop + clientMargin.top + ), + itemSize + ) + ); + rowUsedWidth += itemSize.x; + } + + rowTop += rowHeight + rowPadding; + currentIndex += rowItemCount; + } + + minHeight = rowTop == 0 ? 0 : rowTop - rowPadding; + } + } + + void GuiFlowComposition::OnBoundsChanged(GuiGraphicsComposition* sender, GuiEventArgs& arguments) + { + UpdateFlowItemBounds(true); + } + + void GuiFlowComposition::OnChildInserted(GuiGraphicsComposition* child) + { + GuiBoundsComposition::OnChildInserted(child); + auto item = dynamic_cast(child); + if (item && !flowItems.Contains(item)) + { + flowItems.Add(item); + needUpdate = true; + } + } + + void GuiFlowComposition::OnChildRemoved(GuiGraphicsComposition* child) + { + GuiBoundsComposition::OnChildRemoved(child); + auto item=dynamic_cast(child); + if(item) + { + flowItems.Remove(item); + needUpdate = true; + } + } + + GuiFlowComposition::GuiFlowComposition() + :axis(new GuiDefaultAxis) + { + BoundsChanged.AttachMethod(this, &GuiFlowComposition::OnBoundsChanged); + } + + GuiFlowComposition::~GuiFlowComposition() + { + } + + const GuiFlowComposition::ItemCompositionList& GuiFlowComposition::GetFlowItems() + { + return flowItems; + } + + Margin GuiFlowComposition::GetExtraMargin() + { + return extraMargin; + } + + void GuiFlowComposition::SetExtraMargin(Margin value) + { + extraMargin = value; + needUpdate = true; + } + + vint GuiFlowComposition::GetRowPadding() + { + return rowPadding; + } + + void GuiFlowComposition::SetRowPadding(vint value) + { + rowPadding = value; + needUpdate = true; + } + + vint GuiFlowComposition::GetColumnPadding() + { + return columnPadding; + } + + void GuiFlowComposition::SetColumnPadding(vint value) + { + columnPadding = value; + needUpdate = true; + } + + Ptr GuiFlowComposition::GetAxis() + { + return axis; + } + + void GuiFlowComposition::SetAxis(Ptr value) + { + if (value) + { + axis = value; + needUpdate = true; + } + } + + FlowAlignment GuiFlowComposition::GetAlignment() + { + return alignment; + } + + void GuiFlowComposition::SetAlignment(FlowAlignment value) + { + alignment = value; + needUpdate = true; + } + + Size GuiFlowComposition::GetMinPreferredClientSize() + { + Size minSize = GuiBoundsComposition::GetMinPreferredClientSize(); + if (GetMinSizeLimitation() == GuiGraphicsComposition::LimitToElementAndChildren) + { + auto clientMargin = extraMargin; + if (clientMargin.left < 0) clientMargin.left = 0; + if (clientMargin.top < 0) clientMargin.top = 0; + if (clientMargin.right < 0) clientMargin.right = 0; + if (clientMargin.bottom < 0) clientMargin.bottom = 0; + + auto clientSize = axis->VirtualSizeToRealSize(Size(0, minHeight)); + clientSize.x += clientMargin.left + clientMargin.right; + clientSize.y += clientMargin.top + clientMargin.bottom; + + if (minSize.x < clientSize.x) minSize.x = clientSize.x; + if (minSize.y < clientSize.y) minSize.y = clientSize.y; + } + + vint x = 0; + vint y = 0; + if (extraMargin.left > 0) x += extraMargin.left; + if (extraMargin.right > 0) x += extraMargin.right; + if (extraMargin.top > 0) y += extraMargin.top; + if (extraMargin.bottom > 0) y += extraMargin.bottom; + return minSize + Size(x, y); + } + + Rect GuiFlowComposition::GetBounds() + { + if (!needUpdate) + { + for (vint i = 0; i < flowItems.Count(); i++) + { + if (flowItemBounds[i].GetSize() != flowItems[i]->GetMinSize()) + { + needUpdate = true; + break; + } + } + } + + if (needUpdate) + { + UpdateFlowItemBounds(true); + } + + bounds = GuiBoundsComposition::GetBounds(); + return bounds; + } + +/*********************************************************************** +GuiFlowItemComposition +***********************************************************************/ + + void GuiFlowItemComposition::OnParentChanged(GuiGraphicsComposition* oldParent, GuiGraphicsComposition* newParent) + { + GuiGraphicsSite::OnParentChanged(oldParent, newParent); + flowParent = newParent == 0 ? 0 : dynamic_cast(newParent); + } + + Size GuiFlowItemComposition::GetMinSize() + { + return GetBoundsInternal(bounds).GetSize(); + } + + GuiFlowItemComposition::GuiFlowItemComposition() + { + SetMinSizeLimitation(GuiGraphicsComposition::LimitToElementAndChildren); + } + + GuiFlowItemComposition::~GuiFlowItemComposition() + { + } + + bool GuiFlowItemComposition::IsSizeAffectParent() + { + return false; + } + + Rect GuiFlowItemComposition::GetBounds() + { + Rect result = bounds; + if(flowParent) + { + flowParent->UpdateFlowItemBounds(false); + vint index = flowParent->flowItems.IndexOf(this); + if (index != -1) + { + result = flowParent->flowItemBounds[index]; + } + + result = Rect( + result.Left() - extraMargin.left, + result.Top() - extraMargin.top, + result.Right() + extraMargin.right, + result.Bottom() + extraMargin.bottom + ); + } + UpdatePreviousBounds(result); + return result; + } + + void GuiFlowItemComposition::SetBounds(Rect value) + { + bounds = value; + } + + Margin GuiFlowItemComposition::GetExtraMargin() + { + return extraMargin; + } + + void GuiFlowItemComposition::SetExtraMargin(Margin value) + { + extraMargin = value; + } + + GuiFlowOption GuiFlowItemComposition::GetFlowOption() + { + return option; + } + + void GuiFlowItemComposition::SetFlowOption(GuiFlowOption value) + { + option = value; + if (flowParent) + { + flowParent->needUpdate = true; + } + } + } + } +} + /*********************************************************************** GRAPHICSCOMPOSITION\GUIGRAPHICSSPECIALIZEDCOMPOSITION.CPP ***********************************************************************/ @@ -33579,7 +33971,7 @@ GuiStackComposition void GuiStackComposition::OnBoundsChanged(GuiGraphicsComposition* sender, GuiEventArgs& arguments) { - UpdateStackItemBounds(); + EnsureStackItemVisible(); } void GuiStackComposition::OnChildInserted(GuiGraphicsComposition* child) @@ -33655,12 +34047,12 @@ GuiStackComposition void GuiStackComposition::SetPadding(vint value) { padding = value; + EnsureStackItemVisible(); } Size GuiStackComposition::GetMinPreferredClientSize() { Size minSize = GuiBoundsComposition::GetMinPreferredClientSize(); - UpdateStackItemBounds(); if (GetMinSizeLimitation() == GuiGraphicsComposition::LimitToElementAndChildren) { if (!ensuringVisibleStackItem || direction == Vertical || direction == ReversedVertical) @@ -33690,9 +34082,18 @@ GuiStackComposition Rect GuiStackComposition::GetBounds() { + for (vint i = 0; i < stackItems.Count(); i++) + { + if (stackItemBounds[i].GetSize() != stackItems[i]->GetMinSize()) + { + UpdateStackItemBounds(); + break; + } + } + Rect bounds = GuiBoundsComposition::GetBounds(); previousBounds = bounds; - EnsureStackItemVisible(); + UpdatePreviousBounds(previousBounds); return bounds; } @@ -33704,6 +34105,7 @@ GuiStackComposition void GuiStackComposition::SetExtraMargin(Margin value) { extraMargin=value; + EnsureStackItemVisible(); } bool GuiStackComposition::IsStackItemClipped() diff --git a/Import/GacUI.h b/Import/GacUI.h index 007be29f..0dad1677 100644 --- a/Import/GacUI.h +++ b/Import/GacUI.h @@ -62,6 +62,27 @@ Enumerations Bottom=2, }; + /// Axis direction. + enum class AxisDirection + { + /// X:left, Y:down. + LeftDown, + /// X:right, Y:down. + RightDown, + /// X:left, Y:up. + LeftUp, + /// X:right, Y:up. + RightUp, + /// X:down, Y:left. + DownLeft, + /// X:down, Y:right. + DownRight, + /// X:up, Y:left. + UpLeft, + /// X:up, Y:right. + UpRight, + }; + /*********************************************************************** TextPos ***********************************************************************/ @@ -6800,6 +6821,278 @@ Stack Compositions #endif +/*********************************************************************** +GRAPHICSCOMPOSITION\GUIGRAPHICSAXIS.H +***********************************************************************/ +/*********************************************************************** +Vczh Library++ 3.0 +Developer: Zihan Chen(vczh) +GacUI::Composition System + +Interfaces: +***********************************************************************/ + +#ifndef VCZH_PRESENTATION_ELEMENTS_GUIGRAPHICSAXIS +#define VCZH_PRESENTATION_ELEMENTS_GUIGRAPHICSAXIS + + +namespace vl +{ + namespace presentation + { + namespace compositions + { + +/*********************************************************************** +Axis Interface +***********************************************************************/ + + /// Represents the four directions that is accessable by keyboard. + enum class KeyDirection + { + /// The up direction. + Up, + /// The down direction. + Down, + /// The left direction. + Left, + /// The right direction. + Right, + /// The home direction. + Home, + /// The end direction. + End, + /// The page up direction. + PageUp, + /// The page down direction. + PageDown, + /// The page left direction. + PageLeft, + /// The page right direction. + PageRight, + }; + + /// Item coordinate transformer for a . In all functions in this interface, real coordinate is in the list control's container space, virtual coordinate is in a space that the transformer created. + class IGuiAxis : public virtual IDescriptable, public Description + { + public: + /// Translate real size to virtual size. + /// The virtual size. + /// The real size. + virtual Size RealSizeToVirtualSize(Size size)=0; + /// Translate virtual size to real size. + /// The real size. + /// The virtual size. + virtual Size VirtualSizeToRealSize(Size size)=0; + /// Translate real point to virtual point. + /// The virtual point. + /// The real full size. + /// The real point. + virtual Point RealPointToVirtualPoint(Size realFullSize, Point point)=0; + /// Translate virtual point to real point. + /// The real point. + /// The real full size. + /// The virtual point. + virtual Point VirtualPointToRealPoint(Size realFullSize, Point point)=0; + /// Translate real bounds to virtual bounds. + /// The virtual bounds. + /// The real full size. + /// The real bounds. + virtual Rect RealRectToVirtualRect(Size realFullSize, Rect rect)=0; + /// Translate virtual bounds to real bounds. + /// The real bounds. + /// The real full size. + /// The virtual bounds. + virtual Rect VirtualRectToRealRect(Size realFullSize, Rect rect)=0; + /// Translate real margin to margin size. + /// The virtual margin. + /// The real margin. + virtual Margin RealMarginToVirtualMargin(Margin margin)=0; + /// Translate virtual margin to margin size. + /// The real margin. + /// The virtual margin. + virtual Margin VirtualMarginToRealMargin(Margin margin)=0; + /// Translate real key direction to virtual key direction. + /// The virtual key direction. + /// The real key direction. + virtual KeyDirection RealKeyDirectionToVirtualKeyDirection(KeyDirection key)=0; + }; + +/*********************************************************************** +Axis Implementation +***********************************************************************/ + + /// Default item coordinate transformer. This transformer doesn't transform any coordinate. + class GuiDefaultAxis : public Object, virtual public IGuiAxis, public Description + { + public: + /// Create the transformer. + GuiDefaultAxis(); + ~GuiDefaultAxis(); + + Size RealSizeToVirtualSize(Size size)override; + Size VirtualSizeToRealSize(Size size)override; + Point RealPointToVirtualPoint(Size realFullSize, Point point)override; + Point VirtualPointToRealPoint(Size realFullSize, Point point)override; + Rect RealRectToVirtualRect(Size realFullSize, Rect rect)override; + Rect VirtualRectToRealRect(Size realFullSize, Rect rect)override; + Margin RealMarginToVirtualMargin(Margin margin)override; + Margin VirtualMarginToRealMargin(Margin margin)override; + KeyDirection RealKeyDirectionToVirtualKeyDirection(KeyDirection key)override; + }; + + /// Axis aligned item coordinate transformer. This transformer transforms coordinates by changing the axis direction. + class GuiAxis : public Object, virtual public IGuiAxis, public Description + { + protected: + AxisDirection axisDirection; + + public: + /// Create the transformer with a specified axis direction. + /// The specified axis direction. + GuiAxis(AxisDirection _axisDirection); + ~GuiAxis(); + + /// Get the specified axis direction. + /// The specified axis direction. + AxisDirection GetAlignment(); + Size RealSizeToVirtualSize(Size size)override; + Size VirtualSizeToRealSize(Size size)override; + Point RealPointToVirtualPoint(Size realFullSize, Point point)override; + Point VirtualPointToRealPoint(Size realFullSize, Point point)override; + Rect RealRectToVirtualRect(Size realFullSize, Rect rect)override; + Rect VirtualRectToRealRect(Size realFullSize, Rect rect)override; + Margin RealMarginToVirtualMargin(Margin margin)override; + Margin VirtualMarginToRealMargin(Margin margin)override; + KeyDirection RealKeyDirectionToVirtualKeyDirection(KeyDirection key)override; + }; + } + } +} + +#endif + +/*********************************************************************** +GRAPHICSCOMPOSITION\GUIGRAPHICSFLOWCOMPOSITION.H +***********************************************************************/ +/*********************************************************************** +Vczh Library++ 3.0 +Developer: Zihan Chen(vczh) +GacUI::Composition System + +Interfaces: +***********************************************************************/ + +#ifndef VCZH_PRESENTATION_ELEMENTS_GUIGRAPHICSFLOWCOMPOSITION +#define VCZH_PRESENTATION_ELEMENTS_GUIGRAPHICSFLOWCOMPOSITION + + +namespace vl +{ + namespace presentation + { + namespace compositions + { + +/*********************************************************************** +Flow Compositions +***********************************************************************/ + + enum class FlowAlignment + { + Left, + Center, + Extend, + }; + + class GuiFlowComposition : public GuiBoundsComposition, public Description + { + friend class GuiFlowItemComposition; + + typedef collections::List ItemCompositionList; + protected: + Margin extraMargin; + vint rowPadding = 0; + vint columnPadding = 0; + FlowAlignment alignment = FlowAlignment::Left; + Ptr axis; + + ItemCompositionList flowItems; + collections::Array flowItemBounds; + Rect bounds; + vint minHeight = 0; + bool needUpdate = false; + + void UpdateFlowItemBounds(bool forceUpdate); + void OnBoundsChanged(GuiGraphicsComposition* sender, GuiEventArgs& arguments); + void OnChildInserted(GuiGraphicsComposition* child)override; + void OnChildRemoved(GuiGraphicsComposition* child)override; + public: + GuiFlowComposition(); + ~GuiFlowComposition(); + + const ItemCompositionList& GetFlowItems(); + + Margin GetExtraMargin(); + void SetExtraMargin(Margin value); + vint GetRowPadding(); + void SetRowPadding(vint value); + vint GetColumnPadding(); + void SetColumnPadding(vint value); + Ptr GetAxis(); + void SetAxis(Ptr value); + FlowAlignment GetAlignment(); + void SetAlignment(FlowAlignment value); + + Size GetMinPreferredClientSize()override; + Rect GetBounds()override; + }; + + struct GuiFlowOption + { + enum BaselineType + { + Percentage, + FromTop, + FromBottom, + }; + + BaselineType baseline = FromBottom; + double percentage = 0.0; + vint distance = 0; + }; + + class GuiFlowItemComposition : public GuiGraphicsSite, public Description + { + friend class GuiFlowComposition; + protected: + GuiFlowComposition* flowParent; + Rect bounds; + Margin extraMargin; + GuiFlowOption option; + + void OnParentChanged(GuiGraphicsComposition* oldParent, GuiGraphicsComposition* newParent)override; + Size GetMinSize(); + public: + GuiFlowItemComposition(); + ~GuiFlowItemComposition(); + + bool IsSizeAffectParent()override; + Rect GetBounds()override; + void SetBounds(Rect value); + + Margin GetExtraMargin(); + void SetExtraMargin(Margin value); + + GuiFlowOption GetFlowOption(); + void SetFlowOption(GuiFlowOption value); + }; + } + } +} + +#endif + /*********************************************************************** GRAPHICSCOMPOSITION\GUIGRAPHICSSPECIALIZEDCOMPOSITION.H ***********************************************************************/ @@ -9845,31 +10138,6 @@ List Control // Provider Interfaces //----------------------------------------------------------- - /// Represents the four directions that is accessable by keyboard. - enum KeyDirection - { - /// The up direction. - Up, - /// The down direction. - Down, - /// The left direction. - Left, - /// The right direction. - Right, - /// The home direction. - Home, - /// The end direction. - End, - /// The page up direction. - PageUp, - /// The page down direction. - PageDown, - /// The page left direction. - PageLeft, - /// The page right direction. - PageRight, - }; - /// Item provider for a . class IItemProvider : public virtual IDescriptable, public Description { @@ -9982,58 +10250,12 @@ List Control /// The item index that is found. Returns -1 if this operation failed. /// The base item index. /// The key direction. - virtual vint FindItem(vint itemIndex, KeyDirection key)=0; + virtual vint FindItem(vint itemIndex, compositions::KeyDirection key)=0; /// Adjust the view location to make an item visible. /// Returns true if this operation succeeded. /// The item index of the item to be made visible. virtual bool EnsureItemVisible(vint itemIndex)=0; }; - - /// Item coordinate transformer for a . In all functions in this interface, real coordinate is in the list control's container space, virtual coordinate is in a space that the transformer created. - class IItemCoordinateTransformer : public virtual IDescriptable, public Description - { - public: - /// Translate real size to virtual size. - /// The virtual size. - /// The real size. - virtual Size RealSizeToVirtualSize(Size size)=0; - /// Translate virtual size to real size. - /// The real size. - /// The virtual size. - virtual Size VirtualSizeToRealSize(Size size)=0; - /// Translate real point to virtual point. - /// The virtual point. - /// The real full size. - /// The real point. - virtual Point RealPointToVirtualPoint(Size realFullSize, Point point)=0; - /// Translate virtual point to real point. - /// The real point. - /// The real full size. - /// The virtual point. - virtual Point VirtualPointToRealPoint(Size realFullSize, Point point)=0; - /// Translate real bounds to virtual bounds. - /// The virtual bounds. - /// The real full size. - /// The real bounds. - virtual Rect RealRectToVirtualRect(Size realFullSize, Rect rect)=0; - /// Translate virtual bounds to real bounds. - /// The real bounds. - /// The real full size. - /// The virtual bounds. - virtual Rect VirtualRectToRealRect(Size realFullSize, Rect rect)=0; - /// Translate real margin to margin size. - /// The virtual margin. - /// The real margin. - virtual Margin RealMarginToVirtualMargin(Margin margin)=0; - /// Translate virtual margin to margin size. - /// The real margin. - /// The virtual margin. - virtual Margin VirtualMarginToRealMargin(Margin margin)=0; - /// Translate real key direction to virtual key direction. - /// The virtual key direction. - /// The real key direction. - virtual KeyDirection RealKeyDirectionToVirtualKeyDirection(KeyDirection key)=0; - }; protected: @@ -10077,7 +10299,7 @@ List Control Ptr itemProvider; Ptr itemStyleProvider; Ptr itemArranger; - Ptr itemCoordinateTransformer; + Ptr axis; Size fullSize; virtual void OnItemModified(vint start, vint count, vint newCount); @@ -10133,7 +10355,7 @@ List Control /// Arranger changed event. compositions::GuiNotifyEvent ArrangerChanged; /// Coordinate transformer changed event. - compositions::GuiNotifyEvent CoordinateTransformerChanged; + compositions::GuiNotifyEvent AxisChanged; /// Item left mouse button down event. compositions::GuiItemMouseEvent ItemLeftButtonDown; @@ -10179,11 +10401,11 @@ List Control virtual Ptr SetArranger(Ptr value); /// Get the item coordinate transformer. /// The item coordinate transformer. - virtual IItemCoordinateTransformer* GetCoordinateTransformer(); + virtual compositions::IGuiAxis* GetAxis(); /// Set the item coordinate transformer /// The old item coordinate transformer /// The new item coordinate transformer - virtual Ptr SetCoordinateTransformer(Ptr value); + virtual Ptr SetAxis(Ptr value); /// Adjust the view location to make an item visible. /// Returns true if this operation succeeded. /// The item index of the item to be made visible. @@ -10280,79 +10502,6 @@ Selectable List Control void ClearSelection(); }; -/*********************************************************************** -Predefined ItemCoordinateTransformer -***********************************************************************/ - - namespace list - { - /// Default item coordinate transformer. This transformer doesn't transform any coordinate. - class DefaultItemCoordinateTransformer : public Object, virtual public GuiListControl::IItemCoordinateTransformer, public Description - { - public: - /// Create the transformer. - DefaultItemCoordinateTransformer(); - ~DefaultItemCoordinateTransformer(); - - Size RealSizeToVirtualSize(Size size)override; - Size VirtualSizeToRealSize(Size size)override; - Point RealPointToVirtualPoint(Size realFullSize, Point point)override; - Point VirtualPointToRealPoint(Size realFullSize, Point point)override; - Rect RealRectToVirtualRect(Size realFullSize, Rect rect)override; - Rect VirtualRectToRealRect(Size realFullSize, Rect rect)override; - Margin RealMarginToVirtualMargin(Margin margin)override; - Margin VirtualMarginToRealMargin(Margin margin)override; - GuiListControl::KeyDirection RealKeyDirectionToVirtualKeyDirection(GuiListControl::KeyDirection key)override; - }; - - /// Axis aligned item coordinate transformer. This transformer transforms coordinates by changing the axis direction. - class AxisAlignedItemCoordinateTransformer : public Object, virtual public GuiListControl::IItemCoordinateTransformer, public Description - { - public: - /// Axis direction. - enum Alignment - { - /// X:left, Y:down. - LeftDown, - /// X:right, Y:down. - RightDown, - /// X:left, Y:up. - LeftUp, - /// X:right, Y:up. - RightUp, - /// X:down, Y:left. - DownLeft, - /// X:down, Y:right. - DownRight, - /// X:up, Y:left. - UpLeft, - /// X:up, Y:right. - UpRight, - }; - protected: - Alignment alignment; - - public: - /// Create the transformer with a specified axis direction. - /// The specified axis direction. - AxisAlignedItemCoordinateTransformer(Alignment _alignment); - ~AxisAlignedItemCoordinateTransformer(); - - /// Get the specified axis direction. - /// The specified axis direction. - Alignment GetAlignment(); - Size RealSizeToVirtualSize(Size size)override; - Size VirtualSizeToRealSize(Size size)override; - Point RealPointToVirtualPoint(Size realFullSize, Point point)override; - Point VirtualPointToRealPoint(Size realFullSize, Point point)override; - Rect RealRectToVirtualRect(Size realFullSize, Rect rect)override; - Rect VirtualRectToRealRect(Size realFullSize, Rect rect)override; - Margin RealMarginToVirtualMargin(Margin margin)override; - Margin VirtualMarginToRealMargin(Margin margin)override; - GuiListControl::KeyDirection RealKeyDirectionToVirtualKeyDirection(GuiListControl::KeyDirection key)override; - }; - }; - /*********************************************************************** Predefined ItemArranger ***********************************************************************/ @@ -10410,7 +10559,7 @@ Predefined ItemArranger FixedHeightItemArranger(); ~FixedHeightItemArranger(); - vint FindItem(vint itemIndex, GuiListControl::KeyDirection key)override; + vint FindItem(vint itemIndex, compositions::KeyDirection key)override; bool EnsureItemVisible(vint itemIndex)override; }; @@ -10431,7 +10580,7 @@ Predefined ItemArranger FixedSizeMultiColumnItemArranger(); ~FixedSizeMultiColumnItemArranger(); - vint FindItem(vint itemIndex, GuiListControl::KeyDirection key)override; + vint FindItem(vint itemIndex, compositions::KeyDirection key)override; bool EnsureItemVisible(vint itemIndex)override; }; @@ -10452,7 +10601,7 @@ Predefined ItemArranger FixedHeightMultiColumnItemArranger(); ~FixedHeightMultiColumnItemArranger(); - vint FindItem(vint itemIndex, GuiListControl::KeyDirection key)override; + vint FindItem(vint itemIndex, compositions::KeyDirection key)override; bool EnsureItemVisible(vint itemIndex)override; }; } @@ -11270,7 +11419,7 @@ ListView ItemStyleProvider public: /// Create a default and preferred for the related item style provider. /// The created item coordinate transformer. - virtual GuiListControl::IItemCoordinateTransformer* CreatePreferredCoordinateTransformer()=0; + virtual compositions::IGuiAxis* CreatePreferredAxis()=0; /// Create a default and preferred for the related item style provider. /// The created item coordinate arranger. virtual GuiListControl::IItemArranger* CreatePreferredArranger()=0; @@ -11393,7 +11542,7 @@ ListView ItemContentProvider ListViewBigIconContentProvider(Size _minIconSize=Size(32, 32), bool _fitImage=true); ~ListViewBigIconContentProvider(); - GuiListControl::IItemCoordinateTransformer* CreatePreferredCoordinateTransformer()override; + compositions::IGuiAxis* CreatePreferredAxis()override; GuiListControl::IItemArranger* CreatePreferredArranger()override; ListViewItemStyleProvider::IListViewItemContent* CreateItemContent(const FontProperties& font)override; void AttachListControl(GuiListControl* value)override; @@ -11430,7 +11579,7 @@ ListView ItemContentProvider ListViewSmallIconContentProvider(Size _minIconSize=Size(16, 16), bool _fitImage=true); ~ListViewSmallIconContentProvider(); - GuiListControl::IItemCoordinateTransformer* CreatePreferredCoordinateTransformer()override; + compositions::IGuiAxis* CreatePreferredAxis()override; GuiListControl::IItemArranger* CreatePreferredArranger()override; ListViewItemStyleProvider::IListViewItemContent* CreateItemContent(const FontProperties& font)override; void AttachListControl(GuiListControl* value)override; @@ -11467,7 +11616,7 @@ ListView ItemContentProvider ListViewListContentProvider(Size _minIconSize=Size(16, 16), bool _fitImage=true); ~ListViewListContentProvider(); - GuiListControl::IItemCoordinateTransformer* CreatePreferredCoordinateTransformer()override; + compositions::IGuiAxis* CreatePreferredAxis()override; GuiListControl::IItemArranger* CreatePreferredArranger()override; ListViewItemStyleProvider::IListViewItemContent* CreateItemContent(const FontProperties& font)override; void AttachListControl(GuiListControl* value)override; @@ -11510,7 +11659,7 @@ ListView ItemContentProvider ListViewTileContentProvider(Size _minIconSize=Size(32, 32), bool _fitImage=true); ~ListViewTileContentProvider(); - GuiListControl::IItemCoordinateTransformer* CreatePreferredCoordinateTransformer()override; + compositions::IGuiAxis* CreatePreferredAxis()override; GuiListControl::IItemArranger* CreatePreferredArranger()override; ListViewItemStyleProvider::IListViewItemContent* CreateItemContent(const FontProperties& font)override; void AttachListControl(GuiListControl* value)override; @@ -11554,7 +11703,7 @@ ListView ItemContentProvider ListViewInformationContentProvider(Size _minIconSize=Size(32, 32), bool _fitImage=true); ~ListViewInformationContentProvider(); - GuiListControl::IItemCoordinateTransformer* CreatePreferredCoordinateTransformer()override; + compositions::IGuiAxis* CreatePreferredAxis()override; GuiListControl::IItemArranger* CreatePreferredArranger()override; ListViewItemStyleProvider::IListViewItemContent* CreateItemContent(const FontProperties& font)override; void AttachListControl(GuiListControl* value)override; @@ -11708,7 +11857,7 @@ ListView ItemContentProvider(Detailed) ListViewDetailContentProvider(Size _minIconSize=Size(16, 16), bool _fitImage=true); ~ListViewDetailContentProvider(); - GuiListControl::IItemCoordinateTransformer* CreatePreferredCoordinateTransformer()override; + compositions::IGuiAxis* CreatePreferredAxis()override; GuiListControl::IItemArranger* CreatePreferredArranger()override; ListViewItemStyleProvider::IListViewItemContent* CreateItemContent(const FontProperties& font)override; void AttachListControl(GuiListControl* value)override; @@ -15733,7 +15882,7 @@ Datagrid ContentProvider DataGridContentProvider(); ~DataGridContentProvider(); - GuiListControl::IItemCoordinateTransformer* CreatePreferredCoordinateTransformer()override; + compositions::IGuiAxis* CreatePreferredAxis()override; GuiListControl::IItemArranger* CreatePreferredArranger()override; ListViewItemStyleProvider::IListViewItemContent* CreateItemContent(const FontProperties& font)override; void AttachListControl(GuiListControl* value)override; diff --git a/Import/GacUIReflection.cpp b/Import/GacUIReflection.cpp index 89ec0c6f..65de39cb 100644 --- a/Import/GacUIReflection.cpp +++ b/Import/GacUIReflection.cpp @@ -4552,10 +4552,6 @@ GuiListViewInstanceLoader return Value(); } - void GetPropertyNames(const TypeInfo& typeInfo, collections::List& propertyNames)override - { - } - void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override { if (typeInfo.typeName == GetTypeName()) @@ -4602,11 +4598,6 @@ GuiListViewInstanceLoader } return IGuiInstanceLoader::GetPropertyType(propertyInfo); } - - bool SetPropertyValue(PropertyValue& propertyValue)override - { - return false; - } }; /*********************************************************************** @@ -5156,6 +5147,70 @@ GuiBindableDataGridInstanceLoader } }; +/*********************************************************************** +GuiAxisInstanceLoader +***********************************************************************/ + + class GuiAxisInstanceLoader : public Object, public IGuiInstanceLoader + { + protected: + GlobalStringKey typeName; + GlobalStringKey _AxisDirection; + + public: + GuiAxisInstanceLoader() + { + typeName = GlobalStringKey::Get(description::GetTypeDescriptor()->GetTypeName()); + _AxisDirection = GlobalStringKey::Get(L"AxisDirection"); + } + + GlobalStringKey GetTypeName()override + { + return typeName; + } + + bool IsCreatable(const TypeInfo& typeInfo)override + { + return typeName == typeInfo.typeName; + } + + description::Value CreateInstance(Ptr env, const TypeInfo& typeInfo, collections::Group& constructorArguments)override + { + if (typeInfo.typeName == GetTypeName()) + { + vint indexAxisDirection = constructorArguments.Keys().IndexOf(_AxisDirection); + if (indexAxisDirection == -1) + { + return Value(); + } + + auto axisDirection = UnboxValue(constructorArguments.GetByIndex(indexAxisDirection)[0]); + auto axis = new GuiAxis(axisDirection); + return Value::From(axis); + } + return Value(); + } + + void GetConstructorParameters(const TypeInfo& typeInfo, collections::List& propertyNames)override + { + if (typeInfo.typeName == GetTypeName()) + { + propertyNames.Add(_AxisDirection); + } + } + + Ptr GetPropertyType(const PropertyInfo& propertyInfo)override + { + if (propertyInfo.propertyName == _AxisDirection) + { + auto info = GuiInstancePropertyInfo::Assign(description::GetTypeDescriptor()); + info->scope = GuiInstancePropertyInfo::Constructor; + return info; + } + return IGuiInstanceLoader::GetPropertyType(propertyInfo); + } + }; + /*********************************************************************** GuiCompositionInstanceLoader ***********************************************************************/ @@ -5560,6 +5615,7 @@ GuiPredefinedInstanceLoadersPlugin manager->SetLoader(new GuiBindableDataColumnInstanceLoader); // VisualizerTemplates, EditorTemplate manager->SetLoader(new GuiBindableDataGridInstanceLoader); // ControlTemplate, ItemSource + manager->SetLoader(new GuiAxisInstanceLoader); manager->SetLoader(new GuiCompositionInstanceLoader); manager->SetLoader(new GuiTableCompositionInstanceLoader); manager->SetLoader(new GuiCellCompositionInstanceLoader); @@ -9344,6 +9400,17 @@ Type Declaration ENUM_CLASS_ITEM(Bottom) END_ENUM_ITEM(Alignment) + BEGIN_ENUM_ITEM(AxisDirection) + ENUM_CLASS_ITEM(LeftDown) + ENUM_CLASS_ITEM(RightDown) + ENUM_CLASS_ITEM(LeftUp) + ENUM_CLASS_ITEM(RightUp) + ENUM_CLASS_ITEM(DownLeft) + ENUM_CLASS_ITEM(DownRight) + ENUM_CLASS_ITEM(UpLeft) + ENUM_CLASS_ITEM(UpRight) + END_ENUM_ITEM(AxisDirection) + BEGIN_STRUCT_MEMBER(TextPos) STRUCT_MEMBER(row) STRUCT_MEMBER(column) @@ -10261,6 +10328,46 @@ Type Declaration #define INTERFACE_IDENTIFIER(INTERFACE)\ CLASS_MEMBER_STATIC_EXTERNALMETHOD(GetIdentifier, NO_PARAMETER, WString(*)(), []()->WString{return INTERFACE::Identifier;}) + BEGIN_ENUM_ITEM(KeyDirection) + ENUM_CLASS_ITEM(Up) + ENUM_CLASS_ITEM(Down) + ENUM_CLASS_ITEM(Left) + ENUM_CLASS_ITEM(Right) + ENUM_CLASS_ITEM(Home) + ENUM_CLASS_ITEM(End) + ENUM_CLASS_ITEM(PageUp) + ENUM_CLASS_ITEM(PageDown) + ENUM_CLASS_ITEM(PageLeft) + ENUM_CLASS_ITEM(PageRight) + END_ENUM_ITEM(KeyDirection) + + BEGIN_CLASS_MEMBER(IGuiAxis) + CLASS_MEMBER_BASE(IDescriptable) + INTERFACE_EXTERNALCTOR(compositions, IGuiAxis) + + CLASS_MEMBER_METHOD(RealSizeToVirtualSize, {L"size"}) + CLASS_MEMBER_METHOD(VirtualSizeToRealSize, {L"size"}) + CLASS_MEMBER_METHOD(RealPointToVirtualPoint, {L"realFullSize" _ L"point"}) + CLASS_MEMBER_METHOD(VirtualPointToRealPoint, {L"realFullSize" _ L"point"}) + CLASS_MEMBER_METHOD(RealRectToVirtualRect, {L"realFullSize" _ L"rect"}) + CLASS_MEMBER_METHOD(VirtualRectToRealRect, {L"realFullSize" _ L"rect"}) + CLASS_MEMBER_METHOD(RealMarginToVirtualMargin, {L"margin"}) + CLASS_MEMBER_METHOD(VirtualMarginToRealMargin, {L"margin"}) + CLASS_MEMBER_METHOD(RealKeyDirectionToVirtualKeyDirection, {L"key"}) + END_CLASS_MEMBER(IGuiAxis) + + BEGIN_CLASS_MEMBER(GuiDefaultAxis) + CLASS_MEMBER_BASE(IGuiAxis) + CLASS_MEMBER_CONSTRUCTOR(Ptr(), NO_PARAMETER) + END_CLASS_MEMBER(GuiDefaultAxis) + + BEGIN_CLASS_MEMBER(GuiAxis) + CLASS_MEMBER_BASE(IGuiAxis) + CLASS_MEMBER_CONSTRUCTOR(Ptr(AxisDirection), {L"axisDirection"}) + + CLASS_MEMBER_PROPERTY_READONLY_FAST(Alignment) + END_CLASS_MEMBER(GuiAxis) + BEGIN_CLASS_MEMBER(GuiStackComposition) CLASS_MEMBER_BASE(GuiBoundsComposition) CLASS_MEMBER_CONSTRUCTOR(GuiStackComposition*(), NO_PARAMETER) @@ -10341,6 +10448,46 @@ Type Declaration CLASS_MEMBER_METHOD(SetSite, {L"row" _ L"column" _ L"rowSpan" _ L"columnSpan"}) END_CLASS_MEMBER(GuiCellComposition) + BEGIN_ENUM_ITEM(FlowAlignment) + ENUM_CLASS_ITEM(Left) + ENUM_CLASS_ITEM(Center) + ENUM_CLASS_ITEM(Extend) + END_ENUM_ITEM(FlowAlignment) + + BEGIN_CLASS_MEMBER(GuiFlowComposition) + CLASS_MEMBER_BASE(GuiBoundsComposition) + CLASS_MEMBER_CONSTRUCTOR(GuiFlowComposition*(), NO_PARAMETER) + + CLASS_MEMBER_PROPERTY_READONLY_FAST(FlowItems) + CLASS_MEMBER_PROPERTY_FAST(ExtraMargin) + CLASS_MEMBER_PROPERTY_FAST(RowPadding) + CLASS_MEMBER_PROPERTY_FAST(ColumnPadding) + CLASS_MEMBER_PROPERTY_FAST(Axis) + CLASS_MEMBER_PROPERTY_FAST(Alignment) + END_CLASS_MEMBER(GuiFlowComposition) + + BEGIN_STRUCT_MEMBER(GuiFlowOption) + STRUCT_MEMBER(baseline) + STRUCT_MEMBER(percentage) + STRUCT_MEMBER(distance) + END_STRUCT_MEMBER(GuiFlowOption) + + BEGIN_ENUM_ITEM(GuiFlowOption::BaselineType) + ENUM_ITEM_NAMESPACE(GuiFlowOption) + ENUM_NAMESPACE_ITEM(Percentage) + ENUM_NAMESPACE_ITEM(FromTop) + ENUM_NAMESPACE_ITEM(FromBottom) + END_ENUM_ITEM(GuiFlowOption::BaselineType) + + BEGIN_CLASS_MEMBER(GuiFlowItemComposition) + CLASS_MEMBER_BASE(GuiGraphicsSite) + CLASS_MEMBER_CONSTRUCTOR(GuiFlowItemComposition*(), NO_PARAMETER) + + CLASS_MEMBER_PROPERTY_EVENT_FAST(Bounds, BoundsChanged) + CLASS_MEMBER_PROPERTY_FAST(ExtraMargin) + CLASS_MEMBER_PROPERTY_FAST(FlowOption) + END_CLASS_MEMBER(GuiFlowItemComposition) + BEGIN_CLASS_MEMBER(GuiSideAlignedComposition) CLASS_MEMBER_BASE(GuiGraphicsSite) CLASS_MEMBER_CONSTRUCTOR(GuiSideAlignedComposition*(), NO_PARAMETER) @@ -10964,7 +11111,7 @@ Type Declaration CLASS_MEMBER_PROPERTY_READONLY_FAST(ItemProvider) CLASS_MEMBER_PROPERTY_GUIEVENT_FAST(StyleProvider) CLASS_MEMBER_PROPERTY_GUIEVENT_FAST(Arranger) - CLASS_MEMBER_PROPERTY_GUIEVENT_FAST(CoordinateTransformer) + CLASS_MEMBER_PROPERTY_GUIEVENT_FAST(Axis) CLASS_MEMBER_METHOD(EnsureItemVisible, {L"itemIndex"}) END_CLASS_MEMBER(GuiListControl) @@ -11007,20 +11154,6 @@ Type Declaration CLASS_MEMBER_METHOD(GetBindingValue, {L"itemIndex"}) END_CLASS_MEMBER(GuiListControl::IItemBindingView) - BEGIN_ENUM_ITEM(GuiListControl::KeyDirection) - ENUM_ITEM_NAMESPACE(GuiListControl) - ENUM_NAMESPACE_ITEM(Up) - ENUM_NAMESPACE_ITEM(Down) - ENUM_NAMESPACE_ITEM(Left) - ENUM_NAMESPACE_ITEM(Right) - ENUM_NAMESPACE_ITEM(Home) - ENUM_NAMESPACE_ITEM(End) - ENUM_NAMESPACE_ITEM(PageUp) - ENUM_NAMESPACE_ITEM(PageDown) - ENUM_NAMESPACE_ITEM(PageLeft) - ENUM_NAMESPACE_ITEM(PageRight) - END_ENUM_ITEM(GuiListControl::KeyDirection) - BEGIN_CLASS_MEMBER(GuiListControl::IItemProvider) CLASS_MEMBER_BASE(IDescriptable) INTERFACE_EXTERNALCTOR(GuiListControl, IItemProvider) @@ -11074,21 +11207,6 @@ Type Declaration CLASS_MEMBER_METHOD(EnsureItemVisible, {L"itemIndex"}) END_CLASS_MEMBER(GuiListControl::IItemArranger) - BEGIN_CLASS_MEMBER(GuiListControl::IItemCoordinateTransformer) - CLASS_MEMBER_BASE(IDescriptable) - INTERFACE_EXTERNALCTOR(GuiListControl, IItemCoordinateTransformer) - - CLASS_MEMBER_METHOD(RealSizeToVirtualSize, {L"size"}) - CLASS_MEMBER_METHOD(VirtualSizeToRealSize, {L"size"}) - CLASS_MEMBER_METHOD(RealPointToVirtualPoint, {L"realFullSize" _ L"point"}) - CLASS_MEMBER_METHOD(VirtualPointToRealPoint, {L"realFullSize" _ L"point"}) - CLASS_MEMBER_METHOD(RealRectToVirtualRect, {L"realFullSize" _ L"rect"}) - CLASS_MEMBER_METHOD(VirtualRectToRealRect, {L"realFullSize" _ L"rect"}) - CLASS_MEMBER_METHOD(RealMarginToVirtualMargin, {L"margin"}) - CLASS_MEMBER_METHOD(VirtualMarginToRealMargin, {L"margin"}) - CLASS_MEMBER_METHOD(RealKeyDirectionToVirtualKeyDirection, {L"key"}) - END_CLASS_MEMBER(GuiListControl::IItemCoordinateTransformer) - BEGIN_CLASS_MEMBER(GuiSelectableListControl) CLASS_MEMBER_BASE(GuiListControl) CLASS_MEMBER_CONSTRUCTOR(GuiSelectableListControl*(GuiSelectableListControl::IStyleProvider* _ GuiSelectableListControl::IItemProvider*), {L"styleProvider" _ L"itemProvider"}) @@ -11114,30 +11232,6 @@ Type Declaration CLASS_MEMBER_METHOD(SetStyleSelected, {L"style" _ L"value"}) END_CLASS_MEMBER(GuiSelectableListControl::IItemStyleProvider) - BEGIN_CLASS_MEMBER(DefaultItemCoordinateTransformer) - CLASS_MEMBER_BASE(GuiListControl::IItemCoordinateTransformer) - CLASS_MEMBER_CONSTRUCTOR(Ptr(), NO_PARAMETER) - END_CLASS_MEMBER(DefaultItemCoordinateTransformer) - - BEGIN_CLASS_MEMBER(AxisAlignedItemCoordinateTransformer) - CLASS_MEMBER_BASE(GuiListControl::IItemCoordinateTransformer) - CLASS_MEMBER_CONSTRUCTOR(Ptr(AxisAlignedItemCoordinateTransformer::Alignment), {L"alignment"}) - - CLASS_MEMBER_PROPERTY_READONLY_FAST(Alignment) - END_CLASS_MEMBER(AxisAlignedItemCoordinateTransformer) - - BEGIN_ENUM_ITEM(AxisAlignedItemCoordinateTransformer::Alignment) - ENUM_ITEM_NAMESPACE(AxisAlignedItemCoordinateTransformer) - ENUM_NAMESPACE_ITEM(LeftDown) - ENUM_NAMESPACE_ITEM(RightDown) - ENUM_NAMESPACE_ITEM(LeftUp) - ENUM_NAMESPACE_ITEM(RightUp) - ENUM_NAMESPACE_ITEM(DownLeft) - ENUM_NAMESPACE_ITEM(DownRight) - ENUM_NAMESPACE_ITEM(UpLeft) - ENUM_NAMESPACE_ITEM(UpRight) - END_ENUM_ITEM(AxisAlignedItemCoordinateTransformer::Alignment) - BEGIN_CLASS_MEMBER(RangedItemArrangerBase) CLASS_MEMBER_BASE(GuiListControl::IItemArranger) END_CLASS_MEMBER(RangedItemArrangerBase) @@ -11314,7 +11408,7 @@ Type Declaration CLASS_MEMBER_BASE(IDescriptable) INTERFACE_EXTERNALCTOR(ListViewItemStyleProvider, IListViewItemContentProvider) - CLASS_MEMBER_METHOD(CreatePreferredCoordinateTransformer, NO_PARAMETER) + CLASS_MEMBER_METHOD(CreatePreferredAxis, NO_PARAMETER) CLASS_MEMBER_METHOD(CreatePreferredArranger, NO_PARAMETER) CLASS_MEMBER_METHOD(CreateItemContent, {L"font"}) CLASS_MEMBER_METHOD(AttachListControl, {L"value"}) diff --git a/Import/GacUIReflection.h b/Import/GacUIReflection.h index 7ac5a8f2..d5952df4 100644 --- a/Import/GacUIReflection.h +++ b/Import/GacUIReflection.h @@ -898,6 +898,7 @@ Type List #define GUIREFLECTIONBASIC_TYPELIST(F)\ F(presentation::Color)\ F(presentation::Alignment)\ + F(presentation::AxisDirection)\ F(presentation::TextPos)\ F(presentation::GridPos)\ F(presentation::Point)\ @@ -1210,6 +1211,10 @@ Type List ***********************************************************************/ #define GUIREFLECTIONCOMPOSITION_TYPELIST(F)\ + F(presentation::compositions::KeyDirection)\ + F(presentation::compositions::IGuiAxis)\ + F(presentation::compositions::GuiDefaultAxis)\ + F(presentation::compositions::GuiAxis)\ F(presentation::compositions::GuiStackComposition)\ F(presentation::compositions::GuiStackComposition::Direction)\ F(presentation::compositions::GuiStackItemComposition)\ @@ -1217,6 +1222,11 @@ Type List F(presentation::compositions::GuiCellOption::ComposeType)\ F(presentation::compositions::GuiTableComposition)\ F(presentation::compositions::GuiCellComposition)\ + F(presentation::compositions::FlowAlignment)\ + F(presentation::compositions::GuiFlowComposition)\ + F(presentation::compositions::GuiFlowOption)\ + F(presentation::compositions::GuiFlowOption::BaselineType)\ + F(presentation::compositions::GuiFlowItemComposition)\ F(presentation::compositions::GuiSideAlignedComposition)\ F(presentation::compositions::GuiSideAlignedComposition::Direction)\ F(presentation::compositions::GuiPartialViewComposition)\ @@ -1274,6 +1284,65 @@ Interface Proxy INVOKE_INTERFACE_PROXY_NOPARAMS(Stop); } }; + + class compositions_IGuiAxis : public ValueInterfaceRoot, public virtual IGuiAxis + { + public: + compositions_IGuiAxis(Ptr _proxy) + :ValueInterfaceRoot(_proxy) + { + } + + static Ptr Create(Ptr proxy) + { + return new compositions_IGuiAxis(proxy); + } + + Size RealSizeToVirtualSize(Size size)override + { + return INVOKEGET_INTERFACE_PROXY(RealSizeToVirtualSize, size); + } + + Size VirtualSizeToRealSize(Size size)override + { + return INVOKEGET_INTERFACE_PROXY(VirtualSizeToRealSize, size); + } + + Point RealPointToVirtualPoint(Size realFullSize, Point point)override + { + return INVOKEGET_INTERFACE_PROXY(RealPointToVirtualPoint, realFullSize, point); + } + + Point VirtualPointToRealPoint(Size realFullSize, Point point)override + { + return INVOKEGET_INTERFACE_PROXY(VirtualPointToRealPoint, realFullSize, point); + } + + Rect RealRectToVirtualRect(Size realFullSize, Rect rect)override + { + return INVOKEGET_INTERFACE_PROXY(RealRectToVirtualRect, realFullSize, rect); + } + + Rect VirtualRectToRealRect(Size realFullSize, Rect rect)override + { + return INVOKEGET_INTERFACE_PROXY(VirtualRectToRealRect, realFullSize, rect); + } + + Margin RealMarginToVirtualMargin(Margin margin)override + { + return INVOKEGET_INTERFACE_PROXY(RealMarginToVirtualMargin, margin); + } + + Margin VirtualMarginToRealMargin(Margin margin)override + { + return INVOKEGET_INTERFACE_PROXY(VirtualMarginToRealMargin, margin); + } + + KeyDirection RealKeyDirectionToVirtualKeyDirection(KeyDirection key)override + { + return INVOKEGET_INTERFACE_PROXY(RealKeyDirectionToVirtualKeyDirection, key); + } + }; } #pragma warning(pop) @@ -1358,17 +1427,12 @@ Type List F(presentation::controls::GuiListControl::IItemArrangerCallback)\ F(presentation::controls::GuiListControl::IItemPrimaryTextView)\ F(presentation::controls::GuiListControl::IItemBindingView)\ - F(presentation::controls::GuiListControl::KeyDirection)\ F(presentation::controls::GuiListControl::IItemProvider)\ F(presentation::controls::GuiListControl::IItemStyleController)\ F(presentation::controls::GuiListControl::IItemStyleProvider)\ F(presentation::controls::GuiListControl::IItemArranger)\ - F(presentation::controls::GuiListControl::IItemCoordinateTransformer)\ F(presentation::controls::GuiSelectableListControl)\ F(presentation::controls::GuiSelectableListControl::IItemStyleProvider)\ - F(presentation::controls::list::DefaultItemCoordinateTransformer)\ - F(presentation::controls::list::AxisAlignedItemCoordinateTransformer)\ - F(presentation::controls::list::AxisAlignedItemCoordinateTransformer::Alignment)\ F(presentation::controls::list::RangedItemArrangerBase)\ F(presentation::controls::list::FixedHeightItemArranger)\ F(presentation::controls::list::FixedSizeMultiColumnItemArranger)\ @@ -2070,7 +2134,7 @@ Interface Proxy INVOKE_INTERFACE_PROXY(OnViewChanged, bounds); } - vint FindItem(vint itemIndex, GuiListControl::KeyDirection key)override + vint FindItem(vint itemIndex, compositions::KeyDirection key)override { return INVOKEGET_INTERFACE_PROXY(FindItem, itemIndex, key); } @@ -2081,65 +2145,6 @@ Interface Proxy } }; - class GuiListControl_IItemCoordinateTransformer : public ValueInterfaceRoot, public virtual GuiListControl::IItemCoordinateTransformer - { - public: - GuiListControl_IItemCoordinateTransformer(Ptr _proxy) - :ValueInterfaceRoot(_proxy) - { - } - - static Ptr Create(Ptr proxy) - { - return new GuiListControl_IItemCoordinateTransformer(proxy); - } - - Size RealSizeToVirtualSize(Size size)override - { - return INVOKEGET_INTERFACE_PROXY(RealSizeToVirtualSize, size); - } - - Size VirtualSizeToRealSize(Size size)override - { - return INVOKEGET_INTERFACE_PROXY(VirtualSizeToRealSize, size); - } - - Point RealPointToVirtualPoint(Size realFullSize, Point point)override - { - return INVOKEGET_INTERFACE_PROXY(RealPointToVirtualPoint, realFullSize, point); - } - - Point VirtualPointToRealPoint(Size realFullSize, Point point)override - { - return INVOKEGET_INTERFACE_PROXY(VirtualPointToRealPoint, realFullSize, point); - } - - Rect RealRectToVirtualRect(Size realFullSize, Rect rect)override - { - return INVOKEGET_INTERFACE_PROXY(RealRectToVirtualRect, realFullSize, rect); - } - - Rect VirtualRectToRealRect(Size realFullSize, Rect rect)override - { - return INVOKEGET_INTERFACE_PROXY(VirtualRectToRealRect, realFullSize, rect); - } - - Margin RealMarginToVirtualMargin(Margin margin)override - { - return INVOKEGET_INTERFACE_PROXY(RealMarginToVirtualMargin, margin); - } - - Margin VirtualMarginToRealMargin(Margin margin)override - { - return INVOKEGET_INTERFACE_PROXY(VirtualMarginToRealMargin, margin); - } - - GuiListControl::KeyDirection RealKeyDirectionToVirtualKeyDirection(GuiListControl::KeyDirection key)override - { - return INVOKEGET_INTERFACE_PROXY(RealKeyDirectionToVirtualKeyDirection, key); - } - }; - class GuiSelectableListControl_IItemStyleProvider : public virtual GuiListControl_IItemStyleProvider, public virtual GuiSelectableListControl::IItemStyleProvider { public: @@ -2358,9 +2363,9 @@ Interface Proxy return new ListViewItemStyleProvider_IListViewItemContentProvider(proxy); } - GuiListControl::IItemCoordinateTransformer* CreatePreferredCoordinateTransformer()override + compositions::IGuiAxis* CreatePreferredAxis()override { - return INVOKEGET_INTERFACE_PROXY_NOPARAMS(CreatePreferredCoordinateTransformer); + return INVOKEGET_INTERFACE_PROXY_NOPARAMS(CreatePreferredAxis); } GuiListControl::IItemArranger* CreatePreferredArranger()override diff --git a/Tools/GacGen.exe b/Tools/GacGen.exe index 3588e51d7ad6312d0fbd43b1c00c46536e3283ec..53bc50828aa88060e639aa39232a5e00ec234b8b 100644 GIT binary patch literal 15623680 zcmeFa4}4U`xi`L>Y?1{RcF~}zMh)$%sYHz?)nKCC#O!X6ENp-zSOIB`HchFb?n<-? zgl-l%og9n3*wWV9i&tCemD}PiC|Yb2OxYk2BBG+wnkwx*l-xEdVzktKzt7B^vuBeH z2C%-r`~JFo$T?^Joq3*l{>?Mb%n5vHjV0Y;vDolG9=BMw;z~ac|9kvDcB{oQ@%*PJ zS~ib+e#%yB_48BaHh%4{yd`(u{?$9b{EfVuzkJ(mw}tE2O=>NZe=|xj!;Mvjkg(+41desykzuKqVz^~(`%)<5i zmtM&8zkliHrqtv4`WFsO>Fv{|_#+dhdhv=GmNe^WR)@v%+IKCMwKwwQa*JxQxNtj&G{O?yr&%nSxX@3(S~mSfAQfrp z7S9S^kjhd8el;$XXeper-7-iwo&%PC;B~|=c)*eyJl)dy?sqLEBQg^STUR`sJa*{k zJR0CpewT)BX$~Q8@_xWW{UTV27)-xBi)GQJcQ$-E^ks`>^*1gPu-}I3?+FKqp9j6a zR1~u;dEqmtwcTRbfonCcrXR|6UV7(UcixON4l7_L99mAt)%5dFdw1Tl_;wT|*e$?; zWj3zaBg$2ns{Ql!1TfIJ=)d<`wEy{YhvkN6d+}>rLeIZ5o@?1aQ@nBej@_1qhp5?L zWWfHAWl@^7=(j=Dd!*rEN{o4riOWC)}?zKGZL0V)e9-iE| zZhD$k^$y0ogE@cSYYA!#-|et8cG6qFinm6(Z7gu4L76}e-oXC2fcJ`eCVuEoOqSt;}_&x0>o-yO|o*^Bd-qqzv{e9`0PpQAh#pkQ<>;3yEf?yIKNjBzyIK@?Fh;BmH*RWVJPja@2v6M>RevwE(xmD?lOK` ztrh(u!-B#~NbW{j+#bvF(+ulCd*fF7tf9do8$RHGNV3Zd~DaEKB4t>Qg4r>>rTz+P*zskKA1nUh`T zQoKXV8V?p@9Kx5gEVhdkGVf4&XHaYVCEo1}#_Nh%VCbgwoeOU)?Fvt1fn!C_YgZ?| z-g_kGJ#vf>+n&RTm!lJP>}{>*=NKxVD|ppQmW9LAG0$(_I(j}UKgK-vSf%~glFz+p z;ZHVtI#TwMh1vpqb?P0*pt3)UAv)@{TSMdP;*$xLWD4w9xL~`@K!)fK%cK@1hn@k4v<_Zg~45LAEa*^!CLQ+OLVU=2$>A(n<^68_O#B`#wv|Ulv^R zA}-kkbj+Va$g7L_1%CVjKYoE9KgUmvI;$+^FW{*17m7=A%3?#{t7^jzXD8B>nLP<5fqY1e?ysdlwrGRBr}2^NgB;^#Qb`zCYiX@F8DaU z)S)x99R+#IS@icN2mrtnIXDy<$gOX(vJW6K9gU6eL1ShACrGK%?SQm&#j-2~FIk8> zpjlTfsHk+N9!WhF~|ZAB&M@T@ze3DZnit9Z9s;2 z2XbsRs@j6rQH}4APE99dvA)=Kd`Q^!Hf4sLU2j)rI9P>4xz5EZT*`IXtRh>vjxc6S zYOE~KPMpBiSS+1mE=ny++~r8-0MoURezV2H?fl9Dy)j;pkF2+QWceOhzE_st9P@UI z!W%~x-XsfemW3aTc{hr}YeyDdCksC)3m=Sm*NVaiMi%aug%66t(Zv8R<~_j6M`_4- zmCn$)f>qCqZ)rrLsI-L&^V?XuXB-gxtZABh)504``q-hU1U-Xf&T|;{)rx_2W|HX+ zs_pI#NRhUcK{g$3A}#GR|H0{Ii0GyoB;M}cie&m}AN>p@5w`DWcW=U@mFB85ZOr3J z?|}*6f)HavksUTR-Icx@1T)(fe0sfTWs&wSvcL!c5OMv96-OW_-Jmj4M!Bx9khErUnJ0u70Y)NmYgF&0cAcWj4 zV(4I5fvZD&S*YgDGFQKi?Y)@wANMy0GVKShm2dW{CXMlNd1 zmo>6e)X33mYe8f>Hn^$V*SmyOQL+1-B%!zMyuL15w&CR?5zmKKoe3sK;hae{D zGLf{X8%;ufeSK77G}KkN=n6e zH!@CzZvLqlG2t~6O=`usu^*=VD2g$OUJjV$5jpcy*;7hj&@iZSK%<)FVUt1CsSBh( z|2t1z#L0-ni&c9CNvxIZrZncask0I)Ql~6ctwM`zzjgrP%n(fJu%&cSbKOs+Y_c)b zpYDou+0yq2rK)<@kd&H&5^A6mZ^=MC;w_@V)AV|on2DdkjkXO``d!eqsuCQikcA55 zMxhF?Ap?Ht1%rY>Pr`0fOVHE^$wuu<`EZ_;Y_MpGkt(^JYVlhVR#7TGR(YigsUk#H zLaM+cl6X-nu|k557ay~%Ytv=jm<6>O1Ry3^9i@RDiHB;WN<2^niHH6eFFsc33Z)=L z>lidbG!L)Ql|qyVVT35o)q4`(LWOy!V(G`_D#PBKHNj+W_M2IX+na+(5%#8niIL7% z9d2Si?a_ZrFcz6s?QRQSBtce($l65Q1!EKzAZ1y#5Ymao+TBBFVN^B~wh8zw^oZH~ zq&i?WX+`cQb|v$Zl2fo-rF#)^(BmkEDh0A2n686cM#Mx9n42&-uhLyb6`QGIhkGAd zmvzB^9qvv%Q{5Y=ZXcVEi6);rodgGVxVzEVa29NLZ$ql2y*$YpWY5u?1@Ud>6$SNG zyQ_hDs>10Hwx_IWwuFaUsbbDx7^)@SB}lhZ84d-V=>n| z+#B%0#SB51)nl6>v~ylSC&eV8ozshC zQIjpcU+)*jk(h_~(O}XJH)phDTb$;F`cK$PC#nA)1fhlEHh4=EF27-Y)E_K zM;Y8^V!PRy@zarI`GDK*;Jl?G)NiSZfY9-1-^(}zP^@A^^nVG%Jr+3GenL)VA9 zlJwyulo+WG|Mp{9FVnE`xjuXg=_&Q$b5vo$AUqf+%Z>lkhvb}T6WsIvKYa-2%gOQA z`gI947%=S1Z;RBRU?nhsRa=UrG1`|c|2hgky##`8Z^wTaCS&xV;vMwphs-1~+IKI`jy3v-8PQd8Jb z^j6)DqKZNj2qP7y6xHIU)Cn4>($+NDs3&Z0l7-u$zkX~MF4?Fj>WBSw4OB6UGTW#o z<1yI`PiZ~E3?~bh<|qGP3zzuOWZ@FEj6KN|+ss)#*}`=g7OpWL zT{+P-ADxG0lI2AsQbx*)xk%MMb3b?`?D~!C!@U-uWeL*g7x^eHoV7I{iHA>%d}Q5P zhC8P>)?}rqk_PRqHQ@4((!hLF!Mb%&$drO6D+&d*Ze+tCmO_XmO*4w6X&Xhllt9%o zJzZOibQZ{loXJHwk~1M(ZQ8buVRD9&GbE>L_d#xnMV3n0kxcVU^RNFx(nic$Ws6xP z9bQ2?fS`pL>b#xml;DQ)ekJlq7*QUVDnvz;_ixA(D}*9*yjUfybT`wqcZH}qU)DU0 zTBR8l)x3rBI^5N0QD!?Rn}(jUeaIHV>ZBGDJKRJ!BgK_LZ^=xNlHiz}G`4e@D#g_a z&Kq0IJUOMFWPEJz*h#L^NPHB80+7(Sy;{j2nFi2qrZ{Jd~mVk|a6^R7rp! z{2)|CO2e`EK}duqw8THgLm)JfzJ@p!S4q2jF2F#?#G+t3XE=_Cr1ia^4m*4bRDt8c zByqX0OqRGVDRG6oO^Tmb1i`57V-OAhH{vJO#Gob;@e{h=L%$mO;pErHKlpZHnl@~G z{P)N@vGwu&Ko&&rBJIWR=%Rb%`uJ7%k(`B~+yvGz)+*)t_}R#W=p=rVB@*l7AE~D# zNB_A#eoE`(oD`phBH_Un$^4_QV=`-9wDX=z*d5qLaL%%HC6krs zC_Wo2&sBVOmR6NsVN-mFBg#{Jh$C_2^DhCua0!V^v$(YI%c?fI;1^rfE^ctQ+PEV=qn}25j}Vbqt?fkg6qfm7SHDi z07fO`j~sXO&xk)IAjc4Y3j7Wx=r1ymBk51^4%XG1!Y5nps<&T~AT|xC0Y~s%=W=hq zwqd#hTK!=3C<1hSi`7|k6@O6m%?)a^q8XNVowxfCjr4{UW&QSdoy&YVw>n?;=P+NM z;?Fy5Ll&)xSR%XQ2%P~QPG>uKkni|-SgVQG4$y!Jq#+6!K@Mjiw{Rwf7iS~7Bwm|? z0^jz&k&KGKAY$l`KF&k&k6uUu=pXey0eP{2yhH$5CN3UvsT7wgQLKOCcc` z93(D0_9s?eCh|NYF~x`s+kGSC8}`F^TykSB`dfpI7;x6Z_paLyOIJX4p%masng8hU z{A^y|CF`RlZC|2@K6T_*w1@oyP$}~gLlzmxH}6?16n;g_>Rj6M7s5!SAVJy_8-!OkV?L}E@2jl z@pJyV^9M!Sr*7x)0~71yla4>*QLe9u{Vzx@dT#1-=WNGvU6-`72!HQ7U0%C$Zbn<% zTTpkCyvJVk9@C95fe&oTeuoO(ic)J(>K*4KoBMY*w_YlNLX>wtQEQ*`?FEjK1$O5X z&pKyqztObGn)0870=pG~2DeTN+nrDDK#7G$3FM=*)6kz;UOQ6hxfYvuvP)lR84pO8 zk1zGQmS$id4|{}`eVv{)^<(nC`Z4(dJ)aMPb}fH&Io$6!7xn=AjuA|fj9*TL z+C;sP6dc9NcLG>+`FFW)?Z{JN%daldhv&bRGM{=!Euc#_cYN{yjy8bRN!%;y56hoB zJU=qvNp#^3@rvKgcbA|Zw%uxTpESlnw3k%gKcc)lMfqV}kXr~u!{aM#hTU0xm!nR*$TpsqU83>Oxsm0^ zEUN!lXgszW?rBPoyAF>JCM5O@hgu$oTV{G`SF0C}Le=qG(g;&~*mZWbtOpw!6p9zd z=0DnusQMg1?Qif4s=nNyIxAOuqZxY5SFHGp*|S(AC*>%Qvw-Tei!H?8*)(GRY|d+B zf27_&J6pT>4y-73N%N58#jyG4oKfcMQdvfJ#TjPq{#>cK&SlT?>CNQ$(mVlpd?`pu zY^cT5G?!*=%uh2N+LD+v16vZ8W;1^dZPVjBWc^|;;TN`_U(6-^IfST@-T>P8r1zbM zUG#s*tehRAcpL_B1PC=s+fyYl&h|(6TQ<m79Bf=ONzKT)JtnFNKX zl-p?QYB@HrW-H~6=-$M>x-_;&ySp1cJ-PRFJ@($xJ?(w9x50wMy$kmZY5cy5tROPW z)bedg<+NkaK^UshcD)X_Be!Rp=Aw!52)GRUHZtH!H6CHR64nQ#DTpo*4&|W>L*Ol? zRl_Vg4J@tTZqBn~0d!uD=rt3j;2!4QxO~D_h>pjzk9X*o&-JyY^}{uv_J0T?FM zpAEYedlwNUgA)lZdWZ|~B=;xrGxq1xe(H)bxj<1q$^Q%gr?y`q7Q?E@EKD4*S31ik zc7_92aMotoXlJlejJY;Bcbkl{{FRzAcF+lR#Y0(e53 z_94^x0+6RY31XQPI8c=;1+lnJ_nzW@cI^dN0OiSlhH?c>$pD3FX8$q z`(CIQG{`5>jALTtNbP(yIBU{Bi>7$KsUqUziZ_!8U z&p%0h6h_S8C#8=@$itrYG04LgUy<_APCGG$Jk069tsxKRe-BT?JK3S25bwOOnuZ>G49NW0SzwN?hJp9_Yz{#D1 z%S6SOi=*O#v*VMG;3znpMZ;>3G+7#57r{3(TdB)eW)^6nM=^YXV~Q`Y=y|2i4bQjs z{U36Dlz>Ib8w5K@5sve4ps=x4KT z%1HGdyj7_kfCd=AXvPWtRK>I!H_y-S(v&eq?8TiAwQqSsWr-87WY!VmpG zXki&r7qgN$OW=TyXJQ3~p9l0d`>^RfsId6tO@v=;)jmQ)J4acd#k@mw8=w3jayF!e zE~9~%6Q8^vkFc=vVC#5?g7tMs>O~So{_^92&Jn$MHa>YXlAH8@@jCW}13V$9cn9Jy zv!QxnBf{oj`>9y{oThj@JlF&;8}dc-sy~i*hPC+QgQ$yF@v}$*$55&0dAw5l&vnK~ zi@~&F38&memI&b0*Hh?Ri!rUIJWaMMXb&nRlWnKj5ZsHg%t4w|`1m{trWz=Xm4ja0 ztQ>Tj&zHOlSa~*^iDm6Vb5&Q&S4@*DUa5pvD&v(ryiz49DbT~dG9WYqZ*x`fbsI5& z=s&rjFF=pRSm!m_I<;-qE{O%GuuceHi*MfXLqnqiLuqBtwqmph} zQq28)#vw4Bp=>b)M3bf?V1Q(5@+NWq%fcHI)F=Fxa((O6#se%G%Pg3Nb6tG7IE~3b zFvbI;g7LtpU_7uyR>%>IQ*-iDAox`An=jv;j5Q!Ees{jaS{}#mNn#ECgZ+8YBxC-y zVqkrmJ{iG*Udco1dDds-1YERnREi(6tX&?foyqp@7*EevxN-kpiud ztwgusZuvRFBN1)KLyZ3weu?-04Lr7`2dT9GYmavGS2HX@#_M>3IB~0=j?+}BF-+-j zK-Es?ee0ni*aK8WT{2&Ngd1IStlDa%mv%YTHe7F=R$LLvx;0W(aakBLx41&IA*y*w zyIOWrOLZvOWSy<5tI?QNato$ZQM#pr)jmW=n7W3Z#L+W6M|v~P*QYwzy4-;xJTfl6 zg-Y{V7A1T|nzPediXzKh*5&8KI7n5GzbIWZ{4uBv{TSfGvE#Sh8fmFYyV}{_0x40{ z*=WaT1aDQM{b)yxzKOp$b?&F+#B-=TG1!=alJUtKN$y!2*U`LAU5|3wk_HMy6Qy7* zAP`wyOzHEGE{f2U8C$*QB9)dL{t8g*1rm_Mk1ROAhhdL)>VAsKOY|D?EmVV7=GKwA0gtgLRTB*mUQ#shh+Zqc zg=+8yM#24WAHhJ0QSElnz&fK(5uIajo%fwjy3#y~(SJo=@~FJ_6{0Tc2)bwss=RkZ zXmiW4+l^LZxYxFYMnp~A*k_WU)&9( z$GE6k_kA*2ZL#(YN?Q}cQ?A0gqoO5 zBgToxUfjDzm<)p5NyHs;06y-oFwQ%RW#-?Fw|tVPo(XwwS}%szeiV-a>=r4cML))5 zy9l$zbST$uP_b3p@&RyXc6^anLE1;qFQ?WY=v&05K;I&=4~IzM2El!>X%L%&=)dIH z6ejv}!D#)V(7!B>^;0<&jx2rg6ZmdS=+DSNwPF1aB*hQC4J%v??1SdSX*xtZjShtS z(bQlc%t`M-Ew})ZA%MfjxaQOzw_7agOaurWv(~7!`; zTt>?mbcW7CY5Q~nV7~-F93F&q?PPu%K&;bvmGfJ&a}Yy>@d2H~W~*a&IFt&6in^2v z2ieinb7E-(igKr2!I5*;wVGWiVBjY$fIQses;&atIa)gISd*pez z&V8Ej9%9Tr6`~ zZ8u|fP;PU4{YBGk3-K|dmG5|rmoKg}&(3;#llr?^_K;@pg<56%N%R-^)#L4a{B%-z zDC1~{qzZmH5q~Egd})de9P`PSq9Z0!;f_wu|9!2%jo&83fD2SFN!olkq<;G1QkQ9Q z%FZct_!*J9ETF4^ugfeCf+l%@NxVFhp1s}HYA61Vc^{#HcD84N_PB7+=vnplkyPmC zF@}BGTDaL&??x#bu)+aJqJ42bSJi8wsxkFAoq0EQX||(%ZfhuWhxakd;bo{Hi)JSk z%@IXWaAFfV_O-? z;{orpws(dhtsX8Bg>q2t6` z6{2e#8;{b2VHOrItH>Ebf>~ROBrN~YvmWa@j~+~&;Nj5bxhv5R$(x*4N#2Ya4=mP? z@)KQzw@0dYY;~@5=Qr?=9^jm4EFfdop4K=IhFaKFgB2GZUd47}y+EsYY8)LN?FcfT zLv?ttq^wT=yXxrCe()s}M?DmGjAV?E+ohwIhaOQtG2dQ*D*5`N4cGqM!65KC&)nHU zgCCM6mr899b^*XqwMV#fnBPS=9-PHV{1DV?Za}{RJ;6pg;YYg;PcT#aKn^wF8a2=- zIED0SzZRZj%s`>!qC1!C-*xDXd3(i#bLIUQeDRJZiox3NA)|JHaAmyY_jr;oiL@TD zEPI-ex*rTPxt>&YpB9*l;%2+Yu>TMsPD{^4o!r}Vv^3V`_2o7i9}3>Zf+n1s z<@^ZMa(;v=G+aeCtHH`|PV#DRS5nLzmxt6?QlOw&5RT=PT%ug@L;tw{QJj|x65?8{ zk@m`h7G2tbS|ALB1!}>$x%A?bIX4&0O3M7$6LaCVG=~6){;e3;2a*zW*o~FcK0MVI zb)vgGcC_(7h~RF8Z!{lg{#Lp#4r;rnkwun$U8%kMvdYJFiN-Gt#=xV$|Lg^KKHge?YatyM5@$4d{p( z=+W+nSvSI#q`3KCe@m!^62vM9`L)%I&n2ValNRUIz*Yn%0_e_Tdo7B0AM_ugQTyZU z458b(Y0qVp>Pw4x`}?x27C8O?RMZLF1E;EYKQP%33<|e@Kc4o>QBZ69)xc_P=by;c zcDr{q3-5~z6tZr%2Mvlb!i~p8nH%UXkH(}<)5sX717q}=fm`=lodZ)`m*((x^C<%J z?!)cjw3K4);S~Zk#*V6!#m}*1{QS0N1b(*mWx;)?gx>^u`UyRM#?4))f zn*RNdCy1sl@;`hsXliNG(M0lQz|KQ_Yhdc};m1}t?cfkzhL}1YMaNHOPRP$;>qm$N z!C^k^RU9kAS#K#msW6CT5#okBTyh0PD*}ZD>pI_>@%cj)$ z{oM6Di>_ly@NK!UhVCO=gfFaVxdMs<S;Fd5W0`C zrw+jAKEi>yL;xc;kPm^L=MS^NUD<2tY&qM}J0G?`S3XICW z5%3ftLyn7t=kgTrESSLu=M#oUZ85{MVt{0Rg2d{Y#y2&nQQ8|Mjxi;T5S-24j!!P+ zpAm71Otu?mg=oJ5#tB(`Rkt|NaKgSa8!z<971=&*af(H0HwAAWn+os-e1Br{LEtLV zovrdCRK-i`%rDvVO{4c*-<@dt77j#G`$vIh1Bly4v`@!+nDKKSL}V;KoKA;MB zU9`G=0u`>2jp4|V+j>p?dgWdLw{|_4Orlrnd(Euxb5jMl@)O4gsk_?efpQ!}B4zs? zZ8{PKvxi>aN1HWF@o<>s%1~D*+kWFd*$f$OuMRloKn@3npa*&|-jd6;#|fBow?U%w z2~!-_7Xpf3EZWHipN2@Xy#JsZ47*COCZ!C?;bzm+eAs(D;q?Fu zlKT=Xt8|ghOdiam`pK!C7Sz6obz=JbA-e;(% z@DToh`+bW#QD8iD_Zy^s#WY#aQ_)@o1;#R|jYy|$m21r8+l!!#qP;PzQ8PvS6X+GJ z5zFj#y$DKd1L$LKp2iRHQ)r@XS+*ry5?SW5gmU?PIp?<_fyr_3^0+8C(Z=(x2F(*U z_9K_OMddaD$d+UIar!!1BP>{%I0Rc_kbequP9hPeTRb9%vj*9cr`Cm)2f^^(puZ@JjAL z6v}+O32a+6hn-8n)Um5LfL}Es;_~Al;$ne_7uj;`&IoT`cq4Zfm|iXb{}Ntq!iE6c zn@A*V2)q@FZW;)|_|zaMiMlB}9m}8xqPWcvZ#U0hNYulD%D9?w8qUGcr z{%m|r31518kq~$^+<()J!$+)-kJuAjiwSxidpr-yk1_r@v%yP_Trq>;pQHNZyz&OR zdJ~qeNF(~@`zc?~Hbm-*0XmUO7!c&WA%7qwt4yG;*W@6jfqOx5nmC-@uACfmlva-l}%+b0gzRZINA8?07+6bG7~DPz#~}>2;JLH%eqz+SA*tU=5VX(Kh?_ z71-_c(rgcf8()nw7v~L zSpmD--t`AtWXE9o+ogk{1#BYPzg*W|`2L+8e(3m>B7iy*4NxqdxCq@L0zu(KD};}& zn9X&UDA$s1o@rO=91sC#a4$60?y?S(7mk;ZXtg7|P`oNDd{Iq(d@r;lfGObZqeXe; z-f;qwo{v6j4|&i~RphPrfh%%{d*tlRWYC4&mHPAz{0Wb^H~^gr(^}EdXKkTbaMi6v zgORuX#@k6cl=31S1Lw)_=$KnGe@!QGF6Gf@(|DU3d7FQiZ9al0*}bGTHy}N^O{&Ki zR54mqi~1>PhU^NOtd;=ohR9nVNx1c+#FF4%#P~Pc__x;pcLTq{@Z^FL+zgx)>CE>N z3xQDP5&Lv(A_ogt?(ldStffw;g@zm)qq>dy1PZES*4eZ|DyV%t^ zb+-QxrDv%fyjl&;?e^H?eeIpj_VJ*Y$Ts%@aFafJA&ahYx zEd|&@yn`kl{Evji7x{)rzx8&PhnCsGfQu4do{`vg^of=z`Fk$Q#z>*F7*hFC0lk`C#9rp2q;7km{3@G@-Ae5wG5bi581|iQF1SQ)%2s6HxJP7zay&QxWev*0+ zeg<#49E3@rC`eilR*=q;(Hl-0gxPWskbU&oJZJkK2$o^v@I2CZ1cx)a9k+ZOcmSmc z<{*gyXP52JPmq}c;r|`((7D3Q65CK3vw{wx;!S6!b#OBPYay1ei+PR%iidNJ^5`iI z*yr#@&NWb#V;HbA5(D-_cyGjjg=j^92JClNiveqn?D7}`w*PeVfc=o-O-)>LrZHf7 zkE9;3AuMRf0h|1>T;mB{g^{8Ih(lamm=1cxckGg7dJC87RFrf?3h8+%`gTR

IG$ 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