Skip to content

Commit

Permalink
Add Turtle view window to show generated ttl file
Browse files Browse the repository at this point in the history
  • Loading branch information
brummer10 committed Jul 10, 2022
1 parent 47715db commit f135313
Show file tree
Hide file tree
Showing 6 changed files with 257 additions and 3 deletions.
2 changes: 1 addition & 1 deletion XUiDesigner/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
LDFLAGS += -fPIC -Wl,-z,noexecstack -Wl,--no-undefined -I./ -I../libxputty/libxputty/include/ \
`pkg-config --cflags --libs cairo x11 lilv-0` -lm
CXXFLAGS += -O2 -D_FORTIFY_SOURCE=2 -Wall -fstack-protector -DSHARE_DIR=\"$(SHARE_DIR)\"
DEBUG_CXXFLAGS += -g -D DEBUG
DEBUG_CXXFLAGS += -g -D DEBUG -DSHARE_DIR=\"$(SHARE_DIR)\"
# invoke build files
OBJECTS = $(wildcard *.c)
LOCALIZE = $(LOCALIZE_DIR)xfile-dialog.c $(LOCALIZE_DIR)xmessage-dialog.c $(LOCALIZE_DIR)xsavefile-dialoge.c
Expand Down
15 changes: 14 additions & 1 deletion XUiDesigner/XUiDesigner.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "XUiReparent.h"
#include "XUiSettings.h"
#include "XUiWriteTurtle.h"
#include "XUiTurtleView.h"
#include "XUiWritePlugin.h"
#include "xtabbox_private.h"

Expand Down Expand Up @@ -1318,6 +1319,11 @@ static void parse_faust_file (XUiDesigner *designer, char* filename) {
cmd = NULL;
free(outname);
outname = NULL;
XWindowAttributes attrs;
XGetWindowAttributes(designer->ttlfile_view->app->dpy, (Window)designer->ttlfile_view->widget, &attrs);
if (attrs.map_state == IsViewable) {
run_generate_ttl(designer->ttlfile, NULL);
}
//print_ttl(designer);
//print_plugin(designer);
}
Expand Down Expand Up @@ -1614,12 +1620,18 @@ int main (int argc, char ** argv) {
designer->grid->parent_struct = designer;
designer->grid->func.value_changed_callback = use_grid;

designer->settings = add_button(designer->w, "", 960, 740, 40, 40);
designer->settings = add_button(designer->w, "", 900, 740, 40, 40);
widget_get_png(designer->settings, LDVAR(settings_png));
tooltip_set_text(designer->settings,_("Project Settings"));
designer->settings->parent_struct = designer;
designer->settings->func.value_changed_callback = run_settings;

designer->ttlfile = add_button(designer->w, "", 960, 740, 40, 40);
widget_get_png(designer->ttlfile, LDVAR(file_png));
tooltip_set_text(designer->ttlfile,_("Show ttl file"));
designer->ttlfile->parent_struct = designer;
designer->ttlfile->func.value_changed_callback = run_generate_ttl;

designer->test = add_button(designer->w, "", 1020, 740, 40, 40);
widget_get_png(designer->test, LDVAR(gear_png));
tooltip_set_text(designer->test,_("Run test build"));
Expand Down Expand Up @@ -1766,6 +1778,7 @@ int main (int argc, char ** argv) {
designer->context_menu->func.button_release_callback = pop_menu_response;

create_project_settings_window(designer);
create_text_view_window(designer);

widget_show_all(designer->w);
widget_show_all(designer->ui);
Expand Down
2 changes: 2 additions & 0 deletions XUiDesigner/XUiDesigner.h
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,8 @@ typedef struct {
Widget_t *systray;
Widget_t *systray_menu;
Widget_t *settings;
Widget_t *ttlfile;
Widget_t *ttlfile_view;
Widget_t *set_project;
Widget_t *project_title;
Widget_t *project_author;
Expand Down
8 changes: 7 additions & 1 deletion XUiDesigner/XUiLv2Parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
#include "XUiWriteJson.h"
#include "XUiWritePlugin.h"
#include "XUiSettings.h"

#include "XUiTurtleView.h"
#

/*---------------------------------------------------------------------
-----------------------------------------------------------------------
Expand Down Expand Up @@ -738,6 +739,11 @@ void load_plugin_ui(void* w_, void* user_data) {
if (designer->active_widget != NULL)
box_entry_set_text(designer->controller_label, designer->active_widget->label);
widget_show_all(designer->ui);
XWindowAttributes attrs;
XGetWindowAttributes(designer->ttlfile_view->app->dpy, (Window)designer->ttlfile_view->widget, &attrs);
if (attrs.map_state == IsViewable) {
run_generate_ttl(designer->ttlfile, NULL);
}
}


Expand Down
190 changes: 190 additions & 0 deletions XUiDesigner/XUiTurtleView.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
/*
* 0BSD
*
* BSD Zero Clause License
*
* Copyright (c) 2021 Hermann Meyer
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted.
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
*/

#include "XUiTurtleView.h"
#include "XUiWriteTurtle.h"


/*---------------------------------------------------------------------
-----------------------------------------------------------------------
show generated ttl file for loaded plugin
-----------------------------------------------------------------------
----------------------------------------------------------------------*/

static void adjust_viewport(void *w_, void* user_data) {
Widget_t *parent = (Widget_t*)w_;
Widget_t *w = parent->childlist->childs[1];
XWindowAttributes attrs;
XGetWindowAttributes(parent->app->dpy, (Window)parent->widget, &attrs);
int height_t = attrs.height;
XGetWindowAttributes(parent->app->dpy, (Window)w->widget, &attrs);
int height = attrs.height;
float d = (float)height/(float)height_t;
float max_value = (float)((float)height/((float)(height_t/(float)(height-height_t))*(d*10.0)));
float value = adj_get_value(w->adj);
w->adj_y->max_value = max_value;
if (max_value < value) adj_set_value(w->adj,value);
}

static void draw_ttlview(void *w_, void* user_data) {
Widget_t *w = (Widget_t*)w_;
Widget_t *p = (Widget_t*)w->parent;
FILE *fp;
if ((fp=fopen("/tmp/xui.ttl", "r"))==NULL) {
printf("open failed\n");
}
int i = 1;
char buf[200];
while(fgets(buf,sizeof(buf),fp) != NULL) {
i++;
}
fseek(fp, 0, SEEK_SET);
XResizeWindow(w->app->dpy, w->widget, w->width, (w->app->normal_font/w->scale.ascale) * i + 6 * i + 10);
adjust_viewport(p, NULL);

cairo_set_source_rgba(w->crb, 0.13, 0.13, 0.13, 1.0);
cairo_paint (w->crb);

i = 1;
use_text_color_scheme(w, get_color_state(w));
cairo_set_font_size (w->crb, w->app->normal_font/w->scale.ascale);

while(fgets(buf,sizeof(buf),fp) != NULL) {
strdecode(buf, "\n", "");
cairo_move_to (w->crb, 10, (w->app->normal_font/w->scale.ascale) * i + 6 * i);
cairo_show_text(w->crb, buf);
i++;
}
fclose(fp);
fp = NULL;

}

static void draw_viewslider(void *w_, void* user_data) {
Widget_t *w = (Widget_t*)w_;
int v = (int)w->adj->max_value;
if (!v) return;
XWindowAttributes attrs;
XGetWindowAttributes(w->app->dpy, (Window)w->widget, &attrs);
if (attrs.map_state != IsViewable) return;
int width = attrs.width;
int height = attrs.height;
float sliderstate = adj_get_state(w->adj);
use_bg_color_scheme(w, get_color_state(w));
cairo_rectangle(w->crb, 0,0,width,height);
cairo_fill_preserve(w->crb);
use_shadow_color_scheme(w, NORMAL_);
cairo_fill(w->crb);
use_bg_color_scheme(w, NORMAL_);
cairo_rectangle(w->crb, 0,(height-10)*sliderstate,width,10);
cairo_fill(w->crb);
}

static void set_viewpoint(void *w_, void* user_data) {
Widget_t *w = (Widget_t*)w_;
Widget_t *p = (Widget_t*)w->parent;
Widget_t *slider = p->childlist->childs[0];
adj_set_state(slider->adj, adj_get_state(w->adj));
int v = (int)max(0,adj_get_value(w->adj));
XMoveWindow(w->app->dpy,w->widget,0, -10*v);
}

static void set_viewport(void *w_, void* user_data) {
Widget_t *w = (Widget_t*)w_;
Widget_t *p = (Widget_t*)w->parent;
Widget_t *viewport = p->childlist->childs[1];
adj_set_state(viewport->adj, adj_get_state(w->adj));
}

Widget_t* add_viewport(Widget_t *parent, int width, int height) {
Widget_t *slider = add_vslider(parent, "", 510, 0, 10, 800);
slider->func.expose_callback = draw_viewslider;
slider->adj_y = add_adjustment(slider,0.0, 0.0, 0.0, 1.0,0.0085, CL_VIEWPORTSLIDER);
slider->adj = slider->adj_y;
slider->func.value_changed_callback = set_viewport;
slider->scale.gravity = NORTHWEST;
slider->flags &= ~USE_TRANSPARENCY;
slider->flags |= NO_AUTOREPEAT | NO_PROPAGATE;

Widget_t *wid = create_widget(parent->app, parent, 0, 0, width, height);
XSelectInput(wid->app->dpy, wid->widget,StructureNotifyMask|ExposureMask|KeyPressMask
|EnterWindowMask|LeaveWindowMask|ButtonReleaseMask|KeyReleaseMask
|ButtonPressMask|Button1MotionMask|PointerMotionMask);
Widget_t *p = (Widget_t*)parent->parent;
wid->parent_struct = p->parent_struct;
wid->scale.gravity = NONE;
wid->flags &= ~USE_TRANSPARENCY;
wid->flags |= NO_AUTOREPEAT | NO_PROPAGATE;
XWindowAttributes attrs;
XGetWindowAttributes(parent->app->dpy, (Window)parent->widget, &attrs);
int height_t = attrs.height;
float d = (float)height/(float)height_t;
float max_value = (float)((float)height/((float)(height_t/(float)(height-height_t))*(d*10.0)));
wid->adj_y = add_adjustment(wid,0.0, 0.0, 0.0,max_value ,3.0, CL_VIEWPORT);
wid->adj = wid->adj_y;
wid->func.adj_callback = set_viewpoint;
wid->func.expose_callback = draw_ttlview;
adj_set_value(wid->adj,0.0);

parent->func.configure_notify_callback = adjust_viewport;

return wid;
}

void create_text_view_window(XUiDesigner *designer) {
Atom wmStateAbove = XInternAtom(designer->w->app->dpy, "_NET_WM_STATE_ABOVE", 1 );
Atom wmNetWmState = XInternAtom(designer->w->app->dpy, "_NET_WM_STATE", 1 );

designer->ttlfile_view = create_window(designer->w->app, DefaultRootWindow(designer->w->app->dpy), 0, 0, 520, 800);
XChangeProperty(designer->w->app->dpy, designer->ttlfile_view->widget, wmNetWmState, XA_ATOM, 32,
PropModeReplace, (unsigned char *) &wmStateAbove, 1);
//XSetTransientForHint(designer->w->app->dpy, w->widget, designer->ui->widget);
//designer->set_project->func.expose_callback = draw_text_window;
designer->ttlfile_view->flags |= HIDE_ON_DELETE;
widget_set_title(designer->ttlfile_view, _("ttl"));

add_viewport(designer->ttlfile_view, 510, 800);
}

void run_generate_ttl(void *w_, void* user_data) {
Widget_t *w = (Widget_t*)w_;
if (w->flags & HAS_POINTER && !adj_get_value(w->adj_y)) {
XUiDesigner *designer = (XUiDesigner*)w->parent_struct;

FILE *fp;
if((fp=freopen("/tmp/xui.ttl", "w" ,stdout))==NULL) {
printf("open failed\n");
}

print_ttl(designer);

fclose(fp);
fp = NULL;
XWindowAttributes attrs;
XGetWindowAttributes(w->app->dpy, (Window)designer->ttlfile_view->widget, &attrs);
if (attrs.map_state != IsViewable) {
widget_show_all(designer->ttlfile_view);
} else {
Widget_t *viewport = designer->ttlfile_view->childlist->childs[1];
expose_widget(viewport);
}

}
}
43 changes: 43 additions & 0 deletions XUiDesigner/XUiTurtleView.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* 0BSD
*
* BSD Zero Clause License
*
* Copyright (c) 2021 Hermann Meyer
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted.
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
*/



#include "XUiDesigner.h"


#pragma once

#ifndef XUITURTLEVIEW_H_
#define XUITURTLEVIEW_H_

#ifdef __cplusplus
extern "C" {
#endif

void create_text_view_window(XUiDesigner *designer);

void run_generate_ttl(void *w_, void* user_data);

#ifdef __cplusplus
}
#endif

#endif //XUITURTLEVIEW_H_

0 comments on commit f135313

Please sign in to comment.