Subversion Repositories Kolibri OS

Rev

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

  1. (*
  2.     Copyright 2021 Anton Krotov
  3.  
  4.     This file is part of CEdit.
  5.  
  6.     CEdit 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.     CEdit 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 CEdit. If not, see <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE Scroll;
  21.  
  22. IMPORT G := Graph;
  23.  
  24. TYPE
  25.  
  26.     tScroll* = POINTER TO RECORD
  27.         vertical, mouse: BOOLEAN;
  28.         canvas: G.tCanvas;
  29.         xSize*, ySize*, pos, mousePos: INTEGER;
  30.         color, bkColor: INTEGER;
  31.         value*, maxVal*: INTEGER
  32.     END;
  33.  
  34.  
  35. PROCEDURE draw* (scroll: tScroll; x, y: INTEGER);
  36. VAR
  37.     pos, a, b: INTEGER;
  38.     canvas: G.tCanvas;
  39. BEGIN
  40.     IF scroll.vertical THEN
  41.         a := scroll.ySize;
  42.         b := scroll.xSize
  43.     ELSE
  44.         a := scroll.xSize;
  45.         b := scroll.ySize
  46.     END;
  47.     IF scroll.maxVal > 0 THEN
  48.         pos := (a - b)*scroll.value DIV scroll.maxVal
  49.     ELSE
  50.         pos := 0
  51.     END;
  52.     canvas := scroll.canvas;
  53.     G.SetColor(canvas, scroll.bkColor);
  54.     G.clear(canvas);
  55.     G.SetColor(canvas, 0808080H);
  56.     G.Rect(canvas, 0, 0, scroll.xSize - 1, scroll.ySize - 1);
  57.     G.SetColor(canvas, scroll.color);
  58.     DEC(b, 2);
  59.     IF scroll.vertical THEN
  60.         G.FillRect(canvas, 1, pos + 1, b, pos + b);
  61.         G.SetColor(canvas, 0404040H);
  62.         G.HLine(canvas, pos + 1 + b DIV 2, 4, b - 4);
  63.         G.HLine(canvas, pos + 1 + b DIV 2 - 3, 6, b - 6);
  64.         G.HLine(canvas, pos + 1 + b DIV 2 + 3, 6, b - 6);
  65.     ELSE
  66.         G.FillRect(canvas, pos + 1, 1, pos + b, b);
  67.         G.SetColor(canvas, 0404040H);
  68.         G.VLine(canvas, pos + b DIV 2, 4, b - 4);
  69.         G.VLine(canvas, pos + b DIV 2 - 3, 6, b - 6);
  70.         G.VLine(canvas, pos + b DIV 2 + 3, 6, b - 6);
  71.     END;
  72.     scroll.pos := pos;
  73.     G.DrawCanvas(canvas, x, y);
  74. END draw;
  75.  
  76.  
  77. PROCEDURE create* (xSize, ySize: INTEGER; color, bkColor: INTEGER): tScroll;
  78. VAR
  79.     scroll: tScroll;
  80. BEGIN
  81.     NEW(scroll);
  82.     scroll.xSize := xSize;
  83.     scroll.ySize := ySize;
  84.     scroll.vertical := xSize < ySize;
  85.     scroll.maxVal := 30;
  86.     scroll.value := 0;
  87.     scroll.mouse := FALSE;
  88.     scroll.bkColor := bkColor;
  89.     scroll.color := color;
  90.     scroll.canvas := G.CreateCanvas(xSize, ySize)
  91.     RETURN scroll
  92. END create;
  93.  
  94.  
  95. PROCEDURE resize* (scroll: tScroll; xSize, ySize: INTEGER);
  96. BEGIN
  97.     scroll.xSize := xSize;
  98.     scroll.ySize := ySize;
  99.     scroll.vertical := xSize < ySize;
  100.     G.destroy(scroll.canvas);
  101.     scroll.canvas := G.CreateCanvas(xSize, ySize);
  102. END resize;
  103.  
  104.  
  105. PROCEDURE mouse* (scroll: tScroll; x, y: INTEGER);
  106. VAR
  107.     pos, b: INTEGER;
  108. BEGIN
  109.     IF scroll.vertical THEN
  110.         pos := y - 1;
  111.         b := scroll.xSize - 2
  112.     ELSE
  113.         pos := x - 1;
  114.         b := scroll.ySize - 2
  115.     END;
  116.     IF ~scroll.mouse THEN
  117.         scroll.mouse := TRUE;
  118.         IF (scroll.pos <= pos) & (pos <= scroll.pos + b - 1) THEN
  119.             scroll.mousePos := pos - scroll.pos
  120.         ELSE
  121.             scroll.mousePos := b DIV 2;
  122.             scroll.value := (pos - scroll.mousePos)*scroll.maxVal DIV ABS(scroll.xSize - scroll.ySize)
  123.         END
  124.     ELSE
  125.         scroll.value := (pos - scroll.mousePos)*scroll.maxVal DIV ABS(scroll.xSize - scroll.ySize)
  126.     END;
  127.     IF scroll.value < 0 THEN
  128.         scroll.value := 0
  129.     ELSIF scroll.value > scroll.maxVal THEN
  130.         scroll.value := scroll.maxVal
  131.     END
  132. END mouse;
  133.  
  134.  
  135. PROCEDURE MouseUp* (scroll: tScroll);
  136. BEGIN
  137.     IF scroll # NIL THEN
  138.         scroll.mouse := FALSE
  139.     END
  140. END MouseUp;
  141.  
  142.  
  143. END Scroll.