📄 preview.cpp
字号:
QFile in(selectedFile); if (in.open(IO_ReadOnly)){ in.readLine(magic, MAXPATHLEN); if (magic[strlen(magic)-1]=='\n') magic[strlen(magic)-1]='\0'; if (strncmp(themeMagicV1_0, magic, strlen(magic)) != 0) { in.close(); KMessageBox::sorry(this, i18n("Thats not a valid theme file.")); break; } in.readLine(tilesetRaw, MAXPATHLEN); in.readLine(backRaw, MAXPATHLEN); in.readLine(layoutRaw, MAXPATHLEN); parseFile(tilesetRaw, tile); parseFile(backRaw, back); parseFile(layoutRaw, layout); in.close(); themeBack=back; themeLayout=layout; themeTileset=tile; } } break; } renderBackground(back); renderTiles(tile, layout);}void Preview::paintEvent( QPaintEvent* ){ drawFrame->repaint(false);}void Preview::parseFile(const QString &in, QString &out) { QString tmp; QString prefix; prefix=locate("appdata", "pics/default.tileset"); QFileInfo f(prefix); prefix=f.dirPath(); // remove any trailing \n tmp.replace(QRegExp("\n"), QString::null); tmp.replace(QRegExp(":"), prefix + '/'); out = tmp;}// the user selected ok, or apply. This method passes the changes// across to the game widget and if necessary forces a board redraw// (unnecessary on layout changes since it only effects the next game)void Preview::applyChange(void) { switch (previewType) { case background: loadBackground(selectedFile, false); break; case tileset: loadTileset(selectedFile); break; case board: loadBoard(selectedFile); break; case theme: if (themeLayout != "" && themeBack != "" && themeTileset !="") { loadBackground(themeBack, false); loadTileset(themeTileset); loadBoard(themeLayout); } break; } // don't redraw for a layout change if (previewType == board || previewType == theme) { layoutChange(); } else { boardRedraw(true); } // either way we mark the current value as unchanged markUnchanged(); }// Render the background to the pixmap. void Preview::renderBackground(const QString &bg) { QImage img; QImage tmp; QPixmap *p; QPixmap *b; p = drawFrame->getPreviewPixmap(); back.load(bg, p->width(), p->height()); b = back.getBackground(); bitBlt( p, 0,0, b,0,0, b->width(), b->height(), CopyROP ); } // This method draws a mini-tiled board with no tiles missing.void Preview::renderTiles(const QString &file, const QString &layout) { tiles.loadTileset(file, true); boardLayout.loadBoardLayout(layout); QPixmap *dest = drawFrame->getPreviewPixmap(); int xOffset = tiles.width()/2; int yOffset = tiles.height()/2; short tile = 0; // we iterate over the depth stacking order. Each sucessive level is // drawn one indent up and to the right. The indent is the width // of the 3d relief on the tile left (tile shadow width) for (int z=0; z<BoardLayout::depth; z++) { // we draw down the board so the tile below over rights our border for (int y = 0; y < BoardLayout::height; y++) { // drawing right to left to prevent border overwrite for (int x=BoardLayout::width-1; x>=0; x--) { int sx = x*(tiles.qWidth() )+xOffset; int sy = y*(tiles.qHeight() )+yOffset; if (boardLayout.getBoardData(z, y, x) != '1') { continue; } QPixmap *t = tiles.unselectedPixmaps(tile); // Only one compilcation. Since we render top to bottom , left // to right situations arise where...: // there exists a tile one q height above and to the left // in this situation we would draw our top left border over it // we simply split the tile draw so the top half is drawn // minus border if ((x>1) && (y>0) && boardLayout.getBoardData(z,y-1,x-2)=='1'){ bitBlt( dest, sx+2, sy, t, 2,0, t->width(), t->height()/2, CopyROP ); bitBlt( dest, sx, sy+t->height()/2, t, 0,t->height()/2,t->width(),t->height()/2,CopyROP); } else { bitBlt( dest, sx, sy, t, 0,0, t->width(), t->height(), CopyROP ); } tile++; if (tile == 35) tile++; tile = tile % 43; } } xOffset +=tiles.shadowSize(); yOffset -=tiles.shadowSize(); }} // this really does not belong here. It will be fixed in v1.1 onwardsvoid Preview::saveTheme(void) { QString back = preferences.background(); QString tile = preferences.tileset(); QString layout = preferences.layout(); QString with = ":"; // we want to replace any path in the default store // with a + QRegExp p(locate("data_dir", "/kmahjongg/pics/")); back.replace(p,with); tile.replace(p,with); layout.replace(p,with); // Get the name of the file to save KURL url = KFileDialog::getSaveURL( NULL, "*.theme", parentWidget(), i18n("Save theme." )); if ( url.isEmpty() ) return; if( !url.isLocalFile() ) { KMessageBox::sorry( this, i18n( "Only saving to local files currently supported." ) ); return; } // Are we over writing an existin file, or was a directory selected? QFileInfo f( url.path() ); if( f.isDir() ) return; if (f.exists()) { // if it already exists, querie the user for replacement int res=KMessageBox::warningYesNo(this, i18n("A file with that name " "already exists, do you " "wish to overwrite it?")); if (res != KMessageBox::Yes) return ; } FILE *outFile = fopen( QFile::encodeName(url.path()), "w" ); if (outFile == NULL) { KMessageBox::sorry(this, i18n("Could not write to file. Aborting.")); return; } fprintf(outFile,"%s\n%s\n%s\n%s\n", themeMagicV1_0, tile.utf8().data(), back.utf8().data(), layout.utf8().data()); fclose(outFile);}FrameImage::FrameImage (QWidget *parent, const char *name) : QFrame(parent, name){ rx = -1; thePixmap = new QPixmap();}void FrameImage::setGeometry(int x, int y, int w, int h) { QFrame::setGeometry(x,y,w,h); thePixmap->resize(size());}void FrameImage::paintEvent( QPaintEvent* pa ){ QFrame::paintEvent(pa); QPainter p(this); QPen line; line.setStyle(DotLine); line.setWidth(2); line.setColor(yellow); p.setPen(line); p.setBackgroundMode(OpaqueMode); p.setBackgroundColor(black); int x = pa->rect().left(); int y = pa->rect().top(); int h = pa->rect().height(); int w = pa->rect().width(); p.drawPixmap(x+frameWidth(),y+frameWidth(),*thePixmap,x+frameWidth(),y+frameWidth(),w-(2*frameWidth()),h-(2*frameWidth())); if (rx >=0) { p.drawRect(rx, ry, rw, rh); p.drawRect(rx+rs, ry, rw-rs, rh-rs); p.drawLine(rx, ry+rh, rx+rs, ry+rh-rs); int midX = rx+rs+((rw-rs)/2); int midY = ry+((rh-rs)/2); switch (rt) { case 0: // delete mode cursor p.drawLine(rx+rs, ry, rx+rw, ry+rh-rs); p.drawLine(rx+rw, ry, rx+rs, ry+rh-rs); break; case 1: // insert cursor p.drawLine(midX, ry, midX, ry+rh-rs); p.drawLine(rx+rs, midY, rx+rw, midY); break; case 2: // move mode cursor p.drawLine(midX, ry, rx+rw, midY); p.drawLine(rx+rw, midY, midX, ry+rh-rs); p.drawLine(midX, ry+rh-rs, rx+rs, midY); p.drawLine(rx+rs, midY, midX, ry); break; } }} void FrameImage::setRect(int x,int y,int w,int h, int s, int t) { rx = x; ry = y; rw = w; rh = h; rt = t; rs = s;}// Pass on the mouse presed event to our ownervoid FrameImage::mousePressEvent(QMouseEvent *m) { mousePressed(m);}void FrameImage::mouseMoveEvent(QMouseEvent *e) { mouseMoved(e);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -