1 /* Apperance.c- color/texture for titlebar etc.
3 * WPrefs - Window Maker Preferences Program
5 * Copyright (c) 1999 Alfredo K. Kojima
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
31 #include "TexturePanel.h"
33 typedef struct _Panel
{
37 CallbackRec callbacks
;
60 TexturePanel
*texturePanel
;
84 static void showData(_Panel
*panel
);
87 static void OpenExtractPanelFor(_Panel
*panel
, char *path
);
89 #define ICON_FILE "appearance"
91 #define TNEW_FILE "tnew"
92 #define TDEL_FILE "tdel"
93 #define TEDIT_FILE "tedit"
94 #define TEXTR_FILE "textr"
99 static char * blueled_xpm
[] = {
129 static char *blueled2_xpm
[] = {
130 /* width height num_colors chars_per_pixel */
163 #define FTITLE (1<<0)
164 #define UTITLE (1<<1)
165 #define OTITLE (1<<2)
166 #define MTITLE (1<<3)
170 #define EVERYTHING 0xff
175 #define TEXPREV_WIDTH 40
176 #define TEXPREV_HEIGHT 24
183 str2rcolor(RContext
*rc
, char *name
, RColor
*color
)
187 XParseColor(rc
->dpy
, rc
->cmap
, name
, &xcolor
);
190 color
->red
= xcolor
.red
>> 8;
191 color
->green
= xcolor
.green
>> 8;
192 color
->blue
= xcolor
.blue
>> 8;
198 dumpRImage(char *path
, RImage
*image
)
202 f
= fopen(path
, "w");
207 fprintf(f
, "%02x%02x%1x", image
->width
, image
->height
,
208 image
->data
[3]!=NULL
? 4 : 3);
210 fwrite(image
->data
[0], 1, image
->width
* image
->height
, f
);
211 fwrite(image
->data
[1], 1, image
->width
* image
->height
, f
);
212 fwrite(image
->data
[2], 1, image
->width
* image
->height
, f
);
214 fwrite(image
->data
[3], 1, image
->width
* image
->height
, f
);
224 renderTexture(WMScreen
*scr
, proplist_t texture
, int width
, int height
,
225 char *path
, int border
)
230 RContext
*rc
= WMScreenRContext(scr
);
235 type
= PLGetString(PLGetArrayElement(texture
, 0));
237 image
= RCreateImage(width
, height
, False
);
239 if (strcasecmp(type
, "solid")==0) {
241 str
= PLGetString(PLGetArrayElement(texture
, 1));
243 str2rcolor(rc
, str
, &rcolor
);
245 RClearImage(image
, &rcolor
);
246 } else if (strcasecmp(&type
[1], "gradient")==0) {
250 switch (toupper(type
[0])) {
252 style
= RVerticalGradient
;
255 style
= RHorizontalGradient
;
258 style
= RDiagonalGradient
;
262 str
= PLGetString(PLGetArrayElement(texture
, 1));
263 str2rcolor(rc
, str
, &rcolor
);
264 str
= PLGetString(PLGetArrayElement(texture
, 2));
265 str2rcolor(rc
, str
, &rcolor2
);
267 image
= RRenderGradient(width
, height
, &rcolor
, &rcolor2
, style
);
268 } else if (strcasecmp(&type
[2], "gradient")==0) {
273 switch (toupper(type
[1])) {
275 style
= RVerticalGradient
;
278 style
= RHorizontalGradient
;
281 style
= RDiagonalGradient
;
285 j
= PLGetNumberOfElements(texture
);
288 colors
= wmalloc(j
* sizeof(RColor
*));
290 for (i
= 2; i
< j
; i
++) {
291 str
= PLGetString(PLGetArrayElement(texture
, i
));
292 colors
[i
-2] = wmalloc(sizeof(RColor
));
293 str2rcolor(rc
, str
, colors
[i
-2]);
297 image
= RRenderMultiGradient(width
, height
, colors
, style
);
299 for (i
= 0; colors
[i
]!=NULL
; i
++)
303 } else if (strcasecmp(&type
[1], "pixmap")==0) {
309 str
= PLGetString(PLGetArrayElement(texture
, 1));
311 path
= wfindfileinarray(GetObjectForKey("PixmapPath"), str
);
312 timage
= RLoadImage(rc
, path
, 0);
315 if (toupper(type
[0]) == 'T') {
316 if (timage
->width
< TEXPREV_WIDTH
317 || timage
->height
< TEXPREV_HEIGHT
) {
318 image
= RMakeTiledImage(timage
, TEXPREV_WIDTH
, TEXPREV_HEIGHT
);
319 RDestroyImage(timage
);
326 if (w
- TEXPREV_WIDTH
> h
- TEXPREV_HEIGHT
) {
327 h
= (w
* TEXPREV_HEIGHT
)/TEXPREV_WIDTH
;
329 w
= (h
* TEXPREV_WIDTH
)/TEXPREV_HEIGHT
;
332 image
= RScaleImage(timage
, w
, h
);
333 RDestroyImage(timage
);
339 dumpRImage(path
, image
);
343 RBevelImage(image
, border
);
346 RConvertImage(rc
, image
, &pixmap
);
347 RDestroyImage(image
);
356 updatePreviewBox(_Panel
*panel
, int elements
)
358 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
359 Display
*dpy
= WMScreenDisplay(scr
);
360 /* RContext *rc = WMScreenRContext(scr);*/
365 TextureListItem
*titem
;
367 gc
= XCreateGC(dpy
, WMWidgetXID(panel
->win
), 0, NULL
);
370 if (!panel
->preview
) {
373 panel
->preview
= XCreatePixmap(dpy
, WMWidgetXID(panel
->win
),
374 220-4, 185-4, WMScreenDepth(scr
));
376 color
= WMGrayColor(scr
);
377 XFillRectangle(dpy
, panel
->preview
, WMColorGC(color
),
379 WMReleaseColor(color
);
384 if (elements
& FTITLE
) {
385 item
= WMGetListItem(panel
->texLs
, 0);
386 titem
= (TextureListItem
*)item
->clientData
;
388 pix
= renderTexture(scr
, titem
->prop
, 180, 20, NULL
, RBEV_RAISED2
);
390 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 180, 20, 5, 10);
392 XFreePixmap(dpy
, pix
);
394 if (elements
& UTITLE
) {
395 item
= WMGetListItem(panel
->texLs
, 1);
396 titem
= (TextureListItem
*)item
->clientData
;
398 pix
= renderTexture(scr
, titem
->prop
, 180, 20, NULL
, RBEV_RAISED2
);
400 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 180, 20, 10, 35);
402 XFreePixmap(dpy
, pix
);
404 if (elements
& OTITLE
) {
405 item
= WMGetListItem(panel
->texLs
, 2);
406 titem
= (TextureListItem
*)item
->clientData
;
408 pix
= renderTexture(scr
, titem
->prop
, 180, 20, NULL
, RBEV_RAISED2
);
410 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 180, 20, 15, 60);
412 XFreePixmap(dpy
, pix
);
414 if (elements
& MTITLE
) {
415 item
= WMGetListItem(panel
->texLs
, 3);
416 titem
= (TextureListItem
*)item
->clientData
;
418 pix
= renderTexture(scr
, titem
->prop
, 100, 20, NULL
, RBEV_RAISED2
);
420 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 100, 20, 20, 95);
422 XFreePixmap(dpy
, pix
);
424 if (elements
& MITEM
) {
425 item
= WMGetListItem(panel
->texLs
, 4);
426 titem
= (TextureListItem
*)item
->clientData
;
428 pix
= renderTexture(scr
, titem
->prop
, 100, 18, NULL
, RBEV_RAISED2
);
430 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 100, 20, 20, 115);
431 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 100, 20, 20, 115+18);
432 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 100, 20, 20, 115+36);
434 XFreePixmap(dpy
, pix
);
436 if (elements
& ICON
) {
437 item
= WMGetListItem(panel
->texLs
, 5);
438 titem
= (TextureListItem
*)item
->clientData
;
440 pix
= renderTexture(scr
, titem
->prop
, 64, 64, NULL
, RBEV_RAISED3
);
442 XCopyArea(dpy
, pix
, panel
->preview
, gc
, 0, 0, 64, 64, 130, 100);
444 XFreePixmap(dpy
, pix
);
450 p
= WMCreatePixmapFromXPixmaps(scr
, panel
->preview
, None
,
451 220-4, 185-4, WMScreenDepth(scr
));
453 WMSetLabelImage(panel
->prevL
, p
);
456 WMRedisplayWidget(panel
->prevL
);
466 cancelNewTexture(void *data
)
468 _Panel
*panel
= (_Panel
*)data
;
470 HideTexturePanel(panel
->texturePanel
);
477 makeFileName(char *prefix
, char *name
)
482 str
= wstrappend(prefix
, name
);
483 fname
= wstrdup(str
);
486 while (access(fname
, F_OK
)==0) {
490 sprintf(buf
, "%i", i
++);
491 fname
= wstrappend(str
, buf
);
502 okNewTexture(void *data
)
504 _Panel
*panel
= (_Panel
*)data
;
509 TextureListItem
*titem
;
510 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
512 titem
= wmalloc(sizeof(TextureListItem
));
513 memset(titem
, 0, sizeof(TextureListItem
));
515 HideTexturePanel(panel
->texturePanel
);
517 name
= GetTexturePanelTextureName(panel
->texturePanel
);
519 prop
= GetTexturePanelTexture(panel
->texturePanel
);
521 str
= PLGetDescription(prop
);
525 titem
->texture
= str
;
526 titem
->selectedFor
= 0;
528 titem
->path
= makeFileName(panel
->fprefix
, name
);
529 titem
->preview
= renderTexture(scr
, prop
, TEXPREV_WIDTH
, TEXPREV_HEIGHT
,
532 item
= WMAddListItem(panel
->texLs
, "");
533 item
->clientData
= titem
;
535 WMSetListPosition(panel
->texLs
, WMGetListNumberOfRows(panel
->texLs
));
541 okEditTexture(void *data
)
543 _Panel
*panel
= (_Panel
*)data
;
548 TextureListItem
*titem
;
550 item
= WMGetListItem(panel
->texLs
, WMGetListSelectedItemRow(panel
->texLs
));
551 titem
= (TextureListItem
*)item
->clientData
;
553 HideTexturePanel(panel
->texturePanel
);
555 if (titem
->current
) {
556 name
= GetTexturePanelTextureName(panel
->texturePanel
);
562 prop
= GetTexturePanelTexture(panel
->texturePanel
);
564 str
= PLGetDescription(prop
);
566 PLRelease(titem
->prop
);
569 free(titem
->texture
);
570 titem
->texture
= str
;
572 XFreePixmap(WMScreenDisplay(WMWidgetScreen(panel
->texLs
)), titem
->preview
);
573 titem
->preview
= renderTexture(WMWidgetScreen(panel
->texLs
), titem
->prop
,
574 TEXPREV_WIDTH
, TEXPREV_HEIGHT
,
577 WMRedisplayWidget(panel
->texLs
);
579 if (titem
->selectedFor
)
580 updatePreviewBox(panel
, titem
->selectedFor
);
586 editTexture(WMWidget
*w
, void *data
)
588 _Panel
*panel
= (_Panel
*)data
;
590 TextureListItem
*titem
;
592 item
= WMGetListItem(panel
->texLs
, WMGetListSelectedItemRow(panel
->texLs
));
593 titem
= (TextureListItem
*)item
->clientData
;
595 SetTexturePanelTexture(panel
->texturePanel
, titem
->title
, titem
->prop
);
597 SetTexturePanelCancelAction(panel
->texturePanel
, cancelNewTexture
, panel
);
598 SetTexturePanelOkAction(panel
->texturePanel
, okEditTexture
, panel
);
600 SetTexturePanelPixmapPath(panel
->texturePanel
,
601 GetObjectForKey("PixmapPath"));
602 ShowTexturePanel(panel
->texturePanel
);
608 newTexture(WMWidget
*w
, void *data
)
610 _Panel
*panel
= (_Panel
*)data
;
612 SetTexturePanelTexture(panel
->texturePanel
, "New Texture", NULL
);
614 SetTexturePanelCancelAction(panel
->texturePanel
, cancelNewTexture
, panel
);
616 SetTexturePanelOkAction(panel
->texturePanel
, okNewTexture
, panel
);
618 SetTexturePanelPixmapPath(panel
->texturePanel
,
619 GetObjectForKey("PixmapPath"));
620 ShowTexturePanel(panel
->texturePanel
);
626 deleteTexture(WMWidget
*w
, void *data
)
628 _Panel
*panel
= (_Panel
*)data
;
630 TextureListItem
*titem
;
634 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
635 row
= WMGetListSelectedItemRow(panel
->texLs
);
636 item
= WMGetListItem(panel
->texLs
, row
);
637 titem
= (TextureListItem
*)item
->clientData
;
639 if (titem
->selectedFor
& (1 << section
)) {
640 TextureListItem
*titem2
;
642 panel
->textureIndex
[section
] = section
;
643 item
= WMGetListItem(panel
->texLs
, section
);
644 titem2
= (TextureListItem
*)item
->clientData
;
645 titem2
->selectedFor
|= 1 << section
;
649 free(titem
->texture
);
650 PLRelease(titem
->prop
);
652 if (remove(titem
->path
) < 0 && errno
!= ENOENT
) {
653 wsyserror("could not remove file %s", titem
->path
);
660 WMRemoveListItem(panel
->texLs
, row
);
661 WMSetButtonEnabled(panel
->delB
, False
);
668 extractTexture(WMWidget
*w
, void *data
)
670 _Panel
*panel
= (_Panel
*)data
;
673 WMScreen
*scr
= WMWidgetScreen(w
);
675 opanel
= WMGetOpenPanel(scr
);
676 WMSetFilePanelCanChooseDirectories(opanel
, False
);
677 WMSetFilePanelCanChooseFiles(opanel
, True
);
679 if (WMRunModalFilePanelForDirectory(opanel
, panel
->win
, wgethomedir(),
680 _("Select File"), NULL
)) {
681 path
= WMGetFilePanelFileName(opanel
);
684 OpenExtractPanelFor(panel
, path
);
694 changePage(WMWidget
*w
, void *data
)
696 _Panel
*panel
= (_Panel
*)data
;
699 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
701 WMSelectListItem(panel
->texLs
, panel
->textureIndex
[section
]);
703 WMSetListPosition(panel
->texLs
, panel
->textureIndex
[section
]
704 - WMGetListNumberOfRows(panel
->texLs
)/2);
710 textureClick(WMWidget
*w
, void *data
)
712 _Panel
*panel
= (_Panel
*)data
;
715 TextureListItem
*titem
;
717 i
= WMGetListSelectedItemRow(panel
->texLs
);
719 item
= WMGetListItem(panel
->texLs
, i
);
721 titem
= (TextureListItem
*)item
->clientData
;
723 if (titem
->current
) {
724 WMSetButtonEnabled(panel
->delB
, False
);
726 WMSetButtonEnabled(panel
->delB
, True
);
733 textureDoubleClick(WMWidget
*w
, void *data
)
735 _Panel
*panel
= (_Panel
*)data
;
738 TextureListItem
*titem
;
740 /* unselect old texture */
741 section
= WMGetPopUpButtonSelectedItem(panel
->secP
);
743 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[section
]);
744 titem
= (TextureListItem
*)item
->clientData
;
745 titem
->selectedFor
&= ~(1 << section
);
747 /* select new texture */
748 i
= WMGetListSelectedItemRow(panel
->texLs
);
750 item
= WMGetListItem(panel
->texLs
, i
);
752 titem
= (TextureListItem
*)item
->clientData
;
754 titem
->selectedFor
|= 1<<section
;
756 panel
->textureIndex
[section
] = i
;
758 WMRedisplayWidget(panel
->texLs
);
765 paintListItem(WMList
*lPtr
, int index
, Drawable d
, char *text
, int state
,
768 _Panel
*panel
= (_Panel
*)WMGetHangedData(lPtr
);
769 WMScreen
*scr
= WMWidgetScreen(lPtr
);
770 int width
, height
, x
, y
;
771 Display
*dpy
= WMScreenDisplay(scr
);
772 WMColor
*white
= WMWhiteColor(scr
);
774 WMColor
*black
= WMBlackColor(scr
);
775 TextureListItem
*titem
;
777 width
= rect
->size
.width
;
778 height
= rect
->size
.height
;
782 if (state
& WLDSSelected
)
783 XFillRectangle(dpy
, d
, WMColorGC(white
), x
, y
, width
, height
);
785 XClearArea(dpy
, d
, x
, y
, width
, height
, False
);
787 item
= WMGetListItem(lPtr
, index
);
788 titem
= (TextureListItem
*)item
->clientData
;
791 XCopyArea(dpy
, titem
->preview
, d
, WMColorGC(black
), 0, 0, TEXPREV_WIDTH
,
792 TEXPREV_HEIGHT
, x
+ 5, y
+ 5);
794 if ((1 << WMGetPopUpButtonSelectedItem(panel
->secP
)) & titem
->selectedFor
)
795 WMDrawPixmap(panel
->onLed
, d
, x
+ TEXPREV_WIDTH
+ 10, y
+ 6);
796 else if (titem
->selectedFor
)
797 WMDrawPixmap(panel
->offLed
, d
, x
+ TEXPREV_WIDTH
+ 10, y
+ 6);
799 WMDrawString(scr
, d
, WMColorGC(black
), panel
->boldFont
,
800 x
+ TEXPREV_WIDTH
+ 22, y
+ 2, titem
->title
,
801 strlen(titem
->title
));
803 WMDrawString(scr
, d
, WMColorGC(black
), panel
->smallFont
,
804 x
+ TEXPREV_WIDTH
+ 14, y
+ 18, titem
->texture
,
805 strlen(titem
->texture
));
808 WMReleaseColor(white
);
809 WMReleaseColor(black
);
815 loadRImage(WMScreen
*scr
, char *path
)
823 f
= fopen(path
, "r");
827 fscanf(f
, "%02x%02x%1x", &w
, &h
, &d
);
829 image
= RCreateImage(w
, h
, d
== 4);
830 for (i
= 0; i
< d
; i
++) {
831 fread(image
->data
[i
], 1, w
*h
, f
);
835 RConvertImage(WMScreenRContext(scr
), image
, &pixmap
);
836 RDestroyImage(image
);
844 fillTextureList(WMList
*lPtr
)
846 proplist_t textureList
;
848 WMUserDefaults
*udb
= WMGetStandardUserDefaults();
850 TextureListItem
*titem
;
851 WMScreen
*scr
= WMWidgetScreen(lPtr
);
853 textureList
= WMGetUDObjectForKey(udb
, "TextureList");
857 for (i
= 0; i
< PLGetNumberOfElements(textureList
); i
++) {
860 texture
= PLGetArrayElement(textureList
, i
);
862 titem
= wmalloc(sizeof(TextureListItem
));
863 memset(titem
, 0, sizeof(TextureListItem
));
865 titem
->title
= wstrdup(PLGetString(PLGetArrayElement(texture
, 0)));
866 titem
->prop
= PLRetain(PLGetArrayElement(texture
, 1));
867 titem
->texture
= PLGetDescription(titem
->prop
);
868 titem
->selectedFor
= 0;
869 titem
->path
= wstrdup(PLGetString(PLGetArrayElement(texture
, 2)));
872 titem
->preview
= loadRImage(scr
, titem
->path
);
873 if (!titem
->preview
) {
874 titem
->preview
= renderTexture(scr
, titem
->prop
, TEXPREV_WIDTH
,
875 TEXPREV_HEIGHT
, NULL
, 0);
877 item
= WMAddListItem(lPtr
, "");
878 item
->clientData
= titem
;
884 createPanel(Panel
*p
)
886 _Panel
*panel
= (_Panel
*)p
;
889 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
894 panel
->fprefix
= wstrappend(wusergnusteppath(), "/.AppInfo");
896 if (access(panel
->fprefix
, F_OK
)!=0) {
897 if (mkdir(panel
->fprefix
, 0755) < 0) {
898 wsyserror(panel
->fprefix
);
903 tmp
= wstrappend(panel
->fprefix
, "/WPrefs/");
904 free(panel
->fprefix
);
905 panel
->fprefix
= tmp
;
906 if (access(panel
->fprefix
, F_OK
)!=0) {
907 if (mkdir(panel
->fprefix
, 0755) < 0) {
908 wsyserror(panel
->fprefix
);
913 panel
->smallFont
= WMSystemFontOfSize(scr
, 10);
914 panel
->normalFont
= WMSystemFontOfSize(scr
, 12);
915 panel
->boldFont
= WMBoldSystemFontOfSize(scr
, 12);
917 panel
->onLed
= WMCreatePixmapFromXPMData(scr
, blueled_xpm
);
918 panel
->offLed
= WMCreatePixmapFromXPMData(scr
, blueled2_xpm
);
920 panel
->frame
= WMCreateFrame(panel
->win
);
921 WMResizeWidget(panel
->frame
, FRAME_WIDTH
, FRAME_HEIGHT
);
922 WMMoveWidget(panel
->frame
, FRAME_LEFT
, FRAME_TOP
);
925 panel
->prevL
= WMCreateLabel(panel
->frame
);
926 WMResizeWidget(panel
->prevL
, 260, 165);
927 WMMoveWidget(panel
->prevL
, 15, 10);
928 WMSetLabelImagePosition(panel
->prevL
, WIPImageOnly
);
930 panel
->secP
= WMCreatePopUpButton(panel
->frame
);
931 WMResizeWidget(panel
->secP
, 260, 20);
932 WMMoveWidget(panel
->secP
, 15, 180);
933 WMSetPopUpButtonSelectedItem(panel
->secP
, 0);
934 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Focused Window"));
935 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Unfocused Windows"));
936 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Focused Window's Owner"));
937 WMAddPopUpButtonItem(panel
->secP
, _("Titlebar of Menus"));
938 WMAddPopUpButtonItem(panel
->secP
, _("Menu Items"));
939 WMAddPopUpButtonItem(panel
->secP
, _("Icon Background"));
940 /* WMAddPopUpButtonItem(panel->secP, _("Workspace Backgrounds"));
942 WMSetPopUpButtonAction(panel
->secP
, changePage
, panel
);
945 font
= WMBoldSystemFontOfSize(scr
, 12);
947 panel
->texL
= WMCreateLabel(panel
->frame
);
948 WMResizeWidget(panel
->texL
, 225, 18);
949 WMMoveWidget(panel
->texL
, 285, 10);
950 WMSetLabelFont(panel
->texL
, font
);
951 WMSetLabelText(panel
->texL
, _("Textures"));
952 WMSetLabelRelief(panel
->texL
, WRSunken
);
953 WMSetLabelTextAlignment(panel
->texL
, WACenter
);
954 color
= WMDarkGrayColor(scr
);
955 WMSetWidgetBackgroundColor(panel
->texL
, color
);
956 WMReleaseColor(color
);
957 color
= WMWhiteColor(scr
);
958 WMSetLabelTextColor(panel
->texL
, color
);
959 WMReleaseColor(color
);
963 panel
->texLs
= WMCreateList(panel
->frame
);
964 WMResizeWidget(panel
->texLs
, 225, 144);
965 WMMoveWidget(panel
->texLs
, 285, 30);
966 WMSetListUserDrawItemHeight(panel
->texLs
, 35);
967 WMSetListUserDrawProc(panel
->texLs
, paintListItem
);
968 WMHangData(panel
->texLs
, panel
);
969 WMSetListAction(panel
->texLs
, textureClick
, panel
);
970 WMSetListDoubleAction(panel
->texLs
, textureDoubleClick
, panel
);
972 /* command buttons */
974 font
= WMSystemFontOfSize(scr
, 10);
977 panel
->newB
= WMCreateCommandButton(panel
->frame
);
978 WMResizeWidget(panel
->newB
, 56, 48);
979 WMMoveWidget(panel
->newB
, 285, 180);
980 WMSetButtonFont(panel
->newB
, font
);
981 WMSetButtonImagePosition(panel
->newB
, WIPAbove
);
982 WMSetButtonText(panel
->newB
, _("New"));
983 WMSetButtonAction(panel
->newB
, newTexture
, panel
);
984 SetButtonAlphaImage(scr
, panel
->newB
, TNEW_FILE
);
986 panel
->ripB
= WMCreateCommandButton(panel
->frame
);
987 WMResizeWidget(panel
->ripB
, 56, 48);
988 WMMoveWidget(panel
->ripB
, 341, 180);
989 WMSetButtonFont(panel
->ripB
, font
);
990 WMSetButtonImagePosition(panel
->ripB
, WIPAbove
);
991 WMSetButtonText(panel
->ripB
, _("Extract..."));
992 WMSetButtonAction(panel
->ripB
, extractTexture
, panel
);
993 SetButtonAlphaImage(scr
, panel
->ripB
, TEXTR_FILE
);
995 WMSetButtonEnabled(panel
->ripB
, False
);
997 panel
->editB
= WMCreateCommandButton(panel
->frame
);
998 WMResizeWidget(panel
->editB
, 56, 48);
999 WMMoveWidget(panel
->editB
, 397, 180);
1000 WMSetButtonFont(panel
->editB
, font
);
1001 WMSetButtonImagePosition(panel
->editB
, WIPAbove
);
1002 WMSetButtonText(panel
->editB
, _("Edit"));
1003 SetButtonAlphaImage(scr
, panel
->editB
, TEDIT_FILE
);
1004 WMSetButtonAction(panel
->editB
, editTexture
, panel
);
1006 panel
->delB
= WMCreateCommandButton(panel
->frame
);
1007 WMResizeWidget(panel
->delB
, 56, 48);
1008 WMMoveWidget(panel
->delB
, 453, 180);
1009 WMSetButtonFont(panel
->delB
, font
);
1010 WMSetButtonImagePosition(panel
->delB
, WIPAbove
);
1011 WMSetButtonText(panel
->delB
, _("Delete"));
1012 SetButtonAlphaImage(scr
, panel
->delB
, TDEL_FILE
);
1013 WMSetButtonEnabled(panel
->delB
, False
);
1014 WMSetButtonAction(panel
->delB
, deleteTexture
, panel
);
1016 WMReleaseFont(font
);
1020 WMRealizeWidget(panel
->frame
);
1021 WMMapSubwidgets(panel
->frame
);
1023 WMSetPopUpButtonSelectedItem(panel
->secP
, 0);
1027 fillTextureList(panel
->texLs
);
1029 panel
->texturePanel
= CreateTexturePanel(panel
->win
);
1035 setupTextureFor(WMList
*list
, char *key
, char *defValue
, char *title
,
1039 TextureListItem
*titem
;
1041 titem
= wmalloc(sizeof(TextureListItem
));
1042 memset(titem
, 0, sizeof(TextureListItem
));
1044 titem
->title
= wstrdup(title
);
1045 titem
->prop
= GetObjectForKey(key
);
1047 titem
->prop
= PLGetProplistWithDescription(defValue
);
1049 PLRetain(titem
->prop
);
1051 titem
->texture
= PLGetDescription((proplist_t
)titem
->prop
);
1053 titem
->selectedFor
= 1<<index
;
1055 titem
->preview
= renderTexture(WMWidgetScreen(list
), titem
->prop
,
1056 TEXPREV_WIDTH
, TEXPREV_HEIGHT
, NULL
, 0);
1058 item
= WMAddListItem(list
, "");
1059 item
->clientData
= titem
;
1065 showData(_Panel
*panel
)
1069 setupTextureFor(panel
->texLs
, "FTitleBack", "(solid, black)",
1071 panel
->textureIndex
[i
] = i
++;
1073 setupTextureFor(panel
->texLs
, "UTitleBack", "(solid, gray)",
1075 panel
->textureIndex
[i
] = i
++;
1077 setupTextureFor(panel
->texLs
, "PTitleBack", "(solid, \"#616161\")",
1078 "[Owner of Focused]", i
);
1079 panel
->textureIndex
[i
] = i
++;
1081 setupTextureFor(panel
->texLs
, "MenuTitleBack", "(solid, black)",
1083 panel
->textureIndex
[i
] = i
++;
1085 setupTextureFor(panel
->texLs
, "MenuTextBack", "(solid, gray)",
1087 panel
->textureIndex
[i
] = i
++;
1089 setupTextureFor(panel
->texLs
, "IconBack", "(solid, gray)", "[Icon]", i
);
1090 panel
->textureIndex
[i
] = i
++;
1092 setupTextureFor(panel->texLs, "WorkspaceBack", "(solid, black)",
1094 panel->textureIndex[i] = i++;
1097 updatePreviewBox(panel
, EVERYTHING
);
1103 storeData(_Panel
*panel
)
1105 proplist_t textureList
;
1108 TextureListItem
*titem
;
1110 WMUserDefaults
*udb
= WMGetStandardUserDefaults();
1112 textureList
= PLMakeArrayFromElements(NULL
, NULL
);
1114 /* store list of textures */
1115 for (i
= 6; i
< WMGetListNumberOfRows(panel
->texLs
); i
++) {
1116 item
= WMGetListItem(panel
->texLs
, i
);
1117 titem
= (TextureListItem
*)item
->clientData
;
1119 texture
= PLMakeArrayFromElements(PLMakeString(titem
->title
),
1120 PLRetain(titem
->prop
),
1121 PLMakeString(titem
->path
),
1124 PLAppendArrayElement(textureList
, texture
);
1127 WMSetUDObjectForKey(udb
, textureList
, "TextureList");
1128 PLRelease(textureList
);
1130 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[0]);
1131 titem
= (TextureListItem
*)item
->clientData
;
1132 SetObjectForKey(titem
->prop
, "FTitleBack");
1134 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[1]);
1135 titem
= (TextureListItem
*)item
->clientData
;
1136 SetObjectForKey(titem
->prop
, "UTitleBack");
1138 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[2]);
1139 titem
= (TextureListItem
*)item
->clientData
;
1140 SetObjectForKey(titem
->prop
, "PTitleBack");
1142 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[3]);
1143 titem
= (TextureListItem
*)item
->clientData
;
1144 SetObjectForKey(titem
->prop
, "MenuTitleBack");
1146 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[4]);
1147 titem
= (TextureListItem
*)item
->clientData
;
1148 SetObjectForKey(titem
->prop
, "MenuTextBack");
1150 item
= WMGetListItem(panel
->texLs
, panel
->textureIndex
[5]);
1151 titem
= (TextureListItem
*)item
->clientData
;
1152 SetObjectForKey(titem
->prop
, "IconBack");
1159 InitAppearance(WMScreen
*scr
, WMWindow
*win
)
1163 panel
= wmalloc(sizeof(_Panel
));
1164 memset(panel
, 0, sizeof(_Panel
));
1166 panel
->sectionName
= _("Appearance Preferences");
1170 panel
->callbacks
.createWidgets
= createPanel
;
1171 panel
->callbacks
.updateDomain
= storeData
;
1173 AddSection(panel
, ICON_FILE
);
1180 /****************************************************************************/
1184 typedef struct ExtractPanel
{
1197 OpenExtractPanelFor(_Panel
*panel
, char *path
)
1199 ExtractPanel
*epanel
;
1202 WMScreen
*scr
= WMWidgetScreen(panel
->win
);
1204 epanel
= wmalloc(sizeof(ExtractPanel
));
1205 epanel
->win
= WMCreatePanelWithStyleForWindow(panel
->win
, "extract",
1207 |WMClosableWindowMask
);
1208 WMResizeWidget(epanel
->win
, 245, 250);
1209 WMSetWindowTitle(epanel
->win
, _("Extract Texture"));
1211 epanel
->label
= WMCreateLabel(epanel
->win
);
1212 WMResizeWidget(epanel
->label
, 225, 18);
1213 WMMoveWidget(epanel
->label
, 10, 10);
1214 WMSetLabelTextAlignment(epanel
->label
, WACenter
);
1215 WMSetLabelRelief(epanel
->label
, WRSunken
);
1217 color
= WMDarkGrayColor(scr
);
1218 WMSetWidgetBackgroundColor(epanel
->label
, color
);
1219 WMReleaseColor(color
);
1221 color
= WMWhiteColor(scr
);
1222 WMSetLabelTextColor(epanel
->label
, color
);
1223 WMReleaseColor(color
);
1225 font
= WMBoldSystemFontOfSize(scr
, 12);
1226 WMSetLabelFont(epanel
->label
, font
);
1227 WMReleaseFont(font
);
1229 WMSetLabelText(epanel
->label
, _("Textures"));
1231 epanel
->list
= WMCreateList(epanel
->win
);
1232 WMResizeWidget(epanel
->list
, 225, 165);
1233 WMMoveWidget(epanel
->list
, 10, 30);
1237 epanel
->closeB
= WMCreateCommandButton(epanel
->win
);
1238 WMResizeWidget(epanel
->closeB
, 74, 24);
1239 WMMoveWidget(epanel
->closeB
, 165, 215);
1240 WMSetButtonText(epanel
->closeB
, _("Close"));
1242 epanel
->extrB
= WMCreateCommandButton(epanel
->win
);
1243 WMResizeWidget(epanel
->extrB
, 74, 24);
1244 WMMoveWidget(epanel
->extrB
, 80, 215);
1245 WMSetButtonText(epanel
->extrB
, _("Extract"));
1247 WMMapSubwidgets(epanel
->win
);
1250 /* take textures from file */
1254 WMRealizeWidget(epanel
->win
);
1256 WMMapWidget(epanel
->win
);