no-toolbars: move all windows by dragging anywhere, this breaks drag&drop, and toolbar buttons do not respond on the first click
This commit is contained in:
@@ -696,6 +696,7 @@ static void ChangeFocusedWindow(Window *w, int x, int y)
|
|||||||
static void SendLeftClickEventToWindow(Window *w, int x, int y, int click_count)
|
static void SendLeftClickEventToWindow(Window *w, int x, int y, int click_count)
|
||||||
{
|
{
|
||||||
NWidgetCore *nw = w->nested_root->GetWidgetFromPos(x, y);
|
NWidgetCore *nw = w->nested_root->GetWidgetFromPos(x, y);
|
||||||
|
if (w->nested_focus != NULL) nw = w->GetWidget<NWidgetCore>(w->nested_focus->index);
|
||||||
WidgetType widget_type = (nw != NULL) ? nw->type : WWT_EMPTY;
|
WidgetType widget_type = (nw != NULL) ? nw->type : WWT_EMPTY;
|
||||||
|
|
||||||
bool focused_widget_changed = false; // Only used for OSK window
|
bool focused_widget_changed = false; // Only used for OSK window
|
||||||
@@ -808,8 +809,6 @@ static void DispatchLeftButtonDownEvent(Window *w, int x, int y, int click_count
|
|||||||
ChangeFocusedWindow(w, x, y);
|
ChangeFocusedWindow(w, x, y);
|
||||||
if (_settings_client.gui.windows_titlebars || click_count > 1) {
|
if (_settings_client.gui.windows_titlebars || click_count > 1) {
|
||||||
SendLeftClickEventToWindow(w, x, y, click_count);
|
SendLeftClickEventToWindow(w, x, y, click_count);
|
||||||
} else {
|
|
||||||
_left_button_down_pos = Point { x, y };
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -822,7 +821,13 @@ static void DispatchLeftButtonDownEvent(Window *w, int x, int y, int click_count
|
|||||||
static void DispatchLeftButtonUpEvent(Window *w, int x, int y)
|
static void DispatchLeftButtonUpEvent(Window *w, int x, int y)
|
||||||
{
|
{
|
||||||
if (_settings_client.gui.windows_titlebars || _dragging_window) return;
|
if (_settings_client.gui.windows_titlebars || _dragging_window) return;
|
||||||
SendLeftClickEventToWindow(w, x, y, 1);
|
if (_focused_window) {
|
||||||
|
// Send event to the window and widget which were initially under the mouse cursor
|
||||||
|
SendLeftClickEventToWindow(_focused_window, _left_button_down_pos.x - _focused_window->left, _left_button_down_pos.y - _focused_window->top, 1);
|
||||||
|
} else {
|
||||||
|
// Special case, such as toolbar buttons
|
||||||
|
SendLeftClickEventToWindow(w, x, y, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2059,6 +2064,22 @@ static void HandlePlacePresize()
|
|||||||
w->OnPlacePresize(pt, TileVirtXY(pt.x, pt.y));
|
w->OnPlacePresize(pt, TileVirtXY(pt.x, pt.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle dragging mouse while left button is pressed in no-titlebars mode.
|
||||||
|
*/
|
||||||
|
static void HandleMouseDragNoTitlebars()
|
||||||
|
{
|
||||||
|
if (_settings_client.gui.windows_titlebars || _dragging_window ||
|
||||||
|
!_left_button_down || _focused_window == NULL) return;
|
||||||
|
int distance = abs(_cursor.pos.x - _left_button_down_pos.x) + abs(_cursor.pos.y - _left_button_down_pos.y);
|
||||||
|
if (distance * 2 > GetMinSizing(NWST_STEP, 6)) {
|
||||||
|
//SendLeftClickEventToWindow(_focused_window, _left_button_down_pos.x, _left_button_down_pos.y, 1);
|
||||||
|
StartWindowDrag(_focused_window);
|
||||||
|
_drag_delta.x += _cursor.pos.x - _left_button_down_pos.x;
|
||||||
|
_drag_delta.y += _cursor.pos.y - _left_button_down_pos.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle dragging and dropping in mouse dragging mode (#WSM_DRAGDROP).
|
* Handle dragging and dropping in mouse dragging mode (#WSM_DRAGDROP).
|
||||||
* @return State of handling the event.
|
* @return State of handling the event.
|
||||||
@@ -2978,8 +2999,11 @@ static void MouseLoop(MouseClick click, int mousewheel)
|
|||||||
/* Don't allow any action in a viewport if either in menu or when having a modal progress window */
|
/* Don't allow any action in a viewport if either in menu or when having a modal progress window */
|
||||||
if (vp != NULL && (_game_mode == GM_MENU || HasModalProgress())) return;
|
if (vp != NULL && (_game_mode == GM_MENU || HasModalProgress())) return;
|
||||||
|
|
||||||
|
if (click == MC_LEFT) _left_button_down_pos = Point { x, y };
|
||||||
|
|
||||||
HandlePlacePresize();
|
HandlePlacePresize();
|
||||||
UpdateTileSelection();
|
UpdateTileSelection();
|
||||||
|
if (!mouse_down_on_viewport) HandleMouseDragNoTitlebars();
|
||||||
|
|
||||||
if (VpHandlePlaceSizingDrag() == ES_HANDLED) return;
|
if (VpHandlePlaceSizingDrag() == ES_HANDLED) return;
|
||||||
if (HandleMouseDragDrop() == ES_HANDLED) return;
|
if (HandleMouseDragDrop() == ES_HANDLED) return;
|
||||||
@@ -3048,6 +3072,7 @@ static void MouseLoop(MouseClick click, int mousewheel)
|
|||||||
switch (click) {
|
switch (click) {
|
||||||
case MC_LEFT_UP:
|
case MC_LEFT_UP:
|
||||||
DispatchLeftButtonUpEvent(w, x - w->left, y - w->top);
|
DispatchLeftButtonUpEvent(w, x - w->left, y - w->top);
|
||||||
|
mouse_down_on_viewport = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MC_LEFT:
|
case MC_LEFT:
|
||||||
|
|||||||
Reference in New Issue
Block a user