コード例 #1
0
	void VScroll::TrackMove(int _left, int _top)
	{
		if (mWidgetTrack == nullptr)
			return;

		const IntPoint& point = InputManager::getInstance().getLastLeftPressed();

		// расчитываем позицию виджета
		int start = mPreActionOffset.top + (_top - point.top);
		if (start < (int)mSkinRangeStart) start = (int)mSkinRangeStart;
		else if (start > (mCoord.height - (int)mSkinRangeEnd - mWidgetTrack->getHeight())) start = (mCoord.height - (int)mSkinRangeEnd - mWidgetTrack->getHeight());
		if (mWidgetTrack->getTop() != start) mWidgetTrack->setPosition(mWidgetTrack->getLeft(), start);

		// расчитываем положение соответствующее позиции
		// плюс пол позиции
		int pos = start - (int)mSkinRangeStart + (getLineSize() - getTrackSize()) / (((int)mScrollRange - 1) * 2);
		// высчитываем ближайшее значение и обновляем
		pos = pos * (int)(mScrollRange - 1) / (getLineSize() - getTrackSize());

		// проверяем на выходы и изменения
		if (pos < 0) pos = 0;
		else if (pos >= (int)mScrollRange) pos = (int)mScrollRange - 1;
		if (pos == (int)mScrollPosition) return;

		mScrollPosition = pos;
		// отсылаем событие
		eventScrollChangePosition(this, (int)mScrollPosition);
	}
コード例 #2
0
ファイル: MyGUI_ScrollBar.cpp プロジェクト: IsemanTech/mygui
	void ScrollBar::notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id)
	{
		// диспечерезируем нажатие своих детей как свое
		eventMouseButtonPressed(this, _left, _top, _id);

		if (MouseButton::Left != _id)
			return;

		if (mEnableRepeat && _sender != mWidgetTrack
			&& ((_sender != mWidgetFirstPart && _sender != mWidgetSecondPart) || !mMoveToClick))
		{
			ControllerItem* item = ControllerManager::getInstance().createItem(ControllerRepeatClick::getClassTypeName());
			ControllerRepeatClick* controller = item->castType<ControllerRepeatClick>();
			controller->eventRepeatClick += newDelegate(this, &ScrollBar::repeatClick);
			controller->setRepeat(mRepeatTriggerTime, mRepeatStepTime);
			ControllerManager::getInstance().addItem(_sender, controller);
		}

		if (mMoveToClick &&
			_sender != mWidgetTrack &&
			_sender != mWidgetStart &&
			_sender != mWidgetEnd)
		{
			if (mWidgetTrack != nullptr)
			{
				mPreActionOffset = InputManager::getInstance().getLastPressedPosition(MouseButton::Left);
				const IntPoint& point = InputManager::getInstance().getMousePositionByLayer() - mWidgetTrack->getParent()->getAbsolutePosition();

				mPreActionOffset.left -= getTrackSize() / 2;
				mPreActionOffset.top -= getTrackSize() / 2;

				TrackMove(point.left, point.top);
			}
		}
		else if (_sender == mWidgetStart)
		{
			widgetStartPressed();
		}
		else if (_sender == mWidgetEnd)
		{
			widgetEndPressed();
		}
		else if (_sender == mWidgetFirstPart)
		{
			widgetFirstPartPressed();
		}
		else if (_sender == mWidgetSecondPart)
		{
			widgetSecondPartPressed();
		}
		else if (_sender == mWidgetTrack)
		{
			mPreActionOffset.left = _sender->getLeft();
			mPreActionOffset.top = _sender->getTop();
		}
	}
コード例 #3
0
int TrackView_getTracksOffset(TrackViewInfo* viewInfo, TrackData* trackData, int prevTrack, int nextTrack)
{
    int i, j, size = 0;
    bool flip = false;

    if (prevTrack == nextTrack)
        return 0;

    // handle the case when tracks are flipped

    if (prevTrack > nextTrack)
    {
        int temp = nextTrack;
        nextTrack = prevTrack;
        prevTrack = temp;
        flip = true;
    }

    for (i = prevTrack; i < nextTrack; )
    {
        Track* t = &trackData->tracks[i];

        // if track has no group its always safe to assume that can select the track

        if (t->group->trackCount == 1)
        {
            size += getTrackSize(viewInfo, t);
            ++i;
            continue;
        }

        if (t->group->folded)
        {
            size += track_size_folded;
            i += t->group->trackCount;
            continue;
        }

        for (j = 0; j < t->group->trackCount; ++j)
        {
            if (i + j == nextTrack)
                goto end;

            size += getTrackSize(viewInfo, t->group->t.tracks[j]);

        }

        i += t->group->trackCount;
    }

end:
    ;

    return flip ? -size : size;
}
コード例 #4
0
static int processTrack(Track* track, int posX, int* startTrack, int* endTrack, TrackViewInfo* viewInfo)
{
    int track_size = getTrackSize(viewInfo, track);

    if (posX > 0 && *startTrack == -1)
        *startTrack = track->index;

    if (((posX + 50 + track_size) > (viewInfo->windowSizeX - 80)) && *endTrack == -1)
        *endTrack = track->index;

    return track_size;
}
コード例 #5
0
int getGroupSize(TrackViewInfo* viewInfo, Group* group, int startTrack)
{
    int i, size = 0, count = group->trackCount;

    if (group->width == 0)
        group->width = (Emgui_getTextSize(group->name) & 0xffff) + 40;

    if (group->folded)
        return track_size_folded;

    for (i = startTrack; i < count; ++i)
        size += getTrackSize(viewInfo, group->t.tracks[i]);

    size = emaxi(size, group->width);

    return size;
}
コード例 #6
0
int TrackView_getWidth(TrackViewInfo* viewInfo, struct TrackData* trackData)
{
    int i, size = 0, group_count = trackData->groupCount;

    if (trackData->groupCount == 0)
        return 0;

    for (i = 0; i < group_count; ++i)
    {
        Group* group = &trackData->groups[i];

        if (group->trackCount == 1)
            size += getTrackSize(viewInfo, group->t.track);
        else
            size += getGroupSize(viewInfo, group, 0);
    }

    return size;
}
コード例 #7
0
	void VScroll::updateTrack()
	{
		if (mWidgetTrack == nullptr)
			return;

		_forcePeek(mWidgetTrack);
		// размер диапазана в пикселях
		int pos = getLineSize();

		// скрываем если диапазан маленький или места мало
		if ((mScrollRange < 2) || (pos <= mWidgetTrack->getHeight()))
		{
			mWidgetTrack->setVisible(false);
			if ( nullptr != mWidgetFirstPart ) mWidgetFirstPart->setSize(mWidgetFirstPart->getWidth(), pos / 2);
			if ( nullptr != mWidgetSecondPart ) mWidgetSecondPart->setCoord(mWidgetSecondPart->getLeft(), pos / 2 + (int)mSkinRangeStart, mWidgetSecondPart->getWidth(), pos - pos / 2);
			return;
		}
		// если скрыт то покажем
		if (!mWidgetTrack->getVisible())
		{
			mWidgetTrack->setVisible(true);
		}

		// и обновляем позицию
		pos = (int)(((size_t)(pos - getTrackSize()) * mScrollPosition) / (mScrollRange - 1) + mSkinRangeStart);

		mWidgetTrack->setPosition(mWidgetTrack->getLeft(), pos);
		if ( nullptr != mWidgetFirstPart )
		{
			int height = pos + mWidgetTrack->getHeight() / 2 - mWidgetFirstPart->getTop();
			mWidgetFirstPart->setSize(mWidgetFirstPart->getWidth(), height);
		}
		if ( nullptr != mWidgetSecondPart )
		{
			int top = pos + mWidgetTrack->getHeight() / 2;
			int height = mWidgetSecondPart->getHeight() + mWidgetSecondPart->getTop() - top;
			mWidgetSecondPart->setCoord(mWidgetSecondPart->getLeft(), top, mWidgetSecondPart->getWidth(), height);
		}
	}
コード例 #8
0
bool TrackView_render(TrackViewInfo* viewInfo, TrackData* trackData)
{
    struct TrackInfo info;
    int start_track = 0; //viewInfo->startTrack;
    int x_pos = 128;
    int end_track = 0;
    int i = 0;
    //int track_size;
    int adjust_top_size;
    int mid_screen_y ;
    int y_pos_row, end_row, y_end_border;

    s_needsUpdate = false;

    // Calc to position the selection in the ~middle of the screen

    adjust_top_size = 5 * font_size;
    mid_screen_y = (viewInfo->windowSizeY / 2) & ~(font_size - 1);
    y_pos_row = viewInfo->rowPos - (mid_screen_y / font_size);

    // TODO: Calculate how many channels we can draw given the width

    end_row = viewInfo->windowSizeY / font_size;
    y_end_border = viewInfo->windowSizeY - 48; // adjust to have some space at the end of the screen

    // Shared info for all tracks

    info.editText = trackData->editText;
    info.selectLeft = emini(viewInfo->selectStartTrack, viewInfo->selectStopTrack);
    info.selectRight = emaxi(viewInfo->selectStartTrack, viewInfo->selectStopTrack);
    info.selectTop  = emini(viewInfo->selectStartRow, viewInfo->selectStopRow);
    info.selectBottom = emaxi(viewInfo->selectStartRow, viewInfo->selectStopRow);
    info.viewInfo = viewInfo;
    info.trackData = trackData;
    info.startY = adjust_top_size;
    info.startPos = y_pos_row;
    info.endPos = y_pos_row + end_row;
    info.endSizeY = y_end_border;
    info.midPos = mid_screen_y + adjust_top_size;

    if (trackData->groupCount == 0)
        return false;

    x_pos = TrackView_getStartOffset() + -viewInfo->startPixel;

    printRowNumbers(2, adjust_top_size, end_row, y_pos_row, font_size, trackData->highlightRowStep, y_end_border);
    Emgui_drawBorder(border_color, border_color, 48, info.startY - font_size * 4, viewInfo->windowSizeX - 80, (info.endSizeY - info.startY) + 40);

    Emgui_setLayer(1);
    Emgui_setScissor(48, 0, viewInfo->windowSizeX - 80, viewInfo->windowSizeY);
    Emgui_setFont(viewInfo->smallFontId);

    ///sel_track = setActiveTrack(viewInfo, trackData, trackData->activeTrack, x_pos);

    //if (sel_track != trackData->activeTrack)
    //	TrackData_setActiveTrack(trackData, sel_track);

    for (i = start_track, end_track = trackData->syncData.num_tracks; i < end_track; )
    {
        Track* track = &trackData->tracks[i];
        Group* group = track->group;

        if (group->trackCount == 1)
        {
            int track_size = getTrackSize(viewInfo, track);

            if ((x_pos + track_size > 0) && (x_pos < viewInfo->windowSizeX))
            {
                // if selected track is less than the first rendered track then we need to reset it to this one

                Emgui_setFont(info.viewInfo->smallFontId);
                renderChannel(&info, x_pos, track, false);
            }

            x_pos += track_size;
            ++i;
        }
        else
        {
            x_pos += renderGroup(group, track, x_pos, &i, info, trackData);
        }
    }

    Emgui_setDefaultFont();

    Emgui_fill(Emgui_color32(127, 127, 127, 56), 0, mid_screen_y + adjust_top_size, viewInfo->windowSizeX, font_size + 1);

    //Emgui_setLayer(1);
    //drawBookmarks(trackData, 2, adjust_top_size, end_row, y_pos_row, viewInfo->windowSizeX, y_end_border);

    Emgui_setLayer(0);

    return s_needsUpdate;
}