123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- #include "globals.h"
- #include "local_proto.h"
- #include <grass/display.h>
- struct box
- {
- int top, bottom, left, right;
- };
- static struct box plus, minus, value;
- static struct box cancel, accept;
- static int mag;
- static int inbox(struct box *, int, int);
- static int dotext(char *, int, int, int, int, int);
- static int incr(int, int);
- int ask_magnification(int *magnification)
- {
- static int use = 1;
- int x, y;
- int height;
- int stat;
- int width;
- int top, bottom, left, right;
- static Objects objects[] = {
- OTHER(incr, &use),
- {0}
- };
- Menu_msg("");
- mag = *magnification;
- if (mag < 1)
- mag = 1;
- height = VIEW_MENU->nrows;
- R_text_size(height - 4, height - 4);
- Get_mouse_xy(&x, &y);
- top = y - height / 2;
- if (top < SCREEN_TOP)
- top = SCREEN_TOP;
- bottom = top + 4 * height;
- if (bottom >= VIEW_MENU->top) {
- top -= bottom - (VIEW_MENU->top - 1);
- bottom = VIEW_MENU->top - 1;
- }
- width = Text_width("MAGNIFICATION") + 4;
- left = x - width / 2;
- if (left < SCREEN_LEFT)
- left = SCREEN_LEFT;
- right = left + width;
- if (right > SCREEN_RIGHT) {
- left -= right - SCREEN_RIGHT;
- right = SCREEN_RIGHT;
- }
- R_panel_save(tempfile1, top, bottom, left, right);
- R_standard_color(WHITE);
- R_box_abs(left, top, right, bottom);
- R_standard_color(BLACK);
- Outline_box(top, bottom, left, right);
- plus.top = top + height;
- plus.bottom = plus.top + height;
- plus.left = left;
- plus.right = plus.left + Text_width("++") + 4;
- Outline_box(plus.top, plus.bottom, plus.left, plus.right);
- minus.top = top + height;
- minus.bottom = minus.top + height;
- minus.right = right;
- minus.left = minus.right - Text_width("--") - 4;
- Outline_box(minus.top, minus.bottom, minus.left, minus.right);
- value.top = top + height;
- value.bottom = value.top + height;
- value.left = plus.right;
- value.right = minus.left;
- Outline_box(value.top, value.bottom, value.left, value.right);
- accept.top = value.bottom;
- accept.bottom = accept.top + height;
- accept.left = left;
- accept.right = right;
- Outline_box(accept.top, accept.bottom, accept.left, accept.right);
- cancel.top = accept.bottom;
- cancel.bottom = cancel.top + height;
- cancel.left = left;
- cancel.right = right;
- Outline_box(cancel.top, cancel.bottom, cancel.left, cancel.right);
- dotext("MAGNIFICATION", top, top + height, left, right, WHITE);
- dotext("+", plus.top, plus.bottom, plus.left, plus.right, GREY);
- dotext("-", minus.top, minus.bottom, minus.left, minus.right, GREY);
- dotext("ACCEPT", accept.top, accept.bottom, accept.left, accept.right,
- GREY);
- dotext("CANCEL", cancel.top, cancel.bottom, cancel.left, cancel.right,
- GREY);
- draw_mag();
- stat = Input_pointer(objects);
- /* to respond to user */
- R_standard_color(WHITE);
- R_box_abs(left, top, right, bottom);
- R_flush();
- R_panel_restore(tempfile1);
- R_panel_delete(tempfile1);
- *magnification = mag;
- return stat > 0;
- }
- int draw_mag(void)
- {
- char buf[10];
- sprintf(buf, "%d", mag);
- dotext(buf, value.top, value.bottom, value.left, value.right, WHITE);
- return 0;
- }
- static int incr(int x, int y)
- {
- if (inbox(&accept, x, y))
- return 1;
- if (inbox(&cancel, x, y))
- return -1;
- if (inbox(&plus, x, y)) {
- mag++;
- draw_mag();
- }
- else if (inbox(&minus, x, y) && mag > 1) {
- mag--;
- draw_mag();
- }
- return 0;
- }
- static int dotext(char *text, int top, int bottom, int left, int right,
- int background)
- {
- R_standard_color(background);
- R_box_abs(left + 1, top + 1, right - 1, bottom - 1);
- R_standard_color(BLACK);
- /* center the text */
- left = (left + right - Text_width(text)) / 2;
- Text(text, top, bottom, left, right, 2);
- R_flush();
- return 0;
- }
- static int inbox(struct box *box, int x, int y)
- {
- return (x > box->left && x < box->right && y > box->top &&
- y < box->bottom);
- }
|