Sun, 07 Dec 2025 15:45:30 +0100
rename combobox to dropdown
|
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 | |
|
711
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
90 | UiVar *var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
91 | if(var) { |
|
714
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
92 | UiList *list = var->value; |
|
715
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
93 | bind_list_to_tableview(list, tableview); |
|
714
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
94 | |
|
711
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
95 | ui_getvaluefunc2 getvalue = args->getvalue2; |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
96 | void *getvaluedata = args->getvalue2data; |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
97 | if(!getvalue) { |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
98 | if(args->getvalue) { |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
99 | getvalue = getvalue_wrapper; |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
100 | getvaluedata = (void*)args->getvalue; |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
101 | } else { |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
102 | 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
|
103 | } |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
104 | } |
|
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 | NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column"]; |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
107 | [tableview addTableColumn:column]; |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
108 | |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
109 | 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
|
110 | |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
111 | tableview.dataSource = dataSource; |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
112 | [tableview reloadData]; |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
113 | |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
114 | objc_setAssociatedObject(tableview, "ui_datasource", dataSource, OBJC_ASSOCIATION_RETAIN); |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
115 | } |
|
714
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
116 | |
|
711
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
117 | return (__bridge void*)scrollview; |
|
673e7e41c93e
add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
118 | } |
|
714
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
119 | |
|
715
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
120 | /* --------------------------- TableView --------------------------- */ |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
121 | |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
122 | UIWIDGET ui_table_create(UiObject* obj, UiListArgs *args) { |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
123 | NSScrollView *scrollview = [[NSScrollView alloc] init]; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
124 | |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
125 | NSTableView *tableview = [[NSTableView alloc] init]; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
126 | tableview.autoresizingMask = NSViewWidthSizable; |
|
716
99386f34efc9
improve table columnsize handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
715
diff
changeset
|
127 | tableview.columnAutoresizingStyle = NSTableViewSequentialColumnAutoresizingStyle; |
|
715
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
128 | |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
129 | if(args->multiselection) { |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
130 | tableview.allowsMultipleSelection = YES; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
131 | } |
|
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 | 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
|
134 | ui_container_add(obj, scrollview, &layout); |
|
715
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 | add_listdelegate(obj, tableview, args); |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
137 | |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
138 | // convert model |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
139 | NSMutableArray<NSTableColumn*> *cols = [[NSMutableArray alloc] init]; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
140 | UiModel *model = args->model; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
141 | if(model) { |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
142 | for(int i=0;i<model->columns;i++) { |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
143 | char *title = model->titles[i]; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
144 | UiModelType type = model->types[i]; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
145 | int width = model->columnsize[i]; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
146 | NSString *identifier = [[NSString alloc] initWithUTF8String:title]; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
147 | NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:identifier]; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
148 | column.title = identifier; |
|
716
99386f34efc9
improve table columnsize handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
715
diff
changeset
|
149 | column.resizingMask = NSTableColumnUserResizingMask; |
|
715
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
150 | if(width > 0) { |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
151 | column.width = width; |
|
716
99386f34efc9
improve table columnsize handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
715
diff
changeset
|
152 | } else if(width < 0) { |
|
99386f34efc9
improve table columnsize handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
715
diff
changeset
|
153 | column.resizingMask = NSTableColumnAutoresizingMask | NSTableColumnUserResizingMask; |
|
715
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
154 | } |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
155 | if(type >= UI_ICON) { |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
156 | // TODO |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
157 | } |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
158 | [tableview addTableColumn:column]; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
159 | [cols addObject:column]; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
160 | } |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
161 | } |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
162 | |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
163 | 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
|
164 | if(var) { |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
165 | UiList *list = var->value; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
166 | bind_list_to_tableview(list, tableview); |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
167 | |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
168 | ui_getvaluefunc2 getvalue = args->getvalue2; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
169 | void *getvaluedata = args->getvalue2data; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
170 | if(!getvalue) { |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
171 | if(args->getvalue) { |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
172 | getvalue = getvalue_wrapper; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
173 | getvaluedata = (void*)args->getvalue; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
174 | } else { |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
175 | 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
|
176 | return (__bridge void*)scrollview; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
177 | } |
|
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 | |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
180 | 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
|
181 | if(model) { |
|
965
5d4419042d9b
implement dynamic table models (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
869
diff
changeset
|
182 | dataSource.model = model; |
|
715
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
183 | } |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
184 | |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
185 | tableview.dataSource = dataSource; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
186 | [tableview reloadData]; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
187 | |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
188 | objc_setAssociatedObject(tableview, "ui_datasource", dataSource, OBJC_ASSOCIATION_RETAIN); |
|
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 | scrollview.documentView = tableview; |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
192 | |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
193 | return (__bridge void*)scrollview; |
|
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 | /* ------ common functions ------ */ |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
197 | |
|
714
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
198 | void ui_tableview_update(UiList *list, int i) { |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
199 | NSTableView *tableview = (__bridge NSTableView*)list->obj; |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
200 | if(i < 0) { |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
201 | [tableview reloadData]; |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
202 | } else { |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
203 | [tableview reloadData]; // TODO: optimize |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
204 | } |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
205 | } |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
206 | |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
207 | UiListSelection ui_tableview_getselection(UiList *list) { |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
208 | NSTableView *tableview = (__bridge NSTableView*)list->obj; |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
209 | return ui_tableview_selection(tableview); |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
210 | } |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
211 | |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
212 | void ui_tableview_setselection(UiList *list, UiListSelection selection) { |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
213 | NSTableView *tableview = (__bridge NSTableView*)list->obj; |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
214 | NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet]; |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
215 | for(int i=0;i<selection.count;i++) { |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
216 | [indexSet addIndex:selection.rows[i]]; |
|
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 | [tableview selectRowIndexes:indexSet byExtendingSelection:NO]; |
|
3905f542e150
implement listview list bindings (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
713
diff
changeset
|
219 | } |
|
715
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
220 | |
|
2082c80fb010
add table widget (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
714
diff
changeset
|
221 | |
|
717
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
222 | /* --------------------------- DropDown --------------------------- */ |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
223 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
224 | @implementation UiDropDown |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
225 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
226 | - (id)init:(UiObject*)obj { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
227 | _obj = obj; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
228 | return self; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
229 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
230 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
231 | - (void) comboBoxSelectionDidChange:(NSNotification *) notification { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
232 | int index = (int)_combobox.indexOfSelectedItem; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
233 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
234 | void *eventdata = NULL; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
235 | if(_var) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
236 | UiList *list = _var->value; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
237 | if(index >= 0) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
238 | eventdata = list->get(list, index); |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
239 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
240 | } else { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
241 | NSString *str = _combobox.objectValueOfSelectedItem; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
242 | if(str) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
243 | eventdata = (void*)str.UTF8String; |
|
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 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
246 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
247 | UiEvent event; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
248 | event.obj = _obj; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
249 | event.window = event.obj->window; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
250 | event.document = event.obj->ctx->document; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
251 | event.eventdata = eventdata; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
252 | event.eventdatatype = UI_EVENT_DATA_LIST_ELM; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
253 | event.intval = index; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
254 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
255 | if(_onselection) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
256 | _onselection(&event, _onselectiondata); |
|
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 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
259 | if(_onactivate) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
260 | _onactivate(&event, _onactivatedata); |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
261 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
262 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
263 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
264 | @end |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
265 | |
|
969
7385c26d998d
rename combobox to dropdown
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
965
diff
changeset
|
266 | UIWIDGET ui_dropdown_create(UiObject* obj, UiListArgs *args) { |
|
717
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
267 | NSComboBox *dropdown = [[NSComboBox alloc] init]; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
268 | dropdown.editable = NO; |
|
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 | UiDropDown *uidropdown = [[UiDropDown alloc] init:obj]; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
271 | objc_setAssociatedObject(dropdown, "ui_dropdown", uidropdown, OBJC_ASSOCIATION_RETAIN); |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
272 | uidropdown.onactivate = args->onactivate; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
273 | uidropdown.onactivatedata = args->onactivatedata; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
274 | uidropdown.onselection = args->onselection; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
275 | uidropdown.onselectiondata = args->onselectiondata; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
276 | uidropdown.combobox = dropdown; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
277 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
278 | if(!args->getvalue2) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
279 | if(args->getvalue) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
280 | args->getvalue2 = getvalue_wrapper; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
281 | args->getvalue2data = (void*)args->getvalue; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
282 | } else { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
283 | args->getvalue2 = str_getvalue; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
284 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
285 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
286 | uidropdown.getvalue = args->getvalue2; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
287 | uidropdown.getvaluedata = args->getvalue2data; |
|
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 | 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
|
290 | ui_container_add(obj, dropdown, &layout); |
|
717
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
291 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
292 | 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
|
293 | if(var) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
294 | UiList *list = var->value; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
295 | list->obj = (__bridge void*)dropdown; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
296 | list->update = ui_dropdown_update; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
297 | list->getselection = ui_dropdown_getselection; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
298 | list->setselection = ui_dropdown_setselection; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
299 | ui_dropdown_update(list, -1); |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
300 | } else { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
301 | for(int i=0;i<args->static_nelm;i++) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
302 | char *str = args->static_elements[i]; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
303 | NSString *item = [[NSString alloc] initWithUTF8String:str]; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
304 | [dropdown addItemWithObjectValue:item]; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
305 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
306 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
307 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
308 | uidropdown.var = var; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
309 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
310 | return (__bridge void*)dropdown; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
311 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
312 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
313 | void ui_dropdown_update(UiList *list, int i) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
314 | NSComboBox *combobox = (__bridge NSComboBox*)list->obj; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
315 | UiDropDown *dropdown = objc_getAssociatedObject(combobox, "ui_dropdown"); |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
316 | if(dropdown) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
317 | [combobox removeAllItems]; |
|
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 | ui_getvaluefunc2 getvalue = dropdown.getvalue; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
320 | void *getvaluedata = dropdown.getvaluedata; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
321 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
322 | int index = 0; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
323 | void *elm = list->first(list); |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
324 | while(elm) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
325 | UiBool freeResult = FALSE; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
326 | char *str = getvalue(list, elm, index, 0, getvaluedata, &freeResult); |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
327 | if(str) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
328 | NSString *item = [[NSString alloc] initWithUTF8String:str]; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
329 | [combobox addItemWithObjectValue:item]; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
330 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
331 | if(freeResult) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
332 | free(str); |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
333 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
334 | elm = list->next(list); |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
335 | index++; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
336 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
337 | } else { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
338 | fprintf(stderr, "Error: obj is not a dropdown\n"); |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
339 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
340 | } |
|
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 | UiListSelection ui_dropdown_getselection(UiList *list) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
343 | UiListSelection sel = { 0, NULL }; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
344 | NSComboBox *combobox = (__bridge NSComboBox*)list->obj; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
345 | NSInteger index = combobox.indexOfSelectedItem; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
346 | if(index >= 0) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
347 | sel.rows = malloc(sizeof(int)); |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
348 | sel.count = 1; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
349 | sel.rows[0] = (int)index; |
|
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 | return sel; |
|
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 | |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
354 | void ui_dropdown_setselection(UiList *list, UiListSelection selection) { |
|
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 | if(selection.count > 0) { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
357 | [combobox selectItemAtIndex:selection.rows[0]]; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
358 | } else { |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
359 | [combobox selectItemAtIndex: -1]; |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
360 | } |
|
c35b2f18841c
add combobox (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
716
diff
changeset
|
361 | } |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
362 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
363 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
364 | /* --------------------------- SourceList --------------------------- */ |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
365 | |
|
869
6b7a178cff7c
add some missing functions (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
834
diff
changeset
|
366 | 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
|
367 | |
|
6b7a178cff7c
add some missing functions (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
834
diff
changeset
|
368 | 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
|
369 | sclist_update_callback = cb; |
|
6b7a178cff7c
add some missing functions (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
834
diff
changeset
|
370 | } |
|
6b7a178cff7c
add some missing functions (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
834
diff
changeset
|
371 | |
|
6b7a178cff7c
add some missing functions (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
834
diff
changeset
|
372 | void ui_sourcelist_updated(void) { |
|
6b7a178cff7c
add some missing functions (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
834
diff
changeset
|
373 | if(sclist_update_callback) { |
|
6b7a178cff7c
add some missing functions (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
834
diff
changeset
|
374 | sclist_update_callback(); |
|
6b7a178cff7c
add some missing functions (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
834
diff
changeset
|
375 | } |
|
6b7a178cff7c
add some missing functions (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
834
diff
changeset
|
376 | } |
|
6b7a178cff7c
add some missing functions (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
834
diff
changeset
|
377 | |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
378 | 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
|
379 | cxFree(a, (char*)sl->varname); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
380 | cxFree(a, (char*)sl->header); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
381 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
382 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
383 | 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
|
384 | UiSubList new_sl; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
385 | new_sl.value = sl->value; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
386 | 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
|
387 | 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
|
388 | new_sl.separator = sl->separator; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
389 | new_sl.userdata = sl->userdata; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
390 | return new_sl; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
391 | } |
|
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 | 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
|
394 | if(args->sublists) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
395 | size_t max = args->numsublists; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
396 | if(max == 0) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
397 | max = INT_MAX; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
398 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
399 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
400 | 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
|
401 | 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
|
402 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
403 | for(int i=0;i<max;i++) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
404 | UiSubList *sl = &args->sublists[i]; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
405 | if(sl->value == NULL && sl->varname == NULL) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
406 | break; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
407 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
408 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
409 | UiSubList new_sl = copy_sublist(a, sl); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
410 | cxListAdd(sublists, &new_sl); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
411 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
412 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
413 | return sublists; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
414 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
415 | return NULL; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
416 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
417 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
418 | UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs *args) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
419 | // create views |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
420 | NSScrollView *scrollview = [[NSScrollView alloc] init]; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
421 | scrollview.autoresizingMask = NSViewWidthSizable; |
|
832
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
422 | scrollview.hasVerticalScroller = YES; |
|
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
423 | scrollview.hasHorizontalScroller = NO; |
|
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
424 | scrollview.autohidesScrollers = YES; |
|
828
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 | NSOutlineView *outline = [[NSOutlineView alloc]init]; |
|
833
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
427 | NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"x"]; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
428 | [outline addTableColumn:column]; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
429 | outline.outlineTableColumn = column; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
430 | outline.headerView = NULL; |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
431 | outline.rowSizeStyle = NSTableViewRowSizeStyleDefault; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
432 | outline.usesAutomaticRowHeights = YES; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
433 | outline.indentationPerLevel = 0; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
434 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
435 | outline.style = NSTableViewStyleSourceList; |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
436 | |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
437 | // Make background transparent so vibrancy shows through |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
438 | scrollview.drawsBackground = NO; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
439 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
440 | scrollview.documentView = outline; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
441 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
442 | UiLayout layout = UI_ARGS2LAYOUT(args); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
443 | ui_container_add(obj, scrollview, &layout); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
444 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
445 | // datasource and delegate |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
446 | 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
|
447 | data.sublists = copy_sublists(obj->ctx->allocator, args); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
448 | 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
|
449 | if(var) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
450 | UiList *list = var->value; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
451 | list->obj = (__bridge void*)data; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
452 | list->update = ui_sourcelist_update; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
453 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
454 | data.dynamic_sublists = var; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
455 | data.getvalue = args->getvalue; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
456 | data.getvaluedata = args->getvaluedata; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
457 | data.onactivate = args->onactivate; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
458 | data.onactivatedata = args->onactivatedata; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
459 | data.onbuttonclick = args->onbuttonclick; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
460 | data.onactivatedata = args->onbuttonclickdata; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
461 | [data update:-1]; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
462 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
463 | outline.dataSource = data; |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
464 | outline.delegate = data; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
465 | |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
466 | [data update:-1]; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
467 | |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
468 | 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
|
469 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
470 | return (__bridge void*)scrollview; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
471 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
472 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
473 | void ui_sourcelist_update(UiList *list, int row) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
474 | UiSourceList *sourcelist = (__bridge UiSourceList*)list->obj; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
475 | [sourcelist update:row]; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
476 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
477 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
478 | |
|
832
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
479 | /* |
|
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
480 | * 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
|
481 | */ |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
482 | @implementation UiSourceList |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
483 | |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
484 | - (id)init:(UiObject*)obj outline:(NSOutlineView*)view { |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
485 | _obj = obj; |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
486 | _outlineView = view; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
487 | _sections = [[NSMutableArray alloc] initWithCapacity:16]; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
488 | return self; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
489 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
490 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
491 | - (void)dealloc { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
492 | cxListFree(_sublists); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
493 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
494 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
495 | - (void)update:(int)row { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
496 | // TODO: check row |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
497 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
498 | [_sections removeAllObjects]; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
499 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
500 | CxIterator i = cxListIterator(_sublists); |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
501 | int index = 0; |
|
833
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
502 | int rownum = 0; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
503 | cx_foreach(UiSubList *, sl, i) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
504 | 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
|
505 | section.sublistIndex = index; |
|
833
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
506 | section.rownum = rownum; |
|
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
507 | section.sublistStartRow = rownum; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
508 | [section update:-1]; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
509 | [_sections addObject:section]; |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
510 | index++; |
|
833
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
511 | rownum += 1 + section.items.count; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
512 | } |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
513 | |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
514 | [_outlineView reloadData]; |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
515 | [_outlineView expandItem:nil expandChildren:YES]; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
516 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
517 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
518 | // NSOutlineViewDataSource implementation |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
519 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
520 | - (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
521 | if(item == nil) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
522 | return _sections.count; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
523 | } else { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
524 | UiSourceListItem *i = item; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
525 | return i.items.count; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
526 | } |
|
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 | - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
530 | UiSourceListItem *i = item; |
|
834
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
531 | return [i isSection] ? YES : NO; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
532 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
533 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
534 | - (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
|
535 | UiSourceListItem *i = item; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
536 | if(i) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
537 | return [i.items objectAtIndex:index]; |
|
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 | return [_sections objectAtIndex:index]; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
540 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
541 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
542 | - (void)outlineView:(NSOutlineView *)outlineView |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
543 | setObjectValue:(id)object |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
544 | forTableColumn:(NSTableColumn *)tableColumn |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
545 | byItem:(id)item |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
546 | { |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
547 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
548 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
549 | |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
550 | // NSOutlineViewDelegate implementation |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
551 | |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
552 | - (NSView *)outlineView:(NSOutlineView *)outlineView |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
553 | viewForTableColumn:(NSTableColumn *)tableColumn |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
554 | item:(id)item |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
555 | { |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
556 | UiSourceListItem *i = item; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
557 | |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
558 | NSTableCellView *cell = [[NSTableCellView alloc] init]; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
559 | cell.identifier = @"cell"; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
560 | // Icon |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
561 | NSImageView *iconView = [[NSImageView alloc] initWithFrame:NSZeroRect]; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
562 | iconView.translatesAutoresizingMaskIntoConstraints = NO; |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
563 | [cell addSubview:iconView]; |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
564 | cell.imageView = iconView; |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
565 | |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
566 | // Label |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
567 | //NSTextField *textField = [NSTextField labelWithString:@""]; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
568 | NSTextField *textField = [[NSTextField alloc] initWithFrame:NSZeroRect]; |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
569 | textField.translatesAutoresizingMaskIntoConstraints = NO; |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
570 | textField.bezeled = NO; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
571 | textField.editable = NO; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
572 | textField.drawsBackground = NO; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
573 | textField.selectable = NO; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
574 | textField.lineBreakMode = NSLineBreakByTruncatingTail; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
575 | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
576 | |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
577 | [cell addSubview:textField]; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
578 | cell.textField = textField; |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
579 | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
580 | if([i isSection]) { |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
581 | NSFont *font = [NSFont boldSystemFontOfSize:[NSFont systemFontSize]*0.85]; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
582 | //NSFont *font = [NSFont preferredFontForTextStyle:NSFontTextStyleCaption1 options:@{}]; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
583 | NSDictionary *attrs = @{ |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
584 | NSFontAttributeName: font, |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
585 | NSForegroundColorAttributeName: [NSColor tertiaryLabelColor] |
|
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 | textField.attributedStringValue = [[NSAttributedString alloc] initWithString:i.label attributes:attrs]; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
588 | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
589 | // Layout constraints |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
590 | [NSLayoutConstraint activateConstraints:@[ |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
591 | [iconView.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
592 | [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
|
593 | |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
594 | [textField.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
595 | [textField.bottomAnchor constraintEqualToAnchor:cell.bottomAnchor constant:-1], |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
596 | [textField.trailingAnchor constraintEqualToAnchor:cell.trailingAnchor constant:0], |
|
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 | } else { |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
599 | textField.stringValue = i.label; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
600 | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
601 | // Layout constraints |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
602 | [NSLayoutConstraint activateConstraints:@[ |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
603 | [iconView.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
604 | [iconView.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor], |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
605 | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
606 | [textField.leadingAnchor constraintEqualToAnchor:cell.leadingAnchor constant:0], |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
607 | [textField.centerYAnchor constraintEqualToAnchor:cell.centerYAnchor], |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
608 | [textField.trailingAnchor constraintEqualToAnchor:cell.trailingAnchor constant:0], |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
609 | ]]; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
610 | } |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
611 | |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
612 | return cell; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
613 | } |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
614 | |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
615 | - (NSTableRowView *) outlineView:(NSOutlineView *) outlineView |
|
834
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
616 | rowViewForItem:(id)item { |
|
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
617 | UiSourceListItem *it = item; |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
618 | UiSourceListRow *row = [[UiSourceListRow alloc]init]; |
|
834
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
619 | if([it isSection] && it.sublist->header) { |
|
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
620 | row.showDisclosureButton = YES; |
|
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
621 | } |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
622 | return row; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
623 | } |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
624 | |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
625 | - (BOOL) outlineView:(NSOutlineView *) outlineView |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
626 | shouldSelectItem:(id)item |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
627 | { |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
628 | UiSourceListItem *i = item; |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
629 | return [i isSection] ? NO : YES; |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
630 | } |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
631 | |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
632 | - (CGFloat) outlineView:(NSOutlineView *) outlineView |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
633 | heightOfRowByItem:(id) item |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
634 | { |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
635 | UiSourceListItem *i = item; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
636 | CGFloat rowHeight = outlineView.rowHeight; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
637 | if([i isSection]) { |
|
834
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
638 | if(i.sublist->header) { |
|
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
639 | rowHeight += i.sublistIndex == 0 ? -12 : 4; |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
640 | } else { |
|
834
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
641 | rowHeight = i.sublistIndex == 0 ? 0.1 : 12; |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
642 | } |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
643 | } |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
644 | return rowHeight; |
|
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 | |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
647 | - (void) outlineViewSelectionDidChange:(NSNotification *) notification { |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
648 | UiEvent event; |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
649 | event.obj = _obj; |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
650 | event.window = event.obj->window; |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
651 | event.document = event.obj->ctx->document; |
|
833
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
652 | event.eventdata = NULL; |
|
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
653 | event.eventdatatype = 0; |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
654 | event.intval = 0; |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
655 | event.set = ui_get_setop(); |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
656 | |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
657 | UiSubListEventData sublistEvent; |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
658 | |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
659 | NSInteger selectedRow = _outlineView.selectedRow; |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
660 | if(selectedRow >= 0) { |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
661 | UiSourceListItem *item = [_outlineView itemAtRow:selectedRow]; |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
662 | UiSourceListItem *parent = item.parent; |
|
833
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
663 | 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
|
664 | 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
|
665 | if(item && var) { |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
666 | sublistEvent.list = var->value; |
|
834
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
667 | 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
|
668 | 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
|
669 | sublistEvent.sublist_userdata = sublist ? sublist->userdata : NULL; |
|
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
670 | sublistEvent.event_data = item.eventdata; |
|
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
671 | 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
|
672 | |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
673 | event.eventdata = &sublistEvent; |
|
833
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
674 | event.eventdatatype = UI_EVENT_DATA_SUBLIST; |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
675 | } |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
676 | } |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
677 | |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
678 | if(_onactivate) { |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
679 | _onactivate(&event, _onactivatedata); |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
680 | } |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
681 | } |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
682 | |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
683 | @end |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
684 | |
|
832
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
685 | /* |
|
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
686 | * Outline datasource item |
|
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
687 | * 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
|
688 | */ |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
689 | @implementation UiSourceListItem |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
690 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
691 | - (id)init:(UiSourceList*)sourcelist sublist:(UiSubList*)sublist { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
692 | _sourcelist = sourcelist; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
693 | _sublist = sublist; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
694 | _items = [[NSMutableArray alloc]initWithCapacity:16]; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
695 | if(sublist->header) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
696 | _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
|
697 | } else { |
|
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
698 | _label = @""; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
699 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
700 | UiVar *var = uic_widget_var(sourcelist.obj->ctx, |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
701 | sourcelist.obj->ctx, |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
702 | sublist->value, |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
703 | sublist->varname, |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
704 | UI_VAR_LIST); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
705 | _var = var; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
706 | return self; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
707 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
708 | |
|
830
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
709 | - (id)init:(UiSubListItem*)item parent:(UiSourceListItem*)parent { |
|
13896bdaa151
add sourcelist event selection handler (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
829
diff
changeset
|
710 | _parent = parent; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
711 | if(item->label) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
712 | _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
|
713 | } else { |
|
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
714 | _label = @""; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
715 | } |
|
833
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
716 | _eventdata = item->eventdata; |
|
828
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 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
720 | - (BOOL)isSection { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
721 | return _sublist != NULL; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
722 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
723 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
724 | - (void)update:(int)row { |
|
832
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
725 | // TODO: check row |
|
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
726 | |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
727 | [_items removeAllObjects]; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
728 | if(_var == NULL) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
729 | return; |
|
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 | UiList *list = _var->value; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
732 | void *elm = list->first(list); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
733 | int index = 0; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
734 | while(elm) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
735 | UiSubListItem item = { NULL, NULL, NULL, NULL, NULL, NULL }; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
736 | if(_sourcelist.getvalue) { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
737 | _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
|
738 | } else { |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
739 | item.label = strdup(elm); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
740 | } |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
741 | |
|
833
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
742 | 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
|
743 | it.sublistIndex = index; |
|
833
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
744 | it.rownum = self.rownum + index; |
|
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
745 | it.sublistStartRow = _parent ? _parent.sublistStartRow : _sublistStartRow; |
|
6cbc74aeff13
implement UiSubListEventData in sourcelist activate events
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
832
diff
changeset
|
746 | [_items addObject:it]; |
|
828
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
747 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
748 | elm = list->next(list); |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
749 | index++; |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
750 | } |
|
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 | |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
753 | @end |
|
a952337ae325
add sourcelist data source (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
718
diff
changeset
|
754 | |
|
832
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
755 | /* |
|
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
756 | * Custom NSTableRowView implementation |
|
7adbd6b7bf7c
enable vertical scrollbar in the sourcelist (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
831
diff
changeset
|
757 | * 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
|
758 | * 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
|
759 | */ |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
760 | @implementation UiSourceListRow |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
761 | |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
762 | - (void)layout { |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
763 | [super layout]; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
764 | |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
765 | for (NSView *subview in self.subviews) { |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
766 | if ([subview.identifier isEqualToString:NSOutlineViewDisclosureButtonKey] || |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
767 | [subview.identifier isEqualToString:NSOutlineViewShowHideButtonKey]) |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
768 | { |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
769 | NSRect frame = subview.frame; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
770 | 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
|
771 | subview.frame = frame; |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
772 | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
773 | if(!_hover) { |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
774 | subview.hidden = YES; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
775 | } |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
776 | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
777 | if(subview != _disclosureButton) { |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
778 | // init disclosure button |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
779 | _disclosureButton = (NSButton*)subview; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
780 | if ([subview isKindOfClass:[NSButton class]]) { |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
781 | NSButton *button = (NSButton*)subview; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
782 | button.contentTintColor = [NSColor tertiaryLabelColor]; |
|
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 | } |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
785 | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
786 | |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
787 | } else if ([subview.identifier isEqualToString:@"cell"]) { |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
788 | NSRect frame = subview.frame; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
789 | frame.origin.x = 16; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
790 | subview.frame = frame; |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
791 | } |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
792 | } |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
793 | } |
|
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
794 | |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
795 | - (void)updateTrackingAreas { |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
796 | [super updateTrackingAreas]; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
797 | if(_trackingArea != nil) { |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
798 | [self removeTrackingArea:_trackingArea]; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
799 | } |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
800 | _trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
801 | options:NSTrackingMouseEnteredAndExited | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
802 | NSTrackingActiveInActiveApp | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
803 | NSTrackingInVisibleRect |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
804 | owner:self |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
805 | userInfo:nil]; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
806 | [self addTrackingArea:_trackingArea]; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
807 | } |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
808 | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
809 | - (void)mouseEntered:(NSEvent *)event { |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
810 | _hover = YES; |
|
834
8801df33144f
add support for sublists without headers (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
833
diff
changeset
|
811 | _disclosureButton.hidden = _showDisclosureButton ? NO : YES; |
|
831
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
812 | } |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
813 | |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
814 | - (void)mouseExited:(NSEvent *)event { |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
815 | _hover = NO; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
816 | _disclosureButton.hidden = YES; |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
817 | } |
|
32a4415dc69a
more sourcelist styling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
830
diff
changeset
|
818 | |
|
829
0980245646b4
implement custom sourcelist row layout (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
828
diff
changeset
|
819 | @end |