diff --git a/resources.qrc b/resources.qrc
index e0ecde09..2de6e21e 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -27,5 +27,6 @@
icons/JumpTarget.png
icons/Undo.png
icons/find.png
+ icons/cloud.png
diff --git a/src/drivers/Qt/TasEditor/bookmarks.cpp b/src/drivers/Qt/TasEditor/bookmarks.cpp
index 6702858f..5a274c58 100644
--- a/src/drivers/Qt/TasEditor/bookmarks.cpp
+++ b/src/drivers/Qt/TasEditor/bookmarks.cpp
@@ -606,6 +606,10 @@ error:
void BOOKMARKS::redrawBookmarksSectionCaption()
{
int prev_edit_mode = editMode;
+ if ( taseditorConfig == NULL )
+ {
+ return;
+ }
if (taseditorConfig->displayBranchesTree)
{
editMode = EDIT_MODE_BRANCHES;
diff --git a/src/drivers/Qt/TasEditor/branches.cpp b/src/drivers/Qt/TasEditor/branches.cpp
index 321be692..90f2bf7a 100644
--- a/src/drivers/Qt/TasEditor/branches.cpp
+++ b/src/drivers/Qt/TasEditor/branches.cpp
@@ -23,9 +23,12 @@ Branches - Manager of Branches
#include
#include
+#include
+
#include "utils/xstring.h"
-#include
-#include
+#include "Qt/fceuWrapper.h"
+#include "Qt/TasEditor/taseditor_project.h"
+#include "Qt/TasEditor/TasEditorWindow.h"
//LRESULT APIENTRY BranchesBitmapWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
@@ -51,17 +54,51 @@ int corners_cursor_shift[BRANCHES_ANIMATION_FRAMES] = {0, 0, 1, 1, 2, 2, 2, 2, 1
BRANCHES::BRANCHES(QWidget *parent)
: QWidget(parent)
{
+ std::string fontString;
+
//this->parent = qobject_cast ( parent );
this->setFocusPolicy(Qt::StrongFocus);
this->setMouseTracking(true);
this->setMinimumWidth(BRANCHES_BITMAP_WIDTH);
this->setMinimumHeight(BRANCHES_BITMAP_HEIGHT);
+
+ g_config->getOption("SDL.TasBranchFont", &fontString);
+
+ if ( fontString.size() > 0 )
+ {
+ font.fromString( QString::fromStdString( fontString ) );
+ }
+ else
+ {
+ font.setFamily("Courier New");
+ font.setStyle( QFont::StyleNormal );
+ font.setStyleHint( QFont::Monospace );
+ }
+
+ calcFontData();
}
BRANCHES::~BRANCHES(void)
{
}
+//----------------------------------------------------------------------------
+void BRANCHES::calcFontData(void)
+{
+ QWidget::setFont(font);
+ QFontMetrics metrics(font);
+#if QT_VERSION > QT_VERSION_CHECK(5, 11, 0)
+ pxCharWidth = metrics.horizontalAdvance(QLatin1Char('2'));
+#else
+ pxCharWidth = metrics.width(QLatin1Char('2'));
+#endif
+ pxCharHeight = metrics.capHeight();
+ pxLineSpacing = metrics.lineSpacing();
+
+ pxBoxWidth = pxLineSpacing;
+ pxBoxHeight = pxLineSpacing;
+}
+
void BRANCHES::init()
{
free();
@@ -120,7 +157,7 @@ void BRANCHES::init()
for (int i = TOTAL_BOOKMARKS; i >= 0; i--)
{
branchX[i] = branchPreviousX[i] = branchCurrentX[i] = EMPTY_BRANCHES_X_BASE;
- branchY[i] = branchPreviousY[i] = branchCurrentY[i] = EMPTY_BRANCHES_Y_BASE + EMPTY_BRANCHES_Y_FACTOR * ((i + TOTAL_BOOKMARKS - 1) % TOTAL_BOOKMARKS);
+ branchY[i] = branchPreviousY[i] = branchCurrentY[i] = EMPTY_BRANCHES_Y_BASE + pxBoxHeight * ((i + TOTAL_BOOKMARKS - 1) % TOTAL_BOOKMARKS);
}
reset();
cornersCursorX = cornersCursorY = 0;
@@ -227,7 +264,7 @@ void BRANCHES::reset()
branchPreviousX[i] = branchCurrentX[i];
branchPreviousY[i] = branchCurrentY[i];
branchX[i] = EMPTY_BRANCHES_X_BASE;
- branchY[i] = EMPTY_BRANCHES_Y_BASE + EMPTY_BRANCHES_Y_FACTOR * ((i + TOTAL_BOOKMARKS - 1) % TOTAL_BOOKMARKS);
+ branchY[i] = EMPTY_BRANCHES_Y_BASE + pxBoxHeight * ((i + TOTAL_BOOKMARKS - 1) % TOTAL_BOOKMARKS);
}
cloudPreviousX = cloudCurrentX;
cloudX = cloudCurrentX = BRANCHES_CLOUD_X;
@@ -515,6 +552,10 @@ void BRANCHES::redrawBranchesBitmap()
void BRANCHES::paintEvent(QPaintEvent *event)
{
+ int x,y;
+ char txt[4];
+ QPixmap cloud(":/icons/cloud.png");
+
QPainter painter(this);
viewWidth = event->rect().width();
@@ -623,73 +664,112 @@ void BRANCHES::paintEvent(QPaintEvent *event)
}
}
}
-// if (changesSinceCurrentBranch)
-// {
-// if (isSafeToShowBranchesData() && bookmarks->itemUnderMouse == ITEM_UNDER_MOUSE_FIREBALL)
-// SelectObject(hBitmapDC, selectPen);
-// else
-// SelectObject(hBitmapDC, timelinePen);
-// if (currentBranch == ITEM_UNDER_MOUSE_CLOUD)
-// {
-// parentX = cloudCurrentX;
-// parentY = BRANCHES_CLOUD_Y;
-// } else
-// {
-// parentX = branchCurrentX[currentBranch];
-// parentY = branchCurrentY[currentBranch];
-// }
-// MoveToEx(hBitmapDC, parentX, parentY, 0);
-// tempBranchX = branchCurrentX[ITEM_UNDER_MOUSE_FIREBALL];
-// tempBranchY = branchCurrentY[ITEM_UNDER_MOUSE_FIREBALL];
-// LineTo(hBitmapDC, tempBranchX, tempBranchY);
-// }
+ if (changesSinceCurrentBranch)
+ {
+ if (isSafeToShowBranchesData() && bookmarks->itemUnderMouse == ITEM_UNDER_MOUSE_FIREBALL)
+ {
+ //SelectObject(hBitmapDC, selectPen);
+ }
+ else
+ {
+ //SelectObject(hBitmapDC, timelinePen);
+ }
+ if (currentBranch == ITEM_UNDER_MOUSE_CLOUD)
+ {
+ parentX = cloudCurrentX;
+ parentY = BRANCHES_CLOUD_Y;
+ }
+ else
+ {
+ parentX = branchCurrentX[currentBranch];
+ parentY = branchCurrentY[currentBranch];
+ }
+ //MoveToEx(hBitmapDC, parentX, parentY, 0);
+ tempBranchX = branchCurrentX[ITEM_UNDER_MOUSE_FIREBALL];
+ tempBranchY = branchCurrentY[ITEM_UNDER_MOUSE_FIREBALL];
+ //LineTo(hBitmapDC, tempBranchX, tempBranchY);
+ painter.drawLine( parentX, parentY, tempBranchX, tempBranchY );
+ }
// // cloud
// TransparentBlt(hBitmapDC, cloudCurrentX - BRANCHES_CLOUD_HALFWIDTH, BRANCHES_CLOUD_Y - BRANCHES_CLOUD_HALFHEIGHT, BRANCHES_CLOUD_WIDTH, BRANCHES_CLOUD_HEIGHT, hSpritesheetDC, BRANCHES_CLOUD_SPRITESHEET_X, BRANCHES_CLOUD_SPRITESHEET_Y, BRANCHES_CLOUD_WIDTH, BRANCHES_CLOUD_HEIGHT, 0x00FF00);
+ painter.drawPixmap( cloudCurrentX - BRANCHES_CLOUD_HALFWIDTH, BRANCHES_CLOUD_Y - BRANCHES_CLOUD_HALFHEIGHT, BRANCHES_CLOUD_WIDTH, BRANCHES_CLOUD_HEIGHT, cloud );
+
// // branches rectangles
-// for (int i = 0; i < TOTAL_BOOKMARKS; ++i)
-// {
-// tempRect.left = branchCurrentX[i] - DIGIT_RECT_HALFWIDTH;
-// tempRect.top = branchCurrentY[i] - DIGIT_RECT_HALFHEIGHT;
-// tempRect.right = tempRect.left + DIGIT_RECT_WIDTH;
-// tempRect.bottom = tempRect.top + DIGIT_RECT_HEIGHT;
-// if (!bookmarks->bookmarksArray[i].notEmpty && bookmarks->bookmarksArray[i].floatingPhase > 0)
-// {
-// tempRect.left += bookmarks->bookmarksArray[i].floatingPhase;
-// tempRect.right += bookmarks->bookmarksArray[i].floatingPhase;
-// }
-// if (bookmarks->bookmarksArray[i].flashPhase)
-// {
-// // draw colored rect
-// HBRUSH color_brush = CreateSolidBrush(bookmark_flash_colors[bookmarks.bookmarksArray[i].flashType][bookmarks.bookmarksArray[i].flashPhase]);
-// FrameRect(hBitmapDC, &tempRect, color_brush);
-// DeleteObject(color_brush);
-// } else
-// {
-// // draw black rect
-// FrameRect(hBitmapDC, &tempRect, normalBrush);
-// }
-// }
-// // digits
-// for (int i = 0; i < TOTAL_BOOKMARKS; ++i)
-// {
-// tempBranchX = branchCurrentX[i] - DIGIT_BITMAP_HALFWIDTH;
-// tempBranchY = branchCurrentY[i] - DIGIT_BITMAP_HALFHEIGHT;
-// if (i == currentBranch)
-// {
-// if (i == bookmarks.itemUnderMouse)
-// BitBlt(hBitmapDC, tempBranchX, tempBranchY, DIGIT_BITMAP_WIDTH, DIGIT_BITMAP_HEIGHT, hSpritesheetDC, i * DIGIT_BITMAP_WIDTH + BLUE_DIGITS_SPRITESHEET_DX, MOUSEOVER_DIGITS_SPRITESHEET_DY, SRCCOPY);
-// else
-// BitBlt(hBitmapDC, tempBranchX, tempBranchY, DIGIT_BITMAP_WIDTH, DIGIT_BITMAP_HEIGHT, hSpritesheetDC, i * DIGIT_BITMAP_WIDTH + BLUE_DIGITS_SPRITESHEET_DX, 0, SRCCOPY);
-// } else
-// {
-// if (!bookmarks.bookmarksArray[i].notEmpty && bookmarks.bookmarksArray[i].floatingPhase > 0)
-// tempBranchX += bookmarks.bookmarksArray[i].floatingPhase;
-// if (i == bookmarks.itemUnderMouse)
-// BitBlt(hBitmapDC, tempBranchX, tempBranchY, DIGIT_BITMAP_WIDTH, DIGIT_BITMAP_HEIGHT, hSpritesheetDC, i * DIGIT_BITMAP_WIDTH, MOUSEOVER_DIGITS_SPRITESHEET_DY, SRCCOPY);
-// else
-// BitBlt(hBitmapDC, tempBranchX, tempBranchY, DIGIT_BITMAP_WIDTH, DIGIT_BITMAP_HEIGHT, hSpritesheetDC, i * DIGIT_BITMAP_WIDTH, 0, SRCCOPY);
-// }
-// }
+ for (int i = 0; i < TOTAL_BOOKMARKS; ++i)
+ {
+ x = branchCurrentX[i] - pxBoxWidth/2;
+ y = branchCurrentY[i] - pxBoxHeight/2;
+ //tempRect.right = tempRect.left + DIGIT_RECT_WIDTH;
+ //tempRect.bottom = tempRect.top + DIGIT_RECT_HEIGHT;
+ if (!bookmarks->bookmarksArray[i].notEmpty && bookmarks->bookmarksArray[i].floatingPhase > 0)
+ {
+ //tempRect.left += bookmarks->bookmarksArray[i].floatingPhase;
+ //tempRect.right += bookmarks->bookmarksArray[i].floatingPhase;
+ }
+ if (bookmarks->bookmarksArray[i].flashPhase)
+ {
+ // draw colored rect
+ //HBRUSH color_brush = CreateSolidBrush(bookmark_flash_colors[bookmarks.bookmarksArray[i].flashType][bookmarks.bookmarksArray[i].flashPhase]);
+ //FrameRect(hBitmapDC, &tempRect, color_brush);
+ //DeleteObject(color_brush);
+ }
+ else
+ {
+ painter.setPen( QColor( 0x0, 0x0, 0x0 ) );
+ // draw black rect
+ //FrameRect(hBitmapDC, &tempRect, normalBrush);
+ }
+ if (i == bookmarks->itemUnderMouse)
+ {
+ painter.fillRect( x, y, pxBoxWidth, pxBoxHeight, QColor(255,235,154) );
+ }
+ else
+ {
+ painter.fillRect( x, y, pxBoxWidth, pxBoxHeight, QColor(255,255,255) );
+ }
+ painter.drawRect( x, y, pxBoxWidth, pxBoxHeight );
+ }
+ // digits
+ for (int i = 0; i < TOTAL_BOOKMARKS; ++i)
+ {
+ txt[0] = i + '0';
+ txt[1] = 0;
+
+ tempBranchX = branchCurrentX[i] - pxCharWidth/2;
+ tempBranchY = branchCurrentY[i] + pxCharHeight/2;
+
+ if (i == currentBranch)
+ {
+ if (i == bookmarks->itemUnderMouse)
+ {
+ //BitBlt(hBitmapDC, tempBranchX, tempBranchY, DIGIT_BITMAP_WIDTH, DIGIT_BITMAP_HEIGHT, hSpritesheetDC, i * DIGIT_BITMAP_WIDTH + BLUE_DIGITS_SPRITESHEET_DX, MOUSEOVER_DIGITS_SPRITESHEET_DY, SRCCOPY);
+ }
+ else
+ {
+ //BitBlt(hBitmapDC, tempBranchX, tempBranchY, DIGIT_BITMAP_WIDTH, DIGIT_BITMAP_HEIGHT, hSpritesheetDC, i * DIGIT_BITMAP_WIDTH + BLUE_DIGITS_SPRITESHEET_DX, 0, SRCCOPY);
+ }
+ painter.setPen( QColor( 58, 179, 255 ) );
+ painter.drawText( tempBranchX, tempBranchY, tr(txt) );
+ }
+ else
+ {
+ painter.setPen( QColor( 0, 194, 64 ) );
+
+ if (!bookmarks->bookmarksArray[i].notEmpty && bookmarks->bookmarksArray[i].floatingPhase > 0)
+ {
+ tempBranchX += bookmarks->bookmarksArray[i].floatingPhase;
+ }
+ if (i == bookmarks->itemUnderMouse)
+ {
+ //BitBlt(hBitmapDC, tempBranchX, tempBranchY, DIGIT_BITMAP_WIDTH, DIGIT_BITMAP_HEIGHT, hSpritesheetDC, i * DIGIT_BITMAP_WIDTH, MOUSEOVER_DIGITS_SPRITESHEET_DY, SRCCOPY);
+ }
+ else
+ {
+ //BitBlt(hBitmapDC, tempBranchX, tempBranchY, DIGIT_BITMAP_WIDTH, DIGIT_BITMAP_HEIGHT, hSpritesheetDC, i * DIGIT_BITMAP_WIDTH, 0, SRCCOPY);
+ }
+ painter.drawText( tempBranchX, tempBranchY, tr(txt) );
+ }
+ }
// if (isSafeToShowBranchesData())
// {
// SetBkMode(hBitmapDC, TRANSPARENT);
@@ -1274,7 +1354,7 @@ void BRANCHES::recalculateBranchesTree()
} else
{
branchX[i] = EMPTY_BRANCHES_X_BASE;
- branchY[i] = EMPTY_BRANCHES_Y_BASE + EMPTY_BRANCHES_Y_FACTOR * ((i + TOTAL_BOOKMARKS - 1) % TOTAL_BOOKMARKS);
+ branchY[i] = EMPTY_BRANCHES_Y_BASE + pxBoxHeight * ((i + TOTAL_BOOKMARKS - 1) % TOTAL_BOOKMARKS);
}
if (max_x < branchX[i]) max_x = branchX[i];
}
@@ -1283,17 +1363,21 @@ void BRANCHES::recalculateBranchesTree()
// also set pixel position of "current_pos"
branchX[ITEM_UNDER_MOUSE_FIREBALL] = cloud_prefix + gridX[ITEM_UNDER_MOUSE_FIREBALL] * grid_width;
branchY[ITEM_UNDER_MOUSE_FIREBALL] = BRANCHES_CLOUD_Y + gridY[ITEM_UNDER_MOUSE_FIREBALL] * grid_halfheight;
- } else if (currentBranch >= 0)
+ }
+ else if (currentBranch >= 0)
{
branchX[ITEM_UNDER_MOUSE_FIREBALL] = cloud_prefix + gridX[currentBranch] * grid_width;
branchY[ITEM_UNDER_MOUSE_FIREBALL] = BRANCHES_CLOUD_Y + gridY[currentBranch] * grid_halfheight;
- } else
+ }
+ else
{
branchX[ITEM_UNDER_MOUSE_FIREBALL] = 0;
branchY[ITEM_UNDER_MOUSE_FIREBALL] = BRANCHES_CLOUD_Y;
}
if (max_x < branchX[ITEM_UNDER_MOUSE_FIREBALL])
+ {
max_x = branchX[ITEM_UNDER_MOUSE_FIREBALL];
+ }
// align whole tree horizontally
cloudX = (BRANCHES_BITMAP_WIDTH + BASE_HORIZONTAL_SHIFT - max_x) / 2;
diff --git a/src/drivers/Qt/TasEditor/branches.h b/src/drivers/Qt/TasEditor/branches.h
index 9b303cb9..7876a5f2 100644
--- a/src/drivers/Qt/TasEditor/branches.h
+++ b/src/drivers/Qt/TasEditor/branches.h
@@ -3,6 +3,7 @@
#include
#include
+#include
#include
#define BRANCHES_ANIMATION_TICK 40 // animate at 25FPS
@@ -142,6 +143,7 @@ protected:
void paintEvent(QPaintEvent *event);
private:
+ void calcFontData(void);
void setCurrentPosTimestamp();
void recalculateParents();
@@ -186,8 +188,15 @@ private:
//GRADIENT_RECT gRect;
//RECT branchesBitmapRect;
+ QFont font;
+
int viewWidth;
int viewHeight;
+ int pxCharWidth;
+ int pxCharHeight;
+ int pxLineSpacing;
+ int pxBoxWidth;
+ int pxBoxHeight;
// temps
std::vector gridX; // measured in grid units, not in pixels