Subversion Repositories Kolibri OS

Rev

Rev 9896 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
9896 akron1 1
(*
9898 akron1 2
    Copyright 2016, 2018, 2020-2023 Anton Krotov
9896 akron1 3
 
4
    This file is part of fb2read.
5
 
6
    fb2read is free software: you can redistribute it and/or modify
7
    it under the terms of the GNU General Public License as published by
8
    the Free Software Foundation, either version 3 of the License, or
9
    (at your option) any later version.
10
 
11
    fb2read is distributed in the hope that it will be useful,
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
    GNU General Public License for more details.
15
 
16
    You should have received a copy of the GNU General Public License
17
    along with fb2read. If not, see .
18
*)
19
 
20
MODULE Settings;
21
 
9898 akron1 22
IMPORT SU := SysUtils, W := Window, C := ColorDlg, DOM, S := Strings, K := KOSAPI, File,
9896 akron1 23
       Font, KF := kfonts, OD := OpenDlg, LibImg, G := Graph, Ini, box_lib, sys := SYSTEM;
24
 
25
 
26
CONST
27
 
28
  DAY                   = 19;
29
  NIGHT                 = 20;
30
  APPLY                 = 21;
31
  CANCEL                = 22;
32
  BACK_PICTURE          = 23;
33
 
34
  C100                  = 100;
35
 
36
  CHANGE_BACK_COLOR     = DOM.BACK_COLOR     + C100;
37
  CHANGE_TEXT_COLOR     = DOM.TEXT_COLOR     + C100;
38
  CHANGE_ITALIC_COLOR   = DOM.ITALIC_COLOR   + C100;
39
  CHANGE_LINK_COLOR     = DOM.LINK_COLOR     + C100;
40
  CHANGE_VISITED_COLOR  = DOM.VISITED_COLOR  + C100;
41
 
42
  MAX_LRpc              =  25;
43
  MAX_Top               = 120;
44
  MAX_PARAGRAPH         = 120;
45
  MAX_EPIGRAPH          = 120;
46
  MAX_CInt              =  25;
47
  MAX_InterLin          =  50;
48
  MAX_FONT_SIZE         =  40;
49
  MIN_FONT_SIZE         =  10;
50
 
51
  BtnH*     =       25;
52
  BoxW      =       50;
53
  TextLeft  =       20;
54
  BtnW*     =       80;
55
 
56
 
57
VAR
58
 
9898 akron1 59
  Window   : W.tWindow;
9896 akron1 60
  PID      : INTEGER;
61
  Slot     : INTEGER;
62
  Color    : C.Dialog;
63
  Data     : DOM.TSettings;
64
 
65
  String   : S.STRING;
66
 
67
  sb       : ARRAY 7 OF box_lib.scrollbar;
68
  check1   : box_lib.checkbox;
69
  check2   : box_lib.checkbox;
70
  OpenPict : OD.Dialog;
71
  picture  : INTEGER;
9898 akron1 72
  picture_fsize : INTEGER;
9896 akron1 73
 
74
  picture_path : S.STRING;
75
 
76
 
77
PROCEDURE Close*;
78
VAR pid: INTEGER;
79
BEGIN
80
  IF PID # 0 THEN
81
    pid := PID;
82
    PID := 0;
9898 akron1 83
    IF (picture # Data.Picture) & (picture # 0) THEN
84
    	picture := K.free(picture);
85
    	picture_fsize := 0
9896 akron1 86
    END;
87
    C.Destroy(Color);
88
    OD.Destroy(OpenPict);
89
    SU.TerminateThreadId(pid)
90
  END
91
END Close;
92
 
93
 
94
PROCEDURE ClearWindow;
95
BEGIN
9898 akron1 96
  SU.Box(0, 0, Window.width - 10, Window.height - SU.SkinHeight() - 5, SU.winColor, SU.winColor)
9896 akron1 97
END ClearWindow;
98
 
99
 
100
PROCEDURE OutText (x, y: INTEGER; text: ARRAY OF CHAR);
101
BEGIN
102
	SU.OutText(x, y, text, LENGTH(text), SU.textColor)
103
END OutText;
104
 
105
 
106
PROCEDURE PlusMinus(x, y, max, min: INTEGER; _sb: box_lib.scrollbar);
107
VAR range, Y: INTEGER;
108
    sysfont: ARRAY 20 OF CHAR;
109
BEGIN
110
  sysfont := "System font only";
111
  S.IntToString(_sb.position + min, String);
112
  IF _sb = sb[0] THEN
113
    Y := y - (BtnH + 10) * 2 + 26;
114
    SU.Box(TextLeft + 230, Y, SU.FontW * LENGTH(sysfont), SU.FontH, SU.winColor, SU.winColor);
115
    IF ~KF.Enabled(Font.KFont, _sb.position + min) THEN
116
      OutText(TextLeft + 230, Y, sysfont)
117
    END
118
  END;
119
  SU.Box(x + 25, y + 6, SU.FontW * 4, SU.FontH, SU.winColor, SU.winColor);
120
  OutText(x + 25  + (35 - SU.FontW * LENGTH(String)) DIV 2, y + 6, String);
121
  x := x + 60 - 25;
122
  range := max - min;
123
  _sb := box_lib.kolibri_scrollbar(_sb, (x + 30) * 65536 + 196, y * 65536 + 22 + 2, 22, range + range DIV 10, range DIV 10,
124
  		_sb.position, SU.lightColor, SU.btnColor, 0, 2)
125
END PlusMinus;
126
 
127
 
128
PROCEDURE Buttons;
129
 
130
VAR
131
 
132
  X, Y, TextY       : INTEGER;
133
  WinW, WinH, SkinH : INTEGER;
134
  i                 : INTEGER;
9898 akron1 135
  Rect              : W.tRect;
9896 akron1 136
 
137
BEGIN
9898 akron1 138
  Rect.left := 10;
139
  Rect.top := 85;
140
  Rect.width := 210;
141
  Rect.height := 255;
142
  SU.Box(Rect.left, Rect.top, Rect.width, Rect.height, SU.winColor, SU.borderColor);
143
  SU.Box(Rect.left + 230, Rect.top, Rect.width + 170, Rect.height, SU.winColor, SU.borderColor);
9896 akron1 144
 
9898 akron1 145
  WinW := Window.width;
146
  WinH := Window.height;
9896 akron1 147
  SkinH := SU.SkinHeight();
148
  X := 125;
149
  Y := 10;
150
  IF picture = 0 THEN
151
    OutText(TextLeft + 20, Y + 6, "back picture (none)")
152
  ELSE
153
    OutText(TextLeft + 20, Y + 6, "back picture")
154
  END;
155
  SU.CreateButton(BACK_PICTURE, X + 75, Y, 30, BtnH, SU.btnColor, "...");
156
 
157
  Y := 10 + (BtnH + 10);
158
 
159
  OutText(TextLeft + 20, Y + 6, "two columns");
160
 
161
  Y := Y + (BtnH + 10) * 2 - 20;
162
 
163
  TextY := Y;
164
  FOR i := 0 TO 4 DO
165
      SU.Box(X, Y, BoxW, BtnH, Data.Colors[i], 0);
166
      SU.CreateButton(i + C100, X + BoxW + 5, Y, 30, BtnH, SU.btnColor, "...");
167
      Y := Y + BtnH + 10;
168
  END;
169
 
170
  X := 20; Y := TextY + 6;
171
 
172
  OutText(TextLeft, Y, "back");     OutText(TextLeft + 230, Y, "font size");      PlusMinus(TextLeft + 330, Y - 6, MAX_FONT_SIZE, MIN_FONT_SIZE, sb[0]); Y := Y + BtnH + 10;
173
  OutText(TextLeft, Y, "text");     OutText(TextLeft + 230, Y, "left & right %"); PlusMinus(TextLeft + 330, Y - 6, MAX_LRpc,                  0, sb[1]); Y := Y + BtnH + 10;
174
  OutText(TextLeft, Y, "italic");   OutText(TextLeft + 230, Y, "col. spacing %"); PlusMinus(TextLeft + 330, Y - 6, MAX_CInt,                  0, sb[2]); Y := Y + BtnH + 10;
175
  OutText(TextLeft, Y, "link");     OutText(TextLeft + 230, Y, "top & bottom");   PlusMinus(TextLeft + 330, Y - 6, MAX_Top,                   0, sb[3]); Y := Y + BtnH + 10;
176
  OutText(TextLeft, Y, "visited");  OutText(TextLeft + 230, Y, "paragraph");      PlusMinus(TextLeft + 330, Y - 6, MAX_PARAGRAPH,             0, sb[4]); Y := Y + BtnH + 10;
177
 
178
  OutText(TextLeft + 230, Y, "epigraph");     PlusMinus(TextLeft + 330, Y - 6, MAX_EPIGRAPH,  0, sb[5]); Y := Y + BtnH + 10;
179
  OutText(TextLeft + 230, Y, "line spacing"); PlusMinus(TextLeft + 330, Y - 6, MAX_InterLin,  0, sb[6]);
180
 
181
  Y := Y - 6;
182
 
9898 akron1 183
  SU.CreateButton(DAY,   (Rect.width - (BtnW + 5 + BtnW)) DIV 2 + Rect.left,                       Y, 80, BtnH, SU.btnColor, "Day"   );
184
  SU.CreateButton(NIGHT, (Rect.width - (BtnW + 5 + BtnW)) DIV 2 + Rect.left + 5 + BtnW,            Y, 80, BtnH, SU.btnColor, "Night" );
9896 akron1 185
 
186
  SU.CreateButton(APPLY,  (WinW - (BtnW + 5 + BtnW) - 10) DIV 2,            WinH - BtnH - SkinH - 10, 80, BtnH, SU.btnColor, "Apply" );
187
  SU.CreateButton(CANCEL, (WinW - (BtnW + 5 + BtnW) - 10) DIV 2 + 5 + BtnW, WinH - BtnH - SkinH - 10, 80, BtnH, SU.btnColor, "Cancel");
188
 
189
  FOR i := 0 TO LEN(sb) - 1 DO
190
    box_lib.scrollbar_h_draw(sb[i])
191
  END;
192
  box_lib.check_box_draw2(check1);
193
  box_lib.check_box_draw2(check2);
194
 
195
END Buttons;
196
 
197
 
198
PROCEDURE DrawWindow;
199
BEGIN
200
  SU.GetSystemColors;
201
  SU.WindowRedrawStatus(1);
9898 akron1 202
  SU.DefineAndDrawWindow(Window.left, Window.top, Window.width, Window.height,
203
        SU.winColor, LSL(ORD({0, 1}), 4) + 4, Window.caption);
9896 akron1 204
  Buttons;
205
  SU.WindowRedrawStatus(2)
206
END DrawWindow;
207
 
208
 
209
PROCEDURE SelColor(Color: C.Dialog; Default: INTEGER): INTEGER;
210
VAR Result: INTEGER;
211
BEGIN
212
  Result := Default;
213
  IF Color # NIL THEN
214
    C.Show(Color);
215
    WHILE Color.status = 2 DO
216
      SU.Pause(20)
217
    END;
218
    IF Color.status = 1 THEN
219
      Result := Color.color
220
    END
221
  END
222
  RETURN Result
223
END SelColor;
224
 
225
 
226
PROCEDURE ChangeColor(idx: INTEGER);
227
BEGIN
228
  Data.Colors[idx] := SelColor(Color, Data.Colors[idx])
229
END ChangeColor;
230
 
231
 
232
PROCEDURE Day;
233
BEGIN
234
  Data.Colors[DOM.BACK_COLOR]     := 0F0F0C7H;
235
  Data.Colors[DOM.TEXT_COLOR]     := 0000000H;
236
  Data.Colors[DOM.ITALIC_COLOR]   := 0505050H;
237
  Data.Colors[DOM.LINK_COLOR]     := 00000FFH;
238
  Data.Colors[DOM.VISITED_COLOR]  := 0800080H;
239
  Data.Colors[DOM.CLICKED_COLOR]  := 0FF0000H;
240
END Day;
241
 
242
 
243
PROCEDURE Night;
244
BEGIN
245
  Data.Colors[DOM.BACK_COLOR]     := 0000000H;
246
  Data.Colors[DOM.TEXT_COLOR]     := 0AFAFAFH;
247
  Data.Colors[DOM.ITALIC_COLOR]   := 07F7F7FH;
248
  Data.Colors[DOM.LINK_COLOR]     := 000A0D0H;
249
  Data.Colors[DOM.VISITED_COLOR]  := 0C000C0H;
250
  Data.Colors[DOM.CLICKED_COLOR]  := 0FF0000H;
251
END Night;
252
 
253
 
254
PROCEDURE Apply;
255
BEGIN
256
  Data.FontSize     := sb[0].position + MIN_FONT_SIZE;
257
  Data.PADDING.LRpc := sb[1].position;
258
  Data.PADDING.CInt := sb[2].position;
259
  Data.PADDING.Top  := sb[3].position;
260
  Data.PARAGRAPH    := sb[4].position;
261
  Data.EPIGRAPH     := sb[5].position;
262
  Data.InterLin     := sb[6].position;
9898 akron1 263
  IF (picture # 0) & (picture # Data.Picture) THEN
264
  	IF Data.Picture # 0 THEN
265
    	Data.Picture := K.free(Data.Picture)
9896 akron1 266
    END;
267
    Data.Picture := picture;
9898 akron1 268
    Data.picture_fsize := picture_fsize;
9896 akron1 269
    Ini.SetPicturePath(picture_path)
270
  END;
271
  picture := 0;
9898 akron1 272
  picture_fsize := 0;
9896 akron1 273
  DOM.SetSettings(Data);
274
  Close
275
END Apply;
276
 
277
 
278
PROCEDURE LoadPicture(file_path: S.STRING);
9898 akron1 279
VAR fsize, img: INTEGER;
9896 akron1 280
BEGIN
9898 akron1 281
  img := File.Load(file_path, fsize);
9896 akron1 282
  IF img # 0 THEN
283
    IF (picture # 0) & (picture # Data.Picture) THEN
9898 akron1 284
      picture := K.free(picture)
9896 akron1 285
    END;
286
    picture := img;
9898 akron1 287
    picture_fsize := fsize;
9896 akron1 288
    picture_path := file_path
289
  END
290
END LoadPicture;
291
 
292
 
293
PROCEDURE OpenPicture;
294
BEGIN
295
  IF OpenPict # NIL THEN
296
    OD.Show(OpenPict, 500, 400);
297
    WHILE OpenPict.status = 2 DO
298
      SU.Pause(30)
299
    END;
300
    IF OpenPict.status = 1 THEN
301
      COPY(OpenPict.FilePath, picture_path);
302
      LoadPicture(picture_path)
303
    END
304
  END
305
END OpenPicture;
306
 
307
 
308
PROCEDURE ButtonClick;
309
BEGIN
310
  CASE SU.GetButtonCode() OF
311
  |0                      :
312
  |1                      : Close
313
  |BACK_PICTURE           : OpenPicture
314
  |DAY                    : Day
315
  |NIGHT                  : Night
316
  |APPLY                  : Apply
317
  |CANCEL                 : Close
318
 
319
  |CHANGE_BACK_COLOR      : ChangeColor(DOM.BACK_COLOR)
320
  |CHANGE_TEXT_COLOR      : ChangeColor(DOM.TEXT_COLOR)
321
  |CHANGE_ITALIC_COLOR    : ChangeColor(DOM.ITALIC_COLOR)
322
  |CHANGE_LINK_COLOR      : ChangeColor(DOM.LINK_COLOR)
323
  |CHANGE_VISITED_COLOR   : ChangeColor(DOM.VISITED_COLOR)
324
 
325
  END;
326
  ClearWindow;
327
  Buttons
328
END ButtonClick;
329
 
330
 
331
PROCEDURE Default*;
332
BEGIN
333
  Day;
334
  Data.FontSize     := 16;
335
  Data.TwoCol       := FALSE;
336
  Data.PADDING.Top  := 15;
337
  Data.PADDING.LRpc := 3;
338
  Data.PADDING.CInt := 6;
339
  Data.PARAGRAPH    := 30;
340
  Data.EPIGRAPH     := 100;
341
  Data.InterLin     := 0;
342
  Data.Picture      := picture;
9898 akron1 343
  Data.picture_fsize := picture_fsize;
9896 akron1 344
  DOM.SetSettings(Data)
345
END Default;
346
 
347
 
348
PROCEDURE Show;
349
VAR i, scrWidth, scrHeight: INTEGER;
350
BEGIN
351
  SU.SetEventsMask({0, 2, 5, 30, 31});
9898 akron1 352
  W.init(Window, 0, 0, 640, 420, "Settings");
9896 akron1 353
  SU.GetScreenSize(scrWidth, scrHeight);
9898 akron1 354
  Window.left := (scrWidth - Window.width) DIV 2;
355
  Window.top  := (scrHeight - Window.height) DIV 2;
9896 akron1 356
  Color := C.Create(DrawWindow);
357
  OpenPict := OD.Create(DrawWindow, 0, "/sys", "JPG|PNG|BMP|GIF");
358
  Data := DOM.Settings;
359
  picture := Data.Picture;
9898 akron1 360
  picture_fsize := Data.picture_fsize;
9896 akron1 361
  DrawWindow;
362
  WHILE TRUE DO
363
    CASE SU.WaitForEvent() OF
364
    |1 : DrawWindow
365
    |3 : ButtonClick
366
    |6 : FOR i := 0 TO LEN(sb) - 1 DO
367
           box_lib.scrollbar_h_mouse(sb[i])
368
         END;
369
         box_lib.check_box_mouse2(check1);
370
         box_lib.check_box_mouse2(check2);
371
         PlusMinus(TextLeft + 330, sb[0].y_h DIV 65536, MAX_FONT_SIZE,  MIN_FONT_SIZE, sb[0]);
372
         PlusMinus(TextLeft + 330, sb[1].y_h DIV 65536, MAX_LRpc,                   0, sb[1]);
373
         PlusMinus(TextLeft + 330, sb[2].y_h DIV 65536, MAX_CInt,                   0, sb[2]);
374
         PlusMinus(TextLeft + 330, sb[3].y_h DIV 65536, MAX_Top,                    0, sb[3]);
375
         PlusMinus(TextLeft + 330, sb[4].y_h DIV 65536, MAX_PARAGRAPH,              0, sb[4]);
376
         PlusMinus(TextLeft + 330, sb[5].y_h DIV 65536, MAX_EPIGRAPH,               0, sb[5]);
377
         PlusMinus(TextLeft + 330, sb[6].y_h DIV 65536, MAX_InterLin,               0, sb[6]);
378
         Data.TwoCol := box_lib.check_box_get_value(check1);
379
         Data.b_pict := box_lib.check_box_get_value(check2);
380
    END
381
  END
382
END Show;
383
 
384
 
385
PROCEDURE Open*;
386
BEGIN
387
  IF PID = 0 THEN
388
    Data := DOM.Settings;
389
    box_lib.check_box_set_value(check1, Data.TwoCol);
390
    box_lib.check_box_set_value(check2, Data.b_pict);
391
    PID := SU.NewThread(Show, DOM.Stack);
392
    Slot := SU.GetThreadSlot(PID);
393
    sb[0].position := Data.FontSize - MIN_FONT_SIZE;
394
    sb[1].position := Data.PADDING.LRpc;
395
    sb[2].position := Data.PADDING.CInt;
396
    sb[3].position := Data.PADDING.Top;
397
    sb[4].position := Data.PARAGRAPH;
398
    sb[5].position := Data.EPIGRAPH;
399
    sb[6].position := Data.InterLin;
400
  ELSE
401
    SU.FocusWindow(Slot)
402
  END
403
END Open;
404
 
405
 
406
PROCEDURE main;
407
VAR i: INTEGER;
408
    bpicture, twocol: ARRAY 20 OF CHAR;
409
BEGIN
410
  PID := 0;
411
  FOR i := 0 TO LEN(sb) - 1 DO
412
    sb[i] := box_lib.kolibri_new_scrollbar(10 * 65536 + 200, 10 * 65536 + 22 + 2, 22, 15, 10, 0, 0, 0, 0, 2)
413
  END;
414
  bpicture := "back picture";
415
  twocol := "two columns";
416
  check2 := box_lib.kolibri_new_check_box(TextLeft, 10 + 5,               16, 16, sys.SADR(""), LENGTH(bpicture) * 8 + 5);
417
  check1 := box_lib.kolibri_new_check_box(TextLeft, 10 + (BtnH + 10) + 5, 16, 16, sys.SADR(""), LENGTH(twocol)  * 8 + 5);
418
  picture := 0;
9898 akron1 419
  picture_fsize := 0;
9896 akron1 420
  IF Ini.Picture # "" THEN
421
    LoadPicture(Ini.Picture)
422
  END
423
END main;
424
 
425
 
426
BEGIN
427
  main
428
END Settings.