ui/cocoa/list.m

Thu, 04 Jun 2026 19:59:58 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 04 Jun 2026 19:59:58 +0200
changeset 1168
2f9d8af6a499
parent 1163
a32411b88442
child 1178
2889dd61cfb3
permissions
-rw-r--r--

save list selections when unbinding

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

mercurial