From b59ad1bf3ba79b7265ec74d29f8cd4e976cbafea Mon Sep 17 00:00:00 2001
From: mjbudd77 <mjbudd77@gmail.com>
Date: Thu, 11 Nov 2021 22:22:41 -0500
Subject: [PATCH] Qt TAS Editor bookmarks/branches view in work.

---
 src/drivers/Qt/TasEditor/TasEditorWindow.cpp | 17 +++--
 src/drivers/Qt/TasEditor/TasEditorWindow.h   |  6 +-
 src/drivers/Qt/TasEditor/bookmarks.cpp       | 33 ++++++++-
 src/drivers/Qt/TasEditor/bookmarks.h         | 18 ++++-
 src/drivers/Qt/TasEditor/branches.cpp        | 78 +++++++++++++-------
 src/drivers/Qt/TasEditor/branches.h          | 16 +++-
 6 files changed, 129 insertions(+), 39 deletions(-)

diff --git a/src/drivers/Qt/TasEditor/TasEditorWindow.cpp b/src/drivers/Qt/TasEditor/TasEditorWindow.cpp
index d7c99b46..3c9fd09a 100644
--- a/src/drivers/Qt/TasEditor/TasEditorWindow.cpp
+++ b/src/drivers/Qt/TasEditor/TasEditorWindow.cpp
@@ -270,7 +270,7 @@ void applyMovieInputConfig(void)
 }
 //----------------------------------------------------------------------------
 TasEditorWindow::TasEditorWindow(QWidget *parent)
-	: QDialog( parent, Qt::Window )
+	: QDialog( parent, Qt::Window ), bookmarks(this), branches(this)
 {
 	QSettings  settings;
 	QVBoxLayout *mainLayout;
@@ -1054,8 +1054,10 @@ void TasEditorWindow::buildSideControlPanel(void)
 	recorderGBox  = new QGroupBox( tr("Recorder") );
 	splicerGBox   = new QGroupBox( tr("Splicer") );
 	luaGBox       = new QGroupBox( tr("Lua") );
-	bookmarksGBox = new QGroupBox( tr("BookMarks/Branches") );
 	historyGBox   = new QGroupBox( tr("History") );
+	bbFrame       = new QFrame();
+
+	bbFrame->setFrameShape( QFrame::StyledPanel );
 
 	rewindMkrBtn  = new QPushButton();
 	rewindFrmBtn  = new QPushButton();
@@ -1090,7 +1092,6 @@ void TasEditorWindow::buildSideControlPanel(void)
 	runLuaBtn->setEnabled(false);
 	autoLuaCBox->setChecked(true);
 
-	bkbrTree = new QTreeWidget();
 	histTree = new QTreeWidget();
 
 	histTree->setColumnCount(1);
@@ -1151,9 +1152,13 @@ void TasEditorWindow::buildSideControlPanel(void)
 	hbox->addWidget( autoLuaCBox );
 	luaGBox->setLayout( hbox );
 
+	bkmkBrnchStack = new QTabWidget();
+	bkmkBrnchStack->addTab( &bookmarks, tr("Bookmarks") );
+	bkmkBrnchStack->addTab( &branches , tr("Branches")  );
+
 	vbox = new QVBoxLayout();
-	vbox->addWidget( bkbrTree );
-	bookmarksGBox->setLayout( vbox );
+	vbox->addWidget( bkmkBrnchStack );
+	bbFrame->setLayout( vbox );
 
 	vbox = new QVBoxLayout();
 	vbox->addWidget( histTree );
@@ -1163,7 +1168,7 @@ void TasEditorWindow::buildSideControlPanel(void)
 	ctlPanelMainVbox->addWidget( recorderGBox  );
 	ctlPanelMainVbox->addWidget( splicerGBox   );
 	ctlPanelMainVbox->addWidget( luaGBox       );
-	ctlPanelMainVbox->addWidget( bookmarksGBox );
+	ctlPanelMainVbox->addWidget( bbFrame       );
 	ctlPanelMainVbox->addWidget( historyGBox   );
 
 	hbox = new QHBoxLayout();
diff --git a/src/drivers/Qt/TasEditor/TasEditorWindow.h b/src/drivers/Qt/TasEditor/TasEditorWindow.h
index 7d3dedcb..f5c51b1b 100644
--- a/src/drivers/Qt/TasEditor/TasEditorWindow.h
+++ b/src/drivers/Qt/TasEditor/TasEditorWindow.h
@@ -31,6 +31,8 @@
 #include <QFont>
 #include <QPainter>
 #include <QShortcut>
+#include <QTabWidget>
+#include <QStackedWidget>
 #include <QClipboard>
 
 #include "Qt/TasEditor/taseditor_config.h"
@@ -221,14 +223,15 @@ class TasEditorWindow : public QDialog
 		QLabel     *lowerMarkerLabel;
 		QLineEdit  *upperMarkerNote;
 		QLineEdit  *lowerMarkerNote;
+		QTabWidget *bkmkBrnchStack;
 
 		QVBoxLayout *ctlPanelMainVbox;
 		QGroupBox  *playbackGBox;
 		QGroupBox  *recorderGBox;
 		QGroupBox  *splicerGBox;
 		QGroupBox  *luaGBox;
-		QGroupBox  *bookmarksGBox;
 		QGroupBox  *historyGBox;
+		QFrame     *bbFrame;
 
 		QPushButton *rewindMkrBtn;
 		QPushButton *rewindFrmBtn;
@@ -254,7 +257,6 @@ class TasEditorWindow : public QDialog
 		QPushButton *runLuaBtn;
 		QCheckBox   *autoLuaCBox;
 
-		QTreeWidget *bkbrTree;
 		QTreeWidget *histTree;
 
 		QPushButton *prevMkrBtn;
diff --git a/src/drivers/Qt/TasEditor/bookmarks.cpp b/src/drivers/Qt/TasEditor/bookmarks.cpp
index 1bd30d10..4c97ca81 100644
--- a/src/drivers/Qt/TasEditor/bookmarks.cpp
+++ b/src/drivers/Qt/TasEditor/bookmarks.cpp
@@ -56,7 +56,8 @@ char bookmarksCaption[3][23] = { " Bookmarks ", " Bookmarks / Branches ", " Bran
 //	// deploy
 //	0x43171d, 0x541d21, 0x652325, 0x762929, 0x872f2c, 0x983530, 0xa93b34, 0xba4137, 0xcb463b, 0xdc4c3f, 0xed5243, 0xff5947 };
 
-BOOKMARKS::BOOKMARKS()
+BOOKMARKS::BOOKMARKS(QWidget *parent)
+	: QWidget(parent)
 {
 	// fill TrackMouseEvent struct
 	//tme.cbSize = sizeof(tme);
@@ -67,6 +68,10 @@ BOOKMARKS::BOOKMARKS()
 	//tmeList.hwndTrack = NULL;
 }
 
+BOOKMARKS::~BOOKMARKS(void)
+{
+}
+
 void BOOKMARKS::init()
 {
 	free();
@@ -592,6 +597,32 @@ void BOOKMARKS::redrawBookmarksListRow(int rowIndex)
 	//ListView_RedrawItems(hwndBookmarksList, rowIndex, rowIndex);
 }
 
+void BOOKMARKS::resizeEvent(QResizeEvent *event)
+{
+	viewWidth  = event->size().width();
+	viewHeight = event->size().height();
+}
+
+void BOOKMARKS::paintEvent(QPaintEvent *event)
+{
+
+}
+
+void BOOKMARKS::mousePressEvent(QMouseEvent * event)
+{
+
+}
+
+void BOOKMARKS::mouseReleaseEvent(QMouseEvent * event)
+{
+
+}
+
+void BOOKMARKS::mouseMoveEvent(QMouseEvent * event)
+{
+
+}
+
 void BOOKMARKS::handleMouseMove(int newX, int newY)
 {
 	mouseX = newX;
diff --git a/src/drivers/Qt/TasEditor/bookmarks.h b/src/drivers/Qt/TasEditor/bookmarks.h
index accb0bb8..cefcf1a3 100644
--- a/src/drivers/Qt/TasEditor/bookmarks.h
+++ b/src/drivers/Qt/TasEditor/bookmarks.h
@@ -2,6 +2,8 @@
 #pragma once
 #include <vector>
 
+#include <QWidget>
+
 #include "fceu.h"
 #include "Qt/TasEditor/bookmark.h"
 
@@ -51,10 +53,13 @@ enum
 
 #define DEFAULT_SLOT 1
 
-class BOOKMARKS
+class BOOKMARKS : public QWidget
 {
+	Q_OBJECT
+
 public:
-	BOOKMARKS();
+	BOOKMARKS(QWidget *parent = 0);
+	~BOOKMARKS(void);
 	void init();
 	void free();
 	void reset();
@@ -100,6 +105,13 @@ public:
 
 	//HWND hwndBookmarksList, hwndBranchesBitmap, hwndBookmarks;
 
+protected:
+	void resizeEvent(QResizeEvent *event);
+	void paintEvent(QPaintEvent *event);
+	void mousePressEvent(QMouseEvent * event);
+	void mouseReleaseEvent(QMouseEvent * event);
+	void mouseMoveEvent(QMouseEvent * event);
+
 private:
 	void set(int slot);
 	void jump(int slot);
@@ -114,5 +126,7 @@ private:
 	// GDI stuff
 	//HFONT hBookmarksFont;
 	//HIMAGELIST hImgList;
+	int viewWidth;
+	int viewHeight;
 
 };
diff --git a/src/drivers/Qt/TasEditor/branches.cpp b/src/drivers/Qt/TasEditor/branches.cpp
index ee6b3cb5..0dbbb178 100644
--- a/src/drivers/Qt/TasEditor/branches.cpp
+++ b/src/drivers/Qt/TasEditor/branches.cpp
@@ -48,7 +48,17 @@ Branches - Manager of Branches
 // corners cursor animation
 int corners_cursor_shift[BRANCHES_ANIMATION_FRAMES] = {0, 0, 1, 1, 2, 2, 2, 2, 1, 1, 0, 0 };
 
-BRANCHES::BRANCHES()
+BRANCHES::BRANCHES(QWidget *parent)
+	: QWidget(parent)
+{
+	//this->parent = qobject_cast <TasEditorWindow*>( parent );
+	this->setFocusPolicy(Qt::StrongFocus);
+	this->setMouseTracking(true);
+	this->setMinimumWidth(256);
+	this->setMinimumHeight(128);
+}
+
+BRANCHES::~BRANCHES(void)
 {
 }
 
@@ -461,32 +471,50 @@ error:
 // ----------------------------------------------------------
 void BRANCHES::redrawBranchesBitmap()
 {
+	QWidget::update();
+}
+
+void BRANCHES::paintEvent(QPaintEvent *event)
+{
+	QPainter painter(this);
+
+	viewWidth  = event->rect().width();
+	viewHeight = event->rect().height();
+
 //	// draw background
-//	GradientFill(hBitmapDC, vertex, 2, &gRect, 1, GRADIENT_FILL_RECT_H);
+	QLinearGradient linearGrad(QPointF(0, 0), QPointF(viewWidth, viewHeight));
+    	linearGrad.setColorAt(0, QColor(0xBF,0xE2,0xEF));
+    	linearGrad.setColorAt(1, QColor(0xE5,0xFB,0xFF));
+
+	painter.fillRect( 0, 0, viewWidth, viewHeight, linearGrad );
+
 //	// lines
-//	int branch, tempBranchX, tempBranchY, parentX, parentY, childID;
-//	SelectObject(hBitmapDC, normalPen);
-//	for (int t = children.size() - 1; t >= 0; t--)
-//	{
-//		if (t > 0)
-//		{
-//			parentX = branchCurrentX[t-1];
-//			parentY = branchCurrentY[t-1];
-//		} else
-//		{
-//			parentX = cloudCurrentX;
-//			parentY = BRANCHES_CLOUD_Y;
-//		}
-//		for (int i = children[t].size() - 1; i >= 0; i--)
-//		{
-//			childID = children[t][i];
-//			if (childID < TOTAL_BOOKMARKS)
-//			{
-//				MoveToEx(hBitmapDC, parentX, parentY, 0);
-//				LineTo(hBitmapDC, branchCurrentX[childID], branchCurrentY[childID]);
-//			}
-//		}
-//	}
+	int branch, tempBranchX, tempBranchY, parentX, parentY, childID;
+	//SelectObject(hBitmapDC, normalPen);
+	painter.setPen( QColor( 0, 0, 0 ) );
+
+	for (int t = children.size() - 1; t >= 0; t--)
+	{
+		if (t > 0)
+		{
+			parentX = branchCurrentX[t-1];
+			parentY = branchCurrentY[t-1];
+		} else
+		{
+			parentX = cloudCurrentX;
+			parentY = BRANCHES_CLOUD_Y;
+		}
+		for (int i = children[t].size() - 1; i >= 0; i--)
+		{
+			childID = children[t][i];
+			if (childID < TOTAL_BOOKMARKS)
+			{
+				//MoveToEx(hBitmapDC, parentX, parentY, 0);
+				//LineTo(hBitmapDC, branchCurrentX[childID], branchCurrentY[childID]);
+				painter.drawLine( parentX, parentY, branchCurrentX[childID], branchCurrentY[childID] );
+			}
+		}
+	}
 //	// lines for current timeline
 //	if (currentBranch != ITEM_UNDER_MOUSE_CLOUD)
 //	{
diff --git a/src/drivers/Qt/TasEditor/branches.h b/src/drivers/Qt/TasEditor/branches.h
index 326ab29a..9b303cb9 100644
--- a/src/drivers/Qt/TasEditor/branches.h
+++ b/src/drivers/Qt/TasEditor/branches.h
@@ -3,6 +3,8 @@
 #include <stdint.h>
 #include <vector>
 
+#include <QWidget>
+
 #define BRANCHES_ANIMATION_TICK 40		// animate at 25FPS
 #define BRANCHES_TRANSITION_MAX 12
 #define CURSOR_MIN_DISTANCE 1.0
@@ -96,10 +98,13 @@
 
 #define FIRST_DIFFERENCE_UNKNOWN -2
 
-class BRANCHES
+class BRANCHES : public QWidget
 {
+	Q_OBJECT
+
 public:
-	BRANCHES();
+	BRANCHES(QWidget *parent = 0);
+	~BRANCHES(void);
 	void init();
 	void free();
 	void reset();
@@ -133,6 +138,9 @@ public:
 	bool mustRecalculateBranchesTree;
 	int branchRightclicked;
 
+protected:
+	void paintEvent(QPaintEvent *event);
+
 private:
 	void setCurrentPosTimestamp();
 
@@ -177,11 +185,13 @@ private:
 	//TRIVERTEX vertex[2];
 	//GRADIENT_RECT gRect;
 	//RECT branchesBitmapRect;
+	
+	int  viewWidth;
+	int  viewHeight;
 
 	// temps
 	std::vector<int> gridX;				// measured in grid units, not in pixels
 	std::vector<int> gridY;
 	std::vector<int> gridHeight;
 	std::vector<std::vector<uint8_t>> children;
-
 };