use amigaos like behaviour by default
[AROS.git] / workbench / prefs / appearance / appearanceeditor.c
blobfc87229c885095e49ba1b0eb1ce00249bcb7a197
1 /*
2 Copyright © 2013, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define DEBUG 0
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>
23 #include <stdlib.h>
24 #include <stdio.h>
26 #include "locale.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;
38 #if (0)
39 Object *te_OptionWand;
40 #endif
41 IPTR *te_ThemeArray;
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)
65 ThemeCount++;
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)
73 Remove(ThemeEntry);
74 D(bug("[AppearanceEditor] %s: %02d: %s\n", __PRETTY_FUNCTION__, i, ThemeEntry->ln_Name));
75 ThemeArray[i++] = (IPTR)ThemeEntry->ln_Name;
76 FreeVec(ThemeEntry);
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))
87 AROS_USERFUNC_INIT
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);
96 #if (0)
97 SET(data->te_OptionWand, MUIA_Disabled, FALSE);
98 #endif
100 else
102 SET(data->te_ThemeChoice, MUIA_Disabled, TRUE);
103 SET(data->te_OptionZune, MUIA_Disabled, TRUE);
104 #if (0)
105 SET(data->te_OptionWand, MUIA_Disabled, TRUE);
106 #endif
108 SET(self, MUIA_PrefsEditor_Changed, TRUE);
110 AROS_USERFUNC_EXIT
113 Object *AppearanceEditor__Checkmark(BOOL selected)
115 Object *obj = MUI_MakeObject(MUIO_Checkmark, (IPTR)NULL);
117 if (obj)
119 SET(obj, MUIA_CycleChain, 1);
120 SET(obj, MUIA_Selected, selected);
122 return obj;
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;
132 BOOL ExAllMore;
134 Object *_ThemePreviewObj;
135 Object *_ThemeEnable;
136 Object *_ThemeSelectionObj;
137 #if (0)
138 Object *_ThemeWandPrefsObj;
139 #endif
140 Object *_ThemeZunePrefsObj;
141 Object *_CompEnable;
142 Object *_CompBelow;
143 Object *_CompLeft;
144 Object *_CompRight;
145 Object *_CompAlpha;
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;
166 else
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;
179 do {
180 ExAllMore = ExAll(_ThemeLock, ead, kExallBufSize, ED_COMMENT, eac);
181 if ((!ExAllMore) && (IoErr() != ERROR_NO_MORE_ENTRIES)) {
182 break;
184 if (eac->eac_Entries == 0) {
185 continue;
187 ead = (struct ExAllData *)ExAllBuffer;
188 do {
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);
195 ead = ead->ed_Next;
196 } while (ead);
197 } while (ExAllMore);
198 FreeDosObject(DOS_EXALLCONTROL, eac);
200 FreeVec(ExAllBuffer);
201 UnLock(_ThemeLock);
203 else
205 //TODO: Display a warning about missing themes: assign
208 else
210 // Catastrophic failure - not enough memory to allocate exall buffer =S
211 return (Object *)NULL;
214 _ThemeArray = AppearanceEditor__ListToArray(&_ThemesAvailable);
216 self = (Object *) DoSuperNewTags
218 CLASS, self, NULL,
219 MUIA_PrefsEditor_Name, _(MSG_WINTITLE),
220 MUIA_PrefsEditor_Path, (IPTR) THEMES_ENVPATH,
221 MUIA_PrefsEditor_IconTool, (IPTR) "SYS:Prefs/Theme",
223 Child, VGroup,
224 Child, (IPTR)(_ThemePreviewObj = ThemePreviewObject,
225 End),
226 Child, RegisterGroup(tab_labels),
227 MUIA_Register_Frame, TRUE,
228 Child, VGroup,
229 Child, (IPTR)ColGroup(2),
230 MUIA_Group_SameWidth, FALSE,
231 Child, (IPTR)Label1(_(MSG_ENABLETHEMES)),
232 Child, HGroup,
233 Child, (IPTR)(_ThemeEnable = (Object *)AppearanceEditor__Checkmark(TRUE)),
234 Child, HVSpace,
235 End,
236 Child, HVSpace,
237 Child, RectangleObject,
238 MUIA_Background, MUII_FILL,
239 MUIA_FixHeight, 2,
240 End,
241 Child, (IPTR)Label1(_(MSG_SELECTEDTHEME)),
242 Child, (IPTR)(_ThemeSelectionObj = (Object *)CycleObject,
243 MUIA_CycleChain, 1,
244 MUIA_Cycle_Entries, _ThemeArray,
245 End),
246 Child, (IPTR)Label1(_(MSG_ENABLEZUNEPREFS)),
247 Child, HGroup,
248 Child, (IPTR)(_ThemeZunePrefsObj = (Object *)AppearanceEditor__Checkmark(TRUE)),
249 Child, HVSpace,
250 End,
251 #if (0)
252 Child, (IPTR)Label1(_(MSG_ENABLEWANDPREFS)),
253 Child, HGroup,
254 Child, (IPTR)(_ThemeWandPrefsObj = (Object *)AppearanceEditor__Checkmark(TRUE)),
255 Child, HVSpace,
256 End,
257 #endif
258 End,
259 End,
260 Child, VGroup,
261 Child, (IPTR)ColGroup(2),
262 MUIA_Group_SameWidth, FALSE,
263 Child, (IPTR)Label1("Enable Screen Compositing"),
264 Child, HGroup,
265 Child, (IPTR)(_CompEnable = (Object *)AppearanceEditor__Checkmark(TRUE)),
266 Child, HVSpace,
267 End,
268 Child, (IPTR)Label1("Composite Below"),
269 Child, HGroup,
270 Child, (IPTR)(_CompBelow = (Object *)AppearanceEditor__Checkmark(FALSE)),
271 Child, HVSpace,
272 End,
273 Child, (IPTR)Label1("Composite Left"),
274 Child, HGroup,
275 Child, (IPTR)(_CompLeft = (Object *)AppearanceEditor__Checkmark(FALSE)),
276 Child, HVSpace,
277 End,
278 Child, (IPTR)Label1("Composite Right"),
279 Child, HGroup,
280 Child, (IPTR)(_CompRight = (Object *)AppearanceEditor__Checkmark(FALSE)),
281 Child, HVSpace,
282 End,
283 Child, HVSpace,
284 Child, RectangleObject,
285 MUIA_Background, MUII_FILL,
286 MUIA_FixHeight, 2,
287 End,
288 Child, (IPTR)Label1("Enable Compositing with Alpha"),
289 Child, HGroup,
290 Child, (IPTR)(_CompAlpha = (Object *)AppearanceEditor__Checkmark(FALSE)),
291 Child, HVSpace,
292 End,
293 End,
294 Child, HVSpace,
295 End,
296 End,
297 End,
299 TAG_DONE
302 if (self)
304 SETUP_INST_DATA;
306 data->te_ThemePreview = _ThemePreviewObj;
307 data->te_ThemeEnable = _ThemeEnable;
308 data->te_ThemeChoice = _ThemeSelectionObj;
309 data->te_OptionZune = _ThemeZunePrefsObj;
310 #if (0)
311 data->te_OptionWand = _ThemeWandPrefsObj;
312 #endif
314 data->te_ThemeArray = (IPTR *)_ThemeArray;
316 data->te_PreviewHook.h_Entry = (HOOKFUNC)AppearanceEditor__PreviewHookFunc;
317 data->te_PreviewHook.h_Data = data;
319 DoMethod
321 data->te_ThemeEnable, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
322 (IPTR) self, 3, MUIM_CallHook, (IPTR)&data->te_PreviewHook, (IPTR)NULL
325 DoMethod
327 data->te_ThemeChoice, MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime,
328 (IPTR) self, 3, MUIM_CallHook, (IPTR)&data->te_PreviewHook, (IPTR)NULL
331 DoMethod
333 data->te_OptionZune, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
334 (IPTR) self, 3, MUIM_CallHook, (IPTR)&data->te_PreviewHook, (IPTR)NULL
336 #if (0)
337 DoMethod
339 data->te_OptionWand, MUIM_Notify, MUIA_Selected, MUIV_EveryTime,
340 (IPTR) self, 3, MUIM_CallHook, (IPTR)&data->te_PreviewHook, (IPTR)NULL
342 #endif
345 return self;
348 IPTR AppearanceEditor__OM_DISPOSE(Class *CLASS, Object *self, struct opSet *message)
350 SETUP_INST_DATA;
351 int index = 0;
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]);
359 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
375 SETUP_INST_DATA;
376 BOOL success = TRUE;
377 BPTR fh;
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);
386 #if (0)
387 SET(data->te_OptionWand, MUIA_Disabled, FALSE);
388 #endif
389 success = DoMethod(self, MUIM_PrefsEditor_ImportFH, (IPTR) fh);
390 Close(fh);
392 else
394 NNSET(data->te_ThemeEnable, MUIA_Selected, FALSE);
395 SET(data->te_ThemeChoice, MUIA_Disabled, TRUE);
396 SET(data->te_OptionZune, MUIA_Disabled, TRUE);
397 #if (0)
398 SET(data->te_OptionWand, MUIA_Disabled, TRUE);
399 #endif
402 return success;
405 IPTR AppearanceEditor__MUIM_PrefsEditor_ImportFH (
406 Class *CLASS, Object *self,
407 struct MUIP_PrefsEditor_ImportFH *message
410 SETUP_INST_DATA;
411 BOOL success = TRUE, optzune = TRUE;
412 TEXT tmpThemePath[1024];
413 int index = 0;
415 D(bug("[AppearanceEditor] %s(FH@ 0x%p)\n", __PRETTY_FUNCTION__, message->fh));
417 if (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);
430 break;
432 index++;
437 if (GetVar(THEMES_OPTZUNEPATH, tmpThemePath, 1, GVF_GLOBAL_ONLY) == -1)
438 optzune = FALSE;
440 NNSET(data->te_OptionZune, MUIA_Selected, optzune);
442 return success;
445 IPTR AppearanceEditor__MUIM_PrefsEditor_Export
447 Class *CLASS, Object *self,
448 struct MUIP_PrefsEditor_Export *message
451 SETUP_INST_DATA;
452 BOOL success = TRUE;
454 D(bug("[AppearanceEditor] %s()\n", __PRETTY_FUNCTION__));
456 if (XGET(data->te_ThemeEnable, MUIA_Selected))
458 success = DoSuperMethodA(CLASS, self, message);
460 else
462 DeleteVar(THEMES_ENVPATH, GVF_GLOBAL_ONLY);
465 return success;
468 IPTR AppearanceEditor__MUIM_PrefsEditor_ExportFH
470 Class *CLASS, Object *self,
471 struct MUIP_PrefsEditor_ExportFH *message
474 SETUP_INST_DATA;
475 BOOL success = TRUE;
476 IPTR active = 0;
478 D(bug("[AppearanceEditor] %s(FH@ 0x%p)\n", __PRETTY_FUNCTION__, message->fh));
480 if (message->fh)
482 char *tmpThemePath;
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))
491 success = FALSE;
493 if (XGET(data->te_OptionZune, MUIA_Selected))
495 sprintf(tmpThemePath, "True");
496 SetVar(THEMES_OPTZUNEPATH, tmpThemePath, 4,GVF_GLOBAL_ONLY);
498 else
500 DeleteVar(THEMES_OPTZUNEPATH, GVF_GLOBAL_ONLY);
503 FreeVec(tmpThemePath);
505 // TODO: Signal Decoration to relaod the theme
508 return success;
511 IPTR AppearanceEditor__MUIM_PrefsEditor_SetDefaults
513 Class *CLASS, Object *self, Msg message
516 SETUP_INST_DATA;
517 int index = 0;
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);
526 break;
528 index++;
530 SET(data->te_OptionZune, MUIA_Selected, TRUE);
531 #if (0)
532 SET(data->te_OptionWand, MUIA_Selected, TRUE);
533 #endif
534 return TRUE;
537 /*** Setup ******************************************************************/
538 ZUNE_CUSTOMCLASS_7
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