Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Thompson <quornian@googlemail.com>2008-07-21 20:40:32 +0400
committerIan Thompson <quornian@googlemail.com>2008-07-21 20:40:32 +0400
commit434f2172f65cc547c26fc6d7c5a2d5400eff162f (patch)
tree0bd2545b05423aff5162122a9eb3e548cc9d29cf /source/blender/blenkernel/intern/suggestions.c
parent5435d7c3ea051bc7195d0c21ebc29a723222a795 (diff)
Removed requirement for suggestions to be pre-sorted. Allowed lists of strings to be suggested without having to specify their type. Specifying a prefix when suggesting is now also optional.
Diffstat (limited to 'source/blender/blenkernel/intern/suggestions.c')
-rw-r--r--source/blender/blenkernel/intern/suggestions.c91
1 files changed, 67 insertions, 24 deletions
diff --git a/source/blender/blenkernel/intern/suggestions.c b/source/blender/blenkernel/intern/suggestions.c
index e2c951f2284..41265c35170 100644
--- a/source/blender/blenkernel/intern/suggestions.c
+++ b/source/blender/blenkernel/intern/suggestions.c
@@ -37,6 +37,10 @@
#include "BKE_text.h"
#include "BKE_suggestions.h"
+/**********************/
+/* Static definitions */
+/**********************/
+
static SuggList suggestions = {NULL, NULL, NULL, NULL, NULL};
static Text *suggText = NULL;
static SuggItem *lastInsert = NULL;
@@ -71,13 +75,37 @@ static void docs_free() {
}
}
+/**************************/
+/* General tool functions */
+/**************************/
+
void free_suggestions() {
sugg_free();
docs_free();
}
+void suggest_set_active(Text *text) {
+ if (suggText == text) return;
+ suggest_clear_active();
+ suggText = text;
+}
+
+void suggest_clear_active() {
+ free_suggestions();
+ suggText = NULL;
+}
+
+short suggest_is_active(Text *text) {
+ return suggText==text ? 1 : 0;
+}
+
+/***************************/
+/* Suggestion list methods */
+/***************************/
+
void suggest_add(const char *name, char type) {
- SuggItem *newitem;
+ SuggItem *newitem, *item;
+ int len, cmp;
newitem = MEM_mallocN(sizeof(SuggItem) + strlen(name) + 1, "SuggestionItem");
if (!newitem) {
@@ -86,18 +114,42 @@ void suggest_add(const char *name, char type) {
}
newitem->name = (char *) (newitem + 1);
- strcpy(newitem->name, name);
+ len = strlen(name);
+ strncpy(newitem->name, name, len);
+ newitem->name[len] = '\0';
newitem->type = type;
newitem->prev = newitem->next = NULL;
- if (!suggestions.first) {
+ /* Perform simple linear search for ordered storage */
+ if (!suggestions.first || !suggestions.last) {
suggestions.first = suggestions.last = newitem;
} else {
- newitem->prev = suggestions.last;
- suggestions.last->next = newitem;
- suggestions.last = newitem;
+ cmp = -1;
+ for (item=suggestions.last; item; item=item->prev) {
+ cmp = suggest_cmp(name, item->name, len);
+
+ /* Newitem comes after this item, insert here */
+ if (cmp >= 0) {
+ newitem->prev = item;
+ if (item->next)
+ item->next->prev = newitem;
+ newitem->next = item->next;
+ item->next = newitem;
+
+ /* At last item, set last pointer here */
+ if (item == suggestions.last)
+ suggestions.last = newitem;
+ break;
+ }
+ }
+ /* Reached beginning of list, insert before first */
+ if (cmp < 0) {
+ newitem->next = suggestions.first;
+ suggestions.first->prev = newitem;
+ suggestions.first = newitem;
+ }
}
- suggestions.selected = NULL;
+ suggestions.firstmatch = suggestions.lastmatch = suggestions.selected = NULL;
}
void suggest_prefix(const char *prefix) {
@@ -136,6 +188,10 @@ void suggest_prefix(const char *prefix) {
}
}
+void suggest_clear_list() {
+ sugg_free();
+}
+
SuggItem *suggest_first() {
return suggestions.firstmatch;
}
@@ -144,30 +200,17 @@ SuggItem *suggest_last() {
return suggestions.lastmatch;
}
-void suggest_set_active(Text *text) {
- if (suggText == text) return;
- suggest_clear_active();
- suggText = text;
-}
-
-void suggest_clear_active() {
- free_suggestions();
- suggText = NULL;
-}
-
-short suggest_is_active(Text *text) {
- return suggText==text ? 1 : 0;
+SuggItem *suggest_get_selected() {
+ return suggestions.selected;
}
void suggest_set_selected(SuggItem *sel) {
suggestions.selected = sel;
}
-SuggItem *suggest_get_selected() {
- return suggestions.selected;
-}
-
+/*************************/
/* Documentation methods */
+/*************************/
void suggest_documentation(const char *docs) {
int len;