aboutsummaryrefslogtreecommitdiffstats
path: root/src/color_box.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/color_box.h')
-rw-r--r--src/color_box.h351
1 files changed, 351 insertions, 0 deletions
diff --git a/src/color_box.h b/src/color_box.h
new file mode 100644
index 0000000..8162640
--- /dev/null
+++ b/src/color_box.h
@@ -0,0 +1,351 @@
+class ColorBox : public Fl_Box {
+ public:
+ ColorBox(int _x, int _y, int _w, int _h, const char * l=0) :
+ Fl_Box(_x, _y, _w, _h, l) {
+ box(FL_UP_BOX);
+ labeltype(FL_SHADOW_LABEL);
+ }
+
+ int handle(int event);
+
+ void xy_vars(int _x, int _y) {
+ this->_x = _x;
+ this->_y = _y;
+ }
+
+ void set_overlap(bool overlap) {
+ this->overlap = overlap;
+ }
+
+ bool set_overlap() {
+ return overlap;
+ }
+
+ void setbox();
+ private:
+ int _x, _y;
+ bool overlap;
+ int old_x, old_y;
+};
+
+void add_boxs() {
+ int _y, _x, _font_size;
+ memset(all_colors, 0, sizeof(all_colors));
+
+ bside = (_window->w() - _window->h()) / 2;
+ bsize = _window->h() / MBLOCKS;
+ _font_size = bsize / 2;
+
+ for (_y = 0; _y < 50; _y++)
+ for (_x = 0; _x < 50; _x++) {
+
+ if (_y + map_y_offset >= MBLOCKS ||
+ _x + map_x_offset >= MBLOCKS) {
+ if (boxs[_y][_x])
+ boxs[_y][_x]->hide();
+ continue;
+ }
+
+ all_colors[color_map[_y][_x]]++;
+
+ // Add boxes.
+ if (!boxs[_y][_x])
+ boxs[_y][_x] = new ColorBox(0, 0, 0, 0);
+
+ boxs[_y][_x]->resize((_x * bsize) + bside, _y *
+ bsize, bsize, bsize);
+
+ // Activate.
+ if (g_active)
+ boxs[_y][_x]->activate();
+
+ // Hide some boxes.
+ if (color_map[_y][_x] == 0) {
+ boxs[_y][_x]->hide();
+ continue;
+ }
+
+ boxs[_y][_x]->show();
+
+ // Adding color and label to boxes.
+ boxs[_y][_x]->label(color_to_label(color_map[_y][_x]));
+ boxs[_y][_x]->labelsize(_font_size);
+ boxs[_y][_x]->color(color_to_flcolor(color_map[_y][_x]));
+ boxs[_y][_x]->xy_vars(_x, _y);
+ boxs[_y][_x]->set_overlap(false);
+
+ if (color_map[_y][_x] == BLACK)
+ boxs[_y][_x]->labelcolor(FL_GRAY);
+ else
+ boxs[_y][_x]->labelcolor(FL_BLACK);
+ }
+
+ _window->redraw();
+}
+
+void act_boxs(bool act) {
+ int x, y;
+
+ for (y = 0; y < MBLOCKS; y++)
+ for (x = 0; x < MBLOCKS; x++) {
+ if (boxs[y][x]) {
+ if (act)
+ boxs[y][x]->activate();
+ else
+ boxs[y][x]->deactivate();
+ }
+ }
+
+ if (overlap_wid)
+ overlap_wid->resize(0, 0, 0, 0);
+}
+
+int ColorBox::handle(int event) {
+ int i, the_x, the_y, real_x, real_y;
+
+ switch(event) {
+ case FL_ENTER:
+ if (!g_active || !active_r())
+ return 1;
+
+ if (!overlap && color() != FL_GRAY && color() != FL_WHITE &&
+ color() != FL_BLACK && color() != FL_BROWN) {
+ int _font_size = bsize / 2;
+
+ overlap_wid->labelsize(_font_size);
+ overlap_wid->xy_vars(_x, _y);
+ overlap_wid->resize((_x * bsize) + bside, _y *
+ bsize, bsize, bsize);
+
+ overlap_wid->set_overlap(true);
+ overlap_wid->color(color());
+ overlap_wid->labelcolor(labelcolor());
+
+ overlap_wid->label(label());
+ }
+
+ return 1;
+ case FL_PUSH:
+ return 1;
+ case FL_DRAG:
+ if (!g_active || !active_r())
+ return 1;
+
+ switch(Fl::event_button()) {
+ case FL_LEFT_MOUSE:
+
+ if (!overlap)
+ break;
+
+ position(Fl::event_x(), Fl::event_y());
+
+ // Stop box from leaving window.
+ real_x = x() + (w() / 2);
+ real_y = y() + (h() / 2);
+
+ if (real_x <= 0)
+ position(3, y());
+ if (real_x >= _window->w())
+ position(_window->w() - (w() + 3), y());
+ if (real_y <= 0)
+ position(x(), 3);
+ if (real_y >= _window->h())
+ position(x(), _window->h() - (h() + 3));
+
+ // Drawing.
+ if (old_x && old_y) {
+ old_x = (old_x - x()) * 3;
+ old_y = (old_y - y()) * 3;
+
+ if (old_x < 0)
+ old_x *= -1;
+ if (old_y < 0)
+ old_y *= -1;
+
+ if (old_x == 0)
+ old_x = 100;
+ if (old_y == 0)
+ old_y = 100;
+
+ _window->damage(FL_DAMAGE_ALL, x() - old_x,
+ y() - old_y, w() + (old_x * 2), h()
+ + (old_y * 2));
+ } else
+ _window->redraw();
+
+ old_x = x();
+ old_y = y();
+
+ break;
+ default:
+ break;
+ }
+
+ return 1;
+ case FL_RELEASE:
+
+ if (Fl::event_button() == FL_LEFT_MOUSE)
+ setbox();
+
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+void ColorBox::setbox() {
+ int x_block = (x() - bside) / bsize;
+ int y_block = y() / bsize;
+ int _font_size, repos_t = 0;
+ unsigned char ccolor = color_map[_y][_x], chc = 0;
+ bool repos = false;
+
+ if (!overlap)
+ return;
+ else if (!boxs[y_block][x_block]) {
+ resize(0, 0, 0, 0);
+ _window->redraw();
+ return;
+ }
+
+ resize(0, 0, 0, 0);
+
+ // Color combo.
+ switch (color_map[y_block][x_block]) {
+ case BLANK:
+ repos = true;
+ break;
+ case RED:
+ if (ccolor == GREEN)
+ repos = true;
+ break;
+ case YELLOW:
+ if (ccolor == RED)
+ repos = true;
+ break;
+ case GREEN:
+ if (ccolor == BLUE)
+ repos = true;
+ break;
+ case BLUE:
+ if (ccolor == YELLOW)
+ repos = true;
+ break;
+ case WHITE:
+ chc = 1;
+ repos = true;
+ break;
+ case BLACK:
+ chc = 2;
+ repos = true;
+ break;
+ default:
+ break;
+ }
+
+ if (!repos) {
+ _window->redraw();
+ return;
+ }
+
+ // Distances.
+ if (x_block > _x) {
+ if (x_block - _x == 1)
+ repos = true;
+ else
+ repos = false;
+ repos_t++;
+ } if (_x > x_block) {
+ if (_x - x_block == 1)
+ repos = true;
+ else
+ repos = false;
+ repos_t++;
+ } if (y_block > _y) {
+ if (y_block - _y == 1)
+ repos = true;
+ else
+ repos = false;
+ repos_t++;
+ } if (_y > y_block) {
+ if (_y - y_block == 1)
+ repos = true;
+ else
+ repos = false;
+ repos_t++;
+ }
+
+ // repos_t stops diagonal movemet.
+ if (repos_t > 1)
+ repos = false;
+ else if (repos && chc > 0) {
+ unsigned char new_color;
+
+ // White.
+ if (chc == 1) {
+ switch (ccolor) {
+ case RED:
+ new_color = BLUE;
+ break;
+ case YELLOW:
+ new_color = GREEN;
+ break;
+ case GREEN:
+ new_color = YELLOW;
+ break;
+ case BLUE:
+ new_color = RED;
+ break;
+ default:
+ break;
+ }
+ // Black.
+ } else if (chc == 2) {
+ switch(ccolor) {
+ case RED:
+ new_color = GREEN;
+ break;
+ case YELLOW:
+ new_color = RED;
+ break;
+ case GREEN:
+ new_color = BLUE;
+ break;
+ case BLUE:
+ new_color = YELLOW;
+ break;
+ default:
+ break;
+ }
+ }
+
+ all_colors[new_color]++;
+ all_colors[color_map[y_block][x_block]]--;
+
+ color_map[y_block][x_block] = new_color;
+ int _font_size = bsize / 2;
+
+ boxs[y_block][x_block]->labelsize(_font_size);
+ boxs[y_block][x_block]->color(color_to_flcolor(new_color));
+ boxs[y_block][x_block]->label(color_to_label(new_color));
+ boxs[y_block][x_block]->labelcolor(FL_BLACK);
+
+ } else if (repos) {
+ all_colors[color_map[_y][_x]]++;
+ all_colors[color_map[y_block][x_block]]--;
+
+ color_map[y_block][x_block] = color_map[_y][_x];
+ _font_size = bsize / 2;
+
+ boxs[y_block][x_block]->labelsize(_font_size);
+ boxs[y_block][x_block]->color(color());
+ boxs[y_block][x_block]->labelcolor(labelcolor());
+ boxs[y_block][x_block]->label(label());
+ }
+
+ int da_size = (bsize * 2 + 10);
+
+ _window->damage(FL_DAMAGE_ALL, boxs[y_block][x_block]->x() - da_size,
+ boxs[y_block][x_block]->y() - da_size, boxs[y_block][x_block]->w() + da_size * 2,
+ boxs[y_block][x_block]->h() + da_size * 2);
+}