void saveImageAs() { ///Download the image of the currently selected post, with a file save dialog and everything Gtk::TreeView *treeview = 0; builder->get_widget("treeview4", treeview); Glib::RefPtr<Gtk::TreeSelection> tree_selection = treeview->get_selection(); Glib::RefPtr<Gtk::TreeModel> model = treeview->get_model(); Gtk::TreeModel::iterator iter = tree_selection->get_selected(model); Gtk::TreeModel::Row row = *iter; string tim = row[m_post_list.tim]; string ext = row[m_thread_list.ext]; int file = row[m_post_list.file]; string url = "about:blank"; if(file) { url = "https://images.4channel.org"+BOARD+"src/"+tim+ext; cout << "\n\n\n\n\n\n" << url << "\n\n\n\n\n\n" << endl; Gtk::FileChooserDialog dialog("Save image as...", Gtk::FILE_CHOOSER_ACTION_SAVE); dialog.set_current_name(tim+ext); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); int result = dialog.run(); switch(result) { case(Gtk::RESPONSE_OK): { string fn = dialog.get_filename(); getRemoteFile(url, fn); } } } }
EntityChooser::EntityChooser() : gtkutil::DialogElement(), // create an Element without label _entityStore(Gtk::ListStore::create(_listColumns)) { Gtk::VBox* vbox = Gtk::manage(new Gtk::VBox(false, 6)); _widgets[WIDGET_TOPLEVEL] = vbox; // Initialise the base class DialogElement::setValueWidget(_widgets[WIDGET_TOPLEVEL]); Gtk::TreeView* treeView = Gtk::manage(new Gtk::TreeView(_entityStore)); _widgets[WIDGET_TREEVIEW] = treeView; treeView->set_headers_visible(false); // Use the TreeModel's full string search function treeView->set_search_equal_func(sigc::ptr_fun(>kutil::TreeModel::equalFuncStringContains)); // Head Name column treeView->append_column("", _listColumns.name); // Set the tree store to sort on this column _entityStore->set_sort_column_id(_listColumns.name, Gtk::SORT_ASCENDING); _selection = treeView->get_selection(); _selection->signal_changed().connect(sigc::mem_fun(*this, &EntityChooser::onSelectionChanged)); // Scrolled Frame vbox->pack_start(*Gtk::manage(new gtkutil::ScrolledFrame(*treeView)), true, true, 0); populateEntityList(); }
// Callback for objective entity selection changed in list box void ObjectivesEditor::_onEntitySelectionChanged() { // Clear the objectives list _objectiveList->clear(); Gtk::Button* delEntityButton = gladeWidget<Gtk::Button>( "deleteEntityButton" ); Gtk::Widget* objButtonPanel = gladeWidget<Gtk::Widget>( "objButtonPanel" ); // Get the selection Gtk::TreeView* entityList = gladeWidget<Gtk::TreeView>( "entitiesTreeView" ); Gtk::TreeModel::iterator iter = entityList->get_selection()->get_selected(); if (iter) { // Get name of the entity and find the corresponding ObjectiveEntity in // the map std::string name = Glib::ustring((*iter)[_objEntityColumns.entityName]); // Save the current selection and refresh the objectives list _curEntity = _entities.find(name); refreshObjectivesList(); // Enable the delete button and objectives panel delEntityButton->set_sensitive(true); objButtonPanel->set_sensitive(true); // Enable mission logic button gladeWidget<Gtk::Widget>( "editSuccessLogicButton" )->set_sensitive(true); // Enable obj condition button gladeWidget<Gtk::Widget>( "editObjectiveConditionsButton" )->set_sensitive(true); } else { // No selection, disable the delete button and clear the objective // panel delEntityButton->set_sensitive(false); objButtonPanel->set_sensitive(false); // Disable mission logic button gladeWidget<Gtk::Widget>( "editSuccessLogicButton" )->set_sensitive(false); // Disable obj condition button gladeWidget<Gtk::Widget>( "editObjectiveConditionsButton" )->set_sensitive(false); } }
// Delete entity button void ObjectivesEditor::_onDeleteEntity() { // Get the selection Gtk::TreeView* entityList = gladeWidget<Gtk::TreeView>( "entitiesTreeView" ); Gtk::TreeModel::iterator iter = entityList->get_selection()->get_selected(); if (iter) { // Get the name of the selected entity std::string name = Glib::ustring((*iter)[_objEntityColumns.entityName]); // Instruct the ObjectiveEntity to delete its world node, and then // remove it from the map _entities[name]->deleteWorldNode(); _entities.erase(name); // Update the widgets to remove the selection from the list populateWidgets(); } }
// Create the objects panel (for manipulating the target_addobjectives objects) void ObjectivesEditor::setupEntitiesPanel() { // Tree view listing the target_addobjectives entities Gtk::TreeView* entityList = gladeWidget<Gtk::TreeView>( "entitiesTreeView" ); entityList->set_model(_objectiveEntityList); entityList->set_headers_visible(false); entityList->get_selection()->signal_changed().connect( sigc::mem_fun(*this, &ObjectivesEditor::_onEntitySelectionChanged) ); // Active-at-start column (checkbox) Gtk::CellRendererToggle* startToggle = Gtk::manage(new Gtk::CellRendererToggle); startToggle->signal_toggled().connect( sigc::mem_fun(*this, &ObjectivesEditor::_onStartActiveCellToggled) ); Gtk::TreeViewColumn* startCol = Gtk::manage(new Gtk::TreeViewColumn(_("Start"))); startCol->add_attribute(startToggle->property_active(), _objEntityColumns.startActive); entityList->append_column(*startCol); // Name column entityList->append_column(*Gtk::manage(new gtkutil::TextColumn("", _objEntityColumns.displayName))); // Connect button signals Gtk::Button* addButton = gladeWidget<Gtk::Button>("createEntityButton"); addButton->signal_clicked().connect( sigc::mem_fun(*this, &ObjectivesEditor::_onAddEntity) ); Gtk::Button* delButton = gladeWidget<Gtk::Button>("deleteEntityButton"); delButton->set_sensitive(false); // disabled at start delButton->signal_clicked().connect( sigc::mem_fun(*this, &ObjectivesEditor::_onDeleteEntity) ); }
void ukwd_wiring_dialog::on_delete_clicked() { Glib::RefPtr<Gtk::ListStore> m; Gtk::TreeView *t = NULL; ref_xml->get_widget("stecker_treeview" + name_post_fix, t); Glib::RefPtr<Gtk::TreeSelection> selection = t->get_selection(); if (selection->count_selected_rows() != 0) { // A connection is selected m = m.cast_dynamic(t->get_model()); Gtk::TreeModel::iterator iter = selection->get_selected(); // Test is fixed connection is selected for removal if ( (((*iter)[plugboard_cols.first]) != "J") and (((*iter)[plugboard_cols.second]) != "Y") ) { // No! -> delete the selected connection remove_plug((*iter)[plugboard_cols.first], (*iter)[plugboard_cols.second]); num_plugs--; update_plug_counter(); m->erase(iter); } else { // Yes! -> error message Gtk::MessageDialog msg(*dialog, "The connection J, Y is fixed and cannot be removed.", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msg.set_title("Enigma"); msg.run(); } } else { // No connection is selected Gtk::MessageDialog msg(*dialog, "Nothing selected to delete.", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msg.set_title("Enigma"); msg.run(); } }
void on_thread_back_clicked() { ///To be run when the back button is clicked while viewing a thread boardView(); Gtk::TreeView *threadlist = 0; pWebKitView = WEBKIT_WEB_VIEW (webkit_web_view_new ()); Gtk::ScrolledWindow *imgview = 0; builder->get_widget("scrolledwindow3", imgview); imgview->set_visible(true); imgview->show(); gtk_container_add (GTK_CONTAINER (imgview->gobj()), GTK_WIDGET (pWebKitView)); webkit_web_view_load_uri(pWebKitView, "about:blank"); webkit_web_view_set_zoom_level(pWebKitView, true); gtk_widget_set_can_focus(GTK_WIDGET(pWebKitView), true); gtk_widget_show(GTK_WIDGET(pWebKitView)); builder->get_widget("treeview2", threadlist); Glib::RefPtr<Gtk::TreeSelection> thread_selection = threadlist->get_selection(); thread_selection->signal_changed().connect(sigc::bind<Glib::RefPtr<Gtk::TreeSelection>, WebKitWebView*>(sigc::ptr_fun(&on_selection_changed), thread_selection, pWebKitView)); POST_CLICK_CONNECT.disconnect(); POST_REFRESH_CONNECT.disconnect(); }
GscExecutorLogWindow::GscExecutorLogWindow(BaseObjectType* gtkcobj, const app_ui_res_ref_t& ref_ui) : AppUIResWidget<GscExecutorLogWindow, false>(gtkcobj, ref_ui) { // Connect callbacks APP_GTKMM_CONNECT_VIRTUAL(delete_event); // make sure the event handler is called Gtk::Button* window_close_button = 0; APP_UI_RES_AUTO_CONNECT(window_close_button, clicked); Gtk::Button* window_save_current_button = 0; APP_UI_RES_AUTO_CONNECT(window_save_current_button, clicked); Gtk::Button* window_save_all_button = 0; APP_UI_RES_AUTO_CONNECT(window_save_all_button, clicked); Gtk::Button* clear_command_list_button = 0; APP_UI_RES_AUTO_CONNECT(clear_command_list_button, clicked); // Accelerators Glib::RefPtr<Gtk::AccelGroup> accel_group = this->get_accel_group(); if (window_close_button) { window_close_button->add_accelerator("clicked", accel_group, GDK_Escape, Gdk::ModifierType(0), Gtk::AccelFlags(0)); } // --------------- Make a treeview Gtk::TreeView* treeview = this->lookup_widget<Gtk::TreeView*>("command_list_treeview"); if (treeview) { Gtk::TreeModelColumnRecord model_columns; // #, Command + parameters, [EntryPtr] model_columns.add(col_num); app_gtkmm_create_tree_view_column(col_num, *treeview, "#", "# of executed command", true); // sortable model_columns.add(col_command); app_gtkmm_create_tree_view_column(col_command, *treeview, "Command", "Command with parameters", true); // sortable model_columns.add(col_entry); // create a TreeModel (ListStore) list_store = Gtk::ListStore::create(model_columns); // list_store->set_sort_column(col_num, Gtk::SORT_DESCENDING); // default sort treeview->set_model(list_store); selection = treeview->get_selection(); selection->signal_changed().connect(sigc::mem_fun(*this, &self_type::on_tree_selection_changed) ); } // Hide command text entry in win32. // Setting text on this entry segfaults under win32, (utf8 conversion doesn't // help, not that it should). Seems to be connected to non-english locale. // Surprisingly, the treeview column text still works. // The problem seems to have disappeared (new compiler/runtime?) // #ifdef _WIN32 // Gtk::HBox* command_hbox = this->lookup_widget<Gtk::HBox*>("command_hbox"); // if (command_hbox) // command_hbox->hide(); // #endif // --------------- // Connect to CmdexSync signal cmdex_sync_signal_execute_finish()->connect(sigc::mem_fun(*this, &self_type::on_command_output_received)); // show(); }
void startup(Glib::RefPtr<Gtk::Application> app) { ///To be run at startup GtkSettings *settings; settings = gtk_settings_get_default(); g_object_set (G_OBJECT (settings), "gtk-application-prefer-dark-theme", FALSE, NULL); Gtk::Main kit; builder = Gtk::Builder::create_from_file(DATADIR "/main.glade"); Gtk::Window *window = 0; builder->get_widget("window1", window); window->set_wmclass("org.gtkmm.examples.application", name); window->maximize(); Gtk::TreeView *listview = 0; builder->get_widget("treeview1", listview); Glib::RefPtr<Gtk::ListStore> m_refTreeModel; m_refTreeModel = Gtk::ListStore::create(m_columns); listview->set_model(m_refTreeModel); listview->set_search_column(1); Glib::RefPtr<Gtk::TreeSelection> list_selection = listview->get_selection(); listview->signal_row_activated().connect(sigc::bind<Glib::RefPtr<Gtk::TreeModel> >(sigc::ptr_fun(&on_button_clicked), listview->get_model())); Json::Value json = readFile(getRemoteFile("https://api.4chan.org/boards.json")); Json::Value boards = json["boards"]; for(int i=0;i<boards.size();++i) { Gtk::TreeModel::Row row = *(m_refTreeModel->append()); row[m_columns.name] = "/"+boards[i]["board"].asString()+"/"; row[m_columns.longname] = boards[i]["title"].asString(); } listview->set_rules_hint(true); Gtk::Menu *mainmenu = 0; builder->get_widget("menu1", mainmenu); Gtk::MenuToolButton *toolbut = 0; builder->get_widget("toolbutton2", toolbut); toolbut->set_menu(*mainmenu); Gtk::MenuItem *item1 = 0; builder->get_widget("menuitem1", item1); item1->signal_activate().connect(sigc::ptr_fun(&nameSettingsDialog)); Gtk::CheckMenuItem *hideimages = 0; builder->get_widget("menuitem2", hideimages); hideimages->signal_toggled().connect(sigc::ptr_fun(&on_hide_toggled)); Gtk::MenuItem *item3 = 0; builder->get_widget("menuitem3", item3); item3->signal_activate().connect(sigc::ptr_fun(&open_thread_in_browser)); Gtk::MenuItem *d_image = 0; builder->get_widget("menuitem5", d_image); d_image->signal_activate().connect(sigc::ptr_fun(&saveImageAs)); Gtk::ToolButton *post_but; builder->get_widget("toolbutton8", post_but); post_but->signal_clicked().connect(sigc::ptr_fun(&on_post_button_toggled)); Gtk::Button *post_but2 = 0; builder->get_widget("button4", post_but2); post_but2->signal_clicked().connect(sigc::ptr_fun(&on_post_clicked)); kit.run(*window); }
void on_button_clicked(Gtk::TreeModel::Path path, Gtk::TreeViewColumn* column, Glib::RefPtr<Gtk::TreeModel> model) { Gtk::TreeModel::iterator iter = model->get_iter(path); Gtk::TreeModel::Row row = *iter; string shortname = row[m_columns.name]; string longname = row[m_columns.longname]; BOARD = shortname; LONGBOARD = longname; boardView(); Gtk::TreeView *threadlist = 0; builder->get_widget("treeview2", threadlist); pWebKitView = WEBKIT_WEB_VIEW (webkit_web_view_new ()); Gtk::ScrolledWindow *imgview = 0; builder->get_widget("scrolledwindow3", imgview); imgview->set_visible(true); imgview->show(); gtk_container_add (GTK_CONTAINER (imgview->gobj()), GTK_WIDGET (pWebKitView)); webkit_web_view_load_uri(pWebKitView, "about:blank"); webkit_web_view_set_zoom_level(pWebKitView, true); gtk_widget_set_can_focus(GTK_WIDGET(pWebKitView), true); gtk_widget_show(GTK_WIDGET(pWebKitView)); Glib::RefPtr<Gtk::ListStore> m_threads_tree_model; m_threads_tree_model = Gtk::ListStore::create(m_thread_list); m_threads_tree_model->clear(); threadlist->set_model(m_threads_tree_model); threadlist->set_search_column(1); threadlist->get_column(1)->set_visible(false); threadlist->get_column(2)->set_visible(false); threadlist->get_column(3)->set_visible(false); threadlist->get_column(4)->set_visible(false); threadlist->signal_key_press_event().connect(sigc::bind<Glib::RefPtr<Gtk::ListStore> >(sigc::ptr_fun(&on_key_press_or_release_event), m_threads_tree_model)); threadlist->signal_key_release_event().connect(sigc::bind<Glib::RefPtr<Gtk::ListStore> >(sigc::ptr_fun(&on_key_press_or_release_event), m_threads_tree_model)); threadlist->add_events(Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK); Gtk::CellRendererText* cellRender = dynamic_cast<Gtk::CellRendererText*>(threadlist->get_column_cell_renderer(0)); cellRender->property_wrap_mode() = Pango::WRAP_WORD; cellRender->property_wrap_width() = 400; cellRender->set_alignment(0, 0); Glib::RefPtr<Gtk::TreeSelection> thread_selection = threadlist->get_selection(); thread_selection->signal_changed().connect(sigc::bind<Glib::RefPtr<Gtk::TreeSelection>, WebKitWebView*>(sigc::ptr_fun(&on_selection_changed), thread_selection, pWebKitView)); getThreadData(m_threads_tree_model); threadlist->grab_focus(); Gtk::ToolButton* refresh; builder->get_widget("toolbutton5", refresh); refresh->set_visible(true); refresh->show(); if(!THREAD_REFRESH_CONNECTED) { THREAD_REFRESH_CONNECT = refresh->signal_clicked().connect(sigc::bind<Glib::RefPtr<Gtk::ListStore> >(sigc::ptr_fun(&on_refresh_threads_clicked), m_threads_tree_model)); } THREAD_CLICK_CONNECT = threadlist->signal_row_activated().connect(sigc::bind<Glib::RefPtr<Gtk::TreeModel>, Glib::RefPtr<Gtk::ListStore> >(sigc::ptr_fun(&on_thread_activated), threadlist->get_model(), m_threads_tree_model)); }
void on_thread_activated(Gtk::TreeModel::Path path, Gtk::TreeViewColumn* column, Glib::RefPtr<Gtk::TreeModel> model, Glib::RefPtr<Gtk::ListStore> store) { ///To be run when a thread is double clicked Gtk::TreeModel::iterator iter = model->get_iter(path); Gtk::TreeModel::Row row = *iter; string no = row[m_thread_list.no]; THREAD = no; cout << THREAD << endl; cout << BOARD << endl; threadView(); Gtk::TreeView *postlist = 0; builder->get_widget("treeview4", postlist); postlist->set_visible(true); postlist->show(); Gtk::ScrolledWindow *imgview = 0; builder->get_widget("scrolledwindow3", imgview); gtk_container_add (GTK_CONTAINER (imgview->gobj()), GTK_WIDGET (pWebKitView)); webkit_web_view_load_uri(pWebKitView, "about:blank"); webkit_web_view_set_zoom_level(pWebKitView, true); gtk_widget_set_can_focus(GTK_WIDGET(pWebKitView), true); gtk_widget_show(GTK_WIDGET(pWebKitView)); Glib::RefPtr<Gtk::ListStore> m_posts_tree_model; m_posts_tree_model = Gtk::ListStore::create(m_post_list); m_posts_tree_model->clear(); postlist->set_model(m_posts_tree_model); postlist->set_search_column(1); postlist->get_column(1)->set_visible(false); postlist->get_column(2)->set_visible(false); postlist->get_column(3)->set_visible(false); postlist->get_column(4)->set_visible(false); postlist->get_column(5)->set_visible(false); postlist->signal_key_press_event().connect(sigc::bind<Glib::RefPtr<Gtk::ListStore> >(sigc::ptr_fun(&on_key_press_thread), m_posts_tree_model)); postlist->signal_key_release_event().connect(sigc::bind<Glib::RefPtr<Gtk::ListStore> >(sigc::ptr_fun(&on_key_press_thread), m_posts_tree_model)); postlist->add_events(Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK); Gtk::CellRendererText* cellRender = dynamic_cast<Gtk::CellRendererText*>(postlist->get_column_cell_renderer(0)); cellRender->property_wrap_mode() = Pango::WRAP_WORD; cellRender->property_wrap_width() = 400; cellRender->set_alignment(0, 0); Glib::RefPtr<Gtk::TreeSelection> thread_selection = postlist->get_selection(); thread_selection->signal_changed().connect(sigc::bind<Glib::RefPtr<Gtk::TreeSelection>, WebKitWebView*>(sigc::ptr_fun(&on_selection_changed_post), thread_selection, pWebKitView)); getPostData(m_posts_tree_model); postlist->grab_focus(); Gtk::ToolButton* refresh; builder->get_widget("toolbutton6", refresh); refresh->set_visible(true); refresh->show(); POST_REFRESH_CONNECT = refresh->signal_clicked().connect(sigc::bind<Glib::RefPtr<Gtk::ListStore> >(sigc::ptr_fun(&on_refresh_posts_clicked), m_posts_tree_model)); Gtk::ScrolledWindow *postwin = 0; builder->get_widget("scrolledwindow4", postwin); postwin->set_visible(true); postwin->show(); POST_CLICK_CONNECT = postlist->signal_row_activated().connect(sigc::bind<Glib::RefPtr<Gtk::TreeModel>, Glib::RefPtr<Gtk::ListStore> >(sigc::ptr_fun(&on_post_activated1), postlist->get_model(), m_posts_tree_model)); }
GscHelpWindow::GscHelpWindow(BaseObjectType* gtkcobj, const app_ui_res_ref_t& ref_ui) : AppUIResWidget<GscHelpWindow, false>(gtkcobj, ref_ui), selection_callback_enabled(true) { // Connect callbacks APP_GTKMM_CONNECT_VIRTUAL(delete_event); // make sure the event handler is called Gtk::Button* window_close_button = 0; APP_UI_RES_AUTO_CONNECT(window_close_button, clicked); // Accelerators Glib::RefPtr<Gtk::AccelGroup> accel_group = this->get_accel_group(); if (window_close_button) { window_close_button->add_accelerator("clicked", accel_group, GDK_Escape, Gdk::ModifierType(0), Gtk::AccelFlags(0)); } // --------------- Make a treeview Gtk::TreeView* treeview = this->lookup_widget<Gtk::TreeView*>("topics_treeview"); if (treeview) { Gtk::TreeModelColumnRecord model_columns; int num_tree_cols = 0; // Topic model_columns.add(col_topic); num_tree_cols = app_gtkmm_create_tree_view_column(col_topic, *treeview, "Topic", "Topic"); // create a TreeModel (ListStore) list_store = Gtk::ListStore::create(model_columns); treeview->set_model(list_store); selection = treeview->get_selection(); selection->signal_changed().connect(sigc::mem_fun(*this, &self_type::on_tree_selection_changed) ); } // --------------- Parse help text /* README.txt File Format The whole text is converted to unix newline format before parsing. Sections are separated by 3 newlines (two empty lines). The first line of the section is its header. When splitting the file to sections and headers, any leading or trailing whitespace is removed. If there is a single newline inside a section, it is converted to space to enable correct wrapping. If there are two consequent newlines, they are left as they are, essentially making a paragraph break. */ std::string readme = hz::string_any_to_unix_copy(ReadmeTextResData().get_string()); // split by double-newlines std::vector<std::string> topics; hz::string_split(readme, "\n\n\n", topics, true); // skip empty // add to treeview and textview Gtk::TextView* content = this->lookup_widget<Gtk::TextView*>("content_textview"); if (treeview && content) { Glib::RefPtr<Gtk::TextBuffer> buffer = content->get_buffer(); buffer->create_mark("Begin", buffer->begin(), true); for (unsigned int i = 0; i < topics.size(); ++i) { std::string topic = hz::string_trim_copy(topics[i]); // The first line of topic is its title std::vector<std::string> topic_split; hz::string_split(topic, "\n\n", topic_split, true, 2); // skip empty, get 2 elements only if (topic_split.size() < 2) { debug_out_warn("app", DBG_FUNC_MSG << "Cannot extract topic title in topic " << i << "\n"); continue; } std::string topic_title = hz::string_trim_copy(topic_split[0]); std::string topic_body = hz::string_trim_copy(topic_split[1]); buffer->create_mark(topic_title, buffer->end(), true); // set topic mark to the end of what's there // add the title and make it bold buffer->insert(buffer->end(), "\n" + topic_title); Gtk::TextIter first = buffer->end(), last = first; first.backward_lines(1); Glib::RefPtr<Gtk::TextTag> tag = buffer->create_tag(); tag->property_weight() = Pango::WEIGHT_BOLD; tag->property_size_points() = 14; buffer->apply_tag(tag, first, last); // add the rest // single newlines to spaces, to allow proper wrapping. app_pcre_replace("/([^\\n])\\n([^\\n])/", "\\1 \\2", topic_body); buffer->insert(buffer->end(), "\n\n" + topic_body + "\n\n"); // Add to treeview Gtk::TreeRow row = *(list_store->append()); row[col_topic] = topic_title; } } // --------------- // show(); }
// Create the main objective editing widgets void ObjectivesEditor::setupObjectivesPanel() { // Tree view Gtk::TreeView* objList = gladeWidget<Gtk::TreeView>( "objectivesTreeView" ); objList->set_model(_objectiveList); objList->set_headers_visible(true); objList->get_selection()->signal_changed().connect( sigc::mem_fun(*this, &ObjectivesEditor::_onObjectiveSelectionChanged) ); // Key and value text columns objList->append_column(*Gtk::manage( new gtkutil::TextColumn("#", _objectiveColumns.objNumber, false))); objList->append_column(*Gtk::manage( new gtkutil::TextColumn(_("Description"), _objectiveColumns.description, false))); objList->append_column(*Gtk::manage( new gtkutil::TextColumn(_("Diff."), _objectiveColumns.difficultyLevel, false))); Gtk::Button* addButton = gladeWidget<Gtk::Button>("addObjButton"); addButton->signal_clicked().connect( sigc::mem_fun(*this, &ObjectivesEditor::_onAddObjective) ); Gtk::Button* editObjButton = gladeWidget<Gtk::Button>( "editObjButton" ); editObjButton->set_sensitive(false); // not enabled without selection editObjButton->signal_clicked().connect( sigc::mem_fun(*this, &ObjectivesEditor::_onEditObjective) ); Gtk::Button* moveUpObjButton = gladeWidget<Gtk::Button>( "objMoveUpButton" ); moveUpObjButton->set_sensitive(false); // not enabled without selection moveUpObjButton->signal_clicked().connect( sigc::mem_fun(*this, &ObjectivesEditor::_onMoveUpObjective) ); Gtk::Button* moveDownObjButton = gladeWidget<Gtk::Button>( "objMoveDownButton" ); moveDownObjButton->set_sensitive(false); // not enabled without selection moveDownObjButton->signal_clicked().connect( sigc::mem_fun(*this, &ObjectivesEditor::_onMoveDownObjective) ); Gtk::Button* delObjButton = gladeWidget<Gtk::Button>( "delObjButton" ); delObjButton->set_sensitive(false); // not enabled without selection delObjButton->signal_clicked().connect( sigc::mem_fun(*this, &ObjectivesEditor::_onDeleteObjective) ); Gtk::Button* clearObjButton = gladeWidget<Gtk::Button>( "clearObjectivesButton" ); clearObjButton->set_sensitive(false); // requires >0 objectives clearObjButton->signal_clicked().connect( sigc::mem_fun(*this, &ObjectivesEditor::_onClearObjectives) ); }