Esempio n. 1
0
bool ScrollBox::Update(const Point2i &mousePosition,
                       const Point2i &lastMousePosition)
{
  // Force redrawing if we are scrolling and the mouse has moved
  if (start_drag_offset!=NO_DRAG && mousePosition!=lastMousePosition) {
    //NeedRedrawing();
  }

  bool redraw = need_redrawing;
  bool updated = Widget::Update(mousePosition, lastMousePosition);
  need_redrawing = redraw;

  bool has_scrollbar = HasScrollBar();
  m_up->SetVisible(has_scrollbar);
  m_down->SetVisible(has_scrollbar);

  updated |= WidgetList::Update(mousePosition, lastMousePosition);

  if (has_scrollbar) {
    GetMainWindow().BoxColor(GetScrollTrack(), dark_gray_color);

    const Rectanglei& thumb = GetScrollThumb();
    bool over = scroll_mode==SCROLL_MODE_THUMB || thumb.Contains(mousePosition);
    GetMainWindow().BoxColor(thumb, over ? white_color : gray_color);
  }
  return updated;
}
Esempio n. 2
0
void ScrollBox::__Update(const Point2i & mousePosition,
                         const Point2i & /*lastMousePosition*/)
{
  // update position of items because of dragging
  if (HasScrollBar() && scroll_mode!=SCROLL_MODE_NONE) {
    int max_offset = GetMaxOffset();
    int new_offset = offset;

    if (scroll_mode == SCROLL_MODE_THUMB) {
      Point2i track_pos  = GetScrollTrackPos();
      int     height     = GetTrackHeight();

      new_offset = start_drag_offset +
                   ((mousePosition.y - start_drag_y) * (size.y+max_offset))/height;
    } else if (scroll_mode == SCROLL_MODE_DRAG) {
      // Act as if the scroll corresponds to bringing the starting point to the
      // current point
      new_offset = start_drag_offset + start_drag_y - mousePosition.y;
    }

    if (new_offset < 0)
      new_offset = 0;
    if (new_offset > max_offset)
      new_offset = max_offset;

    if (new_offset != offset) {
      offset = new_offset;
      Pack();
    }
  }
}
Esempio n. 3
0
Widget * ScrollBox::Click(const Point2i & mousePosition, uint button)
{
  if (!Contains(mousePosition)) {
    return NULL;
  }

  start_drag_offset = NO_DRAG;
  scroll_mode = SCROLL_MODE_NONE;

  if (HasScrollBar() && Mouse::IS_CLICK_BUTTON(button)) {
    start_drag_y = mousePosition.y;
    if (GetScrollThumb().Contains(mousePosition)) {
      if (!offset) {
        // Not yet set, derive from mouse position
        const Rectanglei& scroll_track = GetScrollTrack();
        int height = scroll_track.GetSizeY();
        offset = ( (mousePosition.y - scroll_track.GetPositionY()) * (size.y+GetMaxOffset())
                   + (height/2) ) / height;
      }

      start_drag_offset = offset;
      scroll_mode = SCROLL_MODE_THUMB;
    } else if (vbox->Contains(mousePosition)) {
      // The click occurred inside the vbox, this means scrolling
      scroll_mode = SCROLL_MODE_DRAG;
      start_drag_offset = offset;
    }
  }

  return WidgetList::Click(mousePosition, button);
}
Esempio n. 4
0
void CDuiItemBox::EnsureVisible(CDuiWindow *pItem)
{
    if(!HasScrollBar(TRUE)) return;
    DUIASSERT(pItem);
    CRect rcItem;
    pItem->GetRect(&rcItem);
    int yOffset=0;
    if(rcItem.bottom>m_rcWindow.bottom)
    {
        yOffset=rcItem.bottom-m_rcWindow.bottom;
    }
    else if(rcItem.top<m_rcWindow.top)
    {
        yOffset=rcItem.top-m_rcWindow.top;
    }
    SetScrollPos(TRUE,GetScrollPos(TRUE)+yOffset,TRUE);
}
Esempio n. 5
0
AutoHideBar::AutoHideBar()
{
    internalname = "autohidebar";
    ctrl = NULL;
    SetStyle(DockCtrlChStyle::StyleDefault());
    HasScrollBar(false);
    HasButtons(false);
    HasIcons(true);
    Draggable(false);
    SetSize(0);
    childcount = 0;

    TabInterface::WhenHighlight = THISBACK(OnHighlight);
    TabInterface::WhenClose		= THISBACK(OnClose);

    popup.WhenEnter = THISBACK2(MouseEnter, Point(0, 0), 0);
    popup.WhenLeave = THISBACK(MouseLeave);
}
Esempio n. 6
0
Widget * ScrollBox::ClickUp(const Point2i & mousePosition, uint button)
{
  ScrollMode old_mode = scroll_mode;
  start_drag_offset = NO_DRAG;
  scroll_mode = SCROLL_MODE_NONE;

  if (!vbox->GetFirstWidget()) {
    return NULL;
  }

  // Handle the click up as a widget click only if we weren't dragging
  // If we click up close to where we clicked down, it will however register
  // as a click and not a scrolling
  if (vbox->Contains(mousePosition) &&
      (start_drag_y==NO_DRAG || abs(start_drag_y-mousePosition.y)<2)) {
    Widget *w = vbox->ClickUp(mousePosition, button);

    if (w) {
      SetFocusOn(w);
      return w;
    }
    // The click was not handled, let's try using it for scrolling
  }

  if (HasScrollBar()) {
    bool is_click   = Mouse::IS_CLICK_BUTTON(button);
    int  max_offset = GetMaxOffset();
    int  new_offset = offset;

    // The event involves the scrollbar or its buttons
    if ((button == SDL_BUTTON_WHEELDOWN && Contains(mousePosition)) ||
        (is_click && m_down->Contains(mousePosition))) {

      // bottom button
      new_offset = offset+SCROLL_SPEED;
    } else if ((button == SDL_BUTTON_WHEELUP && Contains(mousePosition)) ||
               (is_click && m_up->Contains(mousePosition))) {

      // top button
      new_offset = offset-SCROLL_SPEED;
    } else if (is_click) {
      // Was it released after a drag operation?
      if (old_mode!=SCROLL_MODE_NONE /*&& start_drag_y != mousePosition.y*/)
        return this;
      const Rectanglei& scroll_track = GetScrollTrack();
      if (scroll_track.Contains(mousePosition)) {
        // Set this as new scroll thumb position
        int height = scroll_track.GetSizeY();
        new_offset = ((mousePosition.y - scroll_track.GetPositionY()) * (size.y+max_offset)
                      + (height/2)) / scroll_track.GetSizeY();
      }
    }

    // Clip new offset to correct value
    if (new_offset > max_offset)
      new_offset = max_offset;
    if (new_offset < 0)
      new_offset = 0;

    if (new_offset != offset) {
      offset = new_offset;
      Pack();
      NeedRedrawing();
    }

    return this;
  }

  return NULL;
}