ui/cocoa/ListDelegate.m

Sat, 30 Aug 2025 16:39:37 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 30 Aug 2025 16:39:37 +0200
changeset 740
2fdfb8a15e82
parent 712
9693f447a0c7
permissions
-rw-r--r--

fix gtk3 build, implement workaround for gtk_button_set_can_shrink

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 "ListDelegate.h"
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 @implementation ListDelegate
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32
712
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
33 - (id)init:(NSTableView*) tableview obj:(UiObject*)obj {
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
34 _tableview = tableview;
711
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 _obj = obj;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 return self;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 }
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 - (void)activateEvent:(id)sender {
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 NSTableView *table = sender;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 if(_onactivate) {
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 int row = (int)table.clickedRow;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 UiListSelection sel;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 sel.count = 1;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 sel.rows = &row;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 UiEvent event;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 event.obj = _obj;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 event.window = event.obj->window;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 event.document = event.obj->ctx->document;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 event.eventdata = &sel;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 event.eventdatatype = UI_EVENT_DATA_LIST_SELECTION;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 event.intval = row;
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 event.set = ui_get_setop();
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 _onactivate(&event, _onactivatedata);
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 }
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 }
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60
712
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
61 - (void) tableViewSelectionDidChange:(NSNotification *) notification {
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
62 if(_onselection) {
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
63 UiListSelection sel = ui_tableview_selection(_tableview);
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
64
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
65 UiEvent event;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
66 event.obj = _obj;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
67 event.window = event.obj->window;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
68 event.document = event.obj->ctx->document;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
69 event.eventdata = &sel;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
70 event.eventdatatype = UI_EVENT_DATA_LIST_SELECTION;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
71 event.intval = 0;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
72 event.set = ui_get_setop();
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
73
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
74 _onselection(&event, _onselectiondata);
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
75 }
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
76 }
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
77
711
673e7e41c93e add minimally working listview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 @end
712
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
79
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
80 UiListSelection ui_tableview_selection(NSTableView *tableview) {
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
81 NSIndexSet *indexSet = tableview.selectedRowIndexes;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
82 NSUInteger count = [indexSet count];
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
83
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
84 if(count == 0) {
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
85 return (UiListSelection){0, NULL};
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
86 }
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
87
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
88 int *rows = calloc(count, sizeof(int));
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
89
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
90 __block NSUInteger i = 0;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
91 [indexSet enumerateIndexesUsingBlock:^(NSUInteger index, BOOL *stop) {
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
92 rows[i++] = (int)index;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
93 }];
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
94
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
95 UiListSelection sel;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
96 sel.count = (int)count;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
97 sel.rows = rows;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
98 return sel;
9693f447a0c7 implement listview onselection event (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 711
diff changeset
99 }

mercurial