ui/winui/container.h

changeset 0
2483f517c562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/winui/container.h	Sun Jan 21 16:30:18 2024 +0100
@@ -0,0 +1,165 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2023 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "toolkit.h"
+#include "../ui/container.h"
+
+#include <Windows.h>
+#undef GetCurrentTime
+#include <winrt/Windows.Foundation.Collections.h>
+#include <winrt/Windows.UI.Xaml.Interop.h>
+#include <winrt/Microsoft.UI.Xaml.Controls.h>
+#include <winrt/Microsoft.UI.Xaml.Controls.Primitives.h>
+#include <winrt/Microsoft.UI.Xaml.XamlTypeInfo.h>
+#include <winrt/Microsoft.UI.Xaml.Markup.h>
+
+
+#define ui_reset_layout(layout) memset(&(layout), 0, sizeof(UiLayout))
+#define ui_lb2bool(b) ((b) == UI_LAYOUT_TRUE ? TRUE : FALSE)
+#define ui_bool2lb(b) ((b) ? UI_LAYOUT_TRUE : UI_LAYOUT_FALSE)
+
+typedef struct UiLayout UiLayout;
+typedef enum UiLayoutBool UiLayoutBool;
+
+using namespace winrt;
+using namespace Microsoft::UI::Xaml;
+using namespace Microsoft::UI::Xaml::Controls;
+using namespace Microsoft::UI::Xaml::XamlTypeInfo;
+using namespace Microsoft::UI::Xaml::Markup;
+using namespace Windows::UI::Xaml::Interop;
+
+enum UiLayoutBool {
+    UI_LAYOUT_UNDEFINED = 0,
+    UI_LAYOUT_TRUE,
+    UI_LAYOUT_FALSE,
+};
+
+struct UiLayout {
+    UiLayoutBool fill;
+    UiBool       newline;
+    char* label;
+    UiBool       hexpand;
+    UiBool       vexpand;
+    int          width;
+    int          height;
+    int          colspan;
+    int          rowspan;
+};
+
+struct UiContainer {
+    UiLayout layout;
+    int close = 0;
+
+    virtual void Add(FrameworkElement control, UiBool fill) = 0;
+};
+
+enum UiBoxContainerType {
+    UI_BOX_CONTAINER_VBOX = 0,
+    UI_BOX_CONTAINER_HBOX
+};
+
+enum UiNavigationViewType {
+    UI_NAVIGATIONVIEW_TOP = 0,
+    UI_NAVIGATIONVIEW_SIDE
+};
+
+struct UiBoxContainer : UiContainer {
+    Grid grid;
+    enum UiBoxContainerType type;
+    RowDefinition boxRowDef;
+    ColumnDefinition boxColDef;
+
+    UiBoxContainer(Grid grid, enum UiBoxContainerType type, int margin, int spacing);
+
+    void Add(FrameworkElement control, UiBool fill);
+};
+
+struct UiGridContainer : UiContainer {
+    Grid grid;
+    int x = 0;
+    int y = -1;
+    int cols = 0;
+
+    UiGridContainer(Grid grid, int margin, int columnspacing, int rowspacing);
+
+    void Add(FrameworkElement control, UiBool fill);
+};
+
+struct UiTabView {
+    UiObject* current;
+    UiSubContainerType subcontainer;
+    int margin;
+    int spacing;
+    int columnspacing;
+    int rowspacing;
+
+    virtual UiObject* AddTab(const char* label) = 0;
+
+    virtual FrameworkElement GetFrameworkElement() = 0;
+};
+
+struct UiTabViewContainer : UiContainer {
+    UiTabView* tabview;
+
+    UiTabViewContainer(UiTabView* tabview);
+
+    void Add(FrameworkElement control, UiBool fill);
+};
+
+struct UiPivotTabView : UiTabView {
+    Pivot pivot;
+
+    UiPivotTabView(UiObject *obj, Pivot pivot, UiTabViewArgs args);
+
+    UiObject* AddTab(const char* label);
+    FrameworkElement GetFrameworkElement();
+};
+
+struct UiMainTabView : UiTabView {
+    TabView tabview;
+
+    UiMainTabView(UiObject* obj, TabView tabview, UiTabViewArgs args);
+
+    UiObject* AddTab(const char* label);
+    FrameworkElement GetFrameworkElement();
+};
+
+struct UiNavigationTabView : UiTabView {
+    NavigationView navigationview;
+    UiTabViewType type;
+    std::vector<std::tuple<NavigationViewItem, FrameworkElement> > pages;
+
+    UiNavigationTabView(UiObject* obj, NavigationView navigationview, UiTabViewArgs args, UiTabViewType type);
+
+    UiObject* AddTab(const char* label);
+    FrameworkElement GetFrameworkElement();
+
+    void SelectionChanged(NavigationView const& sender, NavigationViewSelectionChangedEventArgs const& args);
+};

mercurial