* Bug 15089 fixed: getcolor GUI cleared and used the current figure
[scilab.git] / scilab / modules / graphics / macros / getcolor.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // Copyright (C) 2017 - Samuel GOUGEON
4 //
5 // Copyright (C) 2012 - 2016 - Scilab Enterprises
6 //
7 // This file is hereby licensed under the terms of the GNU GPL v2.0,
8 // pursuant to article 5.3.4 of the CeCILL v.2.1.
9 // This file was originally licensed under the terms of the CeCILL v2.1,
10 // and continues to be available under such terms.
11 // For more information, see the COPYING file which you should have received
12 // along with this program.
13
14 function [c] = getcolor(Title,cini)
15
16     [lhs,rhs] = argn(0)
17
18     if rhs==0 then
19         Title = "";
20         cini = 1;
21     elseif rhs==1 then
22         if type(Title)~=10 then
23             msg = gettext("%s: Wrong type for input argument #%d: string expected.\n")
24             error(msprintf(msg, "getcolor", 1));
25         end
26         if size(Title, "*")~=1 then
27             msg = gettext("%s: Wrong size for input argument #%d: string expected.\n")
28             error(msprintf(msg, "getcolor", 1));
29         end
30         cini = 1;
31     elseif rhs==2 then
32         if type(Title)~=10 then
33             msg = gettext("%s: Wrong type for input argument #%d: string expected.\n")
34             error(msprintf(msg, "getcolor", 1));
35         end
36         if size(Title, "*")~=1 then
37             msg = gettext("%s: Wrong size for input argument #%d: string expected.\n")
38             error(msprintf(msg, "getcolor", 1));
39         end
40         if type(cini)~=1 then
41             msg = gettext("%s: Wrong type for input argument #%d: A real expected.\n")
42             error(msprintf(msg, "getcolor", 2));
43         end
44         if size(cini, "*")~=1 then
45             msg = gettext("%s: Wrong size for input argument #%d: A real expected.\n")
46             error(msprintf(msg, "getcolor", 2));
47         end
48     else
49         msg = gettext("%s: Wrong number of input arguments: %d to %d expected.\n")
50         error(msprintf(msg, "getcolor", 2, 0, 2));
51     end
52
53     if winsid()~=[] then
54         curFig = gcf();
55         cmap = curFig.color_map;
56         curwin = curFig.figure_id;
57     else
58         cmap = []
59         curwin = []
60     end;
61
62     // create the window for getcolor
63     fig = scf();
64     fig.visible = "off";
65     win = fig.figure_id;
66
67     sdf;    // quite agressive. Not sure it is actually useful
68     sda;    // same remark
69     if cmap~=[] then
70         fig.color_map = cmap;
71     else
72         cmap = fig.color_map;
73     end;
74
75     N = size(cmap,1);
76     wdim = [1,1];
77     r = wdim(1)/wdim(2);
78     n = round(sqrt(N/r));
79     m = int(n*r);
80     H = m*45; // These numbers set the size of the getcolor window
81     W = n*45;
82     fig.figure_size = [H,W];
83
84     toolbar(win, "off")
85
86     delmenu(win, gettext("&File"))
87     delmenu(win, gettext("&Tools"))
88     delmenu(win, gettext("&Edit"))
89     delmenu(win, gettext("&?"))
90
91     dx = wdim(1)/m;
92     dy = wdim(2)/n;
93     x = -dx;
94     y = wdim(2);
95     R = [0;0;dx*0.95;dy*0.95];
96     rects = [];
97     for k = 1:N
98         if modulo(k,n)==1 then
99             x = x+dx;
100             y = wdim(2);
101         end;
102         rects = [rects,R+[x;y;0;0]];
103         y = y-dy;
104     end;
105
106     if Title~="" then
107         xsetech([-1/8,0,1+1/6,1+1/6-1/8],[0,0,wdim(1),wdim(2)]);
108     else
109         xsetech([-1/8,-1/8,1+1/6,1+1/6],[0,0,wdim(1),wdim(2)]);
110     end;
111     // rectangles with the colors
112     xrects(rects,1:N);
113     // frame around the colors
114     r = m*n-N;
115     ddx = 0.05*dx;
116     ddy = 0.05*dy;
117     if r==0 then
118         xpoly([-ddx,1,1,-ddx],[0,0,1+ddy,1+ddy],"lines",1);
119     else
120         xpoly([-ddx,1-1/n,1-1/n,1,1,-ddx],[0,0,r/m,r/m,1+ddy,1+ddy],"lines",1);
121     end;
122
123     // title
124     if Title~="" then
125         xtitle(Title);
126         t = gce();
127         t.font_size = 4;
128         t.font_style = 6;
129     end;
130
131     k1 = min(max(cini,1),N);
132     xrects(rects(eye(),k1),-k1);
133     e = gce();
134     rector = e.children;
135     rector.thickness = 4;
136     rector.foreground = color(255*(1-cmap(k1,1)),255*(1-cmap(k1,2)),255*(1-cmap(k1,3)));
137
138     //add a menu and its callback
139     done = %f;
140     Ok = "execstr("+gettext("Ok")+"_"+string(win)+"(1))";
141     Cancel = "execstr("+gettext("Cancel")+"_"+string(win)+"(1))";
142
143     addmenu(win, gettext("Ok"));
144     addmenu(win, gettext("Cancel"));
145     fig.visible = "on";
146
147     c_i = 0;
148     c = cini;
149     windowCloseButton = -1000;
150     while %t
151         str = "";
152         [c_i,cx,cy,cw,str] = xclick();
153         if (c_i == windowCloseButton) then
154             // window has been closed
155             k = [];
156             c = [];
157             break;
158         elseif (c_i== -2) then
159             if str==Ok then k = k1; c = k; break;end;
160             if str==Cancel then k = []; c = []; break;end;
161         end;
162
163         mc = int(cx/dx)+1;
164         nc = n-int(cy/dy);
165         k = (mc-1)*n+nc;
166         if or(c_i==[0,3])&k<=N&k>0 then
167             if k1~=0 then
168                 move(rector,[rects(1,k)-rects(1,k1),rects(2,k)-rects(2,k1)]);
169                 rector.foreground = color(255*(1-cmap(k,1)),255*(1-cmap(k,2)),255*(1-cmap(k,3)));
170             end;
171             k1 = k;
172             name = rgb2name(cmap(k,eye())*255);
173             txt = msprintf("RGB(%d)=[%d %d %d]",k,cmap(k,1:3)*255);
174             if name~=[]
175                 txt = txt + " : """ + name(1) + """"
176             end
177             fig.info_message = txt
178         end
179     end
180
181     if (c_i <> windowCloseButton) then
182         delete(fig);
183     end
184
185     if curwin~=[] then
186         scf(curwin);
187     end;
188
189
190 endfunction
191