Skip to content

Commit 32bc005

Browse files
committed
メニューでの値の増減をマウスで行えるようにした
1 parent 64e6cac commit 32bc005

File tree

3 files changed

+93
-50
lines changed

3 files changed

+93
-50
lines changed

dmge/App.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -669,9 +669,6 @@ namespace dmge
669669
.state = U"{} ({}x{})"_fmt(config_.scale, 160 * config_.scale, 144 * config_.scale),
670670
};
671671
},
672-
.handler = [&]() {
673-
config_.scale = Max(1, (config_.scale + 1) % (AppConfig::ScalingMax + 1));
674-
},
675672
.handlerLR = [&](bool leftPressed) {
676673
if (leftPressed)
677674
{
@@ -691,9 +688,6 @@ namespace dmge
691688
.state = U"{}/{}"_fmt(config_.palettePreset + 1, Colors::PalettePresetsCount)
692689
};
693690
},
694-
.handler = [&]() {
695-
changePalettePreset_(1);
696-
},
697691
.handlerLR = [&](bool leftPressed) {
698692
if (leftPressed)
699693
{
@@ -729,7 +723,7 @@ namespace dmge
729723
.handler = [&]() {
730724
toggleAudio_();
731725
},
732-
.enableLR = true
726+
.allowLR = true
733727
});
734728

735729
rootMenu_.items.push_back({
@@ -743,7 +737,7 @@ namespace dmge
743737
.handler = [&]() {
744738
toggleAudioChannelMute_(0);
745739
},
746-
.enableLR = true
740+
.allowLR = true
747741
});
748742

749743
rootMenu_.items.push_back({
@@ -757,7 +751,7 @@ namespace dmge
757751
.handler = [&]() {
758752
toggleAudioChannelMute_(1);
759753
},
760-
.enableLR = true
754+
.allowLR = true
761755
});
762756

763757
rootMenu_.items.push_back({
@@ -771,7 +765,7 @@ namespace dmge
771765
.handler = [&]() {
772766
toggleAudioChannelMute_(2);
773767
},
774-
.enableLR = true
768+
.allowLR = true
775769
});
776770

777771
rootMenu_.items.push_back({
@@ -785,7 +779,7 @@ namespace dmge
785779
.handler = [&]() {
786780
toggleAudioChannelMute_(3);
787781
},
788-
.enableLR = true
782+
.allowLR = true
789783
});
790784

791785
rootMenu_.items.push_back({
@@ -799,7 +793,7 @@ namespace dmge
799793
.handler = [&]() {
800794
toggleAudioLPF_();
801795
},
802-
.enableLR = true
796+
.allowLR = true
803797
});
804798

805799
rootMenu_.items.push_back({
@@ -813,7 +807,7 @@ namespace dmge
813807
.handler = [&]() {
814808
toggleDebugMonitor_(false);
815809
},
816-
.enableLR = true
810+
.allowLR = true
817811
});
818812

819813
rootMenu_.items.push_back({
@@ -826,7 +820,7 @@ namespace dmge
826820
.handler = [&]() {
827821
toggleShowFPS_();
828822
},
829-
.enableLR = true
823+
.allowLR = true
830824
});
831825

832826

dmge/GUI/Menu.cpp

Lines changed: 67 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -121,18 +121,12 @@ namespace dmge
121121
{
122122
if (currentMenu_().items[selectedIndex_].handlerLR)
123123
{
124-
// handlerLR が設定されていたら実行
125124
currentMenu_().items[selectedIndex_].handlerLR(KeyLeft.pressed());
126125
return;
127126
}
128-
else if (currentMenu_().items[selectedIndex_].enableLR)
127+
else if (currentMenu_().items[selectedIndex_].handler && currentMenu_().items[selectedIndex_].allowLR)
129128
{
130-
// enableLR が設定されていたら、handler を代わりに実行
131-
if (currentMenu_().items[selectedIndex_].handler)
132-
{
133-
currentMenu_().items[selectedIndex_].handler();
134-
}
135-
return;
129+
currentMenu_().items[selectedIndex_].handler();
136130
}
137131
}
138132

@@ -172,37 +166,25 @@ namespace dmge
172166

173167
// マウス左クリック: マウスオーバーしているメニュー項目を決定または値の変更
174168

175-
if (const auto scrollingArea = scrollingAreaRect_();
176-
scrollingArea.contains(Cursor::Pos()))
169+
const auto mouseEvent = getMenuItemMouseEvent_();
170+
171+
if (mouseEvent.type == MenuItemMouseEventType::Clicked)
177172
{
178-
// マウスクリック位置にスクロールを適用したいので座標変換をする
179-
const Transformer2D transformer = getScrollingAreaTransform_();
173+
const auto& selectedMenuItem = currentMenu_().items[selectedIndex_];
180174

181-
for (auto [index, item] : Indexed(currentMenu_().items))
175+
if (selectedMenuItem.handlerLR)
182176
{
183-
const Rect itemRegion{ 0, index * RowHeight, scrollingArea.w, RowHeight };
184-
185-
if (itemRegion.leftClicked())
186-
{
187-
if (currentMenu_().items[selectedIndex_].handler)
188-
{
189-
// handler() には座標変換を適用したくない
190-
goto callSelectedItemHandler;
191-
}
192-
return;
193-
}
194-
else if (itemRegion.mouseOver() && enableMouseSelection_)
195-
{
196-
selectedIndex_ = index;
197-
return;
198-
}
177+
selectedMenuItem.handlerLR(mouseEvent.left);
178+
}
179+
else if (selectedMenuItem.handler)
180+
{
181+
selectedMenuItem.handler();
199182
}
200183
}
201-
202-
return;
203-
204-
callSelectedItemHandler:
205-
currentMenu_().items[selectedIndex_].handler();
184+
else if (mouseEvent.type == MenuItemMouseEventType::Over)
185+
{
186+
selectedIndex_ = mouseEvent.index;
187+
}
206188
}
207189

208190
void MenuOverlay::draw() const
@@ -237,7 +219,23 @@ namespace dmge
237219
const Rect itemRegion{ 0, index * RowHeight, scrollingArea.w, RowHeight };
238220
const ColorF menuItemBgColor = ColorF{ MenuItemSelectedFontColor, selected ? 0.2 : 0 };
239221
const ColorF menuItemFontColor = selected ? MenuItemSelectedFontColor : MenuItemFontColor;
240-
itemRegion.draw(menuItemBgColor);
222+
223+
if (enableMouseSelection_ && item.handlerLR)
224+
{
225+
// マウスによる選択:値の増減が可能な場合、右寄りか左寄りかで値の増減を変える
226+
if (Cursor::Pos().x > itemRegion.w / 2)
227+
{
228+
itemRegion.draw(Arg::left = ColorF{ menuItemBgColor, 0 }, Arg::right = menuItemBgColor);
229+
}
230+
else
231+
{
232+
itemRegion.draw(Arg::left = menuItemBgColor, Arg::right = ColorF{ menuItemBgColor, 0 });
233+
}
234+
}
235+
else
236+
{
237+
itemRegion.draw(menuItemBgColor);
238+
}
241239

242240
// メニュー項目のテキストを1文字ずつ描画
243241

@@ -370,5 +368,39 @@ namespace dmge
370368
}
371369
}
372370

371+
MenuItemMouseEvent MenuOverlay::getMenuItemMouseEvent_() const
372+
{
373+
if (const auto scrollingArea = scrollingAreaRect_();
374+
scrollingArea.contains(Cursor::Pos()))
375+
{
376+
// マウスクリック位置にスクロールを適用したいので座標変換をする
377+
const Transformer2D transformer = getScrollingAreaTransform_();
378+
379+
for (auto [index, item] : Indexed(currentMenu_().items))
380+
{
381+
const Rect itemRegion{ 0, index * RowHeight, scrollingArea.w, RowHeight };
382+
383+
if (itemRegion.leftClicked())
384+
{
385+
if (currentMenu_().items[selectedIndex_].handlerLR)
386+
{
387+
return { MenuItemMouseEventType::Clicked, (int)index, Cursor::PosF().x < itemRegion.w / 2 };
388+
}
389+
else if (currentMenu_().items[selectedIndex_].handler)
390+
{
391+
return { MenuItemMouseEventType::Clicked, (int)index };
392+
}
393+
return { MenuItemMouseEventType::None, 0 };
394+
}
395+
else if (itemRegion.mouseOver() && enableMouseSelection_)
396+
{
397+
return { MenuItemMouseEventType::Over, (int)index };
398+
}
399+
}
400+
}
401+
402+
return { MenuItemMouseEventType::None, 0 };
403+
}
404+
373405
}
374406
}

dmge/GUI/Menu.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,28 @@ namespace dmge
3333
// 引数に bool leftPressed (←キーが押されたか) をとる
3434
std::function<void(bool)> handlerLR;
3535

36-
bool enableLR = false;
36+
// トグルなど、値の増減ではないが、左右キーでの操作を可能にする
37+
bool allowLR = false;
3738

3839
// パレット選択用
3940
bool isPaletteSetting = false;
4041
};
4142

43+
// メニュー項目がマウスオーバー or クリックされたかどうかを表す
44+
enum class MenuItemMouseEventType
45+
{
46+
None,
47+
Over,
48+
Clicked,
49+
};
50+
51+
struct MenuItemMouseEvent
52+
{
53+
MenuItemMouseEventType type;
54+
int index;
55+
bool left;
56+
};
57+
4258
struct Menu
4359
{
4460
Array<MenuItem> items;
@@ -90,6 +106,7 @@ namespace dmge
90106
Transformer2D getScrollingAreaTransform_() const;
91107
void drawMenuItemTextAt_(const MenuItemText& text, const Vec2& pos, bool selected) const;
92108
void drawHelp_() const;
109+
MenuItemMouseEvent getMenuItemMouseEvent_() const;
93110
};
94111
}
95112
}

0 commit comments

Comments
 (0)