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