i barely had to modify this

This commit is contained in:
in1tiate 2021-01-09 15:13:19 -06:00
parent ee8c6e3df7
commit 3a207dccf0
3 changed files with 99 additions and 9 deletions

View File

@ -254,6 +254,9 @@ public:
void check_connection_received();
// Truncates text so it fits within theme-specified boundaries and sets the tooltip to the full string
void truncate_label_text(QWidget* p_widget, QString p_identifier);
~Courtroom();
private:

View File

@ -62,6 +62,9 @@ void Courtroom::construct_char_select()
SLOT(on_char_passworded_clicked()));
connect(ui_char_taken, SIGNAL(stateChanged(int)), this,
SLOT(on_char_taken_clicked()));
truncate_label_text(ui_char_taken, "char_taken");
truncate_label_text(ui_char_passworded, "char_passworded");
}
void Courtroom::set_char_select()

View File

@ -839,19 +839,23 @@ void Courtroom::set_widgets()
ui_pre->setToolTip(
tr("Play a single-shot animation as defined by the emote when checked."));
design_ini_result =
ao_app->get_element_dimensions("immediate", "courtroom_design.ini");
// If we don't have new-style naming, fall back to the old method
if (design_ini_result.width < 0 || design_ini_result.height < 0)
set_size_and_pos(ui_immediate, "pre_no_interrupt");
else // Adopt the based new method instead
set_size_and_pos(ui_immediate, "immediate");
ui_immediate->setToolTip(
tr("If preanim is checked, display the input text immediately as the "
"animation plays concurrently."));
design_ini_result =
ao_app->get_element_dimensions("immediate", "courtroom_design.ini");
// If we don't have new-style naming, fall back to the old method
if (design_ini_result.width < 0 || design_ini_result.height < 0) {
set_size_and_pos(ui_immediate, "pre_no_interrupt");
truncate_label_text(ui_immediate, "pre_no_interrupt");
}
else {// Adopt the based new method instead
set_size_and_pos(ui_immediate, "immediate");
truncate_label_text(ui_immediate, "immediate");
}
set_size_and_pos(ui_flip, "flip");
ui_flip->setToolTip(tr("Mirror your character's emotes when checked."));
@ -946,6 +950,17 @@ void Courtroom::set_widgets()
ui_spectator->setToolTip(tr("Become a spectator. You won't be able to "
"interact with the in-character screen."));
// QCheckBox
truncate_label_text(ui_guard, "guard");
truncate_label_text(ui_pre, "pre");
truncate_label_text(ui_flip, "flip");
truncate_label_text(ui_showname_enable, "showname_enable");
// QLabel
truncate_label_text(ui_music_label, "music_label");
truncate_label_text(ui_sfx_label, "sfx_label");
truncate_label_text(ui_blip_label, "blip_label");
free_brush =
QBrush(ao_app->get_color("area_free_color", "courtroom_design.ini"));
lfp_brush =
@ -5033,6 +5048,75 @@ void Courtroom::announce_case(QString title, bool def, bool pro, bool jud,
}
}
void Courtroom::truncate_label_text(QWidget *p_widget, QString p_identifier)
{
// Get the pixel width of the string if it were p_widget's label
QString filename = "courtroom_design.ini";
// Get the width of the element as defined by the current theme
pos_size_type design_ini_result =
ao_app->get_element_dimensions(p_identifier, filename);
QLabel *p_label = qobject_cast<QLabel *>(p_widget);
QCheckBox *p_checkbox = qobject_cast<QCheckBox *>(p_widget);
if (p_checkbox == nullptr &&
p_label ==
nullptr) { // i.e. the given p_widget isn't a QLabel or a QCheckBox
qWarning() << "W: Tried to truncate an unsupported widget:" << p_identifier;
return;
}
QString label_text_tr =
QCoreApplication::translate(p_widget->metaObject()->className(), "%1")
.arg((p_label != nullptr ? p_label->text() : p_checkbox->text()));
int label_theme_width =
(p_label != nullptr
? design_ini_result.width
: design_ini_result.width -
18); // 18 is the width of a checkbox on win10 + 5px of
// padding, should probably try to fetch the actual size
int label_px_width =
p_widget->fontMetrics().boundingRect(label_text_tr).width();
p_widget->setToolTip(label_text_tr + "\n" + p_widget->toolTip());
// qInfo() << "I: Width of label text: " << label_px_width << "px. Theme's
// width: " << label_theme_width << "px.";
// we can't do much with a 0-width widget, and there's no need to truncate if
// the theme gives us enough space
if (label_theme_width <= 0 || label_px_width < label_theme_width) {
qInfo() << "I: Truncation aborted for label text " << label_text_tr
<< ", either theme width <= 0 or label width < theme width.";
return;
}
QString truncated_label = label_text_tr;
int truncated_px_width = label_px_width;
while (truncated_px_width > label_theme_width && truncated_label != "") {
truncated_label.chop(2);
truncated_label.append("");
// qInfo() << "I: Attempted to truncate label to string: " <<
// truncated_label;
truncated_px_width =
p_widget->fontMetrics().boundingRect(truncated_label).width();
}
if (truncated_label == "") {
// Safeguard against edge case where label text is shorter in px than '…',
// causing an infinite loop. Additionally, having just an ellipse for a
// label looks strange, so we don't set the new label.
qWarning() << "W: Potential infinite loop prevented: Label text "
<< label_text_tr
<< "truncated to '…', so truncation was aborted.";
return;
}
if (p_label != nullptr)
p_label->setText(truncated_label);
else if (p_checkbox != nullptr)
p_checkbox->setText(truncated_label);
qInfo() << "I: Truncated label text from " << label_text_tr << " ("
<< label_px_width << "px ) to " << truncated_label << " ("
<< truncated_px_width << "px )";
}
Courtroom::~Courtroom()
{
delete music_player;