@@ -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}
0 commit comments