Added country flags
|
@ -9,6 +9,10 @@ This program is free software: you can redistribute it and/or modify it under th
|
|||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
---
|
||||
|
||||
Flag icons: Copyright (c) 2013 Panayiotis Lipiridis
|
||||
#+END_QUOTE
|
||||
|
||||
* ccvt
|
||||
|
|
138
ccvt-gui.c
|
@ -2,19 +2,19 @@
|
|||
#define NK_INCLUDE_STANDARD_IO
|
||||
#define NK_INCLUDE_STANDARD_VARARGS
|
||||
#define NK_INCLUDE_DEFAULT_ALLOCATOR
|
||||
#define NK_INCLUDE_FONT_BAKING
|
||||
#define NK_IMPLEMENTATION
|
||||
#define NK_XLIB_IMPLEMENTATION
|
||||
#define STB_IMAGE_IMPLEMENTATION
|
||||
#define NK_XLIB_INCLUDE_STB_IMAGE
|
||||
|
||||
#include <nuklear.h> // GUI lib
|
||||
#include "lib/nuklear_xlib.h"
|
||||
#include "lib/startsWith.h"
|
||||
#include "lib/dirExists.h"
|
||||
#include "lib/ccvt.h"
|
||||
#include "lib/langs.h"
|
||||
#include "lib/style.c"
|
||||
#include <nuklear.h> // GUI lib
|
||||
#include "lib/getUsedImgPath.h"
|
||||
#include "lib/nuklear_xlib.h"
|
||||
#include "lib/startsWith.h"
|
||||
#include "lib/dirExists.h"
|
||||
#include "lib/langs.h"
|
||||
#include "lib/style.c"
|
||||
#include "lib/ccvt.h"
|
||||
|
||||
#define DTIME 20
|
||||
|
||||
|
@ -84,23 +84,47 @@ static int lookup (struct nk_context * context, nk_flags event, struct cu
|
|||
return 0;
|
||||
}
|
||||
|
||||
enum {COMBOBOX, SEARCH};
|
||||
enum {COMBOBOX, SEARCH} ;
|
||||
|
||||
static char * flagPath (char * imgPath, struct currency * currencies, int val, char * path) {
|
||||
// clear "path"
|
||||
strcpy(path, "\0" );
|
||||
|
||||
// construct flag path
|
||||
strcat(path, imgPath );
|
||||
strcat(path, "flags/" );
|
||||
strcat(path, currencies[val].name);
|
||||
strcat(path, ".bmp" );
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
static void searchin (struct nk_context * context, nk_flags event, struct currency * currencies, int currNum, struct nk_vec2 size, int * val, char ** options, char * buffer, int op, char * fieldLabel, char * searchLabel, char * imgPath, struct nk_image flag, char * path) {
|
||||
|
||||
static void searchin (struct nk_context * context, nk_flags event, struct currency * currencies, int currNum, struct nk_vec2 size, int * val, char ** options, char * buffer, int op, char * fieldLabel, char * searchLabel) {
|
||||
nk_layout_row_dynamic (context, ROW_HEIGHT, 1 );
|
||||
|
||||
nk_label (context, fieldLabel, NK_TEXT_LEFT );
|
||||
if (op == COMBOBOX)
|
||||
nk_combobox (context, (const char **) options, currNum, &*val, 20, size);
|
||||
else {
|
||||
*val = lookup (context, event, currencies, currNum,
|
||||
searchLabel, buffer );
|
||||
if (op == COMBOBOX) {
|
||||
nk_layout_row_dynamic(context, ROW_HEIGHT, 2 );
|
||||
|
||||
nk_layout_row_dynamic(context, ROW_HEIGHT, 1 );
|
||||
nk_combobox (context, (const char **) options, currNum, &*val, 20, size);
|
||||
}
|
||||
else {
|
||||
*val = lookup (context, event, currencies, currNum,
|
||||
searchLabel, buffer );
|
||||
|
||||
nk_layout_row_dynamic(context, ROW_HEIGHT, 2 );
|
||||
|
||||
nk_text (context, currencies[*val].name, 3,
|
||||
NK_TEXT_CENTERED );
|
||||
|
||||
}
|
||||
|
||||
// set flag
|
||||
flag = nk_xsurf_load_image_from_file(flagPath(imgPath, currencies, *val, path) );
|
||||
|
||||
// show flag
|
||||
nk_image (context, flag );
|
||||
}
|
||||
|
||||
int main() {
|
||||
|
@ -132,13 +156,15 @@ int main() {
|
|||
Button1MotionMask | Button3MotionMask | Button4MotionMask |
|
||||
Button5MotionMask | PointerMotionMask | KeymapStateMask ;
|
||||
|
||||
xw.win = XCreateWindow (xw.dpy, xw.root, 0, 0, WINDOW_WIDTH*2.7, WINDOW_HEIGHT*1.5, 0,
|
||||
xw.win = XCreateWindow (xw.dpy, xw.root, 0, 0,
|
||||
WINDOW_WIDTH *2.7,
|
||||
WINDOW_HEIGHT*1.5, 0,
|
||||
XDefaultDepth(xw.dpy, xw.screen), InputOutput,
|
||||
xw.vis, CWEventMask | CWColormap, &xw.swa) ;
|
||||
|
||||
XStoreName (xw.dpy, xw.win, PROGRAM_NAME ) ;
|
||||
XMapWindow (xw.dpy, xw.win ) ;
|
||||
xw.wm_delete_window = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False) ;
|
||||
xw.wm_delete_window = XInternAtom (xw.dpy, "WM_DELETE_WINDOW", False) ;
|
||||
XSetWMProtocols (xw.dpy, xw.win, &xw.wm_delete_window, 1) ;
|
||||
XGetWindowAttributes(xw.dpy, xw.win, &xw.attr ) ;
|
||||
xw.width = (unsigned int) xw.attr.width ;
|
||||
|
@ -161,38 +187,32 @@ int main() {
|
|||
options[i] = currencies[i].name;
|
||||
|
||||
// currency pick combobox stuff
|
||||
static int init = 0 ,
|
||||
targ = 0 , // selected currencies
|
||||
temp = 0 ;
|
||||
struct nk_vec2 size = {140 , // dropdown menu width
|
||||
400} , // = height
|
||||
langSize = {100 ,
|
||||
100} ;
|
||||
static int init = 0 ,
|
||||
targ = 0 , // selected currencies
|
||||
temp = 0 ;
|
||||
struct nk_vec2 size = {140 , // dropdown menu width
|
||||
400} , // = height
|
||||
langSize = {100 ,
|
||||
100} ;
|
||||
|
||||
// other vars
|
||||
nk_flags event = 0 ;
|
||||
char out[OUTPUTSIZE] ;
|
||||
long double result ;
|
||||
static int op = COMBOBOX ,
|
||||
lang = ENGLISH ; // default lang
|
||||
nk_flags event = 0 ;
|
||||
char out [OUTPUTSIZE ] ;
|
||||
long double result ;
|
||||
static int op = COMBOBOX ,
|
||||
lang = ENGLISH ; // default lang
|
||||
|
||||
// images
|
||||
struct nk_image map ;
|
||||
char * mapLo = getMapImgPath() ;
|
||||
char * fName = getMapImgName() ;
|
||||
char mapP[strlen(mapLo) + strlen(fName)]; // make enough room
|
||||
// for the full path
|
||||
struct nk_image map ,
|
||||
flag = nk_xsurf_load_image_from_file("");
|
||||
char * imgPa = getUsedImgPath() ;
|
||||
char * fName = getMapImgName () ;
|
||||
char mapP [strlen(imgPa) + strlen(fName)] , // make enough room
|
||||
flagPath[BUFFERSIZE] ;
|
||||
|
||||
if (!dirExists(mapLo)) // this probably
|
||||
// means that the
|
||||
// program hasn't
|
||||
// been "installed"
|
||||
// yet
|
||||
mapLo="pix/";
|
||||
|
||||
strcpy(mapP, mapLo);
|
||||
strcpy(mapP, imgPa);
|
||||
strcat(mapP, fName);
|
||||
map = nk_xsurf_load_image_from_file(mapP);
|
||||
map = nk_xsurf_load_image_from_file(mapP);
|
||||
|
||||
// initialise labels in different languages
|
||||
initLabels();
|
||||
|
@ -224,11 +244,13 @@ int main() {
|
|||
currNum, size,
|
||||
&init, options, search,
|
||||
op,
|
||||
label[lang].initial, label[lang].search );
|
||||
labels[lang].initial, labels[lang].search,
|
||||
imgPa,
|
||||
flag, flagPath );
|
||||
|
||||
nk_layout_row_dynamic(ctx, ROW_HEIGHT, 1 );
|
||||
|
||||
nk_label (ctx, label[lang].value, NK_TEXT_LEFT );
|
||||
nk_label (ctx, labels[lang].value, NK_TEXT_LEFT );
|
||||
event = textin (ctx, buffer );
|
||||
|
||||
nk_group_end (ctx );
|
||||
|
@ -237,13 +259,13 @@ int main() {
|
|||
if (nk_group_begin(ctx, "group2", 0 )) { // group 2
|
||||
nk_layout_row_dynamic(ctx, ROW_HEIGHT, 2 );
|
||||
|
||||
if (nk_option_label(ctx, label[lang].select, op == COMBOBOX)) op = COMBOBOX;
|
||||
if (nk_option_label(ctx, label[lang].search, op == SEARCH )) op = SEARCH ;
|
||||
if (nk_option_label(ctx, labels[lang].select, op == COMBOBOX)) op = COMBOBOX;
|
||||
if (nk_option_label(ctx, labels[lang].search, op == SEARCH )) op = SEARCH ;
|
||||
|
||||
nk_layout_row_dynamic(ctx, ROW_HEIGHT + 10, 1 );
|
||||
|
||||
// invert button
|
||||
if (nk_button_label(ctx, label[lang].invert)) {
|
||||
if (nk_button_label(ctx, labels[lang].invert)) {
|
||||
if (op == COMBOBOX) {
|
||||
temp = init;
|
||||
init = targ;
|
||||
|
@ -260,7 +282,7 @@ int main() {
|
|||
nk_layout_row_dynamic(ctx, ROW_HEIGHT + 10, 1 );
|
||||
|
||||
// update eRates button
|
||||
if (nk_button_label(ctx, label[lang].update )) {
|
||||
if (nk_button_label(ctx, labels[lang].update )) {
|
||||
system ("update-eRates.sh" );
|
||||
currencies = getValues( );
|
||||
}
|
||||
|
@ -269,7 +291,7 @@ int main() {
|
|||
|
||||
nk_layout_row_static (ctx, 30, 100, 1 );
|
||||
|
||||
nk_label (ctx, label[lang].language, NK_TEXT_LEFT );
|
||||
nk_label (ctx, labels[lang].language, NK_TEXT_LEFT );
|
||||
nk_combobox (ctx, languages, sizeof(languages)/sizeof(languages[0]) ,
|
||||
&lang, 20, langSize );
|
||||
|
||||
|
@ -282,7 +304,9 @@ int main() {
|
|||
currNum, size,
|
||||
&targ, options, search1,
|
||||
op,
|
||||
label[lang].target, label[lang].search );
|
||||
labels[lang].target, labels[lang].search,
|
||||
imgPa,
|
||||
flag, flagPath );
|
||||
|
||||
// convert
|
||||
result = convert(atof(buffer), currencies[init].name, currencies[targ].name,
|
||||
|
@ -294,7 +318,7 @@ int main() {
|
|||
|
||||
nk_layout_row_dynamic(ctx, ROW_HEIGHT, 1 );
|
||||
|
||||
nk_label (ctx, label[lang].value, NK_TEXT_RIGHT );
|
||||
nk_label (ctx, labels[lang].value, NK_TEXT_RIGHT );
|
||||
if (nk_widget_is_hovered(ctx))
|
||||
nk_tooltip (ctx, out );
|
||||
nk_text (ctx, out, strlen(out),
|
||||
|
@ -305,13 +329,13 @@ int main() {
|
|||
nk_end (ctx );
|
||||
}
|
||||
|
||||
if (nk_begin(ctx, label[lang].map,
|
||||
if (nk_begin(ctx, labels[lang].map,
|
||||
nk_rect(WINDOW_WIDTH + 10, -1, // so that the new window spawns
|
||||
// right next to the previous
|
||||
// one
|
||||
MAP_WIDTH, MAP_HEIGHT + 42 /* title bar */),
|
||||
NK_WINDOW_MOVABLE | NK_WINDOW_TITLE |
|
||||
NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR )) {
|
||||
MAP_WIDTH, MAP_HEIGHT + 42 /* title bar */),
|
||||
NK_WINDOW_MOVABLE | NK_WINDOW_TITLE |
|
||||
NK_WINDOW_BORDER | NK_WINDOW_NO_SCROLLBAR )) {
|
||||
nk_layout_row_dynamic(ctx, MAP_HEIGHT, 1);
|
||||
|
||||
nk_image (ctx, map );
|
||||
|
|
|
@ -36,4 +36,4 @@ long double convert(long double value, char * init, char * targ, char * launch,
|
|||
return toEuro(value, init, launch, currencies, currNum, gui) * getExch(targ, launch, currencies, currNum, gui);
|
||||
}
|
||||
|
||||
#endif // CCVT_H_
|
||||
#endif // CCVT_H_
|
||||
|
|
|
@ -1,10 +1,27 @@
|
|||
// Copyright (C) 2022-2023 mirk0dex <mirkodi.eu>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
// dirExists lib: determine whether specified directory exists or not
|
||||
|
||||
#ifndef DIREXISTS_H_
|
||||
#define DIREXISTS_H_
|
||||
|
||||
#include <dirent.h>
|
||||
|
||||
int dirExists(char * dirname) {
|
||||
DIR* dir = opendir(dirname);
|
||||
DIR * dir = opendir(dirname);
|
||||
if (dir) {
|
||||
return 1; // dir exists
|
||||
} else {
|
||||
|
@ -12,4 +29,4 @@ int dirExists(char * dirname) {
|
|||
}
|
||||
}
|
||||
|
||||
#endif // DIREXISTS_H_
|
||||
#endif // DIREXISTS_H_
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
// Copyright (C) 2022-2023 mirk0dex <mirkodi.eu>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
// fileCount lib: count files in a directory
|
||||
|
||||
#ifndef FILECOUNT_H_
|
||||
#define FILECOUNT_H_
|
||||
|
||||
#include <dirent.h>
|
||||
#include "../options.h"
|
||||
#include "dirExists.h"
|
||||
|
||||
// thanks to https://stackoverflow.com/users/1891/jay-conrod/users/120338/michiel-buddingh
|
||||
long int fileCount(char * dirname) {
|
||||
// vars
|
||||
long int fileCount = 0 ;
|
||||
DIR * dir = opendir(dirname);
|
||||
struct dirent * entry ;
|
||||
|
||||
if (dirExists(dirname)) {
|
||||
while ((entry = readdir(dir)) != NULL)
|
||||
if (entry -> d_type == DT_REG) // if entry is a regular file
|
||||
++fileCount;
|
||||
}
|
||||
else
|
||||
return 0 ;
|
||||
|
||||
return fileCount;
|
||||
}
|
||||
|
||||
#endif // FILECOUNT_H_
|
|
@ -0,0 +1,17 @@
|
|||
#ifndef GETUSEDIMGPATH_H_
|
||||
#define GETUSEDIMGPATH_H_
|
||||
|
||||
#include "dirExists.h"
|
||||
#include "../options.h"
|
||||
|
||||
char * getUsedImgPath() {
|
||||
char * mapLo = getImgPath ();
|
||||
|
||||
if (!dirExists(mapLo)) // this probably means that the program hasn't been
|
||||
// "installed" yet
|
||||
mapLo = getAltImgPath();
|
||||
|
||||
return mapLo;
|
||||
}
|
||||
|
||||
#endif // GETUSEDIMGPATH_H_
|
56
lib/langs.h
|
@ -14,43 +14,43 @@ struct label {
|
|||
char * map ;
|
||||
};
|
||||
|
||||
struct label label [3] ;
|
||||
struct label labels [3] ;
|
||||
enum { ENGLISH, ITALIAN, ESPERANTO };
|
||||
const char * languages[ ] = {"English", "Italiano", "Esperanto"};
|
||||
|
||||
void initLabels() {
|
||||
// english
|
||||
label[ENGLISH ].invert = "Invert" ;
|
||||
label[ENGLISH ].search = "Search" ;
|
||||
label[ENGLISH ].select = "Select" ;
|
||||
label[ENGLISH ].value = "Value" ;
|
||||
label[ENGLISH ].update = "Update exch. r.s" ;
|
||||
label[ENGLISH ].initial = "Initial currency" ;
|
||||
label[ENGLISH ].target = "Target currency" ;
|
||||
label[ENGLISH ].language = "Language" ;
|
||||
label[ENGLISH ].map = "Map" ;
|
||||
labels[ENGLISH ].invert = "Invert" ;
|
||||
labels[ENGLISH ].search = "Search" ;
|
||||
labels[ENGLISH ].select = "Select" ;
|
||||
labels[ENGLISH ].value = "Value" ;
|
||||
labels[ENGLISH ].update = "Update exch. r.s" ;
|
||||
labels[ENGLISH ].initial = "Initial currency" ;
|
||||
labels[ENGLISH ].target = "Target currency" ;
|
||||
labels[ENGLISH ].language = "Language" ;
|
||||
labels[ENGLISH ].map = "Map" ;
|
||||
|
||||
// italian
|
||||
label[ITALIAN ].invert = "Inverti" ;
|
||||
label[ITALIAN ].search = "Cerca" ;
|
||||
label[ITALIAN ].select = "Seleziona" ;
|
||||
label[ITALIAN ].value = "Valore" ;
|
||||
label[ITALIAN ].update = "Aggiorna val. sc.";
|
||||
label[ITALIAN ].initial = "Valuta iniziale" ;
|
||||
label[ITALIAN ].target = "Valuta finale" ;
|
||||
label[ITALIAN ].language = "Lingua" ;
|
||||
label[ITALIAN ].map = "Mappa" ;
|
||||
labels[ITALIAN ].invert = "Inverti" ;
|
||||
labels[ITALIAN ].search = "Cerca" ;
|
||||
labels[ITALIAN ].select = "Seleziona" ;
|
||||
labels[ITALIAN ].value = "Valore" ;
|
||||
labels[ITALIAN ].update = "Aggiorna val. sc.";
|
||||
labels[ITALIAN ].initial = "Valuta iniziale" ;
|
||||
labels[ITALIAN ].target = "Valuta finale" ;
|
||||
labels[ITALIAN ].language = "Lingua" ;
|
||||
labels[ITALIAN ].map = "Mappa" ;
|
||||
|
||||
// esperanto
|
||||
label[ESPERANTO].invert = "Inversigi" ;
|
||||
label[ESPERANTO].search = "Elserchi" ;
|
||||
label[ESPERANTO].select = "Selekti" ;
|
||||
label[ESPERANTO].value = "Valoro" ;
|
||||
label[ESPERANTO].update = "Ghisdatigi kurzojn" ;
|
||||
label[ESPERANTO].initial = "Komenca valuto" ;
|
||||
label[ESPERANTO].target = "Cela valuto" ;
|
||||
label[ESPERANTO].language = "Lingvo" ;
|
||||
label[ESPERANTO].map = "Mapo" ;
|
||||
labels[ESPERANTO].invert = "Inversigi" ;
|
||||
labels[ESPERANTO].search = "Elserchi" ;
|
||||
labels[ESPERANTO].select = "Selekti" ;
|
||||
labels[ESPERANTO].value = "Valoro" ;
|
||||
labels[ESPERANTO].update = "Ghisdatigi kurzojn" ;
|
||||
labels[ESPERANTO].initial = "Komenca valuto" ;
|
||||
labels[ESPERANTO].target = "Cela valuto" ;
|
||||
labels[ESPERANTO].language = "Lingvo" ;
|
||||
labels[ESPERANTO].map = "Mapo" ;
|
||||
}
|
||||
|
||||
#endif // LANGS_H_
|
||||
|
|
|
@ -1,7 +1,24 @@
|
|||
#ifndef STARTSWITH_H_
|
||||
#define STARTSWITH_H_
|
||||
// Copyright (C) 2022-2023 mirk0dex <mirkodi.eu>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
#include <string.h>
|
||||
// startsWith lib: determine whether a string starts with given substring
|
||||
|
||||
#ifndef STARTSWITH_H_
|
||||
#define STARTSWITH_H_
|
||||
|
||||
#include <string.h>
|
||||
|
||||
int startsWith(const char * string, const char * startOfString) {
|
||||
if (strncmp(string, startOfString, strlen(startOfString)) == 0) return 1; // true
|
||||
|
|
16
options.h
|
@ -39,14 +39,24 @@ char * getERates () {
|
|||
return eRates;
|
||||
}
|
||||
|
||||
char * getMapImgPath() {
|
||||
char * getImgPath () {
|
||||
//// CONFIGURATION ////
|
||||
|
||||
char * mapImg = "/usr/share/ccvt/pix/";
|
||||
char * imgPath = "/usr/share/ccvt/pix/";
|
||||
|
||||
///////////////////////
|
||||
|
||||
return mapImg;
|
||||
return imgPath;
|
||||
}
|
||||
|
||||
char * getAltImgPath() {
|
||||
//// CONFIGURATION ////
|
||||
|
||||
char * imgPath = "./pix/";
|
||||
|
||||
///////////////////////
|
||||
|
||||
return imgPath;
|
||||
}
|
||||
|
||||
char * getMapImgName() {
|
||||
|
|
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Panayiotis Lipiridis
|
||||
|
||||
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.
|
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.7 KiB |