Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: ソング:音素タイミングの表示エリアを追加 #2472

Merged
merged 33 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
f15e54c
パラメーターパネルのエリアを追加、リファクタリング
sigprogramming Jan 4, 2025
7470bd8
キャラクターポートレートのクリッピングコンテナを追加、スタイルを調整
sigprogramming Jan 4, 2025
2e5b636
パラメーターパネルを一旦非表示に
sigprogramming Jan 5, 2025
7a18ff6
storybookを変更
sigprogramming Jan 5, 2025
c219876
GuideLineをsequencerBodyの外に出した
sigprogramming Jan 5, 2025
4bdab0e
パラメーターパネルを表示するかどうかの設定を開発時のみ機能として追加 [update snapshots]
sigprogramming Jan 5, 2025
4f668e3
(スナップショットを更新)
github-actions[bot] Jan 5, 2025
914bcfb
score-sequencerのoverflowを削除
sigprogramming Jan 5, 2025
4756f9b
修正
sigprogramming Jan 5, 2025
4f1c341
unitテストのsnapshotを更新
sigprogramming Jan 5, 2025
6c942e9
ポートレートの表示基準を少し単純にする
romot-co Jan 17, 2025
9f2977f
provide/injectを使用して共通化
sigprogramming Jan 18, 2025
382b8e7
SettingDialog.vueのトグルセルのタイトルと説明を更新
sigprogramming Jan 18, 2025
9a10b1b
emitImmediatelyを削除
sigprogramming Jan 18, 2025
6d1fe84
Update src/components/Sing/ScoreSequencer.vue
sigprogramming Jan 18, 2025
07172e5
Update src/components/Sing/SequencerParameterPanel.vue
sigprogramming Jan 18, 2025
43923d6
gridInfoInjectionKeyをScoreSequencer.vueに移動し、SequencerDummyGrid.vueおよび…
Hiroshiba Jan 19, 2025
ab02d28
CharacterPortrait.vueのスタイルを更新し、ポートレートの表示方法を改善
Hiroshiba Jan 19, 2025
247f059
(スナップショットを更新)
github-actions[bot] Jan 19, 2025
584791d
Merge pull request #4 from Hiroshiba/hiho-counter-pr-ab02d289
sigprogramming Jan 21, 2025
1436c64
chore: injectを移動
Hiroshiba Jan 21, 2025
672fc6e
Update src/components/Sing/SequencerDummyGrid.vue
sigprogramming Jan 22, 2025
adad0e2
Update src/components/Sing/SequencerGrid/Presentation.vue
sigprogramming Jan 22, 2025
7662a2f
Update src/components/Sing/SequencerDummyGrid.vue
sigprogramming Jan 22, 2025
8e05527
Merge branch 'add_parameter_panel_area' into hiho-counter-pr-372811ca
sigprogramming Jan 22, 2025
2342a8b
Merge pull request #5 from Hiroshiba/hiho-counter-pr-372811ca
sigprogramming Jan 22, 2025
519d9b1
CharacterPortrait.vueにクリッピングコンテナを追加し、画像のはみ出しを防止、pointer-events:noneを追加
sigprogramming Jan 22, 2025
b64096b
gridCellWidthとgridCellHeightの依存関係を削除し、ScoreSequencer.vueでの計算を直接行うように変更
sigprogramming Jan 22, 2025
fce1c16
Update src/components/Sing/CharacterPortrait.vue
sigprogramming Jan 23, 2025
39400f8
DummyGridからGridSpacerに変更
sigprogramming Jan 23, 2025
0e896dd
mainをマージ [update snapshots]
sigprogramming Jan 23, 2025
8495413
(スナップショットを更新)
github-actions[bot] Jan 23, 2025
b58632d
Merge remote-tracking branch 'upstream/main' into pr/sigprogramming/2472
Hiroshiba Jan 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/components/Dialog/SettingDialog/SettingDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,15 @@
)
"
/>
<ToggleCell
v-if="!isProduction"
title="[開発時のみ機能] パラメーターパネルの表示"
description="ONの場合、パラメーターパネルが表示されます。"
sigprogramming marked this conversation as resolved.
Show resolved Hide resolved
:modelValue="experimentalSetting.showParameterPanel"
@update:modelValue="
changeExperimentalSetting('showParameterPanel', $event)
"
/>
</div>
<div class="setting-card">
<h5 class="headline">データ収集</h5>
Expand Down
66 changes: 35 additions & 31 deletions src/components/Sing/CharacterPortrait.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
<template>
<div v-if="showSingCharacterPortrait" class="character-portrait-wrap">
<img class="character-portrait" :src="portraitPath" />
<div v-if="showSingCharacterPortrait" class="clipping-container">
<div class="character-portrait-wrap">
<div class="spacer"></div>
<img class="character-portrait" :src="portraitPath" />
</div>
</div>
</template>

Expand Down Expand Up @@ -36,46 +39,47 @@ const portraitPath = computed(() => {
@use "@/styles/colors" as colors;

// 表示変数
$header-margin: vars.$toolbar-height + vars.$menubar-height + 30px; // 30pxはルーラーの高さ
$right-margin: 24px;
$portrait-min-width: 200px;
$portrait-max-width: 40vw;
$portrait-max-height: 60vh;
$portrait-min-height: 500px;
$portrait-max-height: 60vh;
$spacer-height: 200px;

// 画像がはみ出ないようにクリップする
.clipping-container {
position: relative;
overflow: hidden;
}

// 画面右下に固定表示
// 幅固定、高さ可変、画像のアスペクト比を保持、wrapのwidthに合わせてheightを調整
// bottom位置はスクロールバーの上に表示
// 幅固定、高さ可変、画像のアスペクト比を保持、heightを調整
.character-portrait-wrap {
opacity: 0.55;
overflow: visible;
contain: layout;
position: relative;
height: max(100%, $portrait-min-height);
margin-right: $right-margin;
overflow: hidden;
display: flex;
flex-direction: column;
justify-content: flex-end;
align-items: flex-end;
pointer-events: none;
position: fixed;
display: grid;
place-items: end;
bottom: 0;
right: $right-margin;
}

.spacer {
flex: 0 1 $spacer-height;
width: 1px;
}

.character-portrait {
width: auto;
height: $portrait-max-height;
min-height: $portrait-min-height;
flex: 1 0;
min-width: $portrait-min-width;
max-width: $portrait-max-width;
overflow: visible;
min-height: $portrait-min-height;
max-height: $portrait-max-height;
opacity: 0.55;
backface-visibility: hidden;
object-fit: cover;
object-position: top center;
}

// ポートレートサイズが画面サイズを超えた場合、ヘッダーを考慮してポートレートを上部基準で表示させる
// ヘッダー高さ120px+ポートレート高さ500pxだとする
@media (max-height: #{calc(#{$portrait-min-height} + #{$header-margin})}) {
.character-portrait-wrap {
top: $header-margin; // ヘッダーの高さより下に位置させる
bottom: auto;
height: calc(100vh - #{$header-margin});
place-items: start end;
}
object-fit: contain;
object-position: bottom center;
}
Copy link
Contributor Author

@sigprogramming sigprogramming Jan 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@romot-co
できるだけ以前と同じ挙動になるようにしましたが、正しく実装できているか自信が無いので、スタイル周り、ご確認いただけると助かります…!
contain: layout;など、効いていなさそうなプロパティを消しましたが、必要なものも消しているかもしれません…)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sigprogramming
こちら確認いたします!

Copy link
Contributor

@romot-co romot-co Jan 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

メモ書きです…!

  • contain: layoutfixed以外で実装しようとした時の名残なので消しても大丈夫そうです(スクロール時のパフォーマンス上がることがあるので残しておいても問題ないはず)
  • コンテナ要素に対してposition: sticky+子にmax-width指定が一番楽そう
.portrait-wrap {
  position: sticky;
  bottom: 0;
  right: 0;
  width: 320px; /* 横長・縦長対応がきつそう... */
}

.portrait-image {
  width: 100%;
  height: auto;
  max-height: 300px /* 仮 */
  object-fit: contain;
  position: absolute; /* wrapに対し固定 */
  bottom: auto;
  bottom: 0;
}

// あとはContainer Queryなど?

ほか気になっているやつ:
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sigprogramming
こちら以下で修正いたしました…!挙動他問題や影響ありましたらおしらせください!

sigprogramming@6c942e9

Copy link
Contributor Author

@sigprogramming sigprogramming Jan 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@romot-co
ありがとうございます!!とても助かります…!

挙動を確認してみたのですが、今のmainブランチではシーケンサーのheightがある程度大きくなると立ち絵も拡大されるようになっていて、 6c942e9 では拡大されなくなっているかもです。ここの挙動、どうしましょう…

また、position: stickyありとposition: stickyなしの挙動の差があまり分かりませんでした…
調べてみたところ、position: stickyになっている要素がスティッキーアイテムで、その親がスティッキーコンテナになるようです。
https://coliss.com/articles/build-websites/operation/css/css-position-sticky-how-it-really-works.html
なので、 6c942e9 の実装だとcharacter-portrait-wrapがスティッキーアイテム、score-sequencerがスティッキーコンテナになりますが、character-portrait-wrapはグリッドアイテムでもあるので、もしかしたら上手く機能していないかも…?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ちょっと自分も試してみたんですが、原理は全く分かりませんがなんかこれでうまいことできた気がします!!
PRも作ってみました! sigprogramming#4

<style scoped lang="scss">
@use "@/styles/variables" as vars;
@use "@/styles/colors" as colors;

// 表示変数
$portrait-min-height: 500px;

// 画面右下に固定表示
// 幅固定、高さ可変、画像のアスペクト比を保持、heightを調整
.character-portrait-wrap {
  height: 100%;
  display: flex;
  flex-direction: column;
  margin-left: auto;
  overflow: hidden;
}

// 通常は下部基準だが、親要素が最小高さより小さい場合は上部基準とし頭を残して足から隠れさせる
.character-portrait {
  display: block;
  margin-top: auto;
  min-height: max(75%, $portrait-min-height);
  opacity: 0.55;
  backface-visibility: hidden;
  object-fit: contain;
}
</style>

ちなみにChatGPTに聞きました。o1君、結構CSSの強い味方かもしれない。
https://chatgpt.com/share/678d25ad-68f0-8008-b197-0c1b7da2b59b

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Hiroshiba
こちら確認しました!
簡潔な手法でだいぶベストに思えます…!

o1すごい…!

$portrait-min-height: 500px; // 最小高さ
$portrait-max-height: 60%; // 最大高さ 75%だと画面によってはでっかすぎるので60%ぐらいがよさそう

// 以下変更なし・動作のコメントだけ付与

// 画面右下に固定表示
// 幅固定、高さ可変、画像のアスペクト比を保持、heightを調整
.character-portrait-wrap {
  display: flex;
  flex-direction: column;
  // コンテナ要素に対し高さを100%にし、固定右寄せ
  height: 100%;
  margin-left: auto;
  // 内部スクロールを行わせない
  overflow: hidden;
}

// 通常は最下部に表示し、親要素が最小高さより小さい場合は上部基準とし頭を残して足から隠れさせる
.character-portrait {
  display: block;
  // wrapに対し下寄せ
  margin-top: auto;
  // 最小高さと最大高さのうち大きい方を適用
  min-height: max($portrait-min-height, $portrait-max-height);
  // アスペクト比を保持
  object-fit: contain;
  // 透明度
  opacity: 0.55;
  // 以下なくてもいいけどあるとGPU効きがち
  backface-visibility: hidden;
  transform: translateZ(0);
}

+たぶん
ポートレート幅 > 親のQSplitter幅の場合に
にスクロールバーが二重に出るかもなので

<QSplitter
     ...
    style="overflow: hidden" // スクロールさせない
>

みたいにすれば完了に思えます!
あとで修正PR送ります…!

</style>
Loading
Loading