This email list is read-only. Emails sent to this list will be discarded ---------------------------------- libprojgen/projgen.cpp | 79 +++++++++++++++++ libprojgen/projgen.h | 12 +++- libprojgen/templates/template_config.xml | 18 ++++ src/AddLibraryDlg.cpp | 140 ++++++++++++++++++++++++++++-- src/AddLibraryDlg.h | 9 ++- src/glade/projgen.glade | 103 ++++++++++++---------- src/glade/projgen.xml | 125 ++++++++++++++------------ 7 files changed, 373 insertions(+), 113 deletions(-)
New commits: commit 2d2e8591642afa28fb4239710e46ba448bdec996 Author: Bob Spencer <[email protected]> Date: Tue Feb 24 08:18:09 2009 -0800 Intermediate projgen version. Working on library dependencies and AddLibraryDlg. Still incomplete. Diff in this email is a maximum of 400 lines. diff --git a/libprojgen/projgen.cpp b/libprojgen/projgen.cpp index b089cc1..d209490 100644 --- a/libprojgen/projgen.cpp +++ b/libprojgen/projgen.cpp @@ -14,6 +14,9 @@ #include "TemplateMgr.h" #include "ProjectCreator.h" #include "Project.h" +#include <dirent.h> + +static int add_libs_in_dir (string dir, vector<string>*libArray); int pg_create(int override_if_exists, const char *title, const char *name, const char *description, @@ -109,3 +112,79 @@ char *pg_get_template_config_path() return cfg; } +//------------------------------------------------------- + +int pg_get_filter_ids (char ***pStrArr) +{ + //get list of templates + TemplateMgr *tm = TemplateMgr::getInstance(); + vector<string> ids = tm->getTemplateIds("lib_filter"); + + //create enough char* to hold all id's + *pStrArr = new char*[ids.size()]; + for (int i=0; i<ids.size(); i++) { + (*pStrArr)[i] = new char [ids[i].length()+1]; + strcpy ((*pStrArr)[i], ids[i].c_str()); + } + return ids.size(); +} + +char *pg_get_lib_filter_display (const char *id) +{ + TemplateMgr *tm = TemplateMgr::getInstance(); + string val = tm->getTemplateData (id, T_DESC); + if (val == "err") { + return NULL; + } else if (val.empty()) { + return NULL; //found field, nothing there + } + char *buf = new char[val.length()+1]; + strcpy (buf, val.c_str()); + return buf; +} + +int pg_get_lib_filter_libs (const char *id, char ***pStrArr) +{ + //get all libs currently on system + vector<string> libs; + add_libs_in_dir ("/usr/lib/pkgconfig", &libs); + add_libs_in_dir ("/usr/local/lib/pkgconfig", &libs); + + sort (libs.begin(), libs.end()); + + //create enough char* to hold all libs + *pStrArr = new char*[libs.size()]; + for (int i=0; i<libs.size(); i++) { + (*pStrArr)[i] = new char [libs[i].length()+1]; + strcpy ((*pStrArr)[i], libs[i].c_str()); + } + return libs.size(); +} + +static int add_libs_in_dir (string dir, vector<string>*libArray) +{ + if (dir.empty() || !libArray) { + return -1; + } + struct dirent *ep; + DIR *dp = opendir (dir.c_str()); + if (!dp) { + return -1; + } + string srcFile, destFile; + while (ep = readdir (dp)) { + string srcName = ep->d_name; + if (ep->d_type==DT_DIR || srcName == ".." || srcName == ".") { + continue; + } + //cout << "srcName: " << srcName << endl; + string::size_type pos = srcName.length()-3; + if (srcName.substr(pos, 3) != ".pc") { + continue; + } + //cout << "pushing srcName: " << srcName.substr(0,pos) << endl; + libArray->push_back(srcName.substr(0,pos)); + } + closedir (dp); + return 0; +} diff --git a/libprojgen/projgen.h b/libprojgen/projgen.h index d35cb78..4732ba1 100644 --- a/libprojgen/projgen.h +++ b/libprojgen/projgen.h @@ -25,7 +25,7 @@ int pg_create(int override_if_exists, const char *title, int enable_pkgconfig, const char *doc_type, int enable_i18n); -int pg_get_license_ids (char ***pStrArray); +int pg_get_license_ids (char ***str_array); int pg_is_licenseid_valid(const char *id); @@ -34,4 +34,14 @@ char *pg_get_template_data (const char *id, int field); char *pg_get_template_config_path(); +int pg_get_libs (char ***str_array); + +//------ + +int pg_get_filter_ids (char ***pStrArr); + +char *pg_get_lib_filter_display (const char *id); + +int pg_get_lib_filter_libs (const char *id, char ***pStrArr); + #endif //__PROJGEN_H__ diff --git a/libprojgen/templates/template_config.xml b/libprojgen/templates/template_config.xml index f712fd4..296fd54 100644 --- a/libprojgen/templates/template_config.xml +++ b/libprojgen/templates/template_config.xml @@ -44,6 +44,24 @@ </licenses> <samples> </samples> + <lib_filters> + <f1 id="Installed" type="lib_filter" name="Installed Libs" + description="Installed development libraries" /> + <f2 id="Moblin v2" type="lib_filter" name="Moblin v2 Libs" + description="Moblin v2 DRAFT compliant libraries"> + <m2 id="gtk2" name="gtk+-2.0" description="gtk+-2.0 >= 2.14.4" /> + <m2 id="clutter" name="clutter-0.9" description="clutter-0.9 >= 0.9" /> + <m2 id="pango" name="pango" description="pango >= 1.22" /> + <m2 id="cairo" name="cairo" description="cairo >= 1.8" /> + <m2 id="python" name="python" description="python >= 2.6" /> + <m2 id="atk" name="atk" description="atk >= 1.24" /> + <m2 id="qt" name="qt" description="atk >= 1.24" /> + <m2 id="atk" name="atk" description="atk >= 1.24" /> + <m2 id="atk" name="atk" description="atk >= 1.24" /> + </f2> + <f3 id="Moblin v1.5" type="lib_filter" name="Moblin v1.5 Libs" + description="Moblin v1.5 compliant libraries" /> + </lib_filters> </templates> diff --git a/src/AddLibraryDlg.cpp b/src/AddLibraryDlg.cpp index 2ac5dc1..aada26b 100644 --- a/src/AddLibraryDlg.cpp +++ b/src/AddLibraryDlg.cpp @@ -9,6 +9,7 @@ */ #include "AddLibraryDlg.h" +#include <../libprojgen/projgen.h> #include <string> using namespace std; @@ -16,6 +17,11 @@ using namespace std; const char DLG_ADD_TITLE[] = "Add Library Dependency"; const char DLG_EDIT_TITLE[] = "Edit Library Dependency"; +void on_filterComboBox_change (GtkComboBox *cb, gpointer data) +{ + ((AddLibraryDlg*)data)->onFilterComboBoxChange(cb); +} + gboolean on_libNameEntry_changed(GtkWidget *w, GdkEventKey *event, gpointer data) { if (event->type==GDK_KEY_RELEASE && !(event->is_modifier)) { @@ -31,20 +37,88 @@ bool AddLibraryDlg::init(GtkBuilder *builder) cout << "Error: AddLibraryDlg initialized without GtkBuilder\n"; return false; } - m_nameEntry = GTK_ENTRY(gtk_builder_get_object (builder, "libNameEntry")); + m_filterComboBox = + GTK_COMBO_BOX(gtk_builder_get_object (builder, "libFilterComboBox")); + + m_libComboBoxEntry = + GTK_COMBO_BOX_ENTRY(gtk_builder_get_object (builder, "libComboBoxEntry")); + + GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING); + gtk_combo_box_set_model (GTK_COMBO_BOX(m_libComboBoxEntry), + GTK_TREE_MODEL(store)); + g_object_unref (store); + + cout << "foo0\n"; + gtk_cell_layout_clear (GTK_CELL_LAYOUT (m_libComboBoxEntry)); + GtkCellRenderer *cell = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (m_libComboBoxEntry), + cell, TRUE); + cout << "foo1\n"; + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (m_libComboBoxEntry), cell, + "text", 0, NULL); + cout << "foo2\n"; + gtk_combo_box_entry_set_text_column (m_libComboBoxEntry, 0); + + + cout << "foo2.1\n"; + gtk_list_store_clear (GTK_LIST_STORE ( + gtk_combo_box_get_model (GTK_COMBO_BOX(m_libComboBoxEntry)))); + + + cout << "foo2.5\n"; + + m_libNameEntry = GTK_ENTRY(gtk_builder_get_object (builder, "libNameEntry")); + + cout << "foo2.6\n"; + m_opComboBox = GTK_COMBO_BOX(gtk_builder_get_object (builder, "libOpComboBox")); m_versionEntry = GTK_ENTRY(gtk_builder_get_object (builder, "libVersionEntry")); + + cout << "foo2.7\n"; + m_okBtn = GTK_BUTTON(gtk_builder_get_object (builder, "libOkBtn")); m_dlg = GTK_WIDGET(gtk_builder_get_object (builder, "addLibraryDlg")); + cout << "foo3\n"; + + //load filters combobox + gtk_list_store_clear (GTK_LIST_STORE ( + gtk_combo_box_get_model (m_filterComboBox))); + //load avail filters into array (index matters) + char *buf; + char **pFilterIdArray; + int numFilters = pg_get_filter_ids (&pFilterIdArray); + for (int i=0; i<numFilters; i++) { + m_filterIds.push_back (pFilterIdArray[i]); + buf = pg_get_lib_filter_display (pFilterIdArray[i]); //allocs buf + + gtk_combo_box_insert_text (m_filterComboBox, i, buf); + cout << "inserted: " << buf << endl; + delete buf; + } + //cleanup filterArray + for (int i=0; i<numFilters; i++) { + delete (char*)pFilterIdArray[i]; + } + delete [] pFilterIdArray; + + cout << "foo4\n"; + //watch changes on edit field for OKBtn enable - g_signal_connect(m_nameEntry, "key-release-event", + g_signal_connect(m_libNameEntry, "key-release-event", G_CALLBACK (on_libNameEntry_changed), this); + //set callback for filter changed + g_signal_connect(m_filterComboBox, "changed", + G_CALLBACK (on_filterComboBox_change), this); + gtk_combo_box_set_active (m_filterComboBox, 0); + - return (m_nameEntry && m_opComboBox && m_versionEntry && m_dlg); + cout << "foo5\n"; + + return (m_libNameEntry && m_opComboBox && m_versionEntry && m_dlg); } int AddLibraryDlg::run(gboolean firstTime, string name, string version) @@ -55,7 +129,7 @@ int AddLibraryDlg::run(gboolean firstTime, string name, string version) } //set defaults - gtk_entry_set_text (m_nameEntry, name.c_str()); + gtk_entry_set_text (m_libNameEntry, name.c_str()); //strip op from version string op = "="; string::size_type pos = version.find_first_not_of("<>="); @@ -76,7 +150,7 @@ int AddLibraryDlg::run(gboolean firstTime, string name, string version) } gtk_combo_box_set_active (m_opComboBox, index); gtk_entry_set_text (m_versionEntry, version.c_str()); - gtk_widget_grab_focus (GTK_WIDGET(m_nameEntry)); + gtk_widget_grab_focus (GTK_WIDGET(m_libNameEntry)); //launch dialog gtk_window_set_title (GTK_WINDOW(m_dlg), @@ -89,11 +163,11 @@ int AddLibraryDlg::run(gboolean firstTime, string name, string version) string AddLibraryDlg::getName() { - if (!m_dlg || !m_nameEntry) { + if (!m_dlg || !m_libNameEntry) { cout << "Error: AddLibraryDlg::init has not been run\n"; return ""; } - return gtk_entry_get_text (m_nameEntry); + return gtk_entry_get_text (m_libNameEntry); } string AddLibraryDlg::getVersion() @@ -116,6 +190,56 @@ string AddLibraryDlg::getVersion() void AddLibraryDlg::onNameChanged() { - string val = gtk_entry_get_text(m_nameEntry); + //validate name and update infoLabel and infoImg (and "OK" btn) + string val = gtk_entry_get_text(m_libNameEntry); gtk_widget_set_sensitive(GTK_WIDGET(m_okBtn), val!=""); + + /* if (val.find_first_of (" ") != string::npos) { + m_ui->addInfoText(TAB_MAIN, nameEntry, INFO_ERROR, + "Short name can not have spaces. " \ + "Use '-' or '_'"); + + } else if (val.find_first_of ("~...@#$%^&*\\|/") != string::npos) { + m_ui->addInfoText(TAB_MAIN, nameEntry, INFO_ERROR, + "Short name has invalid characters " \ + "(~...@#$%^&*|\\/)"); + } else { + m_ui->delInfoText(nameEntry); + } + */ +} + + +void AddLibraryDlg::onFilterComboBoxChange(GtkComboBox *cb) +{ + gint index = gtk_combo_box_get_active (cb); + if (index==-1) { + return; + } + cout << "foo7\n"; + + //load language combobox + gtk_list_store_clear (GTK_LIST_STORE ( + gtk_combo_box_get_model (GTK_COMBO_BOX(m_libComboBoxEntry)))); + + /* gtk_combo_box_append_text (GTK_COMBO_BOX(m_libComboBoxEntry), + m_filterIds[index].c_str()); + */ + cout << "foo8\n"; + + //load avail filters into array (index matters) + char *buf; + char **pLibArr; + int numLibs = pg_get_lib_filter_libs (m_filterIds[index].c_str(), &pLibArr); + for (int i=0; i<numLibs; i++) { + gtk_combo_box_append_text (GTK_COMBO_BOX(m_libComboBoxEntry), + pLibArr[i]); + } + //cleanup filterArray + for (int i=0; i<numLibs; i++) { + delete (char*)pLibArr[i]; + } + delete [] pLibArr; } + + diff --git a/src/AddLibraryDlg.h b/src/AddLibraryDlg.h index ad3d75d..8d2ed2a 100644 --- a/src/AddLibraryDlg.h +++ b/src/AddLibraryDlg.h @@ -14,6 +14,7 @@ #include <gtk/gtk.h> #include <iostream> #include <string> +#include <vector> using namespace std; @@ -22,8 +23,13 @@ using namespace std; class AddLibraryDlg { + vector<string> m_filterIds; + GtkWidget *m_dlg; - GtkEntry *m_nameEntry; + GtkComboBox *m_filterComboBox; + GtkComboBoxEntry *m_libComboBoxEntry; + GtkEntry *m_libNameEntry; + GtkComboBox *m_opComboBox; GtkEntry *m_versionEntry; GtkButton *m_okBtn; @@ -38,6 +44,7 @@ class AddLibraryDlg //callback void onNameChanged(); + void onFilterComboBoxChange(GtkComboBox *cb); }; #endif // __ADDLIBRARYDLG_H__ diff --git a/src/glade/projgen.glade b/src/glade/projgen.glade index 04ca798..b016ff9 100644 --- a/src/glade/projgen.glade +++ b/src/glade/projgen.glade @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> -<!--Generated with glade3 3.4.5 on Thu Jan 15 22:02:22 2009 --> _______________________________________________ Commits mailing list [email protected] https://lists.moblin.org/mailman/listinfo/commits
