fix: bugs surfaced by new gtest coverage

- html.cpp: rgba() colors parsed with setRedF/GreenF/BlueF (0-1) while the
  writer emits 0-255 integers, so semi-transparent text colors lost their
  RGB on round-trip; parse with integer setters instead
- CLIProgressDialog: percentage padding compared normalized progress
  (0.0-1.0) against 10/100, so padding was always fully applied; compute
  the percentage first
- TimelineUndoPointer BlockTrimCommand: remove_block_from_graph_ was
  never initialized (UB on redo)
- TimelineUndoGeneral TransitionRemoveCommand: track_ was never
  initialized; GetRelevantProject() could dereference it before redo()
- ProjectLoadTask::Run(): failure path deleted project_ without
  resetting it, leaving GetLoadedProject() dangling
This commit is contained in:
2026-07-17 13:07:43 +08:00
parent a9afb2fac5
commit dd7427f51a
5 changed files with 15 additions and 6 deletions
+8 -3
View File
@@ -86,15 +86,20 @@ void CLIProgressDialog::Update()
std::cout << "] "; std::cout << "] ";
if (progress_ < 100) { // Pad the percentage so single/double/triple digit values all occupy the
// same width. Note progress_ is normalized (0.0-1.0), so the percentage
// must be computed before comparing against 10/100.
const int percent = qRound(progress_ * 100.0);
if (percent < 100) {
std::cout << " "; std::cout << " ";
} }
if (progress_ < 10) { if (percent < 10) {
std::cout << " "; std::cout << " ";
} }
std::cout << qRound(progress_ * 100.0) << "% " << std::endl << std::flush; std::cout << percent << "% " << std::endl << std::flush;
} }
void CLIProgressDialog::SetProgress(double p) void CLIProgressDialog::SetProgress(double p)
+3 -3
View File
@@ -356,9 +356,9 @@ QTextCharFormat Html::ReadCharFormat(const QXmlStreamAttributes &attributes)
QStringList rgba = vals_only.split(','); QStringList rgba = vals_only.split(',');
if (rgba.size() == 4) { if (rgba.size() == 4) {
QColor c; QColor c;
c.setRedF(rgba.at(0).toDouble()); c.setRed(rgba.at(0).toInt()); // Writer emits 0-255 RGB (CSS rgba() convention)
c.setGreenF(rgba.at(1).toDouble()); c.setGreen(rgba.at(1).toInt());
c.setBlueF(rgba.at(2).toDouble()); c.setBlue(rgba.at(2).toInt());
c.setAlphaF(rgba.at(3).toDouble()); c.setAlphaF(rgba.at(3).toDouble());
fmt.setForeground(c); fmt.setForeground(c);
} }
+1
View File
@@ -82,6 +82,7 @@ bool ProjectLoadTask::Run()
return true; return true;
} else { } else {
delete project_; delete project_;
project_ = nullptr;
return false; return false;
} }
} }
+2
View File
@@ -25,6 +25,7 @@
#include "config/config.h" #include "config/config.h"
#include "node/block/clip/clip.h" #include "node/block/clip/clip.h"
#include "node/block/gap/gap.h" #include "node/block/gap/gap.h"
#include "node/block/transition/transition.h"
#include "node/output/track/track.h" #include "node/output/track/track.h"
#include "node/output/track/tracklist.h" #include "node/output/track/tracklist.h"
#include "node/output/viewer/viewer.h" #include "node/output/viewer/viewer.h"
@@ -201,6 +202,7 @@ class TransitionRemoveCommand : public UndoCommand {
public: public:
TransitionRemoveCommand(TransitionBlock *block, bool remove_from_graph) TransitionRemoveCommand(TransitionBlock *block, bool remove_from_graph)
: block_(block) : block_(block)
, track_(block->track())
, remove_from_graph_(remove_from_graph) , remove_from_graph_(remove_from_graph)
, remove_command_(nullptr) , remove_command_(nullptr)
{ {
+1
View File
@@ -52,6 +52,7 @@ public:
, mode_(mode) , mode_(mode)
, deleted_adjacent_command_(nullptr) , deleted_adjacent_command_(nullptr)
, trim_is_a_roll_edit_(false) , trim_is_a_roll_edit_(false)
, remove_block_from_graph_(true)
{ {
} }