1
0
mirror of git://projects.qi-hardware.com/eda-tools.git synced 2024-11-25 23:21:54 +02:00

eeshow/gui/gui.c: support using project file as leader (instead of top sheet)

This commit is contained in:
Werner Almesberger 2016-08-22 22:35:43 -03:00
parent 3381f9c790
commit 2adc6979b7

View File

@ -34,6 +34,7 @@
#include "kicad/pl.h" #include "kicad/pl.h"
#include "kicad/lib.h" #include "kicad/lib.h"
#include "kicad/sch.h" #include "kicad/sch.h"
#include "kicad/pro.h"
#include "kicad/delta.h" #include "kicad/delta.h"
#include "gui/aoi.h" #include "gui/aoi.h"
#include "gui/input.h" #include "gui/input.h"
@ -216,9 +217,9 @@ static const struct sheet *parse_files(struct gui_hist *hist,
const struct file_names *fn, bool recurse, struct gui_hist *prev) const struct file_names *fn, bool recurse, struct gui_hist *prev)
{ {
char *rev = NULL; char *rev = NULL;
struct file sch_file; struct file pro_file, sch_file;
struct file lib_files[fn->n_libs];
struct file pl_file; struct file pl_file;
const struct file *leader = NULL;
unsigned libs_open, i; unsigned libs_open, i;
bool libs_cached = 0; bool libs_cached = 0;
bool ok; bool ok;
@ -226,24 +227,47 @@ static const struct sheet *parse_files(struct gui_hist *hist,
if (hist->vcs_hist && hist->vcs_hist->commit) if (hist->vcs_hist && hist->vcs_hist->commit)
rev = vcs_git_get_rev(hist->vcs_hist); rev = vcs_git_get_rev(hist->vcs_hist);
if (fn->pro) {
if (file_open_revision(&pro_file, rev, fn->pro, NULL)) {
free(rev);
rev = NULL; /* thus sch_file opens as with file_open */
fn = pro_parse_file(&pro_file, fn);
if (!fn)
return NULL;
leader = &pro_file;
} else {
/*
* If we happen to have a top sheet name, we may as
* well try to use it.
*/
if (!fn->sch) {
free(rev);
return NULL;
}
}
}
sch_init(&hist->sch_ctx, recurse); sch_init(&hist->sch_ctx, recurse);
ok = file_open_revision(&sch_file, rev, fn->sch, NULL); ok = file_open_revision(&sch_file, rev, fn->sch, leader);
if (rev)
free(rev); free(rev);
if (!ok) { if (!ok) {
sch_free(&hist->sch_ctx); sch_free(&hist->sch_ctx);
return NULL; return NULL;
} }
if (!leader)
leader = &sch_file;
struct file lib_files[fn->n_libs];
lib_init(&hist->lib); lib_init(&hist->lib);
for (libs_open = 0; libs_open != fn->n_libs; libs_open++) for (libs_open = 0; libs_open != fn->n_libs; libs_open++)
if (!file_open(lib_files + libs_open, fn->libs[libs_open], if (!file_open(lib_files + libs_open, fn->libs[libs_open],
&sch_file)) leader))
goto fail; goto fail;
if (fn->pl) { if (fn->pl) {
if (!file_open(&pl_file, fn->pl, &sch_file)) if (!file_open(&pl_file, fn->pl, leader))
goto fail; goto fail;
hist->pl = pl_parse(&pl_file); hist->pl = pl_parse(&pl_file);
file_close(&pl_file); file_close(&pl_file);
@ -281,8 +305,10 @@ static const struct sheet *parse_files(struct gui_hist *hist,
for (i = 0; i != libs_open; i++) for (i = 0; i != libs_open; i++)
file_close(lib_files + i); file_close(lib_files + i);
file_close(&sch_file); file_close(&sch_file);
// @@@ close pro_file
if (prev && sheet_eq(prev->sch_ctx.sheets, hist->sch_ctx.sheets)) if (prev && prev->sheets &&
sheet_eq(prev->sch_ctx.sheets, hist->sch_ctx.sheets))
prev->identical = 1; prev->identical = 1;
/* /*
@ -300,6 +326,7 @@ fail:
sch_free(&hist->sch_ctx); sch_free(&hist->sch_ctx);
lib_free(&hist->lib); lib_free(&hist->lib);
file_close(&sch_file); file_close(&sch_file);
// @@@ close pro_file
return NULL; return NULL;
} }
@ -432,7 +459,7 @@ int gui(const struct file_names *fn, bool recurse, int limit)
gtk_widget_show_all(window); gtk_widget_show_all(window);
get_history(&ctx, fn->sch, limit); get_history(&ctx, fn->pro ? fn->pro : fn->sch, limit);
if (ctx.hist_size) if (ctx.hist_size)
setup_progress_bar(&ctx, window); setup_progress_bar(&ctx, window);