treeview works
git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@762 b9cfdab3-6d41-4d17-bbe4-086880011989
This commit is contained in:
parent
d96c6fef5e
commit
75c73e98e1
5 changed files with 122 additions and 69 deletions
|
|
@ -35,6 +35,7 @@ struct _MwLLX11 {
|
||||||
|
|
||||||
int top;
|
int top;
|
||||||
int grabbed;
|
int grabbed;
|
||||||
|
int force_render;
|
||||||
|
|
||||||
unsigned long red_mask;
|
unsigned long red_mask;
|
||||||
unsigned long red_max;
|
unsigned long red_max;
|
||||||
|
|
|
||||||
|
|
@ -142,17 +142,18 @@ struct _MwComboBox {
|
||||||
struct _MwTreeViewEntry {
|
struct _MwTreeViewEntry {
|
||||||
char* label;
|
char* label;
|
||||||
MwLLPixmap pixmap;
|
MwLLPixmap pixmap;
|
||||||
MwTreeViewEntry* tree;
|
MwTreeViewEntry** tree;
|
||||||
int opened;
|
int opened;
|
||||||
int selected;
|
int selected;
|
||||||
unsigned long click_time;
|
unsigned long click_time;
|
||||||
|
MwTreeViewEntry* parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MwTreeView {
|
struct _MwTreeView {
|
||||||
MwWidget frame;
|
MwWidget frame;
|
||||||
MwWidget vscroll;
|
MwWidget vscroll;
|
||||||
int changed;
|
int changed;
|
||||||
MwTreeViewEntry* tree;
|
MwTreeViewEntry** tree;
|
||||||
|
|
||||||
MwPoint pressed;
|
MwPoint pressed;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
17
milsko.xml
17
milsko.xml
|
|
@ -618,5 +618,22 @@
|
||||||
</function>
|
</function>
|
||||||
</functions>
|
</functions>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget name="TreeView">
|
||||||
|
<properties>
|
||||||
|
<property name="leftPadding" />
|
||||||
|
<property name="singleClickSelectable" />
|
||||||
|
</properties>
|
||||||
|
<functions>
|
||||||
|
<function name="Add">
|
||||||
|
<pointer name="parent" />
|
||||||
|
<pixmap name="pixmap" />
|
||||||
|
<string name="item" />
|
||||||
|
</function>
|
||||||
|
<function name="Delete">
|
||||||
|
<pointer name="item" />
|
||||||
|
</function>
|
||||||
|
<function name="Reset" />
|
||||||
|
</functions>
|
||||||
|
</widget>
|
||||||
</widgets>
|
</widgets>
|
||||||
</milsko>
|
</milsko>
|
||||||
|
|
|
||||||
|
|
@ -202,6 +202,7 @@ static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
|
||||||
r->x11.height = height;
|
r->x11.height = height;
|
||||||
|
|
||||||
r->x11.grabbed = 0;
|
r->x11.grabbed = 0;
|
||||||
|
r->x11.force_render = 0;
|
||||||
|
|
||||||
r->x11.colormap = DefaultColormap(r->x11.display, XDefaultScreen(r->x11.display));
|
r->x11.colormap = DefaultColormap(r->x11.display, XDefaultScreen(r->x11.display));
|
||||||
r->x11.wm_delete = XInternAtom(r->x11.display, "WM_DELETE_WINDOW", False);
|
r->x11.wm_delete = XInternAtom(r->x11.display, "WM_DELETE_WINDOW", False);
|
||||||
|
|
@ -400,6 +401,7 @@ static void MwLLNextEventImpl(MwLL handle) {
|
||||||
while(XCheckTypedWindowEvent(handle->x11.display, handle->x11.window, ClientMessage, &ev) || XCheckWindowEvent(handle->x11.display, handle->x11.window, mask, &ev)) {
|
while(XCheckTypedWindowEvent(handle->x11.display, handle->x11.window, ClientMessage, &ev) || XCheckWindowEvent(handle->x11.display, handle->x11.window, mask, &ev)) {
|
||||||
int render = 0;
|
int render = 0;
|
||||||
if(ev.type == Expose) {
|
if(ev.type == Expose) {
|
||||||
|
handle->x11.force_render = 0;
|
||||||
render = 1;
|
render = 1;
|
||||||
} else if(ev.type == ButtonPress) {
|
} else if(ev.type == ButtonPress) {
|
||||||
MwLLMouse p;
|
MwLLMouse p;
|
||||||
|
|
@ -759,9 +761,13 @@ static void MwLLForceRenderImpl(MwLL handle) {
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
memset(&ev, 0, sizeof(ev));
|
memset(&ev, 0, sizeof(ev));
|
||||||
|
|
||||||
|
if(!handle->x11.force_render) {
|
||||||
ev.type = Expose;
|
ev.type = Expose;
|
||||||
ev.xexpose.window = handle->x11.window;
|
ev.xexpose.window = handle->x11.window;
|
||||||
XSendEvent(handle->x11.display, handle->x11.window, False, ExposureMask, &ev);
|
XSendEvent(handle->x11.display, handle->x11.window, False, ExposureMask, &ev);
|
||||||
|
|
||||||
|
handle->x11.force_render = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void MwLLSetCursorImpl(MwLL handle, MwCursor* image, MwCursor* mask) {
|
static void MwLLSetCursorImpl(MwLL handle, MwCursor* image, MwCursor* mask) {
|
||||||
|
|
|
||||||
|
|
@ -15,15 +15,15 @@ static void vscroll_changed(MwWidget handle, void* user, void* call) {
|
||||||
tv->changed = 1;
|
tv->changed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_all(MwTreeViewEntry* root, int v){
|
static void set_all(MwTreeViewEntry** root, int v) {
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; i < arrlen(root); i++) {
|
for(i = 0; i < arrlen(root); i++) {
|
||||||
root[i].selected = v;
|
root[i]->selected = v;
|
||||||
set_all(root[i].tree, v);
|
set_all(root[i]->tree, v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void recursion(MwWidget handle, MwTreeViewEntry* tree, MwTreeViewEntry* root, MwLLColor base, MwLLColor text, MwPoint* p, int next, int shift, int* skip, int* shared, int draw, MwPoint* mouse) {
|
static void recursion(MwWidget handle, MwTreeViewEntry* tree, MwTreeViewEntry** root, MwLLColor base, MwLLColor text, MwPoint* p, int next, int shift, int* skip, int* shared, int draw, MwPoint* mouse) {
|
||||||
int i;
|
int i;
|
||||||
MwPoint l[2];
|
MwPoint l[2];
|
||||||
int skipped = 0;
|
int skipped = 0;
|
||||||
|
|
@ -145,7 +145,7 @@ static void recursion(MwWidget handle, MwTreeViewEntry* tree, MwTreeViewEntry* r
|
||||||
l[0].x += shift + LineSpace / 2;
|
l[0].x += shift + LineSpace / 2;
|
||||||
l[0].y += MwTextHeight(handle, "M") - (MwTextHeight(handle, "M") - OpenerSize) / 2;
|
l[0].y += MwTextHeight(handle, "M") - (MwTextHeight(handle, "M") - OpenerSize) / 2;
|
||||||
|
|
||||||
recursion(handle, &tree->tree[i], root, base, text, p, i != (arrlen(tree->tree) - 1) ? 1 : 0, shift + LineSpace, skip, shared, draw, mouse);
|
recursion(handle, tree->tree[i], root, base, text, p, i != (arrlen(tree->tree) - 1) ? 1 : 0, shift + LineSpace, skip, shared, draw, mouse);
|
||||||
|
|
||||||
l[1] = *p;
|
l[1] = *p;
|
||||||
l[1].x += shift + LineSpace / 2;
|
l[1].x += shift + LineSpace / 2;
|
||||||
|
|
@ -177,7 +177,7 @@ static void frame_draw(MwWidget handle) {
|
||||||
|
|
||||||
for(i = 0; i < arrlen(tv->tree); i++) {
|
for(i = 0; i < arrlen(tv->tree); i++) {
|
||||||
if(shared > (r.height / MwTextHeight(handle, "M"))) break;
|
if(shared > (r.height / MwTextHeight(handle, "M"))) break;
|
||||||
recursion(handle, &tv->tree[i], tv->tree, base, text, &p, 0, 0, &skip, &shared, 1, NULL);
|
recursion(handle, tv->tree[i], tv->tree, base, text, &p, 0, 0, &skip, &shared, 1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
MwDrawFrame(handle, &r, base, 1);
|
MwDrawFrame(handle, &r, base, 1);
|
||||||
|
|
@ -186,11 +186,11 @@ static void frame_draw(MwWidget handle) {
|
||||||
MwLLFreeColor(base);
|
MwLLFreeColor(base);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int recursive_length(MwTreeViewEntry* e) {
|
static int recursive_length(MwTreeViewEntry** e) {
|
||||||
int l = 0;
|
int l = 0;
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; i < arrlen(e); i++) {
|
for(i = 0; i < arrlen(e); i++) {
|
||||||
if(e[i].opened && e[i].tree != NULL) l += recursive_length(e[i].tree);
|
if(e[i]->opened && e[i]->tree != NULL) l += recursive_length(e[i]->tree);
|
||||||
l++;
|
l++;
|
||||||
}
|
}
|
||||||
return l;
|
return l;
|
||||||
|
|
@ -222,7 +222,7 @@ static void frame_mouse_up(MwWidget handle, void* user, void* call) {
|
||||||
p.y = MwDefaultBorderWidth(tv->frame);
|
p.y = MwDefaultBorderWidth(tv->frame);
|
||||||
for(i = 0; i < arrlen(tv->tree); i++) {
|
for(i = 0; i < arrlen(tv->tree); i++) {
|
||||||
if(shared > (MwGetInteger(tv->frame, MwNheight) / MwTextHeight(tv->frame, "M"))) break;
|
if(shared > (MwGetInteger(tv->frame, MwNheight) / MwTextHeight(tv->frame, "M"))) break;
|
||||||
recursion(tv->frame, &tv->tree[i], tv->tree, NULL, NULL, &p, 0, 0, &skip, &shared, 0, &tv->pressed);
|
recursion(tv->frame, tv->tree[i], tv->tree, NULL, NULL, &p, 0, 0, &skip, &shared, 0, &tv->pressed);
|
||||||
}
|
}
|
||||||
resize(handle->parent);
|
resize(handle->parent);
|
||||||
}
|
}
|
||||||
|
|
@ -320,24 +320,52 @@ static void prop_change(MwWidget handle, const char* prop) {
|
||||||
|
|
||||||
static void* mwTreeViewAddImpl(MwWidget handle, void* parent, MwLLPixmap pixmap, const char* item) {
|
static void* mwTreeViewAddImpl(MwWidget handle, void* parent, MwLLPixmap pixmap, const char* item) {
|
||||||
MwTreeView tv = handle->internal;
|
MwTreeView tv = handle->internal;
|
||||||
MwTreeViewEntry t;
|
MwTreeViewEntry* t = malloc(sizeof(*t));
|
||||||
|
|
||||||
t.label = MwStringDuplicate(item);
|
t->label = MwStringDuplicate(item);
|
||||||
t.pixmap = pixmap;
|
t->pixmap = pixmap;
|
||||||
t.selected = 0;
|
t->selected = 0;
|
||||||
t.opened = 1;
|
t->opened = 1;
|
||||||
t.click_time = 0;
|
t->click_time = 0;
|
||||||
|
t->tree = NULL;
|
||||||
|
t->parent = parent;
|
||||||
|
|
||||||
if(parent == NULL) {
|
if(parent == NULL) {
|
||||||
arrput(tv->tree, t);
|
arrput(tv->tree, t);
|
||||||
|
} else {
|
||||||
|
MwTreeViewEntry* e = parent;
|
||||||
|
|
||||||
|
arrput(e->tree, t);
|
||||||
}
|
}
|
||||||
resize(handle);
|
resize(handle);
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void free_all(MwTreeViewEntry** tree) {
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < arrlen(tree); i++) {
|
||||||
|
free(tree[i]->label);
|
||||||
|
free_all(tree[i]->tree);
|
||||||
|
free(tree[i]);
|
||||||
|
}
|
||||||
|
arrfree(tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mwTreeViewDeleteImpl(MwWidget handle, void* item) {
|
static void mwTreeViewDeleteImpl(MwWidget handle, void* item) {
|
||||||
|
MwTreeViewEntry* e = item;
|
||||||
|
MwTreeViewEntry* p = e->parent;
|
||||||
|
|
||||||
|
free_all(p->tree);
|
||||||
|
p->tree = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mwTreeViewResetImpl(MwWidget handle) {
|
static void mwTreeViewResetImpl(MwWidget handle) {
|
||||||
|
MwTreeView tv = handle->internal;
|
||||||
|
|
||||||
|
free_all(tv->tree);
|
||||||
|
tv->tree = NULL;
|
||||||
|
resize(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void func_handler(MwWidget handle, const char* name, void* out, va_list va) {
|
static void func_handler(MwWidget handle, const char* name, void* out, va_list va) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue