1 // sprite_edit_dialog.cpp : implementation file
2 //
3
4 #include "studiox_includes.h"
5 #include "stdafx.h"
6 #include "sprite_edit_dialog.h"
7 #include "afxdialogex.h"
8 #include "import_sprite_frames_dlg.h"
9
10 #define MAX_SPRITE_FRAMES 256
11 #define FRAME_INFO_NOT_EQUAL 65535
12
13 #define READ_FRAME_FIELD(id, str, val) \
14 GetDlgItemText(id, str); \
15 if (str.IsEmpty()) \
16 { \
17 val = FRAME_INFO_NOT_EQUAL;\
18 }
19
20 #define SET_FRAME_FIELD(id, value) \
21 if (value != FRAME_INFO_NOT_EQUAL) \
22 { \
23 SetDlgItemInt(id, value); \
24 } \
25 else \
26 { \
27 GetDlgItem(id)->SetWindowText(L"");\
28 }
29
30 #define SET_VAL(target, source) \
31 if (source != FRAME_INFO_NOT_EQUAL)\
32 { \
33 target = source; \
34 }
35
36 #define CHECK_EQUAL(target, source) \
37 if (target != source) \
38 { \
39 target = FRAME_INFO_NOT_EQUAL; \
40 }
41
42 enum sprite_edit_dlg_test_commands {
43 TEST_EDIT_FRAME = 1,
44 TEST_EDIT_NUM_FRAMES,
45 TEST_SET_ALPHA,
46 TEST_SET_XOFFSET,
47 TEST_SET_YOFFSET,
48 TEST_SET_DELAY,
49 TEST_CHECK_APPLY_TO_ALL_FRAMES,
50 TEST_IMPORT_FRAMES,
51 TEST_SAVE,
52 TEST_CANCEL
53 };
54
55
BEGIN_MESSAGE_MAP(sprite_edit_dialog,express_dialog)56 BEGIN_MESSAGE_MAP(sprite_edit_dialog, express_dialog)
57 ON_WM_CREATE()
58 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_NUM_FRAMES, &sprite_edit_dialog::OnDeltaposSpinNumFrames)
59 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_EDIT_FRAME, &sprite_edit_dialog::OnDeltaposSpinEditFrame)
60 ON_EN_KILLFOCUS(IDC_NUM_FRAMES, &sprite_edit_dialog::OnEnKillfocusNumFrames)
61 ON_EN_KILLFOCUS(IDC_EDIT_FRAME, &sprite_edit_dialog::OnEnKillfocusEditFrame)
62 ON_EN_KILLFOCUS(IDC_ALPHA_VALUE, &sprite_edit_dialog::OnEnKillfocusAlphaValue)
63 ON_EN_KILLFOCUS(IDC_X_OFFSET, &sprite_edit_dialog::OnEnKillfocusXOffset)
64 ON_EN_KILLFOCUS(IDC_Y_OFFSET, &sprite_edit_dialog::OnEnKillfocusYOffset)
65 ON_EN_KILLFOCUS(IDC_DELAY, &sprite_edit_dialog::OnEnKillfocusDelay)
66 ON_BN_CLICKED(IDC_APPLY_TO_ALL_FRAMES, OnClickApplyToAllFrames)
67 ON_BN_CLICKED(IDC_IMPORT_FRAMES, OnImportFrames)
68 ON_BN_CLICKED(IDCANCEL, OnCancel)
69 ON_MESSAGE(STUDIO_TEST, OnTestMessage)
70 END_MESSAGE_MAP()
71
72
73 // sprite_edit_dialog dialog
74
75 ///////////////////////////////////////////////////////////////////////////////
76 sprite_edit_dialog::sprite_edit_dialog(widget_info *info, CWnd* pParent /*=NULL*/)
77 : express_dialog(sprite_edit_dialog::IDD, pParent)
78 {
79 int index;
80
81 IconId = IDB_PROPS_VIEW;
82 SetTitleText("Edit Sprite Frames");
83
84 mpInfo = info;
85 mTempInfo = *info;
86
87 // allcate MAX_FRAMES, so we don't have to keep resizing the array
88 // every time the user adds or removes frames.
89 GX_SPRITE_FRAME *old_frames = mTempInfo.ewi.sprite.framelist;
90 mTempInfo.ewi.sprite.framelist = new GX_SPRITE_FRAME[MAX_SPRITE_FRAMES];
91 memset(mTempInfo.ewi.sprite.framelist, 0, MAX_SPRITE_FRAMES * sizeof(GX_SPRITE_FRAME));
92
93 for (index = 0; index < mTempInfo.ewi.sprite.frame_count; index++)
94 {
95 mTempInfo.ewi.sprite.framelist[index] = old_frames[index];
96 }
97 if (mTempInfo.ewi.sprite.frame_count == 0)
98 {
99 mTempInfo.ewi.sprite.frame_count = 1;
100 }
101 delete [] old_frames;
102 mEditFrame = 0;
103 }
104
105 ///////////////////////////////////////////////////////////////////////////////
~sprite_edit_dialog()106 sprite_edit_dialog::~sprite_edit_dialog()
107 {
108 }
109
110 ///////////////////////////////////////////////////////////////////////////////
OnOK()111 void sprite_edit_dialog::OnOK()
112 {
113 // copy my temp info to widget info
114 ReadFrameFields();
115
116 express_dialog::OnOK();
117
118 GX_SPRITE_FRAME *old_frames = mpInfo->ewi.sprite.framelist;
119 mpInfo->ewi.sprite.framelist = mTempInfo.ewi.sprite.framelist;
120 mTempInfo.ewi.sprite.framelist = NULL;
121 delete [] old_frames;
122 mpInfo->ewi.sprite.frame_count = mTempInfo.ewi.sprite.frame_count;
123 mTempInfo.ewi.sprite.frame_count = 0;
124 mpInfo->ewi.sprite.apply_to_all_frames = mTempInfo.ewi.sprite.apply_to_all_frames;
125 }
126
127 ///////////////////////////////////////////////////////////////////////////////
SelectDropListItem(CComboBox * box,long val)128 void sprite_edit_dialog::SelectDropListItem(CComboBox* box, long val)
129 {
130 int box_index;
131
132 for (box_index = 0; box_index < box->GetCount(); box_index++)
133 {
134 if (box->GetItemData(box_index) == val)
135 {
136 box->SetCurSel(box_index);
137 }
138 }
139 }
140
141 ///////////////////////////////////////////////////////////////////////////////
SetFrameFields()142 void sprite_edit_dialog::SetFrameFields()
143 {
144 int alpha = mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_alpha;
145 int xoffset = mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_x_offset;
146 int yoffset = mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_y_offset;
147 int delay = mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_delay;
148 int bg_operation_sel = mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_background_operation;
149
150 if (mTempInfo.ewi.sprite.apply_to_all_frames)
151 {
152 for (int index = 0; index < mTempInfo.ewi.sprite.frame_count; index++)
153 {
154 if (index == mEditFrame)
155 {
156 continue;
157 }
158 CHECK_EQUAL(alpha, mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_alpha);
159 CHECK_EQUAL(xoffset, mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_x_offset);
160 CHECK_EQUAL(yoffset, mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_y_offset);
161 CHECK_EQUAL(delay, mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_delay);
162 CHECK_EQUAL(bg_operation_sel, mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_background_operation);
163 }
164 }
165
166 SET_FRAME_FIELD(IDC_ALPHA_VALUE, alpha);
167 SET_FRAME_FIELD(IDC_X_OFFSET, xoffset);
168 SET_FRAME_FIELD(IDC_X_OFFSET, xoffset);
169 SET_FRAME_FIELD(IDC_Y_OFFSET, yoffset);
170 SET_FRAME_FIELD(IDC_DELAY, delay);
171
172 SelectDropListItem(&mPixelmapCombo, mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_pixelmap);
173
174 CString diff_operation(L"<different operations>");
175 int index = mBackgroundCombo.FindString(0, diff_operation);
176
177 if (bg_operation_sel != FRAME_INFO_NOT_EQUAL)
178 {
179 if (index >= 0)
180 {
181 mBackgroundCombo.DeleteString(index);
182 }
183 }
184 else
185 {
186 if (index < 0)
187 {
188 int sel = mBackgroundCombo.InsertString(-1, diff_operation);
189 mBackgroundCombo.SetItemData(sel, FRAME_INFO_NOT_EQUAL);
190 }
191 }
192
193 SelectDropListItem(&mBackgroundCombo, bg_operation_sel);
194 }
195
196 ///////////////////////////////////////////////////////////////////////////////
ReadFrameFields()197 void sprite_edit_dialog::ReadFrameFields()
198 {
199 if (mTempInfo.ewi.sprite.framelist)
200 {
201 int alpha = GetDlgItemInt(IDC_ALPHA_VALUE);
202 int xoffset = GetDlgItemInt(IDC_X_OFFSET);
203 int yoffset = GetDlgItemInt(IDC_Y_OFFSET);
204 int delay = GetDlgItemInt(IDC_DELAY);
205 int cursel = mBackgroundCombo.GetCurSel();
206 int background_operation = mBackgroundCombo.GetItemData(cursel);
207 CString str;
208 int index;
209 int frame_count;
210
211 if (mTempInfo.ewi.sprite.apply_to_all_frames)
212 {
213 READ_FRAME_FIELD(IDC_ALPHA_VALUE, str, alpha);
214 READ_FRAME_FIELD(IDC_X_OFFSET, str, xoffset);
215 READ_FRAME_FIELD(IDC_Y_OFFSET, str, yoffset);
216 READ_FRAME_FIELD(IDC_DELAY, str, delay);
217
218 index = 0;
219 frame_count = mTempInfo.ewi.sprite.frame_count;
220 }
221 else
222 {
223 cursel = mPixelmapCombo.GetCurSel();
224 mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_pixelmap = mPixelmapCombo.GetItemData(cursel);
225
226 index = mEditFrame;
227 frame_count = index + 1;
228 }
229
230 while (index < frame_count)
231 {
232 SET_VAL(mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_alpha, alpha);
233 SET_VAL(mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_x_offset, xoffset);
234 SET_VAL(mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_y_offset, yoffset);
235 SET_VAL(mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_delay, delay);
236 SET_VAL(mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_background_operation, background_operation);
237
238 index++;
239 }
240 }
241 }
242
243 ///////////////////////////////////////////////////////////////////////////////
DoDataExchange(CDataExchange * pDX)244 void sprite_edit_dialog::DoDataExchange(CDataExchange* pDX)
245 {
246 CDialog::DoDataExchange(pDX);
247 DDX_Control(pDX, IDC_SPIN_NUM_FRAMES, mSpinNumFrames);
248 DDX_Control(pDX, IDC_SPIN_EDIT_FRAME, mSpinEditFrame);
249 DDX_Control(pDX, IDC_NUM_FRAMES, mNumFramesField);
250 DDX_Control(pDX, IDC_EDIT_FRAME, mEditFrameField);
251 DDX_Control(pDX, IDC_BACKGROUND_COMBO, mBackgroundCombo);
252 DDX_Control(pDX, IDC_PIXELMAP_COMBO, mPixelmapCombo);
253 DDX_Control(pDX, IDC_X_OFFSET, mXOffsetEdit);
254 DDX_Control(pDX, IDC_Y_OFFSET, mYOffsetEdit);
255
256 if (pDX->m_bSaveAndValidate)
257 {
258 ReadFrameFields();
259 }
260 else
261 {
262 mXOffsetEdit.EnableNumberCheck();
263 mXOffsetEdit.EnableNegativeValue();
264
265 mYOffsetEdit.EnableNumberCheck();
266 mYOffsetEdit.EnableNegativeValue();
267
268 mSpinNumFrames.SetRange(1, MAX_SPRITE_FRAMES);
269 mSpinNumFrames.SetPos32(mTempInfo.ewi.sprite.frame_count);
270 mSpinEditFrame.SetRange(1, mTempInfo.ewi.sprite.frame_count);
271 mSpinEditFrame.SetPos32(1);
272 SetDlgItemInt(IDC_NUM_FRAMES, mTempInfo.ewi.sprite.frame_count);
273 SetDlgItemInt(IDC_EDIT_FRAME, 1);
274
275 CString resname;
276
277 int index;
278 index = mBackgroundCombo.AddString(_T("No Operation"));
279 mBackgroundCombo.SetItemData(index, 0);
280
281 index = mBackgroundCombo.AddString(_T("Restore first pixelmap"));
282 mBackgroundCombo.SetItemData(index, 1);
283
284 index = mBackgroundCombo.AddString(_T("Solid Color Fill"));
285 mBackgroundCombo.SetItemData(index, 2);
286
287
288 mBackgroundCombo.ShowWindow(SW_SHOW);
289
290 int pixelmap_id = 1;
291 mPixelmapCombo.AddString(_T("None"));
292 studiox_project* project = GetOpenProject();
293
294 if (!project)
295 {
296 return;
297 }
298
299 int active_display = GetProjectView()->GetActiveDisplay();
300 int active_theme = project->mDisplays[active_display].active_theme;
301
302 for (pixelmap_id = 1; pixelmap_id < project->CountResources(active_display, RES_TYPE_PIXELMAP); pixelmap_id++)
303 {
304 project->GetResourceName(active_display, RES_TYPE_PIXELMAP, pixelmap_id, resname);
305
306 if (!resname.IsEmpty())
307 {
308 index = mPixelmapCombo.AddString(resname);
309 mPixelmapCombo.SetItemData(index, pixelmap_id);
310 }
311 }
312
313 if (mpInfo->pixelmap_id[NORMAL_PIXELMAP_INDEX])
314 {
315 // Disable frame count and pixelmap edit.
316 GetDlgItem(IDC_NUM_FRAMES)->EnableWindow(FALSE);
317 GetDlgItem(IDC_SPIN_NUM_FRAMES)->EnableWindow(FALSE);
318 GetDlgItem(IDC_PIXELMAP_COMBO)->EnableWindow(FALSE);
319 GetDlgItem(IDC_IMPORT_FRAMES)->EnableWindow(FALSE);
320 }
321
322 if (mTempInfo.ewi.sprite.apply_to_all_frames)
323 {
324 ((CButton*)GetDlgItem(IDC_APPLY_TO_ALL_FRAMES))->SetCheck(TRUE);
325 GetDlgItem(IDC_EDIT_FRAME)->EnableWindow(FALSE);
326 GetDlgItem(IDC_PIXELMAP_COMBO)->EnableWindow(FALSE);
327 }
328
329 SetFrameFields();
330 }
331 }
332
333
334 // sprite_edit_dialog message handlers
335
336 ///////////////////////////////////////////////////////////////////////////////
OnDeltaposSpinNumFrames(NMHDR * pNMHDR,LRESULT * pResult)337 void sprite_edit_dialog::OnDeltaposSpinNumFrames(NMHDR *pNMHDR, LRESULT *pResult)
338 {
339 LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
340 // TODO: Add your control notification handler code here
341
342 int oldval = pNMUpDown ->iPos;
343 int newval = oldval + pNMUpDown->iDelta;
344 int current_val;
345
346 if (oldval <= MAX_SPRITE_FRAMES && oldval >= 1)
347 {
348 if (newval <= 0)
349 {
350 newval = 1;
351 }
352 else
353 {
354 if (newval > MAX_SPRITE_FRAMES)
355 {
356 newval = MAX_SPRITE_FRAMES;
357 }
358 }
359 SetDlgItemInt(IDC_NUM_FRAMES, newval);
360 mTempInfo.ewi.sprite.frame_count = newval;
361
362 if (newval < oldval)
363 {
364 current_val = mSpinEditFrame.GetPos32();
365
366 if (mSpinEditFrame.GetPos32() > newval)
367 {
368 mSpinEditFrame.SetPos32(newval);
369 SetDlgItemInt(IDC_EDIT_FRAME, newval);
370 mEditFrame = newval - 1;
371 SetFrameFields();
372 }
373 }
374 else
375 {
376 // clear out the new entry
377 memset(&mTempInfo.ewi.sprite.framelist[newval - 1], 0, sizeof(GX_SPRITE_FRAME));
378 mTempInfo.ewi.sprite.framelist[newval - 1].gx_sprite_frame_alpha = 255;
379 mTempInfo.ewi.sprite.framelist[newval - 1].gx_sprite_frame_delay = 5;
380 }
381 mSpinEditFrame.SetRange(1, newval);
382 mSpinEditFrame.Invalidate();
383 }
384
385 *pResult = 0;
386 }
387
388 ///////////////////////////////////////////////////////////////////////////////
OnDeltaposSpinEditFrame(NMHDR * pNMHDR,LRESULT * pResult)389 void sprite_edit_dialog::OnDeltaposSpinEditFrame(NMHDR *pNMHDR, LRESULT *pResult)
390 {
391 LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
392 // TODO: Add your control notification handler code here
393 int upper;
394 int lower;
395
396 mSpinEditFrame.GetRange(lower, upper);
397
398 int oldval = pNMUpDown ->iPos;
399 int newval = oldval + pNMUpDown->iDelta;
400
401 // save the current name, update to new name, if the value is within
402 // limits
403 if (oldval <= upper && oldval >= lower &&
404 newval <= upper && newval >= lower)
405 {
406
407 // Read and save current frame values
408 ReadFrameFields();
409 SetDlgItemInt(IDC_EDIT_FRAME, newval);
410
411 // switch to new frame
412 mEditFrame = newval - 1;
413 SetFrameFields();
414 }
415
416 *pResult = 0;
417 }
418
419 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusNumFrames()420 void sprite_edit_dialog::OnEnKillfocusNumFrames()
421 {
422 int newval = GetDlgItemInt(IDC_NUM_FRAMES);
423
424 int oldval = mTempInfo.ewi.sprite.frame_count;
425
426 if ((newval >= 1) && (newval <= MAX_SPRITE_FRAMES))
427 {
428
429 mTempInfo.ewi.sprite.frame_count = newval;
430
431 if (newval < oldval)
432 {
433 if (mEditFrame > newval)
434 {
435 mSpinEditFrame.SetPos32(newval);
436 SetDlgItemInt(IDC_EDIT_FRAME, newval);
437 mEditFrame = newval - 1;
438 SetFrameFields();
439 }
440 }
441 else
442 {
443 // clear out the new entry
444 for (int index = oldval; index < newval; index++)
445 {
446 memset(&mTempInfo.ewi.sprite.framelist[index], 0, sizeof(GX_SPRITE_FRAME));
447 mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_alpha = 255;
448 mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_delay = 5;
449 }
450 }
451 mSpinEditFrame.SetRange(1, newval);
452 mSpinEditFrame.Invalidate();
453 }
454 else
455 {
456 SetDlgItemInt(IDC_NUM_FRAMES, oldval);
457
458 char msg[255];
459 sprintf_s(msg, sizeof(msg), "Invalid value for Number of Frames. Valid range is from 1 to %d.", MAX_SPRITE_FRAMES);
460 ErrorMsg(msg, this);
461 GetDlgItem(IDC_NUM_FRAMES)->SetFocus();
462 }
463 }
464
465 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusEditFrame()466 void sprite_edit_dialog::OnEnKillfocusEditFrame()
467 {
468 int newval = GetDlgItemInt(IDC_EDIT_FRAME);
469
470 int max_frame_id = GetDlgItemInt(IDC_NUM_FRAMES);
471
472 if ((newval >= 1) && (newval <= max_frame_id))
473 {
474 // Read and save current frame values
475 ReadFrameFields();
476
477 // switch to new frame
478 mEditFrame = newval - 1;
479 SetFrameFields();
480 }
481 else
482 {
483 SetDlgItemInt(IDC_EDIT_FRAME, mEditFrame + 1);
484 ErrorMsg("Selected frame must be between 1 and the total number of frames", this);
485 GetDlgItem(IDC_EDIT_FRAME)->SetFocus();
486 }
487 }
488
489 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusAlphaValue()490 void sprite_edit_dialog::OnEnKillfocusAlphaValue()
491 {
492 // TODO: Add your control notification handler code here
493 int val = GetDlgItemInt(IDC_ALPHA_VALUE);
494 if (val < 0 || val > 255)
495 {
496 SetDlgItemInt(IDC_ALPHA_VALUE, mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_alpha);
497 }
498 }
499
500
501 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusXOffset()502 void sprite_edit_dialog::OnEnKillfocusXOffset()
503 {
504 // TODO: Add your control notification handler code here
505 int val = GetDlgItemInt(IDC_X_OFFSET);
506 if (val < -65535 || val > 65535)
507 {
508 SetDlgItemInt(IDC_X_OFFSET, mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_x_offset);
509 }
510 }
511
512
513 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusYOffset()514 void sprite_edit_dialog::OnEnKillfocusYOffset()
515 {
516 // TODO: Add your control notification handler code here
517 int val = GetDlgItemInt(IDC_Y_OFFSET);
518 if (val < -65535 || val > 65535)
519 {
520 SetDlgItemInt(IDC_Y_OFFSET, mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_y_offset);
521 }
522 }
523
524
525 ///////////////////////////////////////////////////////////////////////////////
OnEnKillfocusDelay()526 void sprite_edit_dialog::OnEnKillfocusDelay()
527 {
528 // TODO: Add your control notification handler code here
529 int val = GetDlgItemInt(IDC_DELAY);
530 if (val < 0 || val > 999)
531 {
532 SetDlgItemInt(IDC_DELAY, mTempInfo.ewi.sprite.framelist[mEditFrame].gx_sprite_frame_delay);
533 }
534 }
535
536 ///////////////////////////////////////////////////////////////////////////////
OnClickApplyToAllFrames()537 void sprite_edit_dialog::OnClickApplyToAllFrames()
538 {
539 ReadFrameFields();
540
541 if (((CButton*)GetDlgItem(IDC_APPLY_TO_ALL_FRAMES))->GetCheck() == BST_CHECKED)
542 {
543 mTempInfo.ewi.sprite.apply_to_all_frames = TRUE;
544 GetDlgItem(IDC_EDIT_FRAME)->EnableWindow(FALSE);
545 GetDlgItem(IDC_PIXELMAP_COMBO)->EnableWindow(FALSE);
546 }
547 else
548 {
549 mTempInfo.ewi.sprite.apply_to_all_frames = FALSE;
550 GetDlgItem(IDC_EDIT_FRAME)->EnableWindow(TRUE);
551 GetDlgItem(IDC_PIXELMAP_COMBO)->EnableWindow(TRUE);
552 }
553
554 SetFrameFields();
555 }
556
557 ///////////////////////////////////////////////////////////////////////////////
SetFrameCount(int frame_count)558 void sprite_edit_dialog::SetFrameCount(int frame_count)
559 {
560 if (frame_count <= 0)
561 {
562 return;
563 }
564
565 if (frame_count > MAX_SPRITE_FRAMES)
566 {
567 frame_count = MAX_SPRITE_FRAMES;
568 }
569
570 int oldval = mTempInfo.ewi.sprite.frame_count;
571
572 SetDlgItemInt(IDC_NUM_FRAMES, frame_count);
573 mTempInfo.ewi.sprite.frame_count = frame_count;
574
575 if (frame_count < oldval)
576 {
577 if (mSpinEditFrame.GetPos32() > frame_count)
578 {
579 mSpinEditFrame.SetPos32(frame_count);
580 SetDlgItemInt(IDC_EDIT_FRAME, frame_count);
581 mEditFrame = frame_count - 1;
582 SetFrameFields();
583 }
584 }
585 else
586 {
587 for (int index = oldval; index < frame_count; index++)
588 {
589 // clear out the new entry
590 memset(&mTempInfo.ewi.sprite.framelist[index], 0, sizeof(GX_SPRITE_FRAME));
591 mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_alpha = 255;
592 mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_delay = 5;
593 }
594 }
595 mSpinEditFrame.SetRange(1, frame_count);
596 mSpinEditFrame.Invalidate();
597 }
598
599 ///////////////////////////////////////////////////////////////////////////////
OnImportFrames()600 void sprite_edit_dialog::OnImportFrames()
601 {
602 import_sprite_frames_dlg dlg(this);
603
604 if (dlg.DoModal() == IDOK)
605 {
606 CArray<CString> *name_list = dlg.GetFrameNameList();
607 if (!name_list || name_list->IsEmpty())
608 {
609 return;
610 }
611
612 int count = name_list->GetCount();
613
614 if (count)
615 {
616 if (count > MAX_SPRITE_FRAMES)
617 {
618 count = MAX_SPRITE_FRAMES;
619 }
620
621 SetFrameCount(count);
622
623 studiox_project* project = GetOpenProject();
624 int active_display = GetProjectView()->GetActiveDisplay();
625
626 CString name;
627
628 for(int index = 0; index < count; index++)
629 {
630 name = name_list->GetAt(index);
631
632 mTempInfo.ewi.sprite.framelist[index].gx_sprite_frame_pixelmap = project->GetResourceId(active_display, RES_TYPE_PIXELMAP, name);
633
634 if (index == mEditFrame)
635 {
636 mPixelmapCombo.SelectString(0, name);
637 }
638 }
639 }
640 }
641 }
642
643 ///////////////////////////////////////////////////////////////////////////////
OnInitDialog()644 BOOL sprite_edit_dialog::OnInitDialog()
645 {
646 express_dialog::OnInitDialog();
647
648 // TODO: Add extra initialization here
649 AddCancelButton();
650 AddSaveButton();
651
652
653 return TRUE; // return TRUE unless you set the focus to a control
654 // EXCEPTION: OCX Property Pages should return FALSE
655 }
656
657
PreTranslateMessage(MSG * pMsg)658 BOOL sprite_edit_dialog::PreTranslateMessage(MSG* pMsg)
659 {
660 // TODO: Add your specialized code here and/or call the base class
661 CWnd* focus_owner = GetFocus();
662
663 if (focus_owner)
664 {
665 int ctrl_id = focus_owner->GetDlgCtrlID();
666
667 switch (ctrl_id)
668 {
669 case IDC_NUM_FRAMES:
670 case IDC_EDIT_FRAME:
671 case IDC_ALPHA_VALUE:
672 case IDC_DELAY:
673 if ((pMsg->message == WM_CHAR) && isprint(pMsg->wParam))
674 {
675 if (pMsg->wParam < '0' || pMsg->wParam > '9')
676 {
677 ErrorMsg("Unacceptable Character. You can only type a number here.", this);
678 return TRUE;
679 }
680 }
681 break;
682 }
683 }
684
685 return express_dialog::PreTranslateMessage(pMsg);
686 }
687
688 //////////////////////////////////////////////////////////////////////////////
OnTestMessage(WPARAM wParam,LPARAM lParam)689 LRESULT sprite_edit_dialog::OnTestMessage(WPARAM wParam, LPARAM lParam)
690 {
691 CWnd* pWnd;
692 CString string;
693
694 switch (wParam)
695 {
696 case TEST_EDIT_FRAME:
697 pWnd = GetDlgItem(IDC_EDIT_FRAME);
698 if (pWnd)
699 {
700 CStringArray param;
701 CString id;
702
703
704 SplitString(GetTestingParam(0), ',', ¶m);
705 id = param.GetAt(0);
706 string = param.GetAt(1);
707
708 pWnd->SetWindowText(id);
709 SendMessage(WM_COMMAND, MAKEWPARAM(IDC_EDIT_FRAME, EN_KILLFOCUS), (LPARAM)((CEdit*)pWnd)->m_hWnd);
710
711
712 pWnd = GetDlgItem(IDC_PIXELMAP_COMBO);
713 ((CComboBox*)pWnd)->SelectString(-1, string);
714 SendMessage(WM_COMMAND, MAKEWPARAM(IDC_PIXELMAP_COMBO, CBN_SELCHANGE), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
715 }
716 break;
717
718 case TEST_EDIT_NUM_FRAMES:
719 pWnd = GetDlgItem(IDC_NUM_FRAMES);
720 string.Format(_T("%d"), lParam);
721 pWnd->SetWindowText(string);
722 SendMessage(WM_COMMAND, MAKEWPARAM(IDC_NUM_FRAMES, EN_KILLFOCUS), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
723 break;
724
725 case TEST_SET_ALPHA:
726 pWnd = GetDlgItem(IDC_ALPHA_VALUE);
727 string.Format(_T("%d"), lParam);
728 pWnd->SetWindowText(string);
729 SendMessage(WM_COMMAND, MAKEWPARAM(IDC_ALPHA_VALUE, EN_KILLFOCUS), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
730 break;
731
732 case TEST_SET_XOFFSET:
733 pWnd = GetDlgItem(IDC_X_OFFSET);
734 string.Format(_T("%d"), lParam);
735 pWnd->SetWindowText(string);
736 SendMessage(WM_COMMAND, MAKEWPARAM(IDC_X_OFFSET, EN_KILLFOCUS), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
737 break;
738
739 case TEST_SET_YOFFSET:
740 pWnd = GetDlgItem(IDC_Y_OFFSET);
741 string.Format(_T("%d"), lParam);
742 pWnd->SetWindowText(string);
743 SendMessage(WM_COMMAND, MAKEWPARAM(IDC_Y_OFFSET, EN_KILLFOCUS), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
744 break;
745
746 case TEST_SET_DELAY:
747 pWnd = GetDlgItem(IDC_DELAY);
748 string.Format(_T("%d"), lParam);
749 pWnd->SetWindowText(string);
750 SendMessage(WM_COMMAND, MAKEWPARAM(IDC_DELAY, EN_KILLFOCUS), (LPARAM)((CComboBox*)pWnd)->m_hWnd);
751 break;
752
753 case TEST_CHECK_APPLY_TO_ALL_FRAMES:
754 {
755 CButton *button = (CButton *)GetDlgItem(IDC_APPLY_TO_ALL_FRAMES);
756 button->SetCheck(lParam);
757 SendMessage(WM_COMMAND, MAKEWPARAM(IDC_APPLY_TO_ALL_FRAMES, BN_CLICKED), (LPARAM)button->m_hWnd);
758 }
759 break;
760
761 case TEST_IMPORT_FRAMES:
762 OnImportFrames();
763 break;
764
765 case TEST_SAVE:
766 OnOK();
767 break;
768
769 case TEST_CANCEL:
770 OnCancel();
771 break;
772 }
773
774 return 0;
775 }
776
777