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); }
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(); } }
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; }
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; }
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; }
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; }
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); } }
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; }