Subversion Repositories DIN Is Noise

Rev

Rev 1581 | Rev 1593 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
* mouse_slider.cc
* DIN Is Noise is copyright (c) 2006-2020 Jagannathan Sampath
* For more information, please visit https://dinisnoise.org/
*/


#include "mouse_slider.h"
#include "console.h"
#include "viewwin.h"
#include "container.h"
#include "ui_list.h"

extern char BUFFER[];
extern void warp_mouse (int x, int y);

typedef std::list<mouse_slider_listener*>::iterator mouse_slider_listener_iterator;

mouse_slider_listener::mouse_slider_listener () {orient = Y;}

mouse_slider::mouse_slider () {

  initx = inity = inityy = lowx = lowy = midx = midy = highx = highy = prevx = prevy = nmslx = nmsly = lmb_clicked = 0;

  int dirs [] = {arrow_button::left, arrow_button::right, arrow_button::down, arrow_button::up};
  arrow_button* abs [] = {&axl, &axr, &ayb, &ayt};
  for (int i = 0; i < 4; ++i) abs[i]->set (22, dirs[i], 0.5f, 0.5f, 0.5f);

  sz = axl.size;
  sz_2 = sz / 2;
  szn = sz;
  szn_1 = szn + sz;
}

void mouse_slider::update_x_arrows () {
  int py = mouseyy - sz_2;
  axl.set_pos (mousex - szn_1, py);
  axr.set_pos (mousex + szn, py);
}

void mouse_slider::update_y_arrows () {
  int px = mousex - sz_2;
  ayb.set_pos (px, mouseyy - szn_1);
  ayt.set_pos (px, mouseyy + szn);
}

int mouse_slider::justy () {
  return (nmsly && SHIFT);
}

int mouse_slider::justx () {
  return (nmslx && CTRL);
}

void mouse_slider::draw () {
  glColor3f (0.5, 0.5, 0.75);
  pts[0]=initx; pts[1]=inity;
  pts[2]=mousex; pts[3]=mouseyy;
  glVertexPointer (2, GL_INT, 0, pts);
  glDrawArrays (GL_LINES, 0, 2);
  if (nmslx && !justy() ) {
    axl.draw ();
    axr.draw ();
  }
  if (nmsly && !justx()) {
    ayb.draw ();
    ayt.draw ();
  }

  /*glColor3f (1, 1, 1);
  sprintf (BUFFER, "%d,%d", totx, toty);
  draw_string (BUFFER, initx, inity);*/

}

int mouse_slider::handle_input () {

  if (keypressed (SDLK_1)) {
    base = 10;
    scale = 1.0;
    cons << "Base = " << base << ", +- = " << (scale * delta) << eol;
  }
  else {
    for (Uint8 i = SDLK_2; i < SDLK_COLON; ++i) {
      if (keypressed(i)) {
        base = i - SDLK_0;
        scale = 1.0;
        cons << "Base = " << base << ", +- = " << (scale * delta) << eol;
        break;
      }
    }
  }

  if (keypressed (SDLK_COMMA)) {
    scale /= base;
    cons << "Base = " << base << ", +- = " << (scale * delta) << eol;
  }
  else if (keypressed (SDLK_PERIOD)) {
    scale *= base;
    cons << "Base = " << base << ", +- = " << (scale * delta) << eol;
  }

  if (mousex < lowx || mousex > highx) {
    warp_mouse (midx, mousey);
    initx = prevx = mousex;
  }

  if (mousey < lowy || mousey > highy) {
    warp_mouse (mousex, midy);
    inity = prevy = mouseyy;
  }

  int ua = 0;
  dx = dy = 0;
  if ( nmslx && !justy() ) {
    dx = mousex - prevx;
    dx += wheel;
    //totx += dx;
    HOVER = 1;
    if (dx != 0) {
      for (mouse_slider_listener_iterator i = mslx.begin (), j = mslx.end (); i != j; ++i) (*i)->moused (dx, scale);
      ua = 1;
    }
  }

  if ( nmsly && !justx() ) {
    dy = mouseyy - prevy;
    dy += wheel;
    //toty += dy;
    HOVER = 1;
    if (dy != 0) {
      for (mouse_slider_listener_iterator i = msly.begin (), j = msly.end (); i != j; ++i) (*i)->moused (dy, scale);
      ua = 1;
    }
  }

  if (ua) {
    update_x_arrows ();
    update_y_arrows ();
  }

  prevx = mousex;
  prevy = mouseyy;

  if (is_lmb (this)) {
    lmb_clicked = 1;
  } else {
    if (lmb_clicked) deactivate ();
  }

  return 1;

}

void mouse_slider::add (mouse_slider_listener* msl) {
  if (msl->orient == mouse_slider_listener::X) { push_back (mslx, msl); ++nmslx; } else { push_back (msly, msl); ++nmsly; }
}

void mouse_slider::remove (mouse_slider_listener* msl) {
  if (msl->orient == mouse_slider_listener::X) { erase (mslx, msl); --nmslx; } else { erase (msly, msl); --nmsly; }
  //if (nmslx == 0 && nmsly == 0) deactivate ();
}

int mouse_slider::activate () {

  if (nmslx == 0 && nmsly == 0) return active;

  lowx = margin; highx = view.xmax - lowx;
  lowy = margin; highy = view.ymax - lowy;
  midx = view.xmax / 2;
  midy = view.ymax / 2;
  prevx = mousex;
  prevy = mouseyy;
  initx = mousex;
  inity = mouseyy;
  inityy = mousey;
  //totx = 0;
  //toty = 0;

  string xchange, ychange;
  if (nmslx) {
    for (mouse_slider_listener_iterator i = mslx.begin (), j = mslx.end (); i != j; ++i) {
      mouse_slider_listener* msl = *i;
      xchange = xchange + msl->name + ", ";
    }
    update_x_arrows ();
  }

  if (nmsly) {
    for (mouse_slider_listener_iterator i = msly.begin (), j = msly.end (); i != j; ++i) {
      mouse_slider_listener* msl = *i;
      ychange = ychange + msl->name + ", ";
    }
    update_y_arrows ();
  }

  if (!active) {
    uis.widgets_of [uis.current].push_back (&mouse_slider0);
    active = 1;
    lmb_clicked = 0;
    is_lmb.tie = this;
  }

  cons << GREEN << "Move";
  if (xchange != "") cons << " Left/Right or Wheel to change " << xchange;
  if (ychange != "") cons << " Up/Down or Wheel to change " << ychange;
  cons << "ESC/Click to stop" << eol;

  scale = 1.0;
  base = 10.0;
  // cons << "Base = " << base << ", +- = " << (scale * delta) << eol;

  return active;

}

extern void draw_slit_cutter (int);

int mouse_slider::deactivate () {

  if (active) {

    if (nmslx) {
      for (mouse_slider_listener_iterator i = mslx.begin (), j = mslx.end (); i != j; ++i) (*i)->after_slide();
      mslx.clear ();
      nmslx = 0;
    }

    if (nmsly) {
      for (mouse_slider_listener_iterator i = msly.begin (), j = msly.end (); i != j; ++i) (*i)->after_slide();
      msly.clear ();
      nmsly = 0;
    }

    active = 0;
    erase (uis.widgets_of[uis.current], &mouse_slider0);
    warp_mouse (initx, inityy);
    lmb_clicked = 0;
    is_lmb.clear (this);
    draw_slit_cutter (0);

    cons << RED << "Stopped mouse slider" << eol;

    return 1;

  }

  return 0;

}

void activate_mouse_slider (double d) {
  if (MENU.show) MENU.toggle ();
  mouse_slider0.delta = d;
  mouse_slider0.activate ();
  /*if (mouse_slider0.activate ()) {
    if (uis.is_widget_on_screen (&mouse_slider0, uis.current) == 0)
      uis.widgets_of [uis.current].push_back (&mouse_slider0);
  }*/

}

int mouse_slider_active () {
  return mouse_slider0.active;
}

void cant_mouse_slide () {
  cons << RED << "Mouse slider is already active!" << eol;
}

mouse_slider::~mouse_slider () {}