Implement sticker logic with animated image support (#414)

* Implement sticker logic with animated image support (will probably be remade in a much better way for AOLayers)

* port to aolayer

Co-authored-by: in1tiate <radwoodward@vikings.grayson.edu>
This commit is contained in:
Crystalwarrior 2021-01-19 16:02:28 +03:00 committed by GitHub
parent 8c60fb2fcd
commit 0926f3c158
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 47 additions and 4 deletions

View File

@ -211,4 +211,11 @@ public:
InterfaceLayer(QWidget *p_parent, AOApplication *p_ao_app); InterfaceLayer(QWidget *p_parent, AOApplication *p_ao_app);
void load_image(QString p_filename, QString p_miscname); void load_image(QString p_filename, QString p_miscname);
}; };
class StickerLayer : public AOLayer {
Q_OBJECT
public:
StickerLayer(QWidget *p_parent, AOApplication *p_ao_app);
void load_image(QString p_charname);
};
#endif // AOLAYER_H #endif // AOLAYER_H

View File

@ -617,6 +617,8 @@ private:
ScrollText *ui_music_name; ScrollText *ui_music_name;
InterfaceLayer *ui_music_display; InterfaceLayer *ui_music_display;
StickerLayer *ui_vp_sticker;
AOButton *ui_pair_button; AOButton *ui_pair_button;
QListWidget *ui_pair_list; QListWidget *ui_pair_list;
QSpinBox *ui_pair_offset_spinbox; QSpinBox *ui_pair_offset_spinbox;

View File

@ -49,6 +49,11 @@ InterfaceLayer::InterfaceLayer(QWidget *p_parent, AOApplication *p_ao_app)
{ {
} }
StickerLayer::StickerLayer(QWidget *p_parent, AOApplication *p_ao_app)
: AOLayer(p_parent, p_ao_app)
{
}
QString AOLayer::find_image(QList<QString> p_list) QString AOLayer::find_image(QList<QString> p_list)
{ {
QString image_path; QString image_path;
@ -278,6 +283,25 @@ void InterfaceLayer::load_image(QString p_filename, QString p_miscname)
start_playback(find_image(pathlist)); start_playback(find_image(pathlist));
} }
void StickerLayer::load_image(QString p_charname)
{
QString miscname = ao_app->get_char_shouts(p_charname);
transform_mode = ao_app->get_misc_scaling(miscname);
QList<QString> pathlist = {
ao_app->get_image_suffix(ao_app->get_base_path() + "misc/" +
miscname + "/sticker/" + p_charname), // Misc path
ao_app->get_image_suffix(ao_app->get_custom_theme_path(miscname, "sticker/" + p_charname)), // Custom theme path
ao_app->get_image_suffix(ao_app->get_theme_path("sticker/" + p_charname)), // Theme path
ao_app->get_image_suffix(
ao_app->get_default_theme_path("sticker/" + p_charname)), // Default theme path
ao_app->get_image_suffix(
ao_app->get_character_path(p_charname, "sticker")), // Character folder
ao_app->get_image_suffix(
ao_app->get_character_path(p_charname, "showname")), // Scuffed DRO way
};
start_playback(find_image(pathlist));
}
void CharLayer::start_playback(QString p_image) void CharLayer::start_playback(QString p_image)
{ {
movie_effects.clear(); movie_effects.clear();

View File

@ -134,6 +134,10 @@ Courtroom::Courtroom(AOApplication *p_ao_app) : QMainWindow()
// todo: filter out \n from showing up as that commonly breaks the chatlog and // todo: filter out \n from showing up as that commonly breaks the chatlog and
// can be spammed to hell // can be spammed to hell
ui_vp_sticker = new StickerLayer(ui_viewport, ao_app);
ui_vp_sticker->set_play_once(false);
ui_vp_sticker->setAttribute(Qt::WA_TransparentForMouseEvents);
ui_muted = new AOImage(ui_ic_chat_message, ao_app); ui_muted = new AOImage(ui_ic_chat_message, ao_app);
ui_muted->hide(); ui_muted->hide();
@ -534,9 +538,6 @@ void Courtroom::set_widgets()
ui_vp_desk->move(0, 0); ui_vp_desk->move(0, 0);
ui_vp_desk->combo_resize(ui_viewport->width(), ui_viewport->height()); ui_vp_desk->combo_resize(ui_viewport->width(), ui_viewport->height());
double y_modifier = 147.0 / 192.0;
int final_y = static_cast<int>(y_modifier * ui_viewport->height());
ui_vp_evidence_display->move(0, 0); ui_vp_evidence_display->move(0, 0);
ui_vp_evidence_display->combo_resize(ui_viewport->width(), ui_vp_evidence_display->combo_resize(ui_viewport->width(),
ui_viewport->height()); ui_viewport->height());
@ -651,7 +652,7 @@ void Courtroom::set_widgets()
ao_app->get_element_dimensions("music_display", "courtroom_design.ini"); ao_app->get_element_dimensions("music_display", "courtroom_design.ini");
if (design_ini_result.width < 0 || design_ini_result.height < 0) { if (design_ini_result.width < 0 || design_ini_result.height < 0) {
qDebug() << "W: could not find \"music_name\" in courtroom_design.ini"; qDebug() << "W: could not find \"music_display\" in courtroom_design.ini";
ui_music_display->hide(); ui_music_display->hide();
} }
else { else {
@ -661,6 +662,7 @@ void Courtroom::set_widgets()
} }
ui_music_display->load_image("music_display", ""); ui_music_display->load_image("music_display", "");
if (is_ao2_bg) { if (is_ao2_bg) {
set_size_and_pos(ui_ic_chat_message, "ao2_ic_chat_message"); set_size_and_pos(ui_ic_chat_message, "ao2_ic_chat_message");
// set_size_and_pos(ui_vp_chatbox, "ao2_chatbox"); // set_size_and_pos(ui_vp_chatbox, "ao2_chatbox");
@ -691,6 +693,10 @@ void Courtroom::set_widgets()
ui_vp_message->y() + ui_vp_chatbox->y()); ui_vp_message->y() + ui_vp_chatbox->y());
ui_vp_message->setTextInteractionFlags(Qt::NoTextInteraction); ui_vp_message->setTextInteractionFlags(Qt::NoTextInteraction);
ui_vp_sticker->move(0, 0);
ui_vp_sticker->combo_resize(ui_viewport->width(),
ui_viewport->height());
ui_muted->resize(ui_ic_chat_message->width(), ui_ic_chat_message->height()); ui_muted->resize(ui_ic_chat_message->width(), ui_ic_chat_message->height());
ui_muted->set_image("muted"); ui_muted->set_image("muted");
ui_muted->setToolTip(tr("Oops, you're muted!")); ui_muted->setToolTip(tr("Oops, you're muted!"));
@ -2223,6 +2229,8 @@ void Courtroom::display_character()
// Hide the message and chatbox and handle the emotes // Hide the message and chatbox and handle the emotes
ui_vp_message->hide(); ui_vp_message->hide();
ui_vp_chatbox->hide(); ui_vp_chatbox->hide();
// Hide the face sticker
ui_vp_sticker->stop();
// Initialize the correct pos (called SIDE here for some reason) with DESK_MOD to determine if we should hide the desk or not. // Initialize the correct pos (called SIDE here for some reason) with DESK_MOD to determine if we should hide the desk or not.
switch(m_chatmessage[DESK_MOD].toInt()) { switch(m_chatmessage[DESK_MOD].toInt()) {
case 4: case 4:
@ -3177,6 +3185,8 @@ void Courtroom::start_chat_ticking()
ui_vp_chatbox->show(); ui_vp_chatbox->show();
ui_vp_message->show(); ui_vp_message->show();
ui_vp_sticker->load_image(m_chatmessage[CHAR_NAME]);
if (m_chatmessage[ADDITIVE] != "1") { if (m_chatmessage[ADDITIVE] != "1") {
ui_vp_message->clear(); ui_vp_message->clear();
real_tick_pos = 0; real_tick_pos = 0;