2 Copyright © 2013, The AROS Development Team. All rights reserved.
7 #include <aros/debug.h>
9 #define MUIMASTER_YES_INLINE_STDARG
11 #include <zune/customclasses.h>
12 #include <zune/prefseditor.h>
14 #include <proto/exec.h>
15 #include <proto/dos.h>
16 #include <proto/intuition.h>
17 #include <proto/muimaster.h>
19 #include <proto/alib.h>
21 #include <libraries/mui.h>
27 #include "appearanceeditor.h"
28 #include "themepreview.h"
30 /*** Instance Data **********************************************************/
32 struct AppearanceEditor_DATA
34 Object
*te_ThemePreview
;
35 Object
*te_ThemeEnable
;
36 Object
*te_ThemeChoice
;
37 Object
*te_OptionZune
;
39 Object
*te_OptionWand
;
42 struct Hook te_PreviewHook
;
45 static STRPTR THEMES_DEFAULT
;
46 static STRPTR THEMES_AMIGAOS
= "AmigaOS3.x";
47 static CONST_STRPTR THEMES_BASE
= "THEMES:";
48 static CONST_STRPTR THEMES_ENVPATH
= "SYS/theme.var";
49 static CONST_STRPTR THEMES_DEFPATH
= "SYS:Prefs/Presets/theme.default";
50 static CONST_STRPTR THEMES_OPTZUNEPATH
= "Zune/usethemeprefs";
52 /*** Macros *****************************************************************/
53 #define SETUP_INST_DATA struct AppearanceEditor_DATA *data = INST_DATA(CLASS, self)
55 static IPTR
AppearanceEditor__ListToArray(struct List
*ThemeList
)
57 int ThemeCount
= 0, i
= 0;
58 IPTR
*ThemeArray
= NULL
;
59 struct Node
*ThemeEntry
, *TmpNode
;
61 D(bug("[AppearanceEditor] %s()\n", __PRETTY_FUNCTION__
));
63 ForeachNode(ThemeList
, ThemeEntry
)
68 ThemeArray
= AllocVec(sizeof(IPTR
) * (ThemeCount
+ 1), MEMF_CLEAR
);
69 D(bug("[AppearanceEditor] %s: Array for %d Entries @ 0x%p\n", __PRETTY_FUNCTION__
, ThemeCount
, ThemeArray
));
71 ForeachNodeSafe(ThemeList
, ThemeEntry
, TmpNode
)
74 D(bug("[AppearanceEditor] %s: %02d: %s\n", __PRETTY_FUNCTION__
, i
, ThemeEntry
->ln_Name
));
75 ThemeArray
[i
++] = (IPTR
)ThemeEntry
->ln_Name
;
79 return (IPTR
)ThemeArray
;
82 AROS_UFH3(static void, AppearanceEditor__PreviewHookFunc
,
83 AROS_UFHA(struct Hook
*, h
, A0
),
84 AROS_UFHA(Object
*, self
, A2
),
85 AROS_UFHA(APTR
, msg
, A1
))
88 struct AppearanceEditor_DATA
*data
= h
->h_Data
;
90 D(bug("[AppearanceEditor] %s()\n", __PRETTY_FUNCTION__
));
92 if (XGET(data
->te_ThemeEnable
, MUIA_Selected
))
94 SET(data
->te_ThemeChoice
, MUIA_Disabled
, FALSE
);
95 SET(data
->te_OptionZune
, MUIA_Disabled
, FALSE
);
97 SET(data
->te_OptionWand
, MUIA_Disabled
, FALSE
);
102 SET(data
->te_ThemeChoice
, MUIA_Disabled
, TRUE
);
103 SET(data
->te_OptionZune
, MUIA_Disabled
, TRUE
);
105 SET(data
->te_OptionWand
, MUIA_Disabled
, TRUE
);
108 SET(self
, MUIA_PrefsEditor_Changed
, TRUE
);
113 Object
*AppearanceEditor__Checkmark(BOOL selected
)
115 Object
*obj
= MUI_MakeObject(MUIO_Checkmark
, (IPTR
)NULL
);
119 SET(obj
, MUIA_CycleChain
, 1);
120 SET(obj
, MUIA_Selected
, selected
);
125 #define kExallBufSize (4096)
127 /*** Methods ****************************************************************/
128 Object
*AppearanceEditor__OM_NEW(Class
*CLASS
, Object
*self
, struct opSet
*message
)
130 CONST_STRPTR tab_labels
[3];
131 UBYTE
*ExAllBuffer
= NULL
;
134 Object
*_ThemePreviewObj
;
135 Object
*_ThemeEnable
;
136 Object
*_ThemeSelectionObj
;
138 Object
*_ThemeWandPrefsObj
;
140 Object
*_ThemeZunePrefsObj
;
147 struct List _ThemesAvailable
;
148 struct Node
*_ThemeEntry
;
149 IPTR _ThemeArray
= (IPTR
)NULL
;
151 BPTR _ThemeLock
= BNULL
;
153 D(bug("[AppearanceEditor] %s()\n", __PRETTY_FUNCTION__
));
155 NewList(&_ThemesAvailable
);
157 tab_labels
[0] = "Theme'ing";
158 tab_labels
[1] = "Compositing";
159 tab_labels
[2] = NULL
;
161 // Find Available Themes ...
162 if ((ExAllBuffer
= AllocVec(kExallBufSize
, MEMF_CLEAR
|MEMF_PUBLIC
)) != NULL
)
164 if (GetVar(THEMES_DEFPATH
, ExAllBuffer
, kExallBufSize
, GVF_GLOBAL_ONLY
) == -1)
165 THEMES_DEFAULT
= THEMES_AMIGAOS
;
168 THEMES_DEFAULT
= AllocVec(strlen(ExAllBuffer
) + 1, MEMF_CLEAR
);
169 CopyMem(ExAllBuffer
, (APTR
)THEMES_DEFAULT
, strlen(ExAllBuffer
));
172 if ((_ThemeLock
= Lock(THEMES_BASE
, SHARED_LOCK
)) != BNULL
)
174 struct ExAllControl
*eac
;
175 if ((eac
= AllocDosObject(DOS_EXALLCONTROL
,NULL
)) != NULL
)
177 struct ExAllData
*ead
= (struct ExAllData
*)ExAllBuffer
;
178 eac
->eac_LastKey
= 0;
180 ExAllMore
= ExAll(_ThemeLock
, ead
, kExallBufSize
, ED_COMMENT
, eac
);
181 if ((!ExAllMore
) && (IoErr() != ERROR_NO_MORE_ENTRIES
)) {
184 if (eac
->eac_Entries
== 0) {
187 ead
= (struct ExAllData
*)ExAllBuffer
;
189 if (ead
->ed_Type
== ST_USERDIR
)
191 _ThemeEntry
= AllocVec(sizeof(struct Node
), MEMF_CLEAR
);
192 _ThemeEntry
->ln_Name
= StrDup(ead
->ed_Name
);
193 AddTail(&_ThemesAvailable
, _ThemeEntry
);
198 FreeDosObject(DOS_EXALLCONTROL
, eac
);
200 FreeVec(ExAllBuffer
);
205 //TODO: Display a warning about missing themes: assign
210 // Catastrophic failure - not enough memory to allocate exall buffer =S
211 return (Object
*)NULL
;
214 _ThemeArray
= AppearanceEditor__ListToArray(&_ThemesAvailable
);
216 self
= (Object
*) DoSuperNewTags
219 MUIA_PrefsEditor_Name
, _(MSG_WINTITLE
),
220 MUIA_PrefsEditor_Path
, (IPTR
) THEMES_ENVPATH
,
221 MUIA_PrefsEditor_IconTool
, (IPTR
) "SYS:Prefs/Theme",
224 Child
, (IPTR
)(_ThemePreviewObj
= ThemePreviewObject
,
226 Child
, RegisterGroup(tab_labels
),
227 MUIA_Register_Frame
, TRUE
,
229 Child
, (IPTR
)ColGroup(2),
230 MUIA_Group_SameWidth
, FALSE
,
231 Child
, (IPTR
)Label1(_(MSG_ENABLETHEMES
)),
233 Child
, (IPTR
)(_ThemeEnable
= (Object
*)AppearanceEditor__Checkmark(TRUE
)),
237 Child
, RectangleObject
,
238 MUIA_Background
, MUII_FILL
,
241 Child
, (IPTR
)Label1(_(MSG_SELECTEDTHEME
)),
242 Child
, (IPTR
)(_ThemeSelectionObj
= (Object
*)CycleObject
,
244 MUIA_Cycle_Entries
, _ThemeArray
,
246 Child
, (IPTR
)Label1(_(MSG_ENABLEZUNEPREFS
)),
248 Child
, (IPTR
)(_ThemeZunePrefsObj
= (Object
*)AppearanceEditor__Checkmark(TRUE
)),
252 Child
, (IPTR
)Label1(_(MSG_ENABLEWANDPREFS
)),
254 Child
, (IPTR
)(_ThemeWandPrefsObj
= (Object
*)AppearanceEditor__Checkmark(TRUE
)),
261 Child
, (IPTR
)ColGroup(2),
262 MUIA_Group_SameWidth
, FALSE
,
263 Child
, (IPTR
)Label1("Enable Screen Compositing"),
265 Child
, (IPTR
)(_CompEnable
= (Object
*)AppearanceEditor__Checkmark(TRUE
)),
268 Child
, (IPTR
)Label1("Composite Below"),
270 Child
, (IPTR
)(_CompBelow
= (Object
*)AppearanceEditor__Checkmark(FALSE
)),
273 Child
, (IPTR
)Label1("Composite Left"),
275 Child
, (IPTR
)(_CompLeft
= (Object
*)AppearanceEditor__Checkmark(FALSE
)),
278 Child
, (IPTR
)Label1("Composite Right"),
280 Child
, (IPTR
)(_CompRight
= (Object
*)AppearanceEditor__Checkmark(FALSE
)),
284 Child
, RectangleObject
,
285 MUIA_Background
, MUII_FILL
,
288 Child
, (IPTR
)Label1("Enable Compositing with Alpha"),
290 Child
, (IPTR
)(_CompAlpha
= (Object
*)AppearanceEditor__Checkmark(FALSE
)),
306 data
->te_ThemePreview
= _ThemePreviewObj
;
307 data
->te_ThemeEnable
= _ThemeEnable
;
308 data
->te_ThemeChoice
= _ThemeSelectionObj
;
309 data
->te_OptionZune
= _ThemeZunePrefsObj
;
311 data
->te_OptionWand
= _ThemeWandPrefsObj
;
314 data
->te_ThemeArray
= (IPTR
*)_ThemeArray
;
316 data
->te_PreviewHook
.h_Entry
= (HOOKFUNC
)AppearanceEditor__PreviewHookFunc
;
317 data
->te_PreviewHook
.h_Data
= data
;
321 data
->te_ThemeEnable
, MUIM_Notify
, MUIA_Selected
, MUIV_EveryTime
,
322 (IPTR
) self
, 3, MUIM_CallHook
, (IPTR
)&data
->te_PreviewHook
, (IPTR
)NULL
327 data
->te_ThemeChoice
, MUIM_Notify
, MUIA_Cycle_Active
, MUIV_EveryTime
,
328 (IPTR
) self
, 3, MUIM_CallHook
, (IPTR
)&data
->te_PreviewHook
, (IPTR
)NULL
333 data
->te_OptionZune
, MUIM_Notify
, MUIA_Selected
, MUIV_EveryTime
,
334 (IPTR
) self
, 3, MUIM_CallHook
, (IPTR
)&data
->te_PreviewHook
, (IPTR
)NULL
339 data
->te_OptionWand
, MUIM_Notify
, MUIA_Selected
, MUIV_EveryTime
,
340 (IPTR
) self
, 3, MUIM_CallHook
, (IPTR
)&data
->te_PreviewHook
, (IPTR
)NULL
348 IPTR
AppearanceEditor__OM_DISPOSE(Class
*CLASS
, Object
*self
, struct opSet
*message
)
353 D(bug("[AppearanceEditor] %s()\n", __PRETTY_FUNCTION__
));
355 while (data
->te_ThemeArray
[index
] != (IPTR
)NULL
)
357 D(bug("[AppearanceEditor] %s: Freeing %02d: %s\n", __PRETTY_FUNCTION__
, index
, data
->te_ThemeArray
[index
]));
358 FreeVec((APTR
)data
->te_ThemeArray
[index
]);
361 FreeVec((APTR
)data
->te_ThemeArray
);
363 if (THEMES_DEFAULT
!= THEMES_AMIGAOS
)
364 FreeVec(THEMES_DEFAULT
);
366 return DoSuperMethodA(CLASS
, self
, message
);
369 IPTR AppearanceEditor__MUIM_PrefsEditor_Import
371 Class
*CLASS
, Object
*self
,
372 struct MUIP_PrefsEditor_Import
*message
379 D(bug("[AppearanceEditor] %s()\n", __PRETTY_FUNCTION__
));
381 if ((fh
= Open(message
->filename
, MODE_OLDFILE
)) != BNULL
)
383 NNSET(data
->te_ThemeEnable
, MUIA_Selected
, TRUE
);
384 SET(data
->te_ThemeChoice
, MUIA_Disabled
, FALSE
);
385 SET(data
->te_OptionZune
, MUIA_Disabled
, FALSE
);
387 SET(data
->te_OptionWand
, MUIA_Disabled
, FALSE
);
389 success
= DoMethod(self
, MUIM_PrefsEditor_ImportFH
, (IPTR
) fh
);
394 NNSET(data
->te_ThemeEnable
, MUIA_Selected
, FALSE
);
395 SET(data
->te_ThemeChoice
, MUIA_Disabled
, TRUE
);
396 SET(data
->te_OptionZune
, MUIA_Disabled
, TRUE
);
398 SET(data
->te_OptionWand
, MUIA_Disabled
, TRUE
);
405 IPTR
AppearanceEditor__MUIM_PrefsEditor_ImportFH (
406 Class
*CLASS
, Object
*self
,
407 struct MUIP_PrefsEditor_ImportFH
*message
411 BOOL success
= TRUE
, optzune
= TRUE
;
412 TEXT tmpThemePath
[1024];
415 D(bug("[AppearanceEditor] %s(FH@ 0x%p)\n", __PRETTY_FUNCTION__
, message
->fh
));
419 if (FGets(message
->fh
, tmpThemePath
, 1024))
421 char *tmpThemeFile
= FilePart(tmpThemePath
);
423 D(bug("[AppearanceEditor] %s: Prefs Theme = '%s'\n", __PRETTY_FUNCTION__
, tmpThemeFile
));
425 while (data
->te_ThemeArray
[index
] != (IPTR
)NULL
)
427 if (strncmp((char *)data
->te_ThemeArray
[index
], tmpThemeFile
, strlen((char *)data
->te_ThemeArray
[index
])) == 0)
429 NNSET(data
->te_ThemeChoice
, MUIA_Cycle_Active
, index
);
437 if (GetVar(THEMES_OPTZUNEPATH
, tmpThemePath
, 1, GVF_GLOBAL_ONLY
) == -1)
440 NNSET(data
->te_OptionZune
, MUIA_Selected
, optzune
);
445 IPTR AppearanceEditor__MUIM_PrefsEditor_Export
447 Class
*CLASS
, Object
*self
,
448 struct MUIP_PrefsEditor_Export
*message
454 D(bug("[AppearanceEditor] %s()\n", __PRETTY_FUNCTION__
));
456 if (XGET(data
->te_ThemeEnable
, MUIA_Selected
))
458 success
= DoSuperMethodA(CLASS
, self
, message
);
462 DeleteVar(THEMES_ENVPATH
, GVF_GLOBAL_ONLY
);
468 IPTR AppearanceEditor__MUIM_PrefsEditor_ExportFH
470 Class
*CLASS
, Object
*self
,
471 struct MUIP_PrefsEditor_ExportFH
*message
478 D(bug("[AppearanceEditor] %s(FH@ 0x%p)\n", __PRETTY_FUNCTION__
, message
->fh
));
484 GET(data
->te_ThemeChoice
, MUIA_Cycle_Active
, &active
);
485 D(bug("[AppearanceEditor] %s: Selected Theme = [%02d] '%s'\n", __PRETTY_FUNCTION__
, active
, data
->te_ThemeArray
[active
]));
487 tmpThemePath
= AllocVec(strlen(THEMES_BASE
) + strlen((char *)data
->te_ThemeArray
[active
]) + 1, MEMF_CLEAR
);
488 sprintf(tmpThemePath
, "%s%s", THEMES_BASE
, (char *)data
->te_ThemeArray
[active
]);
490 if (FPuts(message
->fh
, tmpThemePath
))
493 if (XGET(data
->te_OptionZune
, MUIA_Selected
))
495 sprintf(tmpThemePath
, "True");
496 SetVar(THEMES_OPTZUNEPATH
, tmpThemePath
, 4,GVF_GLOBAL_ONLY
);
500 DeleteVar(THEMES_OPTZUNEPATH
, GVF_GLOBAL_ONLY
);
503 FreeVec(tmpThemePath
);
505 // TODO: Signal Decoration to relaod the theme
511 IPTR AppearanceEditor__MUIM_PrefsEditor_SetDefaults
513 Class
*CLASS
, Object
*self
, Msg message
519 D(bug("[AppearanceEditor] %s()\n", __PRETTY_FUNCTION__
));
521 while (data
->te_ThemeArray
[index
] != (IPTR
)NULL
)
523 if (!strcmp((char *)data
->te_ThemeArray
[index
], THEMES_DEFAULT
))
525 SET(data
->te_ThemeChoice
, MUIA_Cycle_Active
, index
);
530 SET(data
->te_OptionZune
, MUIA_Selected
, TRUE
);
532 SET(data
->te_OptionWand
, MUIA_Selected
, TRUE
);
537 /*** Setup ******************************************************************/
540 AppearanceEditor
, NULL
, MUIC_PrefsEditor
, NULL
,
541 OM_NEW
, struct opSet
*,
542 OM_DISPOSE
, struct opSet
*,
543 MUIM_PrefsEditor_Import
, struct MUIP_PrefsEditor_Import
*,
544 MUIM_PrefsEditor_ImportFH
, struct MUIP_PrefsEditor_ImportFH
*,
545 MUIM_PrefsEditor_Export
, struct MUIP_PrefsEditor_Export
*,
546 MUIM_PrefsEditor_ExportFH
, struct MUIP_PrefsEditor_ExportFH
*,
547 MUIM_PrefsEditor_SetDefaults
, Msg