Subversion Repositories Kolibri OS

Rev

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