Sfoglia il codice sorgente

Place skip button above seek bar

Clément Wolf 1 mese fa
parent
commit
0973ae8d5d
3 ha cambiato i file con 61 aggiunte e 61 eliminazioni
  1. 55 55
      src/App/Osu/Osu.cpp
  2. 1 1
      src/App/Osu/Osu.h
  3. 5 5
      src/App/Osu/OsuHUD.cpp

+ 55 - 55
src/App/Osu/Osu.cpp

@@ -318,7 +318,6 @@ Osu::Osu(int instanceID) {
     m_bKeyboardKey22Down = false;
     m_bMouseKey1Down = false;
     m_bMouseKey2Down = false;
-    m_bSkipDownCheck = false;
     m_bSkipScheduled = false;
     m_bQuickRetryDown = false;
     m_fQuickRetryTime = 0.0f;
@@ -798,69 +797,29 @@ void Osu::update() {
         // NOTE: force keep loaded background images while playing
         m_backgroundImageHandler->scheduleFreezeCache();
 
-        // scrubbing/seeking
-        if(m_bSeekKey || getSelectedBeatmap()->m_bIsWatchingReplay) {
-            if(!bancho.is_playing_a_multi_map()) {
-                m_bSeeking = true;
-                const float mousePosX = (int)engine->getMouse()->getPos().x;
-                const float percent = clamp<float>(mousePosX / (float)getScreenWidth(), 0.0f, 1.0f);
-
-                if(engine->getMouse()->isLeftDown()) {
-                    if(mousePosX != m_fPrevSeekMousePosX || !osu_scrubbing_smooth.getBool()) {
-                        m_fPrevSeekMousePosX = mousePosX;
-
-                        // special case: allow cancelling the failing animation here
-                        if(getSelectedBeatmap()->hasFailed()) getSelectedBeatmap()->cancelFailing();
-
-                        getSelectedBeatmap()->seekPercentPlayable(percent);
-                    } else {
-                        // special case: keep player invulnerable even if scrubbing position does not change
-                        getSelectedBeatmap()->resetScore();
-                    }
-                } else {
-                    m_fPrevSeekMousePosX = -1.0f;
-                }
-
-                if(engine->getMouse()->isRightDown()) {
-                    m_fQuickSaveTime = clamp<float>((float)((getSelectedBeatmap()->getStartTimePlayable() +
-                                                             getSelectedBeatmap()->getLengthPlayable()) *
-                                                            percent) /
-                                                        (float)getSelectedBeatmap()->getLength(),
-                                                    0.0f, 1.0f);
-                }
-            }
-        }
-
         // skip button clicking
-        if(getSelectedBeatmap()->isInSkippableSection() && !getSelectedBeatmap()->isPaused() && !m_bSeeking &&
-           !m_volumeOverlay->isBusy()) {
+        bool can_skip = getSelectedBeatmap()->isInSkippableSection() && !m_bClickedSkipButton;
+        can_skip &= !getSelectedBeatmap()->isPaused() && !m_volumeOverlay->isBusy();
+        if(can_skip) {
             const bool isAnyOsuKeyDown = (m_bKeyboardKey1Down || m_bKeyboardKey12Down || m_bKeyboardKey2Down ||
                                           m_bKeyboardKey22Down || m_bMouseKey1Down || m_bMouseKey2Down);
             const bool isAnyKeyDown = (isAnyOsuKeyDown || engine->getMouse()->isLeftDown());
 
             if(isAnyKeyDown) {
-                if(!m_bSkipDownCheck) {
-                    m_bSkipDownCheck = true;
-
-                    const bool isCursorInsideSkipButton =
-                        m_hud->getSkipClickRect().contains(engine->getMouse()->getPos());
-
-                    if(isCursorInsideSkipButton) {
-                        if(!m_bSkipScheduled) {
-                            m_bSkipScheduled = true;
-
-                            if(bancho.is_playing_a_multi_map()) {
-                                Packet packet;
-                                packet.id = MATCH_SKIP_REQUEST;
-                                send_packet(packet);
-                            }
+                if(m_hud->getSkipClickRect().contains(engine->getMouse()->getPos())) {
+                    if(!m_bSkipScheduled) {
+                        m_bSkipScheduled = true;
+                        m_bClickedSkipButton = true;
+
+                        if(bancho.is_playing_a_multi_map()) {
+                            Packet packet;
+                            packet.id = MATCH_SKIP_REQUEST;
+                            send_packet(packet);
                         }
                     }
                 }
-            } else
-                m_bSkipDownCheck = false;
-        } else
-            m_bSkipDownCheck = false;
+            }
+        }
 
         // skipping
         if(m_bSkipScheduled) {
@@ -884,6 +843,47 @@ void Osu::update() {
             if(!isLoading) m_bSkipScheduled = false;
         }
 
+        // Reset m_bClickedSkipButton on mouse up
+        // We only use m_bClickedSkipButton to prevent seeking when clicking the skip button
+        if(m_bClickedSkipButton && !getSelectedBeatmap()->isInSkippableSection()) {
+            if(!engine->getMouse()->isLeftDown()) {
+                m_bClickedSkipButton = false;
+            }
+        }
+
+        // scrubbing/seeking
+        m_bSeeking = (m_bSeekKey || getSelectedBeatmap()->m_bIsWatchingReplay);
+        m_bSeeking &= !getSelectedBeatmap()->isPaused() && !m_volumeOverlay->isBusy();
+        m_bSeeking &= !bancho.is_playing_a_multi_map() && !m_bClickedSkipButton;
+        if(m_bSeeking) {
+            const float mousePosX = (int)engine->getMouse()->getPos().x;
+            const float percent = clamp<float>(mousePosX / (float)getScreenWidth(), 0.0f, 1.0f);
+
+            if(engine->getMouse()->isLeftDown()) {
+                if(mousePosX != m_fPrevSeekMousePosX || !osu_scrubbing_smooth.getBool()) {
+                    m_fPrevSeekMousePosX = mousePosX;
+
+                    // special case: allow cancelling the failing animation here
+                    if(getSelectedBeatmap()->hasFailed()) getSelectedBeatmap()->cancelFailing();
+
+                    getSelectedBeatmap()->seekPercentPlayable(percent);
+                } else {
+                    // special case: keep player invulnerable even if scrubbing position does not change
+                    getSelectedBeatmap()->resetScore();
+                }
+            } else {
+                m_fPrevSeekMousePosX = -1.0f;
+            }
+
+            if(engine->getMouse()->isRightDown()) {
+                m_fQuickSaveTime = clamp<float>(
+                    (float)((getSelectedBeatmap()->getStartTimePlayable() + getSelectedBeatmap()->getLengthPlayable()) *
+                            percent) /
+                        (float)getSelectedBeatmap()->getLength(),
+                    0.0f, 1.0f);
+            }
+        }
+
         // quick retry timer
         if(m_bQuickRetryDown && m_fQuickRetryTime != 0.0f && engine->getTime() > m_fQuickRetryTime) {
             m_fQuickRetryTime = 0.0f;

+ 1 - 1
src/App/Osu/Osu.h

@@ -325,12 +325,12 @@ class Osu : public App, public MouseListener {
     bool m_bKeyboardKey22Down;
     bool m_bMouseKey1Down;
     bool m_bMouseKey2Down;
-    bool m_bSkipDownCheck;
     bool m_bSkipScheduled;
     bool m_bQuickRetryDown;
     float m_fQuickRetryTime;
     bool m_bSeekKey;
     bool m_bSeeking;
+    bool m_bClickedSkipButton = false;
     float m_fPrevSeekMousePosX;
     float m_fQuickSaveTime;
 

+ 5 - 5
src/App/Osu/OsuHUD.cpp

@@ -317,11 +317,6 @@ void OsuHUD::draw(Graphics *g) {
 
         drawFancyScoreboard(g);
 
-        if(!m_osu->isSkipScheduled() && beatmap->isInSkippableSection() &&
-           ((m_osu_skip_intro_enabled_ref->getBool() && beatmap->getHitObjectIndexForCurrentTime() < 1) ||
-            (m_osu_skip_breaks_enabled_ref->getBool() && beatmap->getHitObjectIndexForCurrentTime() > 0)))
-            drawSkip(g);
-
         g->pushTransform();
         {
             if(m_osu->getModTarget() && osu_draw_target_heatmap.getBool())
@@ -450,6 +445,11 @@ void OsuHUD::draw(Graphics *g) {
         drawScrubbingTimeline(g, beatmap->getTime(), beatmap->getLength(), beatmap->getLengthPlayable(),
                               beatmap->getStartTimePlayable(), beatmap->getPercentFinishedPlayable(), breaks);
     }
+
+    if(!m_osu->isSkipScheduled() && beatmap->isInSkippableSection() &&
+       ((m_osu_skip_intro_enabled_ref->getBool() && beatmap->getHitObjectIndexForCurrentTime() < 1) ||
+        (m_osu_skip_breaks_enabled_ref->getBool() && beatmap->getHitObjectIndexForCurrentTime() > 0)))
+        drawSkip(g);
 }
 
 void OsuHUD::mouse_update(bool *propagate_clicks) {