修订版 | 198 (tree) |
---|---|
时间 | 2021-08-11 15:02:56 |
作者 | toshinagata1964 |
In the strip chart view, the popup of the control number was not working correctly. Fixed.
@@ -23,6 +23,7 @@ | ||
23 | 23 | MyPopUpButton *codePopup; |
24 | 24 | MyPopUpButton *trackPopup; |
25 | 25 | NSTextField *trackLabelText; |
26 | + NSMenu *controlSubmenu; | |
26 | 27 | } |
27 | 28 | |
28 | 29 | - (void)setKindAndCode: (int32_t)kindAndCode; |
@@ -20,11 +20,12 @@ | ||
20 | 20 | #import "MyDocument.h" |
21 | 21 | #import "MyMIDISequence.h" |
22 | 22 | #import "NSCursorAdditions.h" |
23 | +#import "NSMenuAdditions.h" | |
23 | 24 | #import "MDObjects.h" |
24 | 25 | |
25 | 26 | @implementation GraphicSplitterView |
26 | 27 | |
27 | -static NSMenu *sControlSubmenu; | |
28 | +// static NSMenu *sControlSubmenu; | |
28 | 29 | // static NSMenu *sKeyPresSubmenu; |
29 | 30 | |
30 | 31 | static struct sKindMenuItems { |
@@ -40,7 +41,7 @@ | ||
40 | 41 | { kMDEventTempo, @"Tempo" } |
41 | 42 | }; |
42 | 43 | |
43 | -static NSMenuItem * | |
44 | +/*static NSMenuItem * | |
44 | 45 | searchMenuItemWithTag(NSMenu *menu, int tag) |
45 | 46 | { |
46 | 47 | int i; |
@@ -56,7 +57,7 @@ | ||
56 | 57 | } |
57 | 58 | } |
58 | 59 | return nil; |
59 | -} | |
60 | +}*/ | |
60 | 61 | |
61 | 62 | - (id)initWithFrame:(NSRect)frame { |
62 | 63 | int i; |
@@ -114,6 +115,13 @@ | ||
114 | 115 | return self; |
115 | 116 | } |
116 | 117 | |
118 | +- (void)dealloc | |
119 | +{ | |
120 | + if (controlSubmenu != nil) | |
121 | + [controlSubmenu release]; | |
122 | + [super dealloc]; | |
123 | +} | |
124 | + | |
117 | 125 | - (NSMenu *)makeTrackPopup |
118 | 126 | { |
119 | 127 | NSMenu *menu; |
@@ -154,9 +162,9 @@ | ||
154 | 162 | id target = [[[self superview] window] windowController]; |
155 | 163 | [kindPopup setTarget: target]; |
156 | 164 | [kindPopup setAction: @selector(kindPopUpPressed:)]; |
157 | - if (sControlSubmenu == nil) { | |
158 | - sControlSubmenu = [MDMenuWithControlNames(nil, nil, 0) retain]; | |
159 | - } | |
165 | + if (controlSubmenu == nil) { | |
166 | + controlSubmenu = [MDMenuWithControlNames(self, @selector(codeMenuItemSelected:), 0) retain]; | |
167 | + } | |
160 | 168 | [codePopup setTarget: target]; |
161 | 169 | [codePopup setAction: @selector(codeMenuItemSelected:)]; |
162 | 170 | [trackPopup setTarget:target]; |
@@ -213,6 +221,12 @@ | ||
213 | 221 | { |
214 | 222 | } |
215 | 223 | |
224 | +- (IBAction)codeMenuItemSelected:(id)sender | |
225 | +{ | |
226 | + GraphicWindowController *controller = (GraphicWindowController *)[[self window] windowController]; | |
227 | + [controller codeMenuItemSelected:(NSMenuItem *)sender inSplitterView:self]; | |
228 | +} | |
229 | + | |
216 | 230 | - (void)setKindAndCode: (int32_t)kindAndCode |
217 | 231 | { |
218 | 232 | int kind, code; |
@@ -220,11 +234,11 @@ | ||
220 | 234 | code = (kindAndCode & 65535); |
221 | 235 | kind = ((kindAndCode >> 16) & 65535); |
222 | 236 | if (kind != 65535) { |
223 | - item = searchMenuItemWithTag([kindPopup menu], kind); | |
237 | + item = [[kindPopup menu] searchMenuItemWithTag:kind]; | |
224 | 238 | if (item != nil) { |
225 | 239 | [kindPopup selectItem: item]; |
226 | 240 | if (kind == kMDEventControl) { |
227 | - [codePopup setMenu: sControlSubmenu]; | |
241 | + [codePopup setMenu: controlSubmenu]; | |
228 | 242 | [codePopup setEnabled: YES]; |
229 | 243 | } else { |
230 | 244 | [codePopup setMenu: [[[NSMenu allocWithZone: [self zone]] initWithTitle: @""] autorelease]]; |
@@ -233,7 +247,7 @@ | ||
233 | 247 | } |
234 | 248 | } |
235 | 249 | if (code != 65535) { |
236 | - item = searchMenuItemWithTag([codePopup menu], code); | |
250 | + item = [[codePopup menu] searchMenuItemWithTag:code]; | |
237 | 251 | if (item != nil) { |
238 | 252 | [codePopup selectItem: item]; |
239 | 253 | } |
@@ -203,7 +203,7 @@ | ||
203 | 203 | |
204 | 204 | - (void)setStripChartAtIndex: (int)index kind: (int)kind code: (int)code; |
205 | 205 | - (IBAction)kindPopUpPressed: (id)sender; |
206 | -- (IBAction)codeMenuItemSelected: (id)sender; | |
206 | +- (void)codeMenuItemSelected: (NSMenuItem *)item inSplitterView: (GraphicSplitterView *)view; | |
207 | 207 | - (IBAction)trackPopUpPressedInSplitterView: (id)sender; |
208 | 208 | |
209 | 209 | - (IBAction)expandHorizontally: (id)sender; |
@@ -1209,12 +1209,12 @@ | ||
1209 | 1209 | } |
1210 | 1210 | } |
1211 | 1211 | |
1212 | -- (IBAction)codeMenuItemSelected: (id)sender | |
1212 | +- (void)codeMenuItemSelected: (NSMenuItem *)item inSplitterView: (GraphicSplitterView *)view | |
1213 | 1213 | { |
1214 | 1214 | int i, code; |
1215 | 1215 | for (i = 1; i < myClientViewsCount; i++) { |
1216 | - if (records[i].splitter == (GraphicSplitterView *)[sender superview]) { | |
1217 | - code = (int)[[sender selectedItem] tag]; | |
1216 | + if (records[i].splitter == view) { | |
1217 | + code = (int)[item tag]; | |
1218 | 1218 | [self setStripChartAtIndex: i kind: -1 code: code]; |
1219 | 1219 | break; |
1220 | 1220 | } |
@@ -25,6 +25,7 @@ | ||
25 | 25 | { |
26 | 26 | NSColor *textColor; |
27 | 27 | NSColor *backgroundColor; |
28 | + NSMenuItem *selectedItem; /* non-nil if an item in the submenu is selected */ | |
28 | 29 | } |
29 | 30 | + (NSImage *)triangleImage; |
30 | 31 | + (NSImage *)doubleTriangleImage; |
@@ -144,4 +144,28 @@ | ||
144 | 144 | return backgroundColor; |
145 | 145 | } |
146 | 146 | |
147 | +// Implement the menu item selection with hierarchical menus | |
148 | +- (NSMenuItem *)selectedItem | |
149 | +{ | |
150 | + NSMenuItem *item = [super selectedItem]; | |
151 | + if (item == nil && selectedItem != nil) | |
152 | + return selectedItem; | |
153 | + else return item; | |
154 | +} | |
155 | + | |
156 | +- (void)selectItem:(NSMenuItem *)anItem | |
157 | +{ | |
158 | + NSMenuItem *item; | |
159 | + if (selectedItem) | |
160 | + [selectedItem setState:NSOffState]; | |
161 | + [super selectItem:anItem]; | |
162 | + item = [super selectedItem]; | |
163 | + if (item == nil) { | |
164 | + // Should be a submenu item | |
165 | + selectedItem = anItem; | |
166 | + [selectedItem setState:NSOnState]; | |
167 | + } | |
168 | + else selectedItem = nil; | |
169 | +} | |
170 | + | |
147 | 171 | @end |
@@ -20,4 +20,6 @@ | ||
20 | 20 | |
21 | 21 | @interface NSMenu (MyMenuAddition) |
22 | 22 | - (void)changeMenuTitleAttributes:(NSDictionary *)attributes; |
23 | +- (NSMenuItem *)searchMenuItemWithTag:(int)tag; | |
24 | +- (NSMenu *)findSubmenuContainingItem:(NSMenuItem *)anItem outIndex:(int *)outIndex; | |
23 | 25 | @end |
@@ -36,4 +36,47 @@ | ||
36 | 36 | } |
37 | 37 | } |
38 | 38 | |
39 | +static NSMenuItem * | |
40 | +searchMenuItemWithTagSub(NSMenu *menu, int tag) | |
41 | +{ | |
42 | + int i; | |
43 | + NSMenuItem *item; | |
44 | + for (i = (int)[menu numberOfItems] - 1; i >= 0; i--) { | |
45 | + item = (NSMenuItem *)[menu itemAtIndex: i]; | |
46 | + if ([item tag] == tag) | |
47 | + return item; | |
48 | + if ([item hasSubmenu]) { | |
49 | + item = searchMenuItemWithTagSub([item submenu], tag); | |
50 | + if (item != nil) | |
51 | + return item; | |
52 | + } | |
53 | + } | |
54 | + return nil; | |
55 | +} | |
56 | + | |
57 | +- (NSMenuItem *)searchMenuItemWithTag:(int)tag | |
58 | +{ | |
59 | + return searchMenuItemWithTagSub(self, tag); | |
60 | +} | |
61 | + | |
62 | +- (NSMenu *)findSubmenuContainingItem:(NSMenuItem *)anItem outIndex:(int *)outIndex | |
63 | +{ | |
64 | + int i; | |
65 | + NSMenuItem *item; | |
66 | + for (i = (int)[self numberOfItems] - 1; i >= 0; i--) { | |
67 | + item = (NSMenuItem *)[self itemAtIndex: i]; | |
68 | + if (item == anItem) { | |
69 | + if (outIndex != NULL) | |
70 | + *outIndex = i; | |
71 | + return self; | |
72 | + } | |
73 | + if ([item hasSubmenu]) { | |
74 | + NSMenu *menu = [[item submenu] findSubmenuContainingItem:anItem outIndex:outIndex]; | |
75 | + if (menu != nil) | |
76 | + return menu; | |
77 | + } | |
78 | + } | |
79 | + return nil; | |
80 | +} | |
81 | + | |
39 | 82 | @end |