Bläddra i källkod

File dialog: text box autofill

Arthur Yefimov 4 år sedan
förälder
incheckning
280c7beffe
2 ändrade filer med 43 tillägg och 26 borttagningar
  1. 12 0
      src/Editor.Mod
  2. 31 26
      src/OV.Mod

+ 12 - 0
src/Editor.Mod

@@ -78,6 +78,17 @@ BEGIN OV.CloseCurWindow(c);
   END
 END FileDialogOkClick;
 
+PROCEDURE FileDialogListChange*(c: OV.Control);
+VAR C: OV.ColumnList; w: FileDialog;
+  s: ARRAY 256 OF CHAR;
+BEGIN C := c(OV.ColumnList); w := C.parent(FileDialog);
+  StrList.SetPos(C.items, C.cur); StrList.Next(C.items, s);
+  IF s[0] = '[' THEN Strings.Delete(s, 0, 1);
+    s[Strings.Length(s) - 1] := '/'
+  END;
+  OV.EditSetCaption(w.edtFilename, s)
+END FileDialogListChange;
+
 PROCEDURE InitFileDialog*(c: FileDialog; type: INTEGER);
 BEGIN OV.InitWindow(c); c.do := fileDialogMethod; c.type := type;
   IF type = open THEN c.caption := 'Open a File'
@@ -108,6 +119,7 @@ BEGIN OV.InitWindow(c); c.do := fileDialogMethod; c.type := type;
   (* ColumnList *)
   c.colFiles := OV.NewColumnList();
   (*c.colFiles.onClick := FileDialogOkClick;*)
+  c.colFiles.onChange := FileDialogListChange;
   c.colFiles.do.resize(c.colFiles, 3, 6, c.w - 18, c.h - 8);
   StrList.Append(c.colFiles.items, '[..]');
   StrList.Append(c.colFiles.items, '[EGABGI]');

+ 31 - 26
src/OV.Mod

@@ -567,6 +567,7 @@ TYPE
   ControlMethod* = POINTER TO ControlMethodDesc;
 
   ClickHandler* = PROCEDURE (c: Control);
+  ChangeHandler* = ClickHandler;
   
   ControlDesc* = EXTENSIBLE RECORD
     app*: App;
@@ -580,6 +581,7 @@ TYPE
     status*: INTEGER;
     caption*: ARRAY 256 OF CHAR;
     onClick*: ClickHandler;
+    onChange*: ChangeHandler;
     do*: ControlMethod
   END;
 
@@ -916,12 +918,11 @@ END SetEnabled;
 (* Control *)
 
 PROCEDURE InitControl*(c: Control);
-BEGIN
-  c.x := 0; c.y := 0; c.w := 0; c.h := 0;
+BEGIN c.x := 0; c.y := 0; c.w := 0; c.h := 0;
   c.parent := NIL; c.children := NIL; c.prev := NIL; c.next := NIL;
   c.enabled := TRUE; c.default := FALSE; c.focused := FALSE;
   c.mouseActive := TRUE; c.status := 0; c.caption[0] := 0X;
-  c.do := controlMethod
+  c.onClick := NIL; c.onChange := NIL; c.do := controlMethod
 END InitControl;
 
 PROCEDURE NewControl*(): Control;
@@ -1641,7 +1642,8 @@ BEGIN i := 0;
   WHILE (s[i] # 0X) & (i < LEN(c.caption) - 1) DO
     c.caption[i] := s[i]; INC(i)
   END;
-  c.caption[i] := 0X; c.len := i; c.pos := i
+  c.caption[i] := 0X; c.len := i; c.pos := i;
+  NeedRedraw(c.app)
 END EditSetCaption;
 
 PROCEDURE InsertChar(ch: CHAR; pos: INTEGER;
@@ -1739,6 +1741,24 @@ END NewColumnList;
 
 (* ColumnList Method *)
 
+PROCEDURE ColumnListSetCur*(C: ColumnList; cur: INTEGER);
+VAR sb: Scrollbar;
+  h, count, oldCur, sbCur, oldSbCur: INTEGER;
+BEGIN sb := C.scrollbar;
+  sbCur := sb.cur; oldSbCur := sbCur;
+  h := C.h - 1; count := StrList.Count(C.items);
+  IF cur < 0 THEN cur := 0 ELSIF cur >= count THEN cur := count - 1 END;
+  IF cur < sbCur * h THEN sbCur := cur DIV h
+  ELSIF cur >= (sbCur + C.cols - 1) * h THEN sbCur := cur DIV h - C.cols + 1
+  END;
+  IF sbCur < 0 THEN sbCur := 0 ELSIF sbCur > sb.max THEN sbCur := sb.max END;
+  IF sbCur # oldSbCur THEN SetScrollbarCur(sb, sbCur) END;
+  IF C.cur # cur THEN C.cur := cur;
+    IF C.onChange # NIL THEN C.onChange(C) END;
+    NeedRedraw(C.app)
+  END
+END ColumnListSetCur;
+
 PROCEDURE ColumnListDraw*(c: Control; x, y: INTEGER);
 VAR i, x2, y2, colw, fg, bg: INTEGER;
   C: ColumnList;
@@ -1777,24 +1797,24 @@ BEGIN ControlGetFocus(c); G.StartTextInput
 END ColumnListGetFocus;
 
 PROCEDURE ColumnListUpdateCur*(C: ColumnList; x, y: INTEGER);
-VAR h, oldCur, col, colw, count: INTEGER;
+VAR h, cur, col, colw, count: INTEGER;
 BEGIN h := C.h - 1;
   IF (x < 0) OR (x >= C.w) THEN
     (*!TODO autoscroll*)
     (*IF ... THEN NeedRedraw(C.app) END*)
-  ELSIF y # h THEN oldCur := C.cur;
+  ELSIF y # h THEN cur := C.cur;
     IF y < 0 THEN (* Scroll to top within column *)
-      C.cur := (C.cur DIV h) * h
+      cur := (cur DIV h) * h
     ELSIF y >= C.h THEN (* Scroll to bottom within column *)
-      C.cur := C.cur DIV h * h + h - 1
+      cur := cur DIV h * h + h - 1
     ELSE
       colw := (C.w - C.cols + 1) DIV C.cols;
       col := x DIV (colw + 1);
-      C.cur := col * h + y + C.scrollbar.cur * h
+      cur := col * h + y + C.scrollbar.cur * h
     END;
     count := StrList.Count(C.items);
-    IF C.cur >= count THEN C.cur := count - 1 END;
-    IF C.cur # oldCur THEN NeedRedraw(C.app) END
+    IF cur >= count THEN cur := count - 1 END;
+    ColumnListSetCur(C, cur)
   END
 END ColumnListUpdateCur;
 
@@ -1823,21 +1843,6 @@ BEGIN C := c(ColumnList);
   IF buttons = {G.btnLeft} THEN ColumnListUpdateCur(C, x, y) END
 END ColumnListMouseMove;
 
-PROCEDURE ColumnListSetCur*(C: ColumnList; cur: INTEGER);
-VAR sb: Scrollbar;
-  h, count, oldCur, sbCur, oldSbCur: INTEGER;
-BEGIN sb := C.scrollbar;
-  sbCur := sb.cur; oldSbCur := sbCur;
-  h := C.h - 1; count := StrList.Count(C.items);
-  IF cur < 0 THEN cur := 0 ELSIF cur >= count THEN cur := count - 1 END;
-  IF cur < sbCur * h THEN sbCur := cur DIV h
-  ELSIF cur >= (sbCur + C.cols - 1) * h THEN sbCur := cur DIV h - C.cols + 1
-  END;
-  IF sbCur < 0 THEN sbCur := 0 ELSIF sbCur > sb.max THEN sbCur := sb.max END;
-  IF sbCur # oldSbCur THEN SetScrollbarCur(sb, sbCur) END;
-  IF C.cur # cur THEN C.cur := cur; NeedRedraw(C.app) END
-END ColumnListSetCur;
-
 PROCEDURE ColumnListKeyDown*(c: Control; key: G.Key);
 VAR C: ColumnList; sb: Scrollbar;
   h, cur: INTEGER;