ui/winui/table.cpp

Thu, 19 Oct 2023 18:30:19 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 19 Oct 2023 18:30:19 +0200
branch
newapi
changeset 221
a82d9beaa94a
parent 218
d06e7e8e53e1
child 223
8d7ca1b320e2
permissions
-rw-r--r--

add semi-functional pathbar (WinUI3)

203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2023 Olaf Wintermann. All rights reserved.
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
205
b1ac0dd1d38b new winui vs project, add toolbar
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 203
diff changeset
29 #include "pch.h"
b1ac0dd1d38b new winui vs project, add toolbar
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 203
diff changeset
30
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include "table.h"
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include "container.h"
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include "util.h"
215
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
34 #include "icons.h"
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 #include "../common/context.h"
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 #include "../common/object.h"
215
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
38 #include "../common/types.h"
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 #include <winrt/Microsoft.UI.Xaml.Data.h>
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 #include <winrt/Microsoft.UI.Xaml.Media.h>
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 #include <winrt/Microsoft.UI.Xaml.Input.h>
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
43 #include <winrt/Windows.UI.Core.h>
221
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
44 #include <winrt/Windows.ApplicationModel.h>
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
45 #include <winrt/Windows.ApplicationModel.DataTransfer.h>
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 using namespace winrt;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 using namespace Microsoft::UI::Xaml;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 using namespace Microsoft::UI::Xaml::Controls;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 using namespace Windows::UI::Xaml::Interop;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 using namespace winrt::Windows::Foundation;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 using namespace winrt::Microsoft::UI::Xaml::Controls::Primitives;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 using namespace winrt::Microsoft::UI::Xaml::Media;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 using namespace winrt::Windows::UI::Xaml::Input;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
56 static UINT ui_double_click_time = GetDoubleClickTime();
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
57
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 extern "C" void reg_table_destructor(UiContext * ctx, UiTable * table) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 // TODO:
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 UIEXPORT UIWIDGET ui_table_create(UiObject* obj, UiListArgs args) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 if (!args.model) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 return nullptr;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 UiObject* current = uic_current_obj(obj);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 // create widgets and wrapper obj
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 ScrollViewer scrollW = ScrollViewer();
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 Grid grid = Grid();
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 scrollW.Content(grid);
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
73 UiTable* uitable = new UiTable(obj, scrollW, grid);
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 reg_table_destructor(current->ctx, uitable);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 uitable->getvalue = args.model->getvalue ? args.model->getvalue : args.getvalue;
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
77 uitable->onselection = args.onselection;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
78 uitable->onselectiondata = args.onselectiondata;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
79 uitable->onactivate = args.onactivate;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
80 uitable->onactivatedata = args.onactivatedata;
221
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
81 uitable->ondragstart = args.ondragstart;
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
82 uitable->ondragstartdata = args.ondragstartdata;
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
83 uitable->ondragcomplete = args.ondragcomplete;
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
84 uitable->ondrop = args.ondrop;
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
85 uitable->ondropdata = args.ondropsdata;
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
86 uitable->enabledrag = args.enabledrag;
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
87 uitable->enabledrop = args.enabledrop;
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 // grid styling
210
83556205edad change table colors (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
90 winrt::Windows::UI::Color bg = { 255, 255, 255, 255 }; // test color
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 SolidColorBrush brush = SolidColorBrush(bg);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 grid.Background(brush);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 // add columns from args.model
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 uitable->add_header(args.model);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 // bind var
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 if (var) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 UiList* list = (UiList*)var->value;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 list->update = ui_table_update;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 list->obj = uitable;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 uitable->update(list, 0);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 // create toolkit wrapper object and register destructor
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 UIElement elm = scrollW;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 UiWidget* widget = new UiWidget(elm);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 ui_context_add_widget_destructor(current->ctx, widget);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 // add scrollW to current container
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 UI_APPLY_LAYOUT1(current, args);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 current->container->Add(scrollW, false);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 return widget;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 extern "C" void ui_table_update(UiList * list, int i) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 UiTable* table = (UiTable*)list->obj;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 table->clear();
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 table->update(list, i);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
125 UiTable::UiTable(UiObject *obj, winrt::Microsoft::UI::Xaml::Controls::ScrollViewer scrollW, winrt::Microsoft::UI::Xaml::Controls::Grid grid) {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
126 this->obj = obj;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
127
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 this->scrollw = scrollw;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 this->grid = grid;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130
210
83556205edad change table colors (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
131 winrt::Windows::UI::Color highlightBg = { 255, 234, 234, 234 };
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
132 highlightBrush = SolidColorBrush(highlightBg);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
133
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
134 winrt::Windows::UI::Color defaultBg = { 0, 0, 0, 0 }; // default
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
135 defaultBrush = SolidColorBrush(defaultBg);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
136
210
83556205edad change table colors (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
137 winrt::Windows::UI::Color selectedBg = { 255, 204, 232, 255 }; // test color
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
138 selectedBrush = SolidColorBrush(selectedBg);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
139
210
83556205edad change table colors (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 205
diff changeset
140 winrt::Windows::UI::Color selectedFg = { 255, 0, 90, 158 }; // test color
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
141 selectedBorderBrush = SolidColorBrush(selectedFg);
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
142
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
143 grid.KeyDown(
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
144 winrt::Microsoft::UI::Xaml::Input::KeyEventHandler(
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
145 [=](IInspectable const& sender, winrt::Microsoft::UI::Xaml::Input::KeyRoutedEventArgs const& args) {
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
146 // key event for hanling the table cursor or enter
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
147 })
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
148 );
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
149 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150
215
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
151 UiTable::~UiTable() {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
152 ui_model_free(NULL, model);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
153 }
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
154
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155 void UiTable::add_header(UiModel* model) {
215
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
156 this->model = ui_model_copy(NULL, model);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
157
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158 GridLength gl;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159 gl.Value = 0;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160 gl.GridUnitType = GridUnitType::Auto;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
161
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
162 // add header row definition
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
163 auto headerRowDef = RowDefinition();
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
164 headerRowDef.Height(gl);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165 grid.RowDefinitions().Append(headerRowDef);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
168 for (int i = 0; i < model->columns;i++) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169 char* title = model->titles[i];
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
170 UiModelType type = model->types[i];
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172 // add grid column definition
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173 auto colDef = ColumnDefinition();
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174 colDef.Width(gl);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175 grid.ColumnDefinitions().Append(colDef);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
176
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
177 // add button
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
178 auto button = Button();
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
179 wchar_t* wlabel = str2wstr(title, nullptr);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
180 button.Content(box_value(wlabel));
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
181 free(wlabel);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
182
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
183 // some styling for the button
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
184 Thickness border = { 0,0,1,0 };
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
185 CornerRadius corner = { 0,0,0,0 };
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
186 button.BorderThickness(border);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
187 button.CornerRadius(corner);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
188
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
189 grid.SetColumn(button, i);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
190 grid.SetRow(button, 0);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
191 grid.Children().Append(button);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
192
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
193 UiTableColumn h;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
194 h.header = button;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
195 header.push_back(h);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
196 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
197
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
198 maxrows = 1;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
200
215
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
201 static void textblock_set_str(TextBlock &t, const char *str) {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
202 if (str) {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
203 wchar_t* wstr = str2wstr(str, nullptr);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
204 t.Text(winrt::hstring(wstr));
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
205 free(wstr);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
206 }
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
207 }
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
208
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
209 static void textblock_set_int(TextBlock& t, int i) {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
210 wchar_t buf[16];
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
211 swprintf(buf, 16, L"%d", i);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
212 t.Text(winrt::hstring(buf));
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
213 }
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
214
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
215 static ULONG64 getsystime() {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
216 SYSTEMTIME st;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
217 GetSystemTime(&st);
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
218 return st.wYear * 10000000000000 +
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
219 st.wMonth * 100000000000 +
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
220 st.wDay * 1000000000 +
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
221 st.wHour * 10000000 +
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
222 st.wMinute * 100000 +
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
223 st.wSecond * 1000 +
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
224 st.wMilliseconds;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
225 }
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
226
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
227 void UiTable::update(UiList* list, int i) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
228 if (getvalue == nullptr) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
229 return;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
230 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
231
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
232 Thickness b1 = { 1, 1, 0, 1 }; // first col
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
233 Thickness b2 = { 0, 1, 0, 1 }; // middle
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
234 Thickness b3 = { 0, 1, 1, 1 }; // last col
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
235
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
236 GridLength gl;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
237 gl.Value = 0;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
238 gl.GridUnitType = GridUnitType::Auto;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
239
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
240 // iterate model
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
241 int row = 1;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
242 void* elm = list->first(list);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
243 while (elm) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
244 if (row >= maxrows) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
245 auto rowdef = RowDefinition();
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
246 rowdef.Height(gl);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
247 grid.RowDefinitions().Append(rowdef);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
248 maxrows = row;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
249 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
250
215
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
251 Thickness cellpadding = { 10,0,4,0 };
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
252
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
253 // model column, usually the same as col, however UI_ICON_TEXT uses two columns in the model
215
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
254 int model_col = 0;
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
255 for (int col = 0; col < header.size(); col++, model_col++) {
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
256 // create ui elements with the correct cell border
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
257 // dependeing on the column
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
258 Border cellBorder = Border();
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
259 cellBorder.Background(defaultBrush);
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
260 cellBorder.BorderBrush(defaultBrush);
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
261 if (col == 0) {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
262 cellBorder.BorderThickness(b1);
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
263 }
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
264 else if (col + 1 == header.size()) {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
265 cellBorder.BorderThickness(b3);
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
266 }
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
267 else {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
268 cellBorder.BorderThickness(b2);
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
269 }
215
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
270
221
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
271 // dnd
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
272 if (enabledrag) {
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
273 cellBorder.CanDrag(enabledrag);
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
274 cellBorder.DragStarting([](IInspectable const& sender, DragStartingEventArgs args) {
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
275 //args.Data().SetText(L"test");
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
276 });
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
277 }
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
278 if (enabledrop) {
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
279 cellBorder.AllowDrop(enabledrop);
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
280 }
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
281
215
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
282 // set the cell value
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
283 // depending on the type, we create different cell controls
215
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
284 UiModelType type = model->types[col];
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
285 switch (type) {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
286 case UI_STRING: {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
287 TextBlock cell = TextBlock();
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
288 cell.Padding(cellpadding);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
289 cell.VerticalAlignment(VerticalAlignment::Stretch);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
290 textblock_set_str(cell, (char*)getvalue(elm, model_col));
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
291 cellBorder.Child(cell);
221
a82d9beaa94a add semi-functional pathbar (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 218
diff changeset
292
215
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
293 break;
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
294 }
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
295 case UI_INTEGER: {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
296 TextBlock cell = TextBlock();
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
297 cell.Padding(cellpadding);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
298 cell.VerticalAlignment(VerticalAlignment::Stretch);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
299 int *value = (int*)getvalue(elm, model_col);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
300 if (value) {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
301 textblock_set_int(cell, *value);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
302 }
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
303 cellBorder.Child(cell);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
304 break;
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
305 }
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
306 case UI_ICON: {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
307 UiIcon* iconConstr = (UiIcon*)getvalue(elm, model_col);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
308 if (iconConstr) {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
309 IconElement icon = iconConstr->getIcon();
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
310 cellBorder.Child(icon);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
311 }
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
312 break;
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
313 }
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
314 case UI_ICON_TEXT: {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
315 StackPanel cellPanel = StackPanel();
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
316 cellPanel.Spacing(2);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
317 cellPanel.Padding(cellpadding);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
318 cellPanel.VerticalAlignment(VerticalAlignment::Stretch);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
319
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
320 cellPanel.Orientation(Orientation::Horizontal);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
321 UiIcon* iconConstr = (UiIcon*)getvalue(elm, model_col++);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
322 char* str = (char*)getvalue(elm, model_col);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
323 if (iconConstr) {
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
324 IconElement icon = iconConstr->getIcon();
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
325 cellPanel.Children().Append(icon);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
326 }
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
327 TextBlock cell = TextBlock();
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
328 textblock_set_str(cell, str);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
329 cellPanel.Children().Append(cell);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
330 cellBorder.Child(cellPanel);
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
331 break;
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
332 }
1bd5534c395d add support for icons in the table widget (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 214
diff changeset
333 }
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
334
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
335 // event handler
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
336 cellBorder.PointerPressed(
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
337 winrt::Microsoft::UI::Xaml::Input::PointerEventHandler(
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
338 [=](IInspectable const& sender, winrt::Microsoft::UI::Xaml::Input::PointerRoutedEventArgs const& args) {
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
339 winrt::Windows::System::VirtualKeyModifiers modifiers = args.KeyModifiers();
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
340 bool update_selection = true;
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
341
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
342 if (modifiers == winrt::Windows::System::VirtualKeyModifiers::Control) {
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
343 // add/remove current row
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
344 if (!is_row_selected(row)) {
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
345 row_background(row, selectedBrush, selectedBorderBrush);
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
346 selection.push_back(row);
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
347 }
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
348 else {
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
349 row_background(row, highlightBrush, highlightBrush);
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
350 remove_from_selection(row);
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
351 }
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
352 }
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
353 else if (modifiers == winrt::Windows::System::VirtualKeyModifiers::None || selection.size() == 0) {
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
354 // no modifier or shift is pressed but there is no selection
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
355 if (selection.size() > 0) {
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
356 change_rows_bg(selection, defaultBrush, defaultBrush);
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
357 }
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
358
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
359 row_background(row, selectedBrush, selectedBorderBrush);
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
360 selection = { row };
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
361 if (modifiers == winrt::Windows::System::VirtualKeyModifiers::None) {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
362 SYSTEMTIME st;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
363 GetSystemTime(&st);
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
364
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
365 ULONG64 now = getsystime();
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
366 ULONG64 tdiff = now - lastPointerPress;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
367 if (tdiff < ui_double_click_time && onactivate != nullptr) {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
368 // two pointer presse events in short time and we have an onactivate handler
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
369 update_selection = false; // we don't want an additional selection event
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
370 lastPointerPress = 0; // reset double-click
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
371
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
372 int selectedrow = row - 1; // subtract header row
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
373
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
374 UiListSelection selection;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
375 selection.count = 1;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
376 selection.rows = &selectedrow;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
377
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
378 UiEvent evt;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
379 evt.obj = obj;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
380 evt.window = obj->window;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
381 evt.document = obj->ctx->document;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
382 evt.eventdata = &selection;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
383 evt.intval = selectedrow;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
384 onactivate(&evt, onactivatedata);
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
385 }
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
386 else {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
387 lastPointerPress = now;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
388 }
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
389 }
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
390 }
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
391 else if (modifiers == winrt::Windows::System::VirtualKeyModifiers::Shift) {
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
392 // select everything between the first selection and the current row
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
393 std::sort(selection.begin(), selection.end());
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
394 int first = selection.front();
216
391c2c723029 add dll icon loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
395 int last = row;
391c2c723029 add dll icon loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
396 if (first > row) {
391c2c723029 add dll icon loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
397 last = first;
391c2c723029 add dll icon loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
398 first = row;
391c2c723029 add dll icon loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
399 }
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
400
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
401 // clear previous selection
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
402 change_rows_bg(selection, defaultBrush, defaultBrush);
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
403
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
404 // create new selection
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
405 std::vector<int> newselection;
216
391c2c723029 add dll icon loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 215
diff changeset
406 for (int s = first; s <= last; s++) {
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
407 newselection.push_back(s);
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
408 }
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
409 selection = newselection;
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
410 change_rows_bg(selection, selectedBrush, selectedBorderBrush);
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
411 }
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
412
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
413 if (update_selection) {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
414 call_handler(onselection, onselectiondata);
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
415 }
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
416 })
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
417 );
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
418 cellBorder.PointerReleased(
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
419 winrt::Microsoft::UI::Xaml::Input::PointerEventHandler(
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
420 [=](IInspectable const& sender, winrt::Microsoft::UI::Xaml::Input::PointerRoutedEventArgs const& args) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
421
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
422 })
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
423 );
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
424 cellBorder.PointerEntered(
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
425 winrt::Microsoft::UI::Xaml::Input::PointerEventHandler(
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
426 [=](IInspectable const& sender, winrt::Microsoft::UI::Xaml::Input::PointerRoutedEventArgs const& args) {
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
427 if (!is_row_selected(row)) {
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
428 row_background(row, highlightBrush, highlightBrush);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
429 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
430 })
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
431 );
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
432 cellBorder.PointerExited(
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
433 winrt::Microsoft::UI::Xaml::Input::PointerEventHandler(
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
434 [=](IInspectable const& sender, winrt::Microsoft::UI::Xaml::Input::PointerRoutedEventArgs const& args) {
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
435 if (!is_row_selected(row)) {
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
436 row_background(row, defaultBrush, defaultBrush);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
437 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
438 })
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
439 );
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
440
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
441 grid.SetColumn(cellBorder, col);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
442 grid.SetRow(cellBorder, row);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
443 grid.Children().Append(cellBorder);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
444 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
445
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
446 row++;
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
447 elm = list->next(list);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
448 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
449 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
450
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
451 void UiTable::clear() {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
452 for (int i = grid.Children().Size()-1; i >= 0; i--) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
453 FrameworkElement elm = grid.Children().GetAt(i).as<FrameworkElement>();
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
454 int child_row = grid.GetRow(elm);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
455 if (child_row > 0) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
456 grid.Children().RemoveAt(i);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
457 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
458 }
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
459
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
460 // TODO: should we clean row definitions?
203
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
461 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
462
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
463 void UiTable::row_background(int row, winrt::Microsoft::UI::Xaml::Media::Brush brush, winrt::Microsoft::UI::Xaml::Media::Brush borderBrush) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
464 Thickness b1 = { 1, 1, 0, 1 }; // first col
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
465 Thickness b2 = { 0, 1, 0, 1 }; // middle
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
466 Thickness b3 = { 0, 1, 1, 1 }; // last col
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
467
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
468 for (auto child : grid.Children()) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
469 FrameworkElement elm = child.as<FrameworkElement>();
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
470 int child_row = grid.GetRow(elm);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
471 if (child_row == row) {
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
472 Border b = elm.as<Border>();
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
473 b.Background(brush);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
474 b.BorderBrush(borderBrush);
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
475 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
476 }
0e94be3d9722 add semi-functional table (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
477 }
214
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
478
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
479 void UiTable::change_rows_bg(std::vector<int> rows, winrt::Microsoft::UI::Xaml::Media::Brush brush, winrt::Microsoft::UI::Xaml::Media::Brush borderBrush) {
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
480 std::for_each(rows.cbegin(), rows.cend(), [&](const int& row) {row_background(row, brush, borderBrush); });
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
481 }
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
482
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
483 bool UiTable::is_row_selected(int row) {
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
484 return std::find(selection.begin(), selection.end(), row) != selection.end() ? true : false;
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
485 }
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
486
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
487 void UiTable::remove_from_selection(int row) {
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
488 selection.erase(std::remove(selection.begin(), selection.end(), row), selection.end());
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
489 selection.shrink_to_fit();
279c0c81d3b1 improve table row selection, add support for multiple selections (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 210
diff changeset
490 }
218
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
491
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
492 void UiTable::call_handler(ui_callback cb, void* cbdata) {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
493 if (!cb) {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
494 return;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
495 }
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
496
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
497 std::sort(selection.begin(), selection.end());
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
498
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
499 UiListSelection selobj;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
500 selobj.count = selection.size();
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
501 selobj.rows = nullptr;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
502 if (selobj.count > 0) {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
503 selobj.rows = (int*)calloc(selobj.count, sizeof(int));
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
504 memcpy(selobj.rows, selection.data(), selobj.count * sizeof(int));
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
505 for (int i = 0; i < selobj.count; i++) {
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
506 selobj.rows[i]--;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
507 }
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
508 }
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
509
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
510 UiEvent evt;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
511 evt.obj = obj;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
512 evt.window = obj->window;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
513 evt.document = obj->ctx->document;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
514 evt.eventdata = &selobj;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
515 evt.intval = 0;
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
516 cb(&evt, cbdata);
d06e7e8e53e1 implement table activate/selection events (WinUI3)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 216
diff changeset
517 }

mercurial