Source Code (Use browser search to find items of interest.)

Class Index

ksokoban'History (./kdegames/ksokoban/History.H:38)

class History {
private:
  QList<Move> past_;
  QList<Move> future_;

protected:

public:
  History();
  /**
   * Add a move to the history. Deletes all currently undone moves.
   */
  void add(Move *_m);
  /**
   * Clear the history and delete all Move objects stored in it.
   */
  void clear();

  void save(QString &_str);
  const char *load(LevelMap *map, const char *_str);
  bool redo(LevelMap *map);
  MoveSequence *deferRedo(LevelMap *map);
  bool undo(LevelMap *map);
  MoveSequence *deferUndo(LevelMap *map);
};

ksokoban'History::History() (./kdegames/ksokoban/History.C:27)

History::History() {
  past_.setAutoDelete(true);
  future_.setAutoDelete(true);
}


void

ksokoban'History::add() (./kdegames/ksokoban/History.C:34)

History::add(Move *_m) {
  future_.clear();
  past_.append(_m);
}

void

ksokoban'History::clear() (./kdegames/ksokoban/History.C:40)

History::clear() {
  past_.clear();
  future_.clear();
}

void

ksokoban'History::save() (./kdegames/ksokoban/History.C:46)

History::save(QString &_str) {
  Move *m = past_.first();

  while (m != 0) {
    m->save(_str);
    m = past_.next();
  }
  _str += '-';

  m = future_.first();
  while (m != 0) {
    m->save(_str);
    m = future_.next();
  }
}

const char *

ksokoban'History::load() (./kdegames/ksokoban/History.C:63)

History::load(LevelMap *map, const char *_str) {
  Move *m;
  int x = map->xpos();
  int y = map->ypos();

  clear();
  while (*_str != '\0' && *_str != '-') {
    m = new Move(x, y);
    _str = m->load(_str);
    if (_str == 0) return 0;
    x = m->finalX();
    y = m->finalY();
    past_.append(m);
    if (!m->redo(map)) {
      //printf("redo failed: %s\n", _str);
      //abort();
      return 0;
    }
  }
  if (*_str != '-') return 0;

  _str++;
  while (*_str != '\0') {
    m = new Move(x, y);
    _str = m->load(_str);
    if (_str == 0) return 0;
    x = m->finalX();
    y = m->finalY();
    future_.append(m);
  }

  return _str;
}

bool

ksokoban'History::redo() (./kdegames/ksokoban/History.C:98)

History::redo(LevelMap *map) {
  if (future_.isEmpty()) return false;

  Move *m=future_.take(0);
  past_.append(m);
  return m->redo(map);
}

MoveSequence *

ksokoban'History::deferRedo() (./kdegames/ksokoban/History.C:107)

History::deferRedo(LevelMap *map) {
  if (future_.isEmpty()) return 0;

  Move *m=future_.take(0);
  past_.append(m);
  return new MoveSequence(m, map);
}

bool

ksokoban'History::undo() (./kdegames/ksokoban/History.C:116)

History::undo(LevelMap *map) {
  if (past_.isEmpty()) return false;

  Move *m = past_.take(past_.count ()-1);
  future_.insert(0, m);
  return m->undo(map);
}

MoveSequence *

ksokoban'History::deferUndo() (./kdegames/ksokoban/History.C:125)

History::deferUndo(LevelMap *map) {
  if (past_.isEmpty()) return 0;

  Move *m = past_.take(past_.count()-1);
  future_.insert(0, m);
  return new MoveSequence(m, map, true);
}