1/*
2    PPToolModifierTipsPanelController.m
3
4    Copyright 2013-2018 Josh Freeman
5    http://www.twilightedge.com
6
7    This file is part of PikoPixel for Mac OS X and GNUstep.
8    PikoPixel is a graphical application for drawing & editing pixel-art images.
9
10    PikoPixel is free software: you can redistribute it and/or modify it under
11    the terms of the GNU Affero General Public License as published by the
12    Free Software Foundation, either version 3 of the License, or (at your
13    option) any later version approved for PikoPixel by its copyright holder (or
14    an authorized proxy).
15
16    PikoPixel is distributed in the hope that it will be useful, but WITHOUT ANY
17    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18    FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
19    details.
20
21    You should have received a copy of the GNU Affero General Public License
22    along with this program. If not, see <http://www.gnu.org/licenses/>.
23*/
24
25#import "PPToolModifierTipsPanelController.h"
26
27#import "PPDocument.h"
28#import "PPToolModifierTipsText.h"
29#import "PPPanelDefaultFramePinnings.h"
30
31
32#define kToolModifierTipsPanelNibName   @"ToolModifierTipsPanel"
33
34#define kMarginForTextFields            (8.0f)
35
36
37@interface PPToolModifierTipsPanelController (PrivateMethods)
38
39- (void) handlePPDocumentNotification_SwitchedSelectedTool: (NSNotification *) notification;
40- (void) handlePPDocumentNotification_SwitchedActiveTool: (NSNotification *) notification;
41
42- (void) updateTypeModifierTextFields;
43- (void) updateActionModifierTextFields;
44
45@end
46
47@implementation PPToolModifierTipsPanelController
48
49#pragma mark NSWindowController overrides
50
51- (void) windowDidLoad
52{
53    float maxTextWidth_ModifierDescriptions, maxTextWidth_ModifierKeyNames,
54            maxTextHeight_TypeModifiers, maxTextHeight_ActionModifiers;
55    NSRect typeModifierToolNamesFrame, typeModifierKeysFrame, actionModifierDescriptionsFrame,
56            actionModifierKeysFrame;
57    NSSize contentSize;
58
59    if (![PPToolModifierTipsText
60                        getMaxTextWidthForModifierDescriptions:
61                                                    &maxTextWidth_ModifierDescriptions
62                        maxTextWidthForModifierKeyNames: &maxTextWidth_ModifierKeyNames
63                        maxTextHeightForTypeModifiersText: &maxTextHeight_TypeModifiers
64                        maxTextHeightForActionModifiersText: &maxTextHeight_ActionModifiers])
65    {
66        goto ERROR;
67    }
68
69    actionModifierDescriptionsFrame =
70        NSMakeRect(kMarginForTextFields,
71                    kMarginForTextFields,
72                    maxTextWidth_ModifierDescriptions + kMarginForTextFields,
73                    maxTextHeight_ActionModifiers);
74
75    actionModifierKeysFrame =
76        NSMakeRect(NSMaxX(actionModifierDescriptionsFrame),
77                    kMarginForTextFields,
78                    maxTextWidth_ModifierKeyNames + kMarginForTextFields,
79                    maxTextHeight_ActionModifiers);
80
81    typeModifierToolNamesFrame =
82        NSMakeRect(kMarginForTextFields,
83                    NSMaxY(actionModifierDescriptionsFrame) + kMarginForTextFields,
84                    maxTextWidth_ModifierDescriptions + kMarginForTextFields,
85                    maxTextHeight_TypeModifiers);
86
87    typeModifierKeysFrame =
88        NSMakeRect(NSMaxX(typeModifierToolNamesFrame),
89                    NSMaxY(actionModifierKeysFrame) + kMarginForTextFields,
90                    maxTextWidth_ModifierKeyNames + kMarginForTextFields,
91                    maxTextHeight_TypeModifiers);
92
93    contentSize = NSMakeSize(NSMaxX(typeModifierKeysFrame),
94                                NSMaxY(typeModifierKeysFrame) + kMarginForTextFields);
95
96    [_typeModifierToolNamesTextField setFrame: typeModifierToolNamesFrame];
97    [_typeModifierKeysTextField setFrame: typeModifierKeysFrame];
98    [_actionModifierDescriptionsTextField setFrame: actionModifierDescriptionsFrame];
99    [_actionModifierKeysTextField setFrame: actionModifierKeysFrame];
100
101    [[self window] setContentSize: contentSize];
102
103    // [super windowDidLoad] may show the panel, so call as late as possible
104    [super windowDidLoad];
105
106    return;
107
108ERROR:
109    [super windowDidLoad];
110}
111
112#pragma mark PPPanelController overrides
113
114+ (NSString *) panelNibName
115{
116    return kToolModifierTipsPanelNibName;
117}
118
119- (void) addAsObserverForPPDocumentNotifications
120{
121    if (!_ppDocument)
122        return;
123
124    [[NSNotificationCenter defaultCenter]
125                    addObserver: self
126                    selector: @selector(handlePPDocumentNotification_SwitchedSelectedTool:)
127                    name: PPDocumentNotification_SwitchedSelectedTool
128                    object: _ppDocument];
129
130    [[NSNotificationCenter defaultCenter]
131                    addObserver: self
132                    selector: @selector(handlePPDocumentNotification_SwitchedActiveTool:)
133                    name: PPDocumentNotification_SwitchedActiveTool
134                    object: _ppDocument];
135}
136
137- (void) removeAsObserverForPPDocumentNotifications
138{
139    [[NSNotificationCenter defaultCenter] removeObserver: self
140                                            name: PPDocumentNotification_SwitchedSelectedTool
141                                            object: _ppDocument];
142
143    [[NSNotificationCenter defaultCenter] removeObserver: self
144                                            name: PPDocumentNotification_SwitchedActiveTool
145                                            object: _ppDocument];
146}
147
148- (bool) defaultPanelEnabledState
149{
150    return YES;
151}
152
153- (PPFramePinningType) pinningTypeForDefaultWindowFrame
154{
155    return kPPPanelDefaultFramePinning_ToolModifierTips;
156}
157
158- (void) setupPanelForCurrentPPDocument
159{
160    [self updateTypeModifierTextFields];
161    [self updateActionModifierTextFields];
162
163    // [super setupPanelForCurrentPPDocument] may show the panel, so call as late as possible
164    [super setupPanelForCurrentPPDocument];
165}
166
167#pragma mark PPDocument notifications
168
169- (void) handlePPDocumentNotification_SwitchedSelectedTool: (NSNotification *) notification
170{
171    [self updateTypeModifierTextFields];
172}
173
174- (void) handlePPDocumentNotification_SwitchedActiveTool: (NSNotification *) notification
175{
176    [self updateActionModifierTextFields];
177}
178
179#pragma mark Private methods
180
181- (void) updateTypeModifierTextFields
182{
183    NSAttributedString *typeModifierDescriptions, *typeModifierKeyNames;
184
185    if (![PPToolModifierTipsText getTypeModifierDescriptions: &typeModifierDescriptions
186                                    andTypeModifierKeyNames: &typeModifierKeyNames
187                                    forToolType: [_ppDocument selectedToolType]])
188    {
189        goto ERROR;
190    }
191
192    [_typeModifierToolNamesTextField setAttributedStringValue: typeModifierDescriptions];
193    [_typeModifierKeysTextField setAttributedStringValue: typeModifierKeyNames];
194
195    return;
196
197ERROR:
198    return;
199}
200
201- (void) updateActionModifierTextFields
202{
203    NSAttributedString *actionModifierDescriptions, *actionModifierKeyNames;
204
205    if (![PPToolModifierTipsText getActionModifierDescriptions: &actionModifierDescriptions
206                                    andActionModifierKeyNames: &actionModifierKeyNames
207                                    forToolType: [_ppDocument activeToolType]])
208    {
209        goto ERROR;
210    }
211
212    [_actionModifierDescriptionsTextField setAttributedStringValue: actionModifierDescriptions];
213    [_actionModifierKeysTextField setAttributedStringValue: actionModifierKeyNames];
214
215    return;
216
217ERROR:
218    return;
219}
220
221@end
222