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