shithub: fc

Download patch

ref: 0fce054fb4b0866873f734ce5bdbc39d56ed5e5e
parent: 3eea9f16ffc138a7a5e728397b4e4cc2a7147508
author: glenda <glenda@krsna>
date: Wed Aug 20 11:41:14 EDT 2025

avoid-stacking

--- a/fc.c
+++ b/fc.c
@@ -6,8 +6,6 @@
 #include <bio.h>
 #include <ctype.h>
 
-/* Designed in acme and for acme dev */
-
 #define CONFIG_FILE 						"/usr/glenda/fc/fc.conf"
 #define DEFAULT_CTL_FILE 					"/usr/glenda/fc/fc.ctl"
 #define DEFAULT_SAVE_PATH 					"/usr/glenda/fc/sheet.spr"
@@ -28,13 +26,13 @@
 #define DEFAULT_MAX_RECALC_PASSES 			10
 #define DEFAULT_FORMULA_PRECISION 			2
 #define DEFAULT_PARAGRAPH_W 				256
-#define DEFAULT_PARAGRAPH_H 				256
+#define DEFAULT_PARAGRAPH_H 				128
 #define DEFAULT_BOXWIDTH 					128
 #define DEFAULT_BOXHEIGHT 					32
 
-#define MAXFORMULA 					256
-#define MAXCONTENT 					300
-#define MAXBOXES 					300
+#define MAXFORMULA 							256
+#define MAXCONTENT 							300
+#define MAXBOXES 							300
 
 
 enum {
@@ -292,6 +290,8 @@
 void eval_number(Box*);
 void eval_formula(Box*);
 void eval_paragraph(Box*);
+void handlekey(int key);
+void handlemouse(Mouse m);
 void handle_normal_mode(int key);
 void handle_cell_edit(int key);
 void handle_label_edit(int key);
@@ -328,8 +328,10 @@
 void ctl_quit(char**, int);
 void init_emoji(void);
 void initcolors(void);
+void init_config_defaults(void);
 void update_formula_format(void);
 void validate_config(void);
+int box_would_overlap(Point pos);
 int cistrcmp(char *s1, char *s2);
 int tokenize_formula(char *formula, Token *tokens, int maxtokens);
 int cellref_lookup(char *ref);
@@ -362,6 +364,7 @@
 ConfigField config_fields[] = {
 	{"banner_height",				CFG_INT,	&config.banner_height,				0,	nil},
 	{"status_height",				CFG_INT,	&config.status_height,				0,	nil},
+	{"status_margin",				CFG_INT,	&config.status_margin,				0,	nil},
 	{"box_label_offset_y",			CFG_INT,	&config.box_label_offset_y,			0,	nil},
 	{"box_text_margin",				CFG_INT,	&config.box_text_margin,			0,	nil},
 	{"formula_indicator_offset",	CFG_INT,	&config.formula_indicator_offset,	0,	nil},
@@ -377,8 +380,8 @@
 	{"emoji_frame_delay",			CFG_INT,	&config.emoji_frame_delay,			0,	nil},
 	{"ctl_check_interval",			CFG_INT,	&config.ctl_check_interval,			0,	nil},
 	{"redraw_interval",				CFG_INT,	&config.redraw_interval,			0,	nil},
-	{"gridsize",					CFG_INT,	&config.gridsize,					0,	nil},
 	{"gridsnap",					CFG_BOOL,	&config.gridsnap,					0,	nil},
+	{"gridsize",					CFG_INT,	&config.gridsize,					0,	nil},
 	{"max_eval_depth",				CFG_INT,	&config.max_eval_depth,				0,	nil},
 	{"max_recalc_passes",			CFG_INT,	&config.max_recalc_passes,			0,	nil},
 	{"formula_precision",			CFG_INT,	&config.formula_precision,			0,	update_formula_format},
@@ -450,7 +453,7 @@
 			handle_filename_input,
 			handle_filename_mouse,
 			draw_filename_overlay,
-			"Tab:.spr  Enter:confirm  Esc:cancel"
+			"Tab:/usr/glenda/fc/  Enter:confirm  Esc:cancel"
 		},
 };
 
@@ -936,8 +939,8 @@
 	sheet.editing_label = -1;
 	sheet.entering_filename = 0;
 	sheet.current_mode = 0;
-	sheet.gridsize = config.gridsize;
 	sheet.gridsnap = config.gridsnap;
+	sheet.gridsize = config.gridsize;
 	init_emoji();
 
 	while((line = Brdline(b, '\n')) != nil){
@@ -1048,6 +1051,7 @@
 	Bprint(b, "# auto-gen fc.conf $\n");	
 	Bprint(b, "banner_height %d\n", config.banner_height);
 	Bprint(b, "status_height %d\n", config.status_height);
+	Bprint(b, "status_margin %d\n", config.status_margin);
 	Bprint(b, "box_label_offset_y %d\n", config.box_label_offset_y);
 	Bprint(b, "box_text_margin %d\n", config.box_text_margin);
 	Bprint(b, "formula_indicator_offset %d\n", config.formula_indicator_offset);
@@ -1063,8 +1067,8 @@
 	Bprint(b, "emoji_frame_delay %d\n", config.emoji_frame_delay);
 	Bprint(b, "ctl_check_interval %d\n", config.ctl_check_interval);
 	Bprint(b, "redraw_interval %d\n", config.redraw_interval);	
-	Bprint(b, "gridsize %d\n", config.gridsize);
 	Bprint(b, "gridsnap %d\n", config.gridsnap);
+	Bprint(b, "gridsize %d\n", config.gridsize);
 	Bprint(b, "max_eval_depth %d\n", config.max_eval_depth);
 	Bprint(b, "max_recalc_passes %d\n", config.max_recalc_passes);
 	Bprint(b, "formula_precision %d\n", config.formula_precision);
@@ -1277,8 +1281,8 @@
 apply_config(void)
 {
 	sheet.emoji_enabled = config.emoji_enabled;
-	sheet.gridsize = config.gridsize;
 	sheet.gridsnap = config.gridsnap;
+	sheet.gridsize = config.gridsize;
 
 	if(colors[0]) {
 		freeimage(colors[0]);
@@ -2961,51 +2965,73 @@
 	}
 }
 
+int
+box_would_overlap(Point pos)
+{
+    Rectangle new_rect = Rect(pos.x, pos.y, 
+                             pos.x + config.box_width, 
+                             pos.y + config.box_height);
+    
+    for(int i = 0; i < sheet.nboxes; i++) {
+        if(rectXrect(new_rect, sheet.boxes[i].r)) {
+            return 1; // Overlap detected
+        }
+    }
+    return 0; // No overlap
+}
+
 void
 handle_normal_mouse(Mouse m)
 {
-	int i;
-
-	if(m.buttons & 1){
-		i = boxat(m.xy);
-		if(i >= 0){
-			sheet.selected = i;
-
-			while(m.buttons & 1){
-				sheet.boxes[i].pos = subpt(m.xy, Pt(config.box_width/2, config.box_height/2));
-				if(sheet.gridsnap){
-					sheet.boxes[i].pos.x = (sheet.boxes[i].pos.x / sheet.gridsize) * sheet.gridsize;
-					sheet.boxes[i].pos.y = (sheet.boxes[i].pos.y / sheet.gridsize) * sheet.gridsize;
-				}
-				sheet.boxes[i].r = Rect(sheet.boxes[i].pos.x, sheet.boxes[i].pos.y,
-					sheet.boxes[i].pos.x + config.box_width, sheet.boxes[i].pos.y + config.box_height);
-				redraw();
-				m = emouse();
-			}
-		} else {
-			i = addbox(m.xy);
-			if(i >= 0){
-				sheet.selected = i;
-				sheet.editing = i;
-				sheet.current_mode = 1;
-				sheet.editbuf[0] = '\0';
-				sheet.editpos = 0;
-			}
-		}
-		sheet.needredraw = 1;
-	}
-
-	if(m.buttons & 2){
-		i = boxat(m.xy);
-		if(i >= 0){
-			sheet.selected = i;
-			sheet.editing = i;
-			sheet.current_mode = 1;
-			strcpy(sheet.editbuf, sheet.boxes[i].formula);
-			sheet.editpos = strlen(sheet.editbuf);
-			sheet.needredraw = 1;
-		}
-	}
+    int i;
+    if(m.buttons & 1){
+        i = boxat(m.xy);
+        if(i >= 0){
+            // Found a box - drag it
+            sheet.selected = i;
+            while(m.buttons & 1){
+                sheet.boxes[i].pos = subpt(m.xy, Pt(config.box_width/2, config.box_height/2));
+                if(sheet.gridsnap){
+                    sheet.boxes[i].pos.x = (sheet.boxes[i].pos.x / sheet.gridsize) * sheet.gridsize;
+                    sheet.boxes[i].pos.y = (sheet.boxes[i].pos.y / sheet.gridsize) * sheet.gridsize;
+                }
+                sheet.boxes[i].r = Rect(sheet.boxes[i].pos.x, sheet.boxes[i].pos.y,
+                    sheet.boxes[i].pos.x + config.box_width, sheet.boxes[i].pos.y + config.box_height);
+                redraw();
+                m = emouse();
+            }
+        } else {
+            Point new_pos = m.xy;
+            if(sheet.gridsnap){
+                new_pos.x = (new_pos.x / sheet.gridsize) * sheet.gridsize;
+                new_pos.y = (new_pos.y / sheet.gridsize) * sheet.gridsize;
+            }
+            
+            if(!box_would_overlap(new_pos)){
+                i = addbox(new_pos);
+                if(i >= 0){
+                    sheet.selected = i;
+                    sheet.editing = i;
+                    sheet.current_mode = 1;
+                    sheet.editbuf[0] = '\0';
+                    sheet.editpos = 0;
+                }
+            }
+        }
+        sheet.needredraw = 1;
+    }
+    
+    if(m.buttons & 2){
+        i = boxat(m.xy);
+        if(i >= 0){
+            sheet.selected = i;
+            sheet.editing = i;
+            sheet.current_mode = 1;
+            strcpy(sheet.editbuf, sheet.boxes[i].formula);
+            sheet.editpos = strlen(sheet.editbuf);
+            sheet.needredraw = 1;
+        }
+    }
 }
 
 void
--