home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2002 April / pcpro0402.iso / essentials / graphics / Gimp / gimp-src-20001226.exe / src / gimp / plug-ins / gimpressionist / presets.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-31  |  19.1 KB  |  678 lines

  1. #ifdef HAVE_CONFIG_H
  2. #include "config.h"
  3. #else
  4. #define HAVE_DIRENT_H
  5. #define HAVE_UNISTD_H
  6. #endif
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <gtk/gtk.h>
  11. #ifdef HAVE_UNISTD_H
  12. #include <unistd.h>
  13. #endif
  14. #include <ctype.h>
  15. #include "gimpressionist.h"
  16. #include "ppmtool.h"
  17. #include <libgimp/stdplugins-intl.h>
  18.  
  19. GtkWidget *presetnameentry = NULL;
  20. GtkWidget *presetsavebutton = NULL;
  21. GtkWidget *presetlist = NULL;
  22. GtkWidget *presetdesctext = NULL;
  23. GtkWidget *presetdesclabel = NULL;
  24.  
  25. char presetdesc[4096] = "";
  26.  
  27. char *factory_defaults = "<Factory defaults>";
  28.  
  29. void presetsrefresh(void)
  30. {
  31.   GtkWidget *list = presetlist;
  32.   GtkWidget *tmpw;
  33.   int n = g_list_length(GTK_LIST(list)->children);
  34.  
  35.   gtk_list_clear_items(GTK_LIST(list), 0, n);
  36.  
  37.   tmpw = gtk_list_item_new_with_label(factory_defaults);
  38.   gtk_container_add(GTK_CONTAINER(list), tmpw);
  39.   gtk_widget_show(tmpw);
  40.   
  41.   readdirintolist("Presets", list, NULL);
  42. }
  43.  
  44. #define PRESETMAGIC "Preset"
  45.  
  46. int loadoldpreset(char *fname)
  47. {
  48.   FILE *f;
  49.   int len;
  50.  
  51.   f = fopen(fname, "rb");
  52.   if(!f) {
  53.     fprintf(stderr, "Error opening file \"%s\" for reading!%c\n", fname, 7);
  54.     return -1;
  55.   }
  56.   len = fread(&pcvals, 1, sizeof(pcvals), f);
  57.   fclose(f);
  58.  
  59.   return 0;
  60. }
  61.  
  62. void chop(char *buffer)
  63. {
  64.   while(strlen(buffer) && buffer[strlen(buffer)-1] <= ' ')
  65.     buffer[strlen(buffer)-1] = '\0';
  66. }
  67.  
  68. unsigned int hexval(char c)
  69. {
  70.   c = tolower(c);
  71.   if((c >= 'a') && (c <= 'f')) return c - 'a' + 10;
  72.   if((c >= '0') && (c <= '9')) return c - '0';
  73.   return 0;
  74. }
  75.  
  76. char *parsergbstring(char *s)
  77. {
  78.   static char col[3];
  79.   col[0] = (hexval(s[0]) << 4) | hexval(s[1]);
  80.   col[1] = (hexval(s[2]) << 4) | hexval(s[3]);
  81.   col[2] = (hexval(s[4]) << 4) | hexval(s[5]);
  82.   return col;
  83. }
  84.  
  85. void setorientvector(char *str)
  86. {
  87.   /* num,x,y,dir,dx,dy,str,type */
  88.   char *tmps = str;
  89.   int n;
  90.  
  91.   n = atoi(tmps);
  92.  
  93.   if(!(tmps = strchr(tmps, ','))) return;
  94.   pcvals.orientvector[n].x = atof(++tmps);
  95.  
  96.   if(!(tmps = strchr(tmps, ','))) return;
  97.   pcvals.orientvector[n].y = atof(++tmps);
  98.   
  99.   if(!(tmps = strchr(tmps, ','))) return;
  100.   pcvals.orientvector[n].dir = atof(++tmps);
  101.  
  102.   if(!(tmps = strchr(tmps, ','))) return;
  103.   pcvals.orientvector[n].dx = atof(++tmps);
  104.  
  105.   if(!(tmps = strchr(tmps, ','))) return;
  106.   pcvals.orientvector[n].dy = atof(++tmps);
  107.   
  108.   if(!(tmps = strchr(tmps, ','))) return;
  109.   pcvals.orientvector[n].str = atof(++tmps);
  110.   
  111.   if(!(tmps = strchr(tmps, ','))) return;
  112.   pcvals.orientvector[n].type = atoi(++tmps);
  113.   
  114. }
  115.  
  116. void setsizevector(char *str)
  117. {
  118.   /* num,x,y,siz,str,type */
  119.   char *tmps = str;
  120.   int n;
  121.  
  122.   n = atoi(tmps);
  123.  
  124.   if(!(tmps = strchr(tmps, ','))) return;
  125.   pcvals.sizevector[n].x = atof(++tmps);
  126.  
  127.   if(!(tmps = strchr(tmps, ','))) return;
  128.   pcvals.sizevector[n].y = atof(++tmps);
  129.   
  130.   if(!(tmps = strchr(tmps, ','))) return;
  131.   pcvals.sizevector[n].siz = atof(++tmps);
  132.  
  133.   if(!(tmps = strchr(tmps, ','))) return;
  134.   pcvals.sizevector[n].str = atof(++tmps);
  135.   
  136. }
  137.  
  138. void parsedesc(char *str, char *d)
  139. {
  140.   while(*str) {
  141.     if(*str == '\\') {
  142.       *d = (str[1] - '0') * 100;
  143.       *d += (str[2] - '0') * 10;
  144.       *d += (str[3] - '0');
  145.       str += 3;
  146.     } else *d = *str;
  147.     str++;
  148.     d++;
  149.   }
  150.   *d = '\0';
  151. }
  152.  
  153. void setval(char *key, char *val)
  154. {
  155.   if(!strcmp(key, "desc"))
  156.     parsedesc(val, presetdesc);
  157.   else if(!strcmp(key, "orientnum"))
  158.     pcvals.orientnum = atoi(val);
  159.   else if(!strcmp(key, "orientfirst"))
  160.     pcvals.orientfirst = atof(val);
  161.   else if(!strcmp(key, "orientlast"))
  162.     pcvals.orientlast = atof(val);
  163.   else if(!strcmp(key, "orienttype"))
  164.    pcvals.orienttype = atoi(val);
  165.  
  166.   else if(!strcmp(key, "sizenum"))
  167.     pcvals.sizenum = atoi(val);
  168.   else if(!strcmp(key, "sizefirst"))
  169.     pcvals.sizefirst = atof(val);
  170.   else if(!strcmp(key, "sizelast"))
  171.     pcvals.sizelast = atof(val);
  172.   else if(!strcmp(key, "sizetype"))
  173.    pcvals.sizetype = atoi(val);
  174.  
  175.   else if(!strcmp(key, "brushrelief"))
  176.     pcvals.brushrelief = atof(val);
  177.   else if(!strcmp(key, "brushscale")) {
  178.     /* For compatibility */
  179.     pcvals.sizenum = 1;
  180.     pcvals.sizefirst = pcvals.sizelast = atof(val);
  181.   }
  182.   else if(!strcmp(key, "brushdensity"))
  183.     pcvals.brushdensity = atof(val);
  184.   else if(!strcmp(key, "brushgamma"))
  185.     pcvals.brushgamma = atof(val);
  186.   else if(!strcmp(key, "brushaspect"))
  187.     pcvals.brushaspect = atof(val);
  188.  
  189.   else if(!strcmp(key, "generalbgtype"))
  190.     pcvals.generalbgtype = atoi(val);
  191.   else if(!strcmp(key, "generaldarkedge"))
  192.     pcvals.generaldarkedge = atof(val);
  193.   else if(!strcmp(key, "generalpaintedges"))
  194.     pcvals.generalpaintedges = atoi(val);
  195.   else if(!strcmp(key, "generaltileable"))
  196.     pcvals.generaltileable = atoi(val);
  197.   else if(!strcmp(key, "generaldropshadow"))
  198.     pcvals.generaldropshadow = atoi(val);
  199.   else if(!strcmp(key, "generalshadowdarkness"))
  200.     pcvals.generalshadowdarkness = atof(val);
  201.   else if(!strcmp(key, "generalshadowdepth"))
  202.     pcvals.generalshadowdepth = atoi(val);
  203.   else if(!strcmp(key, "generalshadowblur"))
  204.     pcvals.generalshadowblur = atoi(val);
  205.   else if(!strcmp(key, "devthresh"))
  206.     pcvals.devthresh = atof(val);
  207.  
  208.   else if(!strcmp(key, "paperrelief"))
  209.     pcvals.paperrelief = atof(val);
  210.   else if(!strcmp(key, "paperscale"))
  211.     pcvals.paperscale = atof(val);
  212.   else if(!strcmp(key, "paperinvert"))
  213.     pcvals.paperinvert = atoi(val);
  214.   else if(!strcmp(key, "paperoverlay"))
  215.     pcvals.paperoverlay = atoi(val);
  216.  
  217.   else if(!strcmp(key, "placetype"))
  218.     pcvals.placetype = atoi(val);
  219.   else if(!strcmp(key, "placecenter"))
  220.     pcvals.placecenter = atoi(val);
  221.  
  222.   else if(!strcmp(key, "selectedbrush"))
  223.     strncpy(pcvals.selectedbrush, val, 99);
  224.   else if(!strcmp(key, "selectedpaper"))
  225.     strncpy(pcvals.selectedpaper, val, 99);
  226.  
  227.   else if(!strcmp(key, "color"))
  228.     memcpy(pcvals.color, parsergbstring(val), 3);
  229.   
  230.   else if(!strcmp(key, "numorientvector"))
  231.     pcvals.numorientvector = atoi(val);
  232.   else if(!strcmp(key, "orientvector"))
  233.     setorientvector(val);
  234.   else if(!strcmp(key, "orientangoff"))
  235.    pcvals.orientangoff = atof(val);
  236.   else if(!strcmp(key, "orientstrexp"))
  237.    pcvals.orientstrexp = atof(val);
  238.   else if(!strcmp(key, "orientvoronoi"))
  239.    pcvals.orientvoronoi = atoi(val);
  240.  
  241.   else if(!strcmp(key, "numsizevector"))
  242.     pcvals.numsizevector = atoi(val);
  243.   else if(!strcmp(key, "sizevector"))
  244.     setsizevector(val);
  245.   else if(!strcmp(key, "sizestrexp"))
  246.    pcvals.sizestrexp = atof(val);
  247.   else if(!strcmp(key, "sizevoronoi"))
  248.    pcvals.sizevoronoi = atoi(val);
  249.  
  250.   else if(!strcmp(key, "colortype"))
  251.     pcvals.colortype = atoi(val);
  252.   else if(!strcmp(key, "colornoise"))
  253.     pcvals.colornoise = atof(val);
  254. }
  255.  
  256. int loadpreset(char *fn)
  257. {
  258.   char line[1024] = "";
  259.   FILE *f;
  260.  
  261.   f = fopen(fn, "rt");
  262.   if(!f) {
  263.     fprintf(stderr, "Error opening file \"%s\" for reading!\n", fn);
  264.     return -1;
  265.   }
  266.   fgets(line,10,f);
  267.   if(strncmp(line,PRESETMAGIC,4)) {
  268.     fclose(f);
  269.     return loadoldpreset(fn);
  270.   }
  271.   memcpy(&pcvals, &defaultpcvals, sizeof(pcvals));
  272.   while(!feof(f)) {
  273.     char *tmps;
  274.     if(!fgets(line,1024,f)) break;
  275.     chop(line);
  276.     tmps = strchr(line, '=');
  277.     if(!tmps) continue;
  278.     *tmps = '\0';
  279.     tmps++;
  280.     setval(line, tmps);
  281.   }
  282.   fclose(f);
  283.   return 0;
  284. }
  285.  
  286. void applypreset(void)
  287. {
  288.   GList *h = GTK_LIST(presetlist)->selection;
  289.   GtkWidget *tmpw = h->data;
  290.   char *l;
  291.   static char fname[200];
  292.  
  293.   gtk_label_get(GTK_LABEL(GTK_BIN(tmpw)->child), &l);
  294.  
  295.   /* Restore defaults, in case of old/short Preset file */
  296.   memcpy(&pcvals, &defaultpcvals, sizeof(pcvals));
  297.   presetdesc[0] = '\0';
  298.  
  299.   if(!strcmp(l, factory_defaults)) {
  300.     restorevals();
  301.     return;
  302.   }
  303.  
  304.   sprintf(fname, "Presets/%s", l);
  305.   strcpy(fname, findfile(fname));
  306.  
  307.   loadpreset(fname);
  308.  
  309.   restorevals();
  310. }
  311.  
  312. void deletepreset(void)
  313. {
  314.   GList *h = GTK_LIST(presetlist)->selection;
  315.   GtkWidget *tmpw = h->data;
  316.   char *l;
  317.   static char fname[200];
  318.  
  319.   gtk_label_get(GTK_LABEL(GTK_BIN(tmpw)->child), &l);
  320.  
  321.   sprintf(fname, "Presets/%s", l);
  322.   strcpy(fname, findfile(fname));
  323.  
  324.   unlink(fname);
  325.   presetsrefresh();
  326. }
  327.  
  328. void savepreset(GtkWidget *wg, GtkWidget *p);
  329.  
  330. void presetdesccallback(GtkWidget *widget, gpointer data)
  331. {
  332.   guchar *s;
  333.   char *d, *str;
  334.   str = gtk_editable_get_chars(GTK_EDITABLE (widget),0,-1);
  335.   s = str;
  336.   d = presetdesc;
  337.   while(*s) {
  338.     if((*s < ' ') || (*s == '\\')) { sprintf(d, "\\%03d", *s); d += 4; }
  339.     else { *d = *s; d++; }
  340.     s++;
  341.   }
  342.   *d = '\0';
  343.   g_free(str);
  344. }
  345.  
  346. void oksavepreset(GtkWidget *wg, GtkWidget *p)
  347. {
  348.   if(wg) gtk_widget_destroy(wg);
  349.   savepreset(NULL,NULL);
  350. }
  351.  
  352. void create_savepreset(void)
  353. {
  354.   static GtkWidget *window = NULL;
  355.   GtkWidget *button;
  356.   GtkWidget *box, *label;
  357.   GtkWidget *text;
  358.  
  359.   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  360.     
  361.   gtk_signal_connect_object (GTK_OBJECT (window), "delete_event",
  362.                  GTK_SIGNAL_FUNC (gtk_widget_destroy),
  363.                  GTK_OBJECT(window));
  364.     
  365.   gtk_signal_connect_object(GTK_OBJECT(window), "destroy",
  366.                 GTK_SIGNAL_FUNC (gtk_widget_destroy),
  367.                 GTK_OBJECT(window));
  368.  
  369.   gtk_container_set_border_width (GTK_CONTAINER (window), 5);
  370.  
  371.   box = gtk_vbox_new(FALSE,5);
  372.  
  373.   label = gtk_label_new( _("Description:"));
  374.   gtk_box_pack_start(GTK_BOX(box),label,FALSE,FALSE,0);
  375.   gtk_widget_show (label);
  376.  
  377.   presetdesctext = text = gtk_text_new (NULL, NULL);
  378.   gtk_text_set_editable (GTK_TEXT (text), TRUE);
  379.   gtk_box_pack_start(GTK_BOX(box),text,FALSE,FALSE,0);
  380.   gtk_widget_show (text);
  381.  
  382.   gtk_text_set_word_wrap(GTK_TEXT(text), 0);
  383.   gtk_text_set_line_wrap(GTK_TEXT(text), 0);
  384.  
  385.   gtk_text_insert (GTK_TEXT (text), NULL, NULL,
  386.            NULL, presetdesc, strlen(presetdesc));
  387.  
  388.   gtk_signal_connect (GTK_OBJECT (text), "changed",
  389.               (GtkSignalFunc) presetdesccallback,
  390.               NULL);
  391.  
  392.   button = gtk_button_new_with_label ( _("OK"));
  393.   gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
  394.                  GTK_SIGNAL_FUNC (oksavepreset),
  395.                  GTK_OBJECT(window));
  396.   gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0);
  397.   gtk_widget_show (button);
  398.  
  399.  
  400.   button = gtk_button_new_with_label ( _("Cancel"));
  401.   gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
  402.                  GTK_SIGNAL_FUNC (gtk_widget_destroy),
  403.                  GTK_OBJECT(window));
  404.   gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0);
  405.   gtk_widget_show (button);
  406.  
  407.     
  408.   gtk_container_add (GTK_CONTAINER (window), box);
  409.     
  410.   gtk_widget_show (box);
  411.   gtk_widget_show (window);
  412.  
  413. }
  414.  
  415. void savepreset(GtkWidget *wg, GtkWidget *p)
  416. {
  417.   char *l;
  418.   static char fname[200];
  419.   FILE *f;
  420.   GList *thispath;
  421.   int i;
  422.  
  423.   l = gtk_entry_get_text(GTK_ENTRY(presetnameentry));
  424.   thispath = parsepath();
  425.   storevals();
  426.  
  427.   if(!thispath) {
  428.     fprintf(stderr, "Internal error: (savepreset) thispath == NULL");
  429.     return;
  430.   }
  431.  
  432.   sprintf(fname, "%s/Presets/%s", (char *)thispath->data, l);
  433.  
  434.   f = fopen(fname, "wt");
  435.   if(!f) {
  436.     fprintf(stderr, "Error opening file \"%s\" for writing!%c\n", fname, 7);
  437.     return;
  438.   }
  439.   fprintf(f, "%s\n", PRESETMAGIC);
  440.   fprintf(f, "desc=%s\n", presetdesc);
  441.   fprintf(f, "orientnum=%d\n", pcvals.orientnum);
  442.   fprintf(f, "orientfirst=%f\n", pcvals.orientfirst);
  443.   fprintf(f, "orientlast=%f\n", pcvals.orientlast);
  444.   fprintf(f, "orienttype=%d\n", pcvals.orienttype);
  445.  
  446.   fprintf(f, "sizenum=%d\n", pcvals.sizenum);
  447.   fprintf(f, "sizefirst=%f\n", pcvals.sizefirst);
  448.   fprintf(f, "sizelast=%f\n", pcvals.sizelast);
  449.   fprintf(f, "sizetype=%d\n", pcvals.sizetype);
  450.  
  451.   fprintf(f, "brushrelief=%f\n", pcvals.brushrelief);
  452.   fprintf(f, "brushdensity=%f\n", pcvals.brushdensity);
  453.   fprintf(f, "brushgamma=%f\n", pcvals.brushgamma);
  454.   fprintf(f, "brushaspect=%f\n", pcvals.brushaspect);
  455.  
  456.   fprintf(f, "generalbgtype=%d\n", pcvals.generalbgtype);
  457.   fprintf(f, "generaldarkedge=%f\n", pcvals.generaldarkedge);
  458.   fprintf(f, "generalpaintedges=%d\n", pcvals.generalpaintedges);
  459.   fprintf(f, "generaltileable=%d\n", pcvals.generaltileable);
  460.   fprintf(f, "generaldropshadow=%d\n", pcvals.generaldropshadow);
  461.   fprintf(f, "generalshadowdarkness=%f\n", pcvals.generalshadowdarkness);
  462.   fprintf(f, "generalshadowdepth=%d\n", pcvals.generalshadowdepth);
  463.   fprintf(f, "generalshadowblur=%d\n", pcvals.generalshadowblur);
  464.   fprintf(f, "devthresh=%f\n", pcvals.devthresh);
  465.  
  466.   fprintf(f, "paperrelief=%f\n", pcvals.paperrelief);
  467.   fprintf(f, "paperscale=%f\n", pcvals.paperscale);
  468.   fprintf(f, "paperinvert=%d\n", pcvals.paperinvert);
  469.   fprintf(f, "paperoverlay=%d\n", pcvals.paperoverlay);
  470.  
  471.   fprintf(f, "selectedbrush=%s\n", pcvals.selectedbrush);
  472.   fprintf(f, "selectedpaper=%s\n", pcvals.selectedpaper);
  473.  
  474.   fprintf(f, "color=%02x%02x%02x\n", pcvals.color[0],
  475.       pcvals.color[1], pcvals.color[2]);
  476.   
  477.   fprintf(f, "placetype=%d\n", pcvals.placetype);
  478.   fprintf(f, "placecenter=%d\n", pcvals.placecenter);
  479.  
  480.   fprintf(f, "numorientvector=%d\n", pcvals.numorientvector);
  481.   for(i = 0; i < pcvals.numorientvector; i++) {
  482.     fprintf(f, "orientvector=%d,%f,%f,%f,%f,%f,%f,%d\n", i,
  483.         pcvals.orientvector[i].x,
  484.         pcvals.orientvector[i].y,
  485.         pcvals.orientvector[i].dir,
  486.         pcvals.orientvector[i].dx,
  487.         pcvals.orientvector[i].dy,
  488.         pcvals.orientvector[i].str,
  489.         pcvals.orientvector[i].type);
  490.   }
  491.   fprintf(f, "orientangoff=%f\n", pcvals.orientangoff);
  492.   fprintf(f, "orientstrexp=%f\n", pcvals.orientstrexp);
  493.   fprintf(f, "orientvoronoi=%d\n", pcvals.orientvoronoi);
  494.  
  495.   fprintf(f, "numsizevector=%d\n", pcvals.numsizevector);
  496.   for(i = 0; i < pcvals.numsizevector; i++) {
  497.     fprintf(f, "sizevector=%d,%f,%f,%f,%f\n", i,
  498.         pcvals.sizevector[i].x,
  499.         pcvals.sizevector[i].y,
  500.         pcvals.sizevector[i].siz,
  501.         pcvals.sizevector[i].str);
  502.   }
  503.   fprintf(f, "sizestrexp=%f\n", pcvals.sizestrexp);
  504.   fprintf(f, "sizevoronoi=%d\n", pcvals.sizevoronoi);
  505.  
  506.   fprintf(f, "colortype=%d\n", pcvals.colortype);
  507.   fprintf(f, "colornoise=%f\n", pcvals.colornoise);
  508.  
  509.   fclose(f);
  510.   presetsrefresh();
  511.   reselect(presetlist, fname);
  512. }
  513.  
  514. void readdesc(char *fn)
  515. {
  516.   char *tmp, fname[200];
  517.   FILE *f;
  518.   
  519.   sprintf(fname, "Presets/%s", fn);
  520.   tmp = findfile(fname);
  521.   if(!tmp) {
  522.     if(presetdesclabel)
  523.       gtk_label_set_text(GTK_LABEL(presetdesclabel), "");
  524.     return; 
  525.   }
  526.   strcpy(fname, tmp);
  527.  
  528.   f = fopen(fname, "rt");
  529.   if(f) { 
  530.     char line[4096];
  531.     char tmplabel[4096];
  532.     while(!feof(f)) {
  533.       fgets(line, 4095, f);
  534.       if(!strncmp(line, "desc=", 5)) {
  535.     parsedesc(line+5, tmplabel);
  536.     gtk_label_set_text(GTK_LABEL(presetdesclabel), tmplabel);
  537.     fclose(f);
  538.     return;
  539.       }
  540.     }
  541.     fclose(f);
  542.   }
  543.   gtk_label_set_text(GTK_LABEL(presetdesclabel), "");
  544.   return; 
  545. }
  546.  
  547. void selectpreset(GtkWidget *wg, GtkWidget *p)
  548. {
  549.   GList *h = GTK_LIST(p)->selection;
  550.   GtkWidget *tmpw;
  551.   char *l;
  552.  
  553.   if(!h) return;
  554.   tmpw = h->data;
  555.   if(!tmpw) return;
  556.  
  557.   gtk_label_get(GTK_LABEL(GTK_BIN(tmpw)->child), &l);
  558.   if(strcmp(l, factory_defaults))
  559.     gtk_entry_set_text(GTK_ENTRY(presetnameentry), l);
  560.  
  561.   readdesc(l);
  562. }
  563.  
  564. void create_presetpage(GtkNotebook *notebook)
  565. {
  566.   GtkWidget *box1, *thispage, *box2;
  567.   GtkWidget *labelbox, *menubox;
  568.   GtkWidget *scrolled_win, *list;
  569.   GtkWidget *tmpw;
  570.  
  571.   labelbox = gtk_hbox_new (FALSE, 0);
  572.   tmpw = gtk_label_new (_("Presets"));
  573.   gtk_box_pack_start(GTK_BOX(labelbox), tmpw, FALSE, FALSE, 0);
  574.   gtk_widget_show_all(labelbox);
  575.  
  576.   menubox = gtk_hbox_new (FALSE, 0);
  577.   tmpw = gtk_label_new ( _("Presets"));
  578.   gtk_box_pack_start(GTK_BOX(menubox), tmpw, FALSE, FALSE, 0);
  579.   gtk_widget_show_all(menubox);
  580.  
  581.   presetlist = list = gtk_list_new ();
  582.  
  583.   thispage = gtk_vbox_new(FALSE, 0);
  584.   gtk_container_set_border_width (GTK_CONTAINER (thispage), 5);
  585.   gtk_widget_show(thispage);
  586.  
  587.   box1 = gtk_hbox_new (FALSE, 0);
  588.   gtk_box_pack_start(GTK_BOX(thispage), box1, FALSE, FALSE, 0);
  589.   gtk_widget_show (box1);
  590.  
  591.   presetnameentry = tmpw = gtk_entry_new();
  592.   gtk_box_pack_start (GTK_BOX (box1), tmpw, FALSE, FALSE, 0);
  593.   gtk_widget_set_usize(tmpw, 150, -1);
  594.   gtk_widget_show(tmpw);
  595.  
  596.   presetsavebutton = tmpw = gtk_button_new_with_label( _("Save current"));
  597.   gtk_box_pack_start(GTK_BOX(box1), tmpw,FALSE,FALSE,5);
  598.   gtk_widget_show (tmpw);
  599.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  600.               GTK_SIGNAL_FUNC(create_savepreset),
  601.               NULL);
  602.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Save the current settings to the specified file"), NULL);
  603.  
  604.   box1 = gtk_hbox_new (FALSE, 0);
  605.   gtk_box_pack_start(GTK_BOX(thispage), box1, TRUE, TRUE, 0);
  606.   gtk_widget_show (box1);
  607.  
  608.   scrolled_win = gtk_scrolled_window_new (NULL, NULL);
  609.   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
  610.                   GTK_POLICY_AUTOMATIC, 
  611.                   GTK_POLICY_AUTOMATIC);
  612.   gtk_box_pack_start (GTK_BOX (box1), scrolled_win, FALSE, FALSE, 0);
  613.   gtk_widget_show (scrolled_win);
  614.   gtk_widget_set_usize(scrolled_win, 150,-1);
  615.  
  616.   /* list = gtk_list_new (); */ /* Moved up */
  617.   gtk_list_set_selection_mode (GTK_LIST (list), GTK_SELECTION_BROWSE);
  618. #if GTK_MINOR_VERSION > 0
  619.   gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), list);
  620. #else
  621.   gtk_container_add (GTK_CONTAINER (scrolled_win), list);
  622. #endif
  623.   gtk_widget_show (list);
  624.  
  625.   gtk_signal_connect (GTK_OBJECT(list), "selection_changed",
  626.                       GTK_SIGNAL_FUNC(selectpreset),
  627.                       list);
  628.  
  629.   tmpw = gtk_list_item_new_with_label(factory_defaults);
  630.   gtk_container_add(GTK_CONTAINER(list), tmpw);
  631.   gtk_widget_show(tmpw);
  632.  
  633.   readdirintolist("Presets", list, NULL);
  634.  
  635.   box2 = gtk_vbox_new (FALSE, 0);
  636.   gtk_box_pack_start(GTK_BOX(box1), box2,FALSE,FALSE,5);
  637.   gtk_widget_show (box2);
  638.   /* gtk_container_set_border_width (GTK_CONTAINER (box2), 5); */
  639.  
  640.   tmpw = gtk_button_new_with_label( _("Apply"));
  641.   gtk_box_pack_start(GTK_BOX(box2), tmpw,FALSE,FALSE,0);
  642.   gtk_widget_show (tmpw);
  643.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  644.               GTK_SIGNAL_FUNC(applypreset),
  645.               NULL);
  646.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Reads the selected Preset into memory"), NULL);
  647.  
  648.   tmpw = gtk_button_new_with_label( _("Delete"));
  649.   gtk_box_pack_start(GTK_BOX(box2), tmpw, FALSE, FALSE,0);
  650.   gtk_widget_show (tmpw);
  651.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  652.               GTK_SIGNAL_FUNC(deletepreset),
  653.               NULL);
  654.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Deletes the selected Preset"), NULL);
  655.  
  656.   tmpw = gtk_button_new_with_label( _("Refresh"));
  657.   gtk_box_pack_start(GTK_BOX(box2), tmpw, FALSE, FALSE,0);
  658.   gtk_widget_show (tmpw);
  659.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  660.               GTK_SIGNAL_FUNC(presetsrefresh),
  661.               NULL);
  662.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Reread the directory of Presets"), NULL);
  663.  
  664.   presetdesclabel = tmpw = gtk_label_new( _("(Desc)"));
  665.   gtk_box_pack_start(GTK_BOX(box2), tmpw, FALSE, FALSE,0);
  666.   gtk_widget_show(tmpw);
  667.  
  668.  
  669.   tmpw = gtk_label_new( _("\nIf you come up with some nice Presets,\n\
  670. (or Brushes and Papers for that matter)\n\
  671. feel free to send them to me <vidar@prosalg.no>\n\
  672. for inclusion into the next release!\n"));
  673.   gtk_box_pack_start(GTK_BOX(thispage), tmpw, FALSE, FALSE, 0);
  674.   gtk_widget_show(tmpw);
  675.  
  676.   gtk_notebook_append_page_menu (notebook, thispage, labelbox, menubox);
  677. }
  678.