Mon, 10 Nov 2025 21:52:51 +0100
update ucx
|
109
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
4 | * Copyright 2025 Olaf Wintermann. All rights reserved. |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
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 |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | #import "list.h" |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
30 | #import "ListDelegate.h" |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
31 | #import <objc/runtime.h> |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
32 | |
| 112 | 33 | #import <inttypes.h> |
| 34 | #import <limits.h> | |
| 35 | ||
| 36 | #import <cx/array_list.h> | |
| 37 | ||
|
109
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
38 | static void* getvalue_wrapper(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
39 | ui_getvaluefunc getvalue = (ui_getvaluefunc)userdata; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
40 | return getvalue(elm, col); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
41 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
42 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
43 | static void* str_getvalue(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
44 | return elm; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
45 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
46 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | /* --------------------------- ListView --------------------------- */ |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
48 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
49 | /* |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | * adds a NSTableViewDelegate that handles all events and calls |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | * callbacks specified in the UiListArgs |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
52 | */ |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
53 | static void add_listdelegate(UiObject *obj, NSTableView *tableview, UiListArgs *args) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
54 | ListDelegate *delegate = [[ListDelegate alloc] init:tableview obj:obj]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
55 | delegate.onactivate = args->onactivate; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
56 | delegate.onactivatedata = args->onactivatedata; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
57 | delegate.onselection = args->onselection; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | delegate.onselectiondata = args->onselectiondata; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
59 | tableview.delegate = delegate; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
60 | objc_setAssociatedObject(tableview, "ui_listdelegate", delegate, OBJC_ASSOCIATION_RETAIN); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
61 | tableview.doubleAction = @selector(activateEvent:); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
62 | tableview.target = delegate; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
63 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
64 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
65 | static void bind_list_to_tableview(UiList *list, NSTableView *tableview) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
66 | list->obj = (__bridge void*)tableview; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
67 | list->update = ui_tableview_update; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
68 | list->getselection = ui_tableview_getselection; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
69 | list->setselection = ui_tableview_setselection; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
70 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
71 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
73 | NSScrollView *scrollview = [[NSScrollView alloc] init]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
74 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
75 | NSTableView *tableview = [[NSTableView alloc] init]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
76 | tableview.autoresizingMask = NSViewWidthSizable; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
77 | tableview.headerView = nil; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
78 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
79 | if(args->multiselection) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
80 | tableview.allowsMultipleSelection = YES; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
81 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
83 | scrollview.documentView = tableview; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
84 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
85 | UiLayout layout = UI_INIT_LAYOUT(args); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
86 | ui_container_add(obj, scrollview, &layout); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
87 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
88 | add_listdelegate(obj, tableview, args); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
89 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
90 | UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
91 | if(var) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
92 | UiList *list = var->value; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
93 | bind_list_to_tableview(list, tableview); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
94 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
95 | ui_getvaluefunc2 getvalue = args->getvalue2; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
96 | void *getvaluedata = args->getvalue2data; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
97 | if(!getvalue) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
98 | if(args->getvalue) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
99 | getvalue = getvalue_wrapper; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
100 | getvaluedata = (void*)args->getvalue; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
101 | } else { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
102 | getvalue = str_getvalue; // by default list values are interpreted as strings |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
103 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
104 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
105 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
106 | NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column"]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
107 | [tableview addTableColumn:column]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
108 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
109 | ListDataSource *dataSource = [[ListDataSource alloc] init:tableview.tableColumns var:var getvalue:getvalue getvaluedata:getvaluedata]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
110 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
111 | tableview.dataSource = dataSource; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
112 | [tableview reloadData]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
113 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
114 | objc_setAssociatedObject(tableview, "ui_datasource", dataSource, OBJC_ASSOCIATION_RETAIN); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
115 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
116 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
117 | return (__bridge void*)scrollview; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
118 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
119 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
120 | /* --------------------------- TableView --------------------------- */ |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
121 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
122 | UIWIDGET ui_table_create(UiObject* obj, UiListArgs *args) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
123 | NSScrollView *scrollview = [[NSScrollView alloc] init]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
124 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
125 | NSTableView *tableview = [[NSTableView alloc] init]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
126 | tableview.autoresizingMask = NSViewWidthSizable; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
127 | tableview.columnAutoresizingStyle = NSTableViewSequentialColumnAutoresizingStyle; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
128 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
129 | if(args->multiselection) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
130 | tableview.allowsMultipleSelection = YES; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
131 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
132 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
133 | UiLayout layout = UI_INIT_LAYOUT(args); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
134 | ui_container_add(obj, scrollview, &layout); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
135 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
136 | add_listdelegate(obj, tableview, args); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
137 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
138 | // convert model |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
139 | NSMutableArray<NSTableColumn*> *cols = [[NSMutableArray alloc] init]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
140 | UiModel *model = args->model; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
141 | if(model) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
142 | for(int i=0;i<model->columns;i++) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
143 | char *title = model->titles[i]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
144 | UiModelType type = model->types[i]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
145 | int width = model->columnsize[i]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
146 | NSString *identifier = [[NSString alloc] initWithUTF8String:title]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
147 | NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:identifier]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
148 | column.title = identifier; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
149 | column.resizingMask = NSTableColumnUserResizingMask; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
150 | if(width > 0) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
151 | column.width = width; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
152 | } else if(width < 0) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
153 | column.resizingMask = NSTableColumnAutoresizingMask | NSTableColumnUserResizingMask; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
154 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
155 | if(type >= UI_ICON) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
156 | // TODO |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
157 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
158 | [tableview addTableColumn:column]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
159 | [cols addObject:column]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
160 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
161 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
162 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
163 | UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
164 | if(var) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
165 | UiList *list = var->value; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
166 | bind_list_to_tableview(list, tableview); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
167 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
168 | ui_getvaluefunc2 getvalue = args->getvalue2; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
169 | void *getvaluedata = args->getvalue2data; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
170 | if(!getvalue) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
171 | if(args->getvalue) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
172 | getvalue = getvalue_wrapper; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
173 | getvaluedata = (void*)args->getvalue; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
174 | } else { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
175 | fprintf(stderr, "Error: tableview requires getvalue or getvalue2 func\n"); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
176 | return (__bridge void*)scrollview; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
177 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
178 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
179 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
180 | ListDataSource *dataSource = [[ListDataSource alloc] init:cols var:var getvalue:getvalue getvaluedata:getvaluedata]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
181 | if(model) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
182 | dataSource.model = ui_model_copy(obj->ctx, model); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
183 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
184 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
185 | tableview.dataSource = dataSource; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
186 | [tableview reloadData]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
187 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
188 | objc_setAssociatedObject(tableview, "ui_datasource", dataSource, OBJC_ASSOCIATION_RETAIN); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
189 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
190 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
191 | scrollview.documentView = tableview; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
192 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
193 | return (__bridge void*)scrollview; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
194 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
195 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
196 | /* ------ common functions ------ */ |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
197 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
198 | void ui_tableview_update(UiList *list, int i) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
199 | NSTableView *tableview = (__bridge NSTableView*)list->obj; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
200 | if(i < 0) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
201 | [tableview reloadData]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
202 | } else { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
203 | [tableview reloadData]; // TODO: optimize |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
204 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
205 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
206 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
207 | UiListSelection ui_tableview_getselection(UiList *list) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
208 | NSTableView *tableview = (__bridge NSTableView*)list->obj; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
209 | return ui_tableview_selection(tableview); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
210 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
211 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
212 | void ui_tableview_setselection(UiList *list, UiListSelection selection) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
213 | NSTableView *tableview = (__bridge NSTableView*)list->obj; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
214 | NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
215 | for(int i=0;i<selection.count;i++) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
216 | [indexSet addIndex:selection.rows[i]]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
217 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
218 | [tableview selectRowIndexes:indexSet byExtendingSelection:NO]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
219 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
220 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
221 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
222 | /* --------------------------- DropDown --------------------------- */ |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
223 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
224 | @implementation UiDropDown |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
225 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
226 | - (id)init:(UiObject*)obj { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
227 | _obj = obj; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
228 | return self; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
229 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
230 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
231 | - (void) comboBoxSelectionDidChange:(NSNotification *) notification { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
232 | int index = (int)_combobox.indexOfSelectedItem; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
233 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
234 | void *eventdata = NULL; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
235 | if(_var) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
236 | UiList *list = _var->value; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
237 | if(index >= 0) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
238 | eventdata = list->get(list, index); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
239 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
240 | } else { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
241 | NSString *str = _combobox.objectValueOfSelectedItem; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
242 | if(str) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
243 | eventdata = (void*)str.UTF8String; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
244 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
245 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
246 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
247 | UiEvent event; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
248 | event.obj = _obj; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
249 | event.window = event.obj->window; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
250 | event.document = event.obj->ctx->document; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
251 | event.eventdata = eventdata; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
252 | event.eventdatatype = UI_EVENT_DATA_LIST_ELM; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
253 | event.intval = index; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
254 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
255 | if(_onselection) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
256 | _onselection(&event, _onselectiondata); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
257 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
258 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
259 | if(_onactivate) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
260 | _onactivate(&event, _onactivatedata); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
261 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
262 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
263 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
264 | @end |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
265 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
266 | UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs *args) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
267 | NSComboBox *dropdown = [[NSComboBox alloc] init]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
268 | dropdown.editable = NO; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
269 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
270 | UiDropDown *uidropdown = [[UiDropDown alloc] init:obj]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
271 | objc_setAssociatedObject(dropdown, "ui_dropdown", uidropdown, OBJC_ASSOCIATION_RETAIN); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
272 | uidropdown.onactivate = args->onactivate; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
273 | uidropdown.onactivatedata = args->onactivatedata; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
274 | uidropdown.onselection = args->onselection; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
275 | uidropdown.onselectiondata = args->onselectiondata; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
276 | uidropdown.combobox = dropdown; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
277 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
278 | if(!args->getvalue2) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
279 | if(args->getvalue) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
280 | args->getvalue2 = getvalue_wrapper; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
281 | args->getvalue2data = (void*)args->getvalue; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
282 | } else { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
283 | args->getvalue2 = str_getvalue; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
284 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
285 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
286 | uidropdown.getvalue = args->getvalue2; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
287 | uidropdown.getvaluedata = args->getvalue2data; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
288 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
289 | UiLayout layout = UI_INIT_LAYOUT(args); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
290 | ui_container_add(obj, dropdown, &layout); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
291 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
292 | UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
293 | if(var) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
294 | UiList *list = var->value; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
295 | list->obj = (__bridge void*)dropdown; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
296 | list->update = ui_dropdown_update; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
297 | list->getselection = ui_dropdown_getselection; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
298 | list->setselection = ui_dropdown_setselection; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
299 | ui_dropdown_update(list, -1); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
300 | } else { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
301 | for(int i=0;i<args->static_nelm;i++) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
302 | char *str = args->static_elements[i]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
303 | NSString *item = [[NSString alloc] initWithUTF8String:str]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
304 | [dropdown addItemWithObjectValue:item]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
305 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
306 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
307 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
308 | uidropdown.var = var; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
309 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
310 | return (__bridge void*)dropdown; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
311 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
312 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
313 | void ui_dropdown_update(UiList *list, int i) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
314 | NSComboBox *combobox = (__bridge NSComboBox*)list->obj; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
315 | UiDropDown *dropdown = objc_getAssociatedObject(combobox, "ui_dropdown"); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
316 | if(dropdown) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
317 | [combobox removeAllItems]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
318 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
319 | ui_getvaluefunc2 getvalue = dropdown.getvalue; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
320 | void *getvaluedata = dropdown.getvaluedata; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
321 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
322 | int index = 0; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
323 | void *elm = list->first(list); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
324 | while(elm) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
325 | UiBool freeResult = FALSE; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
326 | char *str = getvalue(list, elm, index, 0, getvaluedata, &freeResult); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
327 | if(str) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
328 | NSString *item = [[NSString alloc] initWithUTF8String:str]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
329 | [combobox addItemWithObjectValue:item]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
330 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
331 | if(freeResult) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
332 | free(str); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
333 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
334 | elm = list->next(list); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
335 | index++; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
336 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
337 | } else { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
338 | fprintf(stderr, "Error: obj is not a dropdown\n"); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
339 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
340 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
341 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
342 | UiListSelection ui_dropdown_getselection(UiList *list) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
343 | UiListSelection sel = { 0, NULL }; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
344 | NSComboBox *combobox = (__bridge NSComboBox*)list->obj; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
345 | NSInteger index = combobox.indexOfSelectedItem; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
346 | if(index >= 0) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
347 | sel.rows = malloc(sizeof(int)); |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
348 | sel.count = 1; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
349 | sel.rows[0] = (int)index; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
350 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
351 | return sel; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
352 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
353 | |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
354 | void ui_dropdown_setselection(UiList *list, UiListSelection selection) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
355 | NSComboBox *combobox = (__bridge NSComboBox*)list->obj; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
356 | if(selection.count > 0) { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
357 | [combobox selectItemAtIndex:selection.rows[0]]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
358 | } else { |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
359 | [combobox selectItemAtIndex: -1]; |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
360 | } |
|
c3dfcb8f0be7
update toolkit, remove getvalue func from model to table/listview args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
361 | } |
| 112 | 362 | |
| 363 | ||
| 364 | /* --------------------------- SourceList --------------------------- */ | |
| 365 | ||
| 113 | 366 | static ui_sourcelist_update_func sclist_update_callback = NULL; |
| 367 | ||
| 368 | void ui_sourcelist_set_update_callback(ui_sourcelist_update_func cb) { | |
| 369 | sclist_update_callback = cb; | |
| 370 | } | |
| 371 | ||
| 372 | void ui_sourcelist_updated(void) { | |
| 373 | if(sclist_update_callback) { | |
| 374 | sclist_update_callback(); | |
| 375 | } | |
| 376 | } | |
| 377 | ||
| 112 | 378 | static void sublist_free(const CxAllocator *a, UiSubList *sl) { |
| 379 | cxFree(a, (char*)sl->varname); | |
| 380 | cxFree(a, (char*)sl->header); | |
| 381 | } | |
| 382 | ||
| 383 | static UiSubList copy_sublist(const CxAllocator *a, UiSubList *sl) { | |
| 384 | UiSubList new_sl; | |
| 385 | new_sl.value = sl->value; | |
| 386 | new_sl.varname = sl->varname ? cx_strdup_a(a, cx_str(sl->varname)).ptr : NULL; | |
| 387 | new_sl.header = sl->header ? cx_strdup_a(a, cx_str(sl->header)).ptr : NULL; | |
| 388 | new_sl.separator = sl->separator; | |
| 389 | new_sl.userdata = sl->userdata; | |
| 390 | return new_sl; | |
| 391 | } | |
| 392 | ||
| 393 | static CxList* copy_sublists(const CxAllocator *a, UiSourceListArgs *args) { | |
| 394 | if(args->sublists) { | |
| 395 | size_t max = args->numsublists; | |
| 396 | if(max == 0) { | |
| 397 | max = INT_MAX; | |
| 398 | } | |
| 399 | ||
| 400 | CxList *sublists = cxArrayListCreate(a, NULL, sizeof(UiSubList), args->numsublists); | |
| 401 | sublists->collection.advanced_destructor = (cx_destructor_func2)sublist_free; | |
| 402 | ||
| 403 | for(int i=0;i<max;i++) { | |
| 404 | UiSubList *sl = &args->sublists[i]; | |
| 405 | if(sl->value == NULL && sl->varname == NULL) { | |
| 406 | break; | |
| 407 | } | |
| 408 | ||
| 409 | UiSubList new_sl = copy_sublist(a, sl); | |
| 410 | cxListAdd(sublists, &new_sl); | |
| 411 | } | |
| 412 | ||
| 413 | return sublists; | |
| 414 | } | |
| 415 | return NULL; | |
| 416 | } | |
| 417 | ||
| 418 | UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs *args) { | |
| 419 | // create views | |
| 420 | NSScrollView *scrollview = [[NSScrollView alloc] init]; | |
| 421 | scrollview.autoresizingMask = NSViewWidthSizable; | |
| 422 | scrollview.hasVerticalScroller = YES; | |
| 423 | scrollview.hasHorizontalScroller = NO; | |
| 424 | scrollview.autohidesScrollers = YES; | |
| 425 | ||
| 426 | NSOutlineView *outline = [[NSOutlineView alloc]init]; | |
| 427 | NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"x"]; | |
| 428 | [outline addTableColumn:column]; | |
| 429 | outline.outlineTableColumn = column; | |
| 430 | outline.headerView = NULL; | |
| 431 | outline.rowSizeStyle = NSTableViewRowSizeStyleDefault; | |
| 432 | outline.usesAutomaticRowHeights = YES; | |
| 433 | outline.indentationPerLevel = 0; | |
| 434 | ||
| 435 | outline.style = NSTableViewStyleSourceList; | |
| 436 | ||
| 437 | // Make background transparent so vibrancy shows through | |
| 438 | scrollview.drawsBackground = NO; | |
| 439 | ||
| 440 | scrollview.documentView = outline; | |
| 441 | ||
| 442 | UiLayout layout = UI_ARGS2LAYOUT(args); | |
| 443 | ui_container_add(obj, scrollview, &layout); | |
| 444 | ||
| 445 | // datasource and delegate | |
| 446 | UiSourceList *data = [[UiSourceList alloc] init:obj outline:outline]; | |
| 447 | data.sublists = copy_sublists(obj->ctx->allocator, args); | |
| 448 | UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->dynamic_sublist, args->varname, UI_VAR_LIST); | |
| 449 | if(var) { | |
| 450 | UiList *list = var->value; | |
| 451 | list->obj = (__bridge void*)data; | |
| 452 | list->update = ui_sourcelist_update; | |
| 453 | } | |
| 454 | data.dynamic_sublists = var; | |
| 455 | data.getvalue = args->getvalue; | |
| 456 | data.getvaluedata = args->getvaluedata; | |
| 457 | data.onactivate = args->onactivate; | |
| 458 | data.onactivatedata = args->onactivatedata; | |
| 459 | data.onbuttonclick = args->onbuttonclick; | |
| 460 | data.onactivatedata = args->onbuttonclickdata; | |
| 461 | [data update:-1]; | |
| 462 | ||
| 463 | outline.dataSource = data; | |
| 464 | outline.delegate = data; | |
| 465 | ||
| 466 | [data update:-1]; | |
| 467 | ||
| 468 | objc_setAssociatedObject(outline, "ui_datasource", data, OBJC_ASSOCIATION_RETAIN); | |
| 469 | ||
| 470 | return (__bridge void*)scrollview; | |
| 471 | } | |
| 472 | ||
| 473 | void ui_sourcelist_update(UiList *list, int row) { | |
| 474 | UiSourceList *sourcelist = (__bridge UiSourceList*)list->obj; | |
| 475 | [sourcelist update:row]; | |
| 476 | } | |
| 477 | ||
| 478 | ||
| 479 | /* | |
| 480 | * Data Source and Delegate for the sourcelist NSOutlineView | |
| 481 | */ | |
| 482 | @implementation UiSourceList | |
| 483 | ||
| 484 | - (id)init:(UiObject*)obj outline:(NSOutlineView*)view { | |
| 485 | _obj = obj; | |
| 486 | _outlineView = view; | |
| 487 | _sections = [[NSMutableArray alloc] initWithCapacity:16]; | |
| 488 | return self; | |
| 489 | } | |
| 490 | ||
| 491 | - (void)dealloc { | |
| 492 | cxListFree(_sublists); | |
| 493 | } | |
| 494 | ||
| 495 | - (void)update:(int)row { | |
| 496 | // TODO: check row | |
| 497 | ||
| 498 | [_sections removeAllObjects]; | |
| 499 | ||
| 500 | CxIterator i = cxListIterator(_sublists); | |
| 501 | int index = 0; | |
| 502 | int rownum = 0; | |
| 503 | cx_foreach(UiSubList *, sl, i) { | |
| 504 | UiSourceListItem *section = [[UiSourceListItem alloc] init:self sublist:sl]; | |
| 505 | section.sublistIndex = index; | |
| 506 | section.rownum = rownum; | |
| 507 | section.sublistStartRow = rownum; | |
| 508 | [section update:-1]; | |
| 509 | [_sections addObject:section]; | |
| 510 | index++; | |
| 511 | rownum += 1 + section.items.count; | |
| 512 | } | |
| 513 | ||
| 514 | [_outlineView reloadData]; | |
| 515 | [_outlineView expandItem:nil expandChildren:YES]; | |
| 516 | } | |
| 517 | ||
| 518 | // NSOutlineViewDataSource implementation | |
| 519 | ||
| 520 | - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { | |
| 521 | if(item == nil) { | |
| 522 | return _sections.count; | |
| 523 | } else { | |
| 524 | UiSourceListItem *i = item; | |
| 525 | return i.items.count; | |
| 526 | } | |
| 527 | } | |
| 528 | ||
| 529 | - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { | |
| 530 | UiSourceListItem *i = item; | |
| 531 | return [i isSection] ? YES : NO; | |
| 532 | } | |
| 533 | ||
| 534 | - (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item { | |
| 535 | UiSourceListItem *i = item; | |
| 536 | if(i) { | |
| 537 | return [i.items objectAtIndex:index]; | |
| 538 | } | |
| 539 | return [_sections objectAtIndex:index]; | |
| 540 | } | |
| 541 | ||
| 542 | - (void)outlineView:(NSOutlineView *)outlineView | |
| 543 | setObjectValue:(id)object | |
| 544 | forTableColumn:(NSTableColumn *)tableColumn | |
| 545 | byItem:(id)item | |
| 546 | { | |
| 547 | ||
| 548 | } | |
| 549 | ||
| 550 | // NSOutlineViewDelegate implementation | |
| 551 | ||
| 552 | - (NSView *)outlineView:(NSOutlineView *)outlineView | |
| 553 | viewForTableColumn:(NSTableColumn *)tableColumn | |
| 554 | item:(id)item | |
| 555 | { | |
| 556 | UiSourceListItem *i = item; | |
| 557 | ||
| 558 | NSTableCellView *cell = [[NSTableCellView alloc] init]; | |
| 559 | cell.identifier = @"cell"; | |
| 560 | // Icon | |
| 561 | NSImageView *iconView = [[NSImageView alloc] initWithFrame:NSZeroRect]; | |
| 562 | iconView.translatesAutoresizingMaskIntoConstraints = NO; | |
| 563 | [cell addSubview:iconView]; | |
| 564 | cell.imageView = iconView; | |
| 565 | ||
| 566 | // Label | |
| 567 | //NSTextField *textField = [NSTextField labelWithString:@""]; | |
| 568 | NSTextField *textField = [[NSTextField alloc] initWithFrame:NSZeroRect]; | |
| 569 | textField.translatesAutoresizingMaskIntoConstraints = NO; | |
| 570 | textField.bezeled = NO; | |
| 571 | textField.editable = NO; | |
| 572 | textField.drawsBackground = NO; | |
| 573 | textField.selectable = NO; | |
| 574 | textField.lineBreakMode = NSLineBreakByTruncatingTail; | |
| 575 | ||
| 576 | ||
| 577 | [cell addSubview:textField]; | |
| 578 | cell.textField = textField; | |
| 579 | ||
| 580 | if([i isSection]) { | |
| 581 | NSFont *font = [NSFont boldSystemFontOfSize:[NSFont systemFontSize]*0.85]; | |
| 582 | //NSFont *font = [NSFont preferredFontForTextStyle:NSFontTextStyleCaption1 options:@{}]; | |
| 583 | NSDictionary *attrs = @{ | |
| 584 | NSFontAttributeName: font, | |
| 585 | NSForegroundColorAttributeName: [NSColor tertiaryLabelColor] | |
| 586 | }; | |
| 587 | textField.attributedStringValue = [[NSAttributedString alloc] initWithString:i.label attributes:attrs]; | |
| 588 | ||
| 589 | // Layout constraints | |
| 590 | [NSLayoutConstraint activateConstraints:@[ | |
| 591 | [iconView.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], | |
| 592 | [iconView.bottomAnchor constraintEqualToAnchor:cell.bottomAnchor constant:-1], | |
| 593 | ||
| 594 | [textField.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], | |
| 595 | [textField.bottomAnchor constraintEqualToAnchor:cell.bottomAnchor constant:-1], | |
| 596 | [textField.trailingAnchor constraintEqualToAnchor:cell.trailingAnchor constant:0], | |
| 597 | ]]; | |
| 598 | } else { | |
| 599 | textField.stringValue = i.label; | |
| 600 | ||
| 601 | // Layout constraints | |
| 602 | [NSLayoutConstraint activateConstraints:@[ | |
| 603 | [iconView.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], | |
| 604 | [iconView.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor], | |
| 605 | ||
| 606 | [textField.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], | |
| 607 | [textField.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor], | |
| 608 | [textField.trailingAnchor constraintEqualToAnchor:cell.trailingAnchor constant:0], | |
| 609 | ]]; | |
| 610 | } | |
| 611 | ||
| 612 | return cell; | |
| 613 | } | |
| 614 | ||
| 615 | - (NSTableRowView *) outlineView:(NSOutlineView *) outlineView | |
| 616 | rowViewForItem:(id)item { | |
| 617 | UiSourceListItem *it = item; | |
| 618 | UiSourceListRow *row = [[UiSourceListRow alloc]init]; | |
| 619 | if([it isSection] && it.sublist->header) { | |
| 620 | row.showDisclosureButton = YES; | |
| 621 | } | |
| 622 | return row; | |
| 623 | } | |
| 624 | ||
| 625 | - (BOOL) outlineView:(NSOutlineView *) outlineView | |
| 626 | shouldSelectItem:(id)item | |
| 627 | { | |
| 628 | UiSourceListItem *i = item; | |
| 629 | return [i isSection] ? NO : YES; | |
| 630 | } | |
| 631 | ||
| 632 | - (CGFloat) outlineView:(NSOutlineView *) outlineView | |
| 633 | heightOfRowByItem:(id) item | |
| 634 | { | |
| 635 | UiSourceListItem *i = item; | |
| 636 | CGFloat rowHeight = outlineView.rowHeight; | |
| 637 | if([i isSection]) { | |
| 638 | if(i.sublist->header) { | |
| 639 | rowHeight += i.sublistIndex == 0 ? -12 : 4; | |
| 640 | } else { | |
| 641 | rowHeight = i.sublistIndex == 0 ? 0.1 : 12; | |
| 642 | } | |
| 643 | } | |
| 644 | return rowHeight; | |
| 645 | } | |
| 646 | ||
| 647 | - (void) outlineViewSelectionDidChange:(NSNotification *) notification { | |
| 648 | UiEvent event; | |
| 649 | event.obj = _obj; | |
| 650 | event.window = event.obj->window; | |
| 651 | event.document = event.obj->ctx->document; | |
| 652 | event.eventdata = NULL; | |
| 653 | event.eventdatatype = 0; | |
| 654 | event.intval = 0; | |
| 655 | event.set = ui_get_setop(); | |
| 656 | ||
| 657 | UiSubListEventData sublistEvent; | |
| 658 | ||
| 659 | NSInteger selectedRow = _outlineView.selectedRow; | |
| 660 | if(selectedRow >= 0) { | |
| 661 | UiSourceListItem *item = [_outlineView itemAtRow:selectedRow]; | |
| 662 | UiSourceListItem *parent = item.parent; | |
| 663 | UiSubList *sublist = parent != nil ? parent.sublist : item.sublist; | |
| 664 | UiVar *var = parent != nil ? parent.var : item.var; | |
| 665 | if(item && var) { | |
| 666 | sublistEvent.list = var->value; | |
| 667 | sublistEvent.sublist_index = parent ? parent.sublistIndex : item.sublistIndex; | |
| 668 | sublistEvent.row_index = (int)selectedRow - item.sublistStartRow - 1; | |
| 669 | sublistEvent.sublist_userdata = sublist ? sublist->userdata : NULL; | |
| 670 | sublistEvent.event_data = item.eventdata; | |
| 671 | sublistEvent.row_data = sublistEvent.list->get(sublistEvent.list, sublistEvent.row_index); | |
| 672 | ||
| 673 | event.eventdata = &sublistEvent; | |
| 674 | event.eventdatatype = UI_EVENT_DATA_SUBLIST; | |
| 675 | } | |
| 676 | } | |
| 677 | ||
| 678 | if(_onactivate) { | |
| 679 | _onactivate(&event, _onactivatedata); | |
| 680 | } | |
| 681 | } | |
| 682 | ||
| 683 | @end | |
| 684 | ||
| 685 | /* | |
| 686 | * Outline datasource item | |
| 687 | * Is used for sections (sublists) and individual items | |
| 688 | */ | |
| 689 | @implementation UiSourceListItem | |
| 690 | ||
| 691 | - (id)init:(UiSourceList*)sourcelist sublist:(UiSubList*)sublist { | |
| 692 | _sourcelist = sourcelist; | |
| 693 | _sublist = sublist; | |
| 694 | _items = [[NSMutableArray alloc]initWithCapacity:16]; | |
| 695 | if(sublist->header) { | |
| 696 | _label = [[NSString alloc]initWithUTF8String:sublist->header]; | |
| 697 | } else { | |
| 698 | _label = @""; | |
| 699 | } | |
| 700 | UiVar *var = uic_widget_var(sourcelist.obj->ctx, | |
| 701 | sourcelist.obj->ctx, | |
| 702 | sublist->value, | |
| 703 | sublist->varname, | |
| 704 | UI_VAR_LIST); | |
| 705 | _var = var; | |
| 706 | return self; | |
| 707 | } | |
| 708 | ||
| 709 | - (id)init:(UiSubListItem*)item parent:(UiSourceListItem*)parent { | |
| 710 | _parent = parent; | |
| 711 | if(item->label) { | |
| 712 | _label = [[NSString alloc]initWithUTF8String:item->label]; | |
| 713 | } else { | |
| 714 | _label = @""; | |
| 715 | } | |
| 716 | _eventdata = item->eventdata; | |
| 717 | return self; | |
| 718 | } | |
| 719 | ||
| 720 | - (BOOL)isSection { | |
| 721 | return _sublist != NULL; | |
| 722 | } | |
| 723 | ||
| 724 | - (void)update:(int)row { | |
| 725 | // TODO: check row | |
| 726 | ||
| 727 | [_items removeAllObjects]; | |
| 728 | if(_var == NULL) { | |
| 729 | return; | |
| 730 | } | |
| 731 | UiList *list = _var->value; | |
| 732 | void *elm = list->first(list); | |
| 733 | int index = 0; | |
| 734 | while(elm) { | |
| 735 | UiSubListItem item = { NULL, NULL, NULL, NULL, NULL, NULL }; | |
| 736 | if(_sourcelist.getvalue) { | |
| 737 | _sourcelist.getvalue(list, _sublist->userdata, elm, index, &item, _sourcelist.getvaluedata); | |
| 738 | } else { | |
| 739 | item.label = strdup(elm); | |
| 740 | } | |
| 741 | ||
| 742 | UiSourceListItem *it = [[UiSourceListItem alloc] init:&item parent:self]; | |
| 743 | it.sublistIndex = index; | |
| 744 | it.rownum = self.rownum + index; | |
| 745 | it.sublistStartRow = _parent ? _parent.sublistStartRow : _sublistStartRow; | |
| 746 | [_items addObject:it]; | |
| 747 | ||
| 748 | elm = list->next(list); | |
| 749 | index++; | |
| 750 | } | |
| 751 | } | |
| 752 | ||
| 753 | @end | |
| 754 | ||
| 755 | /* | |
| 756 | * Custom NSTableRowView implementation | |
| 757 | * Moves the disclosure button to the right side | |
| 758 | * Handles mouse hover events (for hiding the disclosure button) | |
| 759 | */ | |
| 760 | @implementation UiSourceListRow | |
| 761 | ||
| 762 | - (void)layout { | |
| 763 | [super layout]; | |
| 764 | ||
| 765 | for (NSView *subview in self.subviews) { | |
| 766 | if ([subview.identifier isEqualToString:NSOutlineViewDisclosureButtonKey] || | |
| 767 | [subview.identifier isEqualToString:NSOutlineViewShowHideButtonKey]) | |
| 768 | { | |
| 769 | NSRect frame = subview.frame; | |
| 770 | frame.origin.x = self.bounds.size.width - frame.size.width - 16.0; | |
| 771 | subview.frame = frame; | |
| 772 | ||
| 773 | if(!_hover) { | |
| 774 | subview.hidden = YES; | |
| 775 | } | |
| 776 | ||
| 777 | if(subview != _disclosureButton) { | |
| 778 | // init disclosure button | |
| 779 | _disclosureButton = (NSButton*)subview; | |
| 780 | if ([subview isKindOfClass:[NSButton class]]) { | |
| 781 | NSButton *button = (NSButton*)subview; | |
| 782 | button.contentTintColor = [NSColor tertiaryLabelColor]; | |
| 783 | } | |
| 784 | } | |
| 785 | ||
| 786 | ||
| 787 | } else if ([subview.identifier isEqualToString:@"cell"]) { | |
| 788 | NSRect frame = subview.frame; | |
| 789 | frame.origin.x = 16; | |
| 790 | subview.frame = frame; | |
| 791 | } | |
| 792 | } | |
| 793 | } | |
| 794 | ||
| 795 | - (void)updateTrackingAreas { | |
| 796 | [super updateTrackingAreas]; | |
| 797 | if(_trackingArea != nil) { | |
| 798 | [self removeTrackingArea:_trackingArea]; | |
| 799 | } | |
| 800 | _trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds | |
| 801 | options:NSTrackingMouseEnteredAndExited | | |
| 802 | NSTrackingActiveInActiveApp | | |
| 803 | NSTrackingInVisibleRect | |
| 804 | owner:self | |
| 805 | userInfo:nil]; | |
| 806 | [self addTrackingArea:_trackingArea]; | |
| 807 | } | |
| 808 | ||
| 809 | - (void)mouseEntered:(NSEvent *)event { | |
| 810 | _hover = YES; | |
| 811 | _disclosureButton.hidden = _showDisclosureButton ? NO : YES; | |
| 812 | } | |
| 813 | ||
| 814 | - (void)mouseExited:(NSEvent *)event { | |
| 815 | _hover = NO; | |
| 816 | _disclosureButton.hidden = YES; | |
| 817 | } | |
| 818 | ||
| 819 | @end |