Subversion Repositories Kolibri OS

Rev

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

  1. (*
  2.     Copyright 2016, 2018, 2020-2023 Anton Krotov
  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 <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE Settings;
  21.  
  22. IMPORT SU := SysUtils, W := Window, C := ColorDlg, DOM, S := Strings, K := KOSAPI, File,
  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.  
  59.   Window   : W.tWindow;
  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;
  72.   picture_fsize : INTEGER;
  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;
  83.     IF (picture # Data.Picture) & (picture # 0) THEN
  84.         picture := K.free(picture);
  85.         picture_fsize := 0
  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
  96.   SU.Box(0, 0, Window.width - 10, Window.height - SU.SkinHeight() - 5, SU.winColor, SU.winColor)
  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;
  135.   Rect              : W.tRect;
  136.  
  137. BEGIN
  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);
  144.  
  145.   WinW := Window.width;
  146.   WinH := Window.height;
  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.  
  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" );
  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);
  202.   SU.DefineAndDrawWindow(Window.left, Window.top, Window.width, Window.height,
  203.         SU.winColor, LSL(ORD({0, 1}), 4) + 4, Window.caption);
  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;
  263.   IF (picture # 0) & (picture # Data.Picture) THEN
  264.         IF Data.Picture # 0 THEN
  265.         Data.Picture := K.free(Data.Picture)
  266.     END;
  267.     Data.Picture := picture;
  268.     Data.picture_fsize := picture_fsize;
  269.     Ini.SetPicturePath(picture_path)
  270.   END;
  271.   picture := 0;
  272.   picture_fsize := 0;
  273.   DOM.SetSettings(Data);
  274.   Close
  275. END Apply;
  276.  
  277.  
  278. PROCEDURE LoadPicture(file_path: S.STRING);
  279. VAR fsize, img: INTEGER;
  280. BEGIN
  281.   img := File.Load(file_path, fsize);
  282.   IF img # 0 THEN
  283.     IF (picture # 0) & (picture # Data.Picture) THEN
  284.       picture := K.free(picture)
  285.     END;
  286.     picture := img;
  287.     picture_fsize := fsize;
  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;
  343.   Data.picture_fsize := picture_fsize;
  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});
  352.   W.init(Window, 0, 0, 640, 420, "Settings");
  353.   SU.GetScreenSize(scrWidth, scrHeight);
  354.   Window.left := (scrWidth - Window.width) DIV 2;
  355.   Window.top  := (scrHeight - Window.height) DIV 2;
  356.   Color := C.Create(DrawWindow);
  357.   OpenPict := OD.Create(DrawWindow, 0, "/sys", "JPG|PNG|BMP|GIF");
  358.   Data := DOM.Settings;
  359.   picture := Data.Picture;
  360.   picture_fsize := Data.picture_fsize;
  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;
  419.   picture_fsize := 0;
  420.   IF Ini.Picture # "" THEN
  421.     LoadPicture(Ini.Picture)
  422.   END
  423. END main;
  424.  
  425.  
  426. BEGIN
  427.   main
  428. END Settings.
  429.