mtsedit/src/load.c

229 lines
8.0 KiB
C

/*
* mtsedit/load.c
*
* Copyright (C) 2019 bzt (bztsrc@gitlab)
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* @brief Load file window
*
*/
#include "main.h"
#include <unistd.h>
int loadfld = 0, loadmax = 0, loadpos = 0, loadscr = 0;
char **loadfiles = NULL;
extern int savepos, savelen;
extern char cur[2];
/**
* Do the file load
*/
void load_do()
{
char *fn, d = loadfiles[loadpos][0] == '/';
if(isdir(mtsfile)) {
fn = mtsfile + strlen(mtsfile);
if(fn[-1] != DIRSEP) { *fn++ = DIRSEP; *fn = 0; }
} else {
fn = strrchr(mtsfile, DIRSEP);
if(!fn) fn = mtsfile; else fn++;
*fn = 0;
}
if(!mtsfile[0] || (mtsfile[0] == '.' && (!mtsfile[1] || (mtsfile[1] == DIRSEP && !mtsfile[2])))) {
getcwd(mtsfile, MAXPATHLEN);
fn = mtsfile + strlen(mtsfile);
if(fn[-1] != DIRSEP) { *fn++ = DIRSEP; *fn = 0; }
}
if(!strcmp(loadfiles[loadpos], "/..")) {
fn[-1] = 0;
fn = strrchr(mtsfile, DIRSEP);
if(!fn) fn = mtsfile; else fn++;
*fn = 0;
if(!mtsfile[0]) {
getcwd(mtsfile, MAXPATHLEN);
fn = mtsfile + strlen(mtsfile);
if(fn[-1] != DIRSEP) { *fn++ = DIRSEP; *fn = 0; }
}
} else
strcpy(fn, loadfiles[loadpos] + d);
freedir(loadmax, &loadfiles);
if(d) loadpos = loadscr = loadmax = 0;
savelen = savepos = strlen(mtsfile);
if(!isdir(mtsfile))
sdldo(-2);
}
/**
* Redraw the Load file window
*/
void load_redraw()
{
int i, j, k;
SDL_Rect rect;
rect.x = 36; rect.y = 0; rect.w = screen->w - 36; rect.h = screen->h - font->height;
SDL_FillRect(screen, &rect, theme[THEME_BG]);
strmaxw = screen->w - 5;
sdlprint((screen->w - 47 - mbstrlen(lang[LOADFROM]) * (font->width+1)) / 2 + 47, 4, THEME_INPUT, THEME_BG, lang[LOADFROM]);
rect.y = 12 + font->height;
sdlprint(42, rect.y, THEME_FG, THEME_BG, lang[FILENAME]);
rect.x = 200; rect.w = screen->w - 205; rect.h = font->height + 2;
SDL_FillRect(screen, &rect, theme[THEME_INPBG]);
strmaxw = screen->w - 5;
sdlprint(201,rect.y + 1, !loadfld ? THEME_INPUT : THEME_INACT, THEME_INPBG, mtsfile);
if(!loadfld) {
cur[0] = mtsfile[savepos] ? mtsfile[savepos] : ' ';
sdlprint(201 + savepos * (font->width+1), rect.y + 1, THEME_INPBG, THEME_INPUT, cur);
}
rect.y = 16 + 2*font->height;
j = screen->h - 2*font->height - 8;
rect.x = 36; rect.h = j - rect.y; rect.w = screen->w - 41;
SDL_FillRect(screen, &rect, theme[THEME_INPBG]);
if(!loadfiles)
loadmax = listdir(mtsfile, &loadfiles, 1);
for(i = loadscr; i < loadmax && (rect.y + (int)font->height) < j; i++, rect.y += font->height) {
if(loadfiles[i][0] == '/') {
strsepar = 0;
sdlprint(44, rect.y, loadfld == 1 && loadpos == i ? THEME_INPUT : THEME_INACT, THEME_INPBG, "\002\003");
strsepar = 1;
k = 1;
} else k = 0;
sdlprint(48 + 2*font->width, rect.y, loadfld == 1 && loadpos == i ? THEME_INPUT : THEME_INACT, THEME_INPBG,
loadfiles[i] + k);
}
rect.y = j + 4;
rect.h = font->height + 2;
SDL_FillRect(screen, &rect, theme[loadfld == 2 ? THEME_INPUT : THEME_FG]);
sdlprint((screen->w - 47 - mbstrlen(lang[LOADBTN]) * (font->width+1)) / 2 + 42, rect.y+1,
THEME_BG, loadfld == 2 ? THEME_INPUT : THEME_FG, lang[LOADBTN]);
}
/**
* Load file window scrolling event handler
*/
void load_scroll(SDL_Event *event)
{
loadscr -= event->wheel.y;
if(loadscr < 0) loadscr = 0;
if(loadscr + 1 >= loadmax) loadscr = loadmax - 1;
}
/**
* Load file window mouse down event handler
*/
void load_mousedown(SDL_Event *event)
{
int i = screen->h - 2*font->height - 4;
if(event->button.x < 42) return;
if(event->button.y >= (int)(12 + font->height) && event->button.y < (int)(16 + 2*font->height) && loadfld) {
loadfld = 0; savepos = savelen = strlen(mtsfile);
}
if(event->button.y >= i && event->button.y < (int)(i + font->height)) load_do();
else if(event->button.y >= (int)(16 + 2*font->height) && event->button.y < i) {
i = loadscr + (event->button.y - (16 + 2*font->height)) / font->height;
if(i + 1 >= loadmax) i = loadmax - 1;
if(loadfld != 1) {
loadpos = i;
} else {
if(i != loadpos) loadpos = i;
else load_do();
}
loadfld = 1;
}
}
/**
* Load file window key event handler
*/
void load_key(SDL_Event *event)
{
int i, j;
switch(event->type) {
case SDL_TEXTINPUT:
j = strlen(event->text.text);
if(!loadfld && savelen + j < (int)(sizeof(mtsfile))) {
for(i = savelen - 1; i >= savepos; i--) mtsfile[i + j] = mtsfile[i];
memcpy(mtsfile + savepos, &event->text.text, j);
savepos += j;
savelen += j;
mtsfile[savelen] = 0;
freedir(loadmax, &loadfiles);
}
break;
case SDL_KEYUP:
switch (event->key.keysym.sym) {
case SDLK_TAB:
if(loadfld >= 2) loadfld = 0; else loadfld++;
break;
case SDLK_BACKSPACE:
if(!loadfld && savepos) {
savepos--;
for(i = savepos; i < savelen + 1; i++) mtsfile[i] = mtsfile[i+1];
savelen--;
freedir(loadmax, &loadfiles);
}
break;
case SDLK_DELETE:
if(!loadfld && savepos < savelen) {
for(i = savepos; i < savelen + 1; i++) mtsfile[i] = mtsfile[i+1];
savelen--;
freedir(loadmax, &loadfiles);
}
break;
case SDLK_UP:
if(!loadfld) savepos = 0;
if(loadfld == 1) {
if(!loadpos && loadmax) loadpos = loadmax - 1; else loadpos--;
if(loadpos < loadscr) loadscr = loadpos;
i = ((screen->h - 2*font->height - 8) - (16 + 2*font->height)) / font->height;
if(loadpos >= loadscr + i) loadscr = loadpos - i;
}
break;
case SDLK_DOWN:
if(!loadfld) savepos = savelen;
if(loadfld == 1) {
if(loadpos + 1 >= loadmax) loadpos = 0; else loadpos++;
if(loadpos < loadscr) loadscr = loadpos;
i = ((screen->h - 2*font->height - 8) - (16 + 4*font->height)) / font->height;
if(loadpos >= loadscr + i) loadscr = loadpos - i;
}
break;
case SDLK_LEFT:
if(!loadfld && savepos) savepos--;
break;
case SDLK_RIGHT:
if(!loadfld && savepos < savelen) savepos++;
break;
case SDLK_RETURN: load_do(); break;
}
break;
}
}