Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2016, 2018, 2020-2022 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,
  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.  
  73.   picture_path : S.STRING;
  74.  
  75.  
  76. PROCEDURE Close*;
  77. VAR pid: INTEGER;
  78. BEGIN
  79.   IF PID # 0 THEN
  80.     pid := PID;
  81.     PID := 0;
  82.     IF (picture # 0) & (picture # Data.Picture) THEN
  83.       LibImg.img_destroy(picture)
  84.     END;
  85.     C.Destroy(Color);
  86.     OD.Destroy(OpenPict);
  87.     SU.TerminateThreadId(pid)
  88.   END
  89. END Close;
  90.  
  91.  
  92. PROCEDURE ClearWindow;
  93. BEGIN
  94.   SU.Box(0, 0, Window.Width - 10, Window.Height - SU.SkinHeight() - 5, SU.winColor, SU.winColor)
  95. END ClearWindow;
  96.  
  97.  
  98. PROCEDURE OutText (x, y: INTEGER; text: ARRAY OF CHAR);
  99. BEGIN
  100.         SU.OutText(x, y, text, LENGTH(text), SU.textColor)
  101. END OutText;
  102.  
  103.  
  104. PROCEDURE PlusMinus(x, y, max, min: INTEGER; _sb: box_lib.scrollbar);
  105. VAR range, Y: INTEGER;
  106.     sysfont: ARRAY 20 OF CHAR;
  107. BEGIN
  108.   sysfont := "System font only";
  109.   S.IntToString(_sb.position + min, String);
  110.   IF _sb = sb[0] THEN
  111.     Y := y - (BtnH + 10) * 2 + 26;
  112.     SU.Box(TextLeft + 230, Y, SU.FontW * LENGTH(sysfont), SU.FontH, SU.winColor, SU.winColor);
  113.     IF ~KF.Enabled(Font.KFont, _sb.position + min) THEN
  114.       OutText(TextLeft + 230, Y, sysfont)
  115.     END
  116.   END;
  117.   SU.Box(x + 25, y + 6, SU.FontW * 4, SU.FontH, SU.winColor, SU.winColor);
  118.   OutText(x + 25  + (35 - SU.FontW * LENGTH(String)) DIV 2, y + 6, String);
  119.   x := x + 60 - 25;
  120.   range := max - min;
  121.   _sb := box_lib.kolibri_scrollbar(_sb, (x + 30) * 65536 + 196, y * 65536 + 22 + 2, 22, range + range DIV 10, range DIV 10,
  122.                 _sb.position, SU.lightColor, SU.btnColor, 0, 2)
  123. END PlusMinus;
  124.  
  125.  
  126. PROCEDURE Buttons;
  127.  
  128. VAR
  129.  
  130.   X, Y, TextY       : INTEGER;
  131.   WinW, WinH, SkinH : INTEGER;
  132.   i                 : INTEGER;
  133.   Rect              : W.TRect;
  134.  
  135. BEGIN
  136.   Rect.Left := 10;
  137.   Rect.Top := 85;
  138.   Rect.Width := 210;
  139.   Rect.Height := 255;
  140.   SU.Box(Rect.Left, Rect.Top, Rect.Width, Rect.Height, SU.winColor, SU.borderColor);
  141.   SU.Box(Rect.Left + 230, Rect.Top, Rect.Width + 170, Rect.Height, SU.winColor, SU.borderColor);
  142.  
  143.   WinW := Window.Width;
  144.   WinH := Window.Height;
  145.   SkinH := SU.SkinHeight();
  146.   X := 125;
  147.   Y := 10;
  148.   IF picture = 0 THEN
  149.     OutText(TextLeft + 20, Y + 6, "back picture (none)")
  150.   ELSE
  151.     OutText(TextLeft + 20, Y + 6, "back picture")
  152.   END;
  153.   SU.CreateButton(BACK_PICTURE, X + 75, Y, 30, BtnH, SU.btnColor, "...");
  154.  
  155.   Y := 10 + (BtnH + 10);
  156.  
  157.   OutText(TextLeft + 20, Y + 6, "two columns");
  158.  
  159.   Y := Y + (BtnH + 10) * 2 - 20;
  160.  
  161.   TextY := Y;
  162.   FOR i := 0 TO 4 DO
  163.       SU.Box(X, Y, BoxW, BtnH, Data.Colors[i], 0);
  164.       SU.CreateButton(i + C100, X + BoxW + 5, Y, 30, BtnH, SU.btnColor, "...");
  165.       Y := Y + BtnH + 10;
  166.   END;
  167.  
  168.   X := 20; Y := TextY + 6;
  169.  
  170.   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;
  171.   OutText(TextLeft, Y, "text");     OutText(TextLeft + 230, Y, "left & right %"); PlusMinus(TextLeft + 330, Y - 6, MAX_LRpc,                  0, sb[1]); Y := Y + BtnH + 10;
  172.   OutText(TextLeft, Y, "italic");   OutText(TextLeft + 230, Y, "col. spacing %"); PlusMinus(TextLeft + 330, Y - 6, MAX_CInt,                  0, sb[2]); Y := Y + BtnH + 10;
  173.   OutText(TextLeft, Y, "link");     OutText(TextLeft + 230, Y, "top & bottom");   PlusMinus(TextLeft + 330, Y - 6, MAX_Top,                   0, sb[3]); Y := Y + BtnH + 10;
  174.   OutText(TextLeft, Y, "visited");  OutText(TextLeft + 230, Y, "paragraph");      PlusMinus(TextLeft + 330, Y - 6, MAX_PARAGRAPH,             0, sb[4]); Y := Y + BtnH + 10;
  175.  
  176.   OutText(TextLeft + 230, Y, "epigraph");     PlusMinus(TextLeft + 330, Y - 6, MAX_EPIGRAPH,  0, sb[5]); Y := Y + BtnH + 10;
  177.   OutText(TextLeft + 230, Y, "line spacing"); PlusMinus(TextLeft + 330, Y - 6, MAX_InterLin,  0, sb[6]);
  178.  
  179.   Y := Y - 6;
  180.  
  181.   SU.CreateButton(DAY,   (Rect.Width - (BtnW + 5 + BtnW)) DIV 2 + Rect.Left,                       Y, 80, BtnH, SU.btnColor, "Day"   );
  182.   SU.CreateButton(NIGHT, (Rect.Width - (BtnW + 5 + BtnW)) DIV 2 + Rect.Left + 5 + BtnW,            Y, 80, BtnH, SU.btnColor, "Night" );
  183.  
  184.   SU.CreateButton(APPLY,  (WinW - (BtnW + 5 + BtnW) - 10) DIV 2,            WinH - BtnH - SkinH - 10, 80, BtnH, SU.btnColor, "Apply" );
  185.   SU.CreateButton(CANCEL, (WinW - (BtnW + 5 + BtnW) - 10) DIV 2 + 5 + BtnW, WinH - BtnH - SkinH - 10, 80, BtnH, SU.btnColor, "Cancel");
  186.  
  187.   FOR i := 0 TO LEN(sb) - 1 DO
  188.     box_lib.scrollbar_h_draw(sb[i])
  189.   END;
  190.   box_lib.check_box_draw2(check1);
  191.   box_lib.check_box_draw2(check2);
  192.  
  193. END Buttons;
  194.  
  195.  
  196. PROCEDURE DrawWindow;
  197. BEGIN
  198.   SU.GetSystemColors;
  199.   SU.WindowRedrawStatus(1);
  200.   SU.DefineAndDrawWindow(Window.Left, Window.Top, Window.Width, Window.Height,
  201.         SU.winColor, LSL(ORD({0, 1}), 4) + 4, Window.Caption);
  202.   Buttons;
  203.   SU.WindowRedrawStatus(2)
  204. END DrawWindow;
  205.  
  206.  
  207. PROCEDURE SelColor(Color: C.Dialog; Default: INTEGER): INTEGER;
  208. VAR Result: INTEGER;
  209. BEGIN
  210.   Result := Default;
  211.   IF Color # NIL THEN
  212.     C.Show(Color);
  213.     WHILE Color.status = 2 DO
  214.       SU.Pause(20)
  215.     END;
  216.     IF Color.status = 1 THEN
  217.       Result := Color.color
  218.     END
  219.   END
  220.   RETURN Result
  221. END SelColor;
  222.  
  223.  
  224. PROCEDURE ChangeColor(idx: INTEGER);
  225. BEGIN
  226.   Data.Colors[idx] := SelColor(Color, Data.Colors[idx])
  227. END ChangeColor;
  228.  
  229.  
  230. PROCEDURE Day;
  231. BEGIN
  232.   Data.Colors[DOM.BACK_COLOR]     := 0F0F0C7H;
  233.   Data.Colors[DOM.TEXT_COLOR]     := 0000000H;
  234.   Data.Colors[DOM.ITALIC_COLOR]   := 0505050H;
  235.   Data.Colors[DOM.LINK_COLOR]     := 00000FFH;
  236.   Data.Colors[DOM.VISITED_COLOR]  := 0800080H;
  237.   Data.Colors[DOM.CLICKED_COLOR]  := 0FF0000H;
  238. END Day;
  239.  
  240.  
  241. PROCEDURE Night;
  242. BEGIN
  243.   Data.Colors[DOM.BACK_COLOR]     := 0000000H;
  244.   Data.Colors[DOM.TEXT_COLOR]     := 0AFAFAFH;
  245.   Data.Colors[DOM.ITALIC_COLOR]   := 07F7F7FH;
  246.   Data.Colors[DOM.LINK_COLOR]     := 000A0D0H;
  247.   Data.Colors[DOM.VISITED_COLOR]  := 0C000C0H;
  248.   Data.Colors[DOM.CLICKED_COLOR]  := 0FF0000H;
  249. END Night;
  250.  
  251.  
  252. PROCEDURE Apply;
  253. BEGIN
  254.   Data.FontSize     := sb[0].position + MIN_FONT_SIZE;
  255.   Data.PADDING.LRpc := sb[1].position;
  256.   Data.PADDING.CInt := sb[2].position;
  257.   Data.PADDING.Top  := sb[3].position;
  258.   Data.PARAGRAPH    := sb[4].position;
  259.   Data.EPIGRAPH     := sb[5].position;
  260.   Data.InterLin     := sb[6].position;
  261.   IF Data.Picture # picture THEN
  262.     IF Data.Picture # 0 THEN
  263.       LibImg.img_destroy(Data.Picture)
  264.     END;
  265.     Data.Picture := picture;
  266.     Ini.SetPicturePath(picture_path)
  267.   END;
  268.   picture := 0;
  269.   DOM.SetSettings(Data);
  270.   Close
  271. END Apply;
  272.  
  273.  
  274. PROCEDURE LoadPicture(file_path: S.STRING);
  275. VAR ysize, img: INTEGER;
  276. BEGIN
  277.   img := LibImg.LoadFromFile(file_path, 10240000, ysize);
  278.   IF img # 0 THEN
  279.     IF (picture # 0) & (picture # Data.Picture) THEN
  280.       LibImg.img_destroy(picture)
  281.     END;
  282.     picture := img;
  283.     picture_path := file_path
  284.   END
  285. END LoadPicture;
  286.  
  287.  
  288. PROCEDURE OpenPicture;
  289. BEGIN
  290.   IF OpenPict # NIL THEN
  291.     OD.Show(OpenPict, 500, 400);
  292.     WHILE OpenPict.status = 2 DO
  293.       SU.Pause(30)
  294.     END;
  295.     IF OpenPict.status = 1 THEN
  296.       COPY(OpenPict.FilePath, picture_path);
  297.       LoadPicture(picture_path)
  298.     END
  299.   END
  300. END OpenPicture;
  301.  
  302.  
  303. PROCEDURE ButtonClick;
  304. BEGIN
  305.   CASE SU.GetButtonCode() OF
  306.   |0                      :
  307.   |1                      : Close
  308.   |BACK_PICTURE           : OpenPicture
  309.   |DAY                    : Day
  310.   |NIGHT                  : Night
  311.   |APPLY                  : Apply
  312.   |CANCEL                 : Close
  313.  
  314.   |CHANGE_BACK_COLOR      : ChangeColor(DOM.BACK_COLOR)
  315.   |CHANGE_TEXT_COLOR      : ChangeColor(DOM.TEXT_COLOR)
  316.   |CHANGE_ITALIC_COLOR    : ChangeColor(DOM.ITALIC_COLOR)
  317.   |CHANGE_LINK_COLOR      : ChangeColor(DOM.LINK_COLOR)
  318.   |CHANGE_VISITED_COLOR   : ChangeColor(DOM.VISITED_COLOR)
  319.  
  320.   END;
  321.   ClearWindow;
  322.   Buttons
  323. END ButtonClick;
  324.  
  325.  
  326. PROCEDURE Default*;
  327. BEGIN
  328.   Day;
  329.   Data.FontSize     := 16;
  330.   Data.TwoCol       := FALSE;
  331.   Data.PADDING.Top  := 15;
  332.   Data.PADDING.LRpc := 3;
  333.   Data.PADDING.CInt := 6;
  334.   Data.PARAGRAPH    := 30;
  335.   Data.EPIGRAPH     := 100;
  336.   Data.InterLin     := 0;
  337.   Data.Picture      := picture;
  338.   DOM.SetSettings(Data)
  339. END Default;
  340.  
  341.  
  342. PROCEDURE Show;
  343. VAR i, scrWidth, scrHeight: INTEGER;
  344. BEGIN
  345.   SU.SetEventsMask({0, 2, 5, 30, 31});
  346.   W.InitWindow(Window, 0, 0, 640, 420, "Settings");
  347.   SU.GetScreenSize(scrWidth, scrHeight);
  348.   Window.Left := (scrWidth - Window.Width) DIV 2;
  349.   Window.Top  := (scrHeight - Window.Height) DIV 2;
  350.   Color := C.Create(DrawWindow);
  351.   OpenPict := OD.Create(DrawWindow, 0, "/sys", "JPG|PNG|BMP|GIF");
  352.   Data := DOM.Settings;
  353.   picture := Data.Picture;
  354.   DrawWindow;
  355.   WHILE TRUE DO
  356.     CASE SU.WaitForEvent() OF
  357.     |1 : DrawWindow
  358.     |3 : ButtonClick
  359.     |6 : FOR i := 0 TO LEN(sb) - 1 DO
  360.            box_lib.scrollbar_h_mouse(sb[i])
  361.          END;
  362.          box_lib.check_box_mouse2(check1);
  363.          box_lib.check_box_mouse2(check2);
  364.          PlusMinus(TextLeft + 330, sb[0].y_h DIV 65536, MAX_FONT_SIZE,  MIN_FONT_SIZE, sb[0]);
  365.          PlusMinus(TextLeft + 330, sb[1].y_h DIV 65536, MAX_LRpc,                   0, sb[1]);
  366.          PlusMinus(TextLeft + 330, sb[2].y_h DIV 65536, MAX_CInt,                   0, sb[2]);
  367.          PlusMinus(TextLeft + 330, sb[3].y_h DIV 65536, MAX_Top,                    0, sb[3]);
  368.          PlusMinus(TextLeft + 330, sb[4].y_h DIV 65536, MAX_PARAGRAPH,              0, sb[4]);
  369.          PlusMinus(TextLeft + 330, sb[5].y_h DIV 65536, MAX_EPIGRAPH,               0, sb[5]);
  370.          PlusMinus(TextLeft + 330, sb[6].y_h DIV 65536, MAX_InterLin,               0, sb[6]);
  371.          Data.TwoCol := box_lib.check_box_get_value(check1);
  372.          Data.b_pict := box_lib.check_box_get_value(check2);
  373.     END
  374.   END
  375. END Show;
  376.  
  377.  
  378. PROCEDURE Open*;
  379. BEGIN
  380.   IF PID = 0 THEN
  381.     Data := DOM.Settings;
  382.     box_lib.check_box_set_value(check1, Data.TwoCol);
  383.     box_lib.check_box_set_value(check2, Data.b_pict);
  384.     PID := SU.NewThread(Show, DOM.Stack);
  385.     Slot := SU.GetThreadSlot(PID);
  386.     sb[0].position := Data.FontSize - MIN_FONT_SIZE;
  387.     sb[1].position := Data.PADDING.LRpc;
  388.     sb[2].position := Data.PADDING.CInt;
  389.     sb[3].position := Data.PADDING.Top;
  390.     sb[4].position := Data.PARAGRAPH;
  391.     sb[5].position := Data.EPIGRAPH;
  392.     sb[6].position := Data.InterLin;
  393.   ELSE
  394.     SU.FocusWindow(Slot)
  395.   END
  396. END Open;
  397.  
  398.  
  399. PROCEDURE main;
  400. VAR i: INTEGER;
  401.     bpicture, twocol: ARRAY 20 OF CHAR;
  402. BEGIN
  403.   PID := 0;
  404.   FOR i := 0 TO LEN(sb) - 1 DO
  405.     sb[i] := box_lib.kolibri_new_scrollbar(10 * 65536 + 200, 10 * 65536 + 22 + 2, 22, 15, 10, 0, 0, 0, 0, 2)
  406.   END;
  407.   bpicture := "back picture";
  408.   twocol := "two columns";
  409.   check2 := box_lib.kolibri_new_check_box(TextLeft, 10 + 5,               16, 16, sys.SADR(""), LENGTH(bpicture) * 8 + 5);
  410.   check1 := box_lib.kolibri_new_check_box(TextLeft, 10 + (BtnH + 10) + 5, 16, 16, sys.SADR(""), LENGTH(twocol)  * 8 + 5);
  411.   picture := 0;
  412.   IF Ini.Picture # "" THEN
  413.     LoadPicture(Ini.Picture)
  414.   END
  415. END main;
  416.  
  417.  
  418. BEGIN
  419.   main
  420. END Settings.
  421.