aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCrystalwarrior <varsash@gmail.com>2019-09-12 18:28:08 +0300
committerCrystalwarrior <varsash@gmail.com>2019-09-12 22:45:02 +0300
commite76a83ddfe8f6fe16ee7e2a91d3ac30e89f80345 (patch)
tree82c9d89a88db5255ef8df59b2f895fe0f1931d1f
parent961563daf3af7fd0167b281ed101d11c67a4eaf7 (diff)
Allow AOMovie to have timers that take priority over the animated image frame count
Set it up so feeding the timer value when playing the AOMovie would use the timer but only in cases where a non-animated image is used Update shouts and wtce to pass the 'duration' argument which will be used if the image used is non-animated. Otherwise, prioritize the animated image duration.
-rw-r--r--include/aomovie.h5
-rw-r--r--src/aomovie.cpp87
-rw-r--r--src/courtroom.cpp16
3 files changed, 60 insertions, 48 deletions
diff --git a/include/aomovie.h b/include/aomovie.h
index 1f278bf8..33b31586 100644
--- a/include/aomovie.h
+++ b/include/aomovie.h
@@ -15,13 +15,15 @@ public:
AOMovie(QWidget *p_parent, AOApplication *p_ao_app);
void set_play_once(bool p_play_once);
- void play(QString p_gif, QString p_char = "", QString p_custom_theme = "");
+ void start_timer(int delay);
+ void play(QString p_gif, QString p_char = "", QString p_custom_theme = "", int duration = 0);
void combo_resize(int w, int h);
void stop();
private:
QMovie *m_movie;
AOApplication *ao_app;
+ QTimer *timer;
bool play_once = true;
signals:
@@ -29,6 +31,7 @@ signals:
private slots:
void frame_change(int n_frame);
+ void timer_done();
};
#endif // AOMOVIE_H
diff --git a/src/aomovie.cpp b/src/aomovie.cpp
index edf5bdb0..2598bb76 100644
--- a/src/aomovie.cpp
+++ b/src/aomovie.cpp
@@ -12,7 +12,11 @@ AOMovie::AOMovie(QWidget *p_parent, AOApplication *p_ao_app) : QLabel(p_parent)
this->setMovie(m_movie);
+ timer = new QTimer(this);
+ timer->setSingleShot(true);
+
connect(m_movie, SIGNAL(frameChanged(int)), this, SLOT(frame_change(int)));
+ connect(timer, SIGNAL(timeout()), this, SLOT(timer_done()));
}
void AOMovie::set_play_once(bool p_play_once)
@@ -20,46 +24,44 @@ void AOMovie::set_play_once(bool p_play_once)
play_once = p_play_once;
}
-void AOMovie::play(QString p_gif, QString p_char, QString p_custom_theme)
+void AOMovie::start_timer(int delay)
{
- m_movie->stop();
+ timer->start(delay);
+}
- QString gif_path;
+void AOMovie::play(QString p_gif, QString p_char, QString p_custom_theme, int duration)
+{
+ m_movie->stop();
- QString custom_path;
+ QString shout_path;
+ QList<QString> pathlist;
if (p_gif == "custom")
- custom_path = ao_app->get_image_suffix(ao_app->get_character_path(p_char, p_gif));
- else
- custom_path = ao_app->get_image_suffix(ao_app->get_character_path(p_char, p_gif + "_bubble"));
-
- QString misc_path = ao_app->get_base_path() + "misc/" + p_custom_theme + "/" + p_gif + "_bubble.gif";
- QString custom_theme_path = ao_app->get_custom_theme_path(p_custom_theme, p_gif + ".gif");
- QString theme_path = ao_app->get_theme_path(p_gif + ".gif");
- QString default_theme_path = ao_app->get_default_theme_path(p_gif + ".gif");
- QString placeholder_path = ao_app->get_theme_path("placeholder.gif");
- QString default_placeholder_path = ao_app->get_default_theme_path("placeholder.gif");
-
- if (file_exists(custom_path))
- gif_path = custom_path;
- else if (file_exists(misc_path))
- gif_path = misc_path;
- else if (file_exists(custom_theme_path))
- gif_path = custom_theme_path;
- else if (file_exists(theme_path))
- gif_path = theme_path;
- else if (file_exists(default_theme_path))
- gif_path = default_theme_path;
- else if (file_exists(placeholder_path))
- gif_path = placeholder_path;
- else if (file_exists(default_placeholder_path))
- gif_path = default_placeholder_path;
+ pathlist << ao_app->get_image_suffix(ao_app->get_character_path(p_char, p_gif));
else
- gif_path = "";
+ pathlist << ao_app->get_image_suffix(ao_app->get_character_path(p_char, p_gif + "_bubble"));
- m_movie->setFileName(gif_path);
+ pathlist << ao_app->get_image_suffix(ao_app->get_base_path() + "misc/" + p_custom_theme + "/" + p_gif + "_bubble") << //Misc path
+ ao_app->get_image_suffix(ao_app->get_custom_theme_path(p_custom_theme, p_gif)) << //Custom theme path
+ ao_app->get_image_suffix(ao_app->get_theme_path(p_gif)) << //Theme path
+ ao_app->get_image_suffix(ao_app->get_default_theme_path(p_gif)) << //Default theme path
+ ao_app->get_image_suffix(ao_app->get_theme_path("placeholder")) << //Placeholder path
+ ao_app->get_image_suffix( ao_app->get_default_theme_path("placeholder")); //Default placeholder path
+
+ for (QString path : pathlist)
+ {
+ if (file_exists(path))
+ {
+ shout_path = path;
+ break;
+ }
+ }
+
+ m_movie->setFileName(shout_path);
this->show();
m_movie->start();
+ if (m_movie->frameCount() == 0 && duration > 0)
+ this->start_timer(duration);
}
void AOMovie::stop()
@@ -70,16 +72,23 @@ void AOMovie::stop()
void AOMovie::frame_change(int n_frame)
{
- if (n_frame == (m_movie->frameCount() - 1) && play_once)
- {
- //we need this or else the last frame wont show
- delay(m_movie->nextFrameDelay());
+ //If it's a "static movie" (only one frame - png image), we can't change frames - ignore this function (use timer instead).
+ //If the frame didn't reach the last frame or the movie is continuous, don't stop the movie.
+ if (m_movie->frameCount() == 0 || n_frame < (m_movie->frameCount() - 1) || !play_once)
+ return;
+ //we need this or else the last frame wont show
+ delay(m_movie->nextFrameDelay());
- this->stop();
+ this->stop();
- //signal connected to courtroom object, let it figure out what to do
- done();
- }
+ //signal connected to courtroom object, let it figure out what to do
+ done();
+}
+
+void AOMovie::timer_done()
+{
+ this->stop();
+ done();
}
void AOMovie::combo_resize(int w, int h)
diff --git a/src/courtroom.cpp b/src/courtroom.cpp
index a1714163..14409780 100644
--- a/src/courtroom.cpp
+++ b/src/courtroom.cpp
@@ -1350,20 +1350,20 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
switch (objection_mod)
{
case 1:
- ui_vp_objection->play("holdit", f_char, f_custom_theme);
+ ui_vp_objection->play("holdit", f_char, f_custom_theme, 724);
objection_player->play("holdit.wav", f_char, f_custom_theme);
break;
case 2:
- ui_vp_objection->play("objection", f_char, f_custom_theme);
+ ui_vp_objection->play("objection", f_char, f_custom_theme, 724);
objection_player->play("objection.wav", f_char, f_custom_theme);
break;
case 3:
- ui_vp_objection->play("takethat", f_char, f_custom_theme);
+ ui_vp_objection->play("takethat", f_char, f_custom_theme, 724);
objection_player->play("takethat.wav", f_char, f_custom_theme);
break;
//case 4 is AO2 only
case 4:
- ui_vp_objection->play("custom", f_char, f_custom_theme);
+ ui_vp_objection->play("custom", f_char, f_custom_theme, 724);
objection_player->play("custom.wav", f_char, f_custom_theme);
break;
default:
@@ -2574,7 +2574,7 @@ void Courtroom::handle_wtce(QString p_wtce, int variant)
if (p_wtce == "testimony1")
{
sfx_player->play(ao_app->get_sfx("witness_testimony"));
- ui_vp_wtce->play("witnesstestimony");
+ ui_vp_wtce->play("witnesstestimony", "", "", 1500);
testimony_in_progress = true;
show_testimony();
}
@@ -2582,7 +2582,7 @@ void Courtroom::handle_wtce(QString p_wtce, int variant)
else if (p_wtce == "testimony2")
{
sfx_player->play(ao_app->get_sfx("cross_examination"));
- ui_vp_wtce->play("crossexamination");
+ ui_vp_wtce->play("crossexamination", "", "", 1500);
testimony_in_progress = false;
}
else if (p_wtce == "judgeruling")
@@ -2590,12 +2590,12 @@ void Courtroom::handle_wtce(QString p_wtce, int variant)
if (variant == 0)
{
sfx_player->play(ao_app->get_sfx("not_guilty"));
- ui_vp_wtce->play("notguilty");
+ ui_vp_wtce->play("notguilty", "", "", 3000);
testimony_in_progress = false;
}
else if (variant == 1) {
sfx_player->play(ao_app->get_sfx("guilty"));
- ui_vp_wtce->play("guilty");
+ ui_vp_wtce->play("guilty", "", "", 3000);
testimony_in_progress = false;
}
}