diff -r 58ebbfd10563 src/order_gui.cpp --- a/src/order_gui.cpp Fri Mar 19 13:54:42 2010 +0100 +++ b/src/order_gui.cpp Fri Mar 19 13:54:47 2010 +0100 @@ -465,6 +465,7 @@ }; int selected_order; + OrderID order_over; ///< The order we're currently dragging another one over. OrderPlaceObjectState goto_type; const Vehicle *vehicle; ///< Vehicle owning the orders being displayed and manipulated. @@ -693,6 +694,7 @@ this->InitNested(desc, v->index); this->selected_order = -1; + this->order_over = INVALID_ORDER; this->owner = v->owner; if (_settings_client.gui.quick_goto && v->owner == _local_company) { @@ -953,6 +955,16 @@ /* Don't draw anything if it extends past the end of the window. */ if (!this->vscroll.IsVisible(i)) break; + if (i == this->order_over && i != this->selected_order) { + /* Highlight dragged order destination. */ + uint left = rtl ? r.right - index_column_width : r.left + WD_FRAMERECT_LEFT; + uint right = rtl ? r.right - WD_FRAMERECT_RIGHT : r.left + index_column_width; + uint top = (this->order_over < this->selected_order ? y : y + line_height) - 1; + + SpriteID sprite = rtl ? SPR_ARROW_LEFT : SPR_ARROW_RIGHT; + Dimension sprite_size = GetSpriteSize(sprite); + DrawSprite(sprite, PAL_NONE, rtl ? right - sprite_size.width : left, top - (sprite_size.height / 2)); + } DrawOrderString(this->vehicle, order, i, y, i == this->selected_order, false, r.left + WD_FRAMETEXT_LEFT, middle, r.right - WD_FRAMETEXT_RIGHT); y += line_height; @@ -1188,6 +1200,12 @@ } ResetObjectToPlace(); + + if (this->order_over != INVALID_ORDER) { + /* End of drag-and-drop, hide dragged order destination highlight. */ + this->order_over = INVALID_ORDER; + this->SetWidgetDirty(ORDER_WIDGET_ORDER_LIST); + } } virtual EventState OnKeyPress(uint16 key, uint16 keycode) @@ -1249,6 +1267,12 @@ } this->RaiseWidget(ORDER_WIDGET_GOTO); this->SetWidgetDirty(ORDER_WIDGET_GOTO); + + if (this->order_over != INVALID_ORDER) { + /* End of drag-and-drop, hide dragged order destination highlight. */ + this->order_over = INVALID_ORDER; + this->SetWidgetDirty(ORDER_WIDGET_ORDER_LIST); + } } virtual void OnMouseLoop() @@ -1268,6 +1292,28 @@ } } + virtual void OnMouseDrag(Point pt, int widget) + { + if (this->selected_order != -1 && widget == ORDER_WIDGET_ORDER_LIST) { + /* We are dragging an order... */ + OrderID from_order = this->OrderGetSel(); + OrderID to_order = this->GetOrderFromPt(pt.y); + uint num_orders = this->vehicle->GetNumOrders(); + + if (from_order != INVALID_ORDER && from_order <= num_orders) { + if (to_order != INVALID_ORDER && to_order <= num_orders) { + /* ... over an order. */ + this->order_over = to_order; + this->SetWidgetDirty(widget); + } else if (from_order != to_order && this->order_over != INVALID_ORDER) { + /* ... outside of the orders list. */ + this->order_over = INVALID_ORDER; + this->SetWidgetDirty(widget); + } + } + } + } + virtual void OnResize() { /* Update the scroll bar */