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;
}
}