ui/cocoa/TabView.m

Thu, 16 Oct 2025 10:48:16 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 16 Oct 2025 10:48:16 +0200
changeset 851
367b2bbbc07e
child 863
589bca248476
permissions
-rw-r--r--

add tabview (Cocoa)

851
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2024 Olaf Wintermann. All rights reserved.
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
367b2bbbc07e add tabview (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
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #import "TabView.h"
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #import "BoxContainer.h"
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #import "GridLayout.h"
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 @implementation UiTopTabView
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 @synthesize container = _container;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 - (id)init:(UiObject*)obj args:(UiTabViewArgs*)args {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 self = [super init];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 _obj = obj;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 _subcontainer = args->subcontainer;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 _padding = args->padding;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 _spacing = args->spacing;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 _columnspacing = args->columnspacing;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 _rowspacing = args->rowspacing;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 _onchange = args->onchange;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 _onchangedata = args->onchangedata;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 _var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER);
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 if(args->tabview == UI_TABVIEW_INVISIBLE || args->tabview == UI_TABVIEW_NAVIGATION_SIDE) {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 self.tabViewType = NSNoTabsNoBorder;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 return self;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 - (void) addView:(NSView*)view layout:(UiLayout*)layout {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 // noop
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 - (NSView<Container>*) createTab:(int)index title:(NSString*)title {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 NSTabViewItem *item = [[NSTabViewItem alloc]initWithIdentifier:nil];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 [item setLabel:title];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 if(index < 0) {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 [self addTabViewItem:item];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 } else {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 [self insertTabViewItem:item atIndex:index];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 BoxContainer *content = [[BoxContainer alloc]init];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 item.view = content;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 GridLayout *sub;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 switch(_subcontainer) {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 default: sub = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:_spacing]; break;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 case UI_CONTAINER_HBOX: sub = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationHorizontal spacing:_spacing]; break;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 case UI_CONTAINER_GRID: {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 sub = [[GridLayout alloc] init];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 sub.columnspacing = _columnspacing;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 sub.rowspacing = _rowspacing;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 break;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 UiLayout layout = {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 .margin = _padding,
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 .margin_left = _padding, .margin_right = _padding, .margin_top = _padding, .margin_bottom = _padding,
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 .fill = TRUE };
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 [content addView:sub layout:&layout];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 return sub;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 - (void) selectTab:(int)index {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 [self selectTabViewItemAtIndex:index];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 - (void) removeTab:(int)index {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 NSTabViewItem *item = [self tabViewItemAtIndex:index];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 if(item != nil) {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 [self removeTabViewItem:item];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 - (UiObject*) addTab:(int)index title:(NSString*)title {
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 NSView<Container> *sub = [self createTab:index title:title];
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 UiObject *newobj = uic_object_new_toplevel();
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 newobj->widget = (__bridge void*)sub;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 UiContainerX *container = ui_create_container(newobj, sub);
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 uic_object_push_container(newobj, container);
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 return newobj;
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113 }
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114
367b2bbbc07e add tabview (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115 @end

mercurial