Esempio n. 1
0
static void endEditing()
{
	const char* track_name;
	struct track_key key;
	struct sync_track* track;
	int row_pos = getRowPos();
	int active_track = getActiveTrack();

	if (!is_editing || !getTracks())
		return;

	track = getTracks()[active_track];

	if (strcmp(s_editBuffer, ""))
	{

		key.row = row_pos;
		key.value = (float)atof(s_editBuffer);
		key.type = 0;

		if (track->num_keys > 0)
		{
			int idx = sync_find_key(track, getRowPos());

			if (idx > 0)
			{
				// exact match, keep current type
				key.type = track->keys[emaxi(idx, 0)].type;
			}
			else
			{
				// no match, grab type from previous key
				if (idx < 0)
					idx = -idx - 1;

				key.type = track->keys[emaxi(idx - 1, 0)].type;
			}
		}	

		track_name = track->name; 

		Commands_addOrUpdateKey(active_track, &key);
		updateNeedsSaving();
	}

	is_editing = false;
	s_editorData.trackData.editText = 0;
}
Esempio n. 2
0
static bool doEditing(int key)
{
	// special case if '.' key (in case of dvorak) would clatch with the same key for biasing we do this special case
	
	if ((key == '.' || key == EMGUI_KEY_BACKSPACE) && !is_editing)
		return false;

	if ((key >= '0' && key <= '9') || key == '.' || key == '-' || key == EMGUI_KEY_BACKSPACE)
	{
		if (!is_editing)
		{
			memset(s_editBuffer, 0, sizeof(s_editBuffer));
			is_editing = true;
		}

		if (key == EMGUI_KEY_BACKSPACE)
			s_editBuffer[emaxi(strlen(s_editBuffer) - 1, 0)] = 0;
		else
			s_editBuffer[strlen(s_editBuffer)] = (char)key;

		s_editorData.trackData.editText = s_editBuffer;

		return true;
	}

	return false;
}
Esempio n. 3
0
static void biasSelection(float value)
{
	int track, row;
	struct sync_track** tracks = getTracks();
	TrackViewInfo* viewInfo = getTrackViewInfo();
	int selectLeft = mini(viewInfo->selectStartTrack, viewInfo->selectStopTrack);
	int selectRight = maxi(viewInfo->selectStartTrack, viewInfo->selectStopTrack);
	int selectTop = mini(viewInfo->selectStartRow, viewInfo->selectStopRow);
	int selectBottom = maxi(viewInfo->selectStartRow, viewInfo->selectStopRow);
	
	// If we have no selection and no currenty key bias the previous key

	if (selectLeft == selectRight && selectTop == selectBottom)
	{
		int idx;
		struct sync_track* track;
		struct sync_track** tracks = getTracks();

		if (!tracks || !tracks[getActiveTrack()]->keys)
			return;

		track = tracks[getActiveTrack()];

		idx = sync_find_key(track, getRowPos());
		
		if (idx < 0) 
		{
			idx = -idx - 1;
			selectTop = selectBottom = track->keys[emaxi(idx - 1, 0)].row;
		}
	}
	
	Commands_beginMulti("biasSelection");

	for (track = selectLeft; track <= selectRight; ++track) 
	{
		struct sync_track* t = tracks[track];

		for (row = selectTop; row <= selectBottom; ++row) 
		{
			struct track_key newKey;
			int idx = sync_find_key(t, row);
			if (idx < 0) 
				continue;

			newKey = t->keys[idx];
			newKey.value += value;

			Commands_updateKey(track, &newKey);
		}
	}

	Commands_endMulti();
	updateNeedsSaving();
}
Esempio n. 4
0
static int getTrackSize(TrackViewInfo* viewInfo, Track* track)
{
    if (track->folded)
        return track_size_folded;

    if (track->width == 0)
    {
        Emgui_setFont(viewInfo->smallFontId);
        track->width = (Emgui_getTextSize(track->displayName) & 0xffff) + 31;
        track->width = emaxi(track->width, min_track_size);
    }

    return track->width;
}
Esempio n. 5
0
static void drawHorizonalSlider()
{
	int large_val; 
	TrackViewInfo* info = getTrackViewInfo();
	const int old_start = s_editorData.trackViewInfo.startPixel;
	const int total_track_width = TrackView_getWidth(info, getTrackData()) - (info->windowSizeX / 2);

	large_val = emaxi(total_track_width / 10, 1);

	Emgui_slider(0, info->windowSizeY - 36, info->windowSizeX, 14, 0, total_track_width, large_val, 
				EMGUI_SLIDERDIR_HORIZONTAL, 1, &s_editorData.trackViewInfo.startPixel);

	if (old_start != s_editorData.trackViewInfo.startPixel)
		Editor_updateTrackScroll();
}
Esempio n. 6
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;
}
Esempio n. 7
0
static void onPrevNextKey(bool prevKey, enum Selection selection)
{
	struct sync_track* track;
	struct sync_track** tracks = getTracks();
	TrackViewInfo* viewInfo = getTrackViewInfo(); 

	if (!tracks || !tracks[getActiveTrack()]->keys)
		return;

	track = tracks[getActiveTrack()];

	if (prevKey)
	{
		int idx = sync_find_key(track, getRowPos());
		if (idx < 0)
			idx = -idx - 1;

		setRowPos(track->keys[emaxi(idx - 1, 0)].row);

		if (selection == DO_SELECTION)
			viewInfo->selectStopRow = getRowPos();
		else
			viewInfo->selectStartRow = viewInfo->selectStopRow = getRowPos();
	}
	else
	{
		int row = 0;

		int idx = key_idx_floor(track, getRowPos());

		if (idx < 0)
			row = track->keys[0].row;
		else if (idx > (int)track->num_keys - 2)
			row = track->keys[track->num_keys - 1].row;
		else
			row = track->keys[idx + 1].row;

		setRowPos(row);	

		if (selection == DO_SELECTION)
			viewInfo->selectStopRow = row;
		else
			viewInfo->selectStartRow = viewInfo->selectStopRow = row;
	}
}
Esempio n. 8
0
static void onEnterCurrentValue()
{
	int idx;
	struct track_key key;
	struct sync_track* track;
	struct sync_track** tracks = getTracks();
	const int rowPos = getRowPos();
	const int activeTrack = getActiveTrack();

	if (!tracks)
		return;

	track = tracks[activeTrack];

	if (!track->keys)
	{
		key.row = rowPos;
		key.value = 0.0f;
		key.type = 0;

		Commands_addOrUpdateKey(activeTrack, &key);
		updateNeedsSaving();
		return;
	}

	idx = sync_find_key(track, rowPos);
	if (idx < 0)
		idx = -idx - 1;

    key.row = rowPos;
   
    if (track->num_keys > 0)
    {
        key.value = (float)sync_get_val(track, rowPos);
        key.type = track->keys[emaxi(idx - 1, 0)].type;
    }
    else
    {
        key.value = 0.0f;
        key.type = 0;
    }
    
	Commands_addOrUpdateKey(activeTrack, &key);
	updateNeedsSaving();
}
Esempio n. 9
0
void Editor_updateTrackScroll()
{
	int track_start_offset, sel_track, total_track_width = 0;
	int track_start_pixel = s_editorData.trackViewInfo.startPixel;
	TrackData* track_data = getTrackData();
	TrackViewInfo* view_info = getTrackViewInfo(); 

	total_track_width = TrackView_getWidth(getTrackViewInfo(), getTrackData());
	track_start_offset = TrackView_getStartOffset();

	track_start_pixel = eclampi(track_start_pixel, 0, emaxi(total_track_width - (view_info->windowSizeX / 2), 0)); 

	sel_track = TrackView_getScrolledTrack(view_info, track_data, track_data->activeTrack, 
										   track_start_offset - track_start_pixel);

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

	s_editorData.trackViewInfo.startPixel = track_start_pixel;
}
Esempio n. 10
0
static void drawVerticalSlider()
{
	int start_row = 0, end_row = 10000, width, large_val; 
	TrackData* trackData = getTrackData();
	TrackViewInfo* info = getTrackViewInfo();
	const int rowPos = getRowPos();

	if (trackData) 
	{
		start_row = trackData->startRow;
		end_row = trackData->endRow;
	}

	width = end_row - start_row;
	large_val = emaxi(width / 10, 1);

	Emgui_slider(info->windowSizeX - 26, 0, 20, info->windowSizeY, 0, width, large_val, 
				EMGUI_SLIDERDIR_VERTICAL, 1, &s_editorData.trackViewInfo.rowPos);

	if (rowPos != getRowPos())
		Editor_updateTrackScroll();
}
Esempio n. 11
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;
}