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

Class Index

ksame'StoneWidget (./kdegames/ksame/StoneWidget.h:29)

class StoneWidget : public QWidget {
private:
     Q_OBJECT

     int modified;
     //     int marked;            // Anzahl markierter Steine
     

     int stones_x,stones_y;
     int sizex,sizey;
     int field_width,field_height;

     QList<QPoint> history;
     StoneField stonefield;

     // Bildnummer des Steinmovies
     int slice;          

     QPixmap stonemap;
public:
     StoneWidget( QWidget *parent=0, int x=10,int y=10);
     ~StoneWidget();
     
     unsigned int board();
     int score();
     QSize size();
     int colors();
     QSize sizeHint();

     QSize minimumSizeHint();

     
     void newGame(unsigned int board,int colors);
     void reset();
     void unmark();
     int undo(int count=1);
     
     // Spielende abfragen
     bool isGameover();

     virtual void readProperties(KConfig *conf);
     virtual void saveProperties(KConfig *conf);
protected:

     void timerEvent( QTimerEvent *e );
     void paintEvent( QPaintEvent *e );
     void mousePressEvent ( QMouseEvent *e);
     void mouseMoveEvent ( QMouseEvent *e);

     // Eigenschaften des SteinBildes
     int stone_width,stone_height; // Pixelgröße eines Steines.
     int maxcolors;         // Anzahl verschiedener Steine (Y Richtung)
     int maxslices;         // Anzahl Steine eines Movies  (X Richtung)

private:
 
signals: 
     // Ein neues Spiel beginnt
     void s_newgame();

     void s_colors(int colors);
     void s_board(int board);
     void s_score(int score);     
     void s_marked(int m);

     void s_gameover();
     
     // Der Stein (x,y) wurde angeklickt(entfernt), 
     // alle umliegend betroffenen Steine
     // verschwinden automatisch, d.h. kein extra Signal.
     void s_remove(int x,int y);
     
     void s_sizechanged();
};

ksame'StoneWidget::StoneWidget() (./kdegames/ksame/StoneWidget.cpp:38)

StoneWidget::StoneWidget( QWidget *parent, int x, int y ) 
     : QWidget(parent,"StoneWidget"), stonefield(x,y) {

     stonemap = QPixmap(locate("appdata", "stones.png"));
     debug("stones.png %ix%i",stonemap.width(),stonemap.height());

     ASSERT(!stonemap.isNull());
     
     slice=0;
     maxslices=30;
     maxcolors=4;
     
     sizex=x;
     sizey=y;
     debug("size: %i %i",sizex,sizey);
     
     stone_width=stonemap.width()/(maxslices+1);
     stone_height=stonemap.height()/maxcolors;
     
     field_height=stone_height*sizey;
     field_width=stone_width*sizex;
     
     setMouseTracking(true);
     
     QColor c(115,115,115);
     setBackgroundColor(c);
     
     // emit s_sizechanged();
     startTimer( 100 ); 
     history.setAutoDelete(true); 

}


ksame'StoneWidget::~StoneWidget() (./kdegames/ksame/StoneWidget.cpp:71)

StoneWidget::~StoneWidget() {  
     setMouseTracking(false);
     killTimers();
     //   debug("~StoneWidget\n");
}

unsigned int

ksame'StoneWidget::board() (./kdegames/ksame/StoneWidget.cpp:78)

StoneWidget::board() {
     return stonefield.getBoard();
}

int

ksame'StoneWidget::score() (./kdegames/ksame/StoneWidget.cpp:83)

StoneWidget::score() {
     return stonefield.getScore();
}

QSize

ksame'StoneWidget::size() (./kdegames/ksame/StoneWidget.cpp:88)

StoneWidget::size() {
     return QSize(sizex,sizey);
}

int

ksame'StoneWidget::colors() (./kdegames/ksame/StoneWidget.cpp:93)

StoneWidget::colors() {
     return stonefield.getColors();
}

QSize 

ksame'StoneWidget::sizeHint() (./kdegames/ksame/StoneWidget.cpp:98)

StoneWidget::sizeHint () {
     return QSize(field_width,field_height);
}

QSize

ksame'StoneWidget::minimumSizeHint() (./kdegames/ksame/StoneWidget.cpp:103)

StoneWidget::minimumSizeHint() {
     return QSize(field_width,field_height);
}

void 

ksame'StoneWidget::newGame() (./kdegames/ksame/StoneWidget.cpp:108)

StoneWidget::newGame(unsigned int board,int colors) {
     //     debug("StoneWidget::newgame board %i colors %i",board,colors);
     stonefield.newGame(board,colors);
     history.clear();
     emit s_newgame();
     emit s_colors(stonefield.getColors());
     emit s_board(stonefield.getBoard());
}

void 

ksame'StoneWidget::reset() (./kdegames/ksame/StoneWidget.cpp:118)

StoneWidget::reset() {
     stonefield.reset();
     history.clear();
     emit s_newgame();
}

void 

ksame'StoneWidget::unmark() (./kdegames/ksame/StoneWidget.cpp:125)

StoneWidget::unmark() {
     stonefield.unmark();
     emit s_marked(0);
}

int

ksame'StoneWidget::undo() (./kdegames/ksame/StoneWidget.cpp:131)

StoneWidget::undo(int count) {
     if (stonefield.isGameover()) return 0;
     
     int ret_val=stonefield.undo(count);

     QPoint p=mapFromGlobal(cursor().pos());
     int x=p.x();
     int y=p.y();
     if (x<0||y<0||x>=field_width||y>=field_height) {
	  emit s_score(stonefield.getMarked()); 
	  return ret_val;
     }
     
     int marked=stonefield.mark(x/stone_width,y/stone_height);
     emit s_marked(marked);
     slice=0;
     emit s_score(stonefield.getScore()); 
     return ret_val;
}

bool 

ksame'StoneWidget::isGameover() (./kdegames/ksame/StoneWidget.cpp:152)

StoneWidget::isGameover() {
     return stonefield.isGameover();
}

void

ksame'StoneWidget::readProperties() (./kdegames/ksame/StoneWidget.cpp:157)

StoneWidget::readProperties(KConfig *conf) {
     ASSERT(conf);
     
     history.clear();
     
     if (!conf->hasKey("Board")||
	 !conf->hasKey("Colors")||
	 !conf->hasKey("Stones")) {
	  return;
     }
     debug("readprop");
     newGame(conf->readNumEntry("Board"),conf->readNumEntry("Colors"));

     QStrList list;
     conf->readListEntry("Stones",list);
     
     for (const char *item=list.first();item;item=list.next()) {
	  int x=-1,y=-1;
	  if (sscanf(item,"%02X%02X",&x,&y)!=2) break;
	  history.append(new QPoint(x,y));
	  stonefield.remove(x,y);
     }
}


void

ksame'StoneWidget::saveProperties() (./kdegames/ksame/StoneWidget.cpp:183)

StoneWidget::saveProperties(KConfig *conf) {
     ASSERT(conf);
     
     QStrList list(true);
     QString tmp;
     
     for (QPoint *item=history.first();item;item=history.next()) {
	  tmp.sprintf("%02X%02X",item->x(),item->y());
	  list.append(tmp.ascii());
     }

     conf->writeEntry("Stones",list);
     conf->writeEntry("Board",stonefield.getBoard());
     conf->writeEntry("Colors",stonefield.getColors());
}

void

ksame'StoneWidget::timerEvent() (./kdegames/ksame/StoneWidget.cpp:200)

StoneWidget::timerEvent( QTimerEvent * ) {
     QPoint p=mapFromGlobal(cursor().pos());
     int x=p.x();
     int y=p.y();
     if (x<0||y<0||x>=field_width||y>=field_height)
	  stonefield.unmark();
     slice=(slice+1)%maxslices;
     paintEvent(0);
}

void

ksame'StoneWidget::paintEvent() (./kdegames/ksame/StoneWidget.cpp:211)

StoneWidget::paintEvent( QPaintEvent *e ) {
     int x,y;
     int redraw;
  
     //    debug("slice:%i\n",slice);
     Stone *stone=stonefield.getField();
     
     for (y=0;y<field_height;y+=stone_height) {
	  for (x=0;x<field_width;x+=stone_width) {
	       // debug("stone %i %i",x,y);
	       redraw=stone->marked||stone->changed;
	       
	       if (!redraw&&e) {
		    QRect r(x,y,stone_width,stone_height);
		    redraw=r.intersects(e->rect());
	       }
	       if (redraw) {
		    stone->changed=false;
		    if (stone->color) {
			 bitBlt(this,x,y,
				&stonemap,
				stone->marked?stone_width*slice:0,
				(stone->color-1)*stone_height,
				stone_width,stone_height,CopyROP,FALSE);
			 
		    } else {
			 bitBlt(this,x,y,
				&stonemap,stone_width*maxslices,0,
				stone_width,stone_height,CopyROP,FALSE);
		    }
	       }
	       stone++;  // naechster Stein.
	  }
     }
}

void

ksame'StoneWidget::mousePressEvent() (./kdegames/ksame/StoneWidget.cpp:248)

StoneWidget::mousePressEvent ( QMouseEvent *e) {

     if (stonefield.isGameover()) return;
     
     int x=e->pos().x();
     int y=e->pos().y();
     if (x<0||y<0||x>=field_width||y>=field_height) return;
     
     int sx=x/stone_width;
     int sy=y/stone_height;

     if (stonefield.remove(sx, sy)) {
	  history.append(new QPoint(sx, sy));
	  
	  emit s_remove(sx, sy); 

	  stonefield.mark(sx,sy);
	  emit s_marked(stonefield.getMarked());
	  
	  emit s_score(stonefield.getScore()); 
	  if (stonefield.isGameover()) emit s_gameover(); 
     }
}

void

ksame'StoneWidget::mouseMoveEvent() (./kdegames/ksame/StoneWidget.cpp:273)

StoneWidget::mouseMoveEvent ( QMouseEvent *e) { 

     if (stonefield.isGameover()) {
	  stonefield.unmark();
	  emit s_marked(0);
	  return; 
     }

     int x=e->pos().x();
     int y=e->pos().y();
     if (x<0||y<0||x>=field_width||y>=field_height) return;

     int marked=stonefield.mark(x/stone_width,y/stone_height);
     if (marked>=0) {
	  emit s_marked(marked);
	  slice=0;
     }
}